diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:11:56 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:11:56 +0200 |
commit | 98ecf620f7de377dc8ae9ad7fbd1e3b24477e138 (patch) | |
tree | faadc6d8822c20cd3bc6f50b2a98e6c580585949 | |
parent | 3.16 (diff) | |
download | FreeFileSync-98ecf620f7de377dc8ae9ad7fbd1e3b24477e138.tar.gz FreeFileSync-98ecf620f7de377dc8ae9ad7fbd1e3b24477e138.tar.bz2 FreeFileSync-98ecf620f7de377dc8ae9ad7fbd1e3b24477e138.zip |
3.17
222 files changed, 33913 insertions, 30948 deletions
diff --git a/Application.cpp b/Application.cpp index e87b4294..7e217c50 100644 --- a/Application.cpp +++ b/Application.cpp @@ -13,7 +13,6 @@ #include <memory> #include "ui/batch_status_handler.h" #include "ui/check_version.h" -#include "library/filter.h" #include <wx/file.h> #include "shared/xml_base.h" #include "library/resources.h" @@ -26,6 +25,7 @@ #include "shared/string_conv.h" #include "shared/util.h" #include <wx/log.h> +#include "library/lock_holder.h" #ifdef FFS_LINUX #include <gtkmm/main.h> @@ -33,8 +33,7 @@ #endif -using ffs3::CustomLocale; -using ffs3::SwitchToGui; +using namespace zen; IMPLEMENT_APP(Application) @@ -55,7 +54,7 @@ bool Application::OnInit() void Application::OnStartApplication(wxIdleEvent&) { - using namespace ffs3; + using namespace zen; Disconnect(wxEVT_IDLE, wxIdleEventHandler(Application::OnStartApplication), NULL, this); @@ -68,7 +67,7 @@ void Application::OnStartApplication(wxIdleEvent&) ~HandleAppExit() { - if (!ffs3::AppMainWindow::mainWindowWasSet()) + if (!zen::AppMainWindow::mainWindowWasSet()) wxTheApp->ExitMainLoop(); //quit application, if no main window was set (batch silent mode) } @@ -81,7 +80,7 @@ void Application::OnStartApplication(wxIdleEvent&) #ifdef FFS_LINUX Gtk::Main::init_gtkmm_internals(); - ::gtk_rc_parse(ffs3::wxToZ(ffs3::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons + ::gtk_rc_parse(zen::wxToZ(zen::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons #endif @@ -128,7 +127,7 @@ void Application::OnStartApplication(wxIdleEvent&) } //set program language - ffs3::setLanguage(globalSettings.programLanguage); + zen::setLanguage(globalSettings.programLanguage); if (!cfgFilename.empty()) @@ -137,17 +136,16 @@ void Application::OnStartApplication(wxIdleEvent&) const xmlAccess::XmlType xmlConfigType = xmlAccess::getXmlType(cfgFilename); switch (xmlConfigType) { - case xmlAccess::XML_GUI_CONFIG: //start in GUI mode (configuration file specified) + case xmlAccess::XML_TYPE_GUI: //start in GUI mode (configuration file specified) runGuiMode(cfgFilename, globalSettings); break; - case xmlAccess::XML_BATCH_CONFIG: //start in commandline mode + case xmlAccess::XML_TYPE_BATCH: //start in commandline mode runBatchMode(cfgFilename, globalSettings); break; - case xmlAccess::XML_GLOBAL_SETTINGS: - case xmlAccess::XML_REAL_CONFIG: - case xmlAccess::XML_OTHER: + case xmlAccess::XML_TYPE_GLOBAL: + case xmlAccess::XML_TYPE_OTHER: wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + cfgFilename + wxT("\""), _("Error"), wxOK | wxICON_ERROR); break; } @@ -172,7 +170,7 @@ int Application::OnRun() catch (const std::exception& e) //catch all STL exceptions { //unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works! - wxFile safeOutput(ffs3::getConfigDir() + wxT("LastError.txt"), wxFile::write); + wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what())); @@ -187,7 +185,7 @@ int Application::OnRun() int Application::OnExit() { //get program language - globalSettings.programLanguage = ffs3::getLanguage(); + globalSettings.programLanguage = zen::getLanguage(); try //save global settings to XML { @@ -228,7 +226,7 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //regular check for program updates -> disabled for batch //if (!batchCfg.silent) - // ffs3::checkForUpdatePeriodically(globSettings.lastUpdateCheck); + // zen::checkForUpdatePeriodically(globSettings.lastUpdateCheck); try //begin of synchronization process (all in one try-catch block) { @@ -236,33 +234,43 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //class handling status updates and error messages BatchStatusHandler statusHandler(batchCfg.silent, - ffs3::extractJobName(filename), + zen::extractJobName(filename), batchCfg.silent ? &batchCfg.logFileDirectory : NULL, batchCfg.logFileCountMax, batchCfg.handleError, switchBatchToGui, returnValue); + const std::vector<zen::FolderPairCfg> cmpConfig = zen::extractCompareCfg(batchCfg.mainCfg); + + //batch mode: place directory locks on directories during both comparison AND synchronization + LockHolder dummy; + for (std::vector<FolderPairCfg>::const_iterator i = cmpConfig.begin(); i != cmpConfig.end(); ++i) + { + dummy.addDir(i->leftDirectoryFmt, statusHandler); + dummy.addDir(i->rightDirectoryFmt, statusHandler); + } + //COMPARE DIRECTORIES - ffs3::CompareProcess comparison(batchCfg.mainCfg.handleSymlinks, - globSettings.fileTimeTolerance, - globSettings.optDialogs, - &statusHandler); + zen::CompareProcess comparison(batchCfg.mainCfg.handleSymlinks, + globSettings.fileTimeTolerance, + globSettings.optDialogs, + statusHandler); - ffs3::FolderComparison folderCmp; - comparison.startCompareProcess(ffs3::extractCompareCfg(batchCfg.mainCfg), + zen::FolderComparison folderCmp; + comparison.startCompareProcess(cmpConfig, batchCfg.mainCfg.compareVar, folderCmp); //START SYNCHRONIZATION - ffs3::SyncProcess synchronization( + zen::SyncProcess synchronization( globSettings.optDialogs, globSettings.verifyFileCopy, globSettings.copyLockedFiles, globSettings.copyFilePermissions, statusHandler); - const std::vector<ffs3::FolderPairSyncCfg> syncProcessCfg = ffs3::extractSyncCfg(batchCfg.mainCfg); + const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(batchCfg.mainCfg); assert(syncProcessCfg.size() == folderCmp.size()); synchronization.startSynchronizationProcess(syncProcessCfg, folderCmp); @@ -270,12 +278,12 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //play (optional) sound notification after sync has completed if (!batchCfg.silent) { - const wxString soundFile = ffs3::getResourceDir() + wxT("Sync_Complete.wav"); - if (ffs3::fileExists(ffs3::wxToZ(soundFile))) + const wxString soundFile = zen::getResourceDir() + wxT("Sync_Complete.wav"); + if (zen::fileExists(zen::wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); //warning: this may fail and show a wxWidgets error message! } } - catch (ffs3::AbortThisProcess&) //exit used by statusHandler + catch (zen::AbortThisProcess&) //exit used by statusHandler { if (returnValue >= 0) returnValue = -12; diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index 48e4ccf2..e12fa657 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -2,6 +2,32 @@ |FreeFileSync| -------------- +Changelog v3.17 +--------------- +Filter files by size +Filter latest files by time span +Launcher automatically selecting 32/64 bit executable on startup +More detailed systray progress indicator +New database format for <Automatic> mode: a full sync is suggested before upgrading +Update database at individual file level (support for partial and aborted syncs) +New translation file format +Dynamically load existing translation files +Correct translation plural forms +Improved directory locking strategy +Restructured installation package +One button-click synchronization +Fixed CSV character encoding +Put CSV values in quotes if they contain semicolons +Explicit button and settings for "Custom" sync variant -> old configurations need to be migrated +Keyboard shortcuts also on middle grid +Minimize progress dialog by clicking on taskbar +Render invalid file dates correctly on GUI +Process user-defined commands via shell execution (FFS and RTS) +Allow base directory names having trailing whitespace +Addded Ukrainian language +Updated translation files + + Changelog v3.16 --------------- Fixed file copy issues on SAMBA shares diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm Binary files differindex c62dc046..66e3a195 100644 --- a/BUILD/FreeFileSync.chm +++ b/BUILD/FreeFileSync.chm diff --git a/BUILD/Help/html/Features.html b/BUILD/Help/html/Features.html index ac65cfc8..6f33780a 100644 --- a/BUILD/Help/html/Features.html +++ b/BUILD/Help/html/Features.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110415;17504200"> + <META NAME="CHANGED" CONTENT="20110421;18243600"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -39,7 +39,7 @@ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Synchronization database for propagation of deleted files and conflict detection</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Copy - NTFS alternate data stream, compressed, encrypted and sparse file + NTFS alternate data streams, compressed and encrypted file attributes</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Support for multiple folder pairs with distinct configuration</FONT></P> diff --git a/BUILD/Help/html/advanced/ExternalApp.html b/BUILD/Help/html/advanced/ExternalApp.html index 68f186c4..862d6071 100644 --- a/BUILD/Help/html/advanced/ExternalApp.html +++ b/BUILD/Help/html/advanced/ExternalApp.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110414;19310800"> + <META NAME="CHANGED" CONTENT="20110519;13094300"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -30,8 +30,8 @@ application via double-click</FONT></H3> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By default FreeFileSync opens the operating system's standard file browser on each double-click by invoking "<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, "%name"</FONT>" on Windows and "<FONT FACE="Courier New, monospace">xdg-open +"%dir"</FONT>" on Linux.</FONT></P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">However the user is free to integrate other external applications into FreeFileSync: navigate to "</FONT><FONT FACE="Tahoma, sans-serif"><I>Menu @@ -56,14 +56,16 @@ available:</FONT></P> <UL> <UL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start - visual difference tool:<BR><FONT FACE="Courier New, monospace">C:\Program - Files\WinMerge\WinMergeU.exe "%name" "%nameCo"</FONT></FONT></P> + visual difference tool:<BR><FONT FACE="Courier New, monospace">"C:\Program + Files\WinMerge\WinMergeU.exe" "%name" "%nameCo"</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"</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open - file in associated application:<BR><FONT FACE="Courier New, monospace">cmd - /c start "" "%name"</FONT></FONT></P> + 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">(since v3.17)</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D "%dir"</FONT></FONT></P> diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index 37d3a548..28448ccf 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -1,910 +1,1041 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y 个对象被æˆåŠŸåˆ 除 -%x Bytes -%x å—节 -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x 天 -%x directories -%x 个目录 -%x files -%x 个文件 -%x hour(s) -%x å°æ—¶ -%x kB -%x KB -%x min -%x 分 -%x of %y rows in view -%y è¡Œä¸çš„ %x è¡Œå¯è§ -%x of 1 row in view -1 è¡Œä¸çš„ %x è¡Œå¯è§ -%x sec -%x 秒 -%x% -%x% -&Abort -å–消(&A) -&About... -关于(&A)... -&Advanced -高级(&A) -&Cancel -å–消(&C) -&Check for new version -检查更新(&C) -&Content -内容(&C) -&Create batch job... -创建批处ç†ä½œä¸š(&C)... -&Default -默认(&D) -&Exit -退出(&E) -&Export file list... -导出文件列表(&E)... -&File -文件(&F) -&Find next -查找下一个(&F) -&Global settings... -全局设置(&G)... -&Help -帮助(&H) -&Ignore -忽略(&I) -&Language -切æ¢è¯è¨€(&L) -&Load -åŠ è½½(&L) -&Load configuration... -åŠ è½½é…ç½®(&L)... -&New -新建(&N) -&No -å¦(&N) -&OK -确定(&O) -&Pause -æš‚åœ(&P) -&Program -程åº(&P) -&Quit -退出(&Q) -&Restore -æ¢å¤(&R) -&Retry -é‡è¯•(&R) -&Save -ä¿å˜(&S) -&Switch -切æ¢(&S) -&Yes -是(&Y) -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(需è¦å› 特网连接!) -- Other side's counterpart to %dir -- å¦ä¸€ä¾§å‚ç…§ %dir -- Other side's counterpart to %name -- å¦ä¸€ä¾§å‚ç…§ %name -- conflict -- å†²çª -- conflict (same date, different size) -- 冲çª(相åŒæ—¥æœŸ,ä¸åŒå¤§å°) -- different -- ä¸åŒ -- directory part only -- åªå¯¹ç›®å½•éƒ¨åˆ† -- equal -- ç›¸åŒ -- exists left only -- 仅左侧å˜åœ¨çš„ -- exists right only -- ä»…å³ä¾§å˜åœ¨çš„ -- full file or directory name -- 完整的文件å或目录å -- left -- 左侧 -- left newer -- 左侧较新 -- right -- å³ä¾§ -- right newer -- å³ä¾§è¾ƒæ–° -/sec -/秒 -1 directory -1 目录 -1 file -1 文件 -1. &Compare -1. 比较(&C) -1. Enter relative file or directory names separated by ';' or a new line. -1. 输入相对文件或文件夹å称,用';'或空行分隔. -1. Select directories to monitor. -1. 选择è¦ç›‘视的目录. -2. &Synchronize... -2. åŒæ¥(&S)... -2. Enter a command line. -2. 输入一个命令行. -2. Use wildcard characters '*' and '?'. -2. 使用通é…符‘*’和‘?’. -3. Exclude files directly on main grid via context menu. -3. 通过å³é”®èœå•åœ¨ä¸»ç½‘æ ¼æŽ’é™¤æ–‡ä»¶. -3. Press 'Start'. -3. 点击'开始'. -<Automatic> -自动 -<Directory> -<目录> -<Last session> -<最åŽä¼šè¯> -<Symlink> -<符å·è¿žæŽ¥> -<multiple selection> -<多选> -A directory input field is empty. -有一个目录输入å—段是空的. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -有一个目录将被修改,而它是多个文件夹对的一部分!请é‡æ–°æ£€æŸ¥åŒæ¥è®¾ç½®! -A newer version of FreeFileSync is available: -FreeFileSync 有新版å¯ç”¨: -Abort requested: Waiting for current operation to finish... -å–消请求: æ£åœ¨ç‰å¾…当å‰æ“作完æˆ... -Abort synchronization immediately -ç«‹å³ä¸æ¢åŒæ¥ -Aborted -å·²å–消 -About -关于 -Action -动作 -Add folder -æ·»åŠ æ–‡ä»¶å¤¹ -Add folder pair -æ·»åŠ æˆå¯¹æ–‡ä»¶å¤¹ -All directories in sync! -所有目录åŒæ¥! -An exception occurred! -å‘生异常! -As a result the files are separated into the following categories: -å…¶ç»“æžœæ˜¯æ–‡ä»¶åˆ†ä¸ºä»¥ä¸‹å‡ ç±»: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -顾åæ€ä¹‰,两个相åŒæ–‡ä»¶å的文件当且仅当它们具有相åŒçš„内容时会被认为是相åŒçš„。\næ¤é€‰é¡¹å¯¹äºŽä¸€è‡´æ€§æ£€æŸ¥æ¯”较有用,而ä¸æ˜¯å¤‡ä»½æ“作. å› æ¤,文件时间没有被考虑到. \n\n通过æ¤é€‰é¡¹ä½¿å†³ç–æ ‘è¾ƒå°: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -装é…一个批处ç†æ–‡ä»¶ç”¨äºŽè‡ªåŠ¨åŒæ¥. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°å°†æ‰¹å¤„ç†æ–‡ä»¶åä¼ é€ç»™FreeFileSyncå¯æ‰§è¡Œæ–‡ä»¶:FreeFileSync.exe <batchfile>. 这个也å¯ä»¥å®‰æŽ’在您的æ“作系统的计划任务ä¸. -At least one directory input field is empty. -至少有一个目录输入å—段是空的. -Auto-adjust columns -自动调整æ 宽 -Batch execution -批处ç†æ‰§è¡Œ -Batch file created successfully! -批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ! -Batch job -批处ç†ä½œä¸š -Big thanks for localizing FreeFileSync goes out to: -éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员: -Both sides have changed since last synchronization! -在最åŽçš„åŒæ¥ä¹‹åŽä¸¤è¾¹å‡å·²æ”¹å˜! -Browse -æµè§ˆ -Browse directory -æµè§ˆç›®å½• -Cannot determine sync-direction: -ä¸èƒ½æ£€æµ‹åŒæ¥æ–¹å‘: -Cannot find %x -找ä¸åˆ° %x -Category -分类 -Clear filter settings -清除过滤器设置 -Comma separated list -逗å·åˆ†éš”的列表 -Command line -命令行 -Command line is empty! -命令行是空的! -Compare -比较 -Compare both sides -比较两侧 -Compare by \"File content\" -通过文件内容比较 -Compare by \"File size and date\" -通过文件大å°å’Œæ—¥æœŸæ¯”较 -Compare by... -比较选项... -Comparing content of files %x -æ£åœ¨æ¯”较文件 %x 的内容 -Comparing content... -æ£åœ¨æ¯”较文件内容... -Comparing files by content failed. -按文件内容比较失败. -Comparison Result -比较结果 -Comparison settings -比较设置 -Completed -å®Œæˆ -Configuration -é…ç½® -Configuration loaded! -é…ç½®å·²åŠ è½½! -Configuration overview: -é…置概览: -Configuration saved! -é…置已ä¿å˜! -Configure filter -é…置过滤 -Configure your own synchronization rules. -é…ç½®ä½ è‡ªå·±çš„åŒæ¥è§„则. -Confirm -确认 -Conflict detected: -检测到冲çª: -Conflicts/files that cannot be categorized -冲çª/文件ä¸èƒ½è¢«å½’ç±» -Continue -ç»§ç» -Conversion error: -转æ¢é”™è¯¯: -Copy attributes only from left to right -从左边到å³è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§ -Copy attributes only from right to left -从å³è¾¹åˆ°å·¦è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§ -Copy filesystem permissions -å¤åˆ¶æ–‡ä»¶ç³»ç»Ÿçš„æƒé™ -Copy from left to right -从左侧å¤åˆ¶åˆ°å³ä¾§ -Copy from left to right overwriting -从左侧å¤åˆ¶åˆ°å³ä¾§(覆盖模å¼) -Copy from right to left -从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§ -Copy from right to left overwriting -从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§(覆盖模å¼) -Copy locked files -å¤åˆ¶è¢«é”定的文件 -Copy new or updated files to right folder. -å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹ -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -通过å·å½±å¤åˆ¶æœåŠ¡å¤åˆ¶å…±äº«æˆ–é”定的文件\n(需è¦ç®¡ç†å‘˜æƒé™) -Copy to clipboard\tCTRL+C -å¤åˆ¶åˆ°å‰ªè´´æ¿\tCTRL+C -Copying new Symbolic Link %x to %y -å¤åˆ¶æ–°ç¬¦å·è¿žæŽ¥ %x 到 %y -Copying new file %x to %y -å¤åˆ¶æ–°æ–‡ä»¶ %x 到 %y -Could not determine volume name for file: -ä¸èƒ½ç¡®å®šæ¤æ–‡ä»¶çš„å·å称: -Could not initialize directory monitoring: -ä¸èƒ½åˆå§‹åŒ–目录监视: -Could not load a required DLL: -ä¸èƒ½åŠ 载所需的动æ€è¿žæŽ¥åº“: -Could not read values for the following XML nodes: -ä¸èƒ½ä»Žå¦‚下XML节点读å–数值: -Create a batch job -创建一个批处ç†ä½œä¸š -Creating folder %x -æ£åˆ›å»ºæ–‡ä»¶å¤¹ %x -Custom -自定义 -Customize columns -自定义æ -Customize... -自定义... -D-Click -åŒå‡» -DECISION TREE -决ç–æ ‘ -Data verification error: Source and target file have different content! -æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ! -Date -日期 -Delete files/folders existing on left side only -åˆ é™¤ä»…åœ¨å·¦ä¾§å˜åœ¨çš„文件/文件夹 -Delete files/folders existing on right side only -åˆ é™¤ä»…åœ¨å³ä¾§å˜åœ¨çš„文件/文件夹 -Delete files\tDEL -åˆ é™¤æ–‡ä»¶\tDEL -Delete on both sides -ä»Žä¸¤ä¾§åˆ é™¤ -Delete on both sides even if the file is selected on one side only -ä»Žä¸¤ä¾§åˆ é™¤(å³ä½¿ä»…在一侧选择文件) -Delete or overwrite files permanently -æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶ -Delete permanently -æ°¸ä¹…æ€§åˆ é™¤ -Deleting Symbolic Link %x -æ£åœ¨åˆ 除符å·è¿žæŽ¥ %x -Deleting file %x -æ£åˆ 除文件 %x -Deleting folder %x -æ£åˆ 除文件夹 %x -Deletion handling -åˆ é™¤å¤„ç† -Description -æè¿° -Direct -直接 -Directories are dependent! Be careful when setting up synchronization rules: -目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ¥è§„则时请å°å¿ƒ: -Directories to watch -è¦ç›‘视的目录 -Directory -目录 -Directory does not exist: -目录ä¸å˜åœ¨: -Do not show this dialog again -ä¸è¦å†æ˜¾ç¤ºæ¤å¯¹è¯æ¡† -Do nothing -ä¿æŒä¸åŠ¨ -Do you really want to delete the following object(s)? -ä½ ç¡®å®šè¦åˆ 除下列对象å—? -Do you really want to move the following object(s) to the Recycle Bin? -ä½ ç¡®å®šè¦ç§»åŠ¨ä¸‹åˆ—对象到回收站å—? -Do you want FreeFileSync to automatically check for updates every week? -è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?> -Donate with PayPal -通过PayPalæèµ -Download now? -ç«‹å³ä¸‹è½½? -Drag && drop -拖放 -Elements found: -å·²æ‰¾åˆ°çš„å…ƒç´ : -Elements processed: -已处ç†çš„å…ƒç´ : -Elements remaining: -å‰©ä½™çš„å…ƒç´ : -Email -邮箱 -Encoding extended time information: %x -æ£åœ¨ç¼–ç 扩展时间信æ¯:%x -Endless loop when traversing directory: -éåŽ†ç›®å½•æ—¶å‡ºçŽ°æ— é™å¾ªçŽ¯: -Equal files/folders that differ in attributes only -相ç‰çš„文件/文件夹仅仅文件属性ä¸åŒ -Error -错误 -Error changing modification time: -改å˜ä¿®æ”¹æ—¶é—´æ—¶å‡ºé”™: -Error copying file permissions: -å¤åˆ¶æ–‡ä»¶æƒé™æ—¶å‡ºé”™: -Error copying file: -å¤åˆ¶æ–‡ä»¶å‡ºé”™: -Error copying locked file %x! -å¤åˆ¶å·²é”定的文件时出错 %x! -Error copying symbolic link: -å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™: -Error creating directory: -创建目录出错: -Error deleting directory: -åˆ é™¤ç›®å½•å‡ºé”™: -Error deleting file: -åˆ é™¤æ–‡ä»¶å‡ºé”™: -Error handling -é”™è¯¯å¤„ç† -Error loading library function: -åŠ è½½åº“å‡½æ•°å‡ºé”™: -Error moving directory: -移动目录时出错: -Error moving file: -移动文件时出错: -Error moving to Recycle Bin: -移动到回收站出错: -Error opening file: -打开文件出错: -Error parsing configuration file: -分æžé…置文件出错: -Error reading file attributes: -读å–文件属性出错: -Error reading file: -读å–文件出错: -Error reading from synchronization database: -从åŒæ¥æ•°æ®åº“ä¸è¯»å–时出错: -Error reading security context: -读å–安全上下文时出错: -Error resolving symbolic link: -解决符å·é“¾æŽ¥å‡ºé”™: -Error setting directory lock: -设置目录é”定时出错: -Error setting privilege: -设置æƒé™æ—¶å‡ºé”™: -Error starting Volume Shadow Copy Service! -å¯åŠ¨å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™! -Error traversing directory: -é历目录出错: -Error when monitoring directories. -监视目录时出错. -Error writing file: -写入文件出错: -Error writing security context: -写入安全上下文时出错: -Error writing to synchronization database: -å‘åŒæ¥æ•°æ®åº“ä¸å†™å…¥æ—¶å‡ºé”™: -Example -例如 -Exclude -排除 -Exclude all rows -排除所有行 -Exclude temporarily -暂时排除 -Exclude via filter: -通过过滤器排除: -Exit instantly -ç«‹å³é€€å‡º -Extension -扩展å -External applications -å¤–éƒ¨åº”ç”¨ç¨‹åº -Fatal Error -致命错误 -Feedback and suggestions are welcome at: -欢迎在下é¢æ出å馈æ„è§å’Œå»ºè®®: -File %x has an invalid date! -文件 %x 的日期éžæ³•! -File already exists. Overwrite? -文件已ç»å˜åœ¨.覆盖? -File content -文件内容 -File does not exist: -文件ä¸å˜åœ¨: -File list exported! -文件清å•å·²ç»å¯¼å‡º! -File size and date -文件大å°å’Œæ—¥æœŸ -Filename -文件å -Files %x have the same date but a different size! -文件 %x 日期相åŒä½†å¤§å°ä¸åŒ! -Files are found equal if\n - file content\nis the same -如果文件内容相åŒåˆ™è®¤ä¸ºä¸¤è€…ç›¸åŒ -Files are found equal if\n - filesize\n - last write time and date\nare the same -如果文件大å°å’Œæœ€åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸç›¸åŒåˆ™è®¤ä¸ºä¸¤è€…ç›¸åŒ -Files that are equal on both sides -ä¸¤è¾¹æ–‡ä»¶ç›¸åŒ -Files that exist on both sides, left one is newer -两侧都有,左侧较新的文件 -Files that exist on both sides, right one is newer -两侧都有,å³ä¾§è¾ƒæ–°çš„文件 -Files that have different content -有ä¸åŒå†…容的文件 -Files/folders that exist on left side only -仅在左侧å˜åœ¨çš„文件/文件夹 -Files/folders that exist on right side only -仅在å³ä¾§å˜åœ¨çš„文件/文件夹 -Filter files -过滤文件 -Filter is active -过滤器已激活 -Filter settings have changed! -过滤设置已改å˜! -Filter: All pairs -过滤器:所有的é…对 -Filter: Single pair -过滤器:å•ä¸€çš„é…对 -Find -查找 -Find what: -è¦æŸ¥æ‰¾ä»€ä¹ˆ: -Folder Comparison and Synchronization -文件夹比较与åŒæ¥ -Folder pairs -文件夹对 -Follow -è·Ÿéš -Free disk space available: -å¯ç”¨ç£ç›˜ç©ºé—´: -Free disk space required: -需è¦å¯ç”¨çš„ç£ç›˜ç©ºé—´: -FreeFileSync Batch Job -FreeFileSync 批处ç†ä½œä¸š -FreeFileSync at Sourceforge -Sourceforge上的FreeFileSync -FreeFileSync batch file -FreeFileSync 批处ç†æ–‡ä»¶ -FreeFileSync configuration -FreeFileSync é…ç½® -FreeFileSync is up to date! -FreeFileSync 已是最新! -Full path -完整路径 -Generating database... -æ£åœ¨ç”Ÿæˆæ•°æ®åº“... -Generating file list... -生æˆæ–‡ä»¶åˆ—表... -Global settings -全局设置 -Help -帮助 -Hidden dialogs: -éšè—对è¯æ¡†: -Hide all error and warning messages -éšè—所有错误与è¦å‘Šä¿¡æ¯ -Hide conflicts -éšè—å†²çª -Hide excluded items -éšè—已排除的项目 -Hide files that are different -éšè—ä¸åŒçš„文件 -Hide files that are equal -éšè—相åŒçš„文件 -Hide files that are newer on left -éšè—左侧较新的文件 -Hide files that are newer on right -éšè—å³ä¾§è¾ƒæ–°çš„文件 -Hide files that exist on left side only -éšè—仅在左侧的文件 -Hide files that exist on right side only -éšè—仅在å³ä¾§çš„文件 -Hide files that will be created on the left side -éšè—将在左侧被建立的文件 -Hide files that will be created on the right side -éšè—将在å³ä¾§è¢«å»ºç«‹çš„文件 -Hide files that will be deleted on the left side -éšè—å°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶ -Hide files that will be deleted on the right side -éšè—将在å³ä¾§è¢«åˆ 除的文件 -Hide files that will be overwritten on left side -éšè—将在左侧被覆盖的文件 -Hide files that will be overwritten on right side -éšè—将在å³ä¾§è¢«è¦†ç›–的文件 -Hide files that won't be copied -éšè—å°†ä¸ä¼šè¢«å¤åˆ¶çš„文件 -Hide filtered or temporarily excluded files -éšè—已过滤或临时排除的文件 -Hide further error messages during the current process -在当å‰è¿›ç¨‹ä¸éšè—进一æ¥çš„é”™è¯¯ä¿¡æ¯ -Hints: -æ示: -Homepage -主页 -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -使用数æ®åº“æ¥è¯†åˆ«å’Œä¼ é€ä¸¤è¾¹çš„改å˜. è‡ªåŠ¨æ£€æµ‹åˆ é™¤å’Œå†²çªçŠ¶æ€. -Idle time between detection of last change and execution of command line in seconds -以秒计的最åŽå˜æ›´å’Œæ‰§è¡Œå‘½ä»¤è¡Œä¹‹é—´çš„空闲时间 -If you like FFS -å¦‚æžœä½ å–œæ¬¢ FFS -Ignore -忽略 -Ignore errors -忽略错误 -Ignore subsequent errors -忽略éšåŽçš„错误 -Include -包括 -Include all rows -包括所有行 -Include temporarily -暂时包括 -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -包括: *.doc;*.zip;*.exe\n排除\\stuff\\temp\\* -Incompatible synchronization database format: -ä¸å…¼å®¹çš„åŒæ¥æ•°æ®åº“æ ¼å¼: -Info -ä¿¡æ¯ -Information -ä¿¡æ¯ -Initial synchronization: -åˆå§‹åŒ–åŒæ¥: -Integrate external applications into context menu. The following macros are available: -集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨: -Invalid FreeFileSync config file! -æ— æ•ˆçš„ FreeFileSync é…置文件! -Last used configurations (press DEL to remove from list) -最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表ä¸ç§»é™¤) -Leave as unresolved conflict -é—ç•™ä¸ºæœªè§£å†³çš„å†²çª -Left -左侧 -Legend -图例 -Load configuration from file -ä»Žæ–‡ä»¶åŠ è½½é…ç½® -Log-messages: -日志信æ¯: -Logging -记录 -Main bar -ä¸»å·¥å…·æ¡ -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬. -Match case -匹é…大å°å†™ -Maximum number of logfiles: -最大的日志文件数: -Memory allocation failed! -内å˜åˆ†é…失败! -Minimum Idle Time [seconds] -最å°ç©ºé—²æ—¶é—´[秒] -Mirror ->> -é•œåƒ ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -é•œåƒå¤‡ä»½å·¦è¾¹çš„文件夹.åŒæ¥åŽå³è¾¹çš„文件夹被修改为和左边文件夹精确匹é…. -Monitoring active... -监视激活... -More than 50% of the total number of files will be copied or deleted! -超过总数 50% 以上的文件è¦è¢«å¤åˆ¶æˆ–åˆ é™¤! -Move column down -下移一行 -Move column up -上移一行 -Move files into a time-stamped subdirectory -ç§»åŠ¨æ–‡ä»¶åˆ°æ—¶é—´æ ‡è®°å目录 -Moving %x to Recycle Bin -移动 %x 到回收站 -Moving Symbolic Link %x to user-defined directory %y -æ£åœ¨ç§»åŠ¨ç¬¦å·è¿žæŽ¥ %x 到用户定义目录 %y -Moving file %x to user-defined directory %y -移动文件 %x 到用户定义目录 %y -Moving folder %x to user-defined directory %y -移动文件夹 %x 到用户定义目录 %y -Multiple... -并è”... -No change since last synchronization! -自从最åŽä¸€æ¬¡åŒæ¥ä»¥æ¥æ²¡æœ‰å˜åŠ¨! -No filter selected -没有选定过滤器 -Not enough free disk space available in: -没有足够的å¯ç”¨ç£ç›˜ç©ºé—´ç”¨äºŽ: -Nothing to synchronize according to configuration! -æ ¹æ®é…置没有任何åŒæ¥! -Number of files and directories that will be created -一些文件和目录将被创建 -Number of files and directories that will be deleted -ä¸€äº›æ–‡ä»¶å’Œç›®å½•å°†è¢«åˆ é™¤ -Number of files that will be overwritten -一些文件和目录将被覆盖 -One of the FreeFileSync database entries within the following file is not yet existing: -以下文件ä¸çš„FreeFileSyncæ•°æ®åº“å…¥å£å…¶ä¸ä¸€ä¸ªä¸å˜åœ¨ï¼š -One of the FreeFileSync database files is not yet existing: -FreeFileSyncæ•°æ®åº“文件其ä¸ä¸€ä¸ªä¸å˜åœ¨: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -åªæœ‰é€šè¿‡è¿‡æ»¤çš„文件/文件夹能被选择用于åŒæ¥. 过滤ä¸çš„路径å‡ä¸ºåŒæ¥åŸºç¡€æ–‡ä»¶å¤¹çš„相对路径. -Open with Explorer -用Explorer打开 -Open with default application -用默认应用软件打开 -Operation aborted! -æ“作已å–消! -Operation: -æ“作: -Overview -æ‘˜è¦ -Overwriting Symbolic Link %x in %y -æ£åœ¨ %y 上覆盖符å·è¿žæŽ¥ %x -Overwriting file %x in %y -æ£åœ¨ %y 上覆盖文件 %x -Pause -æš‚åœ -Paused -å·²æš‚åœ -Planned directory deletion is in conflict with its subdirectories and -files! -è®¡åˆ’çš„ç›®å½•åˆ é™¤ä¸Žå…¶å目录和文件有冲çª! -Please run a Compare first before synchronizing! -åŒæ¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯” -Press \"Switch\" to open FreeFileSync GUI mode. -按\"切æ¢\"å¯æ‰“å¼€FreeFileSync图形用户界é¢æ¨¡å—. -Processing folder pair: -æ£åœ¨å¤„ç†æˆå¯¹æ–‡ä»¶å¤¹: -Published under the GNU General Public License: -在GNU通用公共许å¯ä¸‹å‘布: -Question -问题 -RealtimeSync - Automated Synchronization -实时åŒæ¥ - 自动åŒæ¥ -RealtimeSync configuration -实时åŒæ¥é…ç½® -Recycle Bin not yet supported for this system! -æ¤ç³»ç»Ÿä¸Šä¸æ”¯æŒå›žæ”¶ç«™! -Relative path -相对路径 -Remove alternate settings -移除替æ¢è®¾ç½® -Remove folder -åˆ é™¤æ–‡ä»¶å¤¹ -Remove folder pair -åˆ é™¤æ–‡ä»¶å¤¹å¯¹ -Report translation error -报告翻译错误 -Reset -é‡ç½® -Reset view -é‡ç½®è§†å›¾ -Restore all hidden dialogs? -æ¢å¤æ‰€æœ‰è¢«éšè—的对è¯æ¡†? -Right -å³ä¾§ -S&ave configuration... -ä¿å˜é…ç½®(&A)... -S&witch view -切æ¢è§†å›¾(&W) -Save changes to current configuration? -ä¿å˜æ›´æ”¹åˆ°å½“å‰é…ç½®? -Save current configuration to file -ä¿å˜å½“å‰é…置到文件 -Scanning... -æ£æ‰«æ... -Scanning: -扫æä¸: -Select a folder -选择一个文件夹 -Select alternate synchronization settings -选择替æ¢åŒæ¥è®¾ç½® -Select logfile directory: -选择日志ä¿å˜ä½ç½®: -Select variant: -选择å˜åŒ–çš„: -Select view -选择视图 -Set direction: -设置方å‘: -Setting default synchronization directions: Old files will be overwritten with newer files. -设置默认的åŒæ¥æ–¹å‘:旧文件会被新文件覆盖. -Show \"%x\" -显示 \"%x\" -Show conflicts -æ˜¾ç¤ºå†²çª -Show files that are different -显示ä¸åŒçš„文件 -Show files that are equal -显示相åŒçš„文件 -Show files that are newer on left -显示左侧较新的文件 -Show files that are newer on right -显示å³ä¾§è¾ƒæ–°çš„文件 -Show files that exist on left side only -显示仅å˜åœ¨å·¦ä¾§çš„文件 -Show files that exist on right side only -显示仅å˜åœ¨å³ä¾§çš„文件 -Show files that will be created on the left side -显示将在左侧被建立的文件 -Show files that will be created on the right side -显示将在å³ä¾§è¢«å»ºç«‹çš„文件 -Show files that will be deleted on the left side -æ˜¾ç¤ºå°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶ -Show files that will be deleted on the right side -显示将在å³ä¾§è¢«åˆ 除的文件 -Show files that will be overwritten on left side -显示将在左侧被覆盖的文件 -Show files that will be overwritten on right side -显示将在å³ä¾§è¢«è¦†ç›–的文件 -Show files that won't be copied -显示将ä¸è¢«å¤åˆ¶çš„文件 -Show hidden dialogs -显示éšè—的对è¯æ¡† -Show popup -æ˜¾ç¤ºå¼¹å‡ºçª—å£ -Show popup on errors or warnings -在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºçª—å£ -Significant difference detected: -已侦测到显著ä¸åŒ: -Silent mode -é™é»˜æ¨¡å¼ -Size -å¤§å° -Source code written completely in C++ utilizing: -æºä»£ç 用以下工具完全使用C++编写: -Source directory does not exist anymore: -æºç›®å½•å·²ç»ä¸å˜åœ¨: -Speed: -速度: -Start -开始 -Start minimized and write status information to a logfile -以最å°åŒ–开始è¿è¡Œå¹¶å°†ä¿¡æ¯å†™åˆ°æ—¥å¿—文件 -Start synchronization -开始åŒæ¥ -Statistics -统计 -Status feedback -状况å馈 -Stop -åœæ¢ -Swap sides -ä¸¤ä¾§äº’æ¢ -Switching to FreeFileSync GUI mode... -切æ¢è‡³FreeFileSync图形用户界é¢æ¨¡å—... -Symbolic Link handling -符å·è¿žæŽ¥å¤„ç†æ–¹å¼ -Symlinks %x have the same date but a different target! -符å·è¿žæŽ¥ %x 有相åŒçš„æ—¥æœŸä½†ç›®æ ‡ä¸åŒ! -Synchronization Preview -åŒæ¥é¢„览 -Synchronization aborted! -åŒæ¥å·²æ”¾å¼ƒ! -Synchronization completed successfully! -åŒæ¥æˆåŠŸå®Œæˆ! -Synchronization completed with errors! -åŒæ¥å·²å®Œæˆä½†æœ‰é”™è¯¯. -Synchronization settings -åŒæ¥è®¾ç½® -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -åŒæ¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了\"temp\"ä¸çš„一切. -Synchronize... -åŒæ¥... -Synchronizing... -åŒæ¥ä¸... -Target directory already existing! -ç›®æ ‡ç›®å½•å·²ç»å˜åœ¨! -Target file already existing! -ç›®æ ‡æ–‡ä»¶å·²ç»å˜åœ¨! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -æ¯æ¬¡æœ‰å¦‚下情况时执行这个命令行:\n- 所有目录转为å¯ç”¨çŠ¶æ€(例如æ’å…¥U盘)\n- 目录或å目录里的文件被修改 -The file does not contain a valid configuration: -该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®: -The file was not processed by last synchronization! -æ¤æ–‡ä»¶åœ¨æœ€åŽä¸€æ¬¡åŒæ¥ä¸æœªè¢«å¤„ç†! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -æ¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒ\næ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„. -Time -时间 -Time elapsed: -已用时间: -Time remaining: -剩余时间: -Total amount of data that will be transferred -å°†è¢«è½¬ç§»çš„æ€»æ•°æ® -Total time: -总共时间: -Transfer file and directory permissions\n(Requires Administrator rights) -转移文件和目录的æƒé™\n(需è¦ç®¡ç†å‘˜æƒé™) -Unable to connect to sourceforge.net! -æ— æ³•é“¾æŽ¥åˆ° Sourceforge.net! -Unable to create logfile! -æ— æ³•åˆ›å»ºæ—¥å¿—! -Unresolved conflicts existing! -å˜åœ¨ä¸å¯è§£å†³çš„冲çª! -Update -> -å‡çº§ -> -Updating attributes of %x -æ›´æ–° %x 的属性 -Usage: -用法: -Use Recycle Bin -使用回收站 -Use Recycle Bin when deleting or overwriting files -å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™ -User-defined directory for deletion was not specified! -ç”¨äºŽåˆ é™¤çš„ç”¨æˆ·å®šä¹‰ç›®å½•æ²¡æœ‰æŒ‡å®š! -Variant -å˜åŒ– -Verifying file %x -æ ¡éªŒæ–‡ä»¶ %x -Versioning -ä¿ç•™åŽ†å²ç‰ˆæœ¬ -Volume name %x not part of filename %y! -å·å %x 并éžæ–‡ä»¶å %y 的一部分! -Waiting for missing directories... -æ£åœ¨ç‰å¾…丢失的目录... -Waiting while directory is locked (%x)... -由于目录已é”定而æ£åœ¨ç‰å¾…(%x)... -Warning -è¦å‘Š -When the comparison is started with this option set the following decision tree is processed: -当以æ¤é€‰é¡¹å¼€å§‹æ¯”è¾ƒæ—¶ä»¥ä¸‹å†³å®šæ ‘è¢«å¤„ç†: -You can ignore conflicts and continue synchronization. -ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»åŒæ¥. -You can ignore this error to consider the directory as empty. -ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)! -different -ä¸åŒ -file exists on both sides -文件在两侧å‡å·²å˜åœ¨ -on one side only -仅在一侧 +<header> + <language name>简体ä¸æ–‡</language name> + <translator>CyberCowBoy</translator> + <locale>zh_CN</locale> + <flag file>china.png</flag file> + <plural forms>1</plural forms> + <plural definition>0</plural definition> +</header> + +<source>Show in Explorer</source> +<target>在Explorerä¸æ˜¾ç¤º</target> +<source>Open with default application</source> +<target>用默认应用软件打开</target> +<source>Browse directory</source> +<target>æµè§ˆç›®å½•</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>实时åŒæ¥ - 自动åŒæ¥</target> +<source>Browse</source> +<target>æµè§ˆ</target> +<source>Error resolving symbolic link:</source> +<target>解决符å·é“¾æŽ¥å‡ºé”™:</target> +<source>Select alternate synchronization settings</source> +<target>选择替æ¢åŒæ¥è®¾ç½®</target> +<source>No filter selected</source> +<target>没有选定过滤器</target> +<source>Filter is active</source> +<target>过滤器已激活</target> +<source>Clear filter settings</source> +<target>清除过滤器设置</target> +<source>Remove alternate settings</source> +<target>移除替æ¢è®¾ç½®</target> +<source>Create a batch job</source> +<target>创建一个批处ç†ä½œä¸š</target> +<source>Synchronization settings</source> +<target>åŒæ¥è®¾ç½®</target> +<source>Comparison settings</source> +<target>比较设置</target> +<source>About</source> +<target>关于</target> +<source>Error</source> +<target>错误</target> +<source>Warning</source> +<target>è¦å‘Š</target> +<source>Question</source> +<target>问题</target> +<source>Confirm</source> +<target>确认</target> +<source>Configure filter</source> +<target>é…置过滤</target> +<source>Customize columns</source> +<target>自定义æ </target> +<source>Global settings</source> +<target>全局设置</target> +<source>Synchronization Preview</source> +<target>åŒæ¥é¢„览</target> +<source>Find</source> +<target>查找</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x å—节</pluralform> +</target> +<source><Symlink></source> +<target><符å·è¿žæŽ¥></target> +<source><Directory></source> +<target><目录></target> +<source>Size</source> +<target>大å°</target> +<source>Date</source> +<target>日期</target> +<source>Full path</source> +<target>完整路径</target> +<source>Filename</source> +<target>文件å</target> +<source>Relative path</source> +<target>相对路径</target> +<source>Directory</source> +<target>目录</target> +<source>Extension</source> +<target>扩展å</target> +<source>Comparison Result</source> +<target>比较结果</target> +<source>Incompatible synchronization database format:</source> +<target>ä¸å…¼å®¹çš„åŒæ¥æ•°æ®åº“æ ¼å¼:</target> +<source>Initial synchronization:</source> +<target>åˆå§‹åŒ–åŒæ¥:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>FreeFileSyncæ•°æ®åº“文件其ä¸ä¸€ä¸ªä¸å˜åœ¨:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>以下文件ä¸çš„FreeFileSyncæ•°æ®åº“å…¥å£å…¶ä¸ä¸€ä¸ªä¸å˜åœ¨ï¼š</target> +<source>Error reading from synchronization database:</source> +<target>从åŒæ¥æ•°æ®åº“ä¸è¯»å–时出错:</target> +<source>An exception occurred!</source> +<target>å‘生异常!</target> +<source>Error deleting file:</source> +<target>åˆ é™¤æ–‡ä»¶å‡ºé”™:</target> +<source>Error reading file attributes:</source> +<target>读å–文件属性出错:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>由于目录已é”定而æ£åœ¨ç‰å¾…(%x)...</target> +<source>Error setting directory lock:</source> +<target>设置目录é”定时出错:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x 秒</pluralform> +</target> +<source>Info</source> +<target>ä¿¡æ¯</target> +<source>Fatal Error</source> +<target>致命错误</target> +<source>Invalid FreeFileSync config file!</source> +<target>æ— æ•ˆçš„ FreeFileSync é…置文件!</target> +<source>File does not exist:</source> +<target>文件ä¸å˜åœ¨:</target> +<source>Error parsing configuration file:</source> +<target>分æžé…置文件出错:</target> +<source>Error writing file:</source> +<target>写入文件出错:</target> +<source>/sec</source> +<target>/秒</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x 分</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x å°æ—¶</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x 天</pluralform> +</target> +<source>S&ave configuration...</source> +<target>ä¿å˜é…ç½®(&A)...</target> +<source>&Load configuration...</source> +<target>åŠ è½½é…ç½®(&L)...</target> +<source>&Quit</source> +<target>退出(&Q)</target> +<source>&File</source> +<target>文件(&F)</target> +<source>&Content</source> +<target>内容(&C)</target> +<source>&About...</source> +<target>关于(&A)...</target> +<source>&Help</source> +<target>帮助(&H)</target> +<source>Usage:</source> +<target>用法:</target> +<source>1. Select directories to monitor.</source> +<target>1. 选择è¦ç›‘视的目录.</target> +<source>2. Enter a command line.</source> +<target>2. 输入一个命令行.</target> +<source>3. Press 'Start'.</source> +<target>3. 点击'开始'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +æ¯æ¬¡æœ‰å¦‚下情况时执行这个命令行: +- 所有目录转为å¯ç”¨çŠ¶æ€(例如æ’å…¥U盘) +- 目录或å目录里的文件被修改 +</target> +<source>Directories to watch</source> +<target>è¦ç›‘视的目录</target> +<source>Add folder</source> +<target>æ·»åŠ æ–‡ä»¶å¤¹</target> +<source>Remove folder</source> +<target>åˆ é™¤æ–‡ä»¶å¤¹</target> +<source>Select a folder</source> +<target>选择一个文件夹</target> +<source>Command line</source> +<target>命令行</target> +<source>Minimum Idle Time [seconds]</source> +<target>最å°ç©ºé—²æ—¶é—´[秒]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>以秒计的最åŽå˜æ›´å’Œæ‰§è¡Œå‘½ä»¤è¡Œä¹‹é—´çš„空闲时间</target> +<source>Start</source> +<target>开始</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>实时åŒæ¥é…ç½®</target> +<source>File already exists. Overwrite?</source> +<target>文件已ç»å˜åœ¨.覆盖?</target> +<source>&Restore</source> +<target>æ¢å¤(&R)</target> +<source>&Exit</source> +<target>退出(&E)</target> +<source>Monitoring active...</source> +<target>监视激活...</target> +<source>Waiting for missing directories...</source> +<target>æ£åœ¨ç‰å¾…丢失的目录...</target> +<source>Command line is empty!</source> +<target>命令行是空的!</target> +<source>Could not initialize directory monitoring:</source> +<target>ä¸èƒ½åˆå§‹åŒ–目录监视:</target> +<source>A directory input field is empty.</source> +<target>有一个目录输入å—段是空的.</target> +<source>Error when monitoring directories.</source> +<target>监视目录时出错.</target> +<source>Drag && drop</source> +<target>拖放</target> +<source>Conversion error:</source> +<target>转æ¢é”™è¯¯:</target> +<source>Error moving file:</source> +<target>移动文件时出错:</target> +<source>Operation aborted!</source> +<target>æ“作已å–消!</target> +<source>Target file already existing!</source> +<target>ç›®æ ‡æ–‡ä»¶å·²ç»å˜åœ¨!</target> +<source>Error moving directory:</source> +<target>移动目录时出错:</target> +<source>Target directory already existing!</source> +<target>ç›®æ ‡ç›®å½•å·²ç»å˜åœ¨!</target> +<source>Error deleting directory:</source> +<target>åˆ é™¤ç›®å½•å‡ºé”™:</target> +<source>Error changing modification time:</source> +<target>改å˜ä¿®æ”¹æ—¶é—´æ—¶å‡ºé”™:</target> +<source>Error loading library function:</source> +<target>åŠ è½½åº“å‡½æ•°å‡ºé”™:</target> +<source>Error reading security context:</source> +<target>读å–安全上下文时出错:</target> +<source>Error writing security context:</source> +<target>写入安全上下文时出错:</target> +<source>Error copying file permissions:</source> +<target>å¤åˆ¶æ–‡ä»¶æƒé™æ—¶å‡ºé”™:</target> +<source>Error creating directory:</source> +<target>创建目录出错:</target> +<source>Error copying symbolic link:</source> +<target>å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™:</target> +<source>Error copying file:</source> +<target>å¤åˆ¶æ–‡ä»¶å‡ºé”™:</target> +<source>Error opening file:</source> +<target>打开文件出错:</target> +<source>Error reading file:</source> +<target>读å–文件出错:</target> +<source>Endless loop when traversing directory:</source> +<target>éåŽ†ç›®å½•æ—¶å‡ºçŽ°æ— é™å¾ªçŽ¯:</target> +<source>Error traversing directory:</source> +<target>é历目录出错:</target> +<source>Error setting privilege:</source> +<target>设置æƒé™æ—¶å‡ºé”™:</target> +<source>Error moving to Recycle Bin:</source> +<target>移动到回收站出错:</target> +<source>Could not load a required DLL:</source> +<target>ä¸èƒ½åŠ 载所需的动æ€è¿žæŽ¥åº“:</target> +<source>Error writing to synchronization database:</source> +<target>å‘åŒæ¥æ•°æ®åº“ä¸å†™å…¥æ—¶å‡ºé”™:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>å¯åŠ¨å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬.</target> +<source>Could not determine volume name for file:</source> +<target>ä¸èƒ½ç¡®å®šæ¤æ–‡ä»¶çš„å·å称:</target> +<source>Volume name %x not part of filename %y!</source> +<target>å·å %x 并éžæ–‡ä»¶å %y 的一部分!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>ä¸èƒ½ä»Žå¦‚下XML节点读å–数值:</target> +<source>Show popup</source> +<target>显示弹出窗å£</target> +<source>Show popup on errors or warnings</source> +<target>在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºçª—å£</target> +<source>Ignore errors</source> +<target>忽略错误</target> +<source>Hide all error and warning messages</source> +<target>éšè—所有错误与è¦å‘Šä¿¡æ¯</target> +<source>Exit instantly</source> +<target>ç«‹å³é€€å‡º</target> +<source>Abort synchronization immediately</source> +<target>ç«‹å³ä¸æ¢åŒæ¥</target> +<source>Logging</source> +<target>记录</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync 批处ç†æ–‡ä»¶</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync é…ç½®</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync 批处ç†ä½œä¸š</target> +<source>Unable to create logfile!</source> +<target>æ— æ³•åˆ›å»ºæ—¥å¿—!</target> +<source>Batch execution</source> +<target>批处ç†æ‰§è¡Œ</target> +<source>Log-messages:</source> +<target>日志信æ¯:</target> +<source>Stop</source> +<target>åœæ¢</target> +<source>Total time:</source> +<target>总共时间:</target> +<source>Synchronization aborted!</source> +<target>åŒæ¥å·²æ”¾å¼ƒ!</target> +<source>Synchronization completed with errors!</source> +<target>åŒæ¥å·²å®Œæˆä½†æœ‰é”™è¯¯.</target> +<source>Synchronization completed successfully!</source> +<target>åŒæ¥æˆåŠŸå®Œæˆ!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>按"切æ¢"å¯æ‰“å¼€FreeFileSync图形用户界é¢æ¨¡å—.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>切æ¢è‡³FreeFileSync图形用户界é¢æ¨¡å—...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>æ— æ³•é“¾æŽ¥åˆ° Sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>FreeFileSync 有新版å¯ç”¨:</target> +<source>Download now?</source> +<target>ç«‹å³ä¸‹è½½?</target> +<source>Information</source> +<target>ä¿¡æ¯</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync 已是最新!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?></target> +<source>(Requires an Internet connection!)</source> +<target>(需è¦å› 特网连接!)</target> +<source>1. &Compare</source> +<target>1. 比较(&C)</target> +<source>2. &Synchronize...</source> +<target>2. åŒæ¥(&S)...</target> +<source>S&witch view</source> +<target>切æ¢è§†å›¾(&W)</target> +<source>&New</source> +<target>新建(&N)</target> +<source>&Program</source> +<target>程åº(&P)</target> +<source>&Language</source> +<target>切æ¢è¯è¨€(&L)</target> +<source>&Global settings...</source> +<target>全局设置(&G)...</target> +<source>&Create batch job...</source> +<target>创建批处ç†ä½œä¸š(&C)...</target> +<source>&Export file list...</source> +<target>导出文件列表(&E)...</target> +<source>&Advanced</source> +<target>高级(&A)</target> +<source>&Check for new version</source> +<target>检查更新(&C)</target> +<source>Compare</source> +<target>比较</target> +<source>Compare both sides</source> +<target>比较两侧</target> +<source>&Abort</source> +<target>å–消(&A)</target> +<source>Synchronize...</source> +<target>åŒæ¥...</target> +<source>Start synchronization</source> +<target>开始åŒæ¥</target> +<source>Swap sides</source> +<target>两侧互æ¢</target> +<source>Add folder pair</source> +<target>æ·»åŠ æˆå¯¹æ–‡ä»¶å¤¹</target> +<source>Remove folder pair</source> +<target>åˆ é™¤æ–‡ä»¶å¤¹å¯¹</target> +<source>Save current configuration to file</source> +<target>ä¿å˜å½“å‰é…置到文件</target> +<source>Load configuration from file</source> +<target>ä»Žæ–‡ä»¶åŠ è½½é…ç½®</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表ä¸ç§»é™¤)</target> +<source>Hide excluded items</source> +<target>éšè—已排除的项目</target> +<source>Hide filtered or temporarily excluded files</source> +<target>éšè—已过滤或临时排除的文件</target> +<source>Number of files and directories that will be created</source> +<target>一些文件和目录将被创建</target> +<source>Number of files that will be overwritten</source> +<target>一些文件和目录将被覆盖</target> +<source>Number of files and directories that will be deleted</source> +<target>ä¸€äº›æ–‡ä»¶å’Œç›®å½•å°†è¢«åˆ é™¤</target> +<source>Total amount of data that will be transferred</source> +<target>将被转移的总数æ®</target> +<source>Left</source> +<target>左侧</target> +<source>Right</source> +<target>å³ä¾§</target> +<source>Batch job</source> +<target>批处ç†ä½œä¸š</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>装é…一个批处ç†æ–‡ä»¶ç”¨äºŽè‡ªåŠ¨åŒæ¥. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°å°†æ‰¹å¤„ç†æ–‡ä»¶åä¼ é€ç»™FreeFileSyncå¯æ‰§è¡Œæ–‡ä»¶:FreeFileSync.exe <batchfile>. 这个也å¯ä»¥å®‰æŽ’在您的æ“作系统的计划任务ä¸.</target> +<source>Help</source> +<target>帮助</target> +<source>Configuration overview:</source> +<target>é…置概览:</target> +<source>Filter files</source> +<target>过滤文件</target> +<source>Status feedback</source> +<target>状况å馈</target> +<source>Silent mode</source> +<target>é™é»˜æ¨¡å¼</target> +<source>Start minimized and write status information to a logfile</source> +<target>以最å°åŒ–开始è¿è¡Œå¹¶å°†ä¿¡æ¯å†™åˆ°æ—¥å¿—文件</target> +<source>Error handling</source> +<target>错误处ç†</target> +<source>Overview</source> +<target>摘è¦</target> +<source>Select logfile directory:</source> +<target>选择日志ä¿å˜ä½ç½®:</target> +<source>Maximum number of logfiles:</source> +<target>最大的日志文件数:</target> +<source>&Save</source> +<target>ä¿å˜(&S)</target> +<source>&Load</source> +<target>åŠ è½½(&L)</target> +<source>&Cancel</source> +<target>å–消(&C)</target> +<source>Elements found:</source> +<target>å·²æ‰¾åˆ°çš„å…ƒç´ :</target> +<source>Elements remaining:</source> +<target>å‰©ä½™çš„å…ƒç´ :</target> +<source>Speed:</source> +<target>速度:</target> +<source>Time remaining:</source> +<target>剩余时间:</target> +<source>Time elapsed:</source> +<target>已用时间:</target> +<source>Operation:</source> +<target>æ“作:</target> +<source>Select variant:</source> +<target>选择å˜åŒ–çš„:</target> +<source><Automatic></source> +<target>自动</target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>使用数æ®åº“æ¥è¯†åˆ«å’Œä¼ é€ä¸¤è¾¹çš„改å˜. è‡ªåŠ¨æ£€æµ‹åˆ é™¤å’Œå†²çªçŠ¶æ€.</target> +<source>Mirror ->></source> +<target>é•œåƒ ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>é•œåƒå¤‡ä»½å·¦è¾¹çš„文件夹.åŒæ¥åŽå³è¾¹çš„文件夹被修改为和左边文件夹精确匹é….</target> +<source>Update -></source> +<target>å‡çº§ -></target> +<source>Copy new or updated files to right folder.</source> +<target>å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹</target> +<source>Custom</source> +<target>自定义</target> +<source>Configure your own synchronization rules.</source> +<target>é…ç½®ä½ è‡ªå·±çš„åŒæ¥è§„则.</target> +<source>Deletion handling</source> +<target>åˆ é™¤å¤„ç†</target> +<source>&OK</source> +<target>确定(&O)</target> +<source>Configuration</source> +<target>é…ç½®</target> +<source>Category</source> +<target>分类</target> +<source>Action</source> +<target>动作</target> +<source>Files/folders that exist on left side only</source> +<target>仅在左侧å˜åœ¨çš„文件/文件夹</target> +<source>Files/folders that exist on right side only</source> +<target>仅在å³ä¾§å˜åœ¨çš„文件/文件夹</target> +<source>Files that exist on both sides, left one is newer</source> +<target>两侧都有,左侧较新的文件</target> +<source>Files that exist on both sides, right one is newer</source> +<target>两侧都有,å³ä¾§è¾ƒæ–°çš„文件</target> +<source>Files that have different content</source> +<target>有ä¸åŒå†…容的文件</target> +<source>Conflicts/files that cannot be categorized</source> +<target>冲çª/文件ä¸èƒ½è¢«å½’ç±»</target> +<source>Compare by...</source> +<target>比较选项...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +文件被认为是相åŒçš„,如果 + - æ–‡ä»¶å¤§å° + - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ +ç›¸åŒ +</target> +<source>File size and date</source> +<target>文件大å°å’Œæ—¥æœŸ</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +文件被认为是相åŒçš„,如果 + - 文件内容 +ç›¸åŒ +</target> +<source>File content</source> +<target>文件内容</target> +<source>Symbolic Link handling</source> +<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target> +<source>Synchronizing...</source> +<target>åŒæ¥ä¸...</target> +<source>Elements processed:</source> +<target>已处ç†çš„å…ƒç´ :</target> +<source>&Pause</source> +<target>æš‚åœ(&P)</target> +<source>Compare by "File size and date"</source> +<target>通过文件大å°å’Œæ—¥æœŸæ¯”较</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>æ¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒæ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>当以æ¤é€‰é¡¹å¼€å§‹æ¯”è¾ƒæ—¶ä»¥ä¸‹å†³å®šæ ‘è¢«å¤„ç†:</target> +<source>As a result the files are separated into the following categories:</source> +<target>å…¶ç»“æžœæ˜¯æ–‡ä»¶åˆ†ä¸ºä»¥ä¸‹å‡ ç±»:</target> +<source>- equal</source> +<target>- 相åŒ</target> +<source>- left newer</source> +<target>- 左侧较新</target> +<source>- right newer</source> +<target>- å³ä¾§è¾ƒæ–°</target> +<source>- exists left only</source> +<target>- 仅左侧å˜åœ¨çš„</target> +<source>- exists right only</source> +<target>- ä»…å³ä¾§å˜åœ¨çš„</target> +<source>- conflict (same date, different size)</source> +<target>- 冲çª(相åŒæ—¥æœŸ,ä¸åŒå¤§å°)</target> +<source>Compare by "File content"</source> +<target>通过文件内容比较</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +顾åæ€ä¹‰,两个相åŒæ–‡ä»¶å的文件当且仅当它们具有相åŒçš„内容时会被认为是相åŒçš„。 +æ¤é€‰é¡¹å¯¹äºŽä¸€è‡´æ€§æ£€æŸ¥æ¯”较有用,而ä¸æ˜¯å¤‡ä»½æ“作. å› æ¤,文件时间没有被考虑到. + +通过æ¤é€‰é¡¹ä½¿å†³ç–æ ‘è¾ƒå°: +</target> +<source>- different</source> +<target>- ä¸åŒ</target> +<source>Source code written in C++ utilizing:</source> +<target>æºä»£ç 用如下C++工具写æˆ:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>欢迎在下é¢æ出å馈æ„è§å’Œå»ºè®®:</target> +<source>FreeFileSync at Sourceforge</source> +<target>Sourceforge上的FreeFileSync</target> +<source>Homepage</source> +<target>主页</target> +<source>If you like FFS</source> +<target>å¦‚æžœä½ å–œæ¬¢ FFS</target> +<source>Donate with PayPal</source> +<target>通过PayPalæèµ </target> +<source>Email</source> +<target>邮箱</target> +<source>Report translation error</source> +<target>报告翻译错误</target> +<source>Published under the GNU General Public License:</source> +<target>在GNU通用公共许å¯ä¸‹å‘布:</target> +<source>Ignore subsequent errors</source> +<target>忽略éšåŽçš„错误</target> +<source>Hide further error messages during the current process</source> +<target>在当å‰è¿›ç¨‹ä¸éšè—进一æ¥çš„错误信æ¯</target> +<source>&Ignore</source> +<target>忽略(&I)</target> +<source>&Retry</source> +<target>é‡è¯•(&R)</target> +<source>Do not show this dialog again</source> +<target>ä¸è¦å†æ˜¾ç¤ºæ¤å¯¹è¯æ¡†</target> +<source>&Switch</source> +<target>切æ¢(&S)</target> +<source>&Yes</source> +<target>是(&Y)</target> +<source>&No</source> +<target>å¦(&N)</target> +<source>Delete on both sides</source> +<target>ä»Žä¸¤ä¾§åˆ é™¤</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>ä»Žä¸¤ä¾§åˆ é™¤(å³ä½¿ä»…在一侧选择文件)</target> +<source>Use Recycle Bin</source> +<target>使用回收站</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +åªæœ‰åŒ¹é…所有过滤器设置的文件/目录会被选择用于åŒæ¥. +备注:文件å过滤器必须指定为åŒæ¥ä¸»ç›®å½•çš„相对路径. +</target> +<source>Hints:</source> +<target>æ示:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. 输入相对文件或文件夹å称,用';'或空行分隔.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. 使用通é…符‘*’和‘?’.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. 通过å³é”®èœå•åœ¨ä¸»ç½‘æ ¼æŽ’é™¤æ–‡ä»¶.</target> +<source>Example</source> +<target>例如</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>åŒæ¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了"temp"ä¸çš„一切.</target> +<source>Include</source> +<target>包括</target> +<source>Exclude</source> +<target>排除</target> +<source>Select time span:</source> +<target>选择时间间隔:</target> +<source>Minimum file size:</source> +<target>最å°æ–‡ä»¶å¤§å°:</target> +<source>Maximum file size:</source> +<target>最大文件大å°</target> +<source>&Default</source> +<target>默认(&D)</target> +<source>Move column up</source> +<target>上移一行</target> +<source>Move column down</source> +<target>下移一行</target> +<source>Copy locked files</source> +<target>å¤åˆ¶è¢«é”定的文件</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +通过å·å½±å¤åˆ¶æœåŠ¡å¤åˆ¶å…±äº«æˆ–é”定的文件 +(需è¦ç®¡ç†å‘˜æƒé™) +</target> +<source>Copy filesystem permissions</source> +<target>å¤åˆ¶æ–‡ä»¶ç³»ç»Ÿçš„æƒé™</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +转移文件和目录的æƒé™ +(需è¦ç®¡ç†å‘˜æƒé™) +</target> +<source>Hidden dialogs:</source> +<target>éšè—对è¯æ¡†:</target> +<source>Reset</source> +<target>é‡ç½®</target> +<source>Show hidden dialogs</source> +<target>显示éšè—的对è¯æ¡†</target> +<source>External applications</source> +<target>外部应用程åº</target> +<source>Description</source> +<target>æè¿°</target> +<source>Variant</source> +<target>å˜åŒ–</target> +<source>Statistics</source> +<target>统计</target> +<source>Find what:</source> +<target>è¦æŸ¥æ‰¾ä»€ä¹ˆ:</target> +<source>Match case</source> +<target>匹é…大å°å†™</target> +<source>&Find next</source> +<target>查找下一个(&F)</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)!</target> +<source>Batch file created successfully!</source> +<target>批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ!</target> +<source>Main bar</source> +<target>主工具æ¡</target> +<source>Folder pairs</source> +<target>文件夹对</target> +<source>Select view</source> +<target>选择视图</target> +<source>Folder Comparison and Synchronization</source> +<target>文件夹比较与åŒæ¥</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>æ¤ç³»ç»Ÿä¸Šä¸æ”¯æŒå›žæ”¶ç«™!</target> +<source>Set direction:</source> +<target>设置方å‘:</target> +<source>Exclude temporarily</source> +<target>暂时排除</target> +<source>Include temporarily</source> +<target>暂时包括</target> +<source>Exclude via filter:</source> +<target>通过过滤器排除:</target> +<source><multiple selection></source> +<target><多选></target> +<source>D-Click</source> +<target>åŒå‡»</target> +<source>Copy to clipboard CTRL+C</source> +<target>å¤åˆ¶åˆ°å‰ªè´´æ¿ CTRL+C</target> +<source>Delete files DEL</source> +<target>åˆ é™¤æ–‡ä»¶ DEL</target> +<source>Customize...</source> +<target>自定义...</target> +<source>Auto-adjust columns</source> +<target>自动调整æ 宽</target> +<source>Include all rows</source> +<target>包括所有行</target> +<source>Exclude all rows</source> +<target>排除所有行</target> +<source>Reset view</source> +<target>é‡ç½®è§†å›¾</target> +<source>Show "%x"</source> +<target>显示 "%x"</target> +<source><Last session></source> +<target><最åŽä¼šè¯></target> +<source>Configuration saved!</source> +<target>é…置已ä¿å˜!</target> +<source>Save changes to current configuration?</source> +<target>ä¿å˜æ›´æ”¹åˆ°å½“å‰é…ç½®?</target> +<source>Configuration loaded!</source> +<target>é…ç½®å·²åŠ è½½!</target> +<source>Hide files that exist on left side only</source> +<target>éšè—仅在左侧的文件</target> +<source>Show files that exist on left side only</source> +<target>显示仅å˜åœ¨å·¦ä¾§çš„文件</target> +<source>Hide files that exist on right side only</source> +<target>éšè—仅在å³ä¾§çš„文件</target> +<source>Show files that exist on right side only</source> +<target>显示仅å˜åœ¨å³ä¾§çš„文件</target> +<source>Hide files that are newer on left</source> +<target>éšè—左侧较新的文件</target> +<source>Show files that are newer on left</source> +<target>显示左侧较新的文件</target> +<source>Hide files that are newer on right</source> +<target>éšè—å³ä¾§è¾ƒæ–°çš„文件</target> +<source>Show files that are newer on right</source> +<target>显示å³ä¾§è¾ƒæ–°çš„文件</target> +<source>Hide files that are equal</source> +<target>éšè—相åŒçš„文件</target> +<source>Show files that are equal</source> +<target>显示相åŒçš„文件</target> +<source>Hide files that are different</source> +<target>éšè—ä¸åŒçš„文件</target> +<source>Show files that are different</source> +<target>显示ä¸åŒçš„文件</target> +<source>Hide conflicts</source> +<target>éšè—冲çª</target> +<source>Show conflicts</source> +<target>显示冲çª</target> +<source>Hide files that will be created on the left side</source> +<target>éšè—将在左侧被建立的文件</target> +<source>Show files that will be created on the left side</source> +<target>显示将在左侧被建立的文件</target> +<source>Hide files that will be created on the right side</source> +<target>éšè—将在å³ä¾§è¢«å»ºç«‹çš„文件</target> +<source>Show files that will be created on the right side</source> +<target>显示将在å³ä¾§è¢«å»ºç«‹çš„文件</target> +<source>Hide files that will be deleted on the left side</source> +<target>éšè—å°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶</target> +<source>Show files that will be deleted on the left side</source> +<target>æ˜¾ç¤ºå°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶</target> +<source>Hide files that will be deleted on the right side</source> +<target>éšè—将在å³ä¾§è¢«åˆ 除的文件</target> +<source>Show files that will be deleted on the right side</source> +<target>显示将在å³ä¾§è¢«åˆ 除的文件</target> +<source>Hide files that will be overwritten on left side</source> +<target>éšè—将在左侧被覆盖的文件</target> +<source>Show files that will be overwritten on left side</source> +<target>显示将在左侧被覆盖的文件</target> +<source>Hide files that will be overwritten on right side</source> +<target>éšè—将在å³ä¾§è¢«è¦†ç›–的文件</target> +<source>Show files that will be overwritten on right side</source> +<target>显示将在å³ä¾§è¢«è¦†ç›–的文件</target> +<source>Hide files that won't be copied</source> +<target>éšè—å°†ä¸ä¼šè¢«å¤åˆ¶çš„文件</target> +<source>Show files that won't be copied</source> +<target>显示将ä¸è¢«å¤åˆ¶çš„文件</target> +<source>All directories in sync!</source> +<target>所有目录åŒæ¥!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>åŒæ¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯”</target> +<source>Comma separated list</source> +<target>逗å·åˆ†éš”的列表</target> +<source>Legend</source> +<target>图例</target> +<source>File list exported!</source> +<target>文件清å•å·²ç»å¯¼å‡º!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%x 个对象被æˆåŠŸåˆ 除!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x 目录</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x 文件</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%y ä¸çš„ %x è¡Œå¯è§</pluralform> +</target> +<source>Scanning...</source> +<target>æ£æ‰«æ...</target> +<source>Comparing content...</source> +<target>æ£åœ¨æ¯”较文件内容...</target> +<source>Paused</source> +<target>已暂åœ</target> +<source>Aborted</source> +<target>å·²å–消</target> +<source>Completed</source> +<target>完æˆ</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>å–消请求: æ£åœ¨ç‰å¾…当å‰æ“作完æˆ...</target> +<source>Continue</source> +<target>继ç»</target> +<source>Pause</source> +<target>æš‚åœ</target> +<source>Cannot find %x</source> +<target>找ä¸åˆ° %x</target> +<source>DECISION TREE</source> +<target>决ç–æ ‘</target> +<source>file exists on both sides</source> +<target>文件在两侧å‡å·²å˜åœ¨</target> +<source>on one side only</source> +<target>仅在一侧</target> +<source>same date</source> +<target></target> +<source>different date</source> +<target></target> +<source>Inactive</source> +<target>ä¸æ´»åŠ¨</target> +<source>Second</source> +<target>秒</target> +<source>Minute</source> +<target>分</target> +<source>Hour</source> +<target>å°æ—¶</target> +<source>Day</source> +<target>天</target> +<source>Byte</source> +<target>å—节</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>过滤器:所有的é…对</target> +<source>Filter: Single pair</source> +<target>过滤器:å•ä¸€çš„é…对</target> +<source>Ignore</source> +<target>忽略</target> +<source>Direct</source> +<target>直接</target> +<source>Follow</source> +<target>è·Ÿéš</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨:</target> +<source>- full file or directory name</source> +<target>- 完整的文件å或目录å</target> +<source>- directory part only</source> +<target>- åªå¯¹ç›®å½•éƒ¨åˆ†</target> +<source>- Other side's counterpart to %name</source> +<target>- å¦ä¸€ä¾§å‚ç…§ %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- å¦ä¸€ä¾§å‚ç…§ %dir</target> +<source>Restore all hidden dialogs?</source> +<target>æ¢å¤æ‰€æœ‰è¢«éšè—的对è¯æ¡†?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>ä½ æ˜¯å¦çœŸçš„è¦ç§»åŠ¨å¦‚下 %x 个对象到回收站?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>ä½ æ˜¯å¦çœŸçš„è¦åˆ 除如下 %x 个对象?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>é—留为未解决的冲çª</target> +<source>Delete permanently</source> +<target>æ°¸ä¹…æ€§åˆ é™¤</target> +<source>Delete or overwrite files permanently</source> +<target>æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™</target> +<source>Versioning</source> +<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target> +<source>Move files into a time-stamped subdirectory</source> +<target>ç§»åŠ¨æ–‡ä»¶åˆ°æ—¶é—´æ ‡è®°å目录</target> +<source>Cannot determine sync-direction:</source> +<target>ä¸èƒ½æ£€æµ‹åŒæ¥æ–¹å‘:</target> +<source>Filter settings have changed!</source> +<target>过滤设置已改å˜!</target> +<source>Both sides have changed since last synchronization!</source> +<target>在最åŽçš„åŒæ¥ä¹‹åŽä¸¤è¾¹å‡å·²æ”¹å˜!</target> +<source>No change since last synchronization!</source> +<target>自从最åŽä¸€æ¬¡åŒæ¥ä»¥æ¥æ²¡æœ‰å˜åŠ¨!</target> +<source>The file was not processed by last synchronization!</source> +<target>æ¤æ–‡ä»¶åœ¨æœ€åŽä¸€æ¬¡åŒæ¥ä¸æœªè¢«å¤„ç†!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>è®¡åˆ’çš„ç›®å½•åˆ é™¤ä¸Žå…¶å目录和文件有冲çª!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>设置默认的åŒæ¥æ–¹å‘:旧文件会被新文件覆盖.</target> +<source>The file does not contain a valid configuration:</source> +<target>该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®:</target> +<source>Scanning:</source> +<target>扫æä¸:</target> +<source>Encoding extended time information: %x</source> +<target>æ£åœ¨ç¼–ç 扩展时间信æ¯:%x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„.</target> +<source>Directory does not exist:</source> +<target>目录ä¸å˜åœ¨:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ¥è§„则时请å°å¿ƒ:</target> +<source>Comparing content of files %x</source> +<target>æ£åœ¨æ¯”较文件 %x 的内容</target> +<source>Memory allocation failed!</source> +<target>内å˜åˆ†é…失败!</target> +<source>File %x has an invalid date!</source> +<target>文件 %x 的日期éžæ³•!</target> +<source>Conflict detected:</source> +<target>检测到冲çª:</target> +<source>Files %x have the same date but a different size!</source> +<target>文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>符å·è¿žæŽ¥ %x 有相åŒçš„æ—¥æœŸä½†ç›®æ ‡ä¸åŒ!</target> +<source>Comparing files by content failed.</source> +<target>按文件内容比较失败.</target> +<source>Generating file list...</source> +<target>生æˆæ–‡ä»¶åˆ—表...</target> +<source>Multiple...</source> +<target>并è”...</target> +<source>Files that are equal on both sides</source> +<target>两边文件相åŒ</target> +<source>Equal files/folders that differ in attributes only</source> +<target>相ç‰çš„文件/文件夹仅仅文件属性ä¸åŒ</target> +<source>Copy from right to left</source> +<target>从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§</target> +<source>Copy from left to right</source> +<target>从左侧å¤åˆ¶åˆ°å³ä¾§</target> +<source>Delete files/folders existing on left side only</source> +<target>åˆ é™¤ä»…åœ¨å·¦ä¾§å˜åœ¨çš„文件/文件夹</target> +<source>Delete files/folders existing on right side only</source> +<target>åˆ é™¤ä»…åœ¨å³ä¾§å˜åœ¨çš„文件/文件夹</target> +<source>Copy from right to left overwriting</source> +<target>从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§(覆盖模å¼)</target> +<source>Copy from left to right overwriting</source> +<target>从左侧å¤åˆ¶åˆ°å³ä¾§(覆盖模å¼)</target> +<source>Do nothing</source> +<target>ä¿æŒä¸åŠ¨</target> +<source>Copy attributes only from right to left</source> +<target>从å³è¾¹åˆ°å·¦è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§</target> +<source>Copy attributes only from left to right</source> +<target>从左边到å³è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§</target> +<source>Deleting file %x</source> +<target>æ£åˆ 除文件 %x</target> +<source>Deleting Symbolic Link %x</source> +<target>æ£åœ¨åˆ 除符å·è¿žæŽ¥ %x</target> +<source>Deleting folder %x</source> +<target>æ£åˆ 除文件夹 %x</target> +<source>Moving %x to Recycle Bin</source> +<target>移动 %x 到回收站</target> +<source>Moving file %x to user-defined directory %y</source> +<target>移动文件 %x 到用户定义目录 %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>移动文件夹 %x 到用户定义目录 %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>æ£åœ¨ç§»åŠ¨ç¬¦å·è¿žæŽ¥ %x 到用户定义目录 %y</target> +<source>Copying new file %x to %y</source> +<target>å¤åˆ¶æ–°æ–‡ä»¶ %x 到 %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>å¤åˆ¶æ–°ç¬¦å·è¿žæŽ¥ %x 到 %y</target> +<source>Overwriting file %x in %y</source> +<target>æ£åœ¨ %y 上覆盖文件 %x</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>æ£åœ¨ %y 上覆盖符å·è¿žæŽ¥ %x</target> +<source>Creating folder %x</source> +<target>æ£åˆ›å»ºæ–‡ä»¶å¤¹ %x</target> +<source>Verifying file %x</source> +<target>æ ¡éªŒæ–‡ä»¶ %x</target> +<source>Updating attributes of %x</source> +<target>æ›´æ–° %x 的属性</target> +<source>Source directory does not exist anymore:</source> +<target>æºç›®å½•å·²ç»ä¸å˜åœ¨:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>æ ¹æ®é…置没有任何åŒæ¥!</target> +<source>Target directory name must not be empty!</source> +<target>ç›®æ ‡ç›®å½•åä¸èƒ½ä¸ºç©º!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>ç”¨äºŽåˆ é™¤çš„ç”¨æˆ·å®šä¹‰ç›®å½•æ²¡æœ‰æŒ‡å®š!</target> +<source>Unresolved conflicts existing!</source> +<target>å˜åœ¨ä¸å¯è§£å†³çš„冲çª!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»åŒæ¥.</target> +<source>Significant difference detected:</source> +<target>已侦测到显著ä¸åŒ:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>超过总数 50% 以上的文件è¦è¢«å¤åˆ¶æˆ–åˆ é™¤!</target> +<source>Not enough free disk space available in:</source> +<target>没有足够的å¯ç”¨ç£ç›˜ç©ºé—´ç”¨äºŽ:</target> +<source>Free disk space required:</source> +<target>需è¦å¯ç”¨çš„ç£ç›˜ç©ºé—´:</target> +<source>Free disk space available:</source> +<target>å¯ç”¨ç£ç›˜ç©ºé—´:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>有一个目录将被修改,而它是多个文件夹对的一部分!请é‡æ–°æ£€æŸ¥åŒæ¥è®¾ç½®!</target> +<source>Processing folder pair:</source> +<target>æ£åœ¨å¤„ç†æˆå¯¹æ–‡ä»¶å¤¹:</target> +<source>Generating database...</source> +<target>æ£åœ¨ç”Ÿæˆæ•°æ®åº“...</target> +<source>Error copying locked file %x!</source> +<target>å¤åˆ¶å·²é”定的文件时出错 %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ!</target> diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index e00a8b06..9b0cdf5d 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -1,912 +1,1030 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y å€‹ç‰©ä»¶å·²åˆ é™¤æˆåŠŸ -%x Bytes -%x ä½å…ƒçµ„ -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x 天 -%x directories -%x 目錄 -%x files -%x 檔案 -%x hour(s) -%x å°æ™‚ -%x kB -%x kB -%x min -%x 分 -%x of %y rows in view -顯示 %y 之 %x è¡Œ -%x of 1 row in view -顯示 1 之 %x è¡Œ -%x sec -%x 秒 -%x% -%x% -&Abort -å–消(&A) -&About... -關於(&A)... -&Advanced -進階(&A) -&Cancel -å–消(&C) -&Check for new version -檢查更新(&C) -&Content -內容 -&Create batch job... -新建批次處ç†ä½œæ¥(&C)... -&Default -é è¨(&D) -&Exit -çµæŸ(&E) -&Export file list... -匯出檔案清單(&E)... -&File -檔案(&F) -&Find next -找下一個(&F) -&Global settings... -æ•´é«”è¨å®š(&G)... -&Help -說明(&H) -&Ignore -忽略(&I) -&Language -語言(&L) -&Load -載入(&L) -&Load configuration... -載入é…ç½®(&L)... -&New -新增專案(&N) -&No -å¦ -&OK -確定(&O) -&Pause -æš«åœ(&P) -&Program -程å¼(&P) -&Quit -離開(&Q) -&Restore -回復(&R) -&Retry -é‡è©¦(&R) -&Save -儲å˜(&S) -&Switch -åˆ‡æ› -&Yes -是 -(Build: %x) -(建立:%x) -(Requires an Internet connection!) -(需è¦é€£æŽ¥åˆ°ç¶²éš›ç¶²è·¯ï¼) -- Other side's counterpart to %dir -- å¦ä¸€é‚Šå°æ‡‰åˆ° %dir -- Other side's counterpart to %name -- å¦ä¸€é‚Šå°æ‡‰åˆ° %name -- conflict -- è¡çª -- conflict (same date, different size) -- è¡çª(相åŒæ—¥æœŸï¼Œä¸åŒå¤§å°) -- different -- ä¸åŒ -- directory part only -- åªæœ‰ç›®éŒ„部份 -- equal -- ç›¸åŒ -- exists left only -- åªå˜åœ¨æ–¼å·¦é‚Š -- exists right only -- åªå˜åœ¨æ–¼å³é‚Š -- full file or directory name -- 完整的檔å或目錄å稱 -- left -- 左邊 -- left newer -- 左邊較新 -- right -- å³é‚Š -- right newer -- å³é‚Šè¼ƒæ–° -/sec -/秒 -1 directory -1 目錄 -1 file -1 檔案 -1. &Compare -1. 比å°(&C) -1. Enter relative file or directory names separated by ';' or a new line. -1. 輸入相å°æª”案或目錄å稱,使用';'或空行分隔。 -1. Select directories to monitor. -1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。 -2. &Synchronize... -2. åŒæ¥(&S)... -2. Enter a command line. -2. 輸入命令列。 -2. Use wildcard characters '*' and '?'. -2. 使用è¬ç”¨å—元‘*’和‘?’。 -3. Exclude files directly on main grid via context menu. -3. 經由內容é¸å–®ç›´æŽ¥åœ¨ä¸»è¦ç¶²æ ¼æŽ’除檔案。 -3. Press 'Start'. -3. 按下 '開始'。 -<Automatic> -<自動> -<Directory> -<目錄> -<Last session> -<最後連線> -<Symlink> -<符號連çµ> -<multiple selection> -<多é‡é¸æ“‡> -A directory input field is empty. -目錄輸入的欄ä½ç‚ºç©º -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -一個目錄將被修改,這是多å°è³‡æ–™å¤¾çš„一部份ï¼è«‹æª¢é–±åŒæ¥è¨ç½®ï¼ -A newer version of FreeFileSync is available: -有較新版本的 FreeFileSync å¯ç”¨ï¼š -Abort requested: Waiting for current operation to finish... -ä¸æ¢è«‹æ±‚:æ£åœ¨ç‰å¾…ç›®å‰æ“作完æˆ... -Abort synchronization immediately -ç«‹å³ä¸æ¢åŒæ¥ -Aborted -å·²ä¸æ¢ -About -關於 -Action -動作 -Add folder -新增資料夾 -Add folder pair -新增一å°è³‡æ–™å¤¾ -All directories in sync! -åŒæ¥æ‰€æœ‰ç›®éŒ„ï¼ -An exception occurred! -ç™¼ç”Ÿç•°å¸¸ï¼ -As a result the files are separated into the following categories: -çµæžœæ˜¯æª”案分為以下幾類: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -顧åæ€ç¾©ï¼Œå…©å€‹ç›¸åŒæª”å的檔案,åªæœ‰ç•¶ä»–們具有åŒæ¨£çš„内容時會被判斷是相åŒçš„。\næ¤é¸é …å°æ–¼ä¸€è‡´æ€§æª¢æŸ¥æ¯”較有用,而ä¸æ˜¯å‚™ä»½æ“ä½œã€‚å› æ¤ï¼Œæª”案時間沒有列入考慮。\n\n啟用æ¤é¸é …使決ç–樹較å°ï¼š -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -組åˆä¸€å€‹ç”¨æ–¼è‡ªå‹•åŒæ¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼ï¼Œåªéœ€ç°¡å–®çš„將批次檔å傳é€ç»™ FreeFileSync å¯åŸ·è¡Œæª”:FreeFileSync.exe <batchfile>。這個也å¯ä»¥å®‰æŽ’åœ¨ä½ çš„ä½œæ¥ç³»çµ±çš„計畫任務ä¸ã€‚ -At least one directory input field is empty. -至少有一個目錄輸入欄ä½æ˜¯ç©ºçš„。 -Auto-adjust columns -自動調整欄寬 -Batch execution -批次處ç†åŸ·è¡Œ -Batch file created successfully! -批次檔新建æˆåŠŸï¼ -Batch job -批次處ç†ä½œæ¥ -Big thanks for localizing FreeFileSync goes out to: -éžå¸¸æ„Ÿè¬ FreeFileSync 當地語系化的工作人員: -Both sides have changed since last synchronization! -自上次åŒæ¥å¾Œï¼Œå…©é‚Šå‡å·²æ›´æ”¹éŽï¼ -Browse -ç€è¦½ -Browse directory -ç€è¦½ç›®éŒ„ -Cannot determine sync-direction: -無法判斷åŒæ¥æ–¹å‘: -Cannot find %x -找ä¸åˆ° %x -Cannot write to empty directory path! +<header> + <language name>æ£é«”ä¸æ–‡</language name> + <translator>Carlos</translator> + <locale>Chinese (Traditional)</locale> + <flag file>taiwan.png</flag file> + <plural forms>1</plural forms> + <plural definition>0</plural definition> +</header> -Category -分類 -Clear filter settings -清除篩é¸å™¨è¨å®š -Comma separated list -逗號分隔清單 -Command line -命令列 -Command line is empty! -å‘½ä»¤åˆ—æ˜¯ç©ºçš„ï¼ -Compare -æ¯”å° -Compare both sides -比å°å…©é‚Š -Compare by \"File content\" -ä»¥æª”æ¡ˆå†…å®¹æ¯”å° -Compare by \"File size and date\" -以檔案大å°å’Œæ—¥æœŸæ¯”å° -Compare by... -比å°é¸é …... -Comparing content of files %x -æ£åœ¨æ¯”å°æª”案内容的百分比 %x -Comparing content... -æ£åœ¨æ¯”å°æª”案内容... -Comparing files by content failed. -比å°æª”案內容失敗 -Comparison Result -比å°çµæžœ -Comparison settings -比å°è¨å®š -Completed -å®Œæˆ -Configuration -é…ç½® -Configuration loaded! -已載入é…ç½®ï¼ -Configuration overview: -é…置概述: -Configuration saved! -é…置已儲å˜ï¼ -Configure filter -é…ç½®ç¯©é¸ -Configure your own synchronization rules. -é…ç½®ä½ è‡ªå·±çš„åŒæ¥è¦å‰‡ã€‚ -Confirm -ç¢ºèª -Conflict detected: -檢測到è¡çªï¼š -Conflicts/files that cannot be categorized -è¡çª/檔案ä¸èƒ½è¢«åˆ†é¡ž -Continue -繼續 -Conversion error: -轉æ›éŒ¯èª¤ï¼š -Copy attributes only from left to right -複製åªæœ‰å¾žå·¦é‚Šåˆ°å³é‚Šçš„屬性 -Copy attributes only from right to left -複製åªæœ‰å¾žå³é‚Šåˆ°å·¦é‚Šçš„屬性 -Copy filesystem permissions -è¤‡è£½æª”æ¡ˆç³»çµ±æ¬Šé™ -Copy from left to right -從左邊複製到å³é‚Š -Copy from left to right overwriting -從左邊複製到å³é‚Šè¦†è“‹æª”案 -Copy from right to left -從å³é‚Šè¤‡è£½åˆ°å·¦é‚Š -Copy from right to left overwriting -從å³é‚Šè¤‡è£½åˆ°å·¦é‚Šè¦†è“‹æª”案 -Copy locked files -複製被鎖定的檔案 -Copy new or updated files to right folder. -將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾ä¸ã€‚ -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -複製共用或鎖定檔案使用使用å·å½±è¤‡è£½æœå‹™\n(需è¦ç®¡ç†å“¡æ¬Šé™) -Copy to clipboard\tCTRL+C -複製到剪貼簿\tCTRL+C -Copying new Symbolic Link %x to %y -è¤‡è£½ç¬¦è™Ÿé€£çµ %x 到 %y -Copying new file %x to %y -複製新檔案 %x 到 %y -Could not determine volume name for file: -無法判斷æ¤æª”案的å·æ¨™å稱: -Could not initialize directory monitoring: -無法åˆå§‹åŒ–目錄監測: -Could not load a required DLL: -無法載入一個所需的DLL: -Could not read values for the following XML nodes: -ç„¡æ³•è®€å– XML 之後節點的值: -Create a batch job -新建一個批次處ç†ä½œæ¥ -Creating folder %x -æ£åœ¨æ–°å»ºè³‡æ–™å¤¾ %x -Custom -自訂 -Customize columns -自訂列 -Customize... -自訂... -D-Click -點兩下 -DECISION TREE -決ç–樹 -Data verification error: Source and target file have different content! -資料驗è‰éŒ¯èª¤ï¼šä¾†æºå’Œç›®çš„檔案內容ä¸åŒï¼ -Date -日期 -Delete files/folders existing on left side only -刪除åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾 -Delete files/folders existing on right side only -刪除åªå˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾 -Delete files\tDEL -刪除檔案\tDEL -Delete on both sides -兩邊都刪除 -Delete on both sides even if the file is selected on one side only -å³ä½¿åªåœ¨ä¸€é‚Šä¸é¸å¥½æª”案,還是刪除兩邊檔案。 -Delete or overwrite files permanently -永久刪除或覆蓋檔案 -Delete permanently -永久刪除 -Deleting Symbolic Link %x -æ£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x -Deleting file %x -æ£åœ¨åˆªé™¤æª”案 %x -Deleting folder %x -æ£åœ¨åˆªé™¤è³‡æ–™å¤¾ %x -Deletion handling -åˆªé™¤è™•ç† -Description -æè¿° -Direct -直接 -Directories are dependent! Be careful when setting up synchronization rules: -目錄有ä¾é 性ï¼è«‹å°å¿ƒè¨å®šåŒæ¥è¦å‰‡ï¼š -Directories to watch -è¦ç›£çœ‹çš„目錄 -Directory -目錄 -Directory does not exist: -目錄ä¸å˜åœ¨ï¼š -Do not show this dialog again -ä¸è¦å†é¡¯ç¤ºæ¤å°è©±æ¡† -Do nothing -ç¶æŒåŽŸç‹€ -Do you really want to delete the following object(s)? -真的è¦åˆªé™¤ä»¥ä¸‹ç‰©ä»¶å—Žï¼Ÿ -Do you really want to move the following object(s) to the Recycle Bin? -真的è¦å°‡ä¸‹åˆ—物件移動到資æºå›žæ”¶ç’嗎? -Do you want FreeFileSync to automatically check for updates every week? -è¦æ¯é€±è‡ªå‹•æª¢æŸ¥æ›´æ–° FreeFileSync 嗎? -Donate with PayPal -使用 PayPal æè´ˆ -Download now? -è¦ç«‹å³ä¸‹è¼‰å—Žï¼Ÿ -Drag && drop -拖放 -Elements found: -尋找è¦ç´ : -Elements processed: -已處ç†è¦ç´ : -Elements remaining: -剩餘è¦ç´ : -Email -ä¿¡ç®± -Encoding extended time information: %x -編碼延長時間資訊:%x -Endless loop when traversing directory: -當éæ·ç›®éŒ„時無é™å¾ªç’°ï¼š -Equal files/folders that differ in attributes only -åŒç‰æª”案/資料夾åªåœ¨æ–¼å±¬æ€§ä¸åŒ -Error -錯誤 -Error changing modification time: -變更修改時間錯誤: -Error copying file permissions: -複製檔案權é™éŒ¯èª¤ï¼š -Error copying file: -複製檔案錯誤: -Error copying locked file %x! -複製已鎖定檔案錯誤 %xï¼ -Error copying symbolic link: -複製符號連çµéŒ¯èª¤ï¼š -Error creating directory: -新建目錄錯誤: -Error deleting directory: -刪除目錄錯誤: -Error deleting file: -刪除檔案錯誤: -Error handling -éŒ¯èª¤è™•ç† -Error loading library function: -載入函數庫錯誤: -Error moving directory: -移動目錄錯誤: -Error moving file: -移動檔案錯誤: -Error moving to Recycle Bin: -移動到資æºå›žæ”¶ç’錯誤: -Error opening file: -開啟檔案錯誤: -Error parsing configuration file: -分æžé…置檔案錯誤: -Error reading file attributes: -讀å–檔案屬性錯誤: -Error reading file: -讀å–檔案錯誤: -Error reading from synchronization database: -讀å–åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š -Error reading security context: -讀å–安全內文錯誤: -Error resolving symbolic link: -解决符號連çµéŒ¯èª¤ï¼š -Error setting directory lock: -è¨å®šç›®éŒ„鎖錯誤: -Error setting privilege: -è¨å®šæ¬Šé™éŒ¯èª¤ï¼š -Error starting Volume Shadow Copy Service! -å•Ÿå‹•å·å½±è¤‡è£½æœå‹™éŒ¯èª¤ï¼ -Error traversing directory: -éæ·ç›®éŒ„錯誤: -Error when monitoring directories. -監測目錄錯誤。 -Error writing file: -寫入檔案錯誤: -Error writing security context: -寫入安全性內容錯誤: -Error writing to synchronization database: -寫入åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š -Example -例如 -Exclude -排除 -Exclude all rows -排除所有行 -Exclude temporarily -暫時排除 -Exclude via filter: -使用篩é¸å™¨æŽ’除: -Exit instantly -ç«‹å³é€€å‡º -Extension -擴展 -External applications -å¤–éƒ¨æ‡‰ç”¨ç¨‹å¼ -Fatal Error -åš´é‡éŒ¯èª¤ -Feedback and suggestions are welcome at: -æ¡è¿Žåœ¨ä¸‹é¢æå‡ºå›žå ±å’Œå»ºè°ï¼š -File %x has an invalid date! -檔案 %x çš„æ—¥æœŸç„¡æ•ˆï¼ -File already exists. Overwrite? -檔案已å˜åœ¨ï¼Œè¦è¦†è“‹å—Žï¼Ÿ -File content -檔案内容 -File does not exist: -檔案ä¸å˜åœ¨ï¼š -File list exported! -æª”æ¡ˆæ¸…å–®å·²åŒ¯å‡ºï¼ -File size and date -檔案大å°å’Œæ—¥æœŸ -Filename -檔案å稱 -Files %x have the same date but a different size! -檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼ -Files are found equal if\n - file content\nis the same -如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…ç›¸åŒ -Files are found equal if\n - filesize\n - last write time and date\nare the same -如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…ç›¸åŒ -Files that are equal on both sides -兩邊相åŒçš„檔案 -Files that exist on both sides, left one is newer -檔案å˜åœ¨æ–¼å…©é‚Šï¼Œå·¦é‚Šæª”案較新 -Files that exist on both sides, right one is newer -檔案å˜åœ¨æ–¼å…©é‚Šï¼Œå³é‚Šæª”案較新 -Files that have different content -具有ä¸åŒå…§å®¹çš„檔案 -Files/folders that exist on left side only -åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾 -Files/folders that exist on right side only -åªå˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾 -Filter files -篩é¸æª”案 -Filter is active -篩é¸å™¨ç‚ºå•Ÿå‹• -Filter settings have changed! -篩é¸å™¨è¨å®šå·²æ›´æ”¹ï¼ -Filter: All pairs -篩é¸å™¨ï¼šæ‰€æœ‰å° -Filter: Single pair -篩é¸å™¨ï¼šå–®å° -Find -尋找 -Find what: -尋找內容: -Folder Comparison and Synchronization -資料夾比å°å’ŒåŒæ¥ -Folder pairs -è³‡æ–™å¤¾å° -Follow -跟隨 -Free disk space available: -å¯ç”¨ç£ç¢Ÿç©ºé–“: -Free disk space required: -所需è¦çš„å¯ç”¨ç£ç¢Ÿç©ºé–“: -FreeFileSync Batch Job -FreeFileSync 批次處ç†ä½œæ¥ -FreeFileSync at Sourceforge -FreeFileSync 在 Sourceforge -FreeFileSync batch file -FreeFileSync 批次檔 -FreeFileSync configuration -FreeFileSync é…ç½® -FreeFileSync is up to date! -FreeFileSync å·²ç¶“æ˜¯æœ€æ–°ç‰ˆæœ¬ï¼ -Full path -完整路徑 -Generating database... -產生資料庫... -Generating file list... -產生檔案清單... -Global settings -æ•´é«”è¨å®š -Help -說明 -Hidden dialogs: -éš±è—å°è©±æ¡†ï¼š -Hide all error and warning messages -éš±è—所有錯誤和è¦å‘Šè¨Šæ¯ -Hide conflicts -éš±è—è¡çª -Hide excluded items -éš±è—è¢«æŽ’é™¤çš„é …ç›® -Hide files that are different -éš±è—ä¸åŒçš„檔案 -Hide files that are equal -éš±è—相åŒçš„檔案 -Hide files that are newer on left -éš±è—左邊較新的檔案 -Hide files that are newer on right -éš±è—å³é‚Šè¼ƒæ–°çš„檔案 -Hide files that exist on left side only -éš±è—åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案 -Hide files that exist on right side only -éš±è—åªå˜åœ¨æ–¼å³é‚Šçš„檔案 -Hide files that will be created on the left side -éš±è—左邊將被新建的檔案 -Hide files that will be created on the right side -éš±è—å³é‚Šå°‡è¢«æ–°å»ºçš„檔案 -Hide files that will be deleted on the left side -éš±è—左邊將被刪除的檔案 -Hide files that will be deleted on the right side -éš±è—å³é‚Šå°‡è¢«åˆªé™¤çš„檔案 -Hide files that will be overwritten on left side -éš±è—左邊將被覆蓋的檔案 -Hide files that will be overwritten on right side -éš±è—å³é‚Šå°‡è¢«è¦†è“‹çš„檔案 -Hide files that won't be copied -éš±è—å°‡ä¸æœƒè¢«è¤‡è£½çš„檔案 -Hide filtered or temporarily excluded files -éš±è—篩é¸æˆ–暫時被排除的檔案 -Hide further error messages during the current process -在目å‰é€²ç¨‹ä¸éš±è—進一æ¥çš„éŒ¯èª¤è¨Šæ¯ -Hints: -æ示: -Homepage -首é -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -å°å…©é‚Šä½¿ç”¨åŒä¸€å€‹è³‡æ–™åº«çš„è˜åˆ¥å’Œå‚³é€æ›´æ”¹ã€‚自動檢測刪除和è¡çªéƒ¨ä»½ã€‚ -Idle time between detection of last change and execution of command line in seconds -上次更改的檢測和執行命令列之間以秒為單ä½çš„閒置時間 -If you like FFS -å¦‚æžœä½ å–œæ¡ FFS -Ignore -忽略 -Ignore errors -忽略錯誤 -Ignore subsequent errors -忽略後續錯誤 -Include -包括 -Include all rows -包括所有行 -Include temporarily -暫時包括 -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -包括:*.doc;*.zip;*.exe\n排除\\stuff\\temp\\* -Incompatible synchronization database format: -åŒæ¥è³‡æ–™åº«æ ¼å¼ä¸ç›¸å®¹ï¼š -Info -è¨Šæ¯ -Information -è¨Šæ¯ -Initial synchronization: -åˆå§‹åŒ–åŒæ¥ï¼š -Integrate external applications into context menu. The following macros are available: -æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集: -Invalid FreeFileSync config file! -無效的 FreeFileSync é…ç½®æª”æ¡ˆï¼ -Last used configurations (press DEL to remove from list) -上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…å–®ä¸ç§»é™¤) -Leave as unresolved conflict -ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª -Left -左邊 -Legend -圖例 -Load configuration from file -從檔案載入é…ç½® -Log-messages: -日誌訊æ¯ï¼š -Logging -日誌記錄 -Main bar -ä¸»æ¬„ä½ -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚ -Match case -å€åˆ†å¤§å°å¯« -Maximum number of logfiles: -日誌檔的最大數目: -Memory allocation failed! -記憶體分é…å¤±æ•—ï¼ -Minimum Idle Time [seconds] -最å°é–’置時間 [秒] -Mirror ->> -é¡åƒ ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -é¡åƒå‚™ä»½çš„左邊的資料夾。åŒæ¥å¾Œï¼Œå³é‚Šçš„資料夾進行修改以完全相é…左邊的資料夾。 -Monitoring active... -監測活動... -More than 50% of the total number of files will be copied or deleted! -超éŽç¸½æ•¸ 50% ä»¥ä¸Šçš„æª”æ¡ˆå°‡è¢«è¤‡è£½æˆ–åˆªé™¤ï¼ -Move column down -下移一行 -Move column up -上移一行 -Move files into a time-stamped subdirectory -移動檔案到一個時間標記的å目錄 -Moving %x to Recycle Bin -æ£åœ¨ç§»å‹• %x 到資æºå›žæ”¶ç’ -Moving Symbolic Link %x to user-defined directory %y -æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到自定義目錄 %y -Moving file %x to user-defined directory %y -æ£åœ¨ç§»å‹•æª”案 %x 到自定義目錄 %y -Moving folder %x to user-defined directory %y -æ£åœ¨ç§»å‹•è³‡æ–™å¤¾ %x 到自定義目錄 %y -Multiple... -多個... -No change since last synchronization! -自上次åŒæ¥ä»¥ä¾†éƒ½æ²’æœ‰è®Šæ›´ï¼ -No filter selected -沒有é¸æ“‡ç¯©é¸å™¨ -Not enough free disk space available in: -æ²’æœ‰è¶³å¤ çš„å¯ç”¨ç©ºé–“: -Nothing to synchronize according to configuration! -æ ¹æ“šé…置没有任何åŒæ¥ï¼ -Number of files and directories that will be created -一些檔案和目錄將被新建 -Number of files and directories that will be deleted -一些檔案和目錄將被刪除 -Number of files that will be overwritten -一些檔案和目錄將被覆蓋 -One of the FreeFileSync database entries within the following file is not yet existing: -以下資料庫æ¢ç›®çš„å…¶ä¸ä¸€å€‹ FreeFileSync 檔案ä¸å˜åœ¨ï¼š -One of the FreeFileSync database files is not yet existing: -å…¶ä¸ä¸€å€‹ FreeFileSync 資料庫檔案ä¸å˜åœ¨ï¼š -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -åªæœ‰è¢«é¸ä¸ç¯©é¸çš„檔案/目錄會進行åŒæ¥ã€‚篩é¸å™¨å°‡å¥—用到基本åŒæ¥ç›®éŒ„的相å°å稱。 -Open with Explorer -使用檔案總管開啟 -Open with default application -使用é è¨çš„應用程å¼é–‹å•Ÿ -Operation aborted! -ä¸æ¢æ“ä½œï¼ -Operation: -æ“作: -Overview -æ‘˜è¦ -Overwriting Symbolic Link %x in %y -è¦†è“‹ç¬¦è™Ÿé€£çµ %x 在 %y -Overwriting file %x in %y -覆蓋檔案 %x 在 %y -Pause -æš«åœ -Paused -å·²æš«åœ -Planned directory deletion is in conflict with its subdirectories and -files! -計劃è¦åˆªé™¤çš„目錄與其å目錄和檔案是è¡çªçš„ï¼ -Please run a Compare first before synchronizing! -請執行åŒæ¥å‰å…ˆæ¯”å°ï¼ -Press \"Switch\" to open FreeFileSync GUI mode. -按下 \"切æ›\" é–‹å•Ÿ FreeFileSync 圖形介é¢æ“作方å¼ã€‚ -Processing folder pair: -處ç†ä¸€å°è³‡æ–™å¤¾ï¼š -Published under the GNU General Public License: -在GNU通用公共許å¯è‰ä¸‹ç™¼ä½ˆï¼š -Question -å•é¡Œ -RealtimeSync - Automated Synchronization -å³æ™‚åŒæ¥ - 自動åŒæ¥ -RealtimeSync configuration -å³æ™‚åŒæ¥é…ç½® -Recycle Bin not yet supported for this system! -資æºå›žæ”¶ç’尚未支æ´æ¤ç³»çµ±ï¼ -Relative path -相å°è·¯å¾‘ -Remove alternate settings -移除備用è¨å®š -Remove folder -移除資料夾 -Remove folder pair -移除一å°è³‡æ–™å¤¾ -Report translation error -å›žå ±ç¿»è¯éŒ¯èª¤ -Reset -é‡ç½® -Reset view -é‡ç½®æª¢è¦– -Restore all hidden dialogs? -è¦é‚„原全部隱è—çš„å°è©±æ¡†å—Žï¼Ÿ -Right -å³é‚Š -S&ave configuration... -儲å˜é…ç½®(&A)... -S&witch view -切æ›æª¢è¦–(&W) -Save changes to current configuration? -儲å˜å°ç›®å‰é…置的更改嗎? -Save current configuration to file -將目å‰é…置儲å˜åˆ°æª”案 -Scanning... -æ£åœ¨æŽƒçž„... -Scanning: -掃瞄ä¸ï¼š -Select a folder -é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾ -Select alternate synchronization settings -é¸æ“‡å‚™ç”¨åŒæ¥è¨å®š -Select logfile directory: -é¸æ“‡æ—¥èªŒæª”目錄: -Select variant: -é¸æ“‡è®Šæ•¸ï¼š -Select view -é¸æ“‡æª¢è¦– -Set direction: -è¨å®šæ–¹å‘: -Setting default synchronization directions: Old files will be overwritten with newer files. -è¨å®šé è¨åŒæ¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。 -Show \"%x\" -顯示 \"%x\" -Show conflicts -顯示è¡çª -Show files that are different -顯示ä¸åŒçš„檔案 -Show files that are equal -顯示相åŒçš„檔案 -Show files that are newer on left -顯示左邊較新的檔案 -Show files that are newer on right -顯示å³é‚Šè¼ƒæ–°çš„檔案 -Show files that exist on left side only -顯示åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案 -Show files that exist on right side only -顯示åªå˜åœ¨æ–¼å³é‚Šçš„檔案 -Show files that will be created on the left side -顯示左邊將被新建的檔案 -Show files that will be created on the right side -顯示å³é‚Šå°‡è¢«æ–°å»ºçš„檔案 -Show files that will be deleted on the left side -顯示左邊將被刪除的檔案 -Show files that will be deleted on the right side -顯示å³é‚Šå°‡è¢«åˆªé™¤çš„檔案 -Show files that will be overwritten on left side -顯示左邊將被覆蓋的檔案 -Show files that will be overwritten on right side -顯示å³é‚Šå°‡è¢«è¦†è“‹çš„檔案 -Show files that won't be copied -顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案 -Show hidden dialogs -顯示隱è—çš„å°è©±æ¡† -Show popup -顯示彈出視窗 -Show popup on errors or warnings -在彈出視窗上顯示錯誤或è¦å‘Šè¨Šæ¯ -Significant difference detected: -檢測到顯著的差異: -Silent mode -éœéŸ³æ¨¡å¼ -Size -å¤§å° -Source code written completely in C++ utilizing: -原始碼完全使用C++編寫: -Source directory does not exist anymore: -來æºç›®éŒ„ä¸å˜åœ¨ï¼š -Speed: -速度: -Start -開始 -Start minimized and write status information to a logfile -啟動最å°åŒ–和寫入狀態資訊到日誌檔 -Start synchronization -開始åŒæ¥ -Statistics -統計 -Status feedback -ç‹€æ…‹å›žå ± -Stop -åœæ¢ -Swap sides -å…©é‚Šäº¤æ› -Switching to FreeFileSync GUI mode... -åˆ‡æ› FreeFileSync 圖形介é¢æ“作方å¼... -Symbolic Link handling -符號連çµè™•ç† -Symlinks %x have the same date but a different target! -ç¬¦è™Ÿé€£çµ %x 有相åŒæ—¥æœŸä½†æ˜¯ä¸åŒç›®æ¨™ï¼ -Synchronization Preview -åŒæ¥é 覽 -Synchronization aborted! -åŒæ¥å·²ä¸æ¢ï¼ -Synchronization completed successfully! -å·²æˆåŠŸçš„完æˆåŒæ¥! -Synchronization completed with errors! -åŒæ¥å®Œæˆä½†æœ‰éŒ¯èª¤ï¼ -Synchronization settings -åŒæ¥è¨å®š -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -åŒæ¥æ‰€æœ‰ .doc, .zip å’Œ .exe 檔案,除了\"temp\"ä¸çš„一切。 -Synchronize... -åŒæ¥... -Synchronizing... -æ£åœ¨åŒæ¥... -Target directory already existing! -目標目錄已å˜åœ¨ï¼ -Target file already existing! -目標檔案已å˜åœ¨ï¼ -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -命令列æ¯æ¬¡åŸ·è¡Œï¼š\n- å¯ç”¨çš„目錄(例如æ’å…¥USB隨身碟)\n- 檔案在這些目錄或å目錄會被修改 -The file does not contain a valid configuration: -該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置: -The file was not processed by last synchronization! -上次åŒæ¥æ™‚該檔案未被處ç†ï¼ -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -æ¤è®Šæ•¸è¨ˆç®—çµæžœç‚ºå…©å€‹æª”å相åŒçš„檔案,åªæœ‰ç•¶ä»–們的檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ—¥æœŸæ™‚間也相åŒï¼Œæ‰æœƒåˆ¤æ–·ä»–們是相åŒçš„檔案。 -Time -時間 -Time elapsed: -經éŽæ™‚間: -Time remaining: -剩餘時間: -Total amount of data that will be transferred -å°‡è¦å‚³è¼¸çš„å…¨éƒ¨è³‡æ–™é‡ -Total time: -全部時間: -Transfer file and directory permissions\n(Requires Administrator rights) -傳輸檔案和目錄權é™\n(需è¦ç®¡ç†å“¡æ¬Šé™) -Unable to connect to sourceforge.net! -無法連接到 sourceforge.netï¼ -Unable to create logfile! -ç„¡æ³•æ–°å»ºæ—¥èªŒæª”ï¼ -Unresolved conflicts existing! -å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼ -Update -> -æ›´æ–° -> -Updating attributes of %x -æ›´æ–° %x 個的屬性 -Usage: -使用é‡ï¼š -Use Recycle Bin -使用資æºå›žæ”¶ç’ -Use Recycle Bin when deleting or overwriting files -當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’ -User-defined directory for deletion was not specified! -未指定è¦åˆªé™¤çš„è‡ªå®šç¾©ç›®éŒ„ï¼ -Variant -變數 -Verifying file %x -é©—è‰æª” %x -Versioning -版本控制 -Volume name %x not part of filename %y! -å·å %x 並éžæª”å %y çš„ä¸€éƒ¨ä»½ï¼ -Waiting for missing directories... -ç‰å¾…缺少的目錄... -Waiting while directory is locked (%x)... -ç‰å¾…目錄被鎖定(%x)... -Warning -è¦å‘Š -When the comparison is started with this option set the following decision tree is processed: -當比å°é–‹å§‹ï¼Œä½¿ç”¨æ¤é¸é …è¨å®šæ™‚,以下決ç–樹將被處ç†ï¼š -You can ignore conflicts and continue synchronization. -ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ¥ã€‚ -You can ignore this error to consider the directory as empty. -您å¯ä»¥å¿½ç•¥æ¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。 -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼ -different -ä¸åŒ -file exists on both sides -檔案在兩邊å‡å·²å˜åœ¨ -on one side only -åªæœ‰ä¸€é‚Š +<source>Show in Explorer</source> +<target>在資æºç®¡ç†å™¨ä¸é¡¯ç¤º</target> +<source>Open with default application</source> +<target>使用é è¨çš„應用程å¼é–‹å•Ÿ</target> +<source>Browse directory</source> +<target>ç€è¦½ç›®éŒ„</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>å³æ™‚åŒæ¥ - 自動åŒæ¥</target> +<source>Browse</source> +<target>ç€è¦½</target> +<source>Error resolving symbolic link:</source> +<target>解决符號連çµéŒ¯èª¤ï¼š</target> +<source>Select alternate synchronization settings</source> +<target>é¸æ“‡å‚™ç”¨åŒæ¥è¨å®š</target> +<source>No filter selected</source> +<target>沒有é¸æ“‡ç¯©é¸å™¨</target> +<source>Filter is active</source> +<target>篩é¸å™¨ç‚ºå•Ÿå‹•</target> +<source>Clear filter settings</source> +<target>清除篩é¸å™¨è¨å®š</target> +<source>Remove alternate settings</source> +<target>移除備用è¨å®š</target> +<source>Create a batch job</source> +<target>新建一個批次處ç†ä½œæ¥</target> +<source>Synchronization settings</source> +<target>åŒæ¥è¨å®š</target> +<source>Comparison settings</source> +<target>比å°è¨å®š</target> +<source>About</source> +<target>關於</target> +<source>Error</source> +<target>錯誤</target> +<source>Warning</source> +<target>è¦å‘Š</target> +<source>Question</source> +<target>å•é¡Œ</target> +<source>Confirm</source> +<target>確èª</target> +<source>Configure filter</source> +<target>é…置篩é¸</target> +<source>Customize columns</source> +<target>自訂列</target> +<source>Global settings</source> +<target>æ•´é«”è¨å®š</target> +<source>Synchronization Preview</source> +<target>åŒæ¥é 覽</target> +<source>Find</source> +<target>尋找</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x ä½å…ƒçµ„</pluralform> +</target> +<source><Symlink></source> +<target><符號連çµ></target> +<source><Directory></source> +<target><目錄></target> +<source>Size</source> +<target>大å°</target> +<source>Date</source> +<target>日期</target> +<source>Full path</source> +<target>完整路徑</target> +<source>Filename</source> +<target>檔案å稱</target> +<source>Relative path</source> +<target>相å°è·¯å¾‘</target> +<source>Directory</source> +<target>目錄</target> +<source>Extension</source> +<target>擴展</target> +<source>Comparison Result</source> +<target>比å°çµæžœ</target> +<source>Incompatible synchronization database format:</source> +<target>åŒæ¥è³‡æ–™åº«æ ¼å¼ä¸ç›¸å®¹ï¼š</target> +<source>Initial synchronization:</source> +<target>åˆå§‹åŒ–åŒæ¥ï¼š</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>å…¶ä¸ä¸€å€‹ FreeFileSync 資料庫檔案ä¸å˜åœ¨ï¼š</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>以下資料庫æ¢ç›®çš„å…¶ä¸ä¸€å€‹ FreeFileSync 檔案ä¸å˜åœ¨ï¼š</target> +<source>Error reading from synchronization database:</source> +<target>讀å–åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target> +<source>An exception occurred!</source> +<target>發生異常ï¼</target> +<source>Error deleting file:</source> +<target>刪除檔案錯誤:</target> +<source>Error reading file attributes:</source> +<target>讀å–檔案屬性錯誤:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>ç‰å¾…目錄被鎖定(%x)...</target> +<source>Error setting directory lock:</source> +<target>è¨å®šç›®éŒ„鎖錯誤:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x 秒</pluralform> +</target> +<source>Info</source> +<target>訊æ¯</target> +<source>Fatal Error</source> +<target>åš´é‡éŒ¯èª¤</target> +<source>Invalid FreeFileSync config file!</source> +<target>無效的 FreeFileSync é…置檔案ï¼</target> +<source>File does not exist:</source> +<target>檔案ä¸å˜åœ¨ï¼š</target> +<source>Error parsing configuration file:</source> +<target>分æžé…置檔案錯誤:</target> +<source>Error writing file:</source> +<target>寫入檔案錯誤:</target> +<source>/sec</source> +<target>/秒</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x 分</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x 時</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x 天</pluralform> +</target> +<source>S&ave configuration...</source> +<target>儲å˜é…ç½®(&A)...</target> +<source>&Load configuration...</source> +<target>載入é…ç½®(&L)...</target> +<source>&Quit</source> +<target>離開(&Q)</target> +<source>&File</source> +<target>檔案(&F)</target> +<source>&Content</source> +<target>內容</target> +<source>&About...</source> +<target>關於(&A)...</target> +<source>&Help</source> +<target>說明(&H)</target> +<source>Usage:</source> +<target>使用é‡ï¼š</target> +<source>1. Select directories to monitor.</source> +<target>1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。</target> +<source>2. Enter a command line.</source> +<target>2. 輸入命令列。</target> +<source>3. Press 'Start'.</source> +<target>3. 按下 '開始'。</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +命令列æ¯æ¬¡åŸ·è¡Œï¼š +- å¯ç”¨çš„目錄(例如æ’å…¥USB隨身碟) +- 檔案在這些目錄或å目錄會被修改 +</target> +<source>Directories to watch</source> +<target>è¦ç›£çœ‹çš„目錄</target> +<source>Add folder</source> +<target>新增資料夾</target> +<source>Remove folder</source> +<target>移除資料夾</target> +<source>Select a folder</source> +<target>é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾</target> +<source>Command line</source> +<target>命令列</target> +<source>Minimum Idle Time [seconds]</source> +<target>最å°é–’置時間 [秒]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>上次更改的檢測和執行命令列之間以秒為單ä½çš„閒置時間</target> +<source>Start</source> +<target>開始</target> +<source>(Build: %x)</source> +<target>(建立:%x)</target> +<source>RealtimeSync configuration</source> +<target>å³æ™‚åŒæ¥é…ç½®</target> +<source>File already exists. Overwrite?</source> +<target>檔案已å˜åœ¨ï¼Œè¦è¦†è“‹å—Žï¼Ÿ</target> +<source>&Restore</source> +<target>回復(&R)</target> +<source>&Exit</source> +<target>çµæŸ(&E)</target> +<source>Monitoring active...</source> +<target>監測活動...</target> +<source>Waiting for missing directories...</source> +<target>ç‰å¾…缺少的目錄...</target> +<source>Command line is empty!</source> +<target>命令列是空的ï¼</target> +<source>Could not initialize directory monitoring:</source> +<target>無法åˆå§‹åŒ–目錄監測:</target> +<source>A directory input field is empty.</source> +<target>目錄輸入的欄ä½ç‚ºç©º</target> +<source>Error when monitoring directories.</source> +<target>監測目錄錯誤。</target> +<source>Drag && drop</source> +<target>拖放</target> +<source>Conversion error:</source> +<target>轉æ›éŒ¯èª¤ï¼š</target> +<source>Error moving file:</source> +<target>移動檔案錯誤:</target> +<source>Operation aborted!</source> +<target>ä¸æ¢æ“作ï¼</target> +<source>Target file already existing!</source> +<target>目標檔案已å˜åœ¨ï¼</target> +<source>Error moving directory:</source> +<target>移動目錄錯誤:</target> +<source>Target directory already existing!</source> +<target>目標目錄已å˜åœ¨ï¼</target> +<source>Error deleting directory:</source> +<target>刪除目錄錯誤:</target> +<source>Error changing modification time:</source> +<target>變更修改時間錯誤:</target> +<source>Error loading library function:</source> +<target>載入函數庫錯誤:</target> +<source>Error reading security context:</source> +<target>讀å–安全內文錯誤:</target> +<source>Error writing security context:</source> +<target>寫入安全性內容錯誤:</target> +<source>Error copying file permissions:</source> +<target>複製檔案權é™éŒ¯èª¤ï¼š</target> +<source>Error creating directory:</source> +<target>新建目錄錯誤:</target> +<source>Error copying symbolic link:</source> +<target>複製符號連çµéŒ¯èª¤ï¼š</target> +<source>Error copying file:</source> +<target>複製檔案錯誤:</target> +<source>Error opening file:</source> +<target>開啟檔案錯誤:</target> +<source>Error reading file:</source> +<target>讀å–檔案錯誤:</target> +<source>Endless loop when traversing directory:</source> +<target>當éæ·ç›®éŒ„時無é™å¾ªç’°ï¼š</target> +<source>Error traversing directory:</source> +<target>éæ·ç›®éŒ„錯誤:</target> +<source>Error setting privilege:</source> +<target>è¨å®šæ¬Šé™éŒ¯èª¤ï¼š</target> +<source>Error moving to Recycle Bin:</source> +<target>移動到資æºå›žæ”¶ç’錯誤:</target> +<source>Could not load a required DLL:</source> +<target>無法載入一個所需的DLL:</target> +<source>Error writing to synchronization database:</source> +<target>寫入åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>å•Ÿå‹•å·å½±è¤‡è£½æœå‹™éŒ¯èª¤ï¼</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚</target> +<source>Could not determine volume name for file:</source> +<target>無法判斷æ¤æª”案的å·æ¨™å稱:</target> +<source>Volume name %x not part of filename %y!</source> +<target>å·å %x 並éžæª”å %y 的一部份ï¼</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>ç„¡æ³•è®€å– XML 之後節點的值:</target> +<source>Show popup</source> +<target>顯示彈出視窗</target> +<source>Show popup on errors or warnings</source> +<target>在彈出視窗上顯示錯誤或è¦å‘Šè¨Šæ¯</target> +<source>Ignore errors</source> +<target>忽略錯誤</target> +<source>Hide all error and warning messages</source> +<target>éš±è—所有錯誤和è¦å‘Šè¨Šæ¯</target> +<source>Exit instantly</source> +<target>ç«‹å³é€€å‡º</target> +<source>Abort synchronization immediately</source> +<target>ç«‹å³ä¸æ¢åŒæ¥</target> +<source>Logging</source> +<target>日誌記錄</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync 批次檔</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync é…ç½®</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync 批次處ç†ä½œæ¥</target> +<source>Unable to create logfile!</source> +<target>無法新建日誌檔ï¼</target> +<source>Batch execution</source> +<target>批次處ç†åŸ·è¡Œ</target> +<source>Log-messages:</source> +<target>日誌訊æ¯ï¼š</target> +<source>Stop</source> +<target>åœæ¢</target> +<source>Total time:</source> +<target>全部時間:</target> +<source>Synchronization aborted!</source> +<target>åŒæ¥å·²ä¸æ¢ï¼</target> +<source>Synchronization completed with errors!</source> +<target>åŒæ¥å®Œæˆä½†æœ‰éŒ¯èª¤ï¼</target> +<source>Synchronization completed successfully!</source> +<target>å·²æˆåŠŸçš„完æˆåŒæ¥ï¼</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>按下 "切æ›" é–‹å•Ÿ FreeFileSync 圖形介é¢æ“作方å¼ã€‚</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>åˆ‡æ› FreeFileSync 圖形介é¢æ“作方å¼...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>無法連接到 sourceforge.netï¼</target> +<source>A newer version of FreeFileSync is available:</source> +<target>有較新版本的 FreeFileSync å¯ç”¨ï¼š</target> +<source>Download now?</source> +<target>è¦ç«‹å³ä¸‹è¼‰å—Žï¼Ÿ</target> +<source>Information</source> +<target>訊æ¯</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync 已經是最新版本ï¼</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>è¦æ¯é€±è‡ªå‹•æª¢æŸ¥æ›´æ–° FreeFileSync 嗎?</target> +<source>(Requires an Internet connection!)</source> +<target>(需è¦é€£æŽ¥åˆ°ç¶²éš›ç¶²è·¯ï¼)</target> +<source>1. &Compare</source> +<target>1. 比å°(&C)</target> +<source>2. &Synchronize...</source> +<target>2. åŒæ¥(&S)...</target> +<source>S&witch view</source> +<target>切æ›æª¢è¦–(&W)</target> +<source>&New</source> +<target>新增專案(&N)</target> +<source>&Program</source> +<target>程å¼(&P)</target> +<source>&Language</source> +<target>語言(&L)</target> +<source>&Global settings...</source> +<target>æ•´é«”è¨å®š(&G)...</target> +<source>&Create batch job...</source> +<target>新建批次處ç†ä½œæ¥(&C)...</target> +<source>&Export file list...</source> +<target>匯出檔案清單(&E)...</target> +<source>&Advanced</source> +<target>進階(&A)</target> +<source>&Check for new version</source> +<target>檢查更新(&C)</target> +<source>Compare</source> +<target>比å°</target> +<source>Compare both sides</source> +<target>比å°å…©é‚Š</target> +<source>&Abort</source> +<target>å–消(&A)</target> +<source>Synchronize...</source> +<target>åŒæ¥...</target> +<source>Start synchronization</source> +<target>開始åŒæ¥</target> +<source>Swap sides</source> +<target>兩邊交æ›</target> +<source>Add folder pair</source> +<target>新增一å°è³‡æ–™å¤¾</target> +<source>Remove folder pair</source> +<target>移除一å°è³‡æ–™å¤¾</target> +<source>Save current configuration to file</source> +<target>將目å‰é…置儲å˜åˆ°æª”案</target> +<source>Load configuration from file</source> +<target>從檔案載入é…ç½®</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…å–®ä¸ç§»é™¤)</target> +<source>Hide excluded items</source> +<target>éš±è—è¢«æŽ’é™¤çš„é …ç›®</target> +<source>Hide filtered or temporarily excluded files</source> +<target>éš±è—篩é¸æˆ–暫時被排除的檔案</target> +<source>Number of files and directories that will be created</source> +<target>一些檔案和目錄將被新建</target> +<source>Number of files that will be overwritten</source> +<target>一些檔案和目錄將被覆蓋</target> +<source>Number of files and directories that will be deleted</source> +<target>一些檔案和目錄將被刪除</target> +<source>Total amount of data that will be transferred</source> +<target>å°‡è¦å‚³è¼¸çš„全部資料é‡</target> +<source>Left</source> +<target>左邊</target> +<source>Right</source> +<target>å³é‚Š</target> +<source>Batch job</source> +<target>批次處ç†ä½œæ¥</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>組åˆä¸€å€‹ç”¨æ–¼è‡ªå‹•åŒæ¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼ï¼Œåªéœ€ç°¡å–®çš„將批次檔å傳é€ç»™ FreeFileSync å¯åŸ·è¡Œæª”:FreeFileSync.exe <batchfile>。這個也å¯ä»¥å®‰æŽ’åœ¨ä½ çš„ä½œæ¥ç³»çµ±çš„計畫任務ä¸ã€‚</target> +<source>Help</source> +<target>說明</target> +<source>Configuration overview:</source> +<target>é…置概述:</target> +<source>Filter files</source> +<target>篩é¸æª”案</target> +<source>Status feedback</source> +<target>ç‹€æ…‹å›žå ±</target> +<source>Silent mode</source> +<target>éœéŸ³æ¨¡å¼</target> +<source>Start minimized and write status information to a logfile</source> +<target>啟動最å°åŒ–和寫入狀態資訊到日誌檔</target> +<source>Error handling</source> +<target>錯誤處ç†</target> +<source>Overview</source> +<target>摘è¦</target> +<source>Select logfile directory:</source> +<target>é¸æ“‡æ—¥èªŒæª”目錄:</target> +<source>Maximum number of logfiles:</source> +<target>日誌檔的最大數目:</target> +<source>&Save</source> +<target>儲å˜(&S)</target> +<source>&Load</source> +<target>載入(&L)</target> +<source>&Cancel</source> +<target>å–消(&C)</target> +<source>Elements found:</source> +<target>尋找è¦ç´ :</target> +<source>Elements remaining:</source> +<target>剩餘è¦ç´ :</target> +<source>Speed:</source> +<target>速度:</target> +<source>Time remaining:</source> +<target>剩餘時間:</target> +<source>Time elapsed:</source> +<target>經éŽæ™‚間:</target> +<source>Operation:</source> +<target>æ“作:</target> +<source>Select variant:</source> +<target>é¸æ“‡è®Šæ•¸ï¼š</target> +<source><Automatic></source> +<target><自動></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>å°å…©é‚Šä½¿ç”¨åŒä¸€å€‹è³‡æ–™åº«çš„è˜åˆ¥å’Œå‚³é€æ›´æ”¹ã€‚自動檢測刪除和è¡çªéƒ¨ä»½ã€‚</target> +<source>Mirror ->></source> +<target>é¡åƒ ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>é¡åƒå‚™ä»½çš„左邊的資料夾。åŒæ¥å¾Œï¼Œå³é‚Šçš„資料夾進行修改以完全相é…左邊的資料夾。</target> +<source>Update -></source> +<target>æ›´æ–° -></target> +<source>Copy new or updated files to right folder.</source> +<target>將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾ä¸ã€‚</target> +<source>Custom</source> +<target>自訂</target> +<source>Configure your own synchronization rules.</source> +<target>é…ç½®ä½ è‡ªå·±çš„åŒæ¥è¦å‰‡ã€‚</target> +<source>Deletion handling</source> +<target>刪除處ç†</target> +<source>&OK</source> +<target>確定(&O)</target> +<source>Configuration</source> +<target>é…ç½®</target> +<source>Category</source> +<target>分類</target> +<source>Action</source> +<target>動作</target> +<source>Files/folders that exist on left side only</source> +<target>åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target> +<source>Files/folders that exist on right side only</source> +<target>åªå˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target> +<source>Files that exist on both sides, left one is newer</source> +<target>檔案å˜åœ¨æ–¼å…©é‚Šï¼Œå·¦é‚Šæª”案較新</target> +<source>Files that exist on both sides, right one is newer</source> +<target>檔案å˜åœ¨æ–¼å…©é‚Šï¼Œå³é‚Šæª”案較新</target> +<source>Files that have different content</source> +<target>具有ä¸åŒå…§å®¹çš„檔案</target> +<source>Conflicts/files that cannot be categorized</source> +<target>è¡çª/檔案ä¸èƒ½è¢«åˆ†é¡ž</target> +<source>Compare by...</source> +<target>比å°é¸é …...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> +<source>File size and date</source> +<target>檔案大å°å’Œæ—¥æœŸ</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> +<source>File content</source> +<target>檔案内容</target> +<source>Symbolic Link handling</source> +<target>符號連çµè™•ç†</target> +<source>Synchronizing...</source> +<target>æ£åœ¨åŒæ¥...</target> +<source>Elements processed:</source> +<target>已處ç†è¦ç´ :</target> +<source>&Pause</source> +<target>æš«åœ(&P)</target> +<source>Compare by "File size and date"</source> +<target>以檔案大å°å’Œæ—¥æœŸæ¯”å°</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>æ¤è®Šæ•¸è¨ˆç®—çµæžœç‚ºå…©å€‹æª”å相åŒçš„檔案,åªæœ‰ç•¶ä»–們的檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ—¥æœŸæ™‚間也相åŒï¼Œæ‰æœƒåˆ¤æ–·ä»–們是相åŒçš„檔案。</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>當比å°é–‹å§‹ï¼Œä½¿ç”¨æ¤é¸é …è¨å®šæ™‚,以下決ç–樹將被處ç†ï¼š</target> +<source>As a result the files are separated into the following categories:</source> +<target>çµæžœæ˜¯æª”案分為以下幾類:</target> +<source>- equal</source> +<target>- 相åŒ</target> +<source>- left newer</source> +<target>- 左邊較新</target> +<source>- right newer</source> +<target>- å³é‚Šè¼ƒæ–°</target> +<source>- exists left only</source> +<target>- åªå˜åœ¨æ–¼å·¦é‚Š</target> +<source>- exists right only</source> +<target>- åªå˜åœ¨æ–¼å³é‚Š</target> +<source>- conflict (same date, different size)</source> +<target>- è¡çª(相åŒæ—¥æœŸï¼Œä¸åŒå¤§å°)</target> +<source>Compare by "File content"</source> +<target>以檔案内容比å°</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +顧åæ€ç¾©ï¼Œå…©å€‹ç›¸åŒæª”å的檔案,åªæœ‰ç•¶ä»–們具有åŒæ¨£çš„内容時會被判斷是相åŒçš„。 +æ¤é¸é …å°æ–¼ä¸€è‡´æ€§æª¢æŸ¥æ¯”較有用,而ä¸æ˜¯å‚™ä»½æ“ä½œã€‚å› æ¤ï¼Œæª”案時間沒有列入考慮。 + +啟用æ¤é¸é …使決ç–樹較å°ï¼š +</target> +<source>- different</source> +<target>- ä¸åŒ</target> +<source>Source code written in C++ utilizing:</source> +<target>使用C++編寫的原始碼</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>éžå¸¸æ„Ÿè¬ FreeFileSync 當地語系化的工作人員:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>æ¡è¿Žåœ¨ä¸‹é¢æå‡ºå›žå ±å’Œå»ºè°ï¼š</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync 在 Sourceforge</target> +<source>Homepage</source> +<target>首é </target> +<source>If you like FFS</source> +<target>å¦‚æžœä½ å–œæ¡ FFS</target> +<source>Donate with PayPal</source> +<target>使用 PayPal æè´ˆ</target> +<source>Email</source> +<target>ä¿¡ç®±</target> +<source>Report translation error</source> +<target>å›žå ±ç¿»è¯éŒ¯èª¤</target> +<source>Published under the GNU General Public License:</source> +<target>在GNU通用公共許å¯è‰ä¸‹ç™¼ä½ˆï¼š</target> +<source>Ignore subsequent errors</source> +<target>忽略後續錯誤</target> +<source>Hide further error messages during the current process</source> +<target>在目å‰é€²ç¨‹ä¸éš±è—進一æ¥çš„錯誤訊æ¯</target> +<source>&Ignore</source> +<target>忽略(&I)</target> +<source>&Retry</source> +<target>é‡è©¦(&R)</target> +<source>Do not show this dialog again</source> +<target>ä¸è¦å†é¡¯ç¤ºæ¤å°è©±æ¡†</target> +<source>&Switch</source> +<target>切æ›</target> +<source>&Yes</source> +<target>是</target> +<source>&No</source> +<target>å¦</target> +<source>Delete on both sides</source> +<target>兩邊都刪除</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>å³ä½¿åªåœ¨ä¸€é‚Šä¸é¸å¥½æª”案,還是會刪除兩邊檔案。</target> +<source>Use Recycle Bin</source> +<target>使用資æºå›žæ”¶ç’</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +åªæœ‰è¢«é¸ä¸ç¯©é¸çš„檔案/目錄會進行åŒæ¥ã€‚ +注æ„:篩é¸å™¨å°‡å¥—用到基本åŒæ¥ç›®éŒ„的相å°å稱。 +</target> +<source>Hints:</source> +<target>æ示:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. 輸入相å°æª”案或目錄å稱,使用';'或空行分隔。</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. 使用è¬ç”¨å—元‘*’和‘?’。</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. 經由內容é¸å–®ç›´æŽ¥åœ¨ä¸»è¦ç¶²æ ¼æŽ’除檔案。</target> +<source>Example</source> +<target>例如</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +包括:*.doc; *.zip; *.exe +排除:\stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>åŒæ¥æ‰€æœ‰ .doc, .zip å’Œ .exe 檔案,除了"temp"å資料夾ä¸çš„所有檔案。</target> +<source>Include</source> +<target>包括</target> +<source>Exclude</source> +<target>排除</target> +<source>Select time span:</source> +<target>é¸æ“‡æ™‚間範åœï¼š</target> +<source>Minimum file size:</source> +<target>最å°æª”案大å°ï¼š</target> +<source>Maximum file size:</source> +<target>最大檔案大å°ï¼š</target> +<source>&Default</source> +<target>é è¨(&D)</target> +<source>Move column up</source> +<target>上移一行</target> +<source>Move column down</source> +<target>下移一行</target> +<source>Copy locked files</source> +<target>複製被鎖定的檔案</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +複製共用或鎖定檔案使用使用å·å½±è¤‡è£½æœå‹™ +(需è¦ç®¡ç†å“¡æ¬Šé™) +</target> +<source>Copy filesystem permissions</source> +<target>複製檔案系統權é™</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +å‚³è¼¸æª”æ¡ˆå’Œç›®éŒ„æ¬Šé™ +(需è¦ç®¡ç†å“¡æ¬Šé™) +</target> +<source>Hidden dialogs:</source> +<target>éš±è—å°è©±æ¡†ï¼š</target> +<source>Reset</source> +<target>é‡ç½®</target> +<source>Show hidden dialogs</source> +<target>顯示隱è—çš„å°è©±æ¡†</target> +<source>External applications</source> +<target>外部應用程å¼</target> +<source>Description</source> +<target>æè¿°</target> +<source>Variant</source> +<target>變數</target> +<source>Statistics</source> +<target>統計</target> +<source>Find what:</source> +<target>尋找內容:</target> +<source>Match case</source> +<target>å€åˆ†å¤§å°å¯«</target> +<source>&Find next</source> +<target>找下一個(&F)</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼</target> +<source>Batch file created successfully!</source> +<target>批次檔新建æˆåŠŸï¼</target> +<source>Main bar</source> +<target>主欄ä½</target> +<source>Folder pairs</source> +<target>資料夾å°</target> +<source>Select view</source> +<target>é¸æ“‡æª¢è¦–</target> +<source>Folder Comparison and Synchronization</source> +<target>資料夾比å°å’ŒåŒæ¥</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>資æºå›žæ”¶ç’尚未支æ´æ¤ç³»çµ±ï¼</target> +<source>Set direction:</source> +<target>è¨å®šæ–¹å‘:</target> +<source>Exclude temporarily</source> +<target>暫時排除</target> +<source>Include temporarily</source> +<target>暫時包括</target> +<source>Exclude via filter:</source> +<target>使用篩é¸å™¨æŽ’除:</target> +<source><multiple selection></source> +<target><多é‡é¸æ“‡></target> +<source>D-Click</source> +<target>點兩下</target> +<source>Copy to clipboard CTRL+C</source> +<target>複製到剪貼簿 CTRL+C</target> +<source>Delete files DEL</source> +<target>刪除檔案 DEL</target> +<source>Customize...</source> +<target>自訂...</target> +<source>Auto-adjust columns</source> +<target>自動調整欄寬</target> +<source>Include all rows</source> +<target>包括所有行</target> +<source>Exclude all rows</source> +<target>排除所有行</target> +<source>Reset view</source> +<target>é‡ç½®æª¢è¦–</target> +<source>Show "%x"</source> +<target>顯示 "%x"</target> +<source><Last session></source> +<target><最後連線></target> +<source>Configuration saved!</source> +<target>é…置已儲å˜ï¼</target> +<source>Save changes to current configuration?</source> +<target>è¦å„²å˜ç›®å‰é…置的更改嗎?</target> +<source>Configuration loaded!</source> +<target>已載入é…ç½®ï¼</target> +<source>Hide files that exist on left side only</source> +<target>éš±è—åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案</target> +<source>Show files that exist on left side only</source> +<target>顯示åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案</target> +<source>Hide files that exist on right side only</source> +<target>éš±è—åªå˜åœ¨æ–¼å³é‚Šçš„檔案</target> +<source>Show files that exist on right side only</source> +<target>顯示åªå˜åœ¨æ–¼å³é‚Šçš„檔案</target> +<source>Hide files that are newer on left</source> +<target>éš±è—左邊較新的檔案</target> +<source>Show files that are newer on left</source> +<target>顯示左邊較新的檔案</target> +<source>Hide files that are newer on right</source> +<target>éš±è—å³é‚Šè¼ƒæ–°çš„檔案</target> +<source>Show files that are newer on right</source> +<target>顯示å³é‚Šè¼ƒæ–°çš„檔案</target> +<source>Hide files that are equal</source> +<target>éš±è—相åŒçš„檔案</target> +<source>Show files that are equal</source> +<target>顯示相åŒçš„檔案</target> +<source>Hide files that are different</source> +<target>éš±è—ä¸åŒçš„檔案</target> +<source>Show files that are different</source> +<target>顯示ä¸åŒçš„檔案</target> +<source>Hide conflicts</source> +<target>éš±è—è¡çª</target> +<source>Show conflicts</source> +<target>顯示è¡çª</target> +<source>Hide files that will be created on the left side</source> +<target>éš±è—左邊將被新建的檔案</target> +<source>Show files that will be created on the left side</source> +<target>顯示左邊將被新建的檔案</target> +<source>Hide files that will be created on the right side</source> +<target>éš±è—å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target> +<source>Show files that will be created on the right side</source> +<target>顯示å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target> +<source>Hide files that will be deleted on the left side</source> +<target>éš±è—左邊將被刪除的檔案</target> +<source>Show files that will be deleted on the left side</source> +<target>顯示左邊將被刪除的檔案</target> +<source>Hide files that will be deleted on the right side</source> +<target>éš±è—å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target> +<source>Show files that will be deleted on the right side</source> +<target>顯示å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target> +<source>Hide files that will be overwritten on left side</source> +<target>éš±è—左邊將被覆蓋的檔案</target> +<source>Show files that will be overwritten on left side</source> +<target>顯示左邊將被覆蓋的檔案</target> +<source>Hide files that will be overwritten on right side</source> +<target>éš±è—å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target> +<source>Show files that will be overwritten on right side</source> +<target>顯示å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target> +<source>Hide files that won't be copied</source> +<target>éš±è—å°‡ä¸æœƒè¢«è¤‡è£½çš„檔案</target> +<source>Show files that won't be copied</source> +<target>顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案</target> +<source>All directories in sync!</source> +<target>åŒæ¥æ‰€æœ‰ç›®éŒ„ï¼</target> +<source>Please run a Compare first before synchronizing!</source> +<target>執行åŒæ¥å‰è«‹å…ˆæ¯”å°ï¼</target> +<source>Comma separated list</source> +<target>逗號分隔清單</target> +<source>Legend</source> +<target>圖例</target> +<source>File list exported!</source> +<target>檔案清單已匯出ï¼</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%x 物件已æˆåŠŸåˆªé™¤ï¼</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x 目錄</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x 檔案</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>顯示 %y 之 %x è¡Œ</pluralform> +</target> +<source>Scanning...</source> +<target>æ£åœ¨æŽƒçž„...</target> +<source>Comparing content...</source> +<target>æ£åœ¨æ¯”å°æª”案内容...</target> +<source>Paused</source> +<target>已暫åœ</target> +<source>Aborted</source> +<target>å·²ä¸æ¢</target> +<source>Completed</source> +<target>完æˆ</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>ä¸æ¢è«‹æ±‚:æ£åœ¨ç‰å¾…ç›®å‰æ“作完æˆ...</target> +<source>Continue</source> +<target>繼續</target> +<source>Pause</source> +<target>æš«åœ</target> +<source>Cannot find %x</source> +<target>找ä¸åˆ° %x</target> +<source>DECISION TREE</source> +<target>決ç–樹</target> +<source>file exists on both sides</source> +<target>檔案在兩邊å‡å·²å˜åœ¨</target> +<source>on one side only</source> +<target>åªæœ‰ä¸€é‚Š</target> +<source>different</source> +<target>ä¸åŒ</target> +<source>Inactive</source> +<target>åœç”¨</target> +<source>Second</source> +<target>秒</target> +<source>Minute</source> +<target>分</target> +<source>Hour</source> +<target>時</target> +<source>Day</source> +<target>天</target> +<source>Byte</source> +<target>ä½å…ƒçµ„</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>篩é¸å™¨ï¼šæ‰€æœ‰å°</target> +<source>Filter: Single pair</source> +<target>篩é¸å™¨ï¼šå–®å°</target> +<source>Ignore</source> +<target>忽略</target> +<source>Direct</source> +<target>直接</target> +<source>Follow</source> +<target>éµå¾ª</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集:</target> +<source>- full file or directory name</source> +<target>- 完整的檔å或目錄å稱</target> +<source>- directory part only</source> +<target>- åªæœ‰ç›®éŒ„部份</target> +<source>- Other side's counterpart to %name</source> +<target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %dir</target> +<source>Restore all hidden dialogs?</source> +<target>è¦é‚„原全部隱è—çš„å°è©±æ¡†å—Žï¼Ÿ</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>確定è¦å°‡ä¸‹åˆ— x% 物件移動到資æºå›žæ”¶ç’嗎?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>您確定è¦åˆªé™¤ä¸‹åˆ—çš„ %x 物件嗎?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª</target> +<source>Delete permanently</source> +<target>永久刪除</target> +<source>Delete or overwrite files permanently</source> +<target>永久刪除或覆蓋檔案</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’</target> +<source>Versioning</source> +<target>版本控制</target> +<source>Move files into a time-stamped subdirectory</source> +<target>移動檔案到一個時間標記的å目錄</target> +<source>Cannot determine sync-direction:</source> +<target>無法判斷åŒæ¥æ–¹å‘:</target> +<source>Filter settings have changed!</source> +<target>篩é¸å™¨è¨å®šå·²æ›´æ”¹ï¼</target> +<source>Both sides have changed since last synchronization!</source> +<target>自上次åŒæ¥å¾Œï¼Œå…©é‚Šå‡å·²æ›´æ”¹éŽï¼</target> +<source>No change since last synchronization!</source> +<target>自上次åŒæ¥ä»¥ä¾†éƒ½æ²’有變更ï¼</target> +<source>The file was not processed by last synchronization!</source> +<target>上次åŒæ¥æ™‚該檔案未被處ç†ï¼</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>計劃è¦åˆªé™¤çš„目錄與其å目錄和檔案是è¡çªçš„ï¼</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>è¨å®šé è¨åŒæ¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。</target> +<source>The file does not contain a valid configuration:</source> +<target>該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置:</target> +<source>Scanning:</source> +<target>掃瞄ä¸ï¼š</target> +<source>Encoding extended time information: %x</source> +<target>編碼延長時間資訊:%x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>您å¯ä»¥å¿½ç•¥æ¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。</target> +<source>Directory does not exist:</source> +<target>目錄ä¸å˜åœ¨ï¼š</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>目錄有ä¾é 性ï¼è«‹å°å¿ƒè¨å®šåŒæ¥è¦å‰‡ï¼š</target> +<source>Comparing content of files %x</source> +<target>æ£åœ¨æ¯”å°æª”案内容的百分比 %x</target> +<source>Memory allocation failed!</source> +<target>記憶體分é…失敗ï¼</target> +<source>File %x has an invalid date!</source> +<target>檔案 %x 的日期無效ï¼</target> +<source>Conflict detected:</source> +<target>檢測到è¡çªï¼š</target> +<source>Files %x have the same date but a different size!</source> +<target>檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>ç¬¦è™Ÿé€£çµ %x 有相åŒæ—¥æœŸä½†æ˜¯ä¸åŒç›®æ¨™ï¼</target> +<source>Comparing files by content failed.</source> +<target>比å°æª”案內容失敗。</target> +<source>Generating file list...</source> +<target>產生檔案清單...</target> +<source>Multiple...</source> +<target>多個...</target> +<source>Files that are equal on both sides</source> +<target>兩邊相åŒçš„檔案</target> +<source>Equal files/folders that differ in attributes only</source> +<target>åŒç‰æª”案/資料夾åªåœ¨æ–¼å±¬æ€§ä¸åŒ</target> +<source>Copy from right to left</source> +<target>從å³é‚Šè¤‡è£½åˆ°å·¦é‚Š</target> +<source>Copy from left to right</source> +<target>從左邊複製到å³é‚Š</target> +<source>Delete files/folders existing on left side only</source> +<target>刪除åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target> +<source>Delete files/folders existing on right side only</source> +<target>刪除åªå˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target> +<source>Copy from right to left overwriting</source> +<target>從å³é‚Šè¤‡è£½åˆ°å·¦é‚Šè¦†è“‹æª”案</target> +<source>Copy from left to right overwriting</source> +<target>從左邊複製到å³é‚Šè¦†è“‹æª”案</target> +<source>Do nothing</source> +<target>ç¶æŒåŽŸç‹€</target> +<source>Copy attributes only from right to left</source> +<target>複製åªæœ‰å¾žå³é‚Šåˆ°å·¦é‚Šçš„屬性</target> +<source>Copy attributes only from left to right</source> +<target>複製åªæœ‰å¾žå·¦é‚Šåˆ°å³é‚Šçš„屬性</target> +<source>Deleting file %x</source> +<target>æ£åœ¨åˆªé™¤æª”案 %x</target> +<source>Deleting Symbolic Link %x</source> +<target>æ£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x</target> +<source>Deleting folder %x</source> +<target>æ£åœ¨åˆªé™¤è³‡æ–™å¤¾ %x</target> +<source>Moving %x to Recycle Bin</source> +<target>æ£åœ¨ç§»å‹• %x 到資æºå›žæ”¶ç’</target> +<source>Moving file %x to user-defined directory %y</source> +<target>æ£åœ¨ç§»å‹•æª”案 %x 到自定義目錄 %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>æ£åœ¨ç§»å‹•è³‡æ–™å¤¾ %x 到自定義目錄 %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到自定義目錄 %y</target> +<source>Copying new file %x to %y</source> +<target>複製新檔案 %x 到 %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>è¤‡è£½ç¬¦è™Ÿé€£çµ %x 到 %y</target> +<source>Overwriting file %x in %y</source> +<target>覆蓋檔案 %x 在 %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>è¦†è“‹ç¬¦è™Ÿé€£çµ %x 在 %y</target> +<source>Creating folder %x</source> +<target>æ£åœ¨æ–°å»ºè³‡æ–™å¤¾ %x</target> +<source>Verifying file %x</source> +<target>é©—è‰æª” %x</target> +<source>Updating attributes of %x</source> +<target>æ›´æ–° %x 個的屬性</target> +<source>Source directory does not exist anymore:</source> +<target>來æºç›®éŒ„ä¸å˜åœ¨ï¼š</target> +<source>Nothing to synchronize according to configuration!</source> +<target>æ ¹æ“šé…置没有任何åŒæ¥ï¼</target> +<source>Target directory name must not be empty!</source> +<target>目標目錄å稱ä¸èƒ½ç©ºç™½ï¼</target> +<source>User-defined directory for deletion was not specified!</source> +<target>未指定è¦åˆªé™¤çš„自定義目錄ï¼</target> +<source>Unresolved conflicts existing!</source> +<target>å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ¥ã€‚</target> +<source>Significant difference detected:</source> +<target>檢測到顯著的差異:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>超éŽç¸½æ•¸ 50% 以上的檔案將被複製或刪除ï¼</target> +<source>Not enough free disk space available in:</source> +<target>æ²’æœ‰è¶³å¤ çš„å¯ç”¨ç©ºé–“:</target> +<source>Free disk space required:</source> +<target>所需è¦çš„å¯ç”¨ç£ç¢Ÿç©ºé–“:</target> +<source>Free disk space available:</source> +<target>å¯ç”¨ç£ç¢Ÿç©ºé–“:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>一個目錄將被修改,這是多å°è³‡æ–™å¤¾çš„一部份ï¼è«‹æª¢é–±åŒæ¥è¨å®šï¼</target> +<source>Processing folder pair:</source> +<target>處ç†ä¸€å°è³‡æ–™å¤¾ï¼š</target> +<source>Generating database...</source> +<target>產生資料庫...</target> +<source>Error copying locked file %x!</source> +<target>複製已鎖定檔案錯誤 %xï¼</target> +<source>Data verification error: Source and target file have different content!</source> +<target>資料驗è‰éŒ¯èª¤ï¼šä¾†æºå’Œç›®çš„檔案內容ä¸åŒï¼</target> diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index dbfa5de0..16ac3707 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -1,910 +1,1066 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objektů úspěšnÄ› smazáno -%x Bytes -%x B -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x d -%x directories -adresářů: %x -%x files -souborů: %x -%x hour(s) -%x h -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x z %y řádků -%x of 1 row in view -%x z 1 řádku -%x sec -%x s -%x% -%x% -&Abort -&PÅ™eruÅ¡it -&About... -&O Programu... -&Advanced -&UpÅ™esnit -&Cancel -&ZruÅ¡it -&Check for new version -Zkontrolovat &aktualizace -&Content -&Obsah -&Create batch job... -&VytvoÅ™it dávku... -&Default -&PÅ™eddefinované -&Exit -&Konec -&Export file list... -&Exportovat seznam souborů... -&File -&Soubor -&Find next -&NajÃt dalÅ¡Ã -&Global settings... -&NastavenÃ... -&Help -&Pomoc -&Ignore -&Ignorovat -&Language -&Jazyk -&Load -&NaÄÃst -&Load configuration... -&NaÄÃst konfiguraci... -&New -&Nový -&No -&Ne -&OK -&OK -&Pause -&Pauza -&Program -&Nástroje -&Quit -U&konÄit -&Restore -&Obnovit -&Retry -&Opakovat -&Save -&Uložit -&Switch -&PÅ™epnout -&Yes -&Ano -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Vyžaduje pÅ™ipojenà k internetu!) -- Other side's counterpart to %dir -- pouze cesta z opaÄného panelu -- Other side's counterpart to %name -- celá cesta nebo jméno souboru z opaÄného panelu -- conflict -- konflikt -- conflict (same date, different size) -- konflikt (stejné datum, jiná velikost) -- different -- rozdÃlné -- directory part only -- pouze cesta -- equal -- stejné -- exists left only -- existuje pouze na levé stranÄ› -- exists right only -- existuje pouze na pravé stranÄ› -- full file or directory name -- celá cesta nebo jméno souboru -- left -- vlevo -- left newer -- vlevo novÄ›jÅ¡Ã -- right -- vpravo -- right newer -- vpravo novÄ›jÅ¡Ã -/sec -/s -1 directory -adresář: 1 -1 file -soubor: 1 -1. &Compare -1. &Porovnat -1. Enter relative file or directory names separated by ';' or a new line. -1. Můžete použÃt relativnà cesty k souboru nebo adresáři oddÄ›lené ';' nebo řádkem. -1. Select directories to monitor. -1. Vyberte adresáře pro sledovánÃ. -2. &Synchronize... -2. &Synchronizovat... -2. Enter a command line. -2. Zadejte pÅ™Ãkazovou řádku. -2. Use wildcard characters '*' and '?'. -2. Můžete použÃt zástupné znaky (wildcard) '*' a '?'. -3. Exclude files directly on main grid via context menu. -3. Můžete použÃt pro vynechávánà souborů pÅ™Ãmo kontextového menu. -3. Press 'Start'. -3. ZmáÄknÄ›te 'Start' -<Automatic> -<Automaticky> -<Directory> -<Adresář> -<Last session> -<Poslednà sezenÃ> -<Symlink> -<Symlink> -<multiple selection> -<vÃcenásobný výbÄ›r> -A directory input field is empty. -Nenà zadán vstupnà adresář. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Bude zmÄ›nÄ› adresář, který je souÄástà adresářového páru vÃcenásobného porovnánÃ! ProsÃm zkontrolujte si nastavenà synchronizace! -A newer version of FreeFileSync is available: -Je dostupná novÄ›jÅ¡Ã verze FreeFileSync: -Abort requested: Waiting for current operation to finish... -Požadavek na pÅ™eruÅ¡enÃ: ÄŒekánà na ukonÄenà aktuálnà operace... -Abort synchronization immediately -PÅ™eruÅ¡it synchronizaci ihned -Aborted -PÅ™eruÅ¡eno -About -O Programu -Action -Akce -Add folder -PÅ™idat adresář -Add folder pair -PÅ™idat adresář pro porovnánà -All directories in sync! -VÅ¡echny adresáře jsou synchronizovány! -An exception occurred! -Vyskytla se chyba! -As a result the files are separated into the following categories: -Jako výsledek jsou soubory rozdÄ›leny do následujÃcÃch kategoriÃ: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Jak název napovÃdá, dva soubory majÃcà stejné jméno jsou oznaÄeny za shodné jen a pouze pokud majà shodný obsah. Toto nastavenà je vhodné spÃÅ¡e pro sledovánà konzistence než pro zálohovánÃ. Proto nejsou data zmÄ›n souborů brána vůbec v potaz.\n\nPokud vyberete toto nastavenà bude schéma rozhodovánà kratÅ¡Ã: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -VytvoÅ™enà dávkového souboru pro automatický provoz. Ke spuÅ¡tÄ›nà dávky jednoduÅ¡e jejà jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›nà FreeFileSync: FreeFileSync.exe <batchfile>. -At least one directory input field is empty. -Alespoň jedno zadánà adresáře je prázdné. -Auto-adjust columns -Automaticky pÅ™izpůsobit Å¡ÃÅ™ku -Batch execution -SpuÅ¡tÄ›nà dávky -Batch file created successfully! -Dávka úspěšnÄ› vytvoÅ™ena! -Batch job -Dávkový soubor -Big thanks for localizing FreeFileSync goes out to: -PodÄ›kovánà za pÅ™eklad FreeFileSync: -Both sides have changed since last synchronization! -DoÅ¡lo ke zmÄ›nÄ› obou stran od poslednà synchronizace! -Browse -Procházet -Browse directory -Procházet adresář -Cannot determine sync-direction: -Nelze urÄit smÄ›r synchronizace: -Cannot find %x -Nelze najÃt %x -Category -Kategorie -Clear filter settings -Smazat nastavenà filtru -Comma separated list -Text oddÄ›lený Äárkami -Command line -PÅ™Ãkazová řádka -Command line is empty! -PÅ™Ãkazová řádka je prázdná! -Compare -Porovnánà -Compare both sides -Porovnat obÄ› strany -Compare by \"File content\" -Porovnat \"podle obsahu souboru\" -Compare by \"File size and date\" -Porovnat \"podle velikosti a data souboru\" -Compare by... -Porovnat ... -Comparing content of files %x -Porovnávánà obsahu souborů %x -Comparing content... -Porovnávánà obsahu... -Comparing files by content failed. -Porovnánà obsahu souborů se nezdaÅ™ilo. -Comparison Result -Výsledek porovnánà -Comparison settings -Nastavenà porovnánà -Completed -Hotovo -Configuration -Konfigurace -Configuration loaded! -Konfigurace naÄtena. -Configuration overview: -PÅ™ehled konfigurace: -Configuration saved! -Konfigurace uložena. -Configure filter -Nastavenà filtru -Configure your own synchronization rules. -Nastavenà vlastnÃch pravidel synchronizace. -Confirm -Potvrdit -Conflict detected: -Zaznamenán konflikt: -Conflicts/files that cannot be categorized -Konflikty/soubory které nelze zaÅ™adit -Continue -PokraÄovat -Conversion error: -Chyba konverze: -Copy attributes only from left to right -KopÃrovat vlastnosti jen z leva do prava -Copy attributes only from right to left -KopÃrovat vlastnosti jen z prava do leva -Copy filesystem permissions -KopÃrovat oprávnÄ›nà k souborům -Copy from left to right -KopÃrovat z leva do prava -Copy from left to right overwriting -KopÃrovat z leva do prava pÅ™episem -Copy from right to left -KopÃrovat z prava do leva -Copy from right to left overwriting -KopÃrovat z prava do leva pÅ™episem -Copy locked files -KopÃrovat zamÄené soubory -Copy new or updated files to right folder. -KopÃrovat nové nebo aktualizované soubory do adresáře vpravo. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -KopÃrovat sdÃlené nebo zamÄené soubory pomocà Volume Shadow Copy Service\n(Vyžaduje administrátorské oprávnÄ›nÃ) -Copy to clipboard\tCTRL+C -Vložit do schránky\tCTRL+C -Copying new Symbolic Link %x to %y -KopÃrovánà symbolického odkazu %x do %y -Copying new file %x to %y -KopÃrovánà nového souboru %x do %y -Could not determine volume name for file: -Nenà možné zjistit jméno jednotky souboru: -Could not initialize directory monitoring: -Nelze nastavit monitorovánà adresáře: -Could not load a required DLL: -Nelze naÄÃst požadovanou knihovnu DLL: -Could not read values for the following XML nodes: -Nelze naÄÃst hodnoty následujÃcÃch XML elementy: -Create a batch job -VytvoÅ™it dávku -Creating folder %x -Vytvářenà adresáře %x -Custom -Vlastnà -Customize columns -Vlastnà sloupce -Customize... -VlastnÃ.... -D-Click -Dvojklik -DECISION TREE -ROZHODOVÃNà -Data verification error: Source and target file have different content! -Chyba verifikace dat: Zdrojový a cÃlový soubor majà rozdÃlný obsah! -Date -Datum -Delete files/folders existing on left side only -Smazat soubory/adresáře existujÃcà pouze na levé stranÄ› -Delete files/folders existing on right side only -Smazat soubory/adresáře existujÃcà pouze na pravé stranÄ› -Delete files\tDEL -Smazat soubory\tDEL -Delete on both sides -Smazat z obou stran -Delete on both sides even if the file is selected on one side only -Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich -Delete or overwrite files permanently -Smazat nebo pÅ™epsat soubory trvale -Delete permanently -Odstranit trvale -Deleting Symbolic Link %x -Mazánà symbolického odkazu -Deleting file %x -Mazánà souboru %x -Deleting folder %x -Mazánà adresáře %x -Deletion handling -Nastavenà mazánà -Description -Popis -Direct -Zachovat -Directories are dependent! Be careful when setting up synchronization rules: -Adresáře jsou závislé! BuÄte opatrnà s definicà synchronizaÄnÃch pravidel: -Directories to watch -Sledované adresáře -Directory -Adresář -Directory does not exist: -Adresář neexistuje: -Do not show this dialog again -Tento dialog již nezobrazovat -Do nothing -Nic nedÄ›lat -Do you really want to delete the following object(s)? -Opravdu chcete smazat následujÃcà objekty? -Do you really want to move the following object(s) to the Recycle Bin? -Opravdu chcete pÅ™esunout následujÃcà objekty do koÅ¡e? -Do you want FreeFileSync to automatically check for updates every week? -Chcete aby FreeFileSync automaticky zjiÅ¡Å¥oval aktualizace každý týden? -Donate with PayPal -PÅ™ispÄ›t pomocà PayPal -Download now? -Stáhnout nynÃ? -Drag && drop -Drag && Drop -Elements found: -Nalezeno položek: -Elements processed: -Zpracováno položek: -Elements remaining: -Zbývá položek: -Email -Email -Encoding extended time information: %x -Zpracovánà rozÅ¡ÃÅ™ené informace o Äase: %x -Endless loop when traversing directory: -Zacyklenà pÅ™i procházenà adresáře: -Equal files/folders that differ in attributes only -Stejné soubory/adresáře, které se liÅ¡Ã pouze ve vlastnostech -Error -Chyba -Error changing modification time: -Chyba nastavenà Äasu zmÄ›ny: -Error copying file permissions: -Chyba kopÃrovánà oprávnÄ›nà souborů: -Error copying file: -Chyba kopÃrovánà souboru: -Error copying locked file %x! -Chyba kopÃrovánà zamÄeného souboru %x! -Error copying symbolic link: -Chyba kopÃrovánà zástupce: -Error creating directory: -Chyba vytvoÅ™enà adresáře: -Error deleting directory: -Chyba mazánà adresáře: -Error deleting file: -Chyba mazánà souboru: -Error handling -Zpracovánà chyb -Error loading library function: -Chyba naÄtenà knihovny funkcÃ: -Error moving directory: -Chyba pÅ™esouvánà adresáře: -Error moving file: -Chyba pÅ™esouvánà souboru: -Error moving to Recycle Bin: -Chyba pÅ™esunu do KoÅ¡e: -Error opening file: -Chyba otevÅ™enà souboru: -Error parsing configuration file: -Chyba zpracovánà konfigurace: -Error reading file attributes: -Chyba Ätenà atributů souboru: -Error reading file: -Chyba Ätenà souboru: -Error reading from synchronization database: -Chyba Ätenà synchronizaÄnà databáze: -Error reading security context: -Chyba pÅ™i Ätenà pÅ™Ãstupových práv: -Error resolving symbolic link: -Chyba odkazu zástupce: -Error setting directory lock: -Chyba nastavenà zámku adresáře: -Error setting privilege: -Chyba nastavenà práv: -Error starting Volume Shadow Copy Service! -Chyba spuÅ¡tÄ›nà služby Volume Shadow Copy Service! -Error traversing directory: -Chyba procházenà adresáře: -Error when monitoring directories. -Chyba pÅ™i sledovánà adresářů. -Error writing file: -Chyba zápisu souboru: -Error writing security context: -Chyba pÅ™i zápisu pÅ™Ãstupových práv: -Error writing to synchronization database: -Chyba zápisu synchronizaÄnà databáze: -Example -PÅ™Ãklad -Exclude -Vynechat -Exclude all rows -Vynechat vÅ¡echny řádky -Exclude temporarily -Vynechat doÄasnÄ› -Exclude via filter: -Vynechat pomocà filtru: -Exit instantly -UkonÄit ihned -Extension -PÅ™Ãpona -External applications -Externà aplikace -Fatal Error -Závažná chyba -Feedback and suggestions are welcome at: -Komentáře a námÄ›ty zasÃlejte na: -File %x has an invalid date! -Soubor %x má chybné datum! -File already exists. Overwrite? -Soubor již existuje. PÅ™epsat? -File content -Podle obsahu souboru -File does not exist: -Soubor neexistuje: -File list exported! -Seznam souborů exportován! -File size and date -Podle velikosti a data souboru -Filename -Jméno -Files %x have the same date but a different size! -Soubory %x majà stejné datum a Äas ale rozdÃlnou velikost! -Files are found equal if\n - file content\nis the same -Soubory jsou shodné jestliže\n - obsah souboru\nje stejný -Files are found equal if\n - filesize\n - last write time and date\nare the same -Soubory jsou shodné jestliže\n - velikost souboru\n - datum i Äas poslednà zmÄ›ny\njsou stejné -Files that are equal on both sides -Soubory shodné na obou stranách -Files that exist on both sides, left one is newer -Soubory, které existujà na obou stranách, z nichž vlevo je novÄ›jÅ¡Ã -Files that exist on both sides, right one is newer -Soubory, které existujà na obou stranách, z nichž vpravo je novÄ›jÅ¡Ã -Files that have different content -Soubory, které majà rozdÃlný obsah -Files/folders that exist on left side only -Soubory/adresáře, které existujà pouze vlevo -Files/folders that exist on right side only -Soubory/adresáře, které existujà pouze vpravo -Filter files -Filtr souborů -Filter is active -Filtr je zapnutý -Filter settings have changed! -Nastavenà filtru bylo zmÄ›nÄ›no! -Filter: All pairs -Filtr: VÅ¡echny páry -Filter: Single pair -Filtr: Jeden pár -Find -NajÃt -Find what: -NajÃt: -Folder Comparison and Synchronization -Porovnánà a Synchronizace adresářů -Folder pairs -Adresářové páry -Follow -PoužÃt cÃl -Free disk space available: -Volné mÃsto k dispozici: -Free disk space required: -Požadované volné mÃsto na disku: -FreeFileSync Batch Job -FreeFileSync Dávkové zpracovánà -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge -FreeFileSync batch file -FreeFileSync dávkový soubor -FreeFileSync configuration -Konfigurace FreeFileSync -FreeFileSync is up to date! -FreeFileSync je aktuálnÃ! -Full path -Plná cesta -Generating database... -Vytvářenà databáze... -Generating file list... -Vytvářenà seznamu souborů... -Global settings -Nastavenà programu -Help -NápovÄ›da -Hidden dialogs: -Skryté dialogy: -Hide all error and warning messages -Skrýt vÅ¡echny chyby a varovánà -Hide conflicts -Skrýt konflikty -Hide excluded items -Skrýt vynechané položky -Hide files that are different -Skrýt rozdÃlné soubory -Hide files that are equal -Skrýt shodné soubory -Hide files that are newer on left -Skrýt novÄ›jÅ¡Ã zleva -Hide files that are newer on right -Skrýt novÄ›jÅ¡Ã zprava -Hide files that exist on left side only -Skrýt soubory existujÃcà pouze vlevo -Hide files that exist on right side only -Skrýt soubory existujÃcà pouze vpravo -Hide files that will be created on the left side -Skrýt soubory, které budou vlevo vytvoÅ™eny -Hide files that will be created on the right side -Skrýt soubory, které budou vpravo vytvoÅ™eny -Hide files that will be deleted on the left side -Skrýt soubory, které budou vlevo smazány -Hide files that will be deleted on the right side -Skrýt soubory, které budou vpravo smazány -Hide files that will be overwritten on left side -Skrýt soubory, které budou vlevo pÅ™epsány -Hide files that will be overwritten on right side -Skrýt soubory, které budou vpravo pÅ™epsány -Hide files that won't be copied -Skrýt soubory, které nebudou kopÃrovány -Hide filtered or temporarily excluded files -Skrýt filtrované nebo doÄasnÄ› vynechané soubory -Hide further error messages during the current process -Nezobrazovat dalÅ¡Ã chybová hlášenà bÄ›hem zpracovánà -Hints: -NápovÄ›da: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Rozpoznat a provést zmÄ›ny na obou stranách pomocà databáze. OdstranÄ›né soubory a konflikty budou detekovány automaticky. -Idle time between detection of last change and execution of command line in seconds -Prodleva mezi detekcà poslednà zmÄ›ny a spuÅ¡tÄ›nÃm pÅ™Ãkazu (v sekundách) -If you like FFS -Pokud se Vám FSS lÃbà -Ignore -PÅ™eskoÄit -Ignore errors -Ignorovat chyby -Ignore subsequent errors -Ignorovat dalÅ¡Ã chyby -Include -PÅ™idat -Include all rows -PoužÃt vÅ¡echny řádky -Include temporarily -PÅ™idat doÄasnÄ› -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -PÅ™idat: *.doc;*.zip;*.exe\nVynechat: \\stuff\\temp\\* -Incompatible synchronization database format: -Chyba formátu synchronizaÄnà databáze: -Info -Info -Information -Informace -Initial synchronization: -Prvotnà synchronizace: -Integrate external applications into context menu. The following macros are available: -Integrace externà aplikace do kontextového menu. K dispozici jsou následujÃcà makra: -Invalid FreeFileSync config file! -Chybný konfiguraÄnà soubor FreeFileSync! -Last used configurations (press DEL to remove from list) -PoslednÄ› použité konfigurace (pomocà DEL můžete položku smazat) -Leave as unresolved conflict -Ponechat jako nevyÅ™eÅ¡ený konflikt -Left -Levý -Legend -Legenda -Load configuration from file -NaÄÃst konfiguraci ze souboru -Log-messages: -Záznamy: -Logging -Zaznamenávánà -Main bar -Hlavnà liÅ¡ta -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Vytvářenà stÃnových kopià na WOW64 nenà podporováno. ProsÃm použijte 64 bitovou verzi FreeFileSync. -Match case -RozliÅ¡ovat malá a velká pÃsmena -Maximum number of logfiles: -Maximálnà poÄet záznamových soubor -Memory allocation failed! -Chyba pÅ™idÄ›lenà pamÄ›ti! -Minimum Idle Time [seconds] -Minimálnà Äas prodlevy [v sekundách] -Mirror ->> -Zrcadlenà ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Zrcadlenà levého adresáře. Pravý adresář bude zmÄ›nÄ›n tak, aby po synchronizaci byl totožný s levým. -Monitoring active... -Sledovánà zapnuto... -More than 50% of the total number of files will be copied or deleted! -VÃce než 50% souborů bude kopÃrovaných nebo mazaných! -Move column down -PÅ™esunout sloupec dolů -Move column up -PÅ™esunout sloupec nahoru -Move files into a time-stamped subdirectory -PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře -Moving %x to Recycle Bin -PÅ™esouvánà %x do KoÅ¡e. -Moving Symbolic Link %x to user-defined directory %y -PÅ™esouvánà symbolického odkazu %xdo uživatelského adresáře %y -Moving file %x to user-defined directory %y -PÅ™esouvánà souboru %x do uživatelského adresáře %y -Moving folder %x to user-defined directory %y -PÅ™esouvánà adresáře %x do uživatelského adresáře %y -Multiple... -NÄ›kolikanásobný... -No change since last synchronization! -Žádné zmÄ›ny od poslednà synchronizace! -No filter selected -Nenà vybrán žádný filtr -Not enough free disk space available in: -Nedostatek mÃsta na disku: -Nothing to synchronize according to configuration! -Podle dané konfigurace nenà co synchronizovat! -Number of files and directories that will be created -PoÄet souborů a adresářů k vytvoÅ™enà -Number of files and directories that will be deleted -PoÄet souborů a adresářů ke smazánà -Number of files that will be overwritten -PoÄet souborů a adresářů k pÅ™epsánà -One of the FreeFileSync database entries within the following file is not yet existing: -NÄ›která z položek databáze FreeFileSync k následujÃcÃmu souboru jeÅ¡tÄ› neexistuje: -One of the FreeFileSync database files is not yet existing: -NÄ›který z databázových souborů FreeFileSync neexistuje: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Pouze soubory/adresáře odpovÃdajÃcà nastavenému filtru budou vybrány pro synchronizaci. Filtr je aplikován relativnÄ›(!) k cestÄ› synchronizovaných adresářů. -Open with Explorer -OtevÅ™Ãt v PrůzkumnÃkovi -Open with default application -OtevÅ™Ãt výchozà aplikacà -Operation aborted! -Operace zruÅ¡ena! -Operation: -Operace: -Overview -PÅ™ehled -Overwriting Symbolic Link %x in %y -PÅ™epis symbolického odkazu %x v %y -Overwriting file %x in %y -PÅ™epis souboru %x v %y -Pause -Pauza -Paused -Pauza -Planned directory deletion is in conflict with its subdirectories and -files! -Naplánované smazánà adresáře je v konfliktu s podadresáři a/nebo soubory! -Please run a Compare first before synchronizing! -ProsÃm proveÄte nejdÅ™Ãv porovnánà pÅ™ed synchronizacÃ! -Press \"Switch\" to open FreeFileSync GUI mode. -TalÄÃtkem \"PÅ™epnout\" otevÅ™ete okno FreeFileSync. -Processing folder pair: -Zpracovávánà adresářové páru: -Published under the GNU General Public License: -Vydáno podle GNU General Public License (GPL): -Question -Otázky -RealtimeSync - Automated Synchronization -RealtimeSync - Automatická synchronizace -RealtimeSync configuration -Konfigurace RealtimeSync -Recycle Bin not yet supported for this system! -KoÅ¡ nenà na tomto systému zatÃm podporován! -Relative path -Relativnà cesta -Remove alternate settings -Odstranit jiné nastavenà -Remove folder -Odstranit adresář -Remove folder pair -Odstranit dvojici adresářů -Report translation error -Hlásit chyby pÅ™ekladu -Reset -Resetovat -Reset view -Výchozà zobrazenà -Restore all hidden dialogs? -Obnovit vÅ¡echny skryté dialogy? -Right -Pravý -S&ave configuration... -&Uloženà konfigurace... -S&witch view -&ZmÄ›nit zobrazenà -Save changes to current configuration? -Uložit zmÄ›ny do aktuálnà konfigurace? -Save current configuration to file -Uložit zmÄ›ny do konfiguraÄnÃho souboru -Scanning... -ZpracovávánÃ... -Scanning: -Zpracováváno: -Select a folder -Vyberte adresář -Select alternate synchronization settings -Vyberte alternativnà nastavenà synchronizace -Select logfile directory: -Vyberte adresář pro záznamové soubory: -Select variant: -Vyberte variantu: -Select view -Vyberte zobrazenà -Set direction: -Nastavit adresář: -Setting default synchronization directions: Old files will be overwritten with newer files. -Nastaven výchozà způsob synchronizace: Staré soubory budou nahrazeny novými. -Show \"%x\" -Zobrazit \"%x\" -Show conflicts -Zobrazit konflikty -Show files that are different -Zobrazit rozdÃlené soubory -Show files that are equal -Zobrazit shodné soubory -Show files that are newer on left -Zobrazit soubory novÄ›jÅ¡Ã vlevo -Show files that are newer on right -Zobrazit soubory novÄ›jÅ¡Ã vpravo -Show files that exist on left side only -Zobrazit soubory existujÃcà pouze vlevo -Show files that exist on right side only -Zobrazit soubory existujÃcà pouze vpravo -Show files that will be created on the left side -Zobrazit soubory, které budou vlevo vytvoÅ™eny -Show files that will be created on the right side -Zobrazit soubory, které budou vpravo vytvoÅ™eny -Show files that will be deleted on the left side -Zobrazit soubory, které budou vlevo smazány -Show files that will be deleted on the right side -Zobrazit soubory, které budou vpravo smazány -Show files that will be overwritten on left side -Zobrazit soubory, které budou vlevo pÅ™epsány -Show files that will be overwritten on right side -Zobrazit soubory, které budou vpravo pÅ™epsány -Show files that won't be copied -Zobrazit soubory, které nebudou kopÃrovány -Show hidden dialogs -Zobrazit skryté dialogy -Show popup -Zobrazit okno -Show popup on errors or warnings -Zobrazit hlášenà pÅ™i chybÄ› nebo varovánà -Significant difference detected: -Nalezeny významné zmÄ›ny: -Silent mode -Tichý mód -Size -Velikost -Source code written completely in C++ utilizing: -Zdrojový kód byl napsán kompletnÄ› v C++ s pomocÃ: -Source directory does not exist anymore: -Zdrojový adresář již neexistuje: -Speed: -Rychlost: -Start -Start -Start minimized and write status information to a logfile -Spustit minimalizovaný a zapisovat informace do záznamového souboru -Start synchronization -Start synchronizace -Statistics -Statistika -Status feedback -BÄ›h programu -Stop -Stop -Swap sides -ZmÄ›na stran -Switching to FreeFileSync GUI mode... -OtevÃránà okna FreeFileSync... -Symbolic Link handling -Zpracovánà symbolických odkazů -Symlinks %x have the same date but a different target! -Symbolický odkaz %x má stejné datum ale jiný cÃl! -Synchronization Preview -Náhled synchronizace -Synchronization aborted! -Synchronizace zruÅ¡ena! -Synchronization completed successfully! -Synchronizace dokonÄena úspěšnÄ›! -Synchronization completed with errors! -Synchronizace dokonÄena s chybami. -Synchronization settings -Nastavenà synchronizace -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchronizovat vÅ¡echny soubory .doc, .zip a .exe s výjimkou vÅ¡eho v podadresáři \"temp\" -Synchronize... -Synchronizace -Synchronizing... -Synchronizuji... -Target directory already existing! -CÃlový adresář již existuje! -Target file already existing! -CÃlový soubor již existuje! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -PÅ™Ãkazová řádka je spuÅ¡tÄ›na pokaždé když:\n- jsou k dispozici vÅ¡echny adresáře (napÅ™. vloženÃm USB disku)\n- dojde ke zmÄ›nÄ› souborů v adresáři nebo podadresářÃch -The file does not contain a valid configuration: -Soubor neobsahuje platnou konfiguraci: -The file was not processed by last synchronization! -Soubor nebyl poslednà synchronizacà zpracován! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Tato varianta vyhodnotà dva stejnÄ› pojmenované soubory jako shodné pokud majà i stejnou velikost A ZÃROVEŇ i datum a Äas poslednà zmÄ›ny. -Time -ÄŒas -Time elapsed: -Uplynulý Äas: -Time remaining: -ZbývajÃcà Äas: -Total amount of data that will be transferred -Celkový objem dat, který bude pÅ™enesen -Total time: -Celkový Äas: -Transfer file and directory permissions\n(Requires Administrator rights) -PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů\n(Vyžaduje administrátorké oprávnÄ›nÃ) -Unable to connect to sourceforge.net! -Nenà možné se pÅ™ipojit k sourceforge.net! -Unable to create logfile! -nenà možné vytvoÅ™it záznamový soubor! -Unresolved conflicts existing! -NevyÅ™eÅ¡ené konflikty! -Update -> -Aktualizuj -> -Updating attributes of %x -Aktualizace atributů souboru %x -Usage: -PoužitÃ: -Use Recycle Bin -PoužÃt KoÅ¡ -Use Recycle Bin when deleting or overwriting files -PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů -User-defined directory for deletion was not specified! -Uživatelsky definovaný adresář pro mazánà nebyl zadán! -Variant -Varianta -Verifying file %x -Kontroluji soubor %x -Versioning -Verzovánà -Volume name %x not part of filename %y! -Disk %x nenà souÄástà jména souboru %y! -Waiting for missing directories... -ÄŒekánà na nedostupné adresáře... -Waiting while directory is locked (%x)... -ÄŒekánà na uzamÄenà adresáře (%x) -Warning -Varovánà -When the comparison is started with this option set the following decision tree is processed: -Když je zahájeno porovnávánà s tÃmto nastavenÃm, je použito následujÃcà schéma rozhodovánÃ: -You can ignore conflicts and continue synchronization. -Je možné konflikt ignorovat a pokraÄovat v synchronizaci. -You can ignore this error to consider the directory as empty. -Tuto chybu můžete ignorovat a považovat neexistujÃcà adresář jako prázdný. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Můžete se pokusit synchronizovat zbývajÃcà položky (BEZ nutnosti znovuporovnávánÃ)! -different -rozdÃlný -file exists on both sides -soubor existuje na obou stranách -on one side only -pouze na jedné stranÄ› +<header> + <language name>ÄŒeÅ¡tina</language name> + <translator>ViCi</translator> + <locale>cs_CZ</locale> + <flag file>czechRep.png</flag file> + <plural forms>3</plural forms> + <plural definition>n==1 ? 0 : n>=2 && n<=4 ? 1 : 2</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Zobrazit v PrůzkumnÃkovi</target> +<source>Open with default application</source> +<target>OtevÅ™Ãt výchozà aplikacÃ</target> +<source>Browse directory</source> +<target>Procházet adresář</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automatická synchronizace</target> +<source>Browse</source> +<target>Procházet</target> +<source>Error resolving symbolic link:</source> +<target>Chyba odkazu zástupce:</target> +<source>Select alternate synchronization settings</source> +<target>Vyberte alternativnà nastavenà synchronizace</target> +<source>No filter selected</source> +<target>Nenà vybrán žádný filtr</target> +<source>Filter is active</source> +<target>Filtr je zapnutý</target> +<source>Clear filter settings</source> +<target>Smazat nastavenà filtru</target> +<source>Remove alternate settings</source> +<target>Odstranit jiné nastavenÃ</target> +<source>Create a batch job</source> +<target>VytvoÅ™it dávku</target> +<source>Synchronization settings</source> +<target>Nastavenà synchronizace</target> +<source>Comparison settings</source> +<target>Nastavenà porovnánÃ</target> +<source>About</source> +<target>O Programu</target> +<source>Error</source> +<target>Chyba</target> +<source>Warning</source> +<target>VarovánÃ</target> +<source>Question</source> +<target>Dotaz</target> +<source>Confirm</source> +<target>Potvrdit</target> +<source>Configure filter</source> +<target>Nastavenà filtru</target> +<source>Customize columns</source> +<target>Vlastnà sloupce</target> +<source>Global settings</source> +<target>Nastavenà programu</target> +<source>Synchronization Preview</source> +<target>Náhled synchronizace</target> +<source>Find</source> +<target>NajÃt</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x B</pluralform> +<pluralform>%x B</pluralform> +<pluralform>%x B</pluralform> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Adresář></target> +<source>Size</source> +<target>Velikost</target> +<source>Date</source> +<target>ÄŒas</target> +<source>Full path</source> +<target>Plná cesta</target> +<source>Filename</source> +<target>Jméno</target> +<source>Relative path</source> +<target>Relativnà cesta</target> +<source>Directory</source> +<target>Adresář</target> +<source>Extension</source> +<target>PÅ™Ãpona</target> +<source>Comparison Result</source> +<target>Výsledek porovnánÃ</target> +<source>Incompatible synchronization database format:</source> +<target>Chyba formátu synchronizaÄnà databáze:</target> +<source>Initial synchronization:</source> +<target>Prvotnà synchronizace:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>NÄ›který z databázových souborů FreeFileSync neexistuje:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>NÄ›která z položek databáze FreeFileSync k následujÃcÃmu souboru jeÅ¡tÄ› neexistuje:</target> +<source>Error reading from synchronization database:</source> +<target>Chyba Ätenà synchronizaÄnà databáze:</target> +<source>An exception occurred!</source> +<target>Vyskytla se chyba!</target> +<source>Error deleting file:</source> +<target>Chyba mazánà souboru:</target> +<source>Error reading file attributes:</source> +<target>Chyba Ätenà atributů souboru:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>ÄŒekánà na uzamÄenà adresáře (%x)</target> +<source>Error setting directory lock:</source> +<target>Chyba nastavenà zámku adresáře:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sekunda</pluralform> +<pluralform>%x sekundy</pluralform> +<pluralform>%x sekund</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Závažná chyba</target> +<source>File does not exist:</source> +<target>Soubor neexistuje:</target> +<source>Error parsing configuration file:</source> +<target>Chyba zpracovánà konfigurace:</target> +<source>Error writing file:</source> +<target>Chyba zápisu souboru:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Chybný konfiguraÄnà soubor FreeFileSync!</target> +<source>/sec</source> +<target>/s</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 minuta</pluralform> +<pluralform>%x minuty</pluralform> +<pluralform>%x minut</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 hodina</pluralform> +<pluralform>%x hodiny</pluralform> +<pluralform>%x hodin</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 den</pluralform> +<pluralform>%x dny</pluralform> +<pluralform>%x dnů</pluralform> +</target> +<source>S&ave configuration...</source> +<target>&Uloženà konfigurace...</target> +<source>&Load configuration...</source> +<target>&NaÄÃst konfiguraci...</target> +<source>&Quit</source> +<target>U&konÄit</target> +<source>&File</source> +<target>&Soubor</target> +<source>&Content</source> +<target>&Obsah</target> +<source>&About...</source> +<target>&O Programu...</target> +<source>&Help</source> +<target>&Pomoc</target> +<source>Usage:</source> +<target>PoužitÃ:</target> +<source>1. Select directories to monitor.</source> +<target>1. Vyberte adresáře pro sledovánÃ.</target> +<source>2. Enter a command line.</source> +<target>2. Zadejte pÅ™Ãkazovou řádku.</target> +<source>3. Press 'Start'.</source> +<target>3. ZmáÄknÄ›te 'Start'</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +PÅ™Ãkazová řádka je spuÅ¡tÄ›na pokaždé když: +- jsou k dispozici vÅ¡echny adresáře (napÅ™. vloženÃm USB disku) +- dojde ke zmÄ›nÄ› souborů v adresáři nebo podadresářÃch +</target> +<source>Directories to watch</source> +<target>Sledované adresáře</target> +<source>Add folder</source> +<target>PÅ™idat adresář</target> +<source>Remove folder</source> +<target>Odstranit adresář</target> +<source>Select a folder</source> +<target>Vyberte adresář</target> +<source>Command line</source> +<target>PÅ™Ãkazová řádka</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimálnà Äas prodlevy [v sekundách]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Prodleva mezi detekcà poslednà zmÄ›ny a spuÅ¡tÄ›nÃm pÅ™Ãkazu (v sekundách)</target> +<source>Start</source> +<target>Start</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>Konfigurace RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Soubor již existuje. PÅ™epsat?</target> +<source>&Restore</source> +<target>&Obnovit</target> +<source>&Exit</source> +<target>&Konec</target> +<source>Monitoring active...</source> +<target>Sledovánà zapnuto...</target> +<source>Waiting for missing directories...</source> +<target>ÄŒekánà na nedostupné adresáře...</target> +<source>Command line is empty!</source> +<target>PÅ™Ãkazová řádka je prázdná!</target> +<source>Could not initialize directory monitoring:</source> +<target>Nelze nastavit monitorovánà adresáře:</target> +<source>A directory input field is empty.</source> +<target>Nenà zadán vstupnà adresář.</target> +<source>Error when monitoring directories.</source> +<target>Chyba pÅ™i sledovánà adresářů.</target> +<source>Drag && drop</source> +<target>Drag && Drop</target> +<source>Conversion error:</source> +<target>Chyba konverze:</target> +<source>Error moving file:</source> +<target>Chyba pÅ™esouvánà souboru:</target> +<source>Operation aborted!</source> +<target>Operace zruÅ¡ena!</target> +<source>Target file already existing!</source> +<target>CÃlový soubor již existuje!</target> +<source>Error moving directory:</source> +<target>Chyba pÅ™esouvánà adresáře:</target> +<source>Target directory already existing!</source> +<target>CÃlový adresář již existuje!</target> +<source>Error deleting directory:</source> +<target>Chyba mazánà adresáře:</target> +<source>Error changing modification time:</source> +<target>Chyba nastavenà Äasu zmÄ›ny:</target> +<source>Error loading library function:</source> +<target>Chyba naÄtenà knihovny funkcÃ:</target> +<source>Error reading security context:</source> +<target>Chyba pÅ™i Ätenà pÅ™Ãstupových práv:</target> +<source>Error writing security context:</source> +<target>Chyba pÅ™i zápisu pÅ™Ãstupových práv:</target> +<source>Error copying file permissions:</source> +<target>Chyba kopÃrovánà oprávnÄ›nà souborů:</target> +<source>Error creating directory:</source> +<target>Chyba vytvoÅ™enà adresáře:</target> +<source>Error copying symbolic link:</source> +<target>Chyba kopÃrovánà zástupce:</target> +<source>Error copying file:</source> +<target>Chyba kopÃrovánà souboru:</target> +<source>Error opening file:</source> +<target>Chyba otevÅ™enà souboru:</target> +<source>Error reading file:</source> +<target>Chyba Ätenà souboru:</target> +<source>Endless loop when traversing directory:</source> +<target>Zacyklenà pÅ™i procházenà adresáře:</target> +<source>Error traversing directory:</source> +<target>Chyba procházenà adresáře:</target> +<source>Error setting privilege:</source> +<target>Chyba nastavenà práv:</target> +<source>Error moving to Recycle Bin:</source> +<target>Chyba pÅ™esunu do KoÅ¡e:</target> +<source>Could not load a required DLL:</source> +<target>Nelze naÄÃst požadovanou knihovnu DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Chyba zápisu synchronizaÄnà databáze:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Chyba spuÅ¡tÄ›nà služby Volume Shadow Copy Service!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Vytvářenà stÃnových kopià na WOW64 nenà podporováno. ProsÃm použijte 64 bitovou verzi FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Nenà možné zjistit jméno jednotky souboru:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Disk %x nenà souÄástà jména souboru %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Nelze naÄÃst hodnoty následujÃcÃch XML elementy:</target> +<source>Show popup</source> +<target>Zobrazit okno</target> +<source>Show popup on errors or warnings</source> +<target>Zobrazit hlášenà pÅ™i chybÄ› nebo varovánÃ</target> +<source>Ignore errors</source> +<target>Ignorovat chyby</target> +<source>Hide all error and warning messages</source> +<target>Skrýt vÅ¡echny chyby a varovánÃ</target> +<source>Exit instantly</source> +<target>UkonÄit ihned</target> +<source>Abort synchronization immediately</source> +<target>PÅ™eruÅ¡it synchronizaci ihned</target> +<source>Logging</source> +<target>ZaznamenávánÃ</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync dávkový soubor</target> +<source>FreeFileSync configuration</source> +<target>Konfigurace FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Dávkové zpracovánÃ</target> +<source>Unable to create logfile!</source> +<target>nenà možné vytvoÅ™it záznamový soubor!</target> +<source>Batch execution</source> +<target>SpuÅ¡tÄ›nà dávky</target> +<source>Log-messages:</source> +<target>Záznamy:</target> +<source>Stop</source> +<target>Stop</target> +<source>Total time:</source> +<target>Celkový Äas:</target> +<source>Synchronization aborted!</source> +<target>Synchronizace zruÅ¡ena!</target> +<source>Synchronization completed with errors!</source> +<target>Synchronizace dokonÄena s chybami.</target> +<source>Synchronization completed successfully!</source> +<target>Synchronizace dokonÄena úspěšnÄ›!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>TalÄÃtkem "PÅ™epnout" otevÅ™ete okno FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>OtevÃránà okna FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Nenà možné se pÅ™ipojit k sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Je dostupná novÄ›jÅ¡Ã verze FreeFileSync:</target> +<source>Download now?</source> +<target>Stáhnout nynÃ?</target> +<source>Information</source> +<target>Informace</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync je aktuálnÃ!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Chcete aby FreeFileSync automaticky zjiÅ¡Å¥oval aktualizace každý týden?</target> +<source>(Requires an Internet connection!)</source> +<target>(Vyžaduje pÅ™ipojenà k internetu!)</target> +<source>1. &Compare</source> +<target>1. &Porovnat</target> +<source>2. &Synchronize...</source> +<target>2. &Synchronizovat...</target> +<source>S&witch view</source> +<target>&ZmÄ›nit zobrazenÃ</target> +<source>&New</source> +<target>&Nový</target> +<source>&Program</source> +<target>&Nástroje</target> +<source>&Language</source> +<target>&Jazyk</target> +<source>&Global settings...</source> +<target>&NastavenÃ...</target> +<source>&Create batch job...</source> +<target>&VytvoÅ™it dávku...</target> +<source>&Export file list...</source> +<target>&Exportovat seznam souborů...</target> +<source>&Advanced</source> +<target>&UpÅ™esnit</target> +<source>&Check for new version</source> +<target>Zkontrolovat &aktualizace</target> +<source>Compare</source> +<target>PorovnánÃ</target> +<source>Compare both sides</source> +<target>Porovnat obÄ› strany</target> +<source>&Abort</source> +<target>&PÅ™eruÅ¡it</target> +<source>Synchronize...</source> +<target>Synchronizace</target> +<source>Start synchronization</source> +<target>Start synchronizace</target> +<source>Swap sides</source> +<target>ZmÄ›na stran</target> +<source>Add folder pair</source> +<target>PÅ™idat adresář pro porovnánÃ</target> +<source>Remove folder pair</source> +<target>Odstranit dvojici adresářů</target> +<source>Save current configuration to file</source> +<target>Uložit zmÄ›ny do konfiguraÄnÃho souboru</target> +<source>Load configuration from file</source> +<target>NaÄÃst konfiguraci ze souboru</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>PoslednÄ› použité konfigurace (pomocà DEL můžete položku smazat)</target> +<source>Hide excluded items</source> +<target>Skrýt vynechané položky</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Skrýt filtrované nebo doÄasnÄ› vynechané soubory</target> +<source>Number of files and directories that will be created</source> +<target>PoÄet souborů a adresářů k vytvoÅ™enÃ</target> +<source>Number of files that will be overwritten</source> +<target>PoÄet souborů a adresářů k pÅ™epsánÃ</target> +<source>Number of files and directories that will be deleted</source> +<target>PoÄet souborů a adresářů ke smazánÃ</target> +<source>Total amount of data that will be transferred</source> +<target>Celkový objem dat, který bude pÅ™enesen</target> +<source>Left</source> +<target>Levý</target> +<source>Right</source> +<target>Pravý</target> +<source>Batch job</source> +<target>Dávkový soubor</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>VytvoÅ™enà dávkového souboru pro automatický provoz. Ke spuÅ¡tÄ›nà dávky jednoduÅ¡e jejà jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›nà FreeFileSync: FreeFileSync.exe <batchfile>.</target> +<source>Help</source> +<target>NápovÄ›da</target> +<source>Configuration overview:</source> +<target>PÅ™ehled konfigurace:</target> +<source>Filter files</source> +<target>Filtr souborů</target> +<source>Status feedback</source> +<target>BÄ›h programu</target> +<source>Silent mode</source> +<target>Tichý mód</target> +<source>Start minimized and write status information to a logfile</source> +<target>Spustit minimalizovaný a zapisovat informace do záznamového souboru</target> +<source>Error handling</source> +<target>Zpracovánà chyb</target> +<source>Overview</source> +<target>PÅ™ehled</target> +<source>Select logfile directory:</source> +<target>Vyberte adresář pro záznamové soubory:</target> +<source>Maximum number of logfiles:</source> +<target>Maximálnà poÄet záznamových soubor</target> +<source>&Save</source> +<target>&Uložit</target> +<source>&Load</source> +<target>&NaÄÃst</target> +<source>&Cancel</source> +<target>&ZruÅ¡it</target> +<source>Elements found:</source> +<target>Nalezeno položek:</target> +<source>Elements remaining:</source> +<target>Zbývá položek:</target> +<source>Speed:</source> +<target>Rychlost:</target> +<source>Time remaining:</source> +<target>ZbývajÃcà Äas:</target> +<source>Time elapsed:</source> +<target>Uplynulý Äas:</target> +<source>Operation:</source> +<target>Operace:</target> +<source>Select variant:</source> +<target>Vyberte variantu:</target> +<source><Automatic></source> +<target><Automaticky></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Rozpoznat a provést zmÄ›ny na obou stranách pomocà databáze. OdstranÄ›né soubory a konflikty budou detekovány automaticky.</target> +<source>Mirror ->></source> +<target>Zrcadlenà ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Zrcadlenà levého adresáře. Pravý adresář bude zmÄ›nÄ›n tak, aby po synchronizaci byl totožný s levým.</target> +<source>Update -></source> +<target>Aktualizuj -></target> +<source>Copy new or updated files to right folder.</source> +<target>KopÃrovat nové nebo aktualizované soubory do adresáře vpravo.</target> +<source>Custom</source> +<target>VlastnÃ</target> +<source>Configure your own synchronization rules.</source> +<target>Nastavenà vlastnÃch pravidel synchronizace.</target> +<source>Deletion handling</source> +<target>Nastavenà mazánÃ</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Konfigurace</target> +<source>Category</source> +<target>Kategorie</target> +<source>Action</source> +<target>Akce</target> +<source>Files/folders that exist on left side only</source> +<target>Soubory/adresáře, které existujà pouze vlevo</target> +<source>Files/folders that exist on right side only</source> +<target>Soubory/adresáře, které existujà pouze vpravo</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Soubory, které existujà na obou stranách, z nichž vlevo je novÄ›jÅ¡Ã</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Soubory, které existujà na obou stranách, z nichž vpravo je novÄ›jÅ¡Ã</target> +<source>Files that have different content</source> +<target>Soubory, které majà rozdÃlný obsah</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Konflikty/soubory které nelze zaÅ™adit</target> +<source>Compare by...</source> +<target>Porovnat ...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Soubory jsou shodné jestliže + - velikost souboru + - datum i Äas poslednà zmÄ›ny +jsou stejné +</target> +<source>File size and date</source> +<target>Podle velikosti a data souboru</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Soubory jsou shodné jestliže + - obsah souboru +je stejný +</target> +<source>File content</source> +<target>Podle obsahu souboru</target> +<source>Symbolic Link handling</source> +<target>Zpracovánà symbolických odkazů</target> +<source>Synchronizing...</source> +<target>Synchronizuji...</target> +<source>Elements processed:</source> +<target>Zpracováno položek:</target> +<source>&Pause</source> +<target>&Pauza</target> +<source>Compare by "File size and date"</source> +<target>Porovnat "podle velikosti a data souboru"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Tato varianta vyhodnotà dva stejnÄ› pojmenované soubory jako shodné pokud majà i stejnou velikost A ZÃROVEŇ i datum a Äas poslednà zmÄ›ny.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Když je zahájeno porovnávánà s tÃmto nastavenÃm, je použito následujÃcà schéma rozhodovánÃ:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Jako výsledek jsou soubory rozdÄ›leny do následujÃcÃch kategoriÃ:</target> +<source>- equal</source> +<target>- stejné</target> +<source>- left newer</source> +<target>- vlevo novÄ›jÅ¡Ã</target> +<source>- right newer</source> +<target>- vpravo novÄ›jÅ¡Ã</target> +<source>- exists left only</source> +<target>- existuje pouze na levé stranÄ›</target> +<source>- exists right only</source> +<target>- existuje pouze na pravé stranÄ›</target> +<source>- conflict</source> +<target>- konflikt</target> +<source>Compare by "File content"</source> +<target>Porovnat "podle obsahu souboru"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Jak název napovÃdá, dva soubory majÃcà stejné jméno jsou oznaÄeny za shodné jen a pouze pokud majà shodný obsah. Toto nastavenà je vhodné spÃÅ¡e pro sledovánà konzistence než pro zálohovánÃ. Proto nejsou data zmÄ›n souborů brána vůbec v potaz. + +Pokud vyberete toto nastavenà bude schéma rozhodovánà kratÅ¡Ã: +</target> +<source>- different</source> +<target>- rozdÃlné</target> +<source>Source code written in C++ utilizing:</source> +<target>Zdrojový kód byl napsán kompletnÄ› v C++ s pomocÃ:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>PodÄ›kovánà za pÅ™eklad FreeFileSync:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Komentáře a námÄ›ty zasÃlejte na:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync na Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>Pokud se Vám FSS lÃbÃ</target> +<source>Donate with PayPal</source> +<target>PÅ™ispÄ›t pomocà PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Hlásit chyby pÅ™ekladu</target> +<source>Published under the GNU General Public License:</source> +<target>Vydáno podle GNU General Public License (GPL):</target> +<source>Ignore subsequent errors</source> +<target>Ignorovat dalÅ¡Ã chyby</target> +<source>Hide further error messages during the current process</source> +<target>Nezobrazovat dalÅ¡Ã chybová hlášenà bÄ›hem zpracovánÃ</target> +<source>&Ignore</source> +<target>&PokraÄovat</target> +<source>&Retry</source> +<target>&Opakovat</target> +<source>Do not show this dialog again</source> +<target>Tento dialog již nezobrazovat</target> +<source>&Switch</source> +<target>&PÅ™epnout</target> +<source>&Yes</source> +<target>&Ano</target> +<source>&No</source> +<target>&Ne</target> +<source>Delete on both sides</source> +<target>Smazat z obou stran</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich</target> +<source>Use Recycle Bin</source> +<target>PoužÃt KoÅ¡</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Pouze soubory/adresáře odpovÃdajÃcà nastavenému filtru budou vybrány pro synchronizaci. +Poznámka: Filtr je aplikován relativnÄ›(!) k cestÄ› synchronizovaných adresářů. +</target> +<source>Hints:</source> +<target>NápovÄ›da:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Můžete použÃt relativnà cesty k souboru nebo adresáři oddÄ›lené ';' nebo řádkem.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Můžete použÃt zástupné znaky (wildcard) '*' a '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Můžete použÃt pro vynechávánà souborů pÅ™Ãmo kontextového menu.</target> +<source>Example</source> +<target>PÅ™Ãklad</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +PÅ™idat: *.doc;*.zip;*.exe +Vynechat: \nÄ›kde\nÄ›co\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synchronizovat vÅ¡echny soubory .doc, .zip a .exe s výjimkou vÅ¡eho v podadresáři "nÄ›kde\nÄ›co"</target> +<source>Include</source> +<target>PÅ™idat</target> +<source>Exclude</source> +<target>Vynechat</target> +<source>Select time span:</source> +<target>PoslednÃch:</target> +<source>Minimum file size:</source> +<target>Minimálnà velikost souboru:</target> +<source>Maximum file size:</source> +<target>Minimálnà velikost souboru:</target> +<source>&Default</source> +<target>&PÅ™eddefinované</target> +<source>Move column up</source> +<target>PÅ™esunout sloupec nahoru</target> +<source>Move column down</source> +<target>PÅ™esunout sloupec dolů</target> +<source>Copy locked files</source> +<target>KopÃrovat zamÄené soubory</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +KopÃrovat sdÃlené nebo zamÄené soubory pomocà Volume Shadow Copy Service +(Vyžaduje administrátorské oprávnÄ›nÃ) +</target> +<source>Copy filesystem permissions</source> +<target>KopÃrovat oprávnÄ›nà k souborům</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů +(Vyžaduje administrátorké oprávnÄ›nÃ) +</target> +<source>Hidden dialogs:</source> +<target>Skryté dialogy:</target> +<source>Reset</source> +<target>Resetovat</target> +<source>Show hidden dialogs</source> +<target>Zobrazit skryté dialogy</target> +<source>External applications</source> +<target>Externà aplikace</target> +<source>Description</source> +<target>Popis</target> +<source>Variant</source> +<target>Varianta</target> +<source>Statistics</source> +<target>Statistika</target> +<source>Find what:</source> +<target>NajÃt:</target> +<source>Match case</source> +<target>RozliÅ¡ovat malá a velká pÃsmena</target> +<source>&Find next</source> +<target>&NajÃt dalÅ¡Ã</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Můžete se pokusit synchronizovat zbývajÃcà položky (BEZ nutnosti znovuporovnávánÃ)!</target> +<source>Batch file created successfully!</source> +<target>Dávka úspěšnÄ› vytvoÅ™ena!</target> +<source>Main bar</source> +<target>Hlavnà liÅ¡ta</target> +<source>Folder pairs</source> +<target>Adresářové páry</target> +<source>Select view</source> +<target>Vyberte zobrazenÃ</target> +<source>Folder Comparison and Synchronization</source> +<target>Porovnánà a Synchronizace adresářů</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>KoÅ¡ nenà na tomto systému zatÃm podporován!</target> +<source>Set direction:</source> +<target>Nastavit adresář:</target> +<source>Exclude temporarily</source> +<target>Vynechat doÄasnÄ›</target> +<source>Include temporarily</source> +<target>PÅ™idat doÄasnÄ›</target> +<source>Exclude via filter:</source> +<target>Vynechat pomocà filtru:</target> +<source><multiple selection></source> +<target><vÃcenásobný výbÄ›r></target> +<source>D-Click</source> +<target>Dvojklik</target> +<source>Copy to clipboard CTRL+C</source> +<target>Vložit do schránky CTRL+C</target> +<source>Delete files DEL</source> +<target>Smazat soubory DEL</target> +<source>Customize...</source> +<target>VlastnÃ....</target> +<source>Auto-adjust columns</source> +<target>Automaticky pÅ™izpůsobit Å¡ÃÅ™ku</target> +<source>Include all rows</source> +<target>PoužÃt vÅ¡echny řádky</target> +<source>Exclude all rows</source> +<target>Vynechat vÅ¡echny řádky</target> +<source>Reset view</source> +<target>Výchozà zobrazenÃ</target> +<source>Show "%x"</source> +<target>Zobrazit "%x"</target> +<source><Last session></source> +<target><Poslednà sezenÃ></target> +<source>Configuration saved!</source> +<target>Konfigurace uložena.</target> +<source>Save changes to current configuration?</source> +<target>Uložit zmÄ›ny do aktuálnà konfigurace?</target> +<source>Configuration loaded!</source> +<target>Konfigurace naÄtena.</target> +<source>Hide files that exist on left side only</source> +<target>Skrýt soubory existujÃcà pouze vlevo</target> +<source>Show files that exist on left side only</source> +<target>Zobrazit soubory existujÃcà pouze vlevo</target> +<source>Hide files that exist on right side only</source> +<target>Skrýt soubory existujÃcà pouze vpravo</target> +<source>Show files that exist on right side only</source> +<target>Zobrazit soubory existujÃcà pouze vpravo</target> +<source>Hide files that are newer on left</source> +<target>Skrýt novÄ›jÅ¡Ã zleva</target> +<source>Show files that are newer on left</source> +<target>Zobrazit soubory novÄ›jÅ¡Ã vlevo</target> +<source>Hide files that are newer on right</source> +<target>Skrýt novÄ›jÅ¡Ã zprava</target> +<source>Show files that are newer on right</source> +<target>Zobrazit soubory novÄ›jÅ¡Ã vpravo</target> +<source>Hide files that are equal</source> +<target>Skrýt shodné soubory</target> +<source>Show files that are equal</source> +<target>Zobrazit shodné soubory</target> +<source>Hide files that are different</source> +<target>Skrýt rozdÃlné soubory</target> +<source>Show files that are different</source> +<target>Zobrazit rozdÃlené soubory</target> +<source>Hide conflicts</source> +<target>Skrýt konflikty</target> +<source>Show conflicts</source> +<target>Zobrazit konflikty</target> +<source>Hide files that will be created on the left side</source> +<target>Skrýt soubory, které budou vlevo vytvoÅ™eny</target> +<source>Show files that will be created on the left side</source> +<target>Zobrazit soubory, které budou vlevo vytvoÅ™eny</target> +<source>Hide files that will be created on the right side</source> +<target>Skrýt soubory, které budou vpravo vytvoÅ™eny</target> +<source>Show files that will be created on the right side</source> +<target>Zobrazit soubory, které budou vpravo vytvoÅ™eny</target> +<source>Hide files that will be deleted on the left side</source> +<target>Skrýt soubory, které budou vlevo smazány</target> +<source>Show files that will be deleted on the left side</source> +<target>Zobrazit soubory, které budou vlevo smazány</target> +<source>Hide files that will be deleted on the right side</source> +<target>Skrýt soubory, které budou vpravo smazány</target> +<source>Show files that will be deleted on the right side</source> +<target>Zobrazit soubory, které budou vpravo smazány</target> +<source>Hide files that will be overwritten on left side</source> +<target>Skrýt soubory, které budou vlevo pÅ™epsány</target> +<source>Show files that will be overwritten on left side</source> +<target>Zobrazit soubory, které budou vlevo pÅ™epsány</target> +<source>Hide files that will be overwritten on right side</source> +<target>Skrýt soubory, které budou vpravo pÅ™epsány</target> +<source>Show files that will be overwritten on right side</source> +<target>Zobrazit soubory, které budou vpravo pÅ™epsány</target> +<source>Hide files that won't be copied</source> +<target>Skrýt soubory, které nebudou kopÃrovány</target> +<source>Show files that won't be copied</source> +<target>Zobrazit soubory, které nebudou kopÃrovány</target> +<source>All directories in sync!</source> +<target>VÅ¡echny adresáře jsou synchronizovány!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>ProsÃm proveÄte nejdÅ™Ãv porovnánà pÅ™ed synchronizacÃ!</target> +<source>Comma separated list</source> +<target>Text oddÄ›lený Äárkami</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Seznam souborů exportován!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Objekt úspěšnÄ› smazán!</pluralform> +<pluralform>%x objekty úspěšnÄ› smazány!</pluralform> +<pluralform>%x objektů úspěšnÄ› smazáno!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 adresář</pluralform> +<pluralform>%x adresáře</pluralform> +<pluralform>%x adresářů</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 soubor</pluralform> +<pluralform>%x soubory</pluralform> +<pluralform>%x souborů</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x z 1 řádku</pluralform> +<pluralform>%x z %y řádků</pluralform> +<pluralform>%x z %y řádků</pluralform> +</target> +<source>Scanning...</source> +<target>ZpracovávánÃ...</target> +<source>Comparing content...</source> +<target>Porovnávánà obsahu...</target> +<source>Paused</source> +<target>Pauza</target> +<source>Aborted</source> +<target>PÅ™eruÅ¡eno</target> +<source>Completed</source> +<target>Hotovo</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Požadavek na pÅ™eruÅ¡enÃ: ÄŒekánà na ukonÄenà aktuálnà operace...</target> +<source>Continue</source> +<target>PokraÄovat</target> +<source>Pause</source> +<target>Pauza</target> +<source>Cannot find %x</source> +<target>Nelze najÃt %x</target> +<source>DECISION TREE</source> +<target>ROZHODOVÃNÃ</target> +<source>file exists on both sides</source> +<target>soubor existuje na obou stranách</target> +<source>on one side only</source> +<target>pouze na jedné stranÄ›</target> +<source>- left</source> +<target>- vlevo</target> +<source>- right</source> +<target>- vpravo</target> +<source>different</source> +<target>rozdÃlný</target> +<source>- conflict (same date, different size)</source> +<target>- konflikt (stejné datum, jiná velikost)</target> +<source>Inactive</source> +<target>Vypnuto</target> +<source>Second</source> +<target>sekund</target> +<source>Minute</source> +<target>minut</target> +<source>Hour</source> +<target>hodin</target> +<source>Day</source> +<target>dnů</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtr: VÅ¡echny páry</target> +<source>Filter: Single pair</source> +<target>Filtr: Jeden pár</target> +<source>Ignore</source> +<target>PÅ™eskoÄit</target> +<source>Direct</source> +<target>Zachovat</target> +<source>Follow</source> +<target>PoužÃt cÃl</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrace externà aplikace do kontextového menu. K dispozici jsou následujÃcà makra:</target> +<source>- full file or directory name</source> +<target>- celá cesta nebo jméno souboru</target> +<source>- directory part only</source> +<target>- pouze cesta</target> +<source>- Other side's counterpart to %name</source> +<target>- celá cesta nebo jméno souboru z opaÄného panelu</target> +<source>- Other side's counterpart to %dir</source> +<target>- pouze cesta z opaÄného panelu</target> +<source>Restore all hidden dialogs?</source> +<target>Obnovit vÅ¡echny skryté dialogy?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Opravdu chcete pÅ™esunout následujÃcà objekt?</pluralform> +<pluralform>Opravdu chcete pÅ™esunout následujÃcà %x objekty?</pluralform> +<pluralform>Opravdu chcete pÅ™esunout následujÃcÃch %x objektů?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Opravdu chcete smazat následujÃcà objekt?</pluralform> +<pluralform>Opravdu chcete smazat následujÃcà %x objekty?</pluralform> +<pluralform>Opravdu chcete smazat následujÃcÃch %x objektů?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Ponechat jako nevyÅ™eÅ¡ený konflikt</target> +<source>Delete permanently</source> +<target>Odstranit trvale</target> +<source>Delete or overwrite files permanently</source> +<target>Smazat nebo pÅ™epsat soubory trvale</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů</target> +<source>Versioning</source> +<target>VerzovánÃ</target> +<source>Move files into a time-stamped subdirectory</source> +<target>PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře</target> +<source>Cannot determine sync-direction:</source> +<target>Nelze urÄit smÄ›r synchronizace:</target> +<source>Filter settings have changed!</source> +<target>Nastavenà filtru bylo zmÄ›nÄ›no!</target> +<source>Both sides have changed since last synchronization!</source> +<target>DoÅ¡lo ke zmÄ›nÄ› obou stran od poslednà synchronizace!</target> +<source>No change since last synchronization!</source> +<target>Žádné zmÄ›ny od poslednà synchronizace!</target> +<source>The file was not processed by last synchronization!</source> +<target>Soubor nebyl poslednà synchronizacà zpracován!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Naplánované smazánà adresáře je v konfliktu s podadresáři a/nebo soubory!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Nastaven výchozà způsob synchronizace: Staré soubory budou nahrazeny novými.</target> +<source>The file does not contain a valid configuration:</source> +<target>Soubor neobsahuje platnou konfiguraci:</target> +<source>Scanning:</source> +<target>Zpracováváno:</target> +<source>Encoding extended time information: %x</source> +<target>Zpracovánà rozÅ¡ÃÅ™ené informace o Äase: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Tuto chybu můžete ignorovat a považovat neexistujÃcà adresář jako prázdný.</target> +<source>Directory does not exist:</source> +<target>Adresář neexistuje:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Adresáře jsou závislé! BuÄte opatrnà s definicà synchronizaÄnÃch pravidel:</target> +<source>Comparing content of files %x</source> +<target>Porovnávánà obsahu souborů %x</target> +<source>Memory allocation failed!</source> +<target>Chyba pÅ™idÄ›lenà pamÄ›ti!</target> +<source>File %x has an invalid date!</source> +<target>Soubor %x má chybné datum!</target> +<source>Conflict detected:</source> +<target>Zaznamenán konflikt:</target> +<source>Files %x have the same date but a different size!</source> +<target>Soubory %x majà stejné datum a Äas ale rozdÃlnou velikost!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symbolický odkaz %x má stejné datum ale jiný cÃl!</target> +<source>Comparing files by content failed.</source> +<target>Porovnánà obsahu souborů se nezdaÅ™ilo.</target> +<source>Generating file list...</source> +<target>Vytvářenà seznamu souborů...</target> +<source>Multiple...</source> +<target>NÄ›kolikanásobný...</target> +<source>Files that are equal on both sides</source> +<target>Soubory shodné na obou stranách</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Stejné soubory/adresáře, které se liÅ¡Ã pouze ve vlastnostech</target> +<source>Copy from right to left</source> +<target>KopÃrovat z prava do leva</target> +<source>Copy from left to right</source> +<target>KopÃrovat z leva do prava</target> +<source>Delete files/folders existing on left side only</source> +<target>Smazat soubory/adresáře existujÃcà pouze na levé stranÄ›</target> +<source>Delete files/folders existing on right side only</source> +<target>Smazat soubory/adresáře existujÃcà pouze na pravé stranÄ›</target> +<source>Copy from right to left overwriting</source> +<target>KopÃrovat z prava do leva pÅ™episem</target> +<source>Copy from left to right overwriting</source> +<target>KopÃrovat z leva do prava pÅ™episem</target> +<source>Do nothing</source> +<target>Nic nedÄ›lat</target> +<source>Copy attributes only from right to left</source> +<target>KopÃrovat vlastnosti jen z prava do leva</target> +<source>Copy attributes only from left to right</source> +<target>KopÃrovat vlastnosti jen z leva do prava</target> +<source>Deleting file %x</source> +<target>Mazánà souboru %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Mazánà symbolického odkazu</target> +<source>Deleting folder %x</source> +<target>Mazánà adresáře %x</target> +<source>Moving %x to Recycle Bin</source> +<target>PÅ™esouvánà %x do KoÅ¡e.</target> +<source>Moving file %x to user-defined directory %y</source> +<target>PÅ™esouvánà souboru %x do uživatelského adresáře %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>PÅ™esouvánà adresáře %x do uživatelského adresáře %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>PÅ™esouvánà symbolického odkazu %xdo uživatelského adresáře %y</target> +<source>Copying new file %x to %y</source> +<target>KopÃrovánà nového souboru %x do %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>KopÃrovánà symbolického odkazu %x do %y</target> +<source>Overwriting file %x in %y</source> +<target>PÅ™epis souboru %x v %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>PÅ™epis symbolického odkazu %x v %y</target> +<source>Creating folder %x</source> +<target>Vytvářenà adresáře %x</target> +<source>Verifying file %x</source> +<target>Kontroluji soubor %x</target> +<source>Updating attributes of %x</source> +<target>Aktualizace atributů souboru %x</target> +<source>Source directory does not exist anymore:</source> +<target>Zdrojový adresář již neexistuje:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Podle dané konfigurace nenà co synchronizovat!</target> +<source>Target directory name must not be empty!</source> +<target>Nenà zadán cÃlový adresář!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Uživatelsky definovaný adresář pro mazánà nebyl zadán!</target> +<source>Unresolved conflicts existing!</source> +<target>NevyÅ™eÅ¡ené konflikty!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Je možné konflikt ignorovat a pokraÄovat v synchronizaci.</target> +<source>Significant difference detected:</source> +<target>Nalezeny významné zmÄ›ny:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>VÃce než polovina souborů má být zkopÃrována nebo smazána!</target> +<source>Not enough free disk space available in:</source> +<target>Nedostatek mÃsta na disku:</target> +<source>Free disk space required:</source> +<target>Požadované volné mÃsto na disku:</target> +<source>Free disk space available:</source> +<target>Volné mÃsto k dispozici:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Bude zmÄ›nÄ› adresář, který je souÄástà adresářového páru vÃcenásobného porovnánÃ! ProsÃm zkontrolujte si nastavenà synchronizace!</target> +<source>Processing folder pair:</source> +<target>Zpracovávánà adresářové páru:</target> +<source>Generating database...</source> +<target>Vytvářenà databáze...</target> +<source>Error copying locked file %x!</source> +<target>Chyba kopÃrovánà zamÄeného souboru %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Chyba verifikace dat: Zdrojový a cÃlový soubor majà rozdÃlný obsah!</target> diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index 153b9469..1c284a7a 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -1,912 +1,1027 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objecten succesvol verwijderd -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dag(en) -%x directories -%x mappen -%x files -%x bestanden -%x hour(s) -%x uur/uren -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x van de %y zichtbare rijen -%x of 1 row in view -%x van 1 zichtbare rij -%x sec -%x sec -%x% -%x% -&Abort -&Afbreken -&About... -&Informatie... -&Advanced -&Geavanceerd -&Cancel -&Annuleren -&Check for new version -&Controleer op nieuwe versie -&Content -&Inhoud -&Create batch job... -&Creëer taaklijst... -&Default -&Standaard -&Exit -&Afsluiten -&Export file list... -&Exporteer bestandslijst... -&File -&Bestand -&Find next -&Vind volgende -&Global settings... -&Algemene instellingen... -&Help -&Help -&Ignore -&Negeren -&Language -&Taal -&Load -&Laden -&Load configuration... -&Laad configuratie... -&New -&Nieuw -&No -&Nee -&OK -&OK -&Pause -&Pauze -&Program -&Programma -&Quit -&Afsluiten -&Restore -&Herstellen -&Retry -&Opnieuw proberen -&Save -&Opslaan -&Switch -&Verander -&Yes -&Ja -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Vereist een internetverbinding!) -- Other side's counterpart to %dir -- Tegenhanger andere zijde naar %dir -- Other side's counterpart to %name -- Tegenhanger andere zijde naar %naam -- conflict -- conflict -- conflict (same date, different size) -- conflict (zelfde datum, verschillende grootte) -- different -- verschillend -- directory part only -- alleen de map -- equal -- gelijk -- exists left only -- bestaat alleen links -- exists right only -- bestaat alleen rechts -- full file or directory name -- volledig bestand of mapnaam -- left -- links -- left newer -- links is nieuwer -- right -- rechts -- right newer -- rechts is nieuwer -/sec -/sec -1 directory -1 map -1 file -1 bestand -1. &Compare -1. &Vergelijk -1. Enter relative file or directory names separated by ';' or a new line. -1. Vul de relatieve bestands- of mapnaam in, gescheiden door ';' of een nieuwe regel. -1. Select directories to monitor. -1. Selecteer mappen om te observeren. -2. &Synchronize... -2. &Synchroniseer... -2. Enter a command line. -2. Geef een opdrachtregel in. -2. Use wildcard characters '*' and '?'. -2. Gebruik wildcard karakters zoals '*' en '?'. -3. Exclude files directly on main grid via context menu. -3. Sluit bestanden in het hoofdscherm direct uit via het contextmenu -3. Press 'Start'. -3. Klik op 'Start'. -<Automatic> -<Automatisch> -<Directory> -<Map> -<Last session> -<Laatste sessie> -<Symlink> -<Symlink> -<multiple selection> -<meervoudige selectie> -A directory input field is empty. -Een tekstveld over de map is leeg. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Een map wordt bewerkt die deel is van meerdere mappen! Controleer de synchronisatie instellingen! -A newer version of FreeFileSync is available: -Een nieuwe versie van FreeFileSync is beschikbaar: -Abort requested: Waiting for current operation to finish... -Bezig met afbreken: Wacht op beëindiging huidige bewerking... -Abort synchronization immediately -Stop synchronisatie onmiddelijk -Aborted -Afgebroken -About -Informatie -Action -Actie -Add folder -Map toevoegen -Add folder pair -Voeg gekoppelde mappen toe -All directories in sync! -Alle mappen zijn gesynchroniseerd! -An exception occurred! -Er heeft een uitzondering plaatsgevonden! -As a result the files are separated into the following categories: -Als resultaat worden de bestanden in de volgende categorieën gescheiden: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Zoals de naam suggereert worden twee bestanden met dezelfde naam alleen als gelijk bestempeld als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken.\n\n Met deze optie geselecteerd is de beslissingsboom korter: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Creëer een taakbestand voor automatische synchronisatie. Om in taakmodus te starten is het voldoende om de bestandsnaam achter de FreeFileSync toepassing te zetten: FreeFileSync.exe <taakbestand>. Het is ook mogelijk dit in de systeemtaakplanner in te plannen. -At least one directory input field is empty. -Er is minimaal één map invoer-veld leeg. -Auto-adjust columns -Kolommen automatisch aanpassen -Batch execution -Taak uitvoeren -Batch file created successfully! -Taakbestand is succesvol aangemaakt! -Batch job -Taaklijst -Big thanks for localizing FreeFileSync goes out to: -Extra dank voor het vertalen van FreeFileSync gaat naar: -Both sides have changed since last synchronization! -Beide zijdes zijn veranderd sinds de laatste synchronisatie! -Browse -Verkennen -Browse directory -Verken map -Cannot determine sync-direction: -Kan de synchronisatie-richting niet bepalen: -Cannot find %x -Kan %x niet vinden -Cannot write to empty directory path! +<header> + <language name>Nederlands</language name> + <translator>Dion van Lieshout</translator> + <locale>nl_NL</locale> + <flag file>holland.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> -Category -Categorie -Clear filter settings -Verwijder filter instellingen -Comma separated list -Komma gescheiden lijst -Command line -Opdrachtregel -Command line is empty! -Opdrachtregel is leeg! -Compare -Vergelijk -Compare both sides -Vergelijk beide zijdes -Compare by \"File content\" -Vergelijk met \"bestandsinhoud\" -Compare by \"File size and date\" -Vergelijk met \"bestandsgrootte en -datum\" -Compare by... -Vergelijk met... -Comparing content of files %x -De inhoud van %x bestanden wordt vergeleken -Comparing content... -Inhoud vergelijken... -Comparing files by content failed. -Bestand-inhoudvergelijking mislukt. -Comparison Result -Resultaat vergelijken -Comparison settings -Vergelijk instellingen -Completed -Volbracht -Configuration -Configuratie -Configuration loaded! -Configuratie geladen! -Configuration overview: -Configuratie overzicht: -Configuration saved! -Configuratie opgeslagen! -Configure filter -Filter configuratie -Configure your own synchronization rules. -Configureer uw eigen synchronisatieregels. -Confirm -Bevestig -Conflict detected: -Conflict gedetecteerd: -Conflicts/files that cannot be categorized -Conflicten/bestanden die niet kunnen worden gecategoriseerd -Continue -Doorgaan -Conversion error: -Converteer fout: -Copy attributes only from left to right -Kopieer attributen alleen van links naar rechts -Copy attributes only from right to left -Kopieer attributen alleen van rechts naar links -Copy filesystem permissions -Kopieer bestandssysteem toegangsrechten -Copy from left to right -Kopieer van links naar rechts -Copy from left to right overwriting -Kopieer en overschrijf van links naar rechts -Copy from right to left -Kopieer van rechts naar links -Copy from right to left overwriting -Kopieer en overschrijf van rechts naar links -Copy locked files -Kopieer vergrendelde bestanden -Copy new or updated files to right folder. -Kopieer nieuwe of geupdate bestanden naar de rechter map. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopieer gedeelde of vergrendelde bestanden met Volume Shadow Copy Service\n(Vereist Administrator rechten) -Copy to clipboard\tCTRL+C -Kopieer naar het klembord\tCTRL+C -Copying new Symbolic Link %x to %y -Kopieer nieuwe Symbolische Link van %x naar %y -Copying new file %x to %y -Kopieert nieuw bestand van %x naar %y -Could not determine volume name for file: -Kon de schijfnaam niet vaststellen van bestand: -Could not initialize directory monitoring: -Initaliseren van map-observatie niet mogelijk: -Could not load a required DLL: -Kon een benodigde DLL niet laden: -Could not read values for the following XML nodes: -Kon geen waarden inlezen voor de volgende XML punten: -Create a batch job -Creëer een taaklijst -Creating folder %x -Map %x wordt aangemaakt -Custom -Aangepast -Customize columns -Aanpassen kolommen -Customize... -Aanpassen... -D-Click -Dubbele klik -DECISION TREE -BESLISSINGSBOOM -Data verification error: Source and target file have different content! -Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud! -Date -Datum -Delete files/folders existing on left side only -Verwijder bestanden/mappen die alleen aan de linkerzijde voorkomen -Delete files/folders existing on right side only -Verwijder bestanden/mappen die alleen aan de rechterzijde voorkomen -Delete files\tDEL -Verwijder bestanden\tDEL -Delete on both sides -Verwijder aan beide zijdes -Delete on both sides even if the file is selected on one side only -Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd -Delete or overwrite files permanently -Verwijder of overschrijf bestanden onomkeerbaar -Delete permanently -Verwijder onomkeerbaar -Deleting Symbolic Link %x -Verwijderen van Symbolische Link %x -Deleting file %x -Verwijderen van bestand %x -Deleting folder %x -Verwijderen van map %x -Deletion handling -Verwijder-afhandeling -Description -Omschrijving -Direct -Direct -Directories are dependent! Be careful when setting up synchronization rules: -Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels: -Directories to watch -Mappen om te bekijken -Directory -Map -Directory does not exist: -Map bestaat niet: -Do not show this dialog again -Toon deze melding niet meer -Do nothing -Geen actie ondernemen -Do you really want to delete the following object(s)? -Weet u zeker dat u het/de volgende bestand(en) wilt verwijderen? -Do you really want to move the following object(s) to the Recycle Bin? -Weet u zeker dat u het/de volgende bestand(en) naar de prullenbak wilt verplaatsen? -Do you want FreeFileSync to automatically check for updates every week? -Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is? -Donate with PayPal -Doneer met PayPal -Download now? -Nu downloaden? -Drag && drop -Drag en drop -Elements found: -Onderdelen gevonden: -Elements processed: -Onderdelen verwerkt: -Elements remaining: -Onderdelen te gaan: -Email -E-mail -Encoding extended time information: %x -Coderen uitgebreide tijd informatie: %x -Endless loop when traversing directory: -Oneindige lus bij het doorlopen van map: -Equal files/folders that differ in attributes only -Alleen gelijke bestanden/mappen die verschillen van attributen -Error -Fout -Error changing modification time: -Fout tijdens aanpassing van de wijzigingstijd: -Error copying file permissions: -Fout tijdens kopiëren van bestandspermissies: -Error copying file: -Fout tijdens kopiëren van bestand: -Error copying locked file %x! -Fout tijdens kopiëren van vergrendeld bestand %x! -Error copying symbolic link: -Fout tijdens kopiëren van symbolische koppeling: -Error creating directory: -Fout tijdens het aanmaken van map: -Error deleting directory: -Fout tijdens het verwijderen van map: -Error deleting file: -Fout tijdens verwijderen van bestand: -Error handling -Fout afhandeling -Error loading library function: -Fout tijdens laden van bibliotheek functie: -Error moving directory: -Fout tijdens verplaatsen van map: -Error moving file: -Fout tijdens verplaatsen van bestand: -Error moving to Recycle Bin: -Fout tijdens verplaatsen naar prullenbak: -Error opening file: -Fout tijdens openen van bestand: -Error parsing configuration file: -Fout tijdens verwerking configuratiebestand: -Error reading file attributes: -Fout tijdens lezen van bestandsattributen -Error reading file: -Fout tijdens lezen van bestand: -Error reading from synchronization database: -Fout tijdens uitlezen van synchronisatie-database: -Error reading security context: -Fout tijdens lezen van beveiligingscontext: -Error resolving symbolic link: -Fout tijdens opzoeken van symbolische koppeling: -Error setting directory lock: -Fout tijdens mapvergrendeling: -Error setting privilege: -Fout tijdens instellen van privileges: -Error starting Volume Shadow Copy Service! -Fout tijdens het opstarten van de Volume Shadow Copy Service! -Error traversing directory: -Fout tijdens doorzoeken van map: -Error when monitoring directories. -Fout tijdens observeren van mappen. -Error writing file: -Fout tijdens schrijven van bestand: -Error writing security context: -Fout tijdens schrijven van beveiligingscontext: -Error writing to synchronization database: -Fout tijdens schrijven naar synchronisatie-database: -Example -Voorbeeld -Exclude -Uitsluiten -Exclude all rows -Sluit alle rijen uit -Exclude temporarily -Sluit tijdelijk uit -Exclude via filter: -Sluit via filter uit: -Exit instantly -Sluit meteen af -Extension -Extensie -External applications -Externe applicaties -Fatal Error -Fatale fout -Feedback and suggestions are welcome at: -Tips en suggesties zijn welkom op: -File %x has an invalid date! -Bestand %x heeft een ongeldige datum! -File already exists. Overwrite? -Bestand bestaat al. Overschrijven? -File content -Bestandsinhoud -File does not exist: -Bestand bestaat niet: -File list exported! -Bestandslijst geëxporteerd! -File size and date -Bestandsgrootte en -datum -Filename -Bestandsnaam -Files %x have the same date but a different size! -Bestanden %x hebben dezelfde datums maar een afwijkende grootte! -Files are found equal if\n - file content\nis the same -Bestanden worden als gelijk beschouwd indien,\n - de bestandsinhoud\novereenkomt -Files are found equal if\n - filesize\n - last write time and date\nare the same -Bestanden worden als gelijk beschouwd indien,\n - de bestandsgrootte\n - laatste wijzigingstijd en datum\novereenkomt -Files that are equal on both sides -Bestanden die aan beide zijdes gelijk zijn -Files that exist on both sides, left one is newer -Bestanden die aan beide zijdes bestaan, maar waarvan de linkerzijde nieuwer is -Files that exist on both sides, right one is newer -Bestanden die aan beide zijdes bestaan, maar waarvan de rechterzijde nieuwer is -Files that have different content -Bestanden die andere inhoud hebben -Files/folders that exist on left side only -Bestanden/mappen die alleen aan de linkerzijde bestaan -Files/folders that exist on right side only -Bestanden/mappen die alleen aan de rechterzijde bestaan -Filter files -Filter bestanden -Filter is active -Filter is actief -Filter settings have changed! -Filter instellingen zijn veranderd! -Filter: All pairs -Filter: Alle paren -Filter: Single pair -Filter: Enkel paar -Find -Vind -Find what: -Vind wat: -Folder Comparison and Synchronization -Mappen vergelijken en synchroniseren -Folder pairs -Map paren -Follow -Volg -Free disk space available: -Beschikbare vrije schijfruimte : -Free disk space required: -Vrije ruimte op harde schrijf nodig: -FreeFileSync Batch Job -FreeFileSync Taaklijst -FreeFileSync at Sourceforge -FreeFileSync op Sourceforge -FreeFileSync batch file -FreeFileSync taakbestand -FreeFileSync configuration -FreeFileSync configuratie -FreeFileSync is up to date! -U gebruikt de nieuwste versie van FreeFileSync! -Full path -Volledig pad -Generating database... -Genereren van database... -Generating file list... -Genereren van bestandslijst... -Global settings -Algemene instellingen -Help -Help -Hidden dialogs: -Verborgen dialogen: -Hide all error and warning messages -Verberg alle fout- en waarschuwingsberichten -Hide conflicts -Verberg conflicten -Hide excluded items -Verberg uitgesloten items -Hide files that are different -Verberg bestanden die verschillen -Hide files that are equal -Verberg bestanden die gelijk zijn -Hide files that are newer on left -Verberg bestanden die aan de linkerzijde nieuwer zijn -Hide files that are newer on right -Verberg bestanden die aan de rechterzijde nieuwer zijn -Hide files that exist on left side only -Verberg bestanden die alleen aan de linkerzijde bestaan -Hide files that exist on right side only -Verberg bestanden die alleen aan de rechterzijde bestaan -Hide files that will be created on the left side -Verberg bestanden die aan de linkerzijde zullen worden aangemaakt -Hide files that will be created on the right side -Verberg bestanden die aan de rechterzijde zullen worden aangemaakt -Hide files that will be deleted on the left side -Verberg bestanden die aan de linkerzijde zullen worden verwijderd -Hide files that will be deleted on the right side -Verberg bestanden die aan de rechterzijde zullen worden verwijderd -Hide files that will be overwritten on left side -Verberg bestanden die aan de linkerzijde zullen worden overschreven -Hide files that will be overwritten on right side -Verberg bestanden die aan de rechterzijde zullen worden overschreven -Hide files that won't be copied -Verberg bestanden die niet zullen worden gekopieerd -Hide filtered or temporarily excluded files -Verberg gefilterde of tijdelijk uitgesloten bestanden -Hide further error messages during the current process -Verberg eventuele foutmeldingen gedurende de huidige bewerking -Hints: -Tips: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identificeer en verwerk veranderingen aan beide zijdes dmv een database. Verwijderingen en conflicten worden automatisch gedetecteerd. -Idle time between detection of last change and execution of command line in seconds -Aantal inactieve seconden tussen detectie van de laatste verandering en uitvoering van een commando -If you like FFS -Indien FreeFileSync u bevalt -Ignore -Negeer -Ignore errors -Negeer foutmeldingen -Ignore subsequent errors -Negeer erop volgende foutmeldingen -Include -Opnemen -Include all rows -Alle rijen opnemen -Include temporarily -Tijdelijk opnemen -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Opnemen: *.doc;*.zip;*.exe\nUitsluiten: \\stuff\\temp\\* -Incompatible synchronization database format: -Opmaak van synchronisatie-database komt niet overeen: -Info -Info -Information -Informatie -Initial synchronization: -Initiële synchronisatie: -Integrate external applications into context menu. The following macros are available: -Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar: -Invalid FreeFileSync config file! -Foutief FreeFileSync configuratiebestand! -Last used configurations (press DEL to remove from list) -Laatst gebruikte instellingen (druk op DEL om iets te verwijderen) -Leave as unresolved conflict -Beschouw als onopgelost conflict -Left -Links -Legend -Legenda -Load configuration from file -Laad configuratie uit bestand -Log-messages: -Logberichten: -Logging -Loggen -Main bar -Hoofdbalk -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Het aanmaken van schaduwkopieën op WOW64 wordt niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync. -Match case -Hoofdlettergevoelig -Maximum number of logfiles: -Maximale aantal van logbestanden: -Memory allocation failed! -RAM geheugen error! -Minimum Idle Time [seconds] -Minimale inactieve tijd [seconden] -Mirror ->> -Spiegelen ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Spiegel backup van linker map. Rechter map is bewerk om precies hetzelfde te hebben na synchronisatie. -Monitoring active... -Observeren actief... -More than 50% of the total number of files will be copied or deleted! -Meer dan 50% van alle bestanden zal gekopieerd of verwijderd worden! -Move column down -Verplaats kolom naar beneden -Move column up -Verplaats kolom naar boven -Move files into a time-stamped subdirectory -Verplaats de bestanden naar een tijd-gemarkeerde submap -Moving %x to Recycle Bin -Verplaatst %x naar de Prullenbak -Moving Symbolic Link %x to user-defined directory %y -Verplaatst Symbolische Koppeling %x naar een door de gebruiker gedefinieerde map %y -Moving file %x to user-defined directory %y -Verplaatst bestand %x naar een door de gebruiker gedefinieerde map %y -Moving folder %x to user-defined directory %y -Verplaatst map %x naar een door de gebruiker gedefinieerde map %y -Multiple... -Meerdere... -No change since last synchronization! -Geen veranderingen sinds de laatste synchronisatie! -No filter selected -Geen filter geselecteerd -Not enough free disk space available in: -Niet genoeg vrije schijfruimte beschikbaar op: -Nothing to synchronize according to configuration! -Volgens de configuratie hoeft er niets gesynchroniseerd te worden! -Number of files and directories that will be created -Aantal bestanden en mappen die aangemaakt zullen worden -Number of files and directories that will be deleted -Aantal bestanden en mappen die verwijderd zullen worden -Number of files that will be overwritten -Aantal bestanden die overschreven zullen worden -One of the FreeFileSync database entries within the following file is not yet existing: -Eén van de FreeFileSync database ingangen van het volgende bestand bestaat nog niet: -One of the FreeFileSync database files is not yet existing: -Eén van de FreeFileSync database bestanden bestaat nog niet: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Alleen bestanden/mappen die het filter doorlaat zullen voor synchronisatie geselecteerd worden. Het filter wordt op de naam relatief(!) aan de basis synchronisatiemappen toegepast. -Open with Explorer -Open met Explorer -Open with default application -Open met standaardapplicatie -Operation aborted! -Bewerking afgebroken! -Operation: -Bewerking: -Overview -Overzicht -Overwriting Symbolic Link %x in %y -Overschrijft Symbolische Koppeling %x over %y -Overwriting file %x in %y -Overschrijft bestand %x over %y -Pause -Pauze -Paused -Gepauzeerd -Planned directory deletion is in conflict with its subdirectories and -files! -Geplande map verwijdering veroorzaakt een conflict met onderliggende submappen en bestanden! -Please run a Compare first before synchronizing! -Voer alstublieft eerst een Vergelijking uit voordat u synchroniseert. -Press \"Switch\" to open FreeFileSync GUI mode. -Toets \"Switch\" om FreeFileSync GUI mode te openen. -Processing folder pair: -Verwerking van gekoppelde mappen: -Published under the GNU General Public License: -Gepubliceerd onder de GNU General Public License: -Question -Vraag -RealtimeSync - Automated Synchronization -RealtimeSync - Geautomatiseerde Synchronisatie -RealtimeSync configuration -RealtimeSync configuratie -Recycle Bin not yet supported for this system! -Prullenbak is op dit systeem nog niet ondersteund! -Relative path -Relatief pad -Remove alternate settings -Verwijder alternatieve instellingen -Remove folder -Verwijder map -Remove folder pair -Verwijder gekoppelde mappen -Report translation error -Rapporteer een vertaalfout -Reset -Opnieuw instellen -Reset view -Stel weergave opnieuw in -Restore all hidden dialogs? -Alle verborgen dialogen herstellen? -Right -Rechts -S&ave configuration... -S&la configuratie op... -S&witch view -&Wijzig weergave -Save changes to current configuration? -Veranderingen opslaan in de huidige configuratie? -Save current configuration to file -Sla de huidige configuratie op in een bestand -Scanning... -Doorzoekt... -Scanning: -Doorzoekt: -Select a folder -Selecteer een map -Select alternate synchronization settings -Selecteer alternatieve synchronisatie instellingen -Select logfile directory: -Selecteer een map voor het logbestand: -Select variant: -Selecteer een variant: -Select view -Kies kijk -Set direction: -Stel richting in: -Setting default synchronization directions: Old files will be overwritten with newer files. -Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven. -Show \"%x\" -Toon \"%x\" -Show conflicts -Toon conflicten -Show files that are different -Toon bestanden die verschillend zijn -Show files that are equal -Toon bestanden die gelijk zijn -Show files that are newer on left -Toon bestanden die aan de linkerzijde nieuwer zijn -Show files that are newer on right -Toon bestanden die aan de rechterzijde nieuwer zijn -Show files that exist on left side only -Toon bestanden die alleen aan de linkerzijde bestaan -Show files that exist on right side only -Toon bestanden die alleen aan de rechterzijde bestaan -Show files that will be created on the left side -Toon bestanden die aan de linkerzijde aangemaakt zullen worden -Show files that will be created on the right side -Toon bestanden die aan de rechterzijde aangemaakt zullen worden -Show files that will be deleted on the left side -Toon bestanden die van de linkerzijde verwijderd zullen worden -Show files that will be deleted on the right side -Toon bestanden die van de rechterzijde verwijderd zullen worden -Show files that will be overwritten on left side -Toon bestanden die aan de linkerzijde overschreven zullen worden -Show files that will be overwritten on right side -Toon bestanden die aan de rechterzijde overschreven zullen worden -Show files that won't be copied -Toon bestanden die niet gekopieerd zullen worden -Show hidden dialogs -Toon verborgen dialogen -Show popup -Toon opspringvenster -Show popup on errors or warnings -Toon opspringvenster bij fouten of waarschuwingen -Significant difference detected: -Significant verschil gedetecteerd: -Silent mode -Stille modus -Size -Grootte -Source code written completely in C++ utilizing: -Broncode compleet geschreven in C++ met behulp van: -Source directory does not exist anymore: -Bronmap bestaat niet meer: -Speed: -Snelheid: -Start -Start -Start minimized and write status information to a logfile -Start geminimaliseerd en schrijf status informatie naar een logbestand -Start synchronization -Start synchronisatie -Statistics -Statistieken -Status feedback -Status terugkoppeling -Stop -Stop -Swap sides -Wissel zijdes -Switching to FreeFileSync GUI mode... -Schakelt over naar FreeFileSync GUI mode... -Symbolic Link handling -Symbolische Koppeling afhandeling -Symlinks %x have the same date but a different target! -Symbolische koppeling %x heeft dezelfde datum maar een ander doel! -Synchronization Preview -Synchronisatie voorbeeldweergave -Synchronization aborted! -Synchronisatie afgebroken! -Synchronization completed successfully! -Synchronisatie succesvol afgerond! -Synchronization completed with errors! -Synchronisatie is met fouten afgerond! -Synchronization settings -Synchronisatie instellingen -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchroniseer alle .doc, .zip en .exe bestanden behalve wat in submap \"temp\" staat. -Synchronize... -Synchroniseer... -Synchronizing... -Synchroniseert... -Target directory already existing! -Doelmap bestaat al! -Target file already existing! -Doelbestand bestaat al! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -De opdrachtregel wordt telkens uitgevoerd indien:\n- alle mappen beschikbaar worden (bijv. invoegen van USB stick)\n- bestanden binnen deze mappen of submappen veranderd zijn -The file does not contain a valid configuration: -Het bestand bevat geen geldige configuratie: -The file was not processed by last synchronization! -Het bestand werd niet verwerkt tijdens de laatste synchronisatie! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Deze variant beschouwt twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN dezelfde datum en tijdstempel hebben. -Time -Tijd -Time elapsed: -Verstreken tijd: -Time remaining: -Benodigde tijd: -Total amount of data that will be transferred -Totale hoeveelheid data die verplaatst wordt -Total time: -Totale tijd: -Transfer file and directory permissions\n(Requires Administrator rights) -Zet bestand en map permissies over\n(Vereist Administrator rechten) -Unable to connect to sourceforge.net! -Niet in staat verbinding te maken met sourceforge.net! -Unable to create logfile! -Niet in staat om een logbestand aan te maken! -Unresolved conflicts existing! -Er bestaan onopgeloste conflicten! -Update -> -Bijwerken -> -Updating attributes of %x -Attributen bijwerken van %x -Usage: -Gebruik: -Use Recycle Bin -Gebruik de prullenbak -Use Recycle Bin when deleting or overwriting files -Gebruik de prullenbak bij verwijderen of overschrijven van bestanden -User-defined directory for deletion was not specified! -De door de gebruiker gedefinieerde map ter verwijdering was niet opgegeven! -Variant -Variant -Verifying file %x -Verifieert bestand %x -Versioning -Versieën -Volume name %x not part of filename %y! -Schijfnaam %x maakt geen deel uit van bestandsnaam %y! -Waiting for missing directories... -Wacht op missende mappen... -Waiting while directory is locked (%x)... -Wacht totdat map is vergrendeld (%x)... -Warning -Waarschuwing -When the comparison is started with this option set the following decision tree is processed: -Wanneer de vergelijking met deze optie aan gestart wordt zal de volgende besluitboom gehanteerd worden: -You can ignore conflicts and continue synchronization. -U kunt de conflicten negeren en doorgaan met synchronisatie. -You can ignore this error to consider the directory as empty. -Je kan deze error negeren als de map leeg is. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -U kunt proberen om de resterende items opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)! -different -verschillend -file exists on both sides -bestand bestaat aan beide zijdes -on one side only -alleen aan één zijde +<source>Show in Explorer</source> +<target></target> +<source>Open with default application</source> +<target>Open met standaardapplicatie</target> +<source>Browse directory</source> +<target>Verken map</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Geautomatiseerde Synchronisatie</target> +<source>Browse</source> +<target>Verkennen</target> +<source>Error resolving symbolic link:</source> +<target>Fout tijdens opzoeken van symbolische koppeling:</target> +<source>Select alternate synchronization settings</source> +<target>Selecteer alternatieve synchronisatie instellingen</target> +<source>No filter selected</source> +<target>Geen filter geselecteerd</target> +<source>Filter is active</source> +<target>Filter is actief</target> +<source>Clear filter settings</source> +<target>Verwijder filter instellingen</target> +<source>Remove alternate settings</source> +<target>Verwijder alternatieve instellingen</target> +<source>Create a batch job</source> +<target>Creëer een taaklijst</target> +<source>Synchronization settings</source> +<target>Synchronisatie instellingen</target> +<source>Comparison settings</source> +<target>Vergelijk instellingen</target> +<source>About</source> +<target>Informatie</target> +<source>Error</source> +<target>Fout</target> +<source>Warning</source> +<target>Waarschuwing</target> +<source>Question</source> +<target>Vraag</target> +<source>Confirm</source> +<target>Bevestig</target> +<source>Configure filter</source> +<target>Filter configuratie</target> +<source>Customize columns</source> +<target>Aanpassen kolommen</target> +<source>Global settings</source> +<target>Algemene instellingen</target> +<source>Synchronization Preview</source> +<target>Synchronisatie voorbeeldweergave</target> +<source>Find</source> +<target>Vind</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target></target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Map></target> +<source>Size</source> +<target>Grootte</target> +<source>Date</source> +<target>Datum</target> +<source>Full path</source> +<target>Volledig pad</target> +<source>Filename</source> +<target>Bestandsnaam</target> +<source>Relative path</source> +<target>Relatief pad</target> +<source>Directory</source> +<target>Map</target> +<source>Extension</source> +<target>Extensie</target> +<source>Comparison Result</source> +<target>Resultaat vergelijken</target> +<source>Incompatible synchronization database format:</source> +<target>Opmaak van synchronisatie-database komt niet overeen:</target> +<source>Initial synchronization:</source> +<target>Initiële synchronisatie:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Eén van de FreeFileSync database bestanden bestaat nog niet:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Eén van de FreeFileSync database ingangen van het volgende bestand bestaat nog niet:</target> +<source>Error reading from synchronization database:</source> +<target>Fout tijdens uitlezen van synchronisatie-database:</target> +<source>An exception occurred!</source> +<target>Er heeft een uitzondering plaatsgevonden!</target> +<source>Error deleting file:</source> +<target>Fout tijdens verwijderen van bestand:</target> +<source>Error reading file attributes:</source> +<target>Fout tijdens lezen van bestandsattributen</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Wacht totdat map is vergrendeld (%x)...</target> +<source>Error setting directory lock:</source> +<target>Fout tijdens mapvergrendeling:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Fatale fout</target> +<source>File does not exist:</source> +<target>Bestand bestaat niet:</target> +<source>Error parsing configuration file:</source> +<target>Fout tijdens verwerking configuratiebestand:</target> +<source>Error writing file:</source> +<target>Fout tijdens schrijven van bestand:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Foutief FreeFileSync configuratiebestand!</target> +<source>/sec</source> +<target>/sec</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +</target> +<source>S&ave configuration...</source> +<target>S&la configuratie op...</target> +<source>&Load configuration...</source> +<target>&Laad configuratie...</target> +<source>&Quit</source> +<target>&Afsluiten</target> +<source>&File</source> +<target>&Bestand</target> +<source>&Content</source> +<target>&Inhoud</target> +<source>&About...</source> +<target>&Informatie...</target> +<source>&Help</source> +<target>&Help</target> +<source>Usage:</source> +<target>Gebruik:</target> +<source>1. Select directories to monitor.</source> +<target>1. Selecteer mappen om te observeren.</target> +<source>2. Enter a command line.</source> +<target>2. Geef een opdrachtregel in.</target> +<source>3. Press 'Start'.</source> +<target>3. Klik op 'Start'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +De opdrachtregel wordt telkens uitgevoerd indien: +- alle mappen beschikbaar worden (bijv. invoegen van USB stick) +- bestanden binnen deze mappen of submappen veranderd zijn +</target> +<source>Directories to watch</source> +<target>Mappen om te bekijken</target> +<source>Add folder</source> +<target>Map toevoegen</target> +<source>Remove folder</source> +<target>Verwijder map</target> +<source>Select a folder</source> +<target>Selecteer een map</target> +<source>Command line</source> +<target>Opdrachtregel</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimale inactieve tijd [seconden]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Aantal inactieve seconden tussen detectie van de laatste verandering en uitvoering van een commando</target> +<source>Start</source> +<target>Start</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync configuratie</target> +<source>File already exists. Overwrite?</source> +<target>Bestand bestaat al. Overschrijven?</target> +<source>&Restore</source> +<target>&Herstellen</target> +<source>&Exit</source> +<target>&Afsluiten</target> +<source>Monitoring active...</source> +<target>Observeren actief...</target> +<source>Waiting for missing directories...</source> +<target>Wacht op missende mappen...</target> +<source>Command line is empty!</source> +<target>Opdrachtregel is leeg!</target> +<source>Could not initialize directory monitoring:</source> +<target>Initaliseren van map-observatie niet mogelijk:</target> +<source>A directory input field is empty.</source> +<target>Een tekstveld over de map is leeg.</target> +<source>Error when monitoring directories.</source> +<target>Fout tijdens observeren van mappen.</target> +<source>Drag && drop</source> +<target>Drag en drop</target> +<source>Conversion error:</source> +<target>Converteer fout:</target> +<source>Error moving file:</source> +<target>Fout tijdens verplaatsen van bestand:</target> +<source>Operation aborted!</source> +<target>Bewerking afgebroken!</target> +<source>Target file already existing!</source> +<target>Doelbestand bestaat al!</target> +<source>Error moving directory:</source> +<target>Fout tijdens verplaatsen van map:</target> +<source>Target directory already existing!</source> +<target>Doelmap bestaat al!</target> +<source>Error deleting directory:</source> +<target>Fout tijdens het verwijderen van map:</target> +<source>Error changing modification time:</source> +<target>Fout tijdens aanpassing van de wijzigingstijd:</target> +<source>Error loading library function:</source> +<target>Fout tijdens laden van bibliotheek functie:</target> +<source>Error reading security context:</source> +<target>Fout tijdens lezen van beveiligingscontext:</target> +<source>Error writing security context:</source> +<target>Fout tijdens schrijven van beveiligingscontext:</target> +<source>Error copying file permissions:</source> +<target>Fout tijdens kopiëren van bestandspermissies:</target> +<source>Error creating directory:</source> +<target>Fout tijdens het aanmaken van map:</target> +<source>Error copying symbolic link:</source> +<target>Fout tijdens kopiëren van symbolische koppeling:</target> +<source>Error copying file:</source> +<target>Fout tijdens kopiëren van bestand:</target> +<source>Error opening file:</source> +<target>Fout tijdens openen van bestand:</target> +<source>Error reading file:</source> +<target>Fout tijdens lezen van bestand:</target> +<source>Endless loop when traversing directory:</source> +<target>Oneindige lus bij het doorlopen van map:</target> +<source>Error traversing directory:</source> +<target>Fout tijdens doorzoeken van map:</target> +<source>Error setting privilege:</source> +<target>Fout tijdens instellen van privileges:</target> +<source>Error moving to Recycle Bin:</source> +<target>Fout tijdens verplaatsen naar prullenbak:</target> +<source>Could not load a required DLL:</source> +<target>Kon een benodigde DLL niet laden:</target> +<source>Error writing to synchronization database:</source> +<target>Fout tijdens schrijven naar synchronisatie-database:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Fout tijdens het opstarten van de Volume Shadow Copy Service!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Het aanmaken van schaduwkopieën op WOW64 wordt niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Kon de schijfnaam niet vaststellen van bestand:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Schijfnaam %x maakt geen deel uit van bestandsnaam %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Kon geen waarden inlezen voor de volgende XML punten:</target> +<source>Show popup</source> +<target>Toon opspringvenster</target> +<source>Show popup on errors or warnings</source> +<target>Toon opspringvenster bij fouten of waarschuwingen</target> +<source>Ignore errors</source> +<target>Negeer foutmeldingen</target> +<source>Hide all error and warning messages</source> +<target>Verberg alle fout- en waarschuwingsberichten</target> +<source>Exit instantly</source> +<target>Sluit meteen af</target> +<source>Abort synchronization immediately</source> +<target>Stop synchronisatie onmiddelijk</target> +<source>Logging</source> +<target>Loggen</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync taakbestand</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync configuratie</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Taaklijst</target> +<source>Unable to create logfile!</source> +<target>Niet in staat om een logbestand aan te maken!</target> +<source>Batch execution</source> +<target>Taak uitvoeren</target> +<source>Log-messages:</source> +<target>Logberichten:</target> +<source>Stop</source> +<target>Stop</target> +<source>Total time:</source> +<target>Totale tijd:</target> +<source>Synchronization aborted!</source> +<target>Synchronisatie afgebroken!</target> +<source>Synchronization completed with errors!</source> +<target>Synchronisatie is met fouten afgerond!</target> +<source>Synchronization completed successfully!</source> +<target>Synchronisatie succesvol afgerond!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Toets "Switch" om FreeFileSync GUI mode te openen.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Schakelt over naar FreeFileSync GUI mode...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Niet in staat verbinding te maken met sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Een nieuwe versie van FreeFileSync is beschikbaar:</target> +<source>Download now?</source> +<target>Nu downloaden?</target> +<source>Information</source> +<target>Informatie</target> +<source>FreeFileSync is up to date!</source> +<target>U gebruikt de nieuwste versie van FreeFileSync!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is?</target> +<source>(Requires an Internet connection!)</source> +<target>(Vereist een internetverbinding!)</target> +<source>1. &Compare</source> +<target>1. &Vergelijk</target> +<source>2. &Synchronize...</source> +<target>2. &Synchroniseer...</target> +<source>S&witch view</source> +<target>&Wijzig weergave</target> +<source>&New</source> +<target>&Nieuw</target> +<source>&Program</source> +<target>&Programma</target> +<source>&Language</source> +<target>&Taal</target> +<source>&Global settings...</source> +<target>&Algemene instellingen...</target> +<source>&Create batch job...</source> +<target>&Creëer taaklijst...</target> +<source>&Export file list...</source> +<target>&Exporteer bestandslijst...</target> +<source>&Advanced</source> +<target>&Geavanceerd</target> +<source>&Check for new version</source> +<target>&Controleer op nieuwe versie</target> +<source>Compare</source> +<target>Vergelijk</target> +<source>Compare both sides</source> +<target>Vergelijk beide zijdes</target> +<source>&Abort</source> +<target>&Afbreken</target> +<source>Synchronize...</source> +<target>Synchroniseer...</target> +<source>Start synchronization</source> +<target>Start synchronisatie</target> +<source>Swap sides</source> +<target>Wissel zijdes</target> +<source>Add folder pair</source> +<target>Voeg gekoppelde mappen toe</target> +<source>Remove folder pair</source> +<target>Verwijder gekoppelde mappen</target> +<source>Save current configuration to file</source> +<target>Sla de huidige configuratie op in een bestand</target> +<source>Load configuration from file</source> +<target>Laad configuratie uit bestand</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target> +<source>Hide excluded items</source> +<target>Verberg uitgesloten items</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Verberg gefilterde of tijdelijk uitgesloten bestanden</target> +<source>Number of files and directories that will be created</source> +<target>Aantal bestanden en mappen die aangemaakt zullen worden</target> +<source>Number of files that will be overwritten</source> +<target>Aantal bestanden die overschreven zullen worden</target> +<source>Number of files and directories that will be deleted</source> +<target>Aantal bestanden en mappen die verwijderd zullen worden</target> +<source>Total amount of data that will be transferred</source> +<target>Totale hoeveelheid data die verplaatst wordt</target> +<source>Left</source> +<target>Links</target> +<source>Right</source> +<target>Rechts</target> +<source>Batch job</source> +<target>Taaklijst</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Creëer een taakbestand voor automatische synchronisatie. Om in taakmodus te starten is het voldoende om de bestandsnaam achter de FreeFileSync toepassing te zetten: FreeFileSync.exe <taakbestand>. Het is ook mogelijk dit in de systeemtaakplanner in te plannen.</target> +<source>Help</source> +<target>Help</target> +<source>Configuration overview:</source> +<target>Configuratie overzicht:</target> +<source>Filter files</source> +<target>Filter bestanden</target> +<source>Status feedback</source> +<target>Status terugkoppeling</target> +<source>Silent mode</source> +<target>Stille modus</target> +<source>Start minimized and write status information to a logfile</source> +<target>Start geminimaliseerd en schrijf status informatie naar een logbestand</target> +<source>Error handling</source> +<target>Fout afhandeling</target> +<source>Overview</source> +<target>Overzicht</target> +<source>Select logfile directory:</source> +<target>Selecteer een map voor het logbestand:</target> +<source>Maximum number of logfiles:</source> +<target>Maximale aantal van logbestanden:</target> +<source>&Save</source> +<target>&Opslaan</target> +<source>&Load</source> +<target>&Laden</target> +<source>&Cancel</source> +<target>&Annuleren</target> +<source>Elements found:</source> +<target>Onderdelen gevonden:</target> +<source>Elements remaining:</source> +<target>Onderdelen te gaan:</target> +<source>Speed:</source> +<target>Snelheid:</target> +<source>Time remaining:</source> +<target>Benodigde tijd:</target> +<source>Time elapsed:</source> +<target>Verstreken tijd:</target> +<source>Operation:</source> +<target>Bewerking:</target> +<source>Select variant:</source> +<target>Selecteer een variant:</target> +<source><Automatic></source> +<target><Automatisch></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identificeer en verwerk veranderingen aan beide zijdes dmv een database. Verwijderingen en conflicten worden automatisch gedetecteerd.</target> +<source>Mirror ->></source> +<target>Spiegelen ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Spiegel backup van linker map. Rechter map is bewerk om precies hetzelfde te hebben na synchronisatie.</target> +<source>Update -></source> +<target>Bijwerken -></target> +<source>Copy new or updated files to right folder.</source> +<target>Kopieer nieuwe of geupdate bestanden naar de rechter map.</target> +<source>Custom</source> +<target>Aangepast</target> +<source>Configure your own synchronization rules.</source> +<target>Configureer uw eigen synchronisatieregels.</target> +<source>Deletion handling</source> +<target>Verwijder-afhandeling</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuratie</target> +<source>Category</source> +<target>Categorie</target> +<source>Action</source> +<target>Actie</target> +<source>Files/folders that exist on left side only</source> +<target>Bestanden/mappen die alleen aan de linkerzijde bestaan</target> +<source>Files/folders that exist on right side only</source> +<target>Bestanden/mappen die alleen aan de rechterzijde bestaan</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Bestanden die aan beide zijdes bestaan, maar waarvan de linkerzijde nieuwer is</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Bestanden die aan beide zijdes bestaan, maar waarvan de rechterzijde nieuwer is</target> +<source>Files that have different content</source> +<target>Bestanden die andere inhoud hebben</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflicten/bestanden die niet kunnen worden gecategoriseerd</target> +<source>Compare by...</source> +<target>Vergelijk met...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Bestanden worden als gelijk beschouwd indien, + - de bestandsgrootte + - laatste wijzigingstijd en datum +overeenkomt +</target> +<source>File size and date</source> +<target>Bestandsgrootte en -datum</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Bestanden worden als gelijk beschouwd indien, + - de bestandsinhoud +overeenkomt +</target> +<source>File content</source> +<target>Bestandsinhoud</target> +<source>Symbolic Link handling</source> +<target>Symbolische Koppeling afhandeling</target> +<source>Synchronizing...</source> +<target>Synchroniseert...</target> +<source>Elements processed:</source> +<target>Onderdelen verwerkt:</target> +<source>&Pause</source> +<target>&Pauze</target> +<source>Compare by "File size and date"</source> +<target>Vergelijk met "bestandsgrootte en -datum"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Deze variant beschouwt twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN dezelfde datum en tijdstempel hebben.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Wanneer de vergelijking met deze optie aan gestart wordt zal de volgende besluitboom gehanteerd worden:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Als resultaat worden de bestanden in de volgende categorieën gescheiden:</target> +<source>- equal</source> +<target>- gelijk</target> +<source>- left newer</source> +<target>- links is nieuwer</target> +<source>- right newer</source> +<target>- rechts is nieuwer</target> +<source>- exists left only</source> +<target>- bestaat alleen links</target> +<source>- exists right only</source> +<target>- bestaat alleen rechts</target> +<source>- conflict</source> +<target>- conflict</target> +<source>Compare by "File content"</source> +<target>Vergelijk met "bestandsinhoud"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Zoals de naam suggereert worden twee bestanden met dezelfde naam alleen als gelijk bestempeld als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken. + + Met deze optie geselecteerd is de beslissingsboom korter: +</target> +<source>- different</source> +<target>- verschillend</target> +<source>Source code written in C++ utilizing:</source> +<target></target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Extra dank voor het vertalen van FreeFileSync gaat naar:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Tips en suggesties zijn welkom op:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync op Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>Indien FreeFileSync u bevalt</target> +<source>Donate with PayPal</source> +<target>Doneer met PayPal</target> +<source>Email</source> +<target>E-mail</target> +<source>Report translation error</source> +<target>Rapporteer een vertaalfout</target> +<source>Published under the GNU General Public License:</source> +<target>Gepubliceerd onder de GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Negeer erop volgende foutmeldingen</target> +<source>Hide further error messages during the current process</source> +<target>Verberg eventuele foutmeldingen gedurende de huidige bewerking</target> +<source>&Ignore</source> +<target>&Negeren</target> +<source>&Retry</source> +<target>&Opnieuw proberen</target> +<source>Do not show this dialog again</source> +<target>Toon deze melding niet meer</target> +<source>&Switch</source> +<target>&Verander</target> +<source>&Yes</source> +<target>&Ja</target> +<source>&No</source> +<target>&Nee</target> +<source>Delete on both sides</source> +<target>Verwijder aan beide zijdes</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd</target> +<source>Use Recycle Bin</source> +<target>Gebruik de prullenbak</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target></target> +<source>Hints:</source> +<target>Tips:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Vul de relatieve bestands- of mapnaam in, gescheiden door ';' of een nieuwe regel.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Gebruik wildcard karakters zoals '*' en '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Sluit bestanden in het hoofdscherm direct uit via het contextmenu</target> +<source>Example</source> +<target>Voorbeeld</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target></target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synchroniseer alle .doc, .zip en .exe bestanden behalve wat in submap "temp" staat.</target> +<source>Include</source> +<target>Opnemen</target> +<source>Exclude</source> +<target>Uitsluiten</target> +<source>Select time span:</source> +<target></target> +<source>Minimum file size:</source> +<target></target> +<source>Maximum file size:</source> +<target></target> +<source>&Default</source> +<target>&Standaard</target> +<source>Move column up</source> +<target>Verplaats kolom naar boven</target> +<source>Move column down</source> +<target>Verplaats kolom naar beneden</target> +<source>Copy locked files</source> +<target>Kopieer vergrendelde bestanden</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopieer gedeelde of vergrendelde bestanden met Volume Shadow Copy Service +(Vereist Administrator rechten) +</target> +<source>Copy filesystem permissions</source> +<target>Kopieer bestandssysteem toegangsrechten</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Zet bestand en map permissies over +(Vereist Administrator rechten) +</target> +<source>Hidden dialogs:</source> +<target>Verborgen dialogen:</target> +<source>Reset</source> +<target>Opnieuw instellen</target> +<source>Show hidden dialogs</source> +<target>Toon verborgen dialogen</target> +<source>External applications</source> +<target>Externe applicaties</target> +<source>Description</source> +<target>Omschrijving</target> +<source>Variant</source> +<target>Variant</target> +<source>Statistics</source> +<target>Statistieken</target> +<source>Find what:</source> +<target>Vind wat:</target> +<source>Match case</source> +<target>Hoofdlettergevoelig</target> +<source>&Find next</source> +<target>&Vind volgende</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>U kunt proberen om de resterende items opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)!</target> +<source>Batch file created successfully!</source> +<target>Taakbestand is succesvol aangemaakt!</target> +<source>Main bar</source> +<target>Hoofdbalk</target> +<source>Folder pairs</source> +<target>Map paren</target> +<source>Select view</source> +<target>Kies kijk</target> +<source>Folder Comparison and Synchronization</source> +<target>Mappen vergelijken en synchroniseren</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Prullenbak is op dit systeem nog niet ondersteund!</target> +<source>Set direction:</source> +<target>Stel richting in:</target> +<source>Exclude temporarily</source> +<target>Sluit tijdelijk uit</target> +<source>Include temporarily</source> +<target>Tijdelijk opnemen</target> +<source>Exclude via filter:</source> +<target>Sluit via filter uit:</target> +<source><multiple selection></source> +<target><meervoudige selectie></target> +<source>D-Click</source> +<target>Dubbele klik</target> +<source>Copy to clipboard CTRL+C</source> +<target>Kopieer naar het klembord CTRL+C</target> +<source>Delete files DEL</source> +<target>Verwijder bestanden DEL</target> +<source>Customize...</source> +<target>Aanpassen...</target> +<source>Auto-adjust columns</source> +<target>Kolommen automatisch aanpassen</target> +<source>Include all rows</source> +<target>Alle rijen opnemen</target> +<source>Exclude all rows</source> +<target>Sluit alle rijen uit</target> +<source>Reset view</source> +<target>Stel weergave opnieuw in</target> +<source>Show "%x"</source> +<target>Toon "%x"</target> +<source><Last session></source> +<target><Laatste sessie></target> +<source>Configuration saved!</source> +<target>Configuratie opgeslagen!</target> +<source>Save changes to current configuration?</source> +<target>Veranderingen opslaan in de huidige configuratie?</target> +<source>Configuration loaded!</source> +<target>Configuratie geladen!</target> +<source>Hide files that exist on left side only</source> +<target>Verberg bestanden die alleen aan de linkerzijde bestaan</target> +<source>Show files that exist on left side only</source> +<target>Toon bestanden die alleen aan de linkerzijde bestaan</target> +<source>Hide files that exist on right side only</source> +<target>Verberg bestanden die alleen aan de rechterzijde bestaan</target> +<source>Show files that exist on right side only</source> +<target>Toon bestanden die alleen aan de rechterzijde bestaan</target> +<source>Hide files that are newer on left</source> +<target>Verberg bestanden die aan de linkerzijde nieuwer zijn</target> +<source>Show files that are newer on left</source> +<target>Toon bestanden die aan de linkerzijde nieuwer zijn</target> +<source>Hide files that are newer on right</source> +<target>Verberg bestanden die aan de rechterzijde nieuwer zijn</target> +<source>Show files that are newer on right</source> +<target>Toon bestanden die aan de rechterzijde nieuwer zijn</target> +<source>Hide files that are equal</source> +<target>Verberg bestanden die gelijk zijn</target> +<source>Show files that are equal</source> +<target>Toon bestanden die gelijk zijn</target> +<source>Hide files that are different</source> +<target>Verberg bestanden die verschillen</target> +<source>Show files that are different</source> +<target>Toon bestanden die verschillend zijn</target> +<source>Hide conflicts</source> +<target>Verberg conflicten</target> +<source>Show conflicts</source> +<target>Toon conflicten</target> +<source>Hide files that will be created on the left side</source> +<target>Verberg bestanden die aan de linkerzijde zullen worden aangemaakt</target> +<source>Show files that will be created on the left side</source> +<target>Toon bestanden die aan de linkerzijde aangemaakt zullen worden</target> +<source>Hide files that will be created on the right side</source> +<target>Verberg bestanden die aan de rechterzijde zullen worden aangemaakt</target> +<source>Show files that will be created on the right side</source> +<target>Toon bestanden die aan de rechterzijde aangemaakt zullen worden</target> +<source>Hide files that will be deleted on the left side</source> +<target>Verberg bestanden die aan de linkerzijde zullen worden verwijderd</target> +<source>Show files that will be deleted on the left side</source> +<target>Toon bestanden die van de linkerzijde verwijderd zullen worden</target> +<source>Hide files that will be deleted on the right side</source> +<target>Verberg bestanden die aan de rechterzijde zullen worden verwijderd</target> +<source>Show files that will be deleted on the right side</source> +<target>Toon bestanden die van de rechterzijde verwijderd zullen worden</target> +<source>Hide files that will be overwritten on left side</source> +<target>Verberg bestanden die aan de linkerzijde zullen worden overschreven</target> +<source>Show files that will be overwritten on left side</source> +<target>Toon bestanden die aan de linkerzijde overschreven zullen worden</target> +<source>Hide files that will be overwritten on right side</source> +<target>Verberg bestanden die aan de rechterzijde zullen worden overschreven</target> +<source>Show files that will be overwritten on right side</source> +<target>Toon bestanden die aan de rechterzijde overschreven zullen worden</target> +<source>Hide files that won't be copied</source> +<target>Verberg bestanden die niet zullen worden gekopieerd</target> +<source>Show files that won't be copied</source> +<target>Toon bestanden die niet gekopieerd zullen worden</target> +<source>All directories in sync!</source> +<target>Alle mappen zijn gesynchroniseerd!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Voer alstublieft eerst een Vergelijking uit voordat u synchroniseert.</target> +<source>Comma separated list</source> +<target>Komma gescheiden lijst</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Bestandslijst geëxporteerd!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +</target> +<source>Scanning...</source> +<target>Doorzoekt...</target> +<source>Comparing content...</source> +<target>Inhoud vergelijken...</target> +<source>Paused</source> +<target>Gepauzeerd</target> +<source>Aborted</source> +<target>Afgebroken</target> +<source>Completed</source> +<target>Volbracht</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Bezig met afbreken: Wacht op beëindiging huidige bewerking...</target> +<source>Continue</source> +<target>Doorgaan</target> +<source>Pause</source> +<target>Pauze</target> +<source>Cannot find %x</source> +<target>Kan %x niet vinden</target> +<source>DECISION TREE</source> +<target>BESLISSINGSBOOM</target> +<source>file exists on both sides</source> +<target>bestand bestaat aan beide zijdes</target> +<source>on one side only</source> +<target>alleen aan één zijde</target> +<source>- left</source> +<target>- links</target> +<source>- right</source> +<target>- rechts</target> +<source>different</source> +<target>verschillend</target> +<source>- conflict (same date, different size)</source> +<target>- conflict (zelfde datum, verschillende grootte)</target> +<source>Inactive</source> +<target></target> +<source>Second</source> +<target></target> +<source>Minute</source> +<target></target> +<source>Hour</source> +<target></target> +<source>Day</source> +<target></target> +<source>Byte</source> +<target></target> +<source>KB</source> +<target></target> +<source>MB</source> +<target></target> +<source>Filter: All pairs</source> +<target>Filter: Alle paren</target> +<source>Filter: Single pair</source> +<target>Filter: Enkel paar</target> +<source>Ignore</source> +<target>Negeer</target> +<source>Direct</source> +<target>Direct</target> +<source>Follow</source> +<target>Volg</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar:</target> +<source>- full file or directory name</source> +<target>- volledig bestand of mapnaam</target> +<source>- directory part only</source> +<target>- alleen de map</target> +<source>- Other side's counterpart to %name</source> +<target>- Tegenhanger andere zijde naar %naam</target> +<source>- Other side's counterpart to %dir</source> +<target>- Tegenhanger andere zijde naar %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Alle verborgen dialogen herstellen?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +</target> +<source>Leave as unresolved conflict</source> +<target>Beschouw als onopgelost conflict</target> +<source>Delete permanently</source> +<target>Verwijder onomkeerbaar</target> +<source>Delete or overwrite files permanently</source> +<target>Verwijder of overschrijf bestanden onomkeerbaar</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target> +<source>Versioning</source> +<target>Versieën</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Verplaats de bestanden naar een tijd-gemarkeerde submap</target> +<source>Cannot determine sync-direction:</source> +<target>Kan de synchronisatie-richting niet bepalen:</target> +<source>Filter settings have changed!</source> +<target>Filter instellingen zijn veranderd!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Beide zijdes zijn veranderd sinds de laatste synchronisatie!</target> +<source>No change since last synchronization!</source> +<target>Geen veranderingen sinds de laatste synchronisatie!</target> +<source>The file was not processed by last synchronization!</source> +<target>Het bestand werd niet verwerkt tijdens de laatste synchronisatie!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Geplande map verwijdering veroorzaakt een conflict met onderliggende submappen en bestanden!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven.</target> +<source>The file does not contain a valid configuration:</source> +<target>Het bestand bevat geen geldige configuratie:</target> +<source>Scanning:</source> +<target>Doorzoekt:</target> +<source>Encoding extended time information: %x</source> +<target>Coderen uitgebreide tijd informatie: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Je kan deze error negeren als de map leeg is.</target> +<source>Directory does not exist:</source> +<target>Map bestaat niet:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:</target> +<source>Comparing content of files %x</source> +<target>De inhoud van %x bestanden wordt vergeleken</target> +<source>Memory allocation failed!</source> +<target>RAM geheugen error!</target> +<source>File %x has an invalid date!</source> +<target>Bestand %x heeft een ongeldige datum!</target> +<source>Conflict detected:</source> +<target>Conflict gedetecteerd:</target> +<source>Files %x have the same date but a different size!</source> +<target>Bestanden %x hebben dezelfde datums maar een afwijkende grootte!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symbolische koppeling %x heeft dezelfde datum maar een ander doel!</target> +<source>Comparing files by content failed.</source> +<target>Bestand-inhoudvergelijking mislukt.</target> +<source>Generating file list...</source> +<target>Genereren van bestandslijst...</target> +<source>Multiple...</source> +<target>Meerdere...</target> +<source>Files that are equal on both sides</source> +<target>Bestanden die aan beide zijdes gelijk zijn</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Alleen gelijke bestanden/mappen die verschillen van attributen</target> +<source>Copy from right to left</source> +<target>Kopieer van rechts naar links</target> +<source>Copy from left to right</source> +<target>Kopieer van links naar rechts</target> +<source>Delete files/folders existing on left side only</source> +<target>Verwijder bestanden/mappen die alleen aan de linkerzijde voorkomen</target> +<source>Delete files/folders existing on right side only</source> +<target>Verwijder bestanden/mappen die alleen aan de rechterzijde voorkomen</target> +<source>Copy from right to left overwriting</source> +<target>Kopieer en overschrijf van rechts naar links</target> +<source>Copy from left to right overwriting</source> +<target>Kopieer en overschrijf van links naar rechts</target> +<source>Do nothing</source> +<target>Geen actie ondernemen</target> +<source>Copy attributes only from right to left</source> +<target>Kopieer attributen alleen van rechts naar links</target> +<source>Copy attributes only from left to right</source> +<target>Kopieer attributen alleen van links naar rechts</target> +<source>Deleting file %x</source> +<target>Verwijderen van bestand %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Verwijderen van Symbolische Link %x</target> +<source>Deleting folder %x</source> +<target>Verwijderen van map %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Verplaatst %x naar de Prullenbak</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Verplaatst bestand %x naar een door de gebruiker gedefinieerde map %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Verplaatst map %x naar een door de gebruiker gedefinieerde map %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Verplaatst Symbolische Koppeling %x naar een door de gebruiker gedefinieerde map %y</target> +<source>Copying new file %x to %y</source> +<target>Kopieert nieuw bestand van %x naar %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopieer nieuwe Symbolische Link van %x naar %y</target> +<source>Overwriting file %x in %y</source> +<target>Overschrijft bestand %x over %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Overschrijft Symbolische Koppeling %x over %y</target> +<source>Creating folder %x</source> +<target>Map %x wordt aangemaakt</target> +<source>Verifying file %x</source> +<target>Verifieert bestand %x</target> +<source>Updating attributes of %x</source> +<target>Attributen bijwerken van %x</target> +<source>Source directory does not exist anymore:</source> +<target>Bronmap bestaat niet meer:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Volgens de configuratie hoeft er niets gesynchroniseerd te worden!</target> +<source>Target directory name must not be empty!</source> +<target></target> +<source>User-defined directory for deletion was not specified!</source> +<target>De door de gebruiker gedefinieerde map ter verwijdering was niet opgegeven!</target> +<source>Unresolved conflicts existing!</source> +<target>Er bestaan onopgeloste conflicten!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>U kunt de conflicten negeren en doorgaan met synchronisatie.</target> +<source>Significant difference detected:</source> +<target>Significant verschil gedetecteerd:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Meer dan 50% van alle bestanden zal gekopieerd of verwijderd worden!</target> +<source>Not enough free disk space available in:</source> +<target>Niet genoeg vrije schijfruimte beschikbaar op:</target> +<source>Free disk space required:</source> +<target>Vrije ruimte op harde schrijf nodig:</target> +<source>Free disk space available:</source> +<target>Beschikbare vrije schijfruimte :</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Een map wordt bewerkt die deel is van meerdere mappen! Controleer de synchronisatie instellingen!</target> +<source>Processing folder pair:</source> +<target>Verwerking van gekoppelde mappen:</target> +<source>Generating database...</source> +<target>Genereren van database...</target> +<source>Error copying locked file %x!</source> +<target>Fout tijdens kopiëren van vergrendeld bestand %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud!</target> diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng index ae242d82..c323c26c 100644 --- a/BUILD/Languages/english_uk.lng +++ b/BUILD/Languages/english_uk.lng @@ -1,910 +1,1053 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objects deleted successfully -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x day(s) -%x directories -%x directories -%x files -%x files -%x hour(s) -%x hour(s) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x of %y rows in view -%x of 1 row in view -%x of 1 row in view -%x sec -%x sec -%x% -%x% -&Abort -&Abort -&About... -&About... -&Advanced -&Advanced -&Cancel -&Cancel -&Check for new version -&Check for new version -&Content -&Content -&Create batch job... -&Create batch job... -&Default -&Default -&Exit -&Exit -&Export file list... -&Export file list... -&File -&File -&Find next -&Find next -&Global settings... -&Global settings... -&Help -&Help -&Ignore -&Ignore -&Language -&Language -&Load -&Load -&Load configuration... -&Load configuration... -&New -&New -&No -&No -&OK -&OK -&Pause -&Pause -&Program -&Program -&Quit -&Quit -&Restore -&Restore -&Retry -&Retry -&Save -&Save -&Switch -&Switch -&Yes -&Yes -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Requires an Internet connection!) -- Other side's counterpart to %dir -- Other side's counterpart to %dir -- Other side's counterpart to %name -- Other side's counterpart to %name -- conflict -- conflict -- conflict (same date, different size) -- conflict (same date, different size) -- different -- different -- directory part only -- directory part only -- equal -- equal -- exists left only -- exists left only -- exists right only -- exists right only -- full file or directory name -- full file or directory name -- left -- left -- left newer -- left newer -- right -- right -- right newer -- right newer -/sec -/sec -1 directory -1 directory -1 file -1 file -1. &Compare -1. &Compare -1. Enter relative file or directory names separated by ';' or a new line. -1. Enter relative file or directory names separated by ';' or a new line. -1. Select directories to monitor. -1. Select directories to monitor. -2. &Synchronize... -2. &Synchronise... -2. Enter a command line. -2. Enter a command line. -2. Use wildcard characters '*' and '?'. -2. Use wildcard characters '*' and '?'. -3. Exclude files directly on main grid via context menu. -3. Exclude files directly on main grid via context menu. -3. Press 'Start'. -3. Press 'Start'. -<Automatic> -<Automatic> -<Directory> -<Directory> -<Last session> -<Last session> -<Symlink> -<Symlink> -<multiple selection> -<multiple selection> -A directory input field is empty. -A directory input field is empty. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -A directory will be modified which is part of multiple folder pairs! Please review synchronisation settings! -A newer version of FreeFileSync is available: -A newer version of FreeFileSync is available: -Abort requested: Waiting for current operation to finish... -Abort requested: Waiting for current operation to finish... -Abort synchronization immediately -Abort synchronisation immediately -Aborted -Aborted -About -About -Action -Action -Add folder -Add folder -Add folder pair -Add folder pair -All directories in sync! -All directories in sync! -An exception occurred! -An exception occurred! -As a result the files are separated into the following categories: -As a result the files are separated into the following categories: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Assemble a batch file for automated synchronisation. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -At least one directory input field is empty. -At least one directory input field is empty. -Auto-adjust columns -Auto-adjust columns -Batch execution -Batch execution -Batch file created successfully! -Batch file created successfully! -Batch job -Batch job -Big thanks for localizing FreeFileSync goes out to: -Big thanks for localising FreeFileSync goes out to: -Both sides have changed since last synchronization! -Both sides have changed since last synchronisation! -Browse -Browse -Browse directory -Browse directory -Cannot determine sync-direction: -Cannot determine sync-direction: -Cannot find %x -Cannot find %x -Category -Category -Clear filter settings -Clear filter settings -Comma separated list -Comma separated list -Command line -Command line -Command line is empty! -Command line is empty! -Compare -Compare -Compare both sides -Compare both sides -Compare by \"File content\" -Compare by \"File content\" -Compare by \"File size and date\" -Compare by \"File size and date\" -Compare by... -Compare by... -Comparing content of files %x -Comparing content of files %x -Comparing content... -Comparing content... -Comparing files by content failed. -Comparing files by content failed. -Comparison Result -Comparison Result -Comparison settings -Comparison settings -Completed -Completed -Configuration -Configuration -Configuration loaded! -Configuration loaded! -Configuration overview: -Configuration overview: -Configuration saved! -Configuration saved! -Configure filter -Configure filter -Configure your own synchronization rules. -Configure your own synchronisation rules. -Confirm -Confirm -Conflict detected: -Conflict detected: -Conflicts/files that cannot be categorized -Conflicts/files that cannot be categorised -Continue -Continue -Conversion error: -Conversion error: -Copy attributes only from left to right -Copy attributes only from left to right -Copy attributes only from right to left -Copy attributes only from right to left -Copy filesystem permissions -Copy filesystem permissions -Copy from left to right -Copy from left to right -Copy from left to right overwriting -Copy from left to right overwriting -Copy from right to left -Copy from right to left -Copy from right to left overwriting -Copy from right to left overwriting -Copy locked files -Copy locked files -Copy new or updated files to right folder. -Copy new or updated files to right folder. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copy to clipboard\tCTRL+C -Copy to clipboard\tCTRL+C -Copying new Symbolic Link %x to %y -Copying new Symbolic Link %x to %y -Copying new file %x to %y -Copying new file %x to %y -Could not determine volume name for file: -Could not determine volume name for file: -Could not initialize directory monitoring: -Could not initialise directory monitoring: -Could not load a required DLL: -Could not load a required DLL: -Could not read values for the following XML nodes: -Could not read values for the following XML nodes: -Create a batch job -Create a batch job -Creating folder %x -Creating folder %x -Custom -Custom -Customize columns -Customise columns -Customize... -Customise... -D-Click -D-Click -DECISION TREE -DECISION TREE -Data verification error: Source and target file have different content! -Data verification error: Source and target file have different content! -Date -Date -Delete files/folders existing on left side only -Delete files/folders existing on left side only -Delete files/folders existing on right side only -Delete files/folders existing on right side only -Delete files\tDEL -Delete files\tDEL -Delete on both sides -Delete on both sides -Delete on both sides even if the file is selected on one side only -Delete on both sides even if the file is selected on one side only -Delete or overwrite files permanently -Delete or overwrite files permanently -Delete permanently -Delete permanently -Deleting Symbolic Link %x -Deleting Symbolic Link %x -Deleting file %x -Deleting file %x -Deleting folder %x -Deleting folder %x -Deletion handling -Deletion handling -Description -Description -Direct -Direct -Directories are dependent! Be careful when setting up synchronization rules: -Directories are dependent! Be careful when setting up synchronisation rules: -Directories to watch -Directories to watch -Directory -Directory -Directory does not exist: -Directory does not exist: -Do not show this dialog again -Do not show this dialogue again -Do nothing -Do nothing -Do you really want to delete the following object(s)? -Do you really want to delete the following object(s)? -Do you really want to move the following object(s) to the Recycle Bin? -Do you really want to move the following object(s) to the Recycle Bin? -Do you want FreeFileSync to automatically check for updates every week? -Do you want FreeFileSync to automatically check for updates every week? -Donate with PayPal -Donate with PayPal -Download now? -Download now? -Drag && drop -Drag && drop -Elements found: -Elements found: -Elements processed: -Elements processed: -Elements remaining: -Elements remaining: -Email -E-mail -Encoding extended time information: %x -Encoding extended time information: %x -Endless loop when traversing directory: -Endless loop when traversing directory: -Equal files/folders that differ in attributes only -Equal files/folders that differ in attributes only -Error -Error -Error changing modification time: -Error changing modification time: -Error copying file permissions: -Error copying file permissions: -Error copying file: -Error copying file: -Error copying locked file %x! -Error copying locked file %x! -Error copying symbolic link: -Error copying symbolic link: -Error creating directory: -Error creating directory: -Error deleting directory: -Error deleting directory: -Error deleting file: -Error deleting file: -Error handling -Error handling -Error loading library function: -Error loading library function: -Error moving directory: -Error moving directory: -Error moving file: -Error moving file: -Error moving to Recycle Bin: -Error moving to Recycle Bin: -Error opening file: -Error opening file: -Error parsing configuration file: -Error parsing configuration file: -Error reading file attributes: -Error reading file attributes: -Error reading file: -Error reading file: -Error reading from synchronization database: -Error reading from synchronisation database: -Error reading security context: -Error reading security context: -Error resolving symbolic link: -Error resolving symbolic link: -Error setting directory lock: -Error setting directory lock: -Error setting privilege: -Error setting privilege: -Error starting Volume Shadow Copy Service! -Error starting Volume Shadow Copy Service! -Error traversing directory: -Error traversing directory: -Error when monitoring directories. -Error when monitoring directories. -Error writing file: -Error writing file: -Error writing security context: -Error writing security context: -Error writing to synchronization database: -Error writing to synchronisation database: -Example -Example -Exclude -Exclude -Exclude all rows -Exclude all rows -Exclude temporarily -Exclude temporarily -Exclude via filter: -Exclude via filter: -Exit instantly -Exit instantly -Extension -Extension -External applications -External applications -Fatal Error -Fatal Error -Feedback and suggestions are welcome at: -Feedback and suggestions are welcome at: -File %x has an invalid date! -File %x has an invalid date! -File already exists. Overwrite? -File already exists. Overwrite? -File content -File content -File does not exist: -File does not exist: -File list exported! -File list exported! -File size and date -File size and date -Filename -Filename -Files %x have the same date but a different size! -Files %x have the same date but a different size! -Files are found equal if\n - file content\nis the same -Files are found equal if\n - file content\nis the same -Files are found equal if\n - filesize\n - last write time and date\nare the same -Files are found equal if\n - filesize\n - last write time and date\nare the same -Files that are equal on both sides -Files that are equal on both sides -Files that exist on both sides, left one is newer -Files that exist on both sides, left one is newer -Files that exist on both sides, right one is newer -Files that exist on both sides, right one is newer -Files that have different content -Files that have different content -Files/folders that exist on left side only -Files/folders that exist on left side only -Files/folders that exist on right side only -Files/folders that exist on right side only -Filter files -Filter files -Filter is active -Filter is active -Filter settings have changed! -Filter settings have changed! -Filter: All pairs -Filter: All pairs -Filter: Single pair -Filter: Single pair -Find -Find -Find what: -Find what: -Folder Comparison and Synchronization -Folder Comparison and Synchronisation -Folder pairs -Folder pairs -Follow -Follow -Free disk space available: -Free disk space available: -Free disk space required: -Free disk space required: -FreeFileSync Batch Job -FreeFileSync Batch Job -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge -FreeFileSync batch file -FreeFileSync batch file -FreeFileSync configuration -FreeFileSync configuration -FreeFileSync is up to date! -FreeFileSync is up to date! -Full path -Full path -Generating database... -Generating database... -Generating file list... -Generating file list... -Global settings -Global settings -Help -Help -Hidden dialogs: -Hidden dialogues: -Hide all error and warning messages -Hide all error and warning messages -Hide conflicts -Hide conflicts -Hide excluded items -Hide excluded items -Hide files that are different -Hide files that are different -Hide files that are equal -Hide files that are equal -Hide files that are newer on left -Hide files that are newer on left -Hide files that are newer on right -Hide files that are newer on right -Hide files that exist on left side only -Hide files that exist on left side only -Hide files that exist on right side only -Hide files that exist on right side only -Hide files that will be created on the left side -Hide files that will be created on the left side -Hide files that will be created on the right side -Hide files that will be created on the right side -Hide files that will be deleted on the left side -Hide files that will be deleted on the left side -Hide files that will be deleted on the right side -Hide files that will be deleted on the right side -Hide files that will be overwritten on left side -Hide files that will be overwritten on left side -Hide files that will be overwritten on right side -Hide files that will be overwritten on right side -Hide files that won't be copied -Hide files that won't be copied -Hide filtered or temporarily excluded files -Hide filtered or temporarily excluded files -Hide further error messages during the current process -Hide further error messages during the current process -Hints: -Hints: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Idle time between detection of last change and execution of command line in seconds -Idle time between detection of last change and execution of command line in seconds -If you like FFS -If you like FFS -Ignore -Ignore -Ignore errors -Ignore errors -Ignore subsequent errors -Ignore subsequent errors -Include -Include -Include all rows -Include all rows -Include temporarily -Include temporarily -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incompatible synchronization database format: -Incompatible synchronisation database format: -Info -Info -Information -Information -Initial synchronization: -Initial synchronisation: -Integrate external applications into context menu. The following macros are available: -Integrate external applications into context menu. The following macros are available: -Invalid FreeFileSync config file! -Invalid FreeFileSync config file! -Last used configurations (press DEL to remove from list) -Last used configurations (press DEL to remove from list) -Leave as unresolved conflict -Leave as unresolved conflict -Left -Left -Legend -Legend -Load configuration from file -Load configuration from file -Log-messages: -Log-messages: -Logging -Logging -Main bar -Main bar -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Match case -Match case -Maximum number of logfiles: -Maximum number of logfiles: -Memory allocation failed! -Memory allocation failed! -Minimum Idle Time [seconds] -Minimum Idle Time [seconds] -Mirror ->> -Mirror ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation. -Monitoring active... -Monitoring active... -More than 50% of the total number of files will be copied or deleted! -More than 50% of the total number of files will be copied or deleted! -Move column down -Move column down -Move column up -Move column up -Move files into a time-stamped subdirectory -Move files into a time-stamped subdirectory -Moving %x to Recycle Bin -Moving %x to Recycle Bin -Moving Symbolic Link %x to user-defined directory %y -Moving Symbolic Link %x to user-defined directory %y -Moving file %x to user-defined directory %y -Moving file %x to user-defined directory %y -Moving folder %x to user-defined directory %y -Moving folder %x to user-defined directory %y -Multiple... -Multiple... -No change since last synchronization! -No change since last synchronisation! -No filter selected -No filter selected -Not enough free disk space available in: -Not enough free disk space available in: -Nothing to synchronize according to configuration! -Nothing to synchronise according to configuration! -Number of files and directories that will be created -Number of files and directories that will be created -Number of files and directories that will be deleted -Number of files and directories that will be deleted -Number of files that will be overwritten -Number of files that will be overwritten -One of the FreeFileSync database entries within the following file is not yet existing: -One of the FreeFileSync database entries within the following file is not yet existing: -One of the FreeFileSync database files is not yet existing: -One of the FreeFileSync database files is not yet existing: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Only files/directories that pass filtering will be selected for synchronisation. The filter will be applied to the name relative(!) to the base synchronisation directories. -Open with Explorer -Open with Explorer -Open with default application -Open with default application -Operation aborted! -Operation aborted! -Operation: -Operation: -Overview -Overview -Overwriting Symbolic Link %x in %y -Overwriting Symbolic Link %x in %y -Overwriting file %x in %y -Overwriting file %x in %y -Pause -Pause -Paused -Paused -Planned directory deletion is in conflict with its subdirectories and -files! -Planned directory deletion is in conflict with its subdirectories and -files! -Please run a Compare first before synchronizing! -Please run a Compare first before synchronising! -Press \"Switch\" to open FreeFileSync GUI mode. -Press \"Switch\" to open FreeFileSync GUI mode. -Processing folder pair: -Processing folder pair: -Published under the GNU General Public License: -Published under the GNU General Public Licence: -Question -Question -RealtimeSync - Automated Synchronization -RealtimeSync - Automated Synchronisation -RealtimeSync configuration -RealtimeSync configuration -Recycle Bin not yet supported for this system! -Recycle Bin not yet supported for this system! -Relative path -Relative path -Remove alternate settings -Remove alternate settings -Remove folder -Remove folder -Remove folder pair -Remove folder pair -Report translation error -Report translation error -Reset -Reset -Reset view -Reset view -Restore all hidden dialogs? -Restore all hidden dialogs? -Right -Right -S&ave configuration... -S&ave configuration... -S&witch view -S&witch view -Save changes to current configuration? -Save changes to current configuration? -Save current configuration to file -Save current configuration to file -Scanning... -Scanning... -Scanning: -Scanning: -Select a folder -Select a folder -Select alternate synchronization settings -Select alternate synchronisation settings -Select logfile directory: -Select logfile directory: -Select variant: -Select variant: -Select view -Select view -Set direction: -Set direction: -Setting default synchronization directions: Old files will be overwritten with newer files. -Setting default synchronisation directions: Old files will be overwritten with newer files. -Show \"%x\" -Show \"%x\" -Show conflicts -Show conflicts -Show files that are different -Show files that are different -Show files that are equal -Show files that are equal -Show files that are newer on left -Show files that are newer on left -Show files that are newer on right -Show files that are newer on right -Show files that exist on left side only -Show files that exist on left side only -Show files that exist on right side only -Show files that exist on right side only -Show files that will be created on the left side -Show files that will be created on the left side -Show files that will be created on the right side -Show files that will be created on the right side -Show files that will be deleted on the left side -Show files that will be deleted on the left side -Show files that will be deleted on the right side -Show files that will be deleted on the right side -Show files that will be overwritten on left side -Show files that will be overwritten on left side -Show files that will be overwritten on right side -Show files that will be overwritten on right side -Show files that won't be copied -Show files that won't be copied -Show hidden dialogs -Show hidden dialogues -Show popup -Show popup -Show popup on errors or warnings -Show popup on errors or warnings -Significant difference detected: -Significant difference detected: -Silent mode -Silent mode -Size -Size -Source code written completely in C++ utilizing: -Source code written completely in C++ utilising: -Source directory does not exist anymore: -Source directory does not exist anymore: -Speed: -Speed: -Start -Start -Start minimized and write status information to a logfile -Start minimized and write status information to a logfile -Start synchronization -Start synchronisation -Statistics -Statistics -Status feedback -Status feedback -Stop -Stop -Swap sides -Swap sides -Switching to FreeFileSync GUI mode... -Switching to FreeFileSync GUI mode... -Symbolic Link handling -Symbolic Link handling -Symlinks %x have the same date but a different target! -Symlinks %x have the same date but a different target! -Synchronization Preview -Synchronisation Preview -Synchronization aborted! -Synchronisation aborted! -Synchronization completed successfully! -Synchronisation completed successfully! -Synchronization completed with errors! -Synchronisation completed with errors! -Synchronization settings -Synchronisation settings -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchronise all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchronize... -Synchronise... -Synchronizing... -Synchronising... -Target directory already existing! -Target directory already existing! -Target file already existing! -Target file already existing! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -The file does not contain a valid configuration: -The file does not contain a valid configuration: -The file was not processed by last synchronization! -The file was not processed by last synchronisation! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Time -Time -Time elapsed: -Time elapsed: -Time remaining: -Time remaining: -Total amount of data that will be transferred -Total amount of data that will be transferred -Total time: -Total time: -Transfer file and directory permissions\n(Requires Administrator rights) -Transfer file and directory permissions\n(Requires Administrator rights) -Unable to connect to sourceforge.net! -Unable to connect to sourceforge.net! -Unable to create logfile! -Unable to create logfile! -Unresolved conflicts existing! -Unresolved conflicts existing! -Update -> -Update -> -Updating attributes of %x -Updating attributes of %x -Usage: -Usage: -Use Recycle Bin -Use Recycle Bin -Use Recycle Bin when deleting or overwriting files -Use Recycle Bin when deleting or overwriting files -User-defined directory for deletion was not specified! -User-defined directory for deletion was not specified! -Variant -Variant -Verifying file %x -Verifying file %x -Versioning -Versioning -Volume name %x not part of filename %y! -Volume name %x not part of filename %y! -Waiting for missing directories... -Waiting for missing directories... -Waiting while directory is locked (%x)... -Waiting while directory is locked (%x)... -Warning -Warning -When the comparison is started with this option set the following decision tree is processed: -When the comparison is started with this option set the following decision tree is processed: -You can ignore conflicts and continue synchronization. -You can ignore conflicts and continue synchronisation. -You can ignore this error to consider the directory as empty. -You can ignore this error to consider the directory as empty. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -You may try to synchronise remaining items again (WITHOUT having to re-compare)! -different -different -file exists on both sides -file exists on both sides -on one side only -on one side only +<header> + <language name>English (UK)</language name> + <translator>Robert Readman</translator> + <locale>en_GB</locale> + <flag file>england.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Show in Explorer</target> +<source>Open with default application</source> +<target>Open with default application</target> +<source>Browse directory</source> +<target>Browse directory</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automated Synchronisation</target> +<source>Browse</source> +<target>Browse</target> +<source>Error resolving symbolic link:</source> +<target>Error resolving symbolic link:</target> +<source>Select alternate synchronization settings</source> +<target>Select alternate synchronisation settings</target> +<source>No filter selected</source> +<target>No filter selected</target> +<source>Filter is active</source> +<target>Filter is active</target> +<source>Clear filter settings</source> +<target>Clear filter settings</target> +<source>Remove alternate settings</source> +<target>Remove alternate settings</target> +<source>Create a batch job</source> +<target>Create a batch job</target> +<source>Synchronization settings</source> +<target>Synchronisation settings</target> +<source>Comparison settings</source> +<target>Comparison settings</target> +<source>About</source> +<target>About</target> +<source>Error</source> +<target>Error</target> +<source>Warning</source> +<target>Warning</target> +<source>Question</source> +<target>Question</target> +<source>Confirm</source> +<target>Confirm</target> +<source>Configure filter</source> +<target>Configure filter</target> +<source>Customize columns</source> +<target>Customise columns</target> +<source>Global settings</source> +<target>Global settings</target> +<source>Synchronization Preview</source> +<target>Synchronisation Preview</target> +<source>Find</source> +<target>Find</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Directory></target> +<source>Size</source> +<target>Size</target> +<source>Date</source> +<target>Date</target> +<source>Full path</source> +<target>Full path</target> +<source>Filename</source> +<target>Filename</target> +<source>Relative path</source> +<target>Relative path</target> +<source>Directory</source> +<target>Directory</target> +<source>Extension</source> +<target>Extension</target> +<source>Comparison Result</source> +<target>Comparison Result</target> +<source>Incompatible synchronization database format:</source> +<target>Incompatible synchronisation database format:</target> +<source>Initial synchronization:</source> +<target>Initial synchronisation:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>One of the FreeFileSync database files is not yet existing:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>One of the FreeFileSync database entries within the following file is not yet existing:</target> +<source>Error reading from synchronization database:</source> +<target>Error reading from synchronisation database:</target> +<source>An exception occurred!</source> +<target>An exception occurred!</target> +<source>Error deleting file:</source> +<target>Error deleting file:</target> +<source>Error reading file attributes:</source> +<target>Error reading file attributes:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Waiting while directory is locked (%x)...</target> +<source>Error setting directory lock:</source> +<target>Error setting directory lock:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Fatal Error</target> +<source>File does not exist:</source> +<target>File does not exist:</target> +<source>Error parsing configuration file:</source> +<target>Error parsing configuration file:</target> +<source>Error writing file:</source> +<target>Error writing file:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Invalid FreeFileSync config file!</target> +<source>/sec</source> +<target>/sec</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</target> +<source>S&ave configuration...</source> +<target>S&ave configuration...</target> +<source>&Load configuration...</source> +<target>&Load configuration...</target> +<source>&Quit</source> +<target>&Quit</target> +<source>&File</source> +<target>&File</target> +<source>&Content</source> +<target>&Content</target> +<source>&About...</source> +<target>&About...</target> +<source>&Help</source> +<target>&Help</target> +<source>Usage:</source> +<target>Usage:</target> +<source>1. Select directories to monitor.</source> +<target>1. Select directories to monitor.</target> +<source>2. Enter a command line.</source> +<target>2. Enter a command line.</target> +<source>3. Press 'Start'.</source> +<target>3. Press 'Start'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</target> +<source>Directories to watch</source> +<target>Directories to watch</target> +<source>Add folder</source> +<target>Add folder</target> +<source>Remove folder</source> +<target>Remove folder</target> +<source>Select a folder</source> +<target>Select a folder</target> +<source>Command line</source> +<target>Command line</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimum Idle Time [seconds]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Idle time between detection of last change and execution of command line in seconds</target> +<source>Start</source> +<target>Start</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync configuration</target> +<source>File already exists. Overwrite?</source> +<target>File already exists. Overwrite?</target> +<source>&Restore</source> +<target>&Restore</target> +<source>&Exit</source> +<target>&Exit</target> +<source>Monitoring active...</source> +<target>Monitoring active...</target> +<source>Waiting for missing directories...</source> +<target>Waiting for missing directories...</target> +<source>Command line is empty!</source> +<target>Command line is empty!</target> +<source>Could not initialize directory monitoring:</source> +<target>Could not initialise directory monitoring:</target> +<source>A directory input field is empty.</source> +<target>A directory input field is empty.</target> +<source>Error when monitoring directories.</source> +<target>Error when monitoring directories.</target> +<source>Drag && drop</source> +<target>Drag && drop</target> +<source>Conversion error:</source> +<target>Conversion error:</target> +<source>Error moving file:</source> +<target>Error moving file:</target> +<source>Operation aborted!</source> +<target>Operation aborted!</target> +<source>Target file already existing!</source> +<target>Target file already existing!</target> +<source>Error moving directory:</source> +<target>Error moving directory:</target> +<source>Target directory already existing!</source> +<target>Target directory already existing!</target> +<source>Error deleting directory:</source> +<target>Error deleting directory:</target> +<source>Error changing modification time:</source> +<target>Error changing modification time:</target> +<source>Error loading library function:</source> +<target>Error loading library function:</target> +<source>Error reading security context:</source> +<target>Error reading security context:</target> +<source>Error writing security context:</source> +<target>Error writing security context:</target> +<source>Error copying file permissions:</source> +<target>Error copying file permissions:</target> +<source>Error creating directory:</source> +<target>Error creating directory:</target> +<source>Error copying symbolic link:</source> +<target>Error copying symbolic link:</target> +<source>Error copying file:</source> +<target>Error copying file:</target> +<source>Error opening file:</source> +<target>Error opening file:</target> +<source>Error reading file:</source> +<target>Error reading file:</target> +<source>Endless loop when traversing directory:</source> +<target>Endless loop when traversing directory:</target> +<source>Error traversing directory:</source> +<target>Error traversing directory:</target> +<source>Error setting privilege:</source> +<target>Error setting privilege:</target> +<source>Error moving to Recycle Bin:</source> +<target>Error moving to Recycle Bin:</target> +<source>Could not load a required DLL:</source> +<target>Could not load a required DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Error writing to synchronisation database:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Error starting Volume Shadow Copy Service!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</target> +<source>Could not determine volume name for file:</source> +<target>Could not determine volume name for file:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Volume name %x not part of filename %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Could not read values for the following XML nodes:</target> +<source>Show popup</source> +<target>Show popup</target> +<source>Show popup on errors or warnings</source> +<target>Show popup on errors or warnings</target> +<source>Ignore errors</source> +<target>Ignore errors</target> +<source>Hide all error and warning messages</source> +<target>Hide all error and warning messages</target> +<source>Exit instantly</source> +<target>Exit instantly</target> +<source>Abort synchronization immediately</source> +<target>Abort synchronisation immediately</target> +<source>Logging</source> +<target>Logging</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync batch file</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync configuration</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Batch Job</target> +<source>Unable to create logfile!</source> +<target>Unable to create logfile!</target> +<source>Batch execution</source> +<target>Batch execution</target> +<source>Log-messages:</source> +<target>Log-messages:</target> +<source>Stop</source> +<target>Stop</target> +<source>Total time:</source> +<target>Total time:</target> +<source>Synchronization aborted!</source> +<target>Synchronisation aborted!</target> +<source>Synchronization completed with errors!</source> +<target>Synchronisation completed with errors!</target> +<source>Synchronization completed successfully!</source> +<target>Synchronisation completed successfully!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Press "Switch" to open FreeFileSync GUI mode.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Switching to FreeFileSync GUI mode...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Unable to connect to sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>A newer version of FreeFileSync is available:</target> +<source>Download now?</source> +<target>Download now?</target> +<source>Information</source> +<target>Information</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync is up to date!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Do you want FreeFileSync to automatically check for updates every week?</target> +<source>(Requires an Internet connection!)</source> +<target>(Requires an Internet connection!)</target> +<source>1. &Compare</source> +<target>1. &Compare</target> +<source>2. &Synchronize...</source> +<target>2. &Synchronise...</target> +<source>S&witch view</source> +<target>S&witch view</target> +<source>&New</source> +<target>&New</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&Language</target> +<source>&Global settings...</source> +<target>&Global settings...</target> +<source>&Create batch job...</source> +<target>&Create batch job...</target> +<source>&Export file list...</source> +<target>&Export file list...</target> +<source>&Advanced</source> +<target>&Advanced</target> +<source>&Check for new version</source> +<target>&Check for new version</target> +<source>Compare</source> +<target>Compare</target> +<source>Compare both sides</source> +<target>Compare both sides</target> +<source>&Abort</source> +<target>&Abort</target> +<source>Synchronize...</source> +<target>Synchronise...</target> +<source>Start synchronization</source> +<target>Start synchronisation</target> +<source>Swap sides</source> +<target>Swap sides</target> +<source>Add folder pair</source> +<target>Add folder pair</target> +<source>Remove folder pair</source> +<target>Remove folder pair</target> +<source>Save current configuration to file</source> +<target>Save current configuration to file</target> +<source>Load configuration from file</source> +<target>Load configuration from file</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Last used configurations (press DEL to remove from list)</target> +<source>Hide excluded items</source> +<target>Hide excluded items</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Hide filtered or temporarily excluded files</target> +<source>Number of files and directories that will be created</source> +<target>Number of files and directories that will be created</target> +<source>Number of files that will be overwritten</source> +<target>Number of files that will be overwritten</target> +<source>Number of files and directories that will be deleted</source> +<target>Number of files and directories that will be deleted</target> +<source>Total amount of data that will be transferred</source> +<target>Total amount of data that will be transferred</target> +<source>Left</source> +<target>Left</target> +<source>Right</source> +<target>Right</target> +<source>Batch job</source> +<target>Batch job</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Assemble a batch file for automated synchronisation. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</target> +<source>Help</source> +<target>Help</target> +<source>Configuration overview:</source> +<target>Configuration overview:</target> +<source>Filter files</source> +<target>Filter files</target> +<source>Status feedback</source> +<target>Status feedback</target> +<source>Silent mode</source> +<target>Silent mode</target> +<source>Start minimized and write status information to a logfile</source> +<target>Start minimized and write status information to a logfile</target> +<source>Error handling</source> +<target>Error handling</target> +<source>Overview</source> +<target>Overview</target> +<source>Select logfile directory:</source> +<target>Select logfile directory:</target> +<source>Maximum number of logfiles:</source> +<target>Maximum number of logfiles:</target> +<source>&Save</source> +<target>&Save</target> +<source>&Load</source> +<target>&Load</target> +<source>&Cancel</source> +<target>&Cancel</target> +<source>Elements found:</source> +<target>Elements found:</target> +<source>Elements remaining:</source> +<target>Elements remaining:</target> +<source>Speed:</source> +<target>Speed:</target> +<source>Time remaining:</source> +<target>Time remaining:</target> +<source>Time elapsed:</source> +<target>Time elapsed:</target> +<source>Operation:</source> +<target>Operation:</target> +<source>Select variant:</source> +<target>Select variant:</target> +<source><Automatic></source> +<target><Automatic></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</target> +<source>Mirror ->></source> +<target>Mirror ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation.</target> +<source>Update -></source> +<target>Update -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copy new or updated files to right folder.</target> +<source>Custom</source> +<target>Custom</target> +<source>Configure your own synchronization rules.</source> +<target>Configure your own synchronisation rules.</target> +<source>Deletion handling</source> +<target>Deletion handling</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuration</target> +<source>Category</source> +<target>Category</target> +<source>Action</source> +<target>Action</target> +<source>Files/folders that exist on left side only</source> +<target>Files/folders that exist on left side only</target> +<source>Files/folders that exist on right side only</source> +<target>Files/folders that exist on right side only</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Files that exist on both sides, left one is newer</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Files that exist on both sides, right one is newer</target> +<source>Files that have different content</source> +<target>Files that have different content</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflicts/files that cannot be categorised</target> +<source>Compare by...</source> +<target>Compare by...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Files are found equal if + - file size + - last write time and date +are the same +</target> +<source>File size and date</source> +<target>File size and date</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Files are found equal if + - file content +is the same +</target> +<source>File content</source> +<target>File content</target> +<source>Symbolic Link handling</source> +<target>Symbolic Link handling</target> +<source>Synchronizing...</source> +<target>Synchronising...</target> +<source>Elements processed:</source> +<target>Elements processed:</target> +<source>&Pause</source> +<target>&Pause</target> +<source>Compare by "File size and date"</source> +<target>Compare by "File size and date"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>When the comparison is started with this option set the following decision tree is processed:</target> +<source>As a result the files are separated into the following categories:</source> +<target>As a result the files are separated into the following categories:</target> +<source>- equal</source> +<target>- equal</target> +<source>- left newer</source> +<target>- left newer</target> +<source>- right newer</source> +<target>- right newer</target> +<source>- exists left only</source> +<target>- exists left only</target> +<source>- exists right only</source> +<target>- exists right only</target> +<source>- conflict</source> +<target>- conflict</target> +<source>Compare by "File content"</source> +<target>Compare by "File content"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</target> +<source>- different</source> +<target>- different</target> +<source>Source code written in C++ utilizing:</source> +<target>Source code written in C++ utilising:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Big thanks for localising FreeFileSync goes out to:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Feedback and suggestions are welcome at:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync at Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>If you like FFS</target> +<source>Donate with PayPal</source> +<target>Donate with PayPal</target> +<source>Email</source> +<target>E-mail</target> +<source>Report translation error</source> +<target>Report translation error</target> +<source>Published under the GNU General Public License:</source> +<target>Published under the GNU General Public Licence:</target> +<source>Ignore subsequent errors</source> +<target>Ignore subsequent errors</target> +<source>Hide further error messages during the current process</source> +<target>Hide further error messages during the current process</target> +<source>&Ignore</source> +<target>&Ignore</target> +<source>&Retry</source> +<target>&Retry</target> +<source>Do not show this dialog again</source> +<target>Do not show this dialogue again</target> +<source>&Switch</source> +<target>&Switch</target> +<source>&Yes</source> +<target>&Yes</target> +<source>&No</source> +<target>&No</target> +<source>Delete on both sides</source> +<target>Delete on both sides</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Delete on both sides even if the file is selected on one side only</target> +<source>Use Recycle Bin</source> +<target>Use Recycle Bin</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Only files/directories that match all filter settings will be selected for synchronisation. +Note: The name filter must be specified relative(!) to main synchronisation directories. +</target> +<source>Hints:</source> +<target>Hints:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Enter relative file or directory names separated by ';' or a new line.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Use wildcard characters '*' and '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Exclude files directly on main grid via context menu.</target> +<source>Example</source> +<target>Example</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synchronise all .doc, .zip and .exe files except everything in subfolder "temp".</target> +<source>Include</source> +<target>Include</target> +<source>Exclude</source> +<target>Exclude</target> +<source>Select time span:</source> +<target>Select time span:</target> +<source>Minimum file size:</source> +<target>Minimum file size:</target> +<source>Maximum file size:</source> +<target>Maximum file size:</target> +<source>&Default</source> +<target>&Default</target> +<source>Move column up</source> +<target>Move column up</target> +<source>Move column down</source> +<target>Move column down</target> +<source>Copy locked files</source> +<target>Copy locked files</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</target> +<source>Copy filesystem permissions</source> +<target>Copy filesystem permissions</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transfer file and directory permissions +(Requires Administrator rights) +</target> +<source>Hidden dialogs:</source> +<target>Hidden dialogues:</target> +<source>Reset</source> +<target>Reset</target> +<source>Show hidden dialogs</source> +<target>Show hidden dialogues</target> +<source>External applications</source> +<target>External applications</target> +<source>Description</source> +<target>Description</target> +<source>Variant</source> +<target>Variant</target> +<source>Statistics</source> +<target>Statistics</target> +<source>Find what:</source> +<target>Find what:</target> +<source>Match case</source> +<target>Match case</target> +<source>&Find next</source> +<target>&Find next</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>You may try to synchronise remaining items again (WITHOUT having to re-compare)!</target> +<source>Batch file created successfully!</source> +<target>Batch file created successfully!</target> +<source>Main bar</source> +<target>Main bar</target> +<source>Folder pairs</source> +<target>Folder pairs</target> +<source>Select view</source> +<target>Select view</target> +<source>Folder Comparison and Synchronization</source> +<target>Folder Comparison and Synchronisation</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Recycle Bin not yet supported for this system!</target> +<source>Set direction:</source> +<target>Set direction:</target> +<source>Exclude temporarily</source> +<target>Exclude temporarily</target> +<source>Include temporarily</source> +<target>Include temporarily</target> +<source>Exclude via filter:</source> +<target>Exclude via filter:</target> +<source><multiple selection></source> +<target><multiple selection></target> +<source>D-Click</source> +<target>D-Click</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copy to clipboard CTRL+C</target> +<source>Delete files DEL</source> +<target>Delete files DEL</target> +<source>Customize...</source> +<target>Customise...</target> +<source>Auto-adjust columns</source> +<target>Auto-adjust columns</target> +<source>Include all rows</source> +<target>Include all rows</target> +<source>Exclude all rows</source> +<target>Exclude all rows</target> +<source>Reset view</source> +<target>Reset view</target> +<source>Show "%x"</source> +<target>Show "%x"</target> +<source><Last session></source> +<target><Last session></target> +<source>Configuration saved!</source> +<target>Configuration saved!</target> +<source>Save changes to current configuration?</source> +<target>Save changes to current configuration?</target> +<source>Configuration loaded!</source> +<target>Configuration loaded!</target> +<source>Hide files that exist on left side only</source> +<target>Hide files that exist on left side only</target> +<source>Show files that exist on left side only</source> +<target>Show files that exist on left side only</target> +<source>Hide files that exist on right side only</source> +<target>Hide files that exist on right side only</target> +<source>Show files that exist on right side only</source> +<target>Show files that exist on right side only</target> +<source>Hide files that are newer on left</source> +<target>Hide files that are newer on left</target> +<source>Show files that are newer on left</source> +<target>Show files that are newer on left</target> +<source>Hide files that are newer on right</source> +<target>Hide files that are newer on right</target> +<source>Show files that are newer on right</source> +<target>Show files that are newer on right</target> +<source>Hide files that are equal</source> +<target>Hide files that are equal</target> +<source>Show files that are equal</source> +<target>Show files that are equal</target> +<source>Hide files that are different</source> +<target>Hide files that are different</target> +<source>Show files that are different</source> +<target>Show files that are different</target> +<source>Hide conflicts</source> +<target>Hide conflicts</target> +<source>Show conflicts</source> +<target>Show conflicts</target> +<source>Hide files that will be created on the left side</source> +<target>Hide files that will be created on the left side</target> +<source>Show files that will be created on the left side</source> +<target>Show files that will be created on the left side</target> +<source>Hide files that will be created on the right side</source> +<target>Hide files that will be created on the right side</target> +<source>Show files that will be created on the right side</source> +<target>Show files that will be created on the right side</target> +<source>Hide files that will be deleted on the left side</source> +<target>Hide files that will be deleted on the left side</target> +<source>Show files that will be deleted on the left side</source> +<target>Show files that will be deleted on the left side</target> +<source>Hide files that will be deleted on the right side</source> +<target>Hide files that will be deleted on the right side</target> +<source>Show files that will be deleted on the right side</source> +<target>Show files that will be deleted on the right side</target> +<source>Hide files that will be overwritten on left side</source> +<target>Hide files that will be overwritten on left side</target> +<source>Show files that will be overwritten on left side</source> +<target>Show files that will be overwritten on left side</target> +<source>Hide files that will be overwritten on right side</source> +<target>Hide files that will be overwritten on right side</target> +<source>Show files that will be overwritten on right side</source> +<target>Show files that will be overwritten on right side</target> +<source>Hide files that won't be copied</source> +<target>Hide files that won't be copied</target> +<source>Show files that won't be copied</source> +<target>Show files that won't be copied</target> +<source>All directories in sync!</source> +<target>All directories in sync!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Please run a Compare first before synchronising!</target> +<source>Comma separated list</source> +<target>Comma separated list</target> +<source>Legend</source> +<target>Legend</target> +<source>File list exported!</source> +<target>File list exported!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</target> +<source>Scanning...</source> +<target>Scanning...</target> +<source>Comparing content...</source> +<target>Comparing content...</target> +<source>Paused</source> +<target>Paused</target> +<source>Aborted</source> +<target>Aborted</target> +<source>Completed</source> +<target>Completed</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abort requested: Waiting for current operation to finish...</target> +<source>Continue</source> +<target>Continue</target> +<source>Pause</source> +<target>Pause</target> +<source>Cannot find %x</source> +<target>Cannot find %x</target> +<source>DECISION TREE</source> +<target>DECISION TREE</target> +<source>file exists on both sides</source> +<target>file exists on both sides</target> +<source>on one side only</source> +<target>on one side only</target> +<source>- left</source> +<target>- left</target> +<source>- right</source> +<target>- right</target> +<source>different</source> +<target>different</target> +<source>- conflict (same date, different size)</source> +<target>- conflict (same date, different size)</target> +<source>Inactive</source> +<target>Inactive</target> +<source>Second</source> +<target>Second</target> +<source>Minute</source> +<target>Minute</target> +<source>Hour</source> +<target>Hour</target> +<source>Day</source> +<target>Day</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filter: All pairs</target> +<source>Filter: Single pair</source> +<target>Filter: Single pair</target> +<source>Ignore</source> +<target>Ignore</target> +<source>Direct</source> +<target>Direct</target> +<source>Follow</source> +<target>Follow</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrate external applications into context menu. The following macros are available:</target> +<source>- full file or directory name</source> +<target>- full file or directory name</target> +<source>- directory part only</source> +<target>- directory part only</target> +<source>- Other side's counterpart to %name</source> +<target>- Other side's counterpart to %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Other side's counterpart to %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Restore all hidden dialogs?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Leave as unresolved conflict</target> +<source>Delete permanently</source> +<target>Delete permanently</target> +<source>Delete or overwrite files permanently</source> +<target>Delete or overwrite files permanently</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Use Recycle Bin when deleting or overwriting files</target> +<source>Versioning</source> +<target>Versioning</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Move files into a time-stamped subdirectory</target> +<source>Cannot determine sync-direction:</source> +<target>Cannot determine sync-direction:</target> +<source>Filter settings have changed!</source> +<target>Filter settings have changed!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Both sides have changed since last synchronisation!</target> +<source>No change since last synchronization!</source> +<target>No change since last synchronisation!</target> +<source>The file was not processed by last synchronization!</source> +<target>The file was not processed by last synchronisation!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Planned directory deletion is in conflict with its subdirectories and -files!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Setting default synchronisation directions: Old files will be overwritten with newer files.</target> +<source>The file does not contain a valid configuration:</source> +<target>The file does not contain a valid configuration:</target> +<source>Scanning:</source> +<target>Scanning:</target> +<source>Encoding extended time information: %x</source> +<target>Encoding extended time information: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>You can ignore this error to consider the directory as empty.</target> +<source>Directory does not exist:</source> +<target>Directory does not exist:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Directories are dependent! Be careful when setting up synchronisation rules:</target> +<source>Comparing content of files %x</source> +<target>Comparing content of files %x</target> +<source>Memory allocation failed!</source> +<target>Memory allocation failed!</target> +<source>File %x has an invalid date!</source> +<target>File %x has an invalid date!</target> +<source>Conflict detected:</source> +<target>Conflict detected:</target> +<source>Files %x have the same date but a different size!</source> +<target>Files %x have the same date but a different size!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symlinks %x have the same date but a different target!</target> +<source>Comparing files by content failed.</source> +<target>Comparing files by content failed.</target> +<source>Generating file list...</source> +<target>Generating file list...</target> +<source>Multiple...</source> +<target>Multiple...</target> +<source>Files that are equal on both sides</source> +<target>Files that are equal on both sides</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Equal files/folders that differ in attributes only</target> +<source>Copy from right to left</source> +<target>Copy from right to left</target> +<source>Copy from left to right</source> +<target>Copy from left to right</target> +<source>Delete files/folders existing on left side only</source> +<target>Delete files/folders existing on left side only</target> +<source>Delete files/folders existing on right side only</source> +<target>Delete files/folders existing on right side only</target> +<source>Copy from right to left overwriting</source> +<target>Copy from right to left overwriting</target> +<source>Copy from left to right overwriting</source> +<target>Copy from left to right overwriting</target> +<source>Do nothing</source> +<target>Do nothing</target> +<source>Copy attributes only from right to left</source> +<target>Copy attributes only from right to left</target> +<source>Copy attributes only from left to right</source> +<target>Copy attributes only from left to right</target> +<source>Deleting file %x</source> +<target>Deleting file %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Deleting Symbolic Link %x</target> +<source>Deleting folder %x</source> +<target>Deleting folder %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Moving %x to Recycle Bin</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Moving file %x to user-defined directory %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Moving folder %x to user-defined directory %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Moving Symbolic Link %x to user-defined directory %y</target> +<source>Copying new file %x to %y</source> +<target>Copying new file %x to %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copying new Symbolic Link %x to %y</target> +<source>Overwriting file %x in %y</source> +<target>Overwriting file %x in %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Overwriting Symbolic Link %x in %y</target> +<source>Creating folder %x</source> +<target>Creating folder %x</target> +<source>Verifying file %x</source> +<target>Verifying file %x</target> +<source>Updating attributes of %x</source> +<target>Updating attributes of %x</target> +<source>Source directory does not exist anymore:</source> +<target>Source directory does not exist anymore:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Nothing to synchronise according to configuration!</target> +<source>Target directory name must not be empty!</source> +<target>Target directory name must not be empty!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>User-defined directory for deletion was not specified!</target> +<source>Unresolved conflicts existing!</source> +<target>Unresolved conflicts existing!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>You can ignore conflicts and continue synchronisation.</target> +<source>Significant difference detected:</source> +<target>Significant difference detected:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>More than 50% of the total number of files will be copied or deleted!</target> +<source>Not enough free disk space available in:</source> +<target>Not enough free disk space available in:</target> +<source>Free disk space required:</source> +<target>Free disk space required:</target> +<source>Free disk space available:</source> +<target>Free disk space available:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>A directory will be modified which is part of multiple folder pairs! Please review synchronisation settings!</target> +<source>Processing folder pair:</source> +<target>Processing folder pair:</target> +<source>Generating database...</source> +<target>Generating database...</target> +<source>Error copying locked file %x!</source> +<target>Error copying locked file %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Data verification error: Source and target file have different content!</target> diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index 2fd6b6d0..20be9fe3 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -1,912 +1,1053 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y Kohteiden poisto onnistui -%x Bytes -%x tavua -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x päiviä -%x directories -%x hakemistoa -%x files -%x tiedostoa -%x hour(s) -%x tunti(a) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x riviä %y rivistä näytössä -%x of 1 row in view -%x 1:tä rivistä näytössä -%x sec -%x s -%x% -%x% -&Abort -&Lopeta -&About... -&Ohje... -&Advanced -&Laajennettu -&Cancel -&Lopeta -&Check for new version -Etsi &uusi versio -&Content -&Sisältö -&Create batch job... -&Luo eräajo... -&Default -&Vakio -&Exit -&Poistu -&Export file list... -&Vie tiedostojoukko... -&File -&Tiedosto -&Find next -&Esi seuraava -&Global settings... -&Yleiset asetukset... -&Help -&Ohje -&Ignore -&Unohda -&Language -&Kieli -&Load -&Lataa -&Load configuration... -Asetusten &lataus... -&New -&Uusi -&No -&Ei -&OK -&OK -&Pause -&Keskeytä -&Program -&Ohjelma -&Quit -&Lopeta -&Restore -&Palauta -&Retry -&Uudestaan -&Save -&Tallenna -&Switch -&Vaihda -&Yes -&Kyllä -(Build: %x) -(Versio: %x) -(Requires an Internet connection!) -(Vaatii Internet-yhteyden!) -- Other side's counterpart to %dir -- Toisen puolen vastaavuus on %dir -- Other side's counterpart to %name -- Toisen puolen vastaavuus on %name -- conflict -- eroavuus -- conflict (same date, different size) -- eroavuus (sama päivämäärä, eri koko) -- different -- erilainen -- directory part only -- vain hakemistossa -- equal -- yhtenevät -- exists left only -- olemassa vain vasemmalla -- exists right only -- olemassa vain oikealla -- full file or directory name -- tiedoston tai hakemiston koko nimi -- left -- vasen -- left newer -- uudempi vasemmalla -- right -- oikea -- right newer -- uudempi oikealla -/sec -/s -1 directory -1 hakemisto -1 file -1 tiedosto -1. &Compare -1. &Vertaa -1. Enter relative file or directory names separated by ';' or a new line. -1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto -1. Select directories to monitor. -1. Valitse seurattavat hakemistot -2. &Synchronize... -2. &Täsmäytä... -2. Enter a command line. -2. Anna komentokehoite -2. Use wildcard characters '*' and '?'. -2. Käytä jokerimerkkejä '*' ja '?' . -3. Exclude files directly on main grid via context menu. -3. Sulje tiedostoja pois suoraan pääikkunassa viite hakemiston avulla. -3. Press 'Start'. -3. Paina 'Käynnistä'. -<Automatic> -<- Automaattinen -> -<Directory> -<Hakemisto> -<Last session> -<Edellinen istunto> -<Symlink> -<Symlinkki> -<multiple selection> -<monivalinta> -A directory input field is empty. -Hekemistokenttä on tyhjä. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäytys asetuksia! -A newer version of FreeFileSync is available: -FreeFileSync:n uusi versio on saatavilla: -Abort requested: Waiting for current operation to finish... -Ohjelma on lopetettava: Odotetaan toiminnon loppumista... -Abort synchronization immediately -Lopeta täsmäytys välittömästi -Aborted -Lopetettu -About -Ohje -Action -Suorita -Add folder -Lisää hakemisto -Add folder pair -Lisää hakemistopari -All directories in sync! -Kaikki hakemistot täsmäävät! -An exception occurred! -Virhe havaittu! -As a result the files are separated into the following categories: -Tiedoston on avattu seuraaviin luokkiin: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jos niiden sisältö täsmää. Ominaisuus soveltuu paremmin yhdenpitävyyden tarkistukseen kuin varmistukseen. Siksi tiedostojen aikaleimaa ohitetaan.\n\nPäätöksentekopuu on tästä syystä pienempi: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Luo komentotiedosto täsmäytyksen automaattiseen eräajoon. Käynnistä eräajo liittämällä FreeFileSync ohjelmalle komentotiedosto: FreeFileSync.exe <eräajotiedosto>. Tehtävän suoritusta voit ajoittaa käyttöjärjestelmän toimilla. -At least one directory input field is empty. -Vähintäin yksi hakemiston syöttökenttä on tyhjä. -Auto-adjust columns -Säädä sarakeleveys automaattisesti -Batch execution -Eräajon suoritus -Batch file created successfully! -Eräajotiedosto luotu onnistuneesti! -Batch job -Eräajo -Big thanks for localizing FreeFileSync goes out to: -Suuret kiitokset FreeFileSync:n kääntämisestä: -Both sides have changed since last synchronization! -Molemmat puolet muuttuneet edellisestä täsmäytyksestä! -Browse -Selaa -Browse directory -Selaa hakemistoa -Cannot determine sync-direction: -Täsmäytys suuntä tuntematon: -Cannot find %x -En löydä %x -Cannot write to empty directory path! +<header> + <language name>Suomi</language name> + <translator>Nalle Juslén</translator> + <locale>fi_FI</locale> + <flag file>finland.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> -Category -Luokka -Clear filter settings -Nollaa suodin -Comma separated list -CSV-muotoinen lista -Command line -Komentokehote -Command line is empty! -Tyhjä komentokehoite! -Compare -Vertaile -Compare both sides -Vertaileea puolet keskenään -Compare by \"File content\" -Vertaa: \"tietosisältöä\" -Compare by \"File size and date\" -Vertaa: \"tiedoston koko ja -päiväys\" -Compare by... -Vertaile... -Comparing content of files %x -Vertaa tiedostojen %x tietosisältöä -Comparing content... -Tietosisällön vertailu... -Comparing files by content failed. -Tietosisällön vertailu epäonnistui. -Comparison Result -Vertailun tulos -Comparison settings -Vertailun asetukset -Completed -Valmis -Configuration -Asetukset -Configuration loaded! -Asetukset ladattu! -Configuration overview: -Asetukset: -Configuration saved! -Asetukset tallennettu! -Configure filter -Aseta suodatus -Configure your own synchronization rules. -Määrittele oma täsmäytyssääntö. -Confirm -Vahvista -Conflict detected: -Ristiriita todettu: -Conflicts/files that cannot be categorized -Ristiriita/tiedostoja joita ei voida luokitella -Continue -Jatka -Conversion error: -Konversio virhe: -Copy attributes only from left to right -Monista vain ominaisuudet vasen -> oikea -Copy attributes only from right to left -Monista vain ominaisuudet oikea -> vasen -Copy filesystem permissions -Monista tiedosto-oikeudet -Copy from left to right -Kopioidaan vasen -> oikea -Copy from left to right overwriting -Kopioidaan vasen -> oikea ylikirjoittaen -Copy from right to left -Kopioidaan oikea -> vasen -Copy from right to left overwriting -Kopioidaan oikea -> vasen ylikirjoittaen -Copy locked files -Kopioi lukitut tiedostot -Copy new or updated files to right folder. -Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopioi jaetut/lukitut tiedostot Volume Shadow Copy prosessilla\n(Vaatii Järjestelmävalvojan oikeuksia) -Copy to clipboard\tCTRL+C -Kopioi Leikepöydälle\tCTRL+C -Copying new Symbolic Link %x to %y -Kopioi uusi Symlinkki %x -> %y -Copying new file %x to %y -Kopioi uusi tiedosto %x -> %y -Could not determine volume name for file: -Levyasemaa ei tunnistettu tiedostolle: -Could not initialize directory monitoring: -Ei voitu käynnistää hakemiston tarkkailua: -Could not load a required DLL: -Tarvittu DLL ei lataudu: -Could not read values for the following XML nodes: -Tietoja lukeminen epäonnistui, XML jäsen: -Create a batch job -Eräajon luonti -Creating folder %x -Luo hakemisto %x -Custom -Oma määritelmä -Customize columns -Sovita sarake -Customize... -Sovita... -D-Click -Klikkaa D -DECISION TREE -PÄÄTÖSPUU -Data verification error: Source and target file have different content! -Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö! -Date -Päiväys -Delete files/folders existing on left side only -Poista vain tiedostoja/hakemistoja vasemmalta -Delete files/folders existing on right side only -Poista vain tiedostoja/hakemistoja oikealta -Delete files\tDEL -Poista tiedostoja\tDEL -Delete on both sides -Poista molemmilta puolilta -Delete on both sides even if the file is selected on one side only -Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella -Delete or overwrite files permanently -Poista tai ylikirjoita tiedostoja pysyvästi -Delete permanently -Poista pysyvästi -Deleting Symbolic Link %x -Poista Symlinkki %x -Deleting file %x -Poista tiedosto %x -Deleting folder %x -Poista hakemisto %x -Deletion handling -Poistotapa -Description -Seloste -Direct -Suoraan -Directories are dependent! Be careful when setting up synchronization rules: -Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti: -Directories to watch -Tarkkailtavat hakemistot -Directory -Hakemisto -Directory does not exist: -Puuttuva hakemisto: -Do not show this dialog again -Älä näytä tätä jatkossa -Do nothing -Älä tee mitään -Do you really want to delete the following object(s)? -Haluatko varmasti poista valittuja kohteita? -Do you really want to move the following object(s) to the Recycle Bin? -Haluatko varmasti siirtää valittuja kohteita Roskakoriin? -Do you want FreeFileSync to automatically check for updates every week? -Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain? -Donate with PayPal -Lahjoita PayPal:lla -Download now? -Lataa nyt? -Drag && drop -Vedä ja pudota -Elements found: -Osia löytyi: -Elements processed: -Osia käsitelty: -Elements remaining: -Osia jäljellä: -Email -S-posti -Encoding extended time information: %x -Tulkitaan laajennettua aikatietoa: %x -Endless loop when traversing directory: -Suorita hakemiston läpikulku jatkuvana: -Equal files/folders that differ in attributes only -Tiedostot/hakemistot ovat samat, atribuutit poikkeaa -Error -Virhe -Error changing modification time: -Virhe muuttaessa tiedoston aikaa: -Error copying file permissions: -Virhe kopioitaessa tiedoston oikeuksia: -Error copying file: -Virhe kopioitaessa tiedostoa: -Error copying locked file %x! -Virhe kopioitaessa lukittua tiedostoa %x! -Error copying symbolic link: -Symbolisen linkin kopiointi epäonnistui: -Error creating directory: -Virhe tapahtui hakemistoa luotassa: -Error deleting directory: -Virhe poistettaessa hakemistoa: -Error deleting file: -Virhe poistettaessa tiedostoa: -Error handling -Virhe käsitellessä -Error loading library function: -Virhe ladattaessa kirjastotoimintoa: -Error moving directory: -Virhe siirtäessä hakemistoa: -Error moving file: -Virhe siirtäessä tiedostoa: -Error moving to Recycle Bin: -Virhe siirtäessä Roskakoriin: -Error opening file: -Virhe avatessa tiedostoa: -Error parsing configuration file: -Virhe jäsentäessä asetustiedostoa: -Error reading file attributes: -Virhe lukiessa tiedoston ominaisuuksia: -Error reading file: -Virhe lukiessa tiedostoa: -Error reading from synchronization database: -Virhe lukiessa täsmäytyksen tietokantaa: -Error reading security context: -Virhe lukiessa tuvatietoja: -Error resolving symbolic link: -Virhe selvittäessä symbolista linkkiä: -Error setting directory lock: -Virhe asettaessa hakemiston lukkoa: -Error setting privilege: -Virte oikeuksia asettaessa: -Error starting Volume Shadow Copy Service! -Virhe käynnistäessä Volume Shadow Copy Service! -Error traversing directory: -Virhe hakemistoa läpikäydessä: -Error when monitoring directories. -Virhe seuratessa hakemistoa. -Error writing file: -Virhe kirjottaessa tiedosto: -Error writing security context: -Virhe kirjottaessa tuvatietoja: -Error writing to synchronization database: -Virhe kirjottaessa täsmäytyksen tietokantaa: -Example -Esimerkki -Exclude -Sulje pois -Exclude all rows -Sulje pois kaikki rivit -Exclude temporarily -Sulje pois tilapäisesti -Exclude via filter: -Sulje pois suotimella: -Exit instantly -Poistu välittömästi -Extension -Laajennus -External applications -Ulkopuolinen sovellus -Fatal Error -Kohtalokas virhe -Feedback and suggestions are welcome at: -Palaute ja ehdotukset saa lähettää: -File %x has an invalid date! -Tiedostolla %x on virheellinen päiväys! -File already exists. Overwrite? -Tiedosto on jo olemassa. Ylikirjoitetaanko? -File content -Tiedoston sisältö -File does not exist: -Tiedosto puuttuu: -File list exported! -Tiedosto lista viety! -File size and date -Tiedoston koko ja päiväys -Filename -Tiedostonimi -Files %x have the same date but a different size! -Tiedostot %x samalta päivältä mutta koko poikkeaa! -Files are found equal if\n - file content\nis the same -Tiedostot samat jos, \n - tiedoston sisältö\non sama -Files are found equal if\n - filesize\n - last write time and date\nare the same -Tiedosto samat jos, \n - koko\n - viimeinen aikaleima\non sama -Files that are equal on both sides -Tiedosto sama molemmilla puolilla -Files that exist on both sides, left one is newer -Tiedosto löytyy molemmilla puolilla, vasen on uudempi -Files that exist on both sides, right one is newer -Tiedosto löytyy molemmilla puolilla, oikea on uudempi -Files that have different content -Tiedostoja joissa eri sisältö -Files/folders that exist on left side only -Tiedostoja/hakemistoja vain vasemmalla -Files/folders that exist on right side only -Tiedostoja/hakemistoja vain oikealla -Filter files -Suodata tiedostoja -Filter is active -Suodin aktivoitu -Filter settings have changed! -Suodinasetukset muutettu! -Filter: All pairs -Suodata: kaikki parit -Filter: Single pair -Suodata: Yksi pari -Find -Etsi -Find what: -Etsi: -Folder Comparison and Synchronization -Hakemistojen vertailu ja täsmäytys -Folder pairs -Hakemistoparit -Follow -Seuraa -Free disk space available: -Levytilaa jäljellä: -Free disk space required: -Tarvittava vapaa levytila: -FreeFileSync Batch Job -FreeFileSync Eräajo -FreeFileSync at Sourceforge -FreeFileSync Sourceforge:lla -FreeFileSync batch file -FreeFileSync eräajotiedosto -FreeFileSync configuration -FreeFileSync asetukset -FreeFileSync is up to date! -FreeFileSync on ajan tasalla! -Full path -Koko polku -Generating database... -Luodaan tietokantaa... -Generating file list... -Luodaan tiedostolista... -Global settings -Yleiset asetukset -Help -Ohje -Hidden dialogs: -Piilotukset: -Hide all error and warning messages -Piilota kaikki virhe- ja varoitusviestit -Hide conflicts -Piilota ristiriidat -Hide excluded items -Piilota suodatetut -Hide files that are different -Piilota erilaiset tiedostot -Hide files that are equal -Piilota yhteneväiset tiedostot -Hide files that are newer on left -Piilota tiedostot jotka ovat uudempia vasemmalla -Hide files that are newer on right -Piilota tiedostot jotka ovat uudempia oikealla -Hide files that exist on left side only -Piilota tiedostot jotka ovat vain vasemmalla -Hide files that exist on right side only -Piilota tiedostot jotka ovat voin oikealla -Hide files that will be created on the left side -Piilota tiedostot jotka ovat luotu vasemmalla -Hide files that will be created on the right side -Piilota tiedostot jotka ovat luotu oikealla -Hide files that will be deleted on the left side -Piilota tiedostot jotka ovat poistettu vasemmalla -Hide files that will be deleted on the right side -Piilota tiedostot jotka ovat poistettu oikealla -Hide files that will be overwritten on left side -Piilota tiedostot jotka on ylikirjoitettu vasemmalla -Hide files that will be overwritten on right side -Piilota tiedostot jotka on ylikirjoitettu oikealla -Hide files that won't be copied -Piilota tiedostot jotka eivät kopioidu -Hide filtered or temporarily excluded files -Piilota suodatetut ja tilapäisesti poistetut -Hide further error messages during the current process -Piilota toistuvat virheet tässä suorituksessa -Hints: -Vihje: -Homepage -Kotisivu -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti. -Idle time between detection of last change and execution of command line in seconds -Joutoaika viimeisen muutos havainnon ja käskyn suorittamisen välillä, sekunneissa -If you like FFS -Jos pidät FFS:tä -Ignore -Sivuta -Ignore errors -Älä huomioi virheitä -Ignore subsequent errors -Jätä toistuvia virheitä huomiotta -Include -Sisällytä -Include all rows -Sisällytä kaikki rivit -Include temporarily -Sisällytä tilapäisesti -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Sisällytä: *.doc;*.zip;*.exe\nSulje pois: \\stuff\\temp\\* -Incompatible synchronization database format: -Täsmäytyksen tietokannan muoto on virheellinen: -Info -Info -Information -Tietoja -Initial synchronization: -Ensi täsmäytys: -Integrate external applications into context menu. The following macros are available: -Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa: -Invalid FreeFileSync config file! -Virheellinen FreeFileSync asetustiedosto! -Last used configurations (press DEL to remove from list) -Viimeksi käytetty asetus (poista listalta paina DEL) -Leave as unresolved conflict -Jätä ratkaisemattomana virheenä -Left -Vasen -Legend -Selite -Load configuration from file -Lataa asetuksia tiedostosta -Log-messages: -Lokin viestit: -Logging -Kirjaa -Main bar -Päävalikko -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota. -Match case -Täsmää kirjainkoko -Maximum number of logfiles: -Lokitiedostojen enimmäismäärä: -Memory allocation failed! -Muistin varaus epäonnistui! -Minimum Idle Time [seconds] -Minimi joutoaika [sekuntteja] -Mirror ->> -Peilaava ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta. -Monitoring active... -Seuranta käynnissä... -More than 50% of the total number of files will be copied or deleted! -Enemmän kuin 50% tiedostoista kopioidaan tai poistetaan! -Move column down -Siirrä sarake alas -Move column up -Siirrä sarake ylös -Move files into a time-stamped subdirectory -Siirrä tiedostot aikaleimattuun hakemistoon -Moving %x to Recycle Bin -Siirrä %x Roskakoriin -Moving Symbolic Link %x to user-defined directory %y -Siirrä Symlinkki %x valittuun hakemistoon %y -Moving file %x to user-defined directory %y -Siirretään tiedostoa %x valittuun hakemistoon %y -Moving folder %x to user-defined directory %y -Siirrä hakemisto %x valittuun hakemistoon %y -Multiple... -Moninkertainen... -No change since last synchronization! -Ei muutoksia edellisen täsmäytyksen jälkeen! -No filter selected -Suodin valitsematta -Not enough free disk space available in: -Levytila ei riitä: -Nothing to synchronize according to configuration! -Asetusten mukaan ei löydy täsmäytettävää ! -Number of files and directories that will be created -Kirjataan tiedostojen ja hakemistojen lukumäärää -Number of files and directories that will be deleted -Poistetaan tiedostojen ja hakemistojen lukumäärää -Number of files that will be overwritten -Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä -One of the FreeFileSync database entries within the following file is not yet existing: -Jokin FreeFileSynk tietokannan olioista puuttuu vielä tiedostossa: -One of the FreeFileSync database files is not yet existing: -Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Täsmäytykseen valitaan vain suodatetut tiedostot/hakemistot. Suodatus suoritetaan täsmäytyksen perus hakemistojen mukaisiin suhteellisiin nimiin. -Open with Explorer -Avaa Explorerilla -Open with default application -Avaa oletus sovelluksessa -Operation aborted! -Toiminto lopetettiin! -Operation: -Toiminto: -Overview -Yleiskatsaus -Overwriting Symbolic Link %x in %y -Ylikirjoita Symlinkki %x kohdassa %y -Overwriting file %x in %y -Ylikirjoita tiedosto %x kohdassa %y -Pause -Tauko -Paused -Pysäytetty -Planned directory deletion is in conflict with its subdirectories and -files! -Suunniteltu hakemiston poistaminen on ristiriidassa alihakemiston ja tiedostojen kanssa! -Please run a Compare first before synchronizing! -Aja tarkistus ennen täsmäytystä. -Press \"Switch\" to open FreeFileSync GUI mode. -Paina \"Vaihda\" Avaa FreeFileSync GUI toimintoa. -Processing folder pair: -Käsitellään hakemistoparia: -Published under the GNU General Public License: -Julkaistu lisenssillä GNU General Public License: -Question -Kysymys -RealtimeSync - Automated Synchronization -RealtimeSync - Automaattinen täsmäytys -RealtimeSync configuration -RealtimeSync Asetukset -Recycle Bin not yet supported for this system! -Roskakori ei vielä tue tätä järjestelmää! -Relative path -Suhteellinen polku -Remove alternate settings -Poista toinen asetus -Remove folder -Poista hakemisto -Remove folder pair -Poista hakemistopari -Report translation error -Ilmoita käännösvirheestä -Reset -Palauta -Reset view -Palauta näkymä -Restore all hidden dialogs? -Palauttetaanko kaikki piilodialoogit? -Right -Oikea -S&ave configuration... -Asetukset t&allennetaan... -S&witch view -Vaihda &näkymää -Save changes to current configuration? -Tallenna asetuksiin tehdyt muutokset? -Save current configuration to file -Tallenna nämä asetukset tiedostoon -Scanning... -Haen tiedostoja... -Scanning: -Haen: -Select a folder -Valitse hakemisto -Select alternate synchronization settings -Valitse toiset täsmäytys aseetukset -Select logfile directory: -Hakemisto lokitiedostoille: -Select variant: -Valitse vaihtoehto: -Select view -Valitse näkymä -Set direction: -Aseta suunta: -Setting default synchronization directions: Old files will be overwritten with newer files. -Aseta oletu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla. -Show \"%x\" -Näytä \"%x\" -Show conflicts -Näytä ristiriidat -Show files that are different -Näytä poikkeavat tiedostot -Show files that are equal -Näytä yhtenevät tiedostot -Show files that are newer on left -Näytä uudemmat tiedostot vasemmalla -Show files that are newer on right -Näytä uudemmat tiedostot oikealla -Show files that exist on left side only -Näytä vain vasemmalla esiintyvät tiedostot -Show files that exist on right side only -Näytä vain oikealla esiintyvät tiedostot -Show files that will be created on the left side -Näytä vasemmalle luotavat tiedostot -Show files that will be created on the right side -Näytä oikealle luotavat tiedostot -Show files that will be deleted on the left side -Näytä vasemmalla poistettavat tiedostot -Show files that will be deleted on the right side -Näytä oikealla poistettavat tiedostot -Show files that will be overwritten on left side -Näytä vasemmalla ylikirjoitettavat tiedostot -Show files that will be overwritten on right side -Näytä oikealla ylikirjoitettavat tiedostot -Show files that won't be copied -Näytä kopioimatta jäävät tiedostot -Show hidden dialogs -Näytä piilotetut dialogit -Show popup -Näytä Popup -Show popup on errors or warnings -Näytä virheet ja varoitukset Popupissa -Significant difference detected: -Merkittävä eroavaisuus todettu: -Silent mode -Hiljainen suoritus -Size -Koko -Source code written completely in C++ utilizing: -Lähdekoodi kirjoitettu kokonaan C++ käyttäen: -Source directory does not exist anymore: -Lähdehakemisto puuttuu: -Speed: -Nopeus: -Start -Käynnistä -Start minimized and write status information to a logfile -Käynnistä minimoituna ja kirjoita statukset lokiin -Start synchronization -Käynnistä täsmäytys -Statistics -Tilastot -Status feedback -Tilan palaute -Stop -Stop -Swap sides -Puolten vaihto -Switching to FreeFileSync GUI mode... -Siirtyminen FreeFileSync GUI toimintoon... -Symbolic Link handling -Symlinkkien hallinta -Symlinks %x have the same date but a different target! -Symlinkki %x samalta päivältä mutta kohde on toinen! -Synchronization Preview -Täsmäytyksen esikatselu -Synchronization aborted! -Täsmäytys lopetettiin! -Synchronization completed successfully! -Täsmäytys suoritettu onnistuneesti! -Synchronization completed with errors! -Täsmäytys päättyi virheisiin! -Synchronization settings -Täsmäytyksen asetukset -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi hakemistossa \"temp\" oleva. -Synchronize... -Täsmäytä... -Synchronizing... -Täsmäytetään... -Target directory already existing! -Haluttu tiedosto on jo olemassa! -Target file already existing! -Kohde tiedosto on jo olemassa! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Komento suoritetaan kun:\n- nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan)\n- tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan -The file does not contain a valid configuration: -Asetustiedosto ei ole kelvollinen: -The file was not processed by last synchronization! -Tiedostoa ei käsitelty viime täsmäytyksessä! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Tämä vaihtoehto todentaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama. -Time -Aika -Time elapsed: -Kulunut aika: -Time remaining: -Aikaa jäljellä: -Total amount of data that will be transferred -Siirrettävän datan määrä -Total time: -Kokonaisaika: -Transfer file and directory permissions\n(Requires Administrator rights) -Siirrä tiedosto ja hekimisto-oikeuksia\n(Vaatii Järjestelmävalvojan oikeuksia) -Unable to connect to sourceforge.net! -Kytkeytyminen ei onnistu kohteeseen sourceforge.net! -Unable to create logfile! -Lokitiedostoa ei pystytä luomaan! -Unresolved conflicts existing! -Ratkaisemattomia poikkeamia! -Update -> -Päivittävä -> -Updating attributes of %x -Päivita %x:n ominaisuudet -Usage: -Käyttö: -Use Recycle Bin -Käytä Roskakoria -Use Recycle Bin when deleting or overwriting files -Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja -User-defined directory for deletion was not specified! -Hakemistoa ei valittu poistolle! -Variant -Vaihtoehto -Verifying file %x -Tarkistan tiedosto %x -Versioning -Versiointi -Volume name %x not part of filename %y! -Osan nimi %x ei esiinny tiedostonimessä %y! -Waiting for missing directories... -Odottaa puuttuvia hakemistoja... -Waiting while directory is locked (%x)... -Odotan hakemiston lukitusta (%x)... -Warning -Varoitus -When the comparison is started with this option set the following decision tree is processed: -Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu: -You can ignore conflicts and continue synchronization. -Voit jatkaa poikkeamista huolimatta täsmäytystä. -You can ignore this error to consider the directory as empty. -Voit jättää tämä virhe huomiotta ja tulkita hakemisto tyhjäksi. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)! -different -erilaiset -file exists on both sides -tiedosto löytyy molemmilla puolilla -on one side only -vain yhdellä puolella +<source>Show in Explorer</source> +<target>Näytä Explorerissa</target> +<source>Open with default application</source> +<target>Avaa oletus sovelluksessa</target> +<source>Browse directory</source> +<target>Selaa hakemistoa</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automaattinen täsmäytys</target> +<source>Browse</source> +<target>Selaa</target> +<source>Error resolving symbolic link:</source> +<target>Virhe selvittäessä symbolista linkkiä:</target> +<source>Select alternate synchronization settings</source> +<target>Valitse toiset asetukset täsmäytykselles</target> +<source>No filter selected</source> +<target>Suodin valitsematta</target> +<source>Filter is active</source> +<target>Suodin aktivoitu</target> +<source>Clear filter settings</source> +<target>Nollaa suodin</target> +<source>Remove alternate settings</source> +<target>Poista toinen asetus</target> +<source>Create a batch job</source> +<target>Eräajon luonti</target> +<source>Synchronization settings</source> +<target>Täsmäytyksen asetukset</target> +<source>Comparison settings</source> +<target>Vertailun asetukset</target> +<source>About</source> +<target>Ohje</target> +<source>Error</source> +<target>Virhe</target> +<source>Warning</source> +<target>Varoitus</target> +<source>Question</source> +<target>Kysymys</target> +<source>Confirm</source> +<target>Vahvista</target> +<source>Configure filter</source> +<target>Määritä suodin</target> +<source>Customize columns</source> +<target>Sovita sarake</target> +<source>Global settings</source> +<target>Yleiset asetukset</target> +<source>Synchronization Preview</source> +<target>Täsmäytyksen esikatselu</target> +<source>Find</source> +<target>Etsi</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 tavu</pluralform> +<pluralform>%x tavua</pluralform> +</target> +<source><Symlink></source> +<target><Symlinkki></target> +<source><Directory></source> +<target><Hakemisto></target> +<source>Size</source> +<target>Koko</target> +<source>Date</source> +<target>Päiväys</target> +<source>Full path</source> +<target>Koko polku</target> +<source>Filename</source> +<target>Tiedostonimi</target> +<source>Relative path</source> +<target>Suhteellinen polku</target> +<source>Directory</source> +<target>Hakemisto</target> +<source>Extension</source> +<target>Laajennus</target> +<source>Comparison Result</source> +<target>Vertailun tulos</target> +<source>Incompatible synchronization database format:</source> +<target>Täsmäytyksen tietokannan muoto on virheellinen:</target> +<source>Initial synchronization:</source> +<target>Ensi täsmäytys:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Jokin FreeFileSynk tietokannan olioista puuttuu vielä tiedostossa:</target> +<source>Error reading from synchronization database:</source> +<target>Virhe lukiessa täsmäytyksen tietokantaa:</target> +<source>An exception occurred!</source> +<target>Virhe havaittu!</target> +<source>Error deleting file:</source> +<target>Virhe poistettaessa tiedostoa:</target> +<source>Error reading file attributes:</source> +<target>Virhe lukiessa tiedoston ominaisuuksia:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Odotan hakemiston lukitusta (%x)...</target> +<source>Error setting directory lock:</source> +<target>Virhe asettaessa hakemiston lukkoa:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 s</pluralform> +<pluralform>%x s</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Kohtalokas virhe</target> +<source>File does not exist:</source> +<target>Tiedosto puuttuu:</target> +<source>Error parsing configuration file:</source> +<target>Virhe jäsentäessä asetustiedostoa:</target> +<source>Error writing file:</source> +<target>Virhe kirjottaessa tiedostoa:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Virheellinen FreeFileSync asetustiedosto!</target> +<source>/sec</source> +<target>/s</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 tunti</pluralform> +<pluralform>%x tuntia</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 päivä</pluralform> +<pluralform>%x päivää</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Asetukset t&allennetaan...</target> +<source>&Load configuration...</source> +<target>Asetusten &lataus...</target> +<source>&Quit</source> +<target>&Lopeta</target> +<source>&File</source> +<target>&Tiedosto</target> +<source>&Content</source> +<target>&Sisältö</target> +<source>&About...</source> +<target>&Ohje...</target> +<source>&Help</source> +<target>&Ohje</target> +<source>Usage:</source> +<target>Käyttö:</target> +<source>1. Select directories to monitor.</source> +<target>1. Valitse seurattavat hakemistot</target> +<source>2. Enter a command line.</source> +<target>2. Anna komentokehoite</target> +<source>3. Press 'Start'.</source> +<target>3. Paina 'Käynnistä'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Komento suoritetaan kun: +- nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan) +- tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan +</target> +<source>Directories to watch</source> +<target>Tarkkailtavat hakemistot</target> +<source>Add folder</source> +<target>Lisää hakemisto</target> +<source>Remove folder</source> +<target>Poista hakemisto</target> +<source>Select a folder</source> +<target>Valitse hakemisto</target> +<source>Command line</source> +<target>Komentokehote</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimi joutoaika [sekunttia]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Joutoaika viimeisen muutos havainnon ja käskyn suorittamisen välillä, sekunneissa</target> +<source>Start</source> +<target>Käynnistä</target> +<source>(Build: %x)</source> +<target>(Versio: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync Asetukset</target> +<source>File already exists. Overwrite?</source> +<target>Tiedosto on jo olemassa. Ylikirjoitetaanko?</target> +<source>&Restore</source> +<target>&Palauta</target> +<source>&Exit</source> +<target>&Poistu</target> +<source>Monitoring active...</source> +<target>Seuranta käynnissä...</target> +<source>Waiting for missing directories...</source> +<target>Odottaa puuttuvia hakemistoja...</target> +<source>Command line is empty!</source> +<target>Tyhjä komentokehoite!</target> +<source>Could not initialize directory monitoring:</source> +<target>Hakemiston tarkkailua ei voitu käynnistää:</target> +<source>A directory input field is empty.</source> +<target>Hekemistokenttä on tyhjä.</target> +<source>Error when monitoring directories.</source> +<target>Virhe seuratessa hakemistoa.</target> +<source>Drag && drop</source> +<target>Vedä ja pudota</target> +<source>Conversion error:</source> +<target>Konversio virhe:</target> +<source>Error moving file:</source> +<target>Virhe siirtäessä tiedostoa:</target> +<source>Operation aborted!</source> +<target>Toiminto lopetettiin!</target> +<source>Target file already existing!</source> +<target>Kohde tiedosto on jo olemassa!</target> +<source>Error moving directory:</source> +<target>Virhe siirtäessä hakemistoa:</target> +<source>Target directory already existing!</source> +<target>Haluttu tiedosto on jo olemassa!</target> +<source>Error deleting directory:</source> +<target>Virhe poistettaessa hakemistoa:</target> +<source>Error changing modification time:</source> +<target>Virhe muuttaessa tiedoston aikaa:</target> +<source>Error loading library function:</source> +<target>Virhe ladattaessa kirjastotoimintoa:</target> +<source>Error reading security context:</source> +<target>Virhe lukiessa tuvatietoja:</target> +<source>Error writing security context:</source> +<target>Virhe kirjottaessa turvatietoja:</target> +<source>Error copying file permissions:</source> +<target>Virhe kopioitaessa tiedoston oikeuksia:</target> +<source>Error creating directory:</source> +<target>Virhe hakemistoa luotassa:</target> +<source>Error copying symbolic link:</source> +<target>Symbolisen linkin kopiointi epäonnistui:</target> +<source>Error copying file:</source> +<target>Virhe kopioitaessa tiedostoa:</target> +<source>Error opening file:</source> +<target>Virhe avatessa tiedostoa:</target> +<source>Error reading file:</source> +<target>Virhe lukiessa tiedostoa:</target> +<source>Endless loop when traversing directory:</source> +<target>Suorita hakemiston läpikulku jatkuvana:</target> +<source>Error traversing directory:</source> +<target>Virhe hakemistoa läpikäydessä:</target> +<source>Error setting privilege:</source> +<target>Virte oikeuksia asettaessa:</target> +<source>Error moving to Recycle Bin:</source> +<target>Virhe siirtäessä Roskakoriin:</target> +<source>Could not load a required DLL:</source> +<target>Tarvittu DLL ei lataudu:</target> +<source>Error writing to synchronization database:</source> +<target>Virhe kirjottaessa täsmäytyksen tietokantaa:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Virhe käynnistäessä Volume Shadow Copy Service!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota.</target> +<source>Could not determine volume name for file:</source> +<target>Levyasemaa ei tunnistettu tiedostolle:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Osan nimi %x ei esiinny tiedostonimessä %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Tietoja lukeminen epäonnistui, XML jäsen:</target> +<source>Show popup</source> +<target>Näytä Popup</target> +<source>Show popup on errors or warnings</source> +<target>Näytä virheet ja varoitukset Popupissa</target> +<source>Ignore errors</source> +<target>Älä huomioi virheitä</target> +<source>Hide all error and warning messages</source> +<target>Piilota kaikki virhe- ja varoitusviestit</target> +<source>Exit instantly</source> +<target>Poistu välittömästi</target> +<source>Abort synchronization immediately</source> +<target>Lopeta täsmäytys välittömästi</target> +<source>Logging</source> +<target>Kirjaa</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync eräajotiedosto</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync asetukset</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Eräajo</target> +<source>Unable to create logfile!</source> +<target>Lokitiedostoa ei pystytä luomaan!</target> +<source>Batch execution</source> +<target>Eräajon suoritus</target> +<source>Log-messages:</source> +<target>Lokin viestit:</target> +<source>Stop</source> +<target>Seis</target> +<source>Total time:</source> +<target>Kokonaisaika:</target> +<source>Synchronization aborted!</source> +<target>Täsmäytys lopetettiin!</target> +<source>Synchronization completed with errors!</source> +<target>Täsmäytys päättyi virheisiin!</target> +<source>Synchronization completed successfully!</source> +<target>Täsmäytys suoritettu onnistuneesti!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Paina "Vaihda" Avaa FreeFileSync GUI toimintoa.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Siirtyminen FreeFileSync GUI toimintoon...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Kytkeytyminen ei onnistu kohteeseen sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>FreeFileSync:n uusi versio on saatavilla:</target> +<source>Download now?</source> +<target>Lataa nyt?</target> +<source>Information</source> +<target>Tietoja</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync on ajan tasalla!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain?</target> +<source>(Requires an Internet connection!)</source> +<target>(Vaatii Internet-yhteyden!)</target> +<source>1. &Compare</source> +<target>1. &Vertaa</target> +<source>2. &Synchronize...</source> +<target>2. &Täsmäytä...</target> +<source>S&witch view</source> +<target>Vaihda &näkymää</target> +<source>&New</source> +<target>&Uusi</target> +<source>&Program</source> +<target>&Ohjelma</target> +<source>&Language</source> +<target>&Kieli</target> +<source>&Global settings...</source> +<target>&Yleiset asetukset...</target> +<source>&Create batch job...</source> +<target>&Luo eräajo...</target> +<source>&Export file list...</source> +<target>&Vie tiedostojoukko...</target> +<source>&Advanced</source> +<target>&Laajennettu</target> +<source>&Check for new version</source> +<target>Etsi &uusi versio</target> +<source>Compare</source> +<target>Vertaile</target> +<source>Compare both sides</source> +<target>Vertaile puolet keskenään</target> +<source>&Abort</source> +<target>&Lopeta</target> +<source>Synchronize...</source> +<target>Täsmäytä...</target> +<source>Start synchronization</source> +<target>Käynnistä täsmäytys</target> +<source>Swap sides</source> +<target>Puolten vaihto</target> +<source>Add folder pair</source> +<target>Lisää hakemistopari</target> +<source>Remove folder pair</source> +<target>Poista hakemistopari</target> +<source>Save current configuration to file</source> +<target>Tallenna nämä asetukset tiedostoon</target> +<source>Load configuration from file</source> +<target>Lataa asetuksia tiedostosta</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Viimeksi käytetty asetus (poista listalta paina DEL)</target> +<source>Hide excluded items</source> +<target>Piilota suodatetut</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Piilota suodatetut ja tilapäisesti poistetut</target> +<source>Number of files and directories that will be created</source> +<target>Kirjataan tiedostojen ja hakemistojen lukumäärää</target> +<source>Number of files that will be overwritten</source> +<target>Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä</target> +<source>Number of files and directories that will be deleted</source> +<target>Poistetaan tiedostojen ja hakemistojen lukumäärää</target> +<source>Total amount of data that will be transferred</source> +<target>Siirrettävän datan määrä</target> +<source>Left</source> +<target>Vasen</target> +<source>Right</source> +<target>Oikea</target> +<source>Batch job</source> +<target>Eräajo</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Luo komentotiedosto täsmäytyksen automaattiseen eräajoon. Käynnistä eräajo liittämällä FreeFileSync ohjelmalle komentotiedosto: FreeFileSync.exe <eräajotiedosto>. Tehtävän suoritusta voit ajoittaa käyttöjärjestelmän toimilla.</target> +<source>Help</source> +<target>Ohje</target> +<source>Configuration overview:</source> +<target>Asetukset:</target> +<source>Filter files</source> +<target>Suodata tiedostoja</target> +<source>Status feedback</source> +<target>Tilan palaute</target> +<source>Silent mode</source> +<target>Hiljainen suoritus</target> +<source>Start minimized and write status information to a logfile</source> +<target>Käynnistä minimoituna ja kirjoita statukset lokiin</target> +<source>Error handling</source> +<target>Virhe käsitellessä</target> +<source>Overview</source> +<target>Yleiskatsaus</target> +<source>Select logfile directory:</source> +<target>Hakemisto lokitiedostoille:</target> +<source>Maximum number of logfiles:</source> +<target>Lokitiedostojen enimmäismäärä:</target> +<source>&Save</source> +<target>&Tallenna</target> +<source>&Load</source> +<target>&Lataa</target> +<source>&Cancel</source> +<target>&Lopeta</target> +<source>Elements found:</source> +<target>Osia löytyi:</target> +<source>Elements remaining:</source> +<target>Osia jäljellä:</target> +<source>Speed:</source> +<target>Nopeus:</target> +<source>Time remaining:</source> +<target>Aikaa jäljellä:</target> +<source>Time elapsed:</source> +<target>Kulunut aika:</target> +<source>Operation:</source> +<target>Toiminto:</target> +<source>Select variant:</source> +<target>Valitse vaihtoehto:</target> +<source><Automatic></source> +<target><- Automaattinen -></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti.</target> +<source>Mirror ->></source> +<target>Peilaava ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta.</target> +<source>Update -></source> +<target>Päivittävä -></target> +<source>Copy new or updated files to right folder.</source> +<target>Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon.</target> +<source>Custom</source> +<target>Oma määritelmä</target> +<source>Configure your own synchronization rules.</source> +<target>Määrittele oma täsmäytyssääntö.</target> +<source>Deletion handling</source> +<target>Poistotapa</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Asetukset</target> +<source>Category</source> +<target>Luokka</target> +<source>Action</source> +<target>Suorita</target> +<source>Files/folders that exist on left side only</source> +<target>Tiedostoja/hakemistoja vain vasemmalla</target> +<source>Files/folders that exist on right side only</source> +<target>Tiedostoja/hakemistoja vain oikealla</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Tiedosto löytyy molemmilla puolilla, vasen on uudempi</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Tiedosto löytyy molemmilla puolilla, oikea on uudempi</target> +<source>Files that have different content</source> +<target>Tiedostoja joissa eri sisältö</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Ristiriita/tiedostoja joita ei voida luokitella</target> +<source>Compare by...</source> +<target>Vertaile...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Tiedosto samat jos, + - koko + - viimeinen tallennusaika +on sama +</target> +<source>File size and date</source> +<target>Tiedoston koko ja päiväys</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Tiedostot samat jos, + - tiedoston sisältö +on sama +</target> +<source>File content</source> +<target>Tiedoston sisältö</target> +<source>Symbolic Link handling</source> +<target>Symlinkkien hallinta</target> +<source>Synchronizing...</source> +<target>Täsmäytetään...</target> +<source>Elements processed:</source> +<target>Osia käsitelty:</target> +<source>&Pause</source> +<target>&Keskeytä</target> +<source>Compare by "File size and date"</source> +<target>Vertaa: "tiedoston koko ja -päiväys"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Tämä vaihtoehto todentaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Tiedoston on avattu seuraaviin luokkiin:</target> +<source>- equal</source> +<target>- yhtenevät</target> +<source>- left newer</source> +<target>- uudempi vasemmalla</target> +<source>- right newer</source> +<target>- uudempi oikealla</target> +<source>- exists left only</source> +<target>- olemassa vain vasemmalla</target> +<source>- exists right only</source> +<target>- olemassa vain oikealla</target> +<source>- conflict</source> +<target>- eroavuus</target> +<source>Compare by "File content"</source> +<target>Vertaa: "tietosisältöä"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jos niiden sisältö täsmää. Ominaisuus soveltuu paremmin yhdenpitävyyden tarkistukseen kuin varmistukseen. Siksi tiedostojen aikaleimaa ohitetaan. + +Päätöksentekopuu on tästä syystä pienempi: +</target> +<source>- different</source> +<target>- erilainen</target> +<source>Source code written in C++ utilizing:</source> +<target>Koodikieli on C++ käyttäen:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Suuret kiitokset FreeFileSync:n kääntämisestä:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Palaute ja ehdotukset saa lähettää:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync Sourceforge:lla</target> +<source>Homepage</source> +<target>Kotisivu</target> +<source>If you like FFS</source> +<target>Jos pidät FFS:tä</target> +<source>Donate with PayPal</source> +<target>Lahjoita PayPal:lla</target> +<source>Email</source> +<target>S-posti</target> +<source>Report translation error</source> +<target>Ilmoita käännösvirheestä</target> +<source>Published under the GNU General Public License:</source> +<target>Julkaistu lisenssillä GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Jätä toistuvia virheitä huomiotta</target> +<source>Hide further error messages during the current process</source> +<target>Piilota toistuvat virheet tässä suorituksessa</target> +<source>&Ignore</source> +<target>&Unohda</target> +<source>&Retry</source> +<target>&Uudestaan</target> +<source>Do not show this dialog again</source> +<target>Älä näytä tätä jatkossa</target> +<source>&Switch</source> +<target>&Vaihda</target> +<source>&Yes</source> +<target>&Kyllä</target> +<source>&No</source> +<target>&Ei</target> +<source>Delete on both sides</source> +<target>Poista molemmilta puolilta</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella</target> +<source>Use Recycle Bin</source> +<target>Käytä Roskakoria</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Täsmäytykseen valitaan vain ne tiedostot/hakemistot jotka täyttävät kaikkia kriteerejä. +HUOM: Nimetty suodin on oltava määritelty relatiivisesti(!) päähakemistoon nähden. +</target> +<source>Hints:</source> +<target>Vihje:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Käytä jokerimerkkejä '*' ja '?' .</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Sulje tiedostoja pois suoraan pääikkunassa viitehakemiston avulla.</target> +<source>Example</source> +<target>Esimerkki</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Sisällytä : *.doc;*.zip;*.exe +Sulje pois: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi hakemistossa "temp" olevat.</target> +<source>Include</source> +<target>Sisällytä</target> +<source>Exclude</source> +<target>Sulje pois</target> +<source>Select time span:</source> +<target>Valitse aikajana:</target> +<source>Minimum file size:</source> +<target>Tiedoston pienin koko:</target> +<source>Maximum file size:</source> +<target>Tiedoston suurin koko:</target> +<source>&Default</source> +<target>&Vakio</target> +<source>Move column up</source> +<target>Siirrä sarake ylös</target> +<source>Move column down</source> +<target>Siirrä sarake alas</target> +<source>Copy locked files</source> +<target>Kopioi lukitut tiedostot</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopioi jaetut/lukitut tiedostot Volume Shadow Copy prosessilla +(Vaatii Järjestelmävalvojan oikeuksia) +</target> +<source>Copy filesystem permissions</source> +<target>Monista tiedosto-oikeudet</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Siirrä tiedosto- ja hekimisto-oikeuksia +(Vaatii Järjestelmävalvojan oikeuksia) +</target> +<source>Hidden dialogs:</source> +<target>Piilodialogit:</target> +<source>Reset</source> +<target>Palauta</target> +<source>Show hidden dialogs</source> +<target>Näytä piilodialogit</target> +<source>External applications</source> +<target>Ulkopuolinen sovellus</target> +<source>Description</source> +<target>Seloste</target> +<source>Variant</source> +<target>Vaihtoehto</target> +<source>Statistics</source> +<target>Tilastot</target> +<source>Find what:</source> +<target>Etsi:</target> +<source>Match case</source> +<target>Täsmää kirjainkoko</target> +<source>&Find next</source> +<target>&Esi seuraava</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)!</target> +<source>Batch file created successfully!</source> +<target>Eräajotiedosto luotu onnistuneesti!</target> +<source>Main bar</source> +<target>Päävalikko</target> +<source>Folder pairs</source> +<target>Hakemistoparit</target> +<source>Select view</source> +<target>Valitse näkymä</target> +<source>Folder Comparison and Synchronization</source> +<target>Hakemistojen vertailu ja täsmäytys</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Tämä järjestelmä ei vielä tue Roskakoria!</target> +<source>Set direction:</source> +<target>Aseta suunta:</target> +<source>Exclude temporarily</source> +<target>Sulje pois tilapäisesti</target> +<source>Include temporarily</source> +<target>Sisällytä tilapäisesti</target> +<source>Exclude via filter:</source> +<target>Sulje pois suotimella:</target> +<source><multiple selection></source> +<target><monivalinta></target> +<source>D-Click</source> +<target>Klikkaa D</target> +<source>Copy to clipboard CTRL+C</source> +<target>Kopioi Leikepöydälle CTRL+C</target> +<source>Delete files DEL</source> +<target>Poista tiedostoja DEL</target> +<source>Customize...</source> +<target>Sovita...</target> +<source>Auto-adjust columns</source> +<target>Säädä sarakeleveys automaattisesti</target> +<source>Include all rows</source> +<target>Sisällytä kaikki rivit</target> +<source>Exclude all rows</source> +<target>Sulje pois kaikki rivit</target> +<source>Reset view</source> +<target>Palauta näkymä</target> +<source>Show "%x"</source> +<target>Näytä "%x"</target> +<source><Last session></source> +<target><Edellinen istunto></target> +<source>Configuration saved!</source> +<target>Asetukset tallennettu!</target> +<source>Save changes to current configuration?</source> +<target>Tallenna asetuksiin tehdyt muutokset?</target> +<source>Configuration loaded!</source> +<target>Asetukset ladattu!</target> +<source>Hide files that exist on left side only</source> +<target>Piilota tiedostot jotka ovat vain vasemmalla</target> +<source>Show files that exist on left side only</source> +<target>Näytä vain vasemmalla esiintyvät tiedostot</target> +<source>Hide files that exist on right side only</source> +<target>Piilota tiedostot jotka ovat voin oikealla</target> +<source>Show files that exist on right side only</source> +<target>Näytä vain oikealla esiintyvät tiedostot</target> +<source>Hide files that are newer on left</source> +<target>Piilota tiedostot jotka ovat uudempia vasemmalla</target> +<source>Show files that are newer on left</source> +<target>Näytä uudemmat tiedostot vasemmalla</target> +<source>Hide files that are newer on right</source> +<target>Piilota tiedostot jotka ovat uudempia oikealla</target> +<source>Show files that are newer on right</source> +<target>Näytä uudemmat tiedostot oikealla</target> +<source>Hide files that are equal</source> +<target>Piilota yhteneväiset tiedostot</target> +<source>Show files that are equal</source> +<target>Näytä yhtenevät tiedostot</target> +<source>Hide files that are different</source> +<target>Piilota erilaiset tiedostot</target> +<source>Show files that are different</source> +<target>Näytä poikkeavat tiedostot</target> +<source>Hide conflicts</source> +<target>Piilota ristiriidat</target> +<source>Show conflicts</source> +<target>Näytä ristiriidat</target> +<source>Hide files that will be created on the left side</source> +<target>Piilota tiedostot jotka ovat luotu vasemmalla</target> +<source>Show files that will be created on the left side</source> +<target>Näytä vasemmalle luotavat tiedostot</target> +<source>Hide files that will be created on the right side</source> +<target>Piilota tiedostot jotka ovat luotu oikealla</target> +<source>Show files that will be created on the right side</source> +<target>Näytä oikealle luotavat tiedostot</target> +<source>Hide files that will be deleted on the left side</source> +<target>Piilota tiedostot jotka ovat poistettu vasemmalla</target> +<source>Show files that will be deleted on the left side</source> +<target>Näytä vasemmalla poistettavat tiedostot</target> +<source>Hide files that will be deleted on the right side</source> +<target>Piilota tiedostot jotka ovat poistettu oikealla</target> +<source>Show files that will be deleted on the right side</source> +<target>Näytä oikealla poistettavat tiedostot</target> +<source>Hide files that will be overwritten on left side</source> +<target>Piilota tiedostot jotka on ylikirjoitettu vasemmalla</target> +<source>Show files that will be overwritten on left side</source> +<target>Näytä vasemmalla ylikirjoitettavat tiedostot</target> +<source>Hide files that will be overwritten on right side</source> +<target>Piilota tiedostot jotka on ylikirjoitettu oikealla</target> +<source>Show files that will be overwritten on right side</source> +<target>Näytä oikealla ylikirjoitettavat tiedostot</target> +<source>Hide files that won't be copied</source> +<target>Piilota tiedostot jotka eivät kopioidu</target> +<source>Show files that won't be copied</source> +<target>Näytä kopioimatta jäävät tiedostot</target> +<source>All directories in sync!</source> +<target>Kaikki hakemistot täsmäävät!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Aja tarkistus ennen täsmäytystä.</target> +<source>Comma separated list</source> +<target>CSV-muotoinen lista</target> +<source>Legend</source> +<target>Selite</target> +<source>File list exported!</source> +<target>Tiedosto lista viety!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 hakemisto</pluralform> +<pluralform>%x hakemistoja</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 tiedosto</pluralform> +<pluralform>%x tiedostoja</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x / 1:stä rivistä näytössä</pluralform> +<pluralform>%x / %y:tä rivistä näytössä</pluralform> +</target> +<source>Scanning...</source> +<target>Haen tiedostoja...</target> +<source>Comparing content...</source> +<target>Tietosisällön vertailu...</target> +<source>Paused</source> +<target>Pysäytetty</target> +<source>Aborted</source> +<target>Lopetettu</target> +<source>Completed</source> +<target>Valmis</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Ohjelma on lopetettava: Odotetaan toiminnon loppumista...</target> +<source>Continue</source> +<target>Jatka</target> +<source>Pause</source> +<target>Tauko</target> +<source>Cannot find %x</source> +<target>En löydä %x</target> +<source>DECISION TREE</source> +<target>PÄÄTÖSPUU</target> +<source>file exists on both sides</source> +<target>tiedosto löytyy molemmilla puolilla</target> +<source>on one side only</source> +<target>vain yhdellä puolella</target> +<source>- left</source> +<target>- vasen</target> +<source>- right</source> +<target>- oikea</target> +<source>different</source> +<target>erilaiset</target> +<source>- conflict (same date, different size)</source> +<target>- eroavuus (sama päivämäärä, eri koko)</target> +<source>Inactive</source> +<target>Lepotilassa</target> +<source>Second</source> +<target>sekunttia</target> +<source>Minute</source> +<target>minuuttia</target> +<source>Hour</source> +<target>tuntia</target> +<source>Day</source> +<target>päivää</target> +<source>Byte</source> +<target>tavua</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Suodata: kaikki parit</target> +<source>Filter: Single pair</source> +<target>Suodata: Yksi pari</target> +<source>Ignore</source> +<target>Sivuta</target> +<source>Direct</source> +<target>Suoraan</target> +<source>Follow</source> +<target>Seuraa</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa:</target> +<source>- full file or directory name</source> +<target>- tiedoston tai hakemiston koko nimi</target> +<source>- directory part only</source> +<target>- vain hakemisto-osa</target> +<source>- Other side's counterpart to %name</source> +<target>- Toisen puolen vastaavuus on %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Toisen puolen vastaavuus on %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Palauttetaanko kaikki piilodialoogit?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Haluatko varmasti siirtää seuraava kohde Roskakoriin?</pluralform> +<pluralform>Haluatko varmasti siirtää seuraavat %x kohteet Roskakoriin?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Haluatko varmasti poistaa seuraava kohde?</pluralform> +<pluralform>Haluatko varmasti poistaa seuraavat %x kohteet?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Jätä ratkaisemattomana virheenä</target> +<source>Delete permanently</source> +<target>Poista pysyvästi</target> +<source>Delete or overwrite files permanently</source> +<target>Poista tai ylikirjoita tiedostoja pysyvästi</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja</target> +<source>Versioning</source> +<target>Versiointi</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Siirrä tiedostot aikaleimattuun hakemistoon</target> +<source>Cannot determine sync-direction:</source> +<target>Täsmäytys suuntä tuntematon:</target> +<source>Filter settings have changed!</source> +<target>Suodinasetukset muutettu!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Molemmat puolet muuttuneet edellisestä täsmäytyksestä!</target> +<source>No change since last synchronization!</source> +<target>Ei muutoksia edellisen täsmäytyksen jälkeen!</target> +<source>The file was not processed by last synchronization!</source> +<target>Tiedostoa ei käsitelty viime täsmäytyksessä!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Suunniteltu hakemiston poistaminen on ristiriidassa alihakemiston ja tiedostojen kanssa!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Aseta oletu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla.</target> +<source>The file does not contain a valid configuration:</source> +<target>Asetustiedosto ei ole kelvollinen:</target> +<source>Scanning:</source> +<target>Haen:</target> +<source>Encoding extended time information: %x</source> +<target>Tulkitaan laajennettua aikatietoa: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Voit jättää tämä virhe huomiotta ja tulkita hakemisto tyhjäksi.</target> +<source>Directory does not exist:</source> +<target>Puuttuva hakemisto:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti:</target> +<source>Comparing content of files %x</source> +<target>Vertaa tiedostojen %x tietosisältöä</target> +<source>Memory allocation failed!</source> +<target>Muistin varaus epäonnistui!</target> +<source>File %x has an invalid date!</source> +<target>Tiedostolla %x on virheellinen päiväys!</target> +<source>Conflict detected:</source> +<target>Ristiriita todettu:</target> +<source>Files %x have the same date but a different size!</source> +<target>Tiedostot %x samalta päivältä mutta koko poikkeaa!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symlinkki %x samalta päivältä mutta kohde on toinen!</target> +<source>Comparing files by content failed.</source> +<target>Tietosisällön vertailu epäonnistui.</target> +<source>Generating file list...</source> +<target>Luodaan tiedostolista...</target> +<source>Multiple...</source> +<target>Moninkertainen...</target> +<source>Files that are equal on both sides</source> +<target>Tiedosto sama molemmilla puolilla</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Tiedostot/hakemistot ovat samat, ominaisuudet poikkeavat</target> +<source>Copy from right to left</source> +<target>Kopioidaan oikea -> vasen</target> +<source>Copy from left to right</source> +<target>Kopioidaan vasen -> oikea</target> +<source>Delete files/folders existing on left side only</source> +<target>Poista vain tiedostoja/hakemistoja vasemmalta</target> +<source>Delete files/folders existing on right side only</source> +<target>Poista vain tiedostoja/hakemistoja oikealta</target> +<source>Copy from right to left overwriting</source> +<target>Kopioidaan oikea -> vasen ylikirjoittaen</target> +<source>Copy from left to right overwriting</source> +<target>Kopioidaan vasen -> oikea ylikirjoittaen</target> +<source>Do nothing</source> +<target>Älä tee mitään</target> +<source>Copy attributes only from right to left</source> +<target>Monista vain ominaisuudet oikea -> vasen</target> +<source>Copy attributes only from left to right</source> +<target>Monista vain ominaisuudet vasen -> oikea</target> +<source>Deleting file %x</source> +<target>Poista tiedosto %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Poista Symlinkki %x</target> +<source>Deleting folder %x</source> +<target>Poista hakemisto %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Siirrä %x Roskakoriin</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Siirretään tiedostoa %x valittuun hakemistoon %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Siirrä hakemisto %x valittuun hakemistoon %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Siirrä Symlinkki %x valittuun hakemistoon %y</target> +<source>Copying new file %x to %y</source> +<target>Kopioi uusi tiedosto %x -> %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopioi uusi Symlinkki %x -> %y</target> +<source>Overwriting file %x in %y</source> +<target>Ylikirjoita tiedosto %x kohdassa %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Ylikirjoita Symlinkki %x kohdassa %y</target> +<source>Creating folder %x</source> +<target>Luo hakemisto %x</target> +<source>Verifying file %x</source> +<target>Tarkistan tiedosto %x</target> +<source>Updating attributes of %x</source> +<target>Päivita %x:n ominaisuudet</target> +<source>Source directory does not exist anymore:</source> +<target>Lähdehakemisto puuttuu:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Asetusten mukaan ei löydy täsmäytettävää !</target> +<source>Target directory name must not be empty!</source> +<target>Kohdehakemisto ei saa olla tyhjä!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Hakemistoa ei valittu poistolle!</target> +<source>Unresolved conflicts existing!</source> +<target>Ratkaisemattomia poikkeamia!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Voit jatkaa poikkeamista huolimatta täsmäytystä.</target> +<source>Significant difference detected:</source> +<target>Merkittävä eroavaisuus todettu:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Enemmän kuin 50% tiedostoista kopioidaan tai poistetaan!</target> +<source>Not enough free disk space available in:</source> +<target>Levytila ei riitä:</target> +<source>Free disk space required:</source> +<target>Tarvittava vapaa levytila:</target> +<source>Free disk space available:</source> +<target>Levytilaa jäljellä:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäytys asetuksia!</target> +<source>Processing folder pair:</source> +<target>Käsitellään hakemistoparia:</target> +<source>Generating database...</source> +<target>Luodaan tietokantaa...</target> +<source>Error copying locked file %x!</source> +<target>Virhe kopioitaessa lukittua tiedostoa %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö!</target> diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index b7ad6729..1f1e280e 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -1,910 +1,1053 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port de la GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objets supprimés avec succès -%x Bytes -%x Octets -%x GB -%x Go -%x MB -%x Mo -%x PB -%x Po -%x TB -%x To -%x day(s) -%x jour(s) -%x directories -%x répertoires -%x files -%x fichiers -%x hour(s) -%x heure(s) -%x kB -%x Ko -%x min -%x min -%x of %y rows in view -%x sur %y lignes affichées -%x of 1 row in view -%x sur 1 ligne affichée -%x sec -%x sec -%x% -%x % -&Abort -&Abandonner -&About... -&A propos de... -&Advanced -&Avancé -&Cancel -&Annuler -&Check for new version -&Rechercher une nouvelle version -&Content -&Contenu -&Create batch job... -&Créer une tâche de traitement par lots... -&Default -&Défaut -&Exit -&Quitter -&Export file list... -&Exportation de la liste des fichiers... -&File -&Fichier -&Find next -&Chercher le suivant -&Global settings... -&Paramètres généraux... -&Help -&Aide -&Ignore -&Ignorer -&Language -&Langue -&Load -&Charger -&Load configuration... -&Charger la configuration... -&New -&Nouveau -&No -&Non -&OK -&OK -&Pause -&Pause -&Program -&Actions -&Quit -&Quitter -&Restore -&Restaurer -&Retry -&Réessayer -&Save -&Sauvegarder -&Switch -&Changer -&Yes -&Oui -(Build: %x) -(Généré : %x) -(Requires an Internet connection!) -(Nécessite une connexion Internet) -- Other side's counterpart to %dir -- équivalent de %dir de l'autre côté -- Other side's counterpart to %name -- équivalent de %name de l'autre côté -- conflict -- conflit -- conflict (same date, different size) -- conflit (même date, taille différente) -- different -- fichiers différents -- directory part only -- seulement les répertoires -- equal -- fichiers identiques -- exists left only -- le fichier existe seulement à gauche -- exists right only -- le fichier existe seulement à droite -- full file or directory name -- nom complet du fichier ou du répertoire -- left -- à gauche -- left newer -- fichier de gauche plus récent -- right -- à droite -- right newer -- fichier de droite plus récent -/sec -/sec -1 directory -1 répertoire -1 file -1 fichier -1. &Compare -1. &Comparer -1. Enter relative file or directory names separated by ';' or a new line. -1. Entrez les noms relatifs des fichiers ou des répertoires séparés par un ';' ou par un passage à la ligne. -1. Select directories to monitor. -1. Sélectionner les répertoires à surveiller. -2. &Synchronize... -2. &Synchroniser... -2. Enter a command line. -2. Entrez une ligne de commande. -2. Use wildcard characters '*' and '?'. -2. Les caractères génériques '*' et '?' sont acceptés. -3. Exclude files directly on main grid via context menu. -3. Exclure les fichiers directement sur le tableau principal à l'aide du menu contextuel. -3. Press 'Start'. -3. Cliquez sur 'Démarrer'. -<Automatic> -<Automatique> -<Directory> -<Répertoire> -<Last session> -<Dernière session> -<Symlink> -<Lien symbolique> -<multiple selection> -<sélection multiple> -A directory input field is empty. -Un champ répertoire est vide -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Un répertoire faisant partie de paires multiples doit être modifié ! Vérifiez les paramètres de la synchronisation ! -A newer version of FreeFileSync is available: -Une version plus récente de FreeFileSync est disponible : -Abort requested: Waiting for current operation to finish... -Abandon demandé : En attente de la fin de l'opération en cours... -Abort synchronization immediately -Abandon immédiat de la synchronisation -Aborted -Abandonné -About -A propos de -Action -Action -Add folder -Ajout d'un dossier -Add folder pair -Ajout d'un couple de dossiers -All directories in sync! -Tous les répertoires sont synchronisés ! -An exception occurred! -Une erreur s'est produite ! -As a result the files are separated into the following categories: -En conclusion, les fichiers sont répartis dans les catégories suivantes : -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte.\n\nAvec cette option, l'arbre de décision est plus simple : -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Crée un fichier de traitement par lots pour une synchronisation automatique. Pour démarrer en mode de traitement par lots, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches. -At least one directory input field is empty. -Au moins un champ répertoire est vide. -Auto-adjust columns -Auto-ajustement des colonnes -Batch execution -Exécution du traitement par lots -Batch file created successfully! -Fichier de traitement par lots créé avec succès ! -Batch job -Fichier de commandes -Big thanks for localizing FreeFileSync goes out to: -Pour les traductions de FreeFileSync, un grand merci à : -Both sides have changed since last synchronization! -Les deux côtés ont changé depuis la dernière synchronisation ! -Browse -Parcourir -Browse directory -Prcourir le répertoire -Cannot determine sync-direction: -Impossible de déterminer le sens de la synchro : -Cannot find %x -Impossible de trouver %x -Category -Catégorie -Clear filter settings -Effecer la configuration du filtrage -Comma separated list -Liste d'éléments séparés par une virgule -Command line -Ligne de commande -Command line is empty! -La ligne de commande est vide ! -Compare -Comparer -Compare both sides -Comparer les deux listes -Compare by \"File content\" -Comparaison par \"Contenu des fichiers\" -Compare by \"File size and date\" -Comparaison par \"Date et taille des fichiers\" -Compare by... -Comparaison par... -Comparing content of files %x -Comparaison du contenu des fichiers %x -Comparing content... -Comparaison du contenu... -Comparing files by content failed. -La comparaison des fichiers par leur contenu a échoué. -Comparison Result -Résultat de la comparaison -Comparison settings -Paramètres de comparaison -Completed -Terminé -Configuration -Configuration -Configuration loaded! -Configuration chargée ! -Configuration overview: -Contrôle des paramètres : -Configuration saved! -Configuration enregistrée ! -Configure filter -Configuration des filtres -Configure your own synchronization rules. -Paramétrage de vos règles de synchronisation. -Confirm -Confirmation -Conflict detected: -Conflit détecté : -Conflicts/files that cannot be categorized -Conflits/fichiers ne pouvant être catégorisés -Continue -Continuer -Conversion error: -Erreur de conversion : -Copy attributes only from left to right -Copier uniquement les attributs de gauche à droite -Copy attributes only from right to left -Copier uniquement les attributs de droite à gauche -Copy filesystem permissions -Copie des droits d'accès -Copy from left to right -Copie de gauche à droite -Copy from left to right overwriting -Copie de gauche à droite avec remplacement -Copy from right to left -Copie de droite à gauche -Copy from right to left overwriting -Copie de droite à gauche avec remplacement -Copy locked files -Copier les fichiers verrouillés -Copy new or updated files to right folder. -Copie les fichiers nouveaux ou modifiés dans le dossier de droite. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -La copie des fichiers partagés ou verrouillés nécessite le Service Volume Shadow Copy\n(avec les droits administrateur) -Copy to clipboard\tCTRL+C -Copier dans le presse-papiers\tCTRL+C -Copying new Symbolic Link %x to %y -Copie le nouveau Lien Symbolique %x vers %y -Copying new file %x to %y -Copie le nouveau fichier %x vers %y -Could not determine volume name for file: -Impossible de trouver le nom de volume pour le fichier : -Could not initialize directory monitoring: -Impossible d'initialiser la surveillance des dossiers : -Could not load a required DLL: -Impossible de charger une DLL : -Could not read values for the following XML nodes: -Impossible de lire les valeurs des noeuds XML suivants : -Create a batch job -Créer une tâche de traitement par lots -Creating folder %x -Création du dossier %x -Custom -Personnaliser -Customize columns -Personnaliser les colonnes -Customize... -Personnaliser... -D-Click -Clic Droit -DECISION TREE -ARBRE DE DECISION -Data verification error: Source and target file have different content! -Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents ! -Date -Date -Delete files/folders existing on left side only -Suppression des fichiers/dossiers n'existant que sur le côté gauche -Delete files/folders existing on right side only -Suppression des fichiers/dossiers n'existant que sur le côté droit -Delete files\tDEL -Suppression des fichiers\tDEL -Delete on both sides -Suppression des deux côtés -Delete on both sides even if the file is selected on one side only -Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté -Delete or overwrite files permanently -Supprimer ou écraser les fichiers définitivement -Delete permanently -Suppression définitive -Deleting Symbolic Link %x -Suppression du Lien Symbolique %x -Deleting file %x -Suppression du fichier %x -Deleting folder %x -Suppression du dossier %x -Deletion handling -Gestion des suppressions -Description -Description -Direct -Direct -Directories are dependent! Be careful when setting up synchronization rules: -Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation : -Directories to watch -Réperoires à surveiller -Directory -Répertoire -Directory does not exist: -Le répertoire n'existe pas : -Do not show this dialog again -Ne plus afficher ce message la prochaine fois -Do nothing -Ne rien faire -Do you really want to delete the following object(s)? -Voulez-vous vraiment supprimer les objets suivants ? -Do you really want to move the following object(s) to the Recycle Bin? -Voulez-vous vraiment déplacer les objets suivants dans la Corbeille ? -Do you want FreeFileSync to automatically check for updates every week? -Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ? -Donate with PayPal -Faites un don avec PayPal -Download now? -Télécharger maintenant ? -Drag && drop -Glisser && Déposer -Elements found: -Elements trouvés : -Elements processed: -Elements traités : -Elements remaining: -Elements restants : -Email -Email -Encoding extended time information: %x -Codage de l'heure au format étendu : %x -Endless loop when traversing directory: -Boucle sans fin lors du parcours du répertoire : -Equal files/folders that differ in attributes only -Fichiers/Dossiers identiques dont seuls les attributs diffèrent -Error -Erreur -Error changing modification time: -Erreur lors du changement de la date de modification : -Error copying file permissions: -Erreur lors de la copie des attributs système -Error copying file: -Erreur lors de la copie du fichier : -Error copying locked file %x! -Erreur lors de la copie du fichier verrouillé %x ! -Error copying symbolic link: -Erreur lors de la copie du lien symbolique : -Error creating directory: -Erreur lors de la création d'un répertoire : -Error deleting directory: -Erreur lors de la suppression d'un répertoire : -Error deleting file: -Erreur lors de la suppression d'un fichier : -Error handling -Erreur de gestion de fichiers -Error loading library function: -Erreur lors du chargement de la bibliothèque de fonctions : -Error moving directory: -Erreur lors du déplacement du répertoire : -Error moving file: -Erreur lors du déplacement du fichier : -Error moving to Recycle Bin: -Erreur lors du déplacement dans la Corbeille : -Error opening file: -Erreur lors de l'ouverture du fichier : -Error parsing configuration file: -Erreur lors de l'analyse du fichier de configuration : -Error reading file attributes: -Erreur lors de la lecture des attributs du fichier : -Error reading file: -Erreur lors de la lecture du fichier : -Error reading from synchronization database: -Erreur lors de la lecture de la base de données de synchro : -Error reading security context: -Erreur de lecture du contexte de sécurité: -Error resolving symbolic link: -Erreur lors de la résolution du lien symbolique : -Error setting directory lock: -Erreur lors du verrouillage du répertoire : -Error setting privilege: -Erreur de paramétrage de privilège -Error starting Volume Shadow Copy Service! -Erreur lors du démarrage du service 'Volume Shadow Copy' ! -Error traversing directory: -Erreur lors du parcours du répertoire : -Error when monitoring directories. -Erreur lors de la surveillance des répertoires. -Error writing file: -Erreur lors de l'écriture du fichier : -Error writing security context: -Erreur d'écriture du contexte de sécurité: -Error writing to synchronization database: -Erreur lors de l'écriture de la base de données de synchro : -Example -Exemple -Exclude -Exclure -Exclude all rows -Exclure toutes les lignes -Exclude temporarily -Exclure temporairement -Exclude via filter: -Exclure à l'aide du filtre : -Exit instantly -Sortie immédiate -Extension -Extension -External applications -Applications externes -Fatal Error -Erreur Fatale -Feedback and suggestions are welcome at: -Commentaires et suggestions sont les bienvenus à : -File %x has an invalid date! -Le fichier %x a une date invalide ! -File already exists. Overwrite? -Le fichier existe déjà . Voulez-vous le remplacer ? -File content -Contenu du fichier -File does not exist: -Le fichier n'existe pas : -File list exported! -Liste des fichiers exportée ! -File size and date -Taille et date du fichier -Filename -Nom du fichier -Files %x have the same date but a different size! -Les fichiers %x ont la même date mais une taille différente ! -Files are found equal if\n - file content\nis the same -Les fichiers sont considérés comme identiques, si\n - leur contenu\nest identique -Files are found equal if\n - filesize\n - last write time and date\nare the same -Les fichiers sont considérés comme identiques, si\n - leur taille\n - leur date et heure de dernière modification\nsont identiques -Files that are equal on both sides -Fichiers identiques des deux côtés -Files that exist on both sides, left one is newer -Fichiers existants des deux côtés, celui de gauche est plus récent -Files that exist on both sides, right one is newer -Fichiers existants des deux côtés, celui de droite est plus récent -Files that have different content -Fichiers ayant un contenu différent -Files/folders that exist on left side only -Fichiers/répertoires existant seulement à gauche -Files/folders that exist on right side only -Fichiers/répertoires existant seulement à droite -Filter files -Filtrage des fichiers -Filter is active -Le filtre est actif -Filter settings have changed! -La configuration du filtre a changé ! -Filter: All pairs -Filtre : Toutes les paires -Filter: Single pair -Filtre : Une seule paire -Find -Chercher -Find what: -Chercher cela : -Folder Comparison and Synchronization -Comparaison de dossiers et Synchronisation -Folder pairs -Paires de dossiers -Follow -Suivre -Free disk space available: -Espace disque disponible : -Free disk space required: -Espace disque nécessaire : -FreeFileSync Batch Job -FreeFileSync Fichier de commandes -FreeFileSync at Sourceforge -FreeFileSync par Sourceforge -FreeFileSync batch file -FreeFileSync fichier de commandes -FreeFileSync configuration -FreeFileSync configuration -FreeFileSync is up to date! -FreeFileSync est à jour ! -Full path -Chemin complet -Generating database... -Génération de la base de données... -Generating file list... -Génération de la liste des fichiers... -Global settings -Paramètres généraux -Help -Aide -Hidden dialogs: -Boîtes de dialogue masquées : -Hide all error and warning messages -Masquer tous les messages d'erreurs et les avertissements -Hide conflicts -Masquer les conflits -Hide excluded items -Masquer les éléments exclus -Hide files that are different -Masquer les fichiers différents -Hide files that are equal -Masquer les fichiers identiques -Hide files that are newer on left -Masquer les fichiers plus récents à gauche -Hide files that are newer on right -Masquer les fichiers plus récents à droite -Hide files that exist on left side only -Masquer les fichiers n'existant qu'à gauche -Hide files that exist on right side only -Masquer les fichiers n'existant qu'à droite -Hide files that will be created on the left side -Masquer les fichiers qui seront créés à gauche -Hide files that will be created on the right side -Masquer les fichiers qui seront créés à droite -Hide files that will be deleted on the left side -Masquer les fichiers qui seront supprimés à gauche -Hide files that will be deleted on the right side -Masquer les fichiers qui seront supprimés à droite -Hide files that will be overwritten on left side -Fichiers masqués qui ont été écrasés à gauche -Hide files that will be overwritten on right side -Fichiers masqués qui ont été écrasés à droite -Hide files that won't be copied -Masquer les fichiers qui ne seront pas copiés -Hide filtered or temporarily excluded files -Masquer les fichiers filtrés ou exclus temporairement -Hide further error messages during the current process -Masquer les messages d'erreur suivants pendant le traitement -Hints: -Conseils : -Homepage -Accueil -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement. -Idle time between detection of last change and execution of command line in seconds -Temps mort entre la détection de la dernière modification et l'éxécution de la ligne de commande en secondes -If you like FFS -Si vous aimez FFS -Ignore -Ignorer -Ignore errors -Ignorer les erreurs -Ignore subsequent errors -Ignorer les erreurs ultérieures -Include -Inclure -Include all rows -Inclure toutes les lignes -Include temporarily -Inclure temporairement -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Inclure : *.doc;*.zip;*.exe\nExclure : \\truc\\temp\\* -Incompatible synchronization database format: -Format de la base de données de synchro incompatible : -Info -Info -Information -Information -Initial synchronization: -Première synchronisation : -Integrate external applications into context menu. The following macros are available: -Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles : -Invalid FreeFileSync config file! -Fichier de configuration FreeFileSync invalide ! -Last used configurations (press DEL to remove from list) -Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste) -Leave as unresolved conflict -Abandonner en tant que conflit non résolu -Left -Gauche -Legend -Légende -Load configuration from file -Charger la configuration à partir du fichier -Log-messages: -Messages log : -Logging -Connexion -Main bar -Barre principale -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync. -Match case -Respecter la casse -Maximum number of logfiles: -Nombre maximum de fichiers Log -Memory allocation failed! -Erreur d'allocation de mémoire! -Minimum Idle Time [seconds] -Délai minimum (secondes) -Mirror ->> -Miroir ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation. -Monitoring active... -Surveillance en cours... -More than 50% of the total number of files will be copied or deleted! -Plus de 50% des fichiers seront copiés ou détruits ! -Move column down -Déplacer la colonne vers le bas -Move column up -Déplacer la colonne vers le haut -Move files into a time-stamped subdirectory -Déplacer les fichiers vers un sous-répertoire daté -Moving %x to Recycle Bin -Déplacement de %x vers la Corbeille -Moving Symbolic Link %x to user-defined directory %y -Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y -Moving file %x to user-defined directory %y -Déplacement du fichier %x vers le répertoire utilisateur %y -Moving folder %x to user-defined directory %y -Déplacement du dossier %x vers le répertoire utilisateur %y -Multiple... -Multiple... -No change since last synchronization! -Aucun changement depuis la dernière synchronisation ! -No filter selected -Aucun filtre sélectionné -Not enough free disk space available in: -Espace disque insuffisant sur : -Nothing to synchronize according to configuration! -Rien à synchroniser dans cette configuration ! -Number of files and directories that will be created -Nombre de fichiers et de répertoires qui seront créés -Number of files and directories that will be deleted -Nombre de fichiers et de répertoires qui seront supprimés -Number of files that will be overwritten -Nombre de fichiers qui seront remplacés -One of the FreeFileSync database entries within the following file is not yet existing: -L'une des entrées de la base de données FreeFileSync n'existe plus dans le fichier : -One of the FreeFileSync database files is not yet existing: -L'un des fichiers de la base de données FreeFileSync n'existe plus : -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Seuls les fichiers/répertoires filtrés seront sélectionnés pour la synchronisation. Le filtre sera appliqué au nom relatif (!) pour les répertoires de synchronisation de base. -Open with Explorer -Ouvrir avec Explorer -Open with default application -Ouvrir avec l'application par défaut -Operation aborted! -Opération abandonnée ! -Operation: -Opération : -Overview -Présentation -Overwriting Symbolic Link %x in %y -Remplacement du Lien Symbolique %x par %y -Overwriting file %x in %y -Remplacement du fichier %x par %y -Pause -Pause -Paused -En pause -Planned directory deletion is in conflict with its subdirectories and -files! -Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers ! -Please run a Compare first before synchronizing! -Veuillez lancer une Comparaison avant de lancer la synchronisation ! -Press \"Switch\" to open FreeFileSync GUI mode. -Appuyer sur \"Changer \" pour ouvrir le mode FreeFileSync GUI -Processing folder pair: -Traitement de la paire de dossiers : -Published under the GNU General Public License: -Publié sous licence GNU General Public License : -Question -Question -RealtimeSync - Automated Synchronization -RealtimeSync - Synchronisation Automatisée -RealtimeSync configuration -Configuration RealtimeSync -Recycle Bin not yet supported for this system! -La Corbeille n'est pas supportée par ce système ! -Relative path -Chemin relatif -Remove alternate settings -Supprimer les paramètres de rechange -Remove folder -Supprimer le dossier -Remove folder pair -Supprimer le couple de dossiers -Report translation error -Etat des erreurs de transfert -Reset -Réinitialiser -Reset view -Réinitialiser la vue -Restore all hidden dialogs? -Restaurer toutes les boîtes de dialogue cachées ? -Right -Droite -S&ave configuration... -S&auvegarder la configuration... -S&witch view -Changer de &vue -Save changes to current configuration? -Voulez-vous enregistrer les modifications dans la configuration actuelle ? -Save current configuration to file -Enregistrer la configuration actuelle -Scanning... -Lecture en cours... -Scanning: -Lecture en cours : -Select a folder -Choisissez un dossier -Select alternate synchronization settings -Sélectionner une autre configuration de la synchronisation -Select logfile directory: -Choisissez un dossier pour le fichier .log : -Select variant: -Choisissez une variante : -Select view -Choisissez une vue -Set direction: -Choix de la direction : -Setting default synchronization directions: Old files will be overwritten with newer files. -Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux. -Show \"%x\" -Afficher \"%x\" -Show conflicts -Afficher les conflits -Show files that are different -Afficher les fichiers différents -Show files that are equal -Afficher les fichiers identiques -Show files that are newer on left -Afficher les fichiers de gauche plus récents que ceux de droite -Show files that are newer on right -Afficher les fichiers de droite plus récents que ceux de gauche -Show files that exist on left side only -Afficher les fichiers existant seulement à gauche -Show files that exist on right side only -Afficher les fichiers existant seulement à droite -Show files that will be created on the left side -Afficher les fichiers qui seront créés à gauche -Show files that will be created on the right side -Afficher les fichiers qui seront créés à droite -Show files that will be deleted on the left side -Afficher les fichiers qui seront supprimés à gauche -Show files that will be deleted on the right side -Afficher les fichiers qui seront supprimés à droite -Show files that will be overwritten on left side -Afficher les fichiers qui seront écrasés à gauche -Show files that will be overwritten on right side -Afficher les fichiers qui seront écrasés à droite -Show files that won't be copied -Afficher les fichiers qui ne seront pas copiés -Show hidden dialogs -Afficher les boîtes de dialogue masquées -Show popup -Afficher la boîte de dialogue -Show popup on errors or warnings -Affiche la boîte de dialogue pour chaque erreur ou avertissement -Significant difference detected: -Différence significative détectée : -Silent mode -Mode silencieux -Size -Taille -Source code written completely in C++ utilizing: -Code source écrit entièrement en C++ utilisant : -Source directory does not exist anymore: -Le répertoire source n'existe plus : -Speed: -Vitesse : -Start -Démarrer -Start minimized and write status information to a logfile -Démarrage en mode réduit et écriture des informations d'état dans un fichier log -Start synchronization -Démarrer la synchronisation -Statistics -Statistiques -Status feedback -Retour d'informations -Stop -Arrêt -Swap sides -Permuter les côtés -Switching to FreeFileSync GUI mode... -Changement en mode FreeFileSync GUI... -Symbolic Link handling -Gestion des Liens Symboliques -Symlinks %x have the same date but a different target! -Le Lien Symbolique %x a la même date mais une destination différente ! -Synchronization Preview -Prévisualisation de la Synchronisation -Synchronization aborted! -Synchronisation abandonnée ! -Synchronization completed successfully! -Synchronisation terminée avec succès ! -Synchronization completed with errors! -Synchronisation terminée avec des erreurs ! -Synchronization settings -Paramétrage de la synchronisation -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier \"temp\". -Synchronize... -Synchroniser... -Synchronizing... -Synchronisation en cours... -Target directory already existing! -Le répertoire de destination existe déjà ! -Target file already existing! -Le fichier de destination existe déjà ! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -La ligne de commande est exécutée chaque fois que :\n- tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB)\n- les fichiers de ces répertoires ou sous-répertoires sont modifiés -The file does not contain a valid configuration: -Le fichier ne contient pas de configuration valide : -The file was not processed by last synchronization! -Le fichier n'a pas été traité par la dernière synchronisation ! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification. -Time -Heure -Time elapsed: -Temps écoulé : -Time remaining: -Temps restant : -Total amount of data that will be transferred -Volume de données à transférer -Total time: -Durée totale : -Transfer file and directory permissions\n(Requires Administrator rights) -Transfert des attributs système des fichiers et des répertoires\n(avec les droits administrateur) -Unable to connect to sourceforge.net! -Impossible de se connecter à sourceforge.net ! -Unable to create logfile! -Impossible de créer un fichier log ! -Unresolved conflicts existing! -Il y a des conflits non résolus ! -Update -> -Mise à Jour -> -Updating attributes of %x -Mise à jour des attributs de %x -Usage: -Utilisation : -Use Recycle Bin -Utiliser la Corbeille -Use Recycle Bin when deleting or overwriting files -Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier -User-defined directory for deletion was not specified! -Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué ! -Variant -Variante -Verifying file %x -Contrôle du fichier %x -Versioning -Choisir un dossier -Volume name %x not part of filename %y! -Le nom de volume %x ne fait pas partie du nom de fichier %y ! -Waiting for missing directories... -En attente des répertoires absents ... -Waiting while directory is locked (%x)... -En attente tant que le répertoire est verrouillé (%x)... -Warning -Attention -When the comparison is started with this option set the following decision tree is processed: -Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté : -You can ignore conflicts and continue synchronization. -Vous pouvez ignorer ces conflits et continuer la synchronisation. -You can ignore this error to consider the directory as empty. -Vous pouvez ignorer cette erreur en considérant le répertoire comme vide. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) ! -different -fichiers différents -file exists on both sides -le fichier existe des deux côtés -on one side only -le fichier existe d'un seul côté seulement +<header> + <language name>Français</language name> + <translator>Jean-François Hartmann</translator> + <locale>fr_FR</locale> + <flag file>france.png</flag file> + <plural forms>2</plural forms> + <plural definition>n <= 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Montrer dans l'explorateur</target> +<source>Open with default application</source> +<target>Ouvrir avec l'application par défaut</target> +<source>Browse directory</source> +<target>Prcourir le répertoire</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Synchronisation Automatisée</target> +<source>Browse</source> +<target>Parcourir</target> +<source>Error resolving symbolic link:</source> +<target>Erreur lors de la résolution du lien symbolique :</target> +<source>Select alternate synchronization settings</source> +<target>Sélectionner une autre configuration de la synchronisation</target> +<source>No filter selected</source> +<target>Aucun filtre sélectionné</target> +<source>Filter is active</source> +<target>Le filtre est actif</target> +<source>Clear filter settings</source> +<target>Effecer la configuration du filtrage</target> +<source>Remove alternate settings</source> +<target>Supprimer les paramètres de rechange</target> +<source>Create a batch job</source> +<target>Créer une tâche de traitement par lots</target> +<source>Synchronization settings</source> +<target>Paramétrage de la synchronisation</target> +<source>Comparison settings</source> +<target>Paramètres de comparaison</target> +<source>About</source> +<target>A propos de</target> +<source>Error</source> +<target>Erreur</target> +<source>Warning</source> +<target>Attention</target> +<source>Question</source> +<target>Question</target> +<source>Confirm</source> +<target>Confirmation</target> +<source>Configure filter</source> +<target>Configuration des filtres</target> +<source>Customize columns</source> +<target>Personnaliser les colonnes</target> +<source>Global settings</source> +<target>Paramètres généraux</target> +<source>Synchronization Preview</source> +<target>Prévisualisation de la Synchronisation</target> +<source>Find</source> +<target>Chercher</target> +<source>%x MB</source> +<target>%x Mo</target> +<source>%x KB</source> +<target>%x Ko</target> +<source>%x GB</source> +<target>%x Go</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x octet</pluralform> +<pluralform>%x octets</pluralform> +</target> +<source><Symlink></source> +<target><Lien_symbolique></target> +<source><Directory></source> +<target><Répertoire></target> +<source>Size</source> +<target>Taille</target> +<source>Date</source> +<target>Date</target> +<source>Full path</source> +<target>Chemin complet</target> +<source>Filename</source> +<target>Nom du fichier</target> +<source>Relative path</source> +<target>Chemin relatif</target> +<source>Directory</source> +<target>Répertoire</target> +<source>Extension</source> +<target>Extension</target> +<source>Comparison Result</source> +<target>Résultat de la comparaison</target> +<source>Incompatible synchronization database format:</source> +<target>Format de la base de données de synchro incompatible :</target> +<source>Initial synchronization:</source> +<target>Première synchronisation :</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>L'un des fichiers de la base de données FreeFileSync n'existe plus :</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>L'une des entrées de la base de données FreeFileSync n'existe plus dans le fichier :</target> +<source>Error reading from synchronization database:</source> +<target>Erreur lors de la lecture de la base de données de synchro :</target> +<source>An exception occurred!</source> +<target>Une erreur s'est produite !</target> +<source>Error deleting file:</source> +<target>Erreur lors de la suppression d'un fichier :</target> +<source>Error reading file attributes:</source> +<target>Erreur lors de la lecture des attributs du fichier :</target> +<source>Waiting while directory is locked (%x)...</source> +<target>En attente tant que le répertoire est verrouillé (%x)...</target> +<source>Error setting directory lock:</source> +<target>Erreur lors du verrouillage du répertoire :</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x sec</pluralform> +<pluralform>%x sec</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Erreur Fatale</target> +<source>File does not exist:</source> +<target>Le fichier n'existe pas :</target> +<source>Error parsing configuration file:</source> +<target>Erreur lors de l'analyse du fichier de configuration :</target> +<source>Error writing file:</source> +<target>Erreur lors de l'écriture du fichier :</target> +<source>Invalid FreeFileSync config file!</source> +<target>Fichier de configuration FreeFileSync invalide !</target> +<source>/sec</source> +<target>/sec</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x heure</pluralform> +<pluralform>%x heures</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x jour</pluralform> +<pluralform>%x jours</pluralform> +</target> +<source>S&ave configuration...</source> +<target>S&auvegarder la configuration...</target> +<source>&Load configuration...</source> +<target>&Charger la configuration...</target> +<source>&Quit</source> +<target>&Quitter</target> +<source>&File</source> +<target>&Fichier</target> +<source>&Content</source> +<target>&Contenu</target> +<source>&About...</source> +<target>&A propos de...</target> +<source>&Help</source> +<target>&Aide</target> +<source>Usage:</source> +<target>Utilisation :</target> +<source>1. Select directories to monitor.</source> +<target>1. Sélectionner les répertoires à surveiller.</target> +<source>2. Enter a command line.</source> +<target>2. Entrez une ligne de commande.</target> +<source>3. Press 'Start'.</source> +<target>3. Cliquez sur 'Démarrer'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +La ligne de commande est exécutée chaque fois que : +- tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB) +- les fichiers de ces répertoires ou sous-répertoires sont modifiés +</target> +<source>Directories to watch</source> +<target>Réperoires à surveiller</target> +<source>Add folder</source> +<target>Ajout d'un dossier</target> +<source>Remove folder</source> +<target>Supprimer le dossier</target> +<source>Select a folder</source> +<target>Choisissez un dossier</target> +<source>Command line</source> +<target>Ligne de commande</target> +<source>Minimum Idle Time [seconds]</source> +<target>Délai minimum (secondes)</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Temps mort entre la détection de la dernière modification et l'éxécution de la ligne de commande en secondes</target> +<source>Start</source> +<target>Démarrer</target> +<source>(Build: %x)</source> +<target>(Généré : %x)</target> +<source>RealtimeSync configuration</source> +<target>Configuration RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Le fichier existe déjà . Voulez-vous le remplacer ?</target> +<source>&Restore</source> +<target>&Restaurer</target> +<source>&Exit</source> +<target>&Quitter</target> +<source>Monitoring active...</source> +<target>Surveillance en cours...</target> +<source>Waiting for missing directories...</source> +<target>En attente des répertoires absents ...</target> +<source>Command line is empty!</source> +<target>La ligne de commande est vide !</target> +<source>Could not initialize directory monitoring:</source> +<target>Impossible d'initialiser la surveillance des dossiers :</target> +<source>A directory input field is empty.</source> +<target>Un champ répertoire est vide</target> +<source>Error when monitoring directories.</source> +<target>Erreur lors de la surveillance des répertoires.</target> +<source>Drag && drop</source> +<target>Glisser && Déposer</target> +<source>Conversion error:</source> +<target>Erreur de conversion :</target> +<source>Error moving file:</source> +<target>Erreur lors du déplacement du fichier :</target> +<source>Operation aborted!</source> +<target>Opération abandonnée !</target> +<source>Target file already existing!</source> +<target>Le fichier de destination existe déjà !</target> +<source>Error moving directory:</source> +<target>Erreur lors du déplacement du répertoire :</target> +<source>Target directory already existing!</source> +<target>Le répertoire de destination existe déjà !</target> +<source>Error deleting directory:</source> +<target>Erreur lors de la suppression d'un répertoire :</target> +<source>Error changing modification time:</source> +<target>Erreur lors du changement de la date de modification :</target> +<source>Error loading library function:</source> +<target>Erreur lors du chargement de la bibliothèque de fonctions :</target> +<source>Error reading security context:</source> +<target>Erreur de lecture du contexte de sécurité:</target> +<source>Error writing security context:</source> +<target>Erreur d'écriture du contexte de sécurité:</target> +<source>Error copying file permissions:</source> +<target>Erreur lors de la copie des attributs système</target> +<source>Error creating directory:</source> +<target>Erreur lors de la création d'un répertoire :</target> +<source>Error copying symbolic link:</source> +<target>Erreur lors de la copie du lien symbolique :</target> +<source>Error copying file:</source> +<target>Erreur lors de la copie du fichier :</target> +<source>Error opening file:</source> +<target>Erreur lors de l'ouverture du fichier :</target> +<source>Error reading file:</source> +<target>Erreur lors de la lecture du fichier :</target> +<source>Endless loop when traversing directory:</source> +<target>Boucle sans fin lors du parcours du répertoire :</target> +<source>Error traversing directory:</source> +<target>Erreur lors du parcours du répertoire :</target> +<source>Error setting privilege:</source> +<target>Erreur de paramétrage de privilège</target> +<source>Error moving to Recycle Bin:</source> +<target>Erreur lors du déplacement dans la Corbeille :</target> +<source>Could not load a required DLL:</source> +<target>Impossible de charger une DLL :</target> +<source>Error writing to synchronization database:</source> +<target>Erreur lors de l'écriture de la base de données de synchro :</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Erreur lors du démarrage du service 'Volume Shadow Copy' !</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Impossible de trouver le nom de volume pour le fichier :</target> +<source>Volume name %x not part of filename %y!</source> +<target>Le nom de volume %x ne fait pas partie du nom de fichier %y !</target> +<source>%x TB</source> +<target>%x To</target> +<source>%x PB</source> +<target>%x Po</target> +<source>%x%</source> +<target>%x %</target> +<source>Could not read values for the following XML nodes:</source> +<target>Impossible de lire les valeurs des noeuds XML suivants :</target> +<source>Show popup</source> +<target>Afficher la boîte de dialogue</target> +<source>Show popup on errors or warnings</source> +<target>Affiche la boîte de dialogue pour chaque erreur ou avertissement</target> +<source>Ignore errors</source> +<target>Ignorer les erreurs</target> +<source>Hide all error and warning messages</source> +<target>Masquer tous les messages d'erreurs et les avertissements</target> +<source>Exit instantly</source> +<target>Sortie immédiate</target> +<source>Abort synchronization immediately</source> +<target>Abandon immédiat de la synchronisation</target> +<source>Logging</source> +<target>Connexion</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync fichier de commandes</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync configuration</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Fichier de commandes</target> +<source>Unable to create logfile!</source> +<target>Impossible de créer un fichier log !</target> +<source>Batch execution</source> +<target>Exécution du traitement par lots</target> +<source>Log-messages:</source> +<target>Messages log :</target> +<source>Stop</source> +<target>Arrêt</target> +<source>Total time:</source> +<target>Durée totale :</target> +<source>Synchronization aborted!</source> +<target>Synchronisation abandonnée !</target> +<source>Synchronization completed with errors!</source> +<target>Synchronisation terminée avec des erreurs !</target> +<source>Synchronization completed successfully!</source> +<target>Synchronisation terminée avec succès !</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Appuyer sur "Changer " pour ouvrir le mode FreeFileSync GUI</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Changement en mode FreeFileSync GUI...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Impossible de se connecter à sourceforge.net !</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Une version plus récente de FreeFileSync est disponible :</target> +<source>Download now?</source> +<target>Télécharger maintenant ?</target> +<source>Information</source> +<target>Information</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync est à jour !</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ?</target> +<source>(Requires an Internet connection!)</source> +<target>(Nécessite une connexion Internet)</target> +<source>1. &Compare</source> +<target>1. &Comparer</target> +<source>2. &Synchronize...</source> +<target>2. &Synchroniser...</target> +<source>S&witch view</source> +<target>Changer de &vue</target> +<source>&New</source> +<target>&Nouveau</target> +<source>&Program</source> +<target>&Actions</target> +<source>&Language</source> +<target>&Langue</target> +<source>&Global settings...</source> +<target>&Paramètres généraux...</target> +<source>&Create batch job...</source> +<target>&Créer une tâche de traitement par lots...</target> +<source>&Export file list...</source> +<target>&Exportation de la liste des fichiers...</target> +<source>&Advanced</source> +<target>&Avancé</target> +<source>&Check for new version</source> +<target>&Rechercher une nouvelle version</target> +<source>Compare</source> +<target>Comparer</target> +<source>Compare both sides</source> +<target>Comparer les deux listes</target> +<source>&Abort</source> +<target>&Abandonner</target> +<source>Synchronize...</source> +<target>Synchroniser...</target> +<source>Start synchronization</source> +<target>Démarrer la synchronisation</target> +<source>Swap sides</source> +<target>Permuter les côtés</target> +<source>Add folder pair</source> +<target>Ajout d'un couple de dossiers</target> +<source>Remove folder pair</source> +<target>Supprimer le couple de dossiers</target> +<source>Save current configuration to file</source> +<target>Enregistrer la configuration actuelle</target> +<source>Load configuration from file</source> +<target>Charger la configuration à partir du fichier</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)</target> +<source>Hide excluded items</source> +<target>Masquer les éléments exclus</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Masquer les fichiers filtrés ou exclus temporairement</target> +<source>Number of files and directories that will be created</source> +<target>Nombre de fichiers et de répertoires qui seront créés</target> +<source>Number of files that will be overwritten</source> +<target>Nombre de fichiers qui seront remplacés</target> +<source>Number of files and directories that will be deleted</source> +<target>Nombre de fichiers et de répertoires qui seront supprimés</target> +<source>Total amount of data that will be transferred</source> +<target>Volume de données à transférer</target> +<source>Left</source> +<target>Gauche</target> +<source>Right</source> +<target>Droite</target> +<source>Batch job</source> +<target>Fichier de commandes</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Crée un fichier de traitement par lots pour une synchronisation automatique. Pour démarrer en mode de traitement par lots, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches.</target> +<source>Help</source> +<target>Aide</target> +<source>Configuration overview:</source> +<target>Contrôle des paramètres :</target> +<source>Filter files</source> +<target>Filtrage des fichiers</target> +<source>Status feedback</source> +<target>Retour d'informations</target> +<source>Silent mode</source> +<target>Mode silencieux</target> +<source>Start minimized and write status information to a logfile</source> +<target>Démarrage en mode réduit et écriture des informations d'état dans un fichier log</target> +<source>Error handling</source> +<target>Erreur de gestion de fichiers</target> +<source>Overview</source> +<target>Présentation</target> +<source>Select logfile directory:</source> +<target>Choisissez un dossier pour le fichier .log :</target> +<source>Maximum number of logfiles:</source> +<target>Nombre maximum de fichiers Log</target> +<source>&Save</source> +<target>&Sauvegarder</target> +<source>&Load</source> +<target>&Charger</target> +<source>&Cancel</source> +<target>&Annuler</target> +<source>Elements found:</source> +<target>Elements trouvés :</target> +<source>Elements remaining:</source> +<target>Elements restants :</target> +<source>Speed:</source> +<target>Vitesse :</target> +<source>Time remaining:</source> +<target>Temps restant :</target> +<source>Time elapsed:</source> +<target>Temps écoulé :</target> +<source>Operation:</source> +<target>Opération :</target> +<source>Select variant:</source> +<target>Choisissez une variante :</target> +<source><Automatic></source> +<target><Automatique></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement.</target> +<source>Mirror ->></source> +<target>Miroir ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.</target> +<source>Update -></source> +<target>Mise à Jour -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copie les fichiers nouveaux ou modifiés dans le dossier de droite.</target> +<source>Custom</source> +<target>Personnaliser</target> +<source>Configure your own synchronization rules.</source> +<target>Paramétrage de vos règles de synchronisation.</target> +<source>Deletion handling</source> +<target>Gestion des suppressions</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuration</target> +<source>Category</source> +<target>Catégorie</target> +<source>Action</source> +<target>Action</target> +<source>Files/folders that exist on left side only</source> +<target>Fichiers/répertoires existant seulement à gauche</target> +<source>Files/folders that exist on right side only</source> +<target>Fichiers/répertoires existant seulement à droite</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Fichiers existants des deux côtés, celui de gauche est plus récent</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Fichiers existants des deux côtés, celui de droite est plus récent</target> +<source>Files that have different content</source> +<target>Fichiers ayant un contenu différent</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflits/fichiers ne pouvant être catégorisés</target> +<source>Compare by...</source> +<target>Comparaison par...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Les fichiers sont considérés comme identiques, si + - leur taille + - leur date et heure de dernière modification +sont identiques +</target> +<source>File size and date</source> +<target>Taille et date du fichier</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Les fichiers sont considérés comme identiques, si + - leur contenu +est identique +</target> +<source>File content</source> +<target>Contenu du fichier</target> +<source>Symbolic Link handling</source> +<target>Gestion des Liens Symboliques</target> +<source>Synchronizing...</source> +<target>Synchronisation en cours...</target> +<source>Elements processed:</source> +<target>Elements traités :</target> +<source>&Pause</source> +<target>&Pause</target> +<source>Compare by "File size and date"</source> +<target>Comparaison par "Date et taille des fichiers"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté :</target> +<source>As a result the files are separated into the following categories:</source> +<target>En conclusion, les fichiers sont répartis dans les catégories suivantes :</target> +<source>- equal</source> +<target>- fichiers identiques</target> +<source>- left newer</source> +<target>- fichier de gauche plus récent</target> +<source>- right newer</source> +<target>- fichier de droite plus récent</target> +<source>- exists left only</source> +<target>- le fichier existe seulement à gauche</target> +<source>- exists right only</source> +<target>- le fichier existe seulement à droite</target> +<source>- conflict</source> +<target>- conflit</target> +<source>Compare by "File content"</source> +<target>Comparaison par "Contenu des fichiers"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte. + +Avec cette option, l'arbre de décision est plus simple : +</target> +<source>- different</source> +<target>- fichiers différents</target> +<source>Source code written in C++ utilizing:</source> +<target>Code source écrit en C++ utilisant :</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Pour les traductions de FreeFileSync, un grand merci à :</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Commentaires et suggestions sont les bienvenus à :</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync par Sourceforge</target> +<source>Homepage</source> +<target>Accueil</target> +<source>If you like FFS</source> +<target>Si vous aimez FFS</target> +<source>Donate with PayPal</source> +<target>Faites un don avec PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Etat des erreurs de transfert</target> +<source>Published under the GNU General Public License:</source> +<target>Publié sous licence GNU General Public License :</target> +<source>Ignore subsequent errors</source> +<target>Ignorer les erreurs ultérieures</target> +<source>Hide further error messages during the current process</source> +<target>Masquer les messages d'erreur suivants pendant le traitement</target> +<source>&Ignore</source> +<target>&Ignorer</target> +<source>&Retry</source> +<target>&Réessayer</target> +<source>Do not show this dialog again</source> +<target>Ne plus afficher ce message la prochaine fois</target> +<source>&Switch</source> +<target>&Changer</target> +<source>&Yes</source> +<target>&Oui</target> +<source>&No</source> +<target>&Non</target> +<source>Delete on both sides</source> +<target>Suppression des deux côtés</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté</target> +<source>Use Recycle Bin</source> +<target>Utiliser la Corbeille</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Seuls les fichiers / répertoires qui correspondent à tous les paramètres de filtrage seront sélectionnés pour la synchronisation. +Note: Le définition du filtre doit être relative (!) aux répertoires principaux de la synchronisation. +</target> +<source>Hints:</source> +<target>Conseils :</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Entrez les noms relatifs des fichiers ou des répertoires séparés par un ';' ou par un passage à la ligne.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Les caractères génériques '*' et '?' sont acceptés.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Exclure les fichiers directement sur le tableau principal à l'aide du menu contextuel.</target> +<source>Example</source> +<target>Exemple</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier "temp".</target> +<source>Include</source> +<target>Inclure</target> +<source>Exclude</source> +<target>Exclure</target> +<source>Select time span:</source> +<target>Sélectionner la période :</target> +<source>Minimum file size:</source> +<target>Taille minimum du fichier :</target> +<source>Maximum file size:</source> +<target>Taille maximum du fichier :</target> +<source>&Default</source> +<target>&Défaut</target> +<source>Move column up</source> +<target>Déplacer la colonne vers le haut</target> +<source>Move column down</source> +<target>Déplacer la colonne vers le bas</target> +<source>Copy locked files</source> +<target>Copier les fichiers verrouillés</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +La copie des fichiers partagés ou verrouillés nécessite le Service Volume Shadow Copy +(avec les droits administrateur) +</target> +<source>Copy filesystem permissions</source> +<target>Copie des droits d'accès</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transfert des attributs système des fichiers et des répertoires +(avec les droits administrateur) +</target> +<source>Hidden dialogs:</source> +<target>Boîtes de dialogue masquées :</target> +<source>Reset</source> +<target>Réinitialiser</target> +<source>Show hidden dialogs</source> +<target>Afficher les boîtes de dialogue masquées</target> +<source>External applications</source> +<target>Applications externes</target> +<source>Description</source> +<target>Description</target> +<source>Variant</source> +<target>Variante</target> +<source>Statistics</source> +<target>Statistiques</target> +<source>Find what:</source> +<target>Chercher cela :</target> +<source>Match case</source> +<target>Respecter la casse</target> +<source>&Find next</source> +<target>&Chercher le suivant</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) !</target> +<source>Batch file created successfully!</source> +<target>Fichier de traitement par lots créé avec succès !</target> +<source>Main bar</source> +<target>Barre principale</target> +<source>Folder pairs</source> +<target>Paires de dossiers</target> +<source>Select view</source> +<target>Choisissez une vue</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparaison de dossiers et Synchronisation</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>La Corbeille n'est pas supportée par ce système !</target> +<source>Set direction:</source> +<target>Choix de la direction :</target> +<source>Exclude temporarily</source> +<target>Exclure temporairement</target> +<source>Include temporarily</source> +<target>Inclure temporairement</target> +<source>Exclude via filter:</source> +<target>Exclure à l'aide du filtre :</target> +<source><multiple selection></source> +<target><sélection multiple></target> +<source>D-Click</source> +<target>Clic Droit</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copier dans le presse-papiers CTRL+C</target> +<source>Delete files DEL</source> +<target>Suppression des fichiers DEL</target> +<source>Customize...</source> +<target>Personnaliser...</target> +<source>Auto-adjust columns</source> +<target>Auto-ajustement des colonnes</target> +<source>Include all rows</source> +<target>Inclure toutes les lignes</target> +<source>Exclude all rows</source> +<target>Exclure toutes les lignes</target> +<source>Reset view</source> +<target>Réinitialiser la vue</target> +<source>Show "%x"</source> +<target>Afficher "%x"</target> +<source><Last session></source> +<target><Dernière session></target> +<source>Configuration saved!</source> +<target>Configuration enregistrée !</target> +<source>Save changes to current configuration?</source> +<target>Voulez-vous enregistrer les modifications dans la configuration actuelle ?</target> +<source>Configuration loaded!</source> +<target>Configuration chargée !</target> +<source>Hide files that exist on left side only</source> +<target>Masquer les fichiers n'existant qu'à gauche</target> +<source>Show files that exist on left side only</source> +<target>Afficher les fichiers existant seulement à gauche</target> +<source>Hide files that exist on right side only</source> +<target>Masquer les fichiers n'existant qu'à droite</target> +<source>Show files that exist on right side only</source> +<target>Afficher les fichiers existant seulement à droite</target> +<source>Hide files that are newer on left</source> +<target>Masquer les fichiers plus récents à gauche</target> +<source>Show files that are newer on left</source> +<target>Afficher les fichiers de gauche plus récents que ceux de droite</target> +<source>Hide files that are newer on right</source> +<target>Masquer les fichiers plus récents à droite</target> +<source>Show files that are newer on right</source> +<target>Afficher les fichiers de droite plus récents que ceux de gauche</target> +<source>Hide files that are equal</source> +<target>Masquer les fichiers identiques</target> +<source>Show files that are equal</source> +<target>Afficher les fichiers identiques</target> +<source>Hide files that are different</source> +<target>Masquer les fichiers différents</target> +<source>Show files that are different</source> +<target>Afficher les fichiers différents</target> +<source>Hide conflicts</source> +<target>Masquer les conflits</target> +<source>Show conflicts</source> +<target>Afficher les conflits</target> +<source>Hide files that will be created on the left side</source> +<target>Masquer les fichiers qui seront créés à gauche</target> +<source>Show files that will be created on the left side</source> +<target>Afficher les fichiers qui seront créés à gauche</target> +<source>Hide files that will be created on the right side</source> +<target>Masquer les fichiers qui seront créés à droite</target> +<source>Show files that will be created on the right side</source> +<target>Afficher les fichiers qui seront créés à droite</target> +<source>Hide files that will be deleted on the left side</source> +<target>Masquer les fichiers qui seront supprimés à gauche</target> +<source>Show files that will be deleted on the left side</source> +<target>Afficher les fichiers qui seront supprimés à gauche</target> +<source>Hide files that will be deleted on the right side</source> +<target>Masquer les fichiers qui seront supprimés à droite</target> +<source>Show files that will be deleted on the right side</source> +<target>Afficher les fichiers qui seront supprimés à droite</target> +<source>Hide files that will be overwritten on left side</source> +<target>Fichiers masqués qui ont été écrasés à gauche</target> +<source>Show files that will be overwritten on left side</source> +<target>Afficher les fichiers qui seront écrasés à gauche</target> +<source>Hide files that will be overwritten on right side</source> +<target>Fichiers masqués qui ont été écrasés à droite</target> +<source>Show files that will be overwritten on right side</source> +<target>Afficher les fichiers qui seront écrasés à droite</target> +<source>Hide files that won't be copied</source> +<target>Masquer les fichiers qui ne seront pas copiés</target> +<source>Show files that won't be copied</source> +<target>Afficher les fichiers qui ne seront pas copiés</target> +<source>All directories in sync!</source> +<target>Tous les répertoires sont synchronisés !</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Veuillez lancer une Comparaison avant de lancer la synchronisation !</target> +<source>Comma separated list</source> +<target>Liste d'éléments séparés par une virgule</target> +<source>Legend</source> +<target>Légende</target> +<source>File list exported!</source> +<target>Liste des fichiers exportée !</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x répertoire</pluralform> +<pluralform>%x répertoires</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x fichier</pluralform> +<pluralform>%x fichiers</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x of %y ligne affichée</pluralform> +<pluralform>%x of %y lignes affichées</pluralform> +</target> +<source>Scanning...</source> +<target>Lecture en cours...</target> +<source>Comparing content...</source> +<target>Comparaison du contenu...</target> +<source>Paused</source> +<target>En pause</target> +<source>Aborted</source> +<target>Abandonné</target> +<source>Completed</source> +<target>Terminé</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abandon demandé : En attente de la fin de l'opération en cours...</target> +<source>Continue</source> +<target>Continuer</target> +<source>Pause</source> +<target>Pause</target> +<source>Cannot find %x</source> +<target>Impossible de trouver %x</target> +<source>DECISION TREE</source> +<target>ARBRE DE DECISION</target> +<source>file exists on both sides</source> +<target>le fichier existe des deux côtés</target> +<source>on one side only</source> +<target>le fichier existe d'un seul côté seulement</target> +<source>- left</source> +<target>- à gauche</target> +<source>- right</source> +<target>- à droite</target> +<source>different</source> +<target>fichiers différents</target> +<source>- conflict (same date, different size)</source> +<target>- conflit (même date, taille différente)</target> +<source>Inactive</source> +<target>Inactif</target> +<source>Second</source> +<target>Seconde</target> +<source>Minute</source> +<target>Minute</target> +<source>Hour</source> +<target>Heure</target> +<source>Day</source> +<target>Jour</target> +<source>Byte</source> +<target>Octet</target> +<source>KB</source> +<target>Ko</target> +<source>MB</source> +<target>Mo</target> +<source>Filter: All pairs</source> +<target>Filtre : Toutes les paires</target> +<source>Filter: Single pair</source> +<target>Filtre : Une seule paire</target> +<source>Ignore</source> +<target>Ignorer</target> +<source>Direct</source> +<target>Direct</target> +<source>Follow</source> +<target>Suivre</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles :</target> +<source>- full file or directory name</source> +<target>- nom complet du fichier ou du répertoire</target> +<source>- directory part only</source> +<target>- seulement les répertoires</target> +<source>- Other side's counterpart to %name</source> +<target>- équivalent de %name de l'autre côté</target> +<source>- Other side's counterpart to %dir</source> +<target>- équivalent de %dir de l'autre côté</target> +<source>Restore all hidden dialogs?</source> +<target>Restaurer toutes les boîtes de dialogue cachées ?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Voulez-vous vraiment mettre cet objet dans la corbeille ?</pluralform> +<pluralform>Voulez-vous vraiment mettre ces %x objets dans la corbeille ?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Voulez-vous vraiment supprimer cet objet ?</pluralform> +<pluralform>Voulez-vous vraiment supprimer ces %x objets ?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Abandonner en tant que conflit non résolu</target> +<source>Delete permanently</source> +<target>Suppression définitive</target> +<source>Delete or overwrite files permanently</source> +<target>Supprimer ou écraser les fichiers définitivement</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target> +<source>Versioning</source> +<target>Choisir un dossier</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Déplacer les fichiers vers un sous-répertoire daté</target> +<source>Cannot determine sync-direction:</source> +<target>Impossible de déterminer le sens de la synchro :</target> +<source>Filter settings have changed!</source> +<target>La configuration du filtre a changé !</target> +<source>Both sides have changed since last synchronization!</source> +<target>Les deux côtés ont changé depuis la dernière synchronisation !</target> +<source>No change since last synchronization!</source> +<target>Aucun changement depuis la dernière synchronisation !</target> +<source>The file was not processed by last synchronization!</source> +<target>Le fichier n'a pas été traité par la dernière synchronisation !</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers !</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux.</target> +<source>The file does not contain a valid configuration:</source> +<target>Le fichier ne contient pas de configuration valide :</target> +<source>Scanning:</source> +<target>Lecture en cours :</target> +<source>Encoding extended time information: %x</source> +<target>Codage de l'heure au format étendu : %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Vous pouvez ignorer cette erreur en considérant le répertoire comme vide.</target> +<source>Directory does not exist:</source> +<target>Le répertoire n'existe pas :</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation :</target> +<source>Comparing content of files %x</source> +<target>Comparaison du contenu des fichiers %x</target> +<source>Memory allocation failed!</source> +<target>Erreur d'allocation de mémoire!</target> +<source>File %x has an invalid date!</source> +<target>Le fichier %x a une date invalide !</target> +<source>Conflict detected:</source> +<target>Conflit détecté :</target> +<source>Files %x have the same date but a different size!</source> +<target>Les fichiers %x ont la même date mais une taille différente !</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Le lien symbolique %x a la même date mais une destination différente !</target> +<source>Comparing files by content failed.</source> +<target>La comparaison des fichiers par leur contenu a échoué.</target> +<source>Generating file list...</source> +<target>Génération de la liste des fichiers...</target> +<source>Multiple...</source> +<target>Multiple...</target> +<source>Files that are equal on both sides</source> +<target>Fichiers identiques des deux côtés</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Fichiers/Dossiers identiques dont seuls les attributs diffèrent</target> +<source>Copy from right to left</source> +<target>Copie de droite à gauche</target> +<source>Copy from left to right</source> +<target>Copie de gauche à droite</target> +<source>Delete files/folders existing on left side only</source> +<target>Suppression des fichiers/dossiers n'existant que sur le côté gauche</target> +<source>Delete files/folders existing on right side only</source> +<target>Suppression des fichiers/dossiers n'existant que sur le côté droit</target> +<source>Copy from right to left overwriting</source> +<target>Copie de droite à gauche avec remplacement</target> +<source>Copy from left to right overwriting</source> +<target>Copie de gauche à droite avec remplacement</target> +<source>Do nothing</source> +<target>Ne rien faire</target> +<source>Copy attributes only from right to left</source> +<target>Copier uniquement les attributs de droite à gauche</target> +<source>Copy attributes only from left to right</source> +<target>Copier uniquement les attributs de gauche à droite</target> +<source>Deleting file %x</source> +<target>Suppression du fichier %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Suppression du Lien Symbolique %x</target> +<source>Deleting folder %x</source> +<target>Suppression du dossier %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Déplacement de %x vers la Corbeille</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Déplacement du fichier %x vers le répertoire utilisateur %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Déplacement du dossier %x vers le répertoire utilisateur %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y</target> +<source>Copying new file %x to %y</source> +<target>Copie le nouveau fichier %x vers %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copie le nouveau Lien Symbolique %x vers %y</target> +<source>Overwriting file %x in %y</source> +<target>Remplacement du fichier %x par %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Remplacement du Lien Symbolique %x par %y</target> +<source>Creating folder %x</source> +<target>Création du dossier %x</target> +<source>Verifying file %x</source> +<target>Contrôle du fichier %x</target> +<source>Updating attributes of %x</source> +<target>Mise à jour des attributs de %x</target> +<source>Source directory does not exist anymore:</source> +<target>Le répertoire source n'existe plus :</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Rien à synchroniser dans cette configuration !</target> +<source>Target directory name must not be empty!</source> +<target>Le répertoire destination ne doit pas être vide !</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué !</target> +<source>Unresolved conflicts existing!</source> +<target>Il y a des conflits non résolus !</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Vous pouvez ignorer ces conflits et continuer la synchronisation.</target> +<source>Significant difference detected:</source> +<target>Différence significative détectée :</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Plus de 50% des fichiers seront copiés ou détruits !</target> +<source>Not enough free disk space available in:</source> +<target>Espace disque insuffisant sur :</target> +<source>Free disk space required:</source> +<target>Espace disque nécessaire :</target> +<source>Free disk space available:</source> +<target>Espace disque disponible :</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Un répertoire faisant partie de paires multiples doit être modifié ! Vérifiez les paramètres de la synchronisation !</target> +<source>Processing folder pair:</source> +<target>Traitement de la paire de dossiers :</target> +<source>Generating database...</source> +<target>Génération de la base de données...</target> +<source>Error copying locked file %x!</source> +<target>Erreur lors de la copie du fichier verrouillé %x !</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents !</target> diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index 889211cd..2070aae1 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -1,910 +1,1051 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x von %y Objekten erfolgreich gelöscht -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x Tag(e) -%x directories -%x Verzeichnisse -%x files -%x Dateien -%x hour(s) -%x Stunde(n) -%x kB -%x kB -%x min -%x Min. -%x of %y rows in view -%x von %y Zeilen zur Ansicht -%x of 1 row in view -%x von 1 Zeile zur Ansicht -%x sec -%x Sek. -%x% -%x% -&Abort -&Abbrechen -&About... -&Ãœber... -&Advanced -&Erweitert -&Cancel -&Abbrechen -&Check for new version -&Auf neuere Version prüfen -&Content -&Inhalt -&Create batch job... -&Batch-Job erstellen... -&Default -&Standard -&Exit -&Beenden -&Export file list... -Dateiliste e&xportieren... -&File -&Datei -&Find next -&Weitersuchen -&Global settings... -&Globale Einstellungen... -&Help -&Hilfe -&Ignore -&Ignorieren -&Language -&Sprache -&Load -&Laden -&Load configuration... -Konfiguration &laden... -&New -&Neu -&No -&Nein -&OK -&OK -&Pause -&Pause -&Program -&Programm -&Quit -&Beenden -&Restore -&Wiederherstellen -&Retry -&Wiederholen -&Save -&Speichern -&Switch -&Wechseln -&Yes -&Ja -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Eine Internetverbindung wird benötigt!) -- Other side's counterpart to %dir -- Entsprechung der anderen Seite zu %dir -- Other side's counterpart to %name -- Entsprechung der anderen Seite zu %name -- conflict -- Konflikt -- conflict (same date, different size) -- Konflikt (gleiches Datum, unterschiedliche Größe) -- different -- verschieden -- directory part only -- nur Verzeichnisanteil -- equal -- gleich -- exists left only -- existiert nur links -- exists right only -- existiert nur rechts -- full file or directory name -- kompletter Datei oder Verzeichnisname -- left -- links -- left newer -- links neuer -- right -- rechts -- right newer -- rechts neuer -/sec -/s -1 directory -1 Verzeichnis -1 file -1 Datei -1. &Compare -1. &Vergleichen -1. Enter relative file or directory names separated by ';' or a new line. -1. Relative Datei- oder Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben. -1. Select directories to monitor. -1. Zu überwachende Verzeichnisse wählen. -2. &Synchronize... -2. &Synchronisieren... -2. Enter a command line. -2. Eine Befehlszeile angeben. -2. Use wildcard characters '*' and '?'. -2. Die Platzhalter '*' und '?' werden unterstützt. -3. Exclude files directly on main grid via context menu. -3. Dateien können direkt über das Kontextmenü im Hauptfenster ausgeschlossen werden. -3. Press 'Start'. -3. 'Start' drücken. -<Automatic> -<Automatik> -<Directory> -<Verzeichnis> -<Last session> -<Letzte Sitzung> -<Symlink> -<Symlink> -<multiple selection> -<Mehrfachauswahl> -A directory input field is empty. -Ein Verzeichniseingabefeld ist leer. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Es wird ein Verzeichnis verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte die Synchronisationseinstellungen prüfen! -A newer version of FreeFileSync is available: -Eine neuere Version von FreeFileSync ist verfügbar: -Abort requested: Waiting for current operation to finish... -Abbruch initiiert: Warte, bis aktuelle Operation beendet ist... -Abort synchronization immediately -Synchronisation sofort abbrechen -Aborted -Abgebrochen -About -Ãœber -Action -Aktion -Add folder -Verzeichnis hinzufügen -Add folder pair -Verzeichnispaar hinzufügen -All directories in sync! -Alle Verzeichnisse sind synchron! -An exception occurred! -Eine Ausnahme ist aufgetreten! -As a result the files are separated into the following categories: -Das Ergebnis ist eine Aufteilung in folgende Kategorien: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.\n\nDer Entscheidungsbaum ist in diesem Fall kleiner: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batch-Modus zu starten, muss nur der Dateiname an die Programmdatei übergeben werden: FreeFileSync.exe <Batchdatei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden. -At least one directory input field is empty. -Mindestens ein Verzeichniseingabefeld ist leer. -Auto-adjust columns -Spalten automatisch ausrichten -Batch execution -Batchlauf -Batch file created successfully! -Batchdatei wurde erfolgreich erstellt! -Batch job -Batch-Job -Big thanks for localizing FreeFileSync goes out to: -Vielen Dank für die Lokalisation von FreeFileSync an: -Both sides have changed since last synchronization! -Beide Seiten wurden seit der letzten Synchronisation verändert! -Browse -Auswählen -Browse directory -Verzeichnis öffnen -Cannot determine sync-direction: -Die Synchronisationsrichtung konnte nicht bestimmt werden: -Cannot find %x -%x wurde nicht gefunden. -Cannot write to empty directory path! +<header> + <language name>Deutsch</language name> + <translator>ZenJu</translator> + <locale>de_DE</locale> + <flag file>germany.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> -Category -Kategorie -Clear filter settings -Filtereinstellungen löschen -Comma separated list -Kommagetrennte Liste -Command line -Befehlszeile -Command line is empty! -Die Befehlszeile ist leer! -Compare -Vergleichen -Compare both sides -Beide Seiten vergleichen -Compare by \"File content\" -Vergleich nach \"Dateiinhalt\" -Compare by \"File size and date\" -Vergleich nach \"Dateigröße und -datum\" -Compare by... -Vergleichen nach... -Comparing content of files %x -Vergleiche Inhalt der Dateien %x -Comparing content... -Vergleiche Dateiinhalt... -Comparing files by content failed. -Vergleich nach Dateiinhalt ist fehlgeschlagen. -Comparison Result -Ergebnis des Vergleichs -Comparison settings -Vergleichseinstellungen -Completed -Fertig -Configuration -Konfiguration -Configuration loaded! -Konfiguration geladen! -Configuration overview: -Konfigurationsübersicht: -Configuration saved! -Konfiguration gespeichert! -Configure filter -Konfiguriere Filter -Configure your own synchronization rules. -Eigene Synchronisationsregeln definieren. -Confirm -Bestätigen -Conflict detected: -Ein Konflikt wurde erkannt: -Conflicts/files that cannot be categorized -Konflikte/Dateien, die nicht eingeordnet werden können -Continue -Fortfahren -Conversion error: -Fehler bei Konvertierung: -Copy attributes only from left to right -Nur Attribute von links nach rechts kopieren -Copy attributes only from right to left -Nur Attribute von rechts nach links kopieren -Copy filesystem permissions -Dateisystemberechtigungen kopieren -Copy from left to right -Von links nach rechts kopieren -Copy from left to right overwriting -Von links nach rechts kopieren und überschreiben -Copy from right to left -Von rechts nach links kopieren -Copy from right to left overwriting -Von rechts nach links kopieren und überschreiben -Copy locked files -Gesperrte Dateien kopieren -Copy new or updated files to right folder. -Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopiere gesperrte Dateien mit Hilfe des Volume Shadow Copy Service\n(Benötigt Administratorrechte) -Copy to clipboard\tCTRL+C -In die Zwischenablage kopieren\tCTRL+C -Copying new Symbolic Link %x to %y -Kopiere neuen Symbolischen Link %x nach %y -Copying new file %x to %y -Kopiere neue Datei %x nach %y -Could not determine volume name for file: -Der Laufwerksname für folgende Datei konnte nicht ermittelt werden: -Could not initialize directory monitoring: -Die Verzeichnisüberwachung konnte nicht gestartet werden: -Could not load a required DLL: -Eine benötigte DLL konnte nicht geladen werden: -Could not read values for the following XML nodes: -Die folgenden XML Knoten konnten nicht gelesen werden: -Create a batch job -Batch-Job erstellen -Creating folder %x -Erstelle Verzeichnis %x -Custom -Eigene -Customize columns -Spalten anpassen -Customize... -Anpassen... -D-Click -D-Klick -DECISION TREE -ENTSCHEIDUNGSBAUM -Data verification error: Source and target file have different content! -Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt! -Date -Datum -Delete files/folders existing on left side only -Nur links existierende Dateien/Verzeichnisse löschen -Delete files/folders existing on right side only -Nur rechts existierende Dateien/Verzeichnisse löschen -Delete files\tDEL -Dateien löschen\tDEL -Delete on both sides -Auf beiden Seiten löschen -Delete on both sides even if the file is selected on one side only -Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist -Delete or overwrite files permanently -Dateien endgültig löschen oder überschreiben -Delete permanently -Endgültig löschen -Deleting Symbolic Link %x -Lösche Symbolischen Link %x -Deleting file %x -Lösche Datei %x -Deleting folder %x -Lösche Verzeichnis %x -Deletion handling -Behandlung von Löschungen -Description -Beschreibung -Direct -Direkt -Directories are dependent! Be careful when setting up synchronization rules: -Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen: -Directories to watch -Zu überwachende Verzeichnisse -Directory -Verzeichnis -Directory does not exist: -Das Verzeichnis existiert nicht: -Do not show this dialog again -Diesen Dialog nicht mehr anzeigen -Do nothing -Nichts tun -Do you really want to delete the following object(s)? -Sollen folgende Elemente wirklich gelöscht werden? -Do you really want to move the following object(s) to the Recycle Bin? -Sollen folgende Elemente wirklich in den Papierkorb verschoben werden? -Do you want FreeFileSync to automatically check for updates every week? -Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen? -Donate with PayPal -Mit PayPal spenden -Download now? -Jetzt herunterladen? -Drag && drop -Drag && Drop -Elements found: -Gefundene Elemente: -Elements processed: -Verarbeitete Elemente: -Elements remaining: -Verbleibende Elemente: -Email -Email -Encoding extended time information: %x -Speichere erweiterte Zeitinformation: %x -Endless loop when traversing directory: -Endlosschleife beim Lesen des Verzeichnisses: -Equal files/folders that differ in attributes only -Gleiche Dateien/Verzeichnisse mit unterschiedlichen Attributen -Error -Fehler -Error changing modification time: -Fehler beim Setzen der Dateiänderungszeit: -Error copying file permissions: -Fehler beim Kopieren der Dateiberechtigungen: -Error copying file: -Fehler beim Kopieren der Datei: -Error copying locked file %x! -Fehler beim Kopieren der gesperrten Datei %x! -Error copying symbolic link: -Fehler beim Kopieren des Symbolischen Links: -Error creating directory: -Fehler beim Erstellen des Verzeichnisses: -Error deleting directory: -Fehler beim Löschen des Verzeichnisses: -Error deleting file: -Fehler beim Löschen der Datei: -Error handling -Fehlerbehandlung -Error loading library function: -Fehler beim Laden der Bibliotheksfunktion: -Error moving directory: -Fehler beim Verschieben des Verzeichnisses: -Error moving file: -Fehler beim Verschieben der Datei: -Error moving to Recycle Bin: -Fehler beim Verschieben in den Papierkorb: -Error opening file: -Fehler beim Öffnen der Datei: -Error parsing configuration file: -Fehler beim Auswerten der Konfigurationsdatei: -Error reading file attributes: -Fehler beim Lesen der Dateiattribute: -Error reading file: -Fehler beim Lesen der Datei: -Error reading from synchronization database: -Fehler beim Lesen der Synchronisationsdatenbank: -Error reading security context: -Fehler beim Lesen des Sicherheitskontextes: -Error resolving symbolic link: -Fehler beim Auflösen des Symbolischen Links: -Error setting directory lock: -Fehler beim Setzen der Verzeichnissperre: -Error setting privilege: -Fehler beim Setzen des Privilegs: -Error starting Volume Shadow Copy Service! -Fehler beim Starten des Volume Shadow Copy Service! -Error traversing directory: -Fehler beim Durchsuchen des Verzeichnisses: -Error when monitoring directories. -Fehler beim Ãœberwachen der Verzeichnisse. -Error writing file: -Fehler beim Schreiben der Datei: -Error writing security context: -Fehler beim Schreiben des Sicherheitskontextes: -Error writing to synchronization database: -Fehler beim Schreiben der Synchronisationsdatenbank: -Example -Beispiel -Exclude -Ausschließen -Exclude all rows -Alle Zeilen ausschließen -Exclude temporarily -Temporär ausschließen -Exclude via filter: -Ãœber Filter ausschließen: -Exit instantly -Sofort beenden -Extension -Dateiendung -External applications -Externe Anwendungen -Fatal Error -Fataler Fehler -Feedback and suggestions are welcome at: -Feedback und Vorschläge sind willkommen unter: -File %x has an invalid date! -Die Datei %x hat ein ungültiges Datum! -File already exists. Overwrite? -Die Datei existiert bereits. Ãœberschreiben? -File content -Dateiinhalt -File does not exist: -Die Datei existiert nicht: -File list exported! -Dateiliste exportiert! -File size and date -Dateigröße und -datum -Filename -Dateiname -Files %x have the same date but a different size! -Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen! -Files are found equal if\n - file content\nis the same -Dateien gelten als gleich, wenn\n - der Inhalt\ngleich ist -Files are found equal if\n - filesize\n - last write time and date\nare the same -Dateien gelten als gleich, wenn\n - die Größe\n - Datum und Uhrzeit der letzten Änderung\ngleich sind -Files that are equal on both sides -Auf beiden Seiten gleiche Dateien -Files that exist on both sides, left one is newer -Auf beiden Seiten existierende Dateien; linke Datei ist neuer -Files that exist on both sides, right one is newer -Auf beiden Seiten existierende Dateien; rechte Datei ist neuer -Files that have different content -Dateien mit verschiedenem Inhalt -Files/folders that exist on left side only -Nur links exisitierende Dateien/Verzeichnisse -Files/folders that exist on right side only -Nur rechts exisitierende Dateien/Verzeichnisse -Filter files -Dateien filtern -Filter is active -Filter ist aktiv -Filter settings have changed! -Die Filtereinstellungen wurden geändert! -Filter: All pairs -Filter: Alle Verzeichnispaare -Filter: Single pair -Filter: Einzelnes Verzeichnispaar -Find -Suchen -Find what: -Suchen nach: -Folder Comparison and Synchronization -Verzeichnisvergleich und Synchronisation -Folder pairs -Verzeichnispaare -Follow -Folgen -Free disk space available: -Verfügbarer freier Speicherplatz: -Free disk space required: -Benötigter freier Speicherplatz: -FreeFileSync Batch Job -FreeFileSync Batch-Job -FreeFileSync at Sourceforge -FreeFileSync auf Sourceforge -FreeFileSync batch file -FreeFileSync Batchdatei -FreeFileSync configuration -FreeFileSync Konfiguration -FreeFileSync is up to date! -FreeFileSync ist auf dem neuesten Stand! -Full path -Absoluter Pfad -Generating database... -Erzeuge Synchronisationsdatenbank... -Generating file list... -Erzeuge Dateiliste... -Global settings -Globale Einstellungen -Help -Hilfe -Hidden dialogs: -Versteckte Dialoge: -Hide all error and warning messages -Alle Fehler- und Warnmeldungen werden unterdrückt -Hide conflicts -Konflikte ausblenden -Hide excluded items -Ausgeschlossene Elemente verstecken -Hide files that are different -Ungleiche Dateien ausblenden -Hide files that are equal -Gleiche Dateien ausblenden -Hide files that are newer on left -Auf beiden Seiten existierende Dateien ausblenden; linke Datei ist neuer -Hide files that are newer on right -Auf beiden Seiten existierende Dateien ausblenden; rechte Datei ist neuer -Hide files that exist on left side only -Nur links existierende Dateien ausblenden -Hide files that exist on right side only -Nur rechts existierende Dateien ausblenden -Hide files that will be created on the left side -Dateien die links erstellt werden ausblenden -Hide files that will be created on the right side -Dateien die rechts erstellt werden ausblenden -Hide files that will be deleted on the left side -Dateien die links gelöscht werden ausblenden -Hide files that will be deleted on the right side -Dateien die rechts gelöscht werden ausblenden -Hide files that will be overwritten on left side -Dateien die links überschrieben werden ausblenden -Hide files that will be overwritten on right side -Dateien die rechts überschrieben werden ausblenden -Hide files that won't be copied -Dateien die nicht kopiert werden ausblenden -Hide filtered or temporarily excluded files -Gefilterte oder temporär ausgeschlossene Dateien ausblenden -Hide further error messages during the current process -Weitere Fehlermeldungen während des laufenden Prozesses ausblenden -Hints: -Tipps: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt. -Idle time between detection of last change and execution of command line in seconds -Ruhezeit zwischen Erkennung der letzten Änderung und Aufrufen der Kommandozeile in Sekunden -If you like FFS -FFS unterstützen -Ignore -Ignorieren -Ignore errors -Fehler ignorieren -Ignore subsequent errors -Nachfolgende Fehler ignorieren -Include -Einschließen -Include all rows -Alle Zeilen einschließen -Include temporarily -Temporär einschließen -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Einschließen: *.doc;*.zip;*.exe\nAusschließen: \\stuff\\temp\\* -Incompatible synchronization database format: -Inkompatibles Datenbankformat: -Info -Info -Information -Information -Initial synchronization: -Erstmalige Synchronisation: -Integrate external applications into context menu. The following macros are available: -Integriert externe Anwendungen in das Kontextmenu. Die folgenden Makros stehen zur Verfügung: -Invalid FreeFileSync config file! -Ungültige FreeFileSync Konfigurationsdatei! -Last used configurations (press DEL to remove from list) -Zuletzt benutzte Konfigurationen (DEL-Taste löscht Einträge) -Leave as unresolved conflict -Als unbehandelten Konflikt belassen -Left -Links -Legend -Legende -Load configuration from file -Konfiguration aus Datei laden -Log-messages: -Meldungen: -Logging -Protokoll -Main bar -Hauptleiste -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version. -Match case -Groß-/Kleinschreibung -Maximum number of logfiles: -Maximale Anzahl an Logdateien: -Memory allocation failed! -Speicherallokation fehlgeschlagen! -Minimum Idle Time [seconds] -Minimale Ruhezeit [Sekunden] -Mirror ->> -Spiegeln ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Spiegelkopie des linken Verzeichnisses erstellen. Das rechte Verzeichnis wird dem linken exakt angeglichen. -Monitoring active... -Ãœberwachung aktiv... -More than 50% of the total number of files will be copied or deleted! -Mehr als 50% aller Dateien werden kopiert oder gelöscht! -Move column down -Spalte nach unten verschieben -Move column up -Spalte nach oben verschieben -Move files into a time-stamped subdirectory -Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel -Moving %x to Recycle Bin -Verschiebe %x in den Papierkorb -Moving Symbolic Link %x to user-defined directory %y -Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y -Moving file %x to user-defined directory %y -Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y -Moving folder %x to user-defined directory %y -Verschiebe Ordner %x in benutzerdefiniertes Verzeichnis %y -Multiple... -Verschiedene... -No change since last synchronization! -Keine Änderungen seit der letzten Synchronisation! -No filter selected -Kein Filter ausgewählt -Not enough free disk space available in: -Nicht genügend freier Speicher verfügbar unter: -Nothing to synchronize according to configuration! -Nichts zu synchronisieren gemäß den aktuellen Einstellungen! -Number of files and directories that will be created -Anzahl der zu erstellenden Dateien und Verzeichnisse -Number of files and directories that will be deleted -Anzahl der zu löschenden Dateien und Verzeichnisse -Number of files that will be overwritten -Anzahl der zu überschreibenden Dateien -One of the FreeFileSync database entries within the following file is not yet existing: -Einer der FreeFileSync Datenbankeinträge innerhalb der folgenden Datei existiert noch nicht: -One of the FreeFileSync database files is not yet existing: -Eine der FreeFileSync Datenbankdateien existiert noch nicht: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Für die Synchronisation werden nur die Dateien/Verzeichnisse berücksichtigt, die den Filtereinstellungen genügen. Der Filter wird dabei auf den Dateinamen relativ(!) zu den Basis-Synchronisationsverzeichnissen angewandt. -Open with Explorer -Mit Explorer öffnen -Open with default application -Mit Standardanwendung öffnen -Operation aborted! -Vorgang abgebrochen! -Operation: -Vorgang: -Overview -Ãœbersicht -Overwriting Symbolic Link %x in %y -Ãœberschreibe Symbolischen Link %x in %y -Overwriting file %x in %y -Ãœberschreibe Datei %x in %y -Pause -Pause -Paused -Angehalten -Planned directory deletion is in conflict with its subdirectories and -files! -Das geplante Löschen des Verzeichnisses steht in Konflikt mit seinen Unterverzeichnissen und -dateien -Please run a Compare first before synchronizing! -Vor der Synchronisation bitte zuerst einen Vergleich ausführen! -Press \"Switch\" to open FreeFileSync GUI mode. -\"Wechseln\" öffnet FreeFileSync in der graphischen Ansicht. -Processing folder pair: -Bearbeite Verzeichnispaar: -Published under the GNU General Public License: -Veröffentlicht unter der GNU General Public License: -Question -Frage -RealtimeSync - Automated Synchronization -RealtimeSync - Automatisierte Synchronisation -RealtimeSync configuration -RealtimeSync Konfiguration -Recycle Bin not yet supported for this system! -Der Papierkorb wird für dieses System noch nicht unterstützt! -Relative path -Relativer Pfad -Remove alternate settings -Alternative Einstellungen entfernen -Remove folder -Verzeichnis entfernen -Remove folder pair -Verzeichnispaar entfernen -Report translation error -Ãœbersetzungsfehler melden -Reset -Zurücksetzen -Reset view -Ansicht zurücksetzen -Restore all hidden dialogs? -Alle versteckten Dialoge wieder anzeigen? -Right -Rechts -S&ave configuration... -Konfiguration s&peichern... -S&witch view -Ansicht &wechseln -Save changes to current configuration? -Änderungen der aktuellen Konfiguration sichern? -Save current configuration to file -Aktuelle Konfiguration in Datei speichern -Scanning... -Suche Dateien... -Scanning: -Suche Dateien: -Select a folder -Verzeichnis auswählen -Select alternate synchronization settings -Alternative Synchronisationseinstellungen auswählen -Select logfile directory: -Verzeichnis für Logdatei wählen: -Select variant: -Variante auswählen: -Select view -Ansicht auswählen -Set direction: -Setze Richtung: -Setting default synchronization directions: Old files will be overwritten with newer files. -Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben. -Show \"%x\" -Zeige \"%x\" -Show conflicts -Konflikte zeigen -Show files that are different -Ungleiche Dateien anzeigen -Show files that are equal -Gleiche Dateien anzeigen -Show files that are newer on left -Auf beiden Seiten existierende Dateien anzeigen; linke Datei ist neuer -Show files that are newer on right -Auf beiden Seiten existierende Dateien anzeigen; rechte Datei ist neuer -Show files that exist on left side only -Nur links existierende Dateien anzeigen -Show files that exist on right side only -Nur rechts existierende Dateien anzeigen -Show files that will be created on the left side -Dateien die links erstellt werden anzeigen -Show files that will be created on the right side -Dateien die rechts erstellt werden anzeigen -Show files that will be deleted on the left side -Dateien die links gelöscht werden anzeigen -Show files that will be deleted on the right side -Dateien die rechts gelöscht werden anzeigen -Show files that will be overwritten on left side -Dateien die links überschrieben werden anzeigen -Show files that will be overwritten on right side -Dateien die rechts überschrieben werden anzeigen -Show files that won't be copied -Dateien die nicht kopiert werden anzeigen -Show hidden dialogs -Zeige versteckte Dialoge -Show popup -Popup zeigen -Show popup on errors or warnings -Zeigt ein Auswahlfenster bei Fehlern oder Warnungen an -Significant difference detected: -Ein erheblicher Unterschied wurde festgestellt: -Silent mode -Stiller Modus -Size -Größe -Source code written completely in C++ utilizing: -Sourcecode komplett in C++ geschrieben mit Hilfe von: -Source directory does not exist anymore: -Quellverzeichnis existiert nicht mehr: -Speed: -Geschwindigkeit: -Start -Start -Start minimized and write status information to a logfile -Minimiert starten und Statusinformationen in eine Logdatei schreiben -Start synchronization -Synchronisation starten -Statistics -Statistiken -Status feedback -Statusbericht -Stop -Stop -Swap sides -Seiten vertauschen -Switching to FreeFileSync GUI mode... -Wechsle in die graphische Ansicht... -Symbolic Link handling -Behandlung Symbolischer Links -Symlinks %x have the same date but a different target! -Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel! -Synchronization Preview -Synchronisationsvorschau -Synchronization aborted! -Synchronisation abgebrochen! -Synchronization completed successfully! -Synchronisation erfolgreich abgeschlossen! -Synchronization completed with errors! -Synchronisation mit Fehlern abgeschlossen! -Synchronization settings -Synchronisationseinstellungen -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Alle .doc, .zip und .exe Dateien mit Ausnahme des Verzeichnisses \"temp\" werden synchronisiert. -Synchronize... -Synchronisieren -Synchronizing... -Synchronisiere... -Target directory already existing! -Zielverzeichnis existiert bereits! -Target file already existing! -Die Zieldatei existiert bereits! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Die Befehlszeile wird ausgeführt wenn:\n- alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks)\n- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden -The file does not contain a valid configuration: -Die Datei enthält keine gültige Konfiguration: -The file was not processed by last synchronization! -Die Datei wurde in der letzten Synchronisation nicht verarbeitet! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. -Time elapsed: -Vergangene Zeit: -Time remaining: -Verbleibende Zeit: -Total amount of data that will be transferred -Gesamtmenge der zu übertragenden Daten -Total time: -Gesamtzeit: -Transfer file and directory permissions\n(Requires Administrator rights) -Ãœbertrage Datei- und Verzeichnisberechtigungen\n(Benötigt Administratorrechte) -Unable to connect to sourceforge.net! -Es konnte keine Verbindung zu sourceforge.net aufgebaut werden! -Unable to create logfile! -Die Protokolldatei konnte nicht erstellt werden! -Unresolved conflicts existing! -Es existieren ungelöste Konflikte! -Update -> -Aktualisieren -> -Updating attributes of %x -Aktualisiere Attribute von %x -Usage: -Verwendung: -Use Recycle Bin -Papierkorb verwenden -Use Recycle Bin when deleting or overwriting files -Papierkorb für zu löschende oder zu überschreibende Dateien nutzen -User-defined directory for deletion was not specified! -Kein benutzerdefiniertes Verzeichnis zum Löschen angegeben! -Variant -Variante -Verifying file %x -Verifiziere Datei %x -Versioning -Versionierung -Volume name %x not part of filename %y! -Laufwerksname %x ist kein Teil des Dateinamens %y! -Waiting for missing directories... -Warte auf fehlende Verzeichnisse... -Waiting while directory is locked (%x)... -Warte während Verzeichnis gesperrt ist (%x)... -Warning -Warnung -When the comparison is started with this option set the following decision tree is processed: -Wenn der Vergleich mit dieser Option gestartet wurde, wird folgender Entscheidungsbaum abgearbeitet: -You can ignore conflicts and continue synchronization. -Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden. -You can ignore this error to consider the directory as empty. -Dieser Fehler kann ignoriert werden, um das Verzeichnis als leer anzusehen. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)! -different -verschieden -file exists on both sides -Datei existiert auf beiden Seiten -on one side only -nur auf einer Seite +<source>Show in Explorer</source> +<target>Im Explorer anzeigen</target> +<source>Open with default application</source> +<target>Mit Standardanwendung öffnen</target> +<source>Browse directory</source> +<target>Verzeichnis öffnen</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automatisierte Synchronisation</target> +<source>Browse</source> +<target>Auswählen</target> +<source>Error resolving symbolic link:</source> +<target>Fehler beim Auflösen des Symbolischen Links:</target> +<source>Select alternate synchronization settings</source> +<target>Alternative Synchronisationseinstellungen auswählen</target> +<source>No filter selected</source> +<target>Kein Filter ausgewählt</target> +<source>Filter is active</source> +<target>Filter ist aktiv</target> +<source>Clear filter settings</source> +<target>Filtereinstellungen löschen</target> +<source>Remove alternate settings</source> +<target>Alternative Einstellungen entfernen</target> +<source>Create a batch job</source> +<target>Batch-Job erstellen</target> +<source>Synchronization settings</source> +<target>Synchronisationseinstellungen</target> +<source>Comparison settings</source> +<target>Vergleichseinstellungen</target> +<source>About</source> +<target>Ãœber</target> +<source>Error</source> +<target>Fehler</target> +<source>Warning</source> +<target>Warnung</target> +<source>Question</source> +<target>Frage</target> +<source>Confirm</source> +<target>Bestätigen</target> +<source>Configure filter</source> +<target>Konfiguriere Filter</target> +<source>Customize columns</source> +<target>Spalten anpassen</target> +<source>Global settings</source> +<target>Globale Einstellungen</target> +<source>Synchronization Preview</source> +<target>Synchronisationsvorschau</target> +<source>Find</source> +<target>Suchen</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Verzeichnis></target> +<source>Size</source> +<target>Größe</target> +<source>Date</source> +<target>Datum</target> +<source>Full path</source> +<target>Absoluter Pfad</target> +<source>Filename</source> +<target>Dateiname</target> +<source>Relative path</source> +<target>Relativer Pfad</target> +<source>Directory</source> +<target>Verzeichnis</target> +<source>Extension</source> +<target>Dateiendung</target> +<source>Comparison Result</source> +<target>Ergebnis des Vergleichs</target> +<source>Incompatible synchronization database format:</source> +<target>Inkompatibles Datenbankformat:</target> +<source>Initial synchronization:</source> +<target>Erstmalige Synchronisation:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Eine der FreeFileSync Datenbankdateien existiert noch nicht:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Einer der FreeFileSync Datenbankeinträge innerhalb der folgenden Datei existiert noch nicht:</target> +<source>Error reading from synchronization database:</source> +<target>Fehler beim Lesen der Synchronisationsdatenbank:</target> +<source>An exception occurred!</source> +<target>Eine Ausnahme ist aufgetreten!</target> +<source>Error deleting file:</source> +<target>Fehler beim Löschen der Datei:</target> +<source>Error reading file attributes:</source> +<target>Fehler beim Lesen der Dateiattribute:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Warte während Verzeichnis gesperrt ist (%x)...</target> +<source>Error setting directory lock:</source> +<target>Fehler beim Setzen der Verzeichnissperre:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 Sek.</pluralform> +<pluralform>%x Sek.</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Fataler Fehler</target> +<source>Invalid FreeFileSync config file!</source> +<target>Ungültige FreeFileSync Konfigurationsdatei!</target> +<source>File does not exist:</source> +<target>Die Datei existiert nicht:</target> +<source>Error parsing configuration file:</source> +<target>Fehler beim Auswerten der Konfigurationsdatei:</target> +<source>Error writing file:</source> +<target>Fehler beim Schreiben der Datei:</target> +<source>/sec</source> +<target>/s</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 Min.</pluralform> +<pluralform>%x Min.</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 Stunde</pluralform> +<pluralform>%x Stunden</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 Tag</pluralform> +<pluralform>%x Tage</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Konfiguration s&peichern...</target> +<source>&Load configuration...</source> +<target>Konfiguration &laden...</target> +<source>&Quit</source> +<target>&Beenden</target> +<source>&File</source> +<target>&Datei</target> +<source>&Content</source> +<target>&Inhalt</target> +<source>&About...</source> +<target>&Ãœber...</target> +<source>&Help</source> +<target>&Hilfe</target> +<source>Usage:</source> +<target>Verwendung:</target> +<source>1. Select directories to monitor.</source> +<target>1. Zu überwachende Verzeichnisse wählen.</target> +<source>2. Enter a command line.</source> +<target>2. Eine Befehlszeile angeben.</target> +<source>3. Press 'Start'.</source> +<target>3. 'Start' drücken.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Die Befehlszeile wird ausgeführt wenn: +- alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks) +- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden +</target> +<source>Directories to watch</source> +<target>Zu überwachende Verzeichnisse</target> +<source>Add folder</source> +<target>Verzeichnis hinzufügen</target> +<source>Remove folder</source> +<target>Verzeichnis entfernen</target> +<source>Select a folder</source> +<target>Verzeichnis auswählen</target> +<source>Command line</source> +<target>Befehlszeile</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimale Ruhezeit [Sekunden]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Ruhezeit zwischen Erkennung der letzten Änderung und Aufrufen der Kommandozeile in Sekunden</target> +<source>Start</source> +<target>Start</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync Konfiguration</target> +<source>File already exists. Overwrite?</source> +<target>Die Datei existiert bereits. Ãœberschreiben?</target> +<source>&Restore</source> +<target>&Wiederherstellen</target> +<source>&Exit</source> +<target>&Beenden</target> +<source>Monitoring active...</source> +<target>Ãœberwachung aktiv...</target> +<source>Waiting for missing directories...</source> +<target>Warte auf fehlende Verzeichnisse...</target> +<source>Command line is empty!</source> +<target>Die Befehlszeile ist leer!</target> +<source>Could not initialize directory monitoring:</source> +<target>Die Verzeichnisüberwachung konnte nicht gestartet werden:</target> +<source>A directory input field is empty.</source> +<target>Ein Verzeichniseingabefeld ist leer.</target> +<source>Error when monitoring directories.</source> +<target>Fehler beim Ãœberwachen der Verzeichnisse.</target> +<source>Drag && drop</source> +<target>Drag && Drop</target> +<source>Conversion error:</source> +<target>Fehler bei Konvertierung:</target> +<source>Error moving file:</source> +<target>Fehler beim Verschieben der Datei:</target> +<source>Operation aborted!</source> +<target>Vorgang abgebrochen!</target> +<source>Target file already existing!</source> +<target>Die Zieldatei existiert bereits!</target> +<source>Error moving directory:</source> +<target>Fehler beim Verschieben des Verzeichnisses:</target> +<source>Target directory already existing!</source> +<target>Zielverzeichnis existiert bereits!</target> +<source>Error deleting directory:</source> +<target>Fehler beim Löschen des Verzeichnisses:</target> +<source>Error changing modification time:</source> +<target>Fehler beim Setzen der Dateiänderungszeit:</target> +<source>Error loading library function:</source> +<target>Fehler beim Laden der Bibliotheksfunktion:</target> +<source>Error reading security context:</source> +<target>Fehler beim Lesen des Sicherheitskontextes:</target> +<source>Error writing security context:</source> +<target>Fehler beim Schreiben des Sicherheitskontextes:</target> +<source>Error copying file permissions:</source> +<target>Fehler beim Kopieren der Dateiberechtigungen:</target> +<source>Error creating directory:</source> +<target>Fehler beim Erstellen des Verzeichnisses:</target> +<source>Error copying symbolic link:</source> +<target>Fehler beim Kopieren des Symbolischen Links:</target> +<source>Error copying file:</source> +<target>Fehler beim Kopieren der Datei:</target> +<source>Error opening file:</source> +<target>Fehler beim Öffnen der Datei:</target> +<source>Error reading file:</source> +<target>Fehler beim Lesen der Datei:</target> +<source>Endless loop when traversing directory:</source> +<target>Endlosschleife beim Lesen des Verzeichnisses:</target> +<source>Error traversing directory:</source> +<target>Fehler beim Durchsuchen des Verzeichnisses:</target> +<source>Error setting privilege:</source> +<target>Fehler beim Setzen des Privilegs:</target> +<source>Error moving to Recycle Bin:</source> +<target>Fehler beim Verschieben in den Papierkorb:</target> +<source>Could not load a required DLL:</source> +<target>Eine benötigte DLL konnte nicht geladen werden:</target> +<source>Error writing to synchronization database:</source> +<target>Fehler beim Schreiben der Synchronisationsdatenbank:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Fehler beim Starten des Volumenschattenkopie-Dienstes!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version.</target> +<source>Could not determine volume name for file:</source> +<target>Der Laufwerksname für folgende Datei konnte nicht ermittelt werden:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Laufwerksname %x ist kein Teil des Dateinamens %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Die folgenden XML Knoten konnten nicht gelesen werden:</target> +<source>Show popup</source> +<target>Popup zeigen</target> +<source>Show popup on errors or warnings</source> +<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target> +<source>Ignore errors</source> +<target>Fehler ignorieren</target> +<source>Hide all error and warning messages</source> +<target>Alle Fehler- und Warnmeldungen unterdrücken</target> +<source>Exit instantly</source> +<target>Sofort beenden</target> +<source>Abort synchronization immediately</source> +<target>Synchronisation sofort abbrechen</target> +<source>Logging</source> +<target>Protokoll</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync Batchdatei</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync Konfiguration</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Batch-Job</target> +<source>Unable to create logfile!</source> +<target>Die Protokolldatei konnte nicht erstellt werden!</target> +<source>Batch execution</source> +<target>Batchlauf</target> +<source>Log-messages:</source> +<target>Meldungen:</target> +<source>Stop</source> +<target>Stop</target> +<source>Total time:</source> +<target>Gesamtzeit:</target> +<source>Synchronization aborted!</source> +<target>Synchronisation abgebrochen!</target> +<source>Synchronization completed with errors!</source> +<target>Synchronisation mit Fehlern abgeschlossen!</target> +<source>Synchronization completed successfully!</source> +<target>Synchronisation erfolgreich abgeschlossen!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>"Wechseln" öffnet FreeFileSync in der graphischen Ansicht.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Wechsle in die graphische Ansicht...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Es konnte keine Verbindung zu sourceforge.net aufgebaut werden!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Eine neuere Version von FreeFileSync ist verfügbar:</target> +<source>Download now?</source> +<target>Jetzt herunterladen?</target> +<source>Information</source> +<target>Information</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync ist auf dem neuesten Stand!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen?</target> +<source>(Requires an Internet connection!)</source> +<target>(Eine Internetverbindung wird benötigt!)</target> +<source>1. &Compare</source> +<target>1. &Vergleichen</target> +<source>2. &Synchronize...</source> +<target>2. &Synchronisieren...</target> +<source>S&witch view</source> +<target>Ansicht &wechseln</target> +<source>&New</source> +<target>&Neu</target> +<source>&Program</source> +<target>&Programm</target> +<source>&Language</source> +<target>&Sprache</target> +<source>&Global settings...</source> +<target>&Globale Einstellungen...</target> +<source>&Create batch job...</source> +<target>&Batch-Job erstellen...</target> +<source>&Export file list...</source> +<target>Dateiliste e&xportieren...</target> +<source>&Advanced</source> +<target>&Erweitert</target> +<source>&Check for new version</source> +<target>&Auf neuere Version prüfen</target> +<source>Compare</source> +<target>Vergleichen</target> +<source>Compare both sides</source> +<target>Beide Seiten vergleichen</target> +<source>&Abort</source> +<target>&Abbrechen</target> +<source>Synchronize...</source> +<target>Synchronisieren</target> +<source>Start synchronization</source> +<target>Synchronisation starten</target> +<source>Swap sides</source> +<target>Seiten vertauschen</target> +<source>Add folder pair</source> +<target>Verzeichnispaar hinzufügen</target> +<source>Remove folder pair</source> +<target>Verzeichnispaar entfernen</target> +<source>Save current configuration to file</source> +<target>Aktuelle Konfiguration in Datei speichern</target> +<source>Load configuration from file</source> +<target>Konfiguration aus Datei laden</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target> +<source>Hide excluded items</source> +<target>Ausgeschlossene Elemente verstecken</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Gefilterte oder temporär ausgeschlossene Dateien ausblenden</target> +<source>Number of files and directories that will be created</source> +<target>Anzahl der zu erstellenden Dateien und Verzeichnisse</target> +<source>Number of files that will be overwritten</source> +<target>Anzahl der zu überschreibenden Dateien</target> +<source>Number of files and directories that will be deleted</source> +<target>Anzahl der zu löschenden Dateien und Verzeichnisse</target> +<source>Total amount of data that will be transferred</source> +<target>Gesamtmenge der zu übertragenden Daten</target> +<source>Left</source> +<target>Links</target> +<source>Right</source> +<target>Rechts</target> +<source>Batch job</source> +<target>Batch-Job</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batch-Modus zu starten, muss nur der Dateiname an die Programmdatei übergeben werden: FreeFileSync.exe <Batchdatei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.</target> +<source>Help</source> +<target>Hilfe</target> +<source>Configuration overview:</source> +<target>Konfigurationsübersicht:</target> +<source>Filter files</source> +<target>Dateien filtern</target> +<source>Status feedback</source> +<target>Statusrückmeldung</target> +<source>Silent mode</source> +<target>Stiller Modus</target> +<source>Start minimized and write status information to a logfile</source> +<target>Minimiert starten und Statusinformationen in eine Logdatei schreiben</target> +<source>Error handling</source> +<target>Fehlerbehandlung</target> +<source>Overview</source> +<target>Ãœbersicht</target> +<source>Select logfile directory:</source> +<target>Verzeichnis für Logdatei wählen:</target> +<source>Maximum number of logfiles:</source> +<target>Maximale Anzahl an Logdateien:</target> +<source>&Save</source> +<target>&Speichern</target> +<source>&Load</source> +<target>&Laden</target> +<source>&Cancel</source> +<target>&Abbrechen</target> +<source>Elements found:</source> +<target>Gefundene Elemente:</target> +<source>Elements remaining:</source> +<target>Verbleibende Elemente:</target> +<source>Speed:</source> +<target>Geschwindigkeit:</target> +<source>Time remaining:</source> +<target>Verbleibende Zeit:</target> +<source>Time elapsed:</source> +<target>Vergangene Zeit:</target> +<source>Operation:</source> +<target>Vorgang:</target> +<source>Select variant:</source> +<target>Variante auswählen:</target> +<source><Automatic></source> +<target><Automatik></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt.</target> +<source>Mirror ->></source> +<target>Spiegeln ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Spiegelkopie des linken Verzeichnisses erstellen. Das rechte Verzeichnis wird dem linken exakt angeglichen.</target> +<source>Update -></source> +<target>Aktualisieren -></target> +<source>Copy new or updated files to right folder.</source> +<target>Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren.</target> +<source>Custom</source> +<target>Eigene</target> +<source>Configure your own synchronization rules.</source> +<target>Eigene Synchronisationsregeln definieren.</target> +<source>Deletion handling</source> +<target>Behandlung von Löschungen</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Konfiguration</target> +<source>Category</source> +<target>Kategorie</target> +<source>Action</source> +<target>Aktion</target> +<source>Files/folders that exist on left side only</source> +<target>Nur links exisitierende Dateien/Verzeichnisse</target> +<source>Files/folders that exist on right side only</source> +<target>Nur rechts exisitierende Dateien/Verzeichnisse</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Auf beiden Seiten existierende Dateien; linke Datei ist neuer</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Auf beiden Seiten existierende Dateien; rechte Datei ist neuer</target> +<source>Files that have different content</source> +<target>Dateien mit verschiedenem Inhalt</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Konflikte/Dateien, die nicht eingeordnet werden können</target> +<source>Compare by...</source> +<target>Vergleichen nach...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Dateien gelten als gleich, wenn + - die Größe + - Datum und Uhrzeit der letzten Änderung +gleich sind +</target> +<source>File size and date</source> +<target>Dateigröße und -datum</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Dateien gelten als gleich, wenn + - der Inhalt +gleich ist +</target> +<source>File content</source> +<target>Dateiinhalt</target> +<source>Symbolic Link handling</source> +<target>Behandlung Symbolischer Links</target> +<source>Synchronizing...</source> +<target>Synchronisiere...</target> +<source>Elements processed:</source> +<target>Verarbeitete Elemente:</target> +<source>&Pause</source> +<target>&Pause</target> +<source>Compare by "File size and date"</source> +<target>Vergleich nach "Dateigröße und -datum"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Wenn der Vergleich mit dieser Option gestartet wurde, wird folgender Entscheidungsbaum abgearbeitet:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Das Ergebnis ist eine Aufteilung in folgende Kategorien:</target> +<source>- equal</source> +<target>- gleich</target> +<source>- left newer</source> +<target>- links neuer</target> +<source>- right newer</source> +<target>- rechts neuer</target> +<source>- exists left only</source> +<target>- existiert nur links</target> +<source>- exists right only</source> +<target>- existiert nur rechts</target> +<source>- conflict (same date, different size)</source> +<target>- Konflikt (gleiches Datum, unterschiedliche Größe)</target> +<source>Compare by "File content"</source> +<target>Vergleich nach "Dateiinhalt"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt. + +Der Entscheidungsbaum ist in diesem Fall kleiner: +</target> +<source>- different</source> +<target>- verschieden</target> +<source>Source code written in C++ utilizing:</source> +<target>Sourcecode in C++ geschrieben mit Hilfe von:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Vielen Dank für die Lokalisation von FreeFileSync an:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Feedback und Vorschläge sind willkommen unter:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync auf Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>FFS unterstützen</target> +<source>Donate with PayPal</source> +<target>Mit PayPal spenden</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Ãœbersetzungsfehler melden</target> +<source>Published under the GNU General Public License:</source> +<target>Veröffentlicht unter der GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Nachfolgende Fehler ignorieren</target> +<source>Hide further error messages during the current process</source> +<target>Weitere Fehlermeldungen während des laufenden Prozesses ausblenden</target> +<source>&Ignore</source> +<target>&Ignorieren</target> +<source>&Retry</source> +<target>&Wiederholen</target> +<source>Do not show this dialog again</source> +<target>Diesen Dialog nicht mehr anzeigen</target> +<source>&Switch</source> +<target>&Wechseln</target> +<source>&Yes</source> +<target>&Ja</target> +<source>&No</source> +<target>&Nein</target> +<source>Delete on both sides</source> +<target>Auf beiden Seiten löschen</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist</target> +<source>Use Recycle Bin</source> +<target>Papierkorb verwenden</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Für die Synchronisation werden nur Dateien/Verzeichnisse berücksichtigt, die zu allen Filtereinstellungen passen. +Achtung: Der Namensfilter muss relativ zu den Hauptsynchronisationsverzeichnissen eingegeben werden. +</target> +<source>Hints:</source> +<target>Tipps:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Relative Datei- oder Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Die Platzhalter '*' und '?' werden unterstützt.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Dateien können direkt über das Kontextmenü im Hauptfenster ausgeschlossen werden.</target> +<source>Example</source> +<target>Beispiel</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Einschließen: *.doc;*.zip;*.exe +Ausschließen: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Alle .doc, .zip und .exe Dateien mit Ausnahme des Unterordners "temp" werden synchronisiert.</target> +<source>Include</source> +<target>Einschließen</target> +<source>Exclude</source> +<target>Ausschließen</target> +<source>Select time span:</source> +<target>Zeitspanne auswählen:</target> +<source>Minimum file size:</source> +<target>Minimale Dateigröße:</target> +<source>Maximum file size:</source> +<target>Maximale Dateigröße:</target> +<source>&Default</source> +<target>&Standard</target> +<source>Move column up</source> +<target>Spalte nach oben verschieben</target> +<source>Move column down</source> +<target>Spalte nach unten verschieben</target> +<source>Copy locked files</source> +<target>Gesperrte Dateien kopieren</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopiere gesperrte Dateien mit Hilfe des Volumenschattenkopie-Dienstes +(Benötigt Administratorrechte) +</target> +<source>Copy filesystem permissions</source> +<target>Dateisystemberechtigungen kopieren</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Ãœbertrage Datei- und Verzeichnisberechtigungen +(Benötigt Administratorrechte) +</target> +<source>Hidden dialogs:</source> +<target>Versteckte Dialoge:</target> +<source>Reset</source> +<target>Zurücksetzen</target> +<source>Show hidden dialogs</source> +<target>Zeige versteckte Dialoge</target> +<source>External applications</source> +<target>Externe Anwendungen</target> +<source>Description</source> +<target>Beschreibung</target> +<source>Variant</source> +<target>Variante</target> +<source>Statistics</source> +<target>Statistiken</target> +<source>Find what:</source> +<target>Suchen nach:</target> +<source>Match case</source> +<target>Groß-/Kleinschreibung</target> +<source>&Find next</source> +<target>&Weitersuchen</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)!</target> +<source>Batch file created successfully!</source> +<target>Batchdatei wurde erfolgreich erstellt!</target> +<source>Main bar</source> +<target>Hauptleiste</target> +<source>Folder pairs</source> +<target>Verzeichnispaare</target> +<source>Select view</source> +<target>Ansicht auswählen</target> +<source>Folder Comparison and Synchronization</source> +<target>Verzeichnisvergleich und Synchronisation</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Der Papierkorb wird für dieses System noch nicht unterstützt!</target> +<source>Set direction:</source> +<target>Setze Richtung:</target> +<source>Exclude temporarily</source> +<target>Temporär ausschließen</target> +<source>Include temporarily</source> +<target>Temporär einschließen</target> +<source>Exclude via filter:</source> +<target>Ãœber Filter ausschließen:</target> +<source><multiple selection></source> +<target><Mehrfachauswahl></target> +<source>D-Click</source> +<target>D-Klick</target> +<source>Copy to clipboard CTRL+C</source> +<target>In die Zwischenablage kopieren Strg+C</target> +<source>Delete files DEL</source> +<target>Dateien löschen Entf</target> +<source>Customize...</source> +<target>Anpassen...</target> +<source>Auto-adjust columns</source> +<target>Spalten automatisch ausrichten</target> +<source>Include all rows</source> +<target>Alle Zeilen einschließen</target> +<source>Exclude all rows</source> +<target>Alle Zeilen ausschließen</target> +<source>Reset view</source> +<target>Ansicht zurücksetzen</target> +<source>Show "%x"</source> +<target>Zeige "%x"</target> +<source><Last session></source> +<target><Letzte Sitzung></target> +<source>Configuration saved!</source> +<target>Konfiguration gespeichert!</target> +<source>Save changes to current configuration?</source> +<target>Änderungen der aktuellen Konfiguration sichern?</target> +<source>Configuration loaded!</source> +<target>Konfiguration geladen!</target> +<source>Hide files that exist on left side only</source> +<target>Nur links existierende Dateien ausblenden</target> +<source>Show files that exist on left side only</source> +<target>Nur links existierende Dateien anzeigen</target> +<source>Hide files that exist on right side only</source> +<target>Nur rechts existierende Dateien ausblenden</target> +<source>Show files that exist on right side only</source> +<target>Nur rechts existierende Dateien anzeigen</target> +<source>Hide files that are newer on left</source> +<target>Auf beiden Seiten existierende Dateien ausblenden; linke Datei ist neuer</target> +<source>Show files that are newer on left</source> +<target>Auf beiden Seiten existierende Dateien anzeigen; linke Datei ist neuer</target> +<source>Hide files that are newer on right</source> +<target>Auf beiden Seiten existierende Dateien ausblenden; rechte Datei ist neuer</target> +<source>Show files that are newer on right</source> +<target>Auf beiden Seiten existierende Dateien anzeigen; rechte Datei ist neuer</target> +<source>Hide files that are equal</source> +<target>Gleiche Dateien ausblenden</target> +<source>Show files that are equal</source> +<target>Gleiche Dateien anzeigen</target> +<source>Hide files that are different</source> +<target>Ungleiche Dateien ausblenden</target> +<source>Show files that are different</source> +<target>Ungleiche Dateien anzeigen</target> +<source>Hide conflicts</source> +<target>Konflikte ausblenden</target> +<source>Show conflicts</source> +<target>Konflikte zeigen</target> +<source>Hide files that will be created on the left side</source> +<target>Dateien die links erstellt werden ausblenden</target> +<source>Show files that will be created on the left side</source> +<target>Dateien die links erstellt werden anzeigen</target> +<source>Hide files that will be created on the right side</source> +<target>Dateien die rechts erstellt werden ausblenden</target> +<source>Show files that will be created on the right side</source> +<target>Dateien die rechts erstellt werden anzeigen</target> +<source>Hide files that will be deleted on the left side</source> +<target>Dateien die links gelöscht werden ausblenden</target> +<source>Show files that will be deleted on the left side</source> +<target>Dateien die links gelöscht werden anzeigen</target> +<source>Hide files that will be deleted on the right side</source> +<target>Dateien die rechts gelöscht werden ausblenden</target> +<source>Show files that will be deleted on the right side</source> +<target>Dateien die rechts gelöscht werden anzeigen</target> +<source>Hide files that will be overwritten on left side</source> +<target>Dateien die links überschrieben werden ausblenden</target> +<source>Show files that will be overwritten on left side</source> +<target>Dateien die links überschrieben werden anzeigen</target> +<source>Hide files that will be overwritten on right side</source> +<target>Dateien die rechts überschrieben werden ausblenden</target> +<source>Show files that will be overwritten on right side</source> +<target>Dateien die rechts überschrieben werden anzeigen</target> +<source>Hide files that won't be copied</source> +<target>Dateien die nicht kopiert werden ausblenden</target> +<source>Show files that won't be copied</source> +<target>Dateien die nicht kopiert werden anzeigen</target> +<source>All directories in sync!</source> +<target>Alle Verzeichnisse sind synchron!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Vor der Synchronisation bitte zuerst einen Vergleich ausführen!</target> +<source>Comma separated list</source> +<target>Kommagetrennte Liste</target> +<source>Legend</source> +<target>Legende</target> +<source>File list exported!</source> +<target>Dateiliste exportiert!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Objekt erfolgreich gelöscht!</pluralform> +<pluralform>%x Objekte erfolgreich gelöscht!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 Verzeichnis</pluralform> +<pluralform>%x Verzeichnisse</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 Datei</pluralform> +<pluralform>%x Dateien</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x von 1 Zeile zur Ansicht</pluralform> +<pluralform>%x von %y Zeilen zur Ansicht</pluralform> +</target> +<source>Scanning...</source> +<target>Suche Dateien...</target> +<source>Comparing content...</source> +<target>Vergleiche Dateiinhalt...</target> +<source>Paused</source> +<target>Angehalten</target> +<source>Aborted</source> +<target>Abgebrochen</target> +<source>Completed</source> +<target>Fertig</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...</target> +<source>Continue</source> +<target>Fortfahren</target> +<source>Pause</source> +<target>Pause</target> +<source>Cannot find %x</source> +<target>%x wurde nicht gefunden.</target> +<source>DECISION TREE</source> +<target>ENTSCHEIDUNGSBAUM</target> +<source>file exists on both sides</source> +<target>Datei existiert auf beiden Seiten</target> +<source>on one side only</source> +<target>nur auf einer Seite</target> +<source>same date</source> +<target></target> +<source>different date</source> +<target></target> +<source>Inactive</source> +<target>Inaktiv</target> +<source>Second</source> +<target>Sekunde</target> +<source>Minute</source> +<target>Minute</target> +<source>Hour</source> +<target>Stunde</target> +<source>Day</source> +<target>Tag</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filter: Alle Verzeichnispaare</target> +<source>Filter: Single pair</source> +<target>Filter: Einzelnes Verzeichnispaar</target> +<source>Ignore</source> +<target>Ignorieren</target> +<source>Direct</source> +<target>Direkt</target> +<source>Follow</source> +<target>Folgen</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integriert externe Anwendungen in das Kontextmenu. Die folgenden Makros stehen zur Verfügung:</target> +<source>- full file or directory name</source> +<target>- kompletter Datei oder Verzeichnisname</target> +<source>- directory part only</source> +<target>- nur Verzeichnisanteil</target> +<source>- Other side's counterpart to %name</source> +<target>- Entsprechung der anderen Seite zu %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Entsprechung der anderen Seite zu %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Alle versteckten Dialoge wieder anzeigen?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Soll das folgende Element wirklich in den Papierkorb verschoben werden?</pluralform> +<pluralform>Sollen die folgenden %x Elemente wirklich in den Papierkorb verschoben werden?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Soll das folgende Element wirklich gelöscht werden?</pluralform> +<pluralform>Sollen die folgenden %x Elemente wirklich gelöscht werden?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Als unbehandelten Konflikt belassen</target> +<source>Delete permanently</source> +<target>Endgültig löschen</target> +<source>Delete or overwrite files permanently</source> +<target>Dateien endgültig löschen oder überschreiben</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target> +<source>Versioning</source> +<target>Versionierung</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel</target> +<source>Cannot determine sync-direction:</source> +<target>Die Synchronisationsrichtung konnte nicht bestimmt werden:</target> +<source>Filter settings have changed!</source> +<target>Die Filtereinstellungen wurden geändert!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Beide Seiten wurden seit der letzten Synchronisation verändert!</target> +<source>No change since last synchronization!</source> +<target>Keine Änderungen seit der letzten Synchronisation!</target> +<source>The file was not processed by last synchronization!</source> +<target>Die Datei wurde in der letzten Synchronisation nicht verarbeitet!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Das geplante Löschen des Verzeichnisses steht in Konflikt mit seinen Unterverzeichnissen und -dateien</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben.</target> +<source>The file does not contain a valid configuration:</source> +<target>Die Datei enthält keine gültige Konfiguration:</target> +<source>Scanning:</source> +<target>Suche Dateien:</target> +<source>Encoding extended time information: %x</source> +<target>Speichere erweiterte Zeitinformation: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Dieser Fehler kann ignoriert werden, um das Verzeichnis als leer anzusehen.</target> +<source>Directory does not exist:</source> +<target>Das Verzeichnis existiert nicht:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen:</target> +<source>Comparing content of files %x</source> +<target>Vergleiche Inhalt der Dateien %x</target> +<source>Memory allocation failed!</source> +<target>Speicherallokation fehlgeschlagen!</target> +<source>File %x has an invalid date!</source> +<target>Die Datei %x hat ein ungültiges Datum!</target> +<source>Conflict detected:</source> +<target>Ein Konflikt wurde erkannt:</target> +<source>Files %x have the same date but a different size!</source> +<target>Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel!</target> +<source>Comparing files by content failed.</source> +<target>Vergleich nach Dateiinhalt ist fehlgeschlagen.</target> +<source>Generating file list...</source> +<target>Erzeuge Dateiliste...</target> +<source>Multiple...</source> +<target>Verschiedene...</target> +<source>Files that are equal on both sides</source> +<target>Auf beiden Seiten gleiche Dateien</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Gleiche Dateien/Verzeichnisse mit unterschiedlichen Attributen</target> +<source>Copy from right to left</source> +<target>Von rechts nach links kopieren</target> +<source>Copy from left to right</source> +<target>Von links nach rechts kopieren</target> +<source>Delete files/folders existing on left side only</source> +<target>Nur links existierende Dateien/Verzeichnisse löschen</target> +<source>Delete files/folders existing on right side only</source> +<target>Nur rechts existierende Dateien/Verzeichnisse löschen</target> +<source>Copy from right to left overwriting</source> +<target>Von rechts nach links kopieren und überschreiben</target> +<source>Copy from left to right overwriting</source> +<target>Von links nach rechts kopieren und überschreiben</target> +<source>Do nothing</source> +<target>Nichts tun</target> +<source>Copy attributes only from right to left</source> +<target>Nur Attribute von rechts nach links kopieren</target> +<source>Copy attributes only from left to right</source> +<target>Nur Attribute von links nach rechts kopieren</target> +<source>Deleting file %x</source> +<target>Lösche Datei %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Lösche Symbolischen Link %x</target> +<source>Deleting folder %x</source> +<target>Lösche Verzeichnis %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Verschiebe %x in den Papierkorb</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Verschiebe Ordner %x in benutzerdefiniertes Verzeichnis %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y</target> +<source>Copying new file %x to %y</source> +<target>Kopiere neue Datei %x nach %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopiere neuen Symbolischen Link %x nach %y</target> +<source>Overwriting file %x in %y</source> +<target>Ãœberschreibe Datei %x in %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Ãœberschreibe Symbolischen Link %x in %y</target> +<source>Creating folder %x</source> +<target>Erstelle Verzeichnis %x</target> +<source>Verifying file %x</source> +<target>Verifiziere Datei %x</target> +<source>Updating attributes of %x</source> +<target>Aktualisiere Attribute von %x</target> +<source>Source directory does not exist anymore:</source> +<target>Quellverzeichnis existiert nicht mehr:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Nichts zu synchronisieren gemäß den aktuellen Einstellungen!</target> +<source>Target directory name must not be empty!</source> +<target>Der Zielverzeichnisname darf nicht leer sein!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Kein benutzerdefiniertes Verzeichnis zum Löschen angegeben!</target> +<source>Unresolved conflicts existing!</source> +<target>Es existieren ungelöste Konflikte!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden.</target> +<source>Significant difference detected:</source> +<target>Ein erheblicher Unterschied wurde festgestellt:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Mehr als 50% aller Dateien werden kopiert oder gelöscht!</target> +<source>Not enough free disk space available in:</source> +<target>Nicht genügend freier Speicher verfügbar unter:</target> +<source>Free disk space required:</source> +<target>Benötigter freier Speicherplatz:</target> +<source>Free disk space available:</source> +<target>Verfügbarer freier Speicherplatz:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Es wird ein Verzeichnis verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte die Synchronisationseinstellungen prüfen!</target> +<source>Processing folder pair:</source> +<target>Bearbeite Verzeichnispaar:</target> +<source>Generating database...</source> +<target>Erzeuge Synchronisationsdatenbank...</target> +<source>Error copying locked file %x!</source> +<target>Fehler beim Kopieren der gesperrten Datei %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt!</target> diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng index 70483147..70fbe807 100644 --- a/BUILD/Languages/greek.lng +++ b/BUILD/Languages/greek.lng @@ -1,910 +1,1055 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objets supprimés avec succès -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x ημÎÏα/ες -%x directories -%x υποκατάλογοι -%x files -%x αÏχεία -%x hour(s) -%x ÏŽÏα/ες -%x kB -%x kB -%x min -%x λεπτό/ά -%x of %y rows in view -%x από τις %y φανεÏÎÏ‚ γÏαμμÎÏ‚ -%x of 1 row in view -%x από τη 1 φανεÏή γÏαμμή -%x sec -%x δ/λεπτα -%x% -%x% -&Abort -&ΆκυÏο -&About... -&Σχετικά... -&Advanced -&Για Ï€ÏοχωÏημÎνους -&Cancel -&ΆκυÏο -&Check for new version -&Έλεγχος για νÎα Îκδοση -&Content -&ΠεÏιεχόμενα -&Create batch job... -&ΔημιουÏγία μιας δÎσμης ενεÏγειών... -&Default -&Î Ïοεπιλογή -&Exit -&Έξοδος -&Export file list... -&Εξαγωγή καταλόγου αÏχείων... -&File -&ΑÏχείο -&Find next -&ΕÏÏεση επομÎνου -&Global settings... -&ΓενικÎÏ‚ Ïυθμίσεις... -&Help -&Βοήθεια -&Ignore -&ΠαÏάβλεψη -&Language -&Γλώσσα -&Load -&Άνοιγμα -&Load configuration... -&Άνοιγμα διάταξης... -&New -&ΔημιουÏγία -&No -&Όχι -&OK -&OK -&Pause -&ΠαÏση -&Program -&Î ÏόγÏαμμα -&Quit -&Έξοδος -&Restore -&ΕπαναφοÏά -&Retry -&Επανάληψη -&Save -&Αποθήκευση -&Switch -&Εναλλαγή -&Yes -&Îαι -(Build: %x) -(ΔημιουÏγήθηκε : %x) -(Requires an Internet connection!) -(Απαιτεί σÏνδεση με το Internet) -- Other side's counterpart to %dir -- Ο αντίστοιχος %dir της άλλης πλευÏάς -- Other side's counterpart to %name -- Το αντίστοιχο %name της άλλης πλευÏάς -- conflict -- διÎνεξη -- conflict (same date, different size) -- διÎνεξη (ίδια ημεÏομηνία, διαφοÏετικό μÎγεθος) -- different -- διαφοÏετικά -- directory part only -- μόνο τους υποκαταλόγους -- equal -- ίδια -- exists left only -- υπάÏχει μόνο στα αÏιστεÏά -- exists right only -- υπάÏχει μόνο στα δεξιά -- full file or directory name -- πλήÏες όνομα του αÏχείου ή υποκαταλόγου -- left -- αÏιστεÏά -- left newer -- αÏιστεÏά πιο Ï€Ïόσφατο -- right -- δεξιά -- right newer -- δεξιά πιο Ï€Ïόσφατο -/sec -/δευτεÏόλεπτο -1 directory -1 υποκατάλογος -1 file -1 αÏχείο -1. &Compare -1. &ΣÏγκÏιση -1. Enter relative file or directory names separated by ';' or a new line. -1. Εισάγετε τα σχετικά ονόματα των αÏχείων ή των υποκαταλόγων χωÏισμÎνα με ';' ή με αλλαγή γÏαμμής. -1. Select directories to monitor. -1. ΕπιλÎξτε τους υποκαταλόγους που θα παÏακολουθοÏνται. -2. &Synchronize... -2. &ΣυγχÏονισμός... -2. Enter a command line. -2. Εισάγετε μια γÏαμμή εντολών. -2. Use wildcard characters '*' and '?'. -2. ΜποÏείτε να χÏησιμοποιήσετε τους χαÏακτήÏες-μπαλαντÎÏ '*' και '?'. -3. Exclude files directly on main grid via context menu. -3. ΜποÏείτε να εξαιÏÎσετε αÏχεία στη βασική οθόνη κάνοντας δεξί κλικ. -3. Press 'Start'. -3. Πατήστε το 'ΈναÏξη'. -<Automatic> -<Αυτόματα> -<Directory> -<Υποκατάλογος> -<Last session> -<Τελευταία χÏήση> -<Symlink> -<Συμβολικός δεσμός> -<multiple selection> -<πολλαπλή επιλογή> -A directory input field is empty. -Ένα πεδίο εισόδου είναι κενό. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Θα Ï„Ïοποποιηθεί Îνας υποκατάλογος που ανήκει σε πολλαπλά ζεÏγη υποκαταλόγων! ΠαÏακαλώ αναθεωÏείστε τις Ïυθμίσεις συγχÏονισμοÏ. -A newer version of FreeFileSync is available: -Μια νεότεÏη Îκδοση του FreeFileSync είναι διαθÎσιμη: -Abort requested: Waiting for current operation to finish... -Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„ÏÎχουσας εÏγασίας... -Abort synchronization immediately -Άμεση ματαίωση του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï -Aborted -Ματαιώθηκε -About -Σχετικά με -Action -ΕνÎÏγεια -Add folder -Î Ïοσθήκη υποκαταλόγου -Add folder pair -Î Ïοσθήκη ζεÏγους υποκαταλόγων -All directories in sync! -Όλοι οι υποκατάλογοι είναι συγχÏονισμÎνοι! -An exception occurred! -ΠαÏουσιάστηκε σφάλμα! -As a result the files are separated into the following categories: -Ως αποτÎλεσμα, τα αÏχεία χωÏίζονται στις εξής κατηγοÏίες: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Όπως λÎει και ο τίτλος, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια μόνο και μόνον εάν Îχουν το ίδιο πεÏιεχόμενο. Αυτή η επιλογή είναι χÏήσιμη για Îλεγχο αξιοπιστίας παÏά για αντίγÏαφα ασφαλείας. ΕπομÎνως οι ημεÏομηνίες των αÏχείων δε λαμβάνονται υπόψη καθόλου.\n\nΜε αυτήν την επιλογή το δÎνδÏο απόφασης είναι μικÏότεÏο: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -ΔημιουÏγία ενός αÏχείου δÎσμης ενεÏγειών για αυτόματο συγχÏονισμό. Για την ÎναÏξη σε λειτουÏγία δÎσμης, δώστε το όνομα του αÏχείου στο εκτελÎσιμο του FreeFileSync: FreeFileSync.exe <αÏχείο δÎσμης>. Αυτή η λειτουÏγία μποÏεί να Ï€ÏογÏαμματιστεί και στο χÏονοδιάγÏαμμα εÏγασιών του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ συστήματος. -At least one directory input field is empty. -Τουλάχιστον Îνα από πεδία εισόδου είναι κενό. -Auto-adjust columns -Αυτόματη Ï€ÏοσαÏμογή των στηλών -Batch execution -ΕκτÎλεση δÎσμης ενεÏγειών -Batch file created successfully! -Το αÏχείο δÎσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς! -Batch job -ΔÎσμη ενεÏγειών -Big thanks for localizing FreeFileSync goes out to: -Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους: -Both sides have changed since last synchronization! -Και οι δυο πλευÏÎÏ‚ Îχουν αλλάξει από τον τελευταίο συγχÏονισμό! -Browse -Αναζήτηση -Browse directory -Αναζήτηση υποκαταλόγου -Cannot determine sync-direction: -Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ: -Cannot find %x -Δεν μποÏεί να βÏεθεί το %x -Category -ΚατηγοÏία -Clear filter settings -ΔιαγÏαφή όλων των επιλογών φίλτÏου -Comma separated list -Κατάλογος οÏιοθετημÎνος με κόμματα -Command line -ΓÏαμμή εντολών -Command line is empty! -Η γÏαμμή εντολών είναι κενή! -Compare -ΣÏγκÏιση -Compare both sides -ΣÏγκÏιση των δÏο πλευÏών -Compare by \"File content\" -ΣÏγκÏιση με βάση το \"ΠεÏιεχόμενο αÏχείων\" -Compare by \"File size and date\" -ΣÏγκÏιση με βάση το \"ÎœÎγεθος και ΗμεÏομηνία αÏχείων\" -Compare by... -ΣÏγκÏιση με βάση το... -Comparing content of files %x -ΣÏγκÏιση του πεÏιεχομÎνου των αÏχείων %x -Comparing content... -ΣÏγκÏιση του πεÏιεχομÎνου... -Comparing files by content failed. -Η σÏγκÏιση του πεÏιεχομÎνου των αÏχείων απÎτυχε. -Comparison Result -ΑποτÎλεσμα της σÏγκÏισης -Comparison settings -Ρυθμίσεις σÏγκÏισης -Completed -ΟλοκληÏώθηκε -Configuration -Διάταξη -Configuration loaded! -Η διάταξη Îχει ανοιχθεί! -Configuration overview: -ΣÏνοψη της διάταξης: -Configuration saved! -Η διάταξη αποθηκεÏτηκε! -Configure filter -ΡÏθμιση του φίλτÏου -Configure your own synchronization rules. -ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ. -Confirm -Επιβεβαίωση -Conflict detected: -ΑνιχνεÏθηκε διÎνεξη: -Conflicts/files that cannot be categorized -ΔιενÎξεις/αÏχεία που δεν μποÏοÏν να κατηγοÏιοποιηθοÏν -Continue -ΣυνÎχεια -Conversion error: -Σφάλμα μετατÏοπής: -Copy attributes only from left to right -ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα αÏιστεÏά Ï€Ïος τα δεξιά -Copy attributes only from right to left -ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα δεξιά Ï€Ïος τα αÏιστεÏά -Copy filesystem permissions -ΑντιγÏαφή των αδειών των αÏχείων -Copy from left to right -ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά -Copy from left to right overwriting -ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά με αντικατάσταση -Copy from right to left -ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά -Copy from right to left overwriting -ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά με αντικατάσταση -Copy locked files -ΑντιγÏαφή κλειδωμÎνων αÏχείων -Copy new or updated files to right folder. -ΑντιγÏαφή των νÎων ή πιο Ï€Ïόσφατων αÏχείων στον υποκατάλογο δεξιά. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -ΑντιγÏαφή κλειδωμÎνων ή διαμοιÏασμÎνων αÏχείων με την υπηÏεσία Volume Shadow Copy\n(απαιτεί δικαιώματα Administrator) -Copy to clipboard\tCTRL+C -ΑντιγÏαφή στο Ï€ÏόχειÏο\tCTRL+C -Copying new Symbolic Link %x to %y -ΑντιγÏαφή του νÎου Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y -Copying new file %x to %y -ΑντιγÏαφή του νÎου αÏχείου %x στο %y -Could not determine volume name for file: -Δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί το όνομα τόμου για το αÏχείο: -Could not initialize directory monitoring: -Δεν ήταν δυνατό να γίνει ÎναÏξη παÏακολοÏθησης του υποκαταλόγου: -Could not load a required DLL: -Δεν φοÏτώθηκε μια απαιτοÏμενη βιβλιοθήκη DLL: -Could not read values for the following XML nodes: -Δεν αναγνώστηκαν τιμÎÏ‚ για τους ακόλουθους κόμβους XML: -Create a batch job -ΔημιουÏγία μιας δÎσμης ενεÏγειών -Creating folder %x -ΔημιουÏγία του υποκαταλόγου %x -Custom -Εξατομίκευση -Customize columns -Εξατομίκευση στηλών -Customize... -Εξατομίκευση... -D-Click -Διπλό κλικ -DECISION TREE -ΔΕÎΔΡΟ ΑΠΟΦΑΣΗΣ -Data verification error: Source and target file have different content! -Σφάλμα επικÏÏωσης δεδομÎνων: Τα αÏχεία Ï€ÏοÎλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Îχουν διαφοÏετικό πεÏιεχόμενο! -Date -ΗμεÏομηνία -Delete files/folders existing on left side only -ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα αÏιστεÏά -Delete files/folders existing on right side only -ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα δεξιά -Delete files\tDEL -ΔιαγÏαφή αÏχείων\tDEL -Delete on both sides -ΔιαγÏαφή και στις δυο πλευÏÎÏ‚ -Delete on both sides even if the file is selected on one side only -ΔιαγÏαφή και στις δυο πλευÏÎÏ‚, ακόμα κι αν το αÏχείο Îχει επιλεχθεί μόνο στη μια πλευÏά -Delete or overwrite files permanently -Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων -Delete permanently -Μόνιμη διαγÏαφή -Deleting Symbolic Link %x -ΔιαγÏαφή του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x -Deleting file %x -ΔιαγÏαφή του αÏχείου %x -Deleting folder %x -ΔιαγÏαφή του υποκαταλόγου %x -Deletion handling -ΔιαχείÏιση των διαγÏαφών -Description -ΠεÏιγÏαφή -Direct -Ως δεσμό -Directories are dependent! Be careful when setting up synchronization rules: -Οι υποκατάλογοι είναι εξαÏτώμενοι. Î Ïοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ: -Directories to watch -Υποκατάλογοι για παÏακολοÏθηση -Directory -Υποκατάλογος -Directory does not exist: -Ο υποκατάλογος δεν υπάÏχει: -Do not show this dialog again -Îα μην εμφανιστεί ξανά αυτό το μήνυμα -Do nothing -Καμία ενÎÏγεια -Do you really want to delete the following object(s)? -Είστε σίγουÏοι ότι θÎλετε να διαγÏάψετε τα ακόλουθα στοιχεία; -Do you really want to move the following object(s) to the Recycle Bin? -Είστε σίγουÏοι ότι θÎλετε να μεταφÎÏετε τα ακόλουθα στοιχεία στον Κάδο ΑνακÏκλωσης; -Do you want FreeFileSync to automatically check for updates every week? -ΘÎλετε το FreeFileSync να ελÎγχει αυτόματα για ενημεÏώσεις κάθε εβδομάδα; -Donate with PayPal -Κάντε μια δωÏεά μÎσω PayPal -Download now? -Λήψη Ï„ÏŽÏα; -Drag && drop -ΜεταφοÏά && Απόθεση -Elements found: -Î’ÏÎθηκαν στοιχεία: -Elements processed: -ΕπεξεÏγάστηκαν στοιχεία: -Elements remaining: -ΠεÏισσεÏουν στοιχεία: -Email -Email -Encoding extended time information: %x -Κωδικοποίηση εκτεταμÎνων πληÏοφοÏιών για την ÏŽÏα: %x -Endless loop when traversing directory: -ΑτÎÏμονος βÏόχος κατά την την ανάλυση του υποκαταλόγου: -Equal files/folders that differ in attributes only -Ίδια αÏχεία/υποκατάλογοι που διαφÎÏουν μόνο στα χαÏακτηÏιστικά αÏχείου -Error -Σφάλμα -Error changing modification time: -Σφάλμα κατά την αλλαγή της ÏŽÏας Ï„Ïοποποίησης: -Error copying file permissions: -Σφάλμα κατά την αντιγÏαφή των αδειών των αÏχείων: -Error copying file: -Σφάλμα κατά την αντιγÏαφή του αÏχείου: -Error copying locked file %x! -Σφάλμα κατά την αντιγÏαφή του κλειδωμÎνου αÏχείου %x ! -Error copying symbolic link: -Σφάλμα κατά την αντιγÏαφή του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï: -Error creating directory: -Σφάλμα κατά τη δημιουÏγία του υποκαταλόγου: -Error deleting directory: -Σφάλμα κατά τη διαγÏαφή του υποκαταλόγου: -Error deleting file: -Σφάλμα κατά τη διαγÏαφή του αÏχείου: -Error handling -ΔιαχείÏιση σφαλμάτων -Error loading library function: -Σφάλμα κατά τη φόÏτωση της συνάÏτησης βιβλιοθήκης: -Error moving directory: -Σφάλμα κατά τη μεταφοÏά του υποκαταλόγου: -Error moving file: -Σφάλμα κατά τη μεταφοÏά του αÏχείου: -Error moving to Recycle Bin: -Σφάλμα κατά τη μεταφοÏά στον Κάδο ΑνακÏκλωσης: -Error opening file: -Σφάλμα κατά το άνοιγμα του αÏχείου: -Error parsing configuration file: -Σφάλμα κατά την ανάλυση του αÏχείου διάταξης: -Error reading file attributes: -Σφάλμα κατά την ανάγνωση των χαÏακτηÏιστικών του αÏχείου: -Error reading file: -Σφάλμα κατά την ανάγνωση του αÏχείου: -Error reading from synchronization database: -Σφάλμα κατά την ανάγνωση από τη βάση δεδομÎνων συγχÏονισμοÏ: -Error reading security context: -Σφάλμα κατά την ανάγνωση του πλαισίου ασφαλείας: -Error resolving symbolic link: -Σφάλμα κατά την επίλυση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï: -Error setting directory lock: -Σφάλμα κατά το κλείδωμα του υποκαταλόγου: -Error setting privilege: -Σφάλμα κατά τον οÏισμό δικαιωμάτων: -Error starting Volume Shadow Copy Service! -Σφάλμα κατά την ÎναÏξη της υπηÏεσίας Volume Shadow Copy! -Error traversing directory: -Σφάλμα κατά την ανάλυση του υποκαταλόγου: -Error when monitoring directories. -Σφάλμα κατά την παÏακολοÏθηση υποκαταλόγων. -Error writing file: -Σφάλμα κατά την εγγÏαφή του αÏχείου: -Error writing security context: -Σφάλμα κατά την εγγÏαφή του πλαισίου ασφάλειας: -Error writing to synchronization database: -Σφάλμα κατά την εγγÏαφή στη βάση δεδομÎνων συγχÏονισμοÏ: -Example -ΠαÏάδειγμα -Exclude -ΕξαίÏεση -Exclude all rows -ΕξαίÏεση όλων των γÏαμμών -Exclude temporarily -Î ÏοσωÏινή εξαίÏεση -Exclude via filter: -ΕξαίÏεση με βάση το φίλτÏο: -Exit instantly -Άμεση Îξοδος -Extension -ΕπÎκταση -External applications -ΕξωτεÏικÎÏ‚ εφαÏμογÎÏ‚ -Fatal Error -Σημαντικό Σφάλμα -Feedback and suggestions are welcome at: -Σχόλια και Ï€Ïοτάσεις είναι ευπÏόσδεκτα στα: -File %x has an invalid date! -Το αÏχείο %x δεν Îχει ÎγκυÏη ημεÏομηνία! -File already exists. Overwrite? -Το αÏχείο υπάÏχει ήδη. Îα αντικατασταθεί; -File content -ΠεÏιεχόμενο αÏχείων -File does not exist: -Το αÏχείο δεν υπάÏχει: -File list exported! -Ο κατάλογος των αÏχείων Îχει εξαχθεί! -File size and date -ÎœÎγεθος και ημεÏομηνία αÏχείων -Filename -Όνομα αÏχείου -Files %x have the same date but a different size! -Τα αÏχεία %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μÎγεθος! -Files are found equal if\n - file content\nis the same -Τα αÏχεία θεωÏοÏνται ίδια, εάν\n - το πεÏιεχόμενό τους\nείναι ίδιο. -Files are found equal if\n - filesize\n - last write time and date\nare the same -Τα αÏχεία θεωÏοÏνται ίδια, εάν\n - το μÎγεθός τους\n - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης\nείναι ίδια. -Files that are equal on both sides -ΑÏχεία ίδια και στις δυο πλευÏÎÏ‚ -Files that exist on both sides, left one is newer -ΑÏχεία που υπάÏχουν και στις δυο πλευÏÎÏ‚, αÏιστεÏά είναι πιο Ï€Ïόσφατα -Files that exist on both sides, right one is newer -ΑÏχεία που υπάÏχουν και στις δυο πλευÏÎÏ‚, δεξιά είναι πιο Ï€Ïόσφατα -Files that have different content -ΑÏχεία που Îχουν διαφοÏετικό πεÏιεχόμενο -Files/folders that exist on left side only -ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα αÏιστεÏά -Files/folders that exist on right side only -ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα δεξιά -Filter files -ΦιλτÏάÏισμα -Filter is active -Το φίλτÏο είναι ενεÏγό -Filter settings have changed! -Οι Ïυθμίσεις φίλτÏου Îχουν αλλάξει! -Filter: All pairs -ΦίλτÏο: Όλα τα ζεÏγη -Filter: Single pair -ΦίλτÏο: Ένα ζεÏγος -Find -Αναζήτηση -Find what: -Αναζήτηση του: -Folder Comparison and Synchronization -ΣÏγκÏιση υποκαταλόγων και ΣυγχÏονισμός -Folder pairs -ΖεÏγη υποκαταλόγων -Follow -Ως πεÏιεχόμενο -Free disk space available: -ΔιαθÎσιμος ελεÏθεÏος χώÏος δίσκου: -Free disk space required: -ΑπαιτοÏμενος ελεÏθεÏος χώÏος δίσκου: -FreeFileSync Batch Job -FreeFileSync ΔÎσμη ΕνεÏγειών -FreeFileSync at Sourceforge -Το FreeFileSync στο Sourceforge -FreeFileSync batch file -FreeFileSync αÏχείο δÎσμης -FreeFileSync configuration -ΑÏχείο διάταξης FreeFileSync -FreeFileSync is up to date! -Το FreeFileSync είναι ενημεÏωμÎνο! -Full path -ΠλήÏης διαδÏομή -Generating database... -ΔημιουÏγία βάσης δεδομÎνων... -Generating file list... -ΔημιουÏγία καταλόγου αÏχείων... -Global settings -ΓενικÎÏ‚ Ïυθμίσεις -Help -Βοήθεια -Hidden dialogs: -ΚÏυμμÎνα παÏάθυÏα διαλόγου: -Hide all error and warning messages -ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων -Hide conflicts -ΑπόκÏυψη διενÎξεων -Hide excluded items -ΑπόκÏυψη των εξαιÏεθÎντων στοιχείων -Hide files that are different -ΑπόκÏυψη των αÏχείων που είναι διαφοÏετικά -Hide files that are equal -ΑπόκÏυψη των αÏχείων που είναι ίδια -Hide files that are newer on left -ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά -Hide files that are newer on right -ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά -Hide files that exist on left side only -ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά -Hide files that exist on right side only -ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα δεξιά -Hide files that will be created on the left side -ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά -Hide files that will be created on the right side -ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά -Hide files that will be deleted on the left side -ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά -Hide files that will be deleted on the right side -ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα δεξιά -Hide files that will be overwritten on left side -ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά -Hide files that will be overwritten on right side -ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα δεξιά -Hide files that won't be copied -ΑπόκÏυψη των αÏχείων που δε θα αντιγÏαφοÏν -Hide filtered or temporarily excluded files -ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏÎθηκαν Ï€ÏοσωÏινά -Hide further error messages during the current process -ΑπόκÏυψη επόμενων μηνυμάτων σφάλματος στην Ï„ÏÎχουσα διαδικασία -Hints: -ΣυμβουλÎÏ‚: -Homepage -Ιστοσελίδα -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Ανίχνευση και εφαÏμογή των αλλαγών και στις δυο πλευÏÎÏ‚ με τη χÏήση βάσης δεδομÎνων. ΔιαγÏαφÎÏ‚ και διενÎξεις ανιχνεÏονται αυτόματα. -Idle time between detection of last change and execution of command line in seconds -ΧÏόνος αναμονής Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ ανίχνευσης της τελευταίας αλλαγής και της εκτÎλεσης της γÏαμμής εντολών [δευτεÏόλεπτα] -If you like FFS -Αν σας αÏÎσει το FFS -Ignore -ΠαÏάβλεψη -Ignore errors -ΠαÏάβλεψη των σφαλμάτων -Ignore subsequent errors -ΠαÏάβλεψη των επόμενων σφαλμάτων -Include -ΣυμπεÏίληψη -Include all rows -ΣυμπεÏίληψη όλων των γÏαμμών -Include temporarily -Î ÏοσωÏινή συμπεÏίληψη -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -ΣυμπεÏίληψη: *.doc;*.zip;*.exe\nΕξαίÏεση: \\temp\\* -Incompatible synchronization database format: -Η μοÏφή της βάσης δεδομÎνων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι συμβατή: -Info -ΠληÏοφοÏία -Information -ΠληÏοφοÏία -Initial synchronization: -ΑÏχικός συγχÏονισμός: -Integrate external applications into context menu. The following macros are available: -Ένταξη εξωτεÏικών εφαÏμογών στο Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιβάλλοντος. Οι ακόλουθες μακÏοεντολÎÏ‚ είναι διαθÎσιμες: -Invalid FreeFileSync config file! -Μη ÎγκυÏο αÏχείο διάταξης του FreeFileSync! -Last used configurations (press DEL to remove from list) -Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα) -Leave as unresolved conflict -ΠαÏάβλεψη ως ανεπίλυτη διÎνεξη -Left -ΑÏιστεÏά -Legend -Εξήγηση των συμβόλων για κάθε κατηγοÏία -Load configuration from file -Άνοιγμα διάταξης από αÏχείο -Log-messages: -ΑποθηκευμÎνα μηνÏματα: -Logging -ΚαταγÏαφή μηνυμάτων -Main bar -ΓÏαμμή εÏγαλείων -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Δεν είναι δυνατή η δημιουÏγία σκιώδους αντίγÏαφου σε WOW64. ΧÏησιμοποιείστε την 64-bit Îκδοση του FreeFileSync. -Match case -Αντιστοίχιση πεζών-κεφαλαίων -Maximum number of logfiles: -ÎœÎγιστος αÏιθμός αÏχείων καταγÏαφής: -Memory allocation failed! -Η δÎσμευση χώÏου μνήμης απÎτυχε! -Minimum Idle Time [seconds] -Ελάχιστος ΧÏόνος Αναμονής [δευτεÏόλεπτα] -Mirror ->> -ΚατοπτÏισμός ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -ΚατοπτÏικό αντίγÏαφο του αÏιστεÏÎ¿Ï Ï…Ï€Î¿ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. Ο υποκατάλογος δεξιά θα Ï„Ïοποποιηθεί και θα αντιστοιχεί εξολοκλήÏου στον αÏιστεÏÏŒ μετά το συγχÏονισμό -Monitoring active... -ΕνεÏγή παÏακολοÏθηση... -More than 50% of the total number of files will be copied or deleted! -ΠεÏισσότεÏα από το 50% των αÏχείων θα αντιγÏαφοÏν ή διαγÏαφοÏν! -Move column down -Μετακίνηση της στήλης κάτω -Move column up -Μετακίνηση της στήλης πάνω -Move files into a time-stamped subdirectory -ΜεταφοÏά των αÏχείων σε Îναν υποκατάλογο με Îνδειξη ÏŽÏας -Moving %x to Recycle Bin -ΜεταφοÏά του %x στον Κάδο ΑνακÏκλωσης -Moving Symbolic Link %x to user-defined directory %y -ΜεταφοÏά του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη -Moving file %x to user-defined directory %y -ΜεταφοÏά του αÏχείου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη -Moving folder %x to user-defined directory %y -ΜεταφοÏά του υποκαταλόγου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη -Multiple... -ΠολλαπλÎÏ‚ Ïυθμίσεις... -No change since last synchronization! -Καμία αλλαγή από τον Ï€ÏοηγοÏμενο συγχÏονισμό! -No filter selected -Δεν Îχει επιλεχθεί φίλτÏο -Not enough free disk space available in: -Δεν υπάÏχει αÏκετός διαθÎσιμος χώÏος στο δίσκο: -Nothing to synchronize according to configuration! -Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη! -Number of files and directories that will be created -ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν -Number of files and directories that will be deleted -ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν -Number of files that will be overwritten -ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν -One of the FreeFileSync database entries within the following file is not yet existing: -Μια από τις εγγÏαφÎÏ‚ στη βάση δεδομÎνων του FreeFileSync σχετικά με το ακόλουθο αÏχείο δεν υπάÏχει ακόμη: -One of the FreeFileSync database files is not yet existing: -Μια από τις βάσεις δεδομÎνων του FreeFileSync δεν υπάÏχει ακόμα: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Μόνο όσα αÏχεία/υποκατάλογοι Îχουν πεÏάσει το φίλτÏο θα επιλεχθοÏν για συγχÏονισμό. Το φίλτÏο θα εφαÏμοστεί στο όνομα, πάντα σε σχÎση(!) με τους βασικοÏÏ‚ υποκαταλόγους συγχÏονισμοÏ. -Open with Explorer -Άνοιγμα με την ΕξεÏεÏνηση -Open with default application -Άνοιγμα με την Ï€ÏοεπιλεγμÎνη εφαÏμογή -Operation aborted! -Η λειτουÏγία ματαιώθηκε! -Operation: -ΛειτουÏγία: -Overview -ΣÏνοψη -Overwriting Symbolic Link %x in %y -Αντικατάσταση του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y -Overwriting file %x in %y -Αντικατάσταση του αÏχείου %x στο %y -Pause -ΠαÏση -Paused -Σε παÏση -Planned directory deletion is in conflict with its subdirectories and -files! -Η διαγÏαφή του επιλεγμÎνου καταλόγου είναι σε διÎνεξη με τους υποκαταλόγους και τα -αÏχεία του! -Please run a Compare first before synchronizing! -ΠαÏακαλώ εκτελÎστε Ï€Ïώτα ΣÏγκÏιση Ï€Ïιν το ΣυγχÏονισμό! -Press \"Switch\" to open FreeFileSync GUI mode. -Πατήστε \"Εναλλαγή\" για να ανοίξετε το γÏαφικό πεÏιβάλλον του FreeFileSync -Processing folder pair: -ΣÏγκÏιση του ζεÏγους υποκαταλόγων: -Published under the GNU General Public License: -ΔιανÎμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU: -Question -ΕÏώτηση -RealtimeSync - Automated Synchronization -RealtimeSync - ΑυτοματοποιημÎνος ΣυγχÏονισμός -RealtimeSync configuration -ΔιαμόÏφωση του RealtimeSync -Recycle Bin not yet supported for this system! -Ο Κάδος ΑνακÏκλωσης δεν υποστηÏίζεται σε αυτό το σÏστημα! -Relative path -Σχετική διαδÏομή -Remove alternate settings -ΑπομάκÏυνση των διαφοÏοποιημÎνων Ïυθμίσεων -Remove folder -ΔιαγÏαφή του υποκαταλόγου -Remove folder pair -ΔιαγÏαφή του ζεÏγους υποκαταλόγων -Report translation error -ΑναφÎÏετε λάθη μετάφÏασης -Reset -Επανεμφάνιση -Reset view -ΕπαναφοÏά αÏχικής εμφάνισης -Restore all hidden dialogs? -Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου; -Right -Δεξιά -S&ave configuration... -Α&ποθήκευση διάταξης... -S&witch view -Α&λλαγή εμφάνισης -Save changes to current configuration? -Îα αποθηκευτοÏν οι αλλαγÎÏ‚ στην Ï„ÏÎχουσα διάταξη; -Save current configuration to file -Αποθήκευση της Ï„ÏÎχουσας διάταξης -Scanning... -Ανίχνευση... -Scanning: -Ανίχνευση: -Select a folder -Επιλογή υποκαταλόγου -Select alternate synchronization settings -Επιλογή διαφοÏοποιημÎνων Ïυθμίσεων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï -Select logfile directory: -ΕπιλÎξτε Îναν κατάλογο για το αÏχείο καταγÏαφής: -Select variant: -ΕπιλÎξτε μια μÎθοδο: -Select view -Επιλογή εμφάνισης -Set direction: -Επιλογή κατεÏθυνσης: -Setting default synchronization directions: Old files will be overwritten with newer files. -ΡÏθμιση Ï€ÏοεπιλεγμÎνης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα. -Show \"%x\" -Εμφάνιση της γÏαμμής \"%x\" -Show conflicts -Εμφάνιση διενÎξεων -Show files that are different -Εμφάνιση των αÏχείων που είναι διαφοÏετικά -Show files that are equal -Εμφάνιση των αÏχείων που είναι ίδια -Show files that are newer on left -Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά -Show files that are newer on right -Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά -Show files that exist on left side only -Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά -Show files that exist on right side only -Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα δεξιά -Show files that will be created on the left side -Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά -Show files that will be created on the right side -Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά -Show files that will be deleted on the left side -Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά -Show files that will be deleted on the right side -Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα δεξιά -Show files that will be overwritten on left side -Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά -Show files that will be overwritten on right side -Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά -Show files that won't be copied -Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν -Show hidden dialogs -Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου -Show popup -Εμφάνιση αναδυόμενου παÏάθυÏου -Show popup on errors or warnings -Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις -Significant difference detected: -ΑνιχνεÏθηκαν σημαντικÎÏ‚ διαφοÏÎÏ‚: -Silent mode -Σιωπηλή λειτουÏγία -Size -ÎœÎγεθος -Source code written completely in C++ utilizing: -Ο πηγαίος κώδικας γÏάφτηκε σε C++ με τη χÏήση: -Source directory does not exist anymore: -Ο υποκατάλογος Ï€ÏοÎλευσης δεν υπάÏχει πλÎον: -Speed: -ΤαχÏτητα: -Start -ΈναÏξη -Start minimized and write status information to a logfile -ΈναÏξη σε ελαχιστοποίηση και εγγÏαφή πληÏοφοÏιών κατάστασης σε αÏχείο καταγÏαφής. -Start synchronization -ΈναÏξη του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï -Statistics -Στατιστικά -Status feedback -ΑναφοÏά κατάστασης -Stop -Λήξη -Swap sides -Ανταλλαγή πλευÏών -Switching to FreeFileSync GUI mode... -Εναλλαγή στο γÏαφικό πεÏιβάλλον του FreeFileSync... -Symbolic Link handling -ΤÏόπος διαχείÏισης των συμβολικών δεσμών -Symlinks %x have the same date but a different target! -Οι συμβολικοί δεσμοί %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό! -Synchronization Preview -Î Ïοεπισκόπηση του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï -Synchronization aborted! -Ο συγχÏονισμός ματαιώθηκε! -Synchronization completed successfully! -Ο συγχÏονισμός ολοκληÏώθηκε επιτυχώς! -Synchronization completed with errors! -Ο συγχÏονισμός ολοκληÏώθηκε με σφάλματα! -Synchronization settings -Ρυθμίσεις συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -ΣυγχÏονισμός όλων των αÏχείων .doc, .zip και .exe εκτός αυτών στον υποκατάλογο \"temp\". -Synchronize... -ΣυγχÏονισμός... -Synchronizing... -Γίνεται συγχÏονισμός... -Target directory already existing! -Ο υποκατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη! -Target file already existing! -Το αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Η γÏαμμή ενεÏγειών εκτελείται κάθε φοÏά που:\n- όλοι οι υποκατάλογοι γίνονται διαθÎσιμοι (Ï€.χ. εισαγωγή ενός USB stick)\n- κάποια αÏχεία σε αυτοÏÏ‚ τους καταλόγους ή υποκαταλόγους τους Îχουν Ï„Ïοποποιηθεί -The file does not contain a valid configuration: -Το αÏχείο δεν πεÏιÎχει μια ÎγκυÏη διάταξη: -The file was not processed by last synchronization! -Το αÏχείο δεν συμμετείχε στον τελευταίο συγχÏονισμό! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Με βάση αυτήν την επιλογή, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια, όταν Îχουν το ίδιο μÎγεθος ΚΑΙ ίδια ημÎÏα και ÏŽÏα τελευταίας Ï„Ïοποποίησης. -Time -ÎÏα -Time elapsed: -Î ÎÏασε χÏόνος: -Time remaining: -ΑπομÎνει χÏόνος: -Total amount of data that will be transferred -Συνολικός όγκος δεδομÎνων που θα μεταφεÏθοÏν -Total time: -Συνολική διάÏκεια: -Transfer file and directory permissions\n(Requires Administrator rights) -ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους\n(Απαιτεί δικαιώματα Aministrator) -Unable to connect to sourceforge.net! -Δεν είναι δυνατή η σÏνδεση με το sourceforge.net! -Unable to create logfile! -Δεν είναι δυνατή η δημιουÏγία ενός αÏχείου καταγÏαφής! -Unresolved conflicts existing! -ΥπάÏχουν ανεπίλυτες διενÎξεις! -Update -> -ΕνημÎÏωση -> -Updating attributes of %x -ΕνημÎÏωση των χαÏακτηÏιστικών αÏχείου του %x -Usage: -ΧÏήση: -Use Recycle Bin -ΧÏήση του Κάδου ΑνακÏκλωσης -Use Recycle Bin when deleting or overwriting files -ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων -User-defined directory for deletion was not specified! -Δεν οÏίστηκε από τον χÏήστη υποκατάλογος για τα αÏχεία Ï€Ïος διαγÏαφή! -Variant -ÎœÎθοδος -Verifying file %x -ΕπικÏÏωση του αÏχείου %x -Versioning -ΔιατήÏηση παλιών εκδόσεων -Volume name %x not part of filename %y! -Το όνομα τόμου %x δεν είναι μÎÏος του ονόματος του αÏχείου %y! -Waiting for missing directories... -Αναμονή για τους υποκαταλόγους που απουσιάζουν... -Waiting while directory is locked (%x)... -Αναμονή μÎχÏι να κλειδωθεί ο υποκατάλογος (%x)... -Warning -Î Ïοσοχή -When the comparison is started with this option set the following decision tree is processed: -Εάν γίνει σÏγκÏιση με αυτήν την επιλογή, ακολουθείται το παÏακάτω δÎνδÏο απόφασης: -You can ignore conflicts and continue synchronization. -ΜποÏείτε να αγνοήσετε τις διενÎξεις και να συνεχίσετε το συγχÏονισμό. -You can ignore this error to consider the directory as empty. -ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -ΜποÏείτε να Ï€Ïοσπαθήσετε να συγχÏονίσετε τα υπόλοιπα στοιχεία (ΧΩΡΙΣ να χÏειάζεται να τα ξανασυγκÏίνετε)! -different -διαφοÏετικά -file exists on both sides -Το αÏχείο υπάÏχει και στις δυο πλευÏÎÏ‚ -on one side only -το αÏχείο υπάÏχει μόνο στη μια πλευÏά +<header> + <language name>Eλληνικά</language name> + <translator>ΓιώÏγος Γιαγλής</translator> + <locale>el_GR</locale> + <flag file>greece.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Εμφάνιση στην ΕξεÏεÏνηση</target> +<source>Open with default application</source> +<target>Άνοιγμα με την Ï€ÏοεπιλεγμÎνη εφαÏμογή</target> +<source>Browse directory</source> +<target>Αναζήτηση υποκαταλόγου</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - ΑυτοματοποιημÎνος ΣυγχÏονισμός</target> +<source>Browse</source> +<target>Αναζήτηση</target> +<source>Error resolving symbolic link:</source> +<target>Σφάλμα κατά την επίλυση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:</target> +<source>Select alternate synchronization settings</source> +<target>Επιλογή διαφοÏοποιημÎνων Ïυθμίσεων συγχÏονισμοÏ</target> +<source>No filter selected</source> +<target>Δεν Îχει επιλεχθεί φίλτÏο</target> +<source>Filter is active</source> +<target>Το φίλτÏο είναι ενεÏγό</target> +<source>Clear filter settings</source> +<target>ΔιαγÏαφή όλων των Ïυθμίσεων φίλτÏου</target> +<source>Remove alternate settings</source> +<target>ΔιαγÏαφή των διαφοÏοποιημÎνων Ïυθμίσεων</target> +<source>Create a batch job</source> +<target>ΔημιουÏγία μιας δÎσμης ενεÏγειών</target> +<source>Synchronization settings</source> +<target>Ρυθμίσεις συγχÏονισμοÏ</target> +<source>Comparison settings</source> +<target>Ρυθμίσεις σÏγκÏισης</target> +<source>About</source> +<target>Σχετικά με το...</target> +<source>Error</source> +<target>Σφάλματα</target> +<source>Warning</source> +<target>Î Ïοειδοποίηση</target> +<source>Question</source> +<target>ΕÏώτηση</target> +<source>Confirm</source> +<target>Επιβεβαίωση</target> +<source>Configure filter</source> +<target>ΡÏθμιση του φίλτÏου</target> +<source>Customize columns</source> +<target>Î ÏοσαÏμογή στηλών</target> +<source>Global settings</source> +<target>ΓενικÎÏ‚ Ïυθμίσεις</target> +<source>Synchronization Preview</source> +<target>Î Ïοεπισκόπηση του συγχÏονισμοÏ</target> +<source>Find</source> +<target>Αναζήτηση</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</target> +<source><Symlink></source> +<target><Συμβολικός δεσμός></target> +<source><Directory></source> +<target><Υποκατάλογος></target> +<source>Size</source> +<target>ÎœÎγεθος</target> +<source>Date</source> +<target>ΗμεÏομηνία</target> +<source>Full path</source> +<target>ΠλήÏης διαδÏομή</target> +<source>Filename</source> +<target>Όνομα αÏχείου</target> +<source>Relative path</source> +<target>Σχετική διαδÏομή</target> +<source>Directory</source> +<target>Υποκατάλογος</target> +<source>Extension</source> +<target>ΕπÎκταση</target> +<source>Comparison Result</source> +<target>ΑποτÎλεσμα της σÏγκÏισης</target> +<source>Incompatible synchronization database format:</source> +<target>Η μοÏφή της βάσης δεδομÎνων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι συμβατή:</target> +<source>Initial synchronization:</source> +<target>ΑÏχικός συγχÏονισμός:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Μια από τις βάσεις δεδομÎνων του FreeFileSync δεν υπάÏχει ακόμα:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Μια από τις εγγÏαφÎÏ‚ στη βάση δεδομÎνων του FreeFileSync σχετικά με το ακόλουθο αÏχείο δεν υπάÏχει ακόμη:</target> +<source>Error reading from synchronization database:</source> +<target>Σφάλμα κατά την ανάγνωση από τη βάση δεδομÎνων συγχÏονισμοÏ:</target> +<source>An exception occurred!</source> +<target>ΠαÏουσιάστηκε σφάλμα!</target> +<source>Error deleting file:</source> +<target>Σφάλμα κατά τη διαγÏαφή του αÏχείου:</target> +<source>Error reading file attributes:</source> +<target>Σφάλμα κατά την ανάγνωση των χαÏακτηÏιστικών του αÏχείου:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Αναμονή μÎχÏι να κλειδωθεί ο υποκατάλογος (%x)...</target> +<source>Error setting directory lock:</source> +<target>Σφάλμα κατά το κλείδωμα του υποκαταλόγου:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 δ/λεπτο</pluralform> +<pluralform>%x δ/λεπτα</pluralform> +</target> +<source>Info</source> +<target>ΠληÏοφοÏίες</target> +<source>Fatal Error</source> +<target>Σημαντικό Σφάλμα</target> +<source>File does not exist:</source> +<target>Το αÏχείο δεν υπάÏχει:</target> +<source>Error parsing configuration file:</source> +<target>Σφάλμα κατά την ανάλυση του αÏχείου διάταξης:</target> +<source>Error writing file:</source> +<target>Σφάλμα κατά την εγγÏαφή του αÏχείου:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Μη ÎγκυÏο αÏχείο διάταξης του FreeFileSync!</target> +<source>/sec</source> +<target>/δευτεÏόλεπτο</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 λεπτό</pluralform> +<pluralform>%x λεπτά</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 ÏŽÏα</pluralform> +<pluralform>%x ÏŽÏες</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 μÎÏα</pluralform> +<pluralform>%x μÎÏες</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Α&ποθήκευση διάταξης...</target> +<source>&Load configuration...</source> +<target>Ά&νοιγμα διάταξης...</target> +<source>&Quit</source> +<target>&Έξοδος</target> +<source>&File</source> +<target>&ΑÏχείο</target> +<source>&Content</source> +<target>&ΠεÏιεχόμενα</target> +<source>&About...</source> +<target>&Σχετικά...</target> +<source>&Help</source> +<target>&Βοήθεια</target> +<source>Usage:</source> +<target>ΧÏήση:</target> +<source>1. Select directories to monitor.</source> +<target>1. ΕπιλÎξτε τους υποκαταλόγους που θα παÏακολουθοÏνται.</target> +<source>2. Enter a command line.</source> +<target>2. Εισάγετε μια γÏαμμή εντολών.</target> +<source>3. Press 'Start'.</source> +<target>3. Πατήστε το 'ΈναÏξη'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Η γÏαμμή ενεÏγειών εκτελείται κάθε φοÏά που: +- όλοι οι υποκατάλογοι γίνονται διαθÎσιμοι (Ï€.χ. εισαγωγή ενός USB stick) +- κάποια αÏχεία σε αυτοÏÏ‚ τους καταλόγους ή υποκαταλόγους τους Îχουν Ï„Ïοποποιηθεί +</target> +<source>Directories to watch</source> +<target>Υποκατάλογοι για παÏακολοÏθηση</target> +<source>Add folder</source> +<target>Î Ïοσθήκη υποκαταλόγου</target> +<source>Remove folder</source> +<target>ΔιαγÏαφή του υποκαταλόγου</target> +<source>Select a folder</source> +<target>Επιλογή υποκαταλόγου</target> +<source>Command line</source> +<target>ΓÏαμμή εντολών</target> +<source>Minimum Idle Time [seconds]</source> +<target>Ελάχιστος ΧÏόνος Αναμονής [δευτεÏόλεπτα]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>ΧÏόνος αναμονής Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ ανίχνευσης της τελευταίας αλλαγής και της εκτÎλεσης της γÏαμμής εντολών [δευτεÏόλεπτα]</target> +<source>Start</source> +<target>ΈναÏξη</target> +<source>(Build: %x)</source> +<target>(ΔημιουÏγήθηκε : %x)</target> +<source>RealtimeSync configuration</source> +<target>ΔιαμόÏφωση του RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Το αÏχείο υπάÏχει ήδη. Îα αντικατασταθεί;</target> +<source>&Restore</source> +<target>&ΕπαναφοÏά</target> +<source>&Exit</source> +<target>&Έξοδος</target> +<source>Monitoring active...</source> +<target>ΕνεÏγή παÏακολοÏθηση...</target> +<source>Waiting for missing directories...</source> +<target>Αναμονή για τους υποκαταλόγους που απουσιάζουν...</target> +<source>Command line is empty!</source> +<target>Η γÏαμμή εντολών είναι κενή!</target> +<source>Could not initialize directory monitoring:</source> +<target>Δεν ήταν δυνατό να γίνει ÎναÏξη παÏακολοÏθησης του υποκαταλόγου:</target> +<source>A directory input field is empty.</source> +<target>Ένα πεδίο εισόδου είναι κενό.</target> +<source>Error when monitoring directories.</source> +<target>Σφάλμα κατά την παÏακολοÏθηση υποκαταλόγων.</target> +<source>Drag && drop</source> +<target>ΜεταφοÏά && Απόθεση</target> +<source>Conversion error:</source> +<target>Σφάλμα μετατÏοπής:</target> +<source>Error moving file:</source> +<target>Σφάλμα κατά τη μεταφοÏά του αÏχείου:</target> +<source>Operation aborted!</source> +<target>Η λειτουÏγία ματαιώθηκε!</target> +<source>Target file already existing!</source> +<target>Το αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target> +<source>Error moving directory:</source> +<target>Σφάλμα κατά τη μεταφοÏά του υποκαταλόγου:</target> +<source>Target directory already existing!</source> +<target>Ο υποκατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target> +<source>Error deleting directory:</source> +<target>Σφάλμα κατά τη διαγÏαφή του υποκαταλόγου:</target> +<source>Error changing modification time:</source> +<target>Σφάλμα κατά την αλλαγή της ÏŽÏας Ï„Ïοποποίησης:</target> +<source>Error loading library function:</source> +<target>Σφάλμα κατά τη φόÏτωση της συνάÏτησης βιβλιοθήκης:</target> +<source>Error reading security context:</source> +<target>Σφάλμα κατά την ανάγνωση του πλαισίου ασφαλείας:</target> +<source>Error writing security context:</source> +<target>Σφάλμα κατά την εγγÏαφή του πλαισίου ασφάλειας:</target> +<source>Error copying file permissions:</source> +<target>Σφάλμα κατά την αντιγÏαφή των αδειών των αÏχείων:</target> +<source>Error creating directory:</source> +<target>Σφάλμα κατά τη δημιουÏγία του υποκαταλόγου:</target> +<source>Error copying symbolic link:</source> +<target>Σφάλμα κατά την αντιγÏαφή του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:</target> +<source>Error copying file:</source> +<target>Σφάλμα κατά την αντιγÏαφή του αÏχείου:</target> +<source>Error opening file:</source> +<target>Σφάλμα κατά το άνοιγμα του αÏχείου:</target> +<source>Error reading file:</source> +<target>Σφάλμα κατά την ανάγνωση του αÏχείου:</target> +<source>Endless loop when traversing directory:</source> +<target>ΑτÎÏμονος βÏόχος κατά την την ανάλυση του υποκαταλόγου:</target> +<source>Error traversing directory:</source> +<target>Σφάλμα κατά την ανάλυση του υποκαταλόγου:</target> +<source>Error setting privilege:</source> +<target>Σφάλμα κατά τον οÏισμό δικαιωμάτων:</target> +<source>Error moving to Recycle Bin:</source> +<target>Σφάλμα κατά τη μεταφοÏά στον Κάδο ΑνακÏκλωσης:</target> +<source>Could not load a required DLL:</source> +<target>Δεν φοÏτώθηκε μια απαιτοÏμενη βιβλιοθήκη DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Σφάλμα κατά την εγγÏαφή στη βάση δεδομÎνων συγχÏονισμοÏ:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Σφάλμα κατά την ÎναÏξη της υπηÏεσίας Volume Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Δεν είναι δυνατή η δημιουÏγία σκιώδους αντίγÏαφου σε WOW64. ΧÏησιμοποιείστε την 64-bit Îκδοση του FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί το όνομα τόμου για το αÏχείο:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Το όνομα τόμου %x δεν είναι μÎÏος του ονόματος του αÏχείου %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Δεν αναγνώστηκαν τιμÎÏ‚ για τους ακόλουθους κόμβους XML:</target> +<source>Show popup</source> +<target>Εμφάνιση αναδυόμενου παÏάθυÏου</target> +<source>Show popup on errors or warnings</source> +<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target> +<source>Ignore errors</source> +<target>ΠαÏάβλεψη των σφαλμάτων</target> +<source>Hide all error and warning messages</source> +<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target> +<source>Exit instantly</source> +<target>Άμεση Îξοδος</target> +<source>Abort synchronization immediately</source> +<target>Άμεση ματαίωση του συγχÏονισμοÏ</target> +<source>Logging</source> +<target>ΚαταγÏαφή μηνυμάτων</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync αÏχείο δÎσμης</target> +<source>FreeFileSync configuration</source> +<target>ΑÏχείο διάταξης FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync ΔÎσμη ΕνεÏγειών</target> +<source>Unable to create logfile!</source> +<target>Δεν είναι δυνατή η δημιουÏγία ενός αÏχείου καταγÏαφής!</target> +<source>Batch execution</source> +<target>ΕκτÎλεση δÎσμης ενεÏγειών</target> +<source>Log-messages:</source> +<target>ΑποθηκευμÎνα μηνÏματα:</target> +<source>Stop</source> +<target>Λήξη</target> +<source>Total time:</source> +<target>Συνολική διάÏκεια:</target> +<source>Synchronization aborted!</source> +<target>Ο συγχÏονισμός ματαιώθηκε!</target> +<source>Synchronization completed with errors!</source> +<target>Ο συγχÏονισμός ολοκληÏώθηκε με σφάλματα!</target> +<source>Synchronization completed successfully!</source> +<target>Ο συγχÏονισμός ολοκληÏώθηκε επιτυχώς!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Πατήστε "Εναλλαγή" για να ανοίξετε το γÏαφικό πεÏιβάλλον του FreeFileSync</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Εναλλαγή στο γÏαφικό πεÏιβάλλον του FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Δεν είναι δυνατή η σÏνδεση με το sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Μια νεότεÏη Îκδοση του FreeFileSync είναι διαθÎσιμη:</target> +<source>Download now?</source> +<target>Λήψη Ï„ÏŽÏα;</target> +<source>Information</source> +<target>ΠληÏοφοÏία</target> +<source>FreeFileSync is up to date!</source> +<target>Το FreeFileSync είναι ενημεÏωμÎνο!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>ΘÎλετε το FreeFileSync να ελÎγχει αυτόματα για ενημεÏώσεις κάθε εβδομάδα;</target> +<source>(Requires an Internet connection!)</source> +<target>(Απαιτεί σÏνδεση με το Internet)</target> +<source>1. &Compare</source> +<target>1. &ΣÏγκÏιση</target> +<source>2. &Synchronize...</source> +<target>2. &ΣυγχÏονισμός...</target> +<source>S&witch view</source> +<target>Α&λλαγή εμφάνισης</target> +<source>&New</source> +<target>&ΔημιουÏγία</target> +<source>&Program</source> +<target>&Î ÏόγÏαμμα</target> +<source>&Language</source> +<target>&Γλώσσα</target> +<source>&Global settings...</source> +<target>&ΓενικÎÏ‚ Ïυθμίσεις...</target> +<source>&Create batch job...</source> +<target>&ΔημιουÏγία μιας δÎσμης ενεÏγειών...</target> +<source>&Export file list...</source> +<target>&Εξαγωγή καταλόγου αÏχείων...</target> +<source>&Advanced</source> +<target>&Για Ï€ÏοχωÏημÎνους</target> +<source>&Check for new version</source> +<target>&Έλεγχος για νÎα Îκδοση</target> +<source>Compare</source> +<target>ΣÏγκÏιση</target> +<source>Compare both sides</source> +<target>ΣÏγκÏιση των δÏο πλευÏών</target> +<source>&Abort</source> +<target>&ΆκυÏο</target> +<source>Synchronize...</source> +<target>ΣυγχÏονισμός...</target> +<source>Start synchronization</source> +<target>ΈναÏξη του συγχÏονισμοÏ</target> +<source>Swap sides</source> +<target>Ανταλλαγή πλευÏών</target> +<source>Add folder pair</source> +<target>Î Ïοσθήκη ζεÏγους υποκαταλόγων</target> +<source>Remove folder pair</source> +<target>ΔιαγÏαφή του ζεÏγους υποκαταλόγων</target> +<source>Save current configuration to file</source> +<target>Αποθήκευση της Ï„ÏÎχουσας διάταξης</target> +<source>Load configuration from file</source> +<target>Άνοιγμα διάταξης από αÏχείο</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target> +<source>Hide excluded items</source> +<target>ΑπόκÏυψη των εξαιÏεθÎντων στοιχείων</target> +<source>Hide filtered or temporarily excluded files</source> +<target>ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏÎθηκαν Ï€ÏοσωÏινά</target> +<source>Number of files and directories that will be created</source> +<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν</target> +<source>Number of files that will be overwritten</source> +<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν</target> +<source>Number of files and directories that will be deleted</source> +<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν</target> +<source>Total amount of data that will be transferred</source> +<target>Συνολικός όγκος δεδομÎνων που θα μεταφεÏθοÏν</target> +<source>Left</source> +<target>ΑÏιστεÏά</target> +<source>Right</source> +<target>Δεξιά</target> +<source>Batch job</source> +<target>ΔÎσμη ενεÏγειών</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>ΔημιουÏγία ενός αÏχείου δÎσμης ενεÏγειών για αυτόματο συγχÏονισμό. Για την ÎναÏξη σε λειτουÏγία δÎσμης, δώστε το όνομα του αÏχείου στο εκτελÎσιμο του FreeFileSync: FreeFileSync.exe <αÏχείο δÎσμης>. Αυτή η λειτουÏγία μποÏεί να Ï€ÏογÏαμματιστεί και στο χÏονοδιάγÏαμμα εÏγασιών του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ συστήματος.</target> +<source>Help</source> +<target>Βοήθεια</target> +<source>Configuration overview:</source> +<target>ΣÏνοψη της διάταξης:</target> +<source>Filter files</source> +<target>ΦιλτÏάÏισμα</target> +<source>Status feedback</source> +<target>ΑναφοÏά κατάστασης</target> +<source>Silent mode</source> +<target>Σιωπηλή λειτουÏγία</target> +<source>Start minimized and write status information to a logfile</source> +<target>ΈναÏξη σε ελαχιστοποίηση και εγγÏαφή πληÏοφοÏιών κατάστασης σε αÏχείο καταγÏαφής.</target> +<source>Error handling</source> +<target>ΔιαχείÏιση σφαλμάτων</target> +<source>Overview</source> +<target>ΣÏνοψη</target> +<source>Select logfile directory:</source> +<target>ΕπιλÎξτε Îναν κατάλογο για το αÏχείο καταγÏαφής:</target> +<source>Maximum number of logfiles:</source> +<target>ÎœÎγιστος αÏιθμός αÏχείων καταγÏαφής:</target> +<source>&Save</source> +<target>&Αποθήκευση</target> +<source>&Load</source> +<target>&Άνοιγμα</target> +<source>&Cancel</source> +<target>&ΆκυÏο</target> +<source>Elements found:</source> +<target>Î’ÏÎθηκαν στοιχεία:</target> +<source>Elements remaining:</source> +<target>ΠεÏισσεÏουν στοιχεία:</target> +<source>Speed:</source> +<target>ΤαχÏτητα:</target> +<source>Time remaining:</source> +<target>ΑπομÎνει χÏόνος:</target> +<source>Time elapsed:</source> +<target>Î ÎÏασε χÏόνος:</target> +<source>Operation:</source> +<target>ΛειτουÏγία:</target> +<source>Select variant:</source> +<target>ΕπιλÎξτε μια μÎθοδο:</target> +<source><Automatic></source> +<target><Αυτόματα></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Ανίχνευση και εφαÏμογή των αλλαγών και στις δυο πλευÏÎÏ‚ με τη χÏήση βάσης δεδομÎνων. ΔιαγÏαφÎÏ‚ και διενÎξεις ανιχνεÏονται αυτόματα.</target> +<source>Mirror ->></source> +<target>ΚατοπτÏισμός ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>ΚατοπτÏικό αντίγÏαφο του αÏιστεÏÎ¿Ï Ï…Ï€Î¿ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. Ο υποκατάλογος δεξιά θα Ï„Ïοποποιηθεί και θα αντιστοιχεί εξολοκλήÏου στον αÏιστεÏÏŒ μετά το συγχÏονισμό</target> +<source>Update -></source> +<target>ΕνημÎÏωση -></target> +<source>Copy new or updated files to right folder.</source> +<target>ΑντιγÏαφή των νÎων ή πιο Ï€Ïόσφατων αÏχείων στον υποκατάλογο δεξιά.</target> +<source>Custom</source> +<target>Εξατομίκευση</target> +<source>Configure your own synchronization rules.</source> +<target>ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.</target> +<source>Deletion handling</source> +<target>ΔιαχείÏιση των διαγÏαφών</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Διάταξη</target> +<source>Category</source> +<target>ΚατηγοÏία</target> +<source>Action</source> +<target>ΕνÎÏγεια</target> +<source>Files/folders that exist on left side only</source> +<target>ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα αÏιστεÏά</target> +<source>Files/folders that exist on right side only</source> +<target>ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα δεξιά</target> +<source>Files that exist on both sides, left one is newer</source> +<target>ΑÏχεία που υπάÏχουν και στις δυο πλευÏÎÏ‚, αÏιστεÏά είναι πιο Ï€Ïόσφατα</target> +<source>Files that exist on both sides, right one is newer</source> +<target>ΑÏχεία που υπάÏχουν και στις δυο πλευÏÎÏ‚, δεξιά είναι πιο Ï€Ïόσφατα</target> +<source>Files that have different content</source> +<target>ΑÏχεία που Îχουν διαφοÏετικό πεÏιεχόμενο</target> +<source>Conflicts/files that cannot be categorized</source> +<target>ΔιενÎξεις/αÏχεία που δεν μποÏοÏν να κατηγοÏιοποιηθοÏν</target> +<source>Compare by...</source> +<target>ΣÏγκÏιση με βάση το...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Τα αÏχεία θεωÏοÏνται ίδια, εάν + - το μÎγεθός τους + - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης +είναι ίδια. +</target> +<source>File size and date</source> +<target>ÎœÎγεθος και ημεÏομηνία αÏχείων</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Τα αÏχεία θεωÏοÏνται ίδια, εάν + - το πεÏιεχόμενό τους +είναι ίδιο. +</target> +<source>File content</source> +<target>ΠεÏιεχόμενο αÏχείων</target> +<source>Symbolic Link handling</source> +<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target> +<source>Synchronizing...</source> +<target>Γίνεται συγχÏονισμός...</target> +<source>Elements processed:</source> +<target>ΕπεξεÏγάστηκαν στοιχεία:</target> +<source>&Pause</source> +<target>&ΠαÏση</target> +<source>Compare by "File size and date"</source> +<target>ΣÏγκÏιση με βάση το "ÎœÎγεθος και ΗμεÏομηνία αÏχείων"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Με βάση αυτήν την επιλογή, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια, όταν Îχουν το ίδιο μÎγεθος ΚΑΙ ίδια ημÎÏα και ÏŽÏα τελευταίας Ï„Ïοποποίησης.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Εάν γίνει σÏγκÏιση με αυτήν την επιλογή, ακολουθείται το παÏακάτω δÎνδÏο απόφασης:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Ως αποτÎλεσμα, τα αÏχεία χωÏίζονται στις εξής κατηγοÏίες:</target> +<source>- equal</source> +<target>- ίδια</target> +<source>- left newer</source> +<target>- αÏιστεÏά πιο Ï€Ïόσφατο</target> +<source>- right newer</source> +<target>- δεξιά πιο Ï€Ïόσφατο</target> +<source>- exists left only</source> +<target>- υπάÏχει μόνο στα αÏιστεÏά</target> +<source>- exists right only</source> +<target>- υπάÏχει μόνο στα δεξιά</target> +<source>- conflict</source> +<target>- διÎνεξη</target> +<source>Compare by "File content"</source> +<target>ΣÏγκÏιση με βάση το "ΠεÏιεχόμενο αÏχείων"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Όπως λÎει και ο τίτλος, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια μόνο και μόνον εάν Îχουν το ίδιο πεÏιεχόμενο. Αυτή η επιλογή είναι χÏήσιμη για Îλεγχο αξιοπιστίας παÏά για αντίγÏαφα ασφαλείας. ΕπομÎνως οι ημεÏομηνίες των αÏχείων δε λαμβάνονται υπόψη καθόλου. + +Με αυτήν την επιλογή το δÎνδÏο απόφασης είναι μικÏότεÏο: +</target> +<source>- different</source> +<target>- διαφοÏετικά</target> +<source>Source code written in C++ utilizing:</source> +<target>Ο πηγαίος κώδικας γÏάφτηκε σε C++ χÏησιμοποιώντας τα:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Σχόλια και Ï€Ïοτάσεις είναι ευπÏόσδεκτα στα:</target> +<source>FreeFileSync at Sourceforge</source> +<target>Το FreeFileSync στο Sourceforge</target> +<source>Homepage</source> +<target>Ιστοσελίδα</target> +<source>If you like FFS</source> +<target>Αν σας αÏÎσει το FFS</target> +<source>Donate with PayPal</source> +<target>Κάντε μια δωÏεά μÎσω PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>ΑναφÎÏετε λάθη μετάφÏασης</target> +<source>Published under the GNU General Public License:</source> +<target>ΔιανÎμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU:</target> +<source>Ignore subsequent errors</source> +<target>ΠαÏάβλεψη των επόμενων σφαλμάτων</target> +<source>Hide further error messages during the current process</source> +<target>ΑπόκÏυψη επόμενων μηνυμάτων σφάλματος στην Ï„ÏÎχουσα διαδικασία</target> +<source>&Ignore</source> +<target>&ΠαÏάβλεψη</target> +<source>&Retry</source> +<target>&Επανάληψη</target> +<source>Do not show this dialog again</source> +<target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target> +<source>&Switch</source> +<target>&Εναλλαγή</target> +<source>&Yes</source> +<target>&Îαι</target> +<source>&No</source> +<target>&Όχι</target> +<source>Delete on both sides</source> +<target>ΔιαγÏαφή και στις δυο πλευÏÎÏ‚</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>ΔιαγÏαφή και στις δυο πλευÏÎÏ‚, ακόμα κι αν το αÏχείο Îχει επιλεχθεί μόνο στη μια πλευÏά</target> +<source>Use Recycle Bin</source> +<target>ΧÏήση του Κάδου ΑνακÏκλωσης</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Μόνον αÏχεία/υποκατάλογοι που ταιÏιάζουν με όλες τις Ïυθμίσεις φίλτÏου θα επιλεχθοÏν για συγχÏονισμό. +Σημείωση: Το φίλτÏο ονόματος Ï€ÏÎπει να οÏιστεί σε σχÎση(!) με τους κÏÏιους υποκαταλόγους συγχÏονισμοÏ. +</target> +<source>Hints:</source> +<target>ΣυμβουλÎÏ‚:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Εισάγετε τα σχετικά ονόματα των αÏχείων ή των υποκαταλόγων χωÏισμÎνα με ';' ή με αλλαγή γÏαμμής.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. ΜποÏείτε να χÏησιμοποιήσετε τους χαÏακτήÏες-μπαλαντÎÏ '*' και '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. ΜποÏείτε να εξαιÏÎσετε αÏχεία στη βασική οθόνη κάνοντας δεξί κλικ.</target> +<source>Example</source> +<target>ΠαÏάδειγμα</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +ΣυμπεÏίληψη: *.doc;*.zip;*.exe +ΕξαίÏεση: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>ΣυγχÏονισμός όλων των αÏχείων .doc, .zip και .exe εκτός αυτών στον υποκατάλογο "temp".</target> +<source>Include</source> +<target>ΣυμπεÏίληψη</target> +<source>Exclude</source> +<target>ΕξαίÏεση</target> +<source>Select time span:</source> +<target>ΕπιλÎξτε εÏÏος χÏόνου:</target> +<source>Minimum file size:</source> +<target>Ελάχιστο μÎγεθος αÏχείου:</target> +<source>Maximum file size:</source> +<target>ÎœÎγιστο μÎγεθος αÏχείου:</target> +<source>&Default</source> +<target>&Î Ïοεπιλογή</target> +<source>Move column up</source> +<target>Μετακίνηση της στήλης πάνω</target> +<source>Move column down</source> +<target>Μετακίνηση της στήλης κάτω</target> +<source>Copy locked files</source> +<target>ΑντιγÏαφή κλειδωμÎνων αÏχείων</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +ΑντιγÏαφή κλειδωμÎνων ή διαμοιÏασμÎνων αÏχείων με την υπηÏεσία Volume Shadow Copy +(απαιτεί δικαιώματα Administrator) +</target> +<source>Copy filesystem permissions</source> +<target>ΑντιγÏαφή των αδειών των αÏχείων</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους +(Απαιτεί δικαιώματα Aministrator) +</target> +<source>Hidden dialogs:</source> +<target>ΚÏυμμÎνα παÏάθυÏα διαλόγου:</target> +<source>Reset</source> +<target>Επανεμφάνιση</target> +<source>Show hidden dialogs</source> +<target>Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου</target> +<source>External applications</source> +<target>ΕξωτεÏικÎÏ‚ εφαÏμογÎÏ‚</target> +<source>Description</source> +<target>ΠεÏιγÏαφή</target> +<source>Variant</source> +<target>ÎœÎθοδος</target> +<source>Statistics</source> +<target>Στατιστικά</target> +<source>Find what:</source> +<target>Αναζήτηση του:</target> +<source>Match case</source> +<target>Αντιστοίχιση πεζών-κεφαλαίων</target> +<source>&Find next</source> +<target>&ΕÏÏεση επομÎνου</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>ΜποÏείτε να Ï€Ïοσπαθήσετε να συγχÏονίσετε τα υπόλοιπα στοιχεία (ΧΩΡΙΣ να χÏειάζεται να τα ξανασυγκÏίνετε)!</target> +<source>Batch file created successfully!</source> +<target>Το αÏχείο δÎσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς!</target> +<source>Main bar</source> +<target>ΓÏαμμή εÏγαλείων</target> +<source>Folder pairs</source> +<target>ΖεÏγη υποκαταλόγων</target> +<source>Select view</source> +<target>Επιλογή εμφάνισης</target> +<source>Folder Comparison and Synchronization</source> +<target>ΣÏγκÏιση υποκαταλόγων και ΣυγχÏονισμός</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Ο Κάδος ΑνακÏκλωσης δεν υποστηÏίζεται σε αυτό το σÏστημα!</target> +<source>Set direction:</source> +<target>Επιλογή κατεÏθυνσης:</target> +<source>Exclude temporarily</source> +<target>Î ÏοσωÏινή εξαίÏεση</target> +<source>Include temporarily</source> +<target>Î ÏοσωÏινή συμπεÏίληψη</target> +<source>Exclude via filter:</source> +<target>ΕξαίÏεση με βάση το φίλτÏο:</target> +<source><multiple selection></source> +<target><πολλαπλή επιλογή></target> +<source>D-Click</source> +<target>Διπλό κλικ</target> +<source>Copy to clipboard CTRL+C</source> +<target>ΑντιγÏαφή στο Ï€ÏόχειÏο CTRL+C</target> +<source>Delete files DEL</source> +<target>ΔιαγÏαφή αÏχείων DEL</target> +<source>Customize...</source> +<target>Î ÏοσαÏμογή...</target> +<source>Auto-adjust columns</source> +<target>Αυτόματη Ï€ÏοσαÏμογή των στηλών</target> +<source>Include all rows</source> +<target>ΣυμπεÏίληψη όλων των γÏαμμών</target> +<source>Exclude all rows</source> +<target>ΕξαίÏεση όλων των γÏαμμών</target> +<source>Reset view</source> +<target>ΕπαναφοÏά αÏχικής εμφάνισης</target> +<source>Show "%x"</source> +<target>Εμφάνιση της γÏαμμής "%x"</target> +<source><Last session></source> +<target><Τελευταία χÏήση></target> +<source>Configuration saved!</source> +<target>Η διάταξη αποθηκεÏτηκε!</target> +<source>Save changes to current configuration?</source> +<target>Îα αποθηκευτοÏν οι αλλαγÎÏ‚ στην Ï„ÏÎχουσα διάταξη;</target> +<source>Configuration loaded!</source> +<target>Η διάταξη Îχει ανοιχθεί!</target> +<source>Hide files that exist on left side only</source> +<target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target> +<source>Show files that exist on left side only</source> +<target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target> +<source>Hide files that exist on right side only</source> +<target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα δεξιά</target> +<source>Show files that exist on right side only</source> +<target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα δεξιά</target> +<source>Hide files that are newer on left</source> +<target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target> +<source>Show files that are newer on left</source> +<target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target> +<source>Hide files that are newer on right</source> +<target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target> +<source>Show files that are newer on right</source> +<target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target> +<source>Hide files that are equal</source> +<target>ΑπόκÏυψη των αÏχείων που είναι ίδια</target> +<source>Show files that are equal</source> +<target>Εμφάνιση των αÏχείων που είναι ίδια</target> +<source>Hide files that are different</source> +<target>ΑπόκÏυψη των αÏχείων που είναι διαφοÏετικά</target> +<source>Show files that are different</source> +<target>Εμφάνιση των αÏχείων που είναι διαφοÏετικά</target> +<source>Hide conflicts</source> +<target>ΑπόκÏυψη διενÎξεων</target> +<source>Show conflicts</source> +<target>Εμφάνιση διενÎξεων</target> +<source>Hide files that will be created on the left side</source> +<target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target> +<source>Show files that will be created on the left side</source> +<target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target> +<source>Hide files that will be created on the right side</source> +<target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target> +<source>Show files that will be created on the right side</source> +<target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target> +<source>Hide files that will be deleted on the left side</source> +<target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target> +<source>Show files that will be deleted on the left side</source> +<target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target> +<source>Hide files that will be deleted on the right side</source> +<target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target> +<source>Show files that will be deleted on the right side</source> +<target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target> +<source>Hide files that will be overwritten on left side</source> +<target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> +<source>Show files that will be overwritten on left side</source> +<target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> +<source>Hide files that will be overwritten on right side</source> +<target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα δεξιά</target> +<source>Show files that will be overwritten on right side</source> +<target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> +<source>Hide files that won't be copied</source> +<target>ΑπόκÏυψη των αÏχείων που δε θα αντιγÏαφοÏν</target> +<source>Show files that won't be copied</source> +<target>Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν</target> +<source>All directories in sync!</source> +<target>Όλοι οι υποκατάλογοι είναι συγχÏονισμÎνοι!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>ΠαÏακαλώ εκτελÎστε Ï€Ïώτα ΣÏγκÏιση Ï€Ïιν το ΣυγχÏονισμό!</target> +<source>Comma separated list</source> +<target>Κατάλογος οÏιοθετημÎνος με κόμματα</target> +<source>Legend</source> +<target>Εξήγηση των συμβόλων για κάθε κατηγοÏία</target> +<source>File list exported!</source> +<target>Ο κατάλογος των αÏχείων Îχει εξαχθεί!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Το αντικείμενο διαγÏάφηκε επιτυχώς!</pluralform> +<pluralform>%x αντικείμενα διαγÏάφηκαν επιτυχώς!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 υποκατάλογος</pluralform> +<pluralform>%x υποκατάλογοι</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 αÏχείο</pluralform> +<pluralform>%x αÏχεία</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x από τη 1 φανεÏή γÏαμμή</pluralform> +<pluralform>%x από τις %y φανεÏÎÏ‚ γÏαμμÎÏ‚</pluralform> +</target> +<source>Scanning...</source> +<target>Ανίχνευση...</target> +<source>Comparing content...</source> +<target>ΣÏγκÏιση του πεÏιεχομÎνου...</target> +<source>Paused</source> +<target>Σε παÏση</target> +<source>Aborted</source> +<target>Ματαιώθηκε</target> +<source>Completed</source> +<target>ΟλοκληÏώθηκε</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„ÏÎχουσας εÏγασίας...</target> +<source>Continue</source> +<target>ΣυνÎχεια</target> +<source>Pause</source> +<target>ΠαÏση</target> +<source>Cannot find %x</source> +<target>Δεν μποÏεί να βÏεθεί το %x</target> +<source>DECISION TREE</source> +<target>ΔΕÎΔΡΟ ΑΠΟΦΑΣΗΣ</target> +<source>file exists on both sides</source> +<target>Το αÏχείο υπάÏχει και στις δυο πλευÏÎÏ‚</target> +<source>on one side only</source> +<target>το αÏχείο υπάÏχει μόνο στη μια πλευÏά</target> +<source>- left</source> +<target>- αÏιστεÏά</target> +<source>- right</source> +<target>- δεξιά</target> +<source>different</source> +<target>διαφοÏετικά</target> +<source>- conflict (same date, different size)</source> +<target>- διÎνεξη (ίδια ημεÏομηνία, διαφοÏετικό μÎγεθος)</target> +<source>Inactive</source> +<target>ΑνενεÏγό</target> +<source>Second</source> +<target>ΔευτεÏόλεπτα</target> +<source>Minute</source> +<target>Λεπτά</target> +<source>Hour</source> +<target>ÎÏες</target> +<source>Day</source> +<target>ΗμÎÏες</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>ΦίλτÏο: Όλα τα ζεÏγη</target> +<source>Filter: Single pair</source> +<target>ΦίλτÏο: Ένα ζεÏγος</target> +<source>Ignore</source> +<target>ΠαÏάβλεψη</target> +<source>Direct</source> +<target>Ως δεσμό</target> +<source>Follow</source> +<target>Ως πεÏιεχόμενο</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Ένταξη εξωτεÏικών εφαÏμογών στο Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιβάλλοντος. Οι ακόλουθες μακÏοεντολÎÏ‚ είναι διαθÎσιμες:</target> +<source>- full file or directory name</source> +<target>- πλήÏες όνομα του αÏχείου ή υποκαταλόγου</target> +<source>- directory part only</source> +<target>- μόνο τους υποκαταλόγους</target> +<source>- Other side's counterpart to %name</source> +<target>- Το αντίστοιχο %name της άλλης πλευÏάς</target> +<source>- Other side's counterpart to %dir</source> +<target>- Ο αντίστοιχος %dir της άλλης πλευÏάς</target> +<source>Restore all hidden dialogs?</source> +<target>Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου;</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Είστε σίγουÏοι ότι θÎλετε να μετακινήσετε το ακόλουθο αντικείμενο στον Κάδο ΑνακÏκλωσης;</pluralform> +<pluralform>Είστε σίγουÏοι ότι θÎλετε να μετακινήσετε τα ακόλουθα %x αντικείμενα στον Κάδο ΑνακÏκλωσης;</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Είστε σίγουÏοι ότι θÎλετε να διαγÏάψετε το ακόλουθο αντικείμενο;</pluralform> +<pluralform>Είστε σίγουÏοι ότι θÎλετε να διαγÏάψετε τα ακόλουθα %x αντικείμενα;</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>ΠαÏάβλεψη ως ανεπίλυτη διÎνεξη</target> +<source>Delete permanently</source> +<target>Μόνιμη διαγÏαφή</target> +<source>Delete or overwrite files permanently</source> +<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target> +<source>Versioning</source> +<target>ΔιατήÏηση παλιών εκδόσεων</target> +<source>Move files into a time-stamped subdirectory</source> +<target>ΜεταφοÏά των αÏχείων σε Îναν υποκατάλογο με Îνδειξη ÏŽÏας</target> +<source>Cannot determine sync-direction:</source> +<target>Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ:</target> +<source>Filter settings have changed!</source> +<target>Οι Ïυθμίσεις φίλτÏου Îχουν αλλάξει!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Και οι δυο πλευÏÎÏ‚ Îχουν αλλάξει από τον τελευταίο συγχÏονισμό!</target> +<source>No change since last synchronization!</source> +<target>Καμία αλλαγή από τον Ï€ÏοηγοÏμενο συγχÏονισμό!</target> +<source>The file was not processed by last synchronization!</source> +<target>Το αÏχείο δεν συμμετείχε στον τελευταίο συγχÏονισμό!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Η διαγÏαφή του επιλεγμÎνου καταλόγου είναι σε διÎνεξη με τους υποκαταλόγους και τα -αÏχεία του!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>ΡÏθμιση Ï€ÏοεπιλεγμÎνης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.</target> +<source>The file does not contain a valid configuration:</source> +<target>Το αÏχείο δεν πεÏιÎχει μια ÎγκυÏη διάταξη:</target> +<source>Scanning:</source> +<target>Ανίχνευση:</target> +<source>Encoding extended time information: %x</source> +<target>Κωδικοποίηση εκτεταμÎνων πληÏοφοÏιών για την ÏŽÏα: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό.</target> +<source>Directory does not exist:</source> +<target>Ο υποκατάλογος δεν υπάÏχει:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Οι υποκατάλογοι είναι εξαÏτώμενοι. Î Ïοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:</target> +<source>Comparing content of files %x</source> +<target>ΣÏγκÏιση του πεÏιεχομÎνου των αÏχείων %x</target> +<source>Memory allocation failed!</source> +<target>Η δÎσμευση χώÏου μνήμης απÎτυχε!</target> +<source>File %x has an invalid date!</source> +<target>Το αÏχείο %x δεν Îχει ÎγκυÏη ημεÏομηνία!</target> +<source>Conflict detected:</source> +<target>ΑνιχνεÏθηκε διÎνεξη:</target> +<source>Files %x have the same date but a different size!</source> +<target>Τα αÏχεία %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μÎγεθος!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Οι συμβολικοί δεσμοί %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό!</target> +<source>Comparing files by content failed.</source> +<target>Η σÏγκÏιση του πεÏιεχομÎνου των αÏχείων απÎτυχε.</target> +<source>Generating file list...</source> +<target>ΔημιουÏγία καταλόγου αÏχείων...</target> +<source>Multiple...</source> +<target>ΠολλαπλÎÏ‚ Ïυθμίσεις...</target> +<source>Files that are equal on both sides</source> +<target>ΑÏχεία ίδια και στις δυο πλευÏÎÏ‚</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Ίδια αÏχεία/υποκατάλογοι που διαφÎÏουν μόνο στα χαÏακτηÏιστικά αÏχείου</target> +<source>Copy from right to left</source> +<target>ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά</target> +<source>Copy from left to right</source> +<target>ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά</target> +<source>Delete files/folders existing on left side only</source> +<target>ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα αÏιστεÏά</target> +<source>Delete files/folders existing on right side only</source> +<target>ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα δεξιά</target> +<source>Copy from right to left overwriting</source> +<target>ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά με αντικατάσταση</target> +<source>Copy from left to right overwriting</source> +<target>ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά με αντικατάσταση</target> +<source>Do nothing</source> +<target>Καμία ενÎÏγεια</target> +<source>Copy attributes only from right to left</source> +<target>ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα δεξιά Ï€Ïος τα αÏιστεÏά</target> +<source>Copy attributes only from left to right</source> +<target>ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα αÏιστεÏά Ï€Ïος τα δεξιά</target> +<source>Deleting file %x</source> +<target>ΔιαγÏαφή του αÏχείου %x</target> +<source>Deleting Symbolic Link %x</source> +<target>ΔιαγÏαφή του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x</target> +<source>Deleting folder %x</source> +<target>ΔιαγÏαφή του υποκαταλόγου %x</target> +<source>Moving %x to Recycle Bin</source> +<target>ΜεταφοÏά του %x στον Κάδο ΑνακÏκλωσης</target> +<source>Moving file %x to user-defined directory %y</source> +<target>ΜεταφοÏά του αÏχείου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>ΜεταφοÏά του υποκαταλόγου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>ΜεταφοÏά του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> +<source>Copying new file %x to %y</source> +<target>ΑντιγÏαφή του νÎου αÏχείου %x στο %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>ΑντιγÏαφή του νÎου Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target> +<source>Overwriting file %x in %y</source> +<target>Αντικατάσταση του αÏχείου %x στο %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Αντικατάσταση του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target> +<source>Creating folder %x</source> +<target>ΔημιουÏγία του υποκαταλόγου %x</target> +<source>Verifying file %x</source> +<target>ΕπικÏÏωση του αÏχείου %x</target> +<source>Updating attributes of %x</source> +<target>ΕνημÎÏωση των χαÏακτηÏιστικών αÏχείου του %x</target> +<source>Source directory does not exist anymore:</source> +<target>Ο υποκατάλογος Ï€ÏοÎλευσης δεν υπάÏχει πλÎον:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη!</target> +<source>Target directory name must not be empty!</source> +<target>Το όνομα του υποκαταλόγου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏÎπει να μην είναι κενό!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Δεν οÏίστηκε από τον χÏήστη υποκατάλογος για τα αÏχεία Ï€Ïος διαγÏαφή!</target> +<source>Unresolved conflicts existing!</source> +<target>ΥπάÏχουν ανεπίλυτες διενÎξεις!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>ΜποÏείτε να αγνοήσετε τις διενÎξεις και να συνεχίσετε το συγχÏονισμό.</target> +<source>Significant difference detected:</source> +<target>ΑνιχνεÏθηκαν σημαντικÎÏ‚ διαφοÏÎÏ‚:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>ΠεÏισσότεÏα από το 50% των αÏχείων θα αντιγÏαφοÏν ή διαγÏαφοÏν!</target> +<source>Not enough free disk space available in:</source> +<target>Δεν υπάÏχει αÏκετός διαθÎσιμος χώÏος στο δίσκο:</target> +<source>Free disk space required:</source> +<target>ΑπαιτοÏμενος ελεÏθεÏος χώÏος δίσκου:</target> +<source>Free disk space available:</source> +<target>ΔιαθÎσιμος ελεÏθεÏος χώÏος δίσκου:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Θα Ï„Ïοποποιηθεί Îνας υποκατάλογος που ανήκει σε πολλαπλά ζεÏγη υποκαταλόγων! ΠαÏακαλώ αναθεωÏείστε τις Ïυθμίσεις συγχÏονισμοÏ.</target> +<source>Processing folder pair:</source> +<target>ΣÏγκÏιση του ζεÏγους υποκαταλόγων:</target> +<source>Generating database...</source> +<target>ΔημιουÏγία βάσης δεδομÎνων...</target> +<source>Error copying locked file %x!</source> +<target>Σφάλμα κατά την αντιγÏαφή του κλειδωμÎνου αÏχείου %x !</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Σφάλμα επικÏÏωσης δεδομÎνων: Τα αÏχεία Ï€ÏοÎλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Îχουν διαφοÏετικό πεÏιεχόμενο!</target> diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng deleted file mode 100644 index 89f23af4..00000000 --- a/BUILD/Languages/hebrew.lng +++ /dev/null @@ -1,910 +0,0 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- מהדר ×’× ×• של ×—×œ×•× ×•×ª\n wxWidgets \t- ממשק גרפי של ×ª×•×›× ×ª קוד פתוח\n wxFormBuilder\t- wxWidgets ×ž× ×•×¢ ממשג גרפי\n CodeBlocks \t- IDE ×ª×•×›× ×ª קוד פתוח -%x / %y objects deleted successfully -××•×‘×™×§×˜×™× × ×ž×—×§×• בהצלחה %y מ %x -%x Bytes - -%x GB -%x ×’×™×’×” ביט -%x MB -%x מגה ביט -%x PB -%x פיקו ביט -%x TB -%x טרה ביט -%x day(s) - -%x directories -מחיצות %x -%x files -%x ×§×‘×¦×™× -%x hour(s) - -%x kB -%x קב -%x min - -%x of %y rows in view -שורות בתצוגה %y מ %x -%x of 1 row in view -שורות בתצוגה %x מ 1 -%x sec - -%x% -%x% -&Abort -&× ×˜×•×© -&About... -&×ודות... -&Advanced -&×ž×ª×§×“× -&Cancel -&בטל -&Check for new version -&בדוק ×œ×’×™×¨×¡× ×—×“×©×” -&Content -&תוכן -&Create batch job... -&צור קובץ ×צווה... -&Default -&ברירת מחדל -&Exit -&יצי××” -&Export file list... -×™×¦× ×¨×©×™×ž×ª קבצי×... -&File -&קובץ -&Find next -&×ž×¦× ×”×‘× -&Global settings... -&×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×... -&Help -&עזרה -&Ignore -&×”×ª×¢×œ× -&Language -&שפה -&Load -&טען -&Load configuration... -טען תצורה... -&New -&חדש -&No -&×œ× -&OK -&×שר -&Pause -&עצור -&Program - -&Quit -&יצי××” -&Restore -&טען מחדש -&Retry -&× ×¡×” ×©× ×™×ª -&Save -&שמירה -&Switch -&החלפה -&Yes -&כן -(Build: %x) - -(Requires an Internet connection!) -(מחייב קישור ××™× ×˜×¨× ×˜×™ פעיל!) -- Other side's counterpart to %dir -- %dir הצד ×”×©× ×™ מקביל ל -- Other side's counterpart to %name -- %name הצד ×”×©× ×™ מקביל ל -- conflict -- ×§×•× ×¤×œ×™×§×˜ -- conflict (same date, different size) -- ת×ריך ×–×”×” - גודל ×©×•× ×”) ×§×•× ×¤×œ×™×§×˜) -- different -- ×©×•× ×” -- directory part only -- חלק התיקיה בלבד -- equal -- שווה -- exists left only -- × ×ž×¦× ×ž×©×ž×ל בלבד -- exists right only -- × ×ž×¦× ×ž×™×ž×™×Ÿ בלבד -- full file or directory name -- ×©× ×ž×œ× ×©×œ קובץ ×ו תיקיה -- left -- שמ×ל -- left newer -- שמ×לי חדש יותר -- right -- ימין -- right newer -- ×™×ž× ×™ חדש יותר -/sec -/×©× -1 directory -1 תיקיה -1 file -1 קובץ -1. &Compare -1. &השווה -1. Enter relative file or directory names separated by ';' or a new line. -1. ×”×›× ×¡ ×©× ×§×•×‘×¥ ×ו ×©× ×ª×™×§×™×” ×ž×•×¤×¨×“×™× ×¢"×™ ';' ×ו דורה חדשה -1. Select directories to monitor. -1. בחר מחיצות ×œ× ×™×ª×•×¨. -2. &Synchronize... -2. &×¡× ×›×¨×Ÿ... -2. Enter a command line. -2. הקש שורת פקודות. -2. Use wildcard characters '*' and '?'. -2. השתמש ב××©×¤×™× '*' ×ו '?'לבחירה מרובה. -3. Exclude files directly on main grid via context menu. -3. ×”×•×¦× ×§×‘×¦×™× ×”×™×™×©×¨ ב×סכלה עיקרית דרך תפריט הקשר. -3. Press 'Start'. -3. לחץ'הפעל'. -<Automatic> -<×וטומטי> -<Directory> -<מחיצה> -<Last session> -<× ×©×ž×¨ ×חרון> -<Symlink> - -<multiple selection> -<בחירה מרובה> -A directory input field is empty. - -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! - -A newer version of FreeFileSync is available: -יותר קיימת ×’×¨×¡× ×—×“×©×”: -Abort requested: Waiting for current operation to finish... -התקבלה בקשת ביטול מחכה לפעולה ×”× ×•×›×—×™×ª ×œ×”×¡×ª×™×™× -Abort synchronization immediately -הפסק ×¡× ×›×¨×•×Ÿ מידית -Aborted -הופסק -About -×ודות -Action -פעולה -Add folder -הוסף מחיצה -Add folder pair -הוסף מחיצה זוגית -All directories in sync! -כל המחיצות ×ž×¡×•× ×›×¨× ×•×ª! -An exception occurred! -×ירוע חריג! -As a result the files are separated into the following categories: -:כתוצ××” ×”×§×‘×¦×™× ×”×•×¤×¨×“×• לקטגוריות הב×ות -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: - כפי ×©×”×©× ×ž×•×¦×¢, ×©× ×™ ×§×‘×¦×™× ×”×—×•×œ×§×™× ×©× ×–×”×”×•×ž×¡×•×ž× ×™× ×›×©×•×•×™× ×‘×ž×™×“×” ו×ך ורק ×”× ×‘×¢×œ ×™ תוכן ×–×”×” ×ופציה ×–×ת שימושית לבדיקת עקביות מ×שר גיבוי לכן ×–×ž× ×™ הקובץ ×œ× × ×œ×§×—×™× ×‘×—×©×‘×•×Ÿ כלל .\n\n -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -×פשר ×’× ×œ×”×©×ª×ž×© ×‘×ž× ×”×œ המשימות ×”×ž×ª×•×–×ž× ×•×ª של המערכת להפעלה ב×צווה העבר ×ת ×©× ×”×§×•×‘×¥ ×œ×ª×•×›× ×” הגדר קובץ ×צווה ×œ×¡× ×›×¨×•×Ÿ ×וטומטי -At least one directory input field is empty. -לפחות מחיצה ×חת בשדה ×”×›× ×™×¡×” ריקה. -Auto-adjust columns -עימוד ×וטומטי -Batch execution -פעולת ×צווה -Batch file created successfully! -!קובץ ×צווה × ×•×¦×¨ בהצלחה -Batch job -עבודת ×צווה -Big thanks for localizing FreeFileSync goes out to: -:תודות עבור עבודות ×”×ª×¨×’×•× ×©×œ ×ª×•×›× ×ª ×”×¡× ×›×¨×•×Ÿ -Both sides have changed since last synchronization! -!×©× ×™ ×”×¦×“×“×™× ×©×•× ×• מ××– ×”×¡× ×›×¨×•×Ÿ ×”×חרון -Browse -עיין -Browse directory -עיין במחיצה -Cannot determine sync-direction: -×œ× ×ž×–×”×” כוון ×¡× ×›×¨×•×Ÿ: -Cannot find %x -.%x ×œ× ×ž×•×¦× -Category -קטגוריה -Clear filter settings -× ×§×” בחירת ×ž×¡× ×Ÿ -Comma separated list -רשימה מופרדת ×¤×¡×™×§×™× -Command line -שורת פקודות -Command line is empty! -שורת פקודות ריקה -Compare -השוו××” -Compare both sides -השוה בין ×©× ×™ ×”×¦×“×“×™× -Compare by \"File content\" -\"File content\" השווה ×¢"×™ תכולת הקובץ -Compare by \"File size and date\" -\"File size and date\" השווה ×¢"×™ גודל הקובץ ות×ריך -Compare by... -השווה ×¢"×™... -Comparing content of files %x -%x השווה תכולה של קובץ -Comparing content... -משווה תכולה... -Comparing files by content failed. -השו××” ×¢"×™ תכולה ×”×§×‘×¦×™× × ×›×©×œ×”. -Comparison Result -תוצ×ות ההשוו××” -Comparison settings -×ž×©×ª× ×™ ההשוו××” -Completed -×”×•×©×œ× -Configuration -תצורה -Configuration loaded! -תצורה ×”×•×˜×¢× ×”! -Configuration overview: -:סקירת תצורה -Configuration saved! -תצורה × ×©×ž×¨×”! -Configure filter -תצורת ×ž×¡× ×Ÿ -Configure your own synchronization rules. -סדר ×ת כללי ×”×¡× ×›×¨×•×Ÿ שלך. -Confirm -×שר -Conflict detected: -התגלה ×§×•× ×¤×œ×™×§×˜: -Conflicts/files that cannot be categorized -×§×•× ×¤×œ×™×§×˜×™×-×§×‘×¦×™× ×שר ××™× × ×™×›×•×œ×™× ×œ×¡×•×•×’ -Continue -המשך -Conversion error: -טעות בהסבה: -Copy attributes only from left to right - -Copy attributes only from right to left - -Copy filesystem permissions - -Copy from left to right -העתק משמ×ל לימין -Copy from left to right overwriting -העתק ודרוס משמ×ל לימין -Copy from right to left -העתק מימין לשמ×ל -Copy from right to left overwriting -העתק ודרוס מימין לשמ×ל -Copy locked files -העתק ×§×‘×¦×™× × ×¢×•×œ×™× -Copy new or updated files to right folder. -העתק ×§×‘×¦×™× ×—×“×©×™× ×ו ×ž×¢×•×“×›× ×™× ×œ×ž×—×™×¦×” ×”×™×ž× ×™×ª. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) - -Copy to clipboard\tCTRL+C -העתק למכתבה \tCTRL+C -Copying new Symbolic Link %x to %y - -Copying new file %x to %y - -Could not determine volume name for file: -×œ× ×™×›×•×œ לקבוע ×©× ×›×•× ×Ÿ לקובץ: -Could not initialize directory monitoring: -×œ× ×™×›×•×œ ל×תחל מחיצה × ×“×¨×©×ª: -Could not load a required DLL: -:× ×“×¨×© DLL ×œ× ×™×›×œ לטעון -Could not read values for the following XML nodes: -XML ×œ× ×™×›×•×œ ×œ×§×¨× ×¢×¨×›×™× ×ž : -Create a batch job -יוצר עבודת ×צווה -Creating folder %x -יוצר מחיצה %x -Custom -מות×× -Customize columns -סדר עמודות -Customize... -מות×× ×ישית... -D-Click -לחיצה-כפולה -DECISION TREE -×¢×¥-החלטה -Data verification error: Source and target file have different content! -!טעות של ×ימות × ×ª×•× ×™× ×§×•×‘×¥ מקור ומטרה בעלי תכולת × ×ª×•× ×™× ×©×•× ×” -Date -ת×רין -Delete files/folders existing on left side only -מחק ×§×‘×¦×™× -תיקיות ×”×§×™×ž×™× ×ך ורק בצד שמ×ל -Delete files/folders existing on right side only -מחק ×§×‘×¦×™× -תיקיות ×”×§×™×ž×™× ×ך ורק בצד ימין -Delete files\tDEL -מחק קבצי×\tDEL -Delete on both sides -מחק ×‘×©× ×™ ×”×¦×“×“×™× -Delete on both sides even if the file is selected on one side only -מחק ×‘×©× ×™ ×”×¦×“×“×™× ××£ ×× ×”×§×•×‘×¥ × ×‘×—×¨ בצד ×חד בלבד -Delete or overwrite files permanently -מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª -Delete permanently -מחק לצמיתות -Deleting Symbolic Link %x - -Deleting file %x -מחק קובץ %x -Deleting folder %x -מחק מחיצה %x -Deletion handling -מוחק -Description -ת×ור -Direct - -Directories are dependent! Be careful when setting up synchronization rules: -מחיצות תלויות זהירות בהגדרת כללי ×¡× ×›×¨×•×Ÿ: -Directories to watch -מחיצות ×œ× ×™×ª×•×¨ -Directory -מחיצה -Directory does not exist: -מחיצה ×œ× ×§×™×™×ž×ª: -Do not show this dialog again -×ל תר××” מסך ×–×” ×©× ×™×ª -Do nothing -×ל תעשה ×›×œ×•× -Do you really want to delete the following object(s)? -×”×× ×תה ב×מת רוצה למחוק ×ת ×”××•×‘×™×§×˜×™× ×”×‘××™×? -Do you really want to move the following object(s) to the Recycle Bin? -×”×× ×תה רוצה להעביר ×ת ×”××•×‘×™×§×˜×™× ×”×‘××™× ×œ×¡×œ המיחזור? -Do you want FreeFileSync to automatically check for updates every week? -×”×× ×‘×¨×¦×•× ×š ×©×”×ª×•×›× ×” תבדוק לעדכון בכל שבוע? -Donate with PayPal -×ª×¨×•× ×¢× ×¤×™×™×¤×œ -Download now? -הוקד עכשיו? -Drag && drop -גרור והשלך -Elements found: -××œ×ž× ×˜×™× × ×ž×¦×ו: -Elements processed: -××œ×ž× ×˜×™× ×¢×•×‘×“×•: -Elements remaining: -××œ×ž× ×ª×™× × ×•×ª×¨×•: -Email -:דו×"ל -Encoding extended time information: %x - -Endless loop when traversing directory: -× ×•×¦×¨×ª לול××” ××™× ×¡×•×¤×™×ª בחצית מחיצות -Equal files/folders that differ in attributes only - -Error -טעות -Error changing modification time: -טעות ×‘×©×™× ×•×™ זמן: -Error copying file permissions: - -Error copying file: -טעות בהעתקת קובץ: -Error copying locked file %x! -טעות בהעתקת קובץ × ×¢×•×œ %x! -Error copying symbolic link: -טעות בהעתקת קישור : -Error creating directory: -טעות ביצירת מחיצה: -Error deleting directory: -טעות המחיקת מחיצה: -Error deleting file: -טעות במחיקת קובץ: -Error handling -טעות בטיפול בשגי×ות -Error loading library function: -טעות ×‘×˜×¢×™× ×ª ספרית ×¤×•× ×§×¦×™×•×ª: -Error moving directory: -טעות בהעברת מחיצה: -Error moving file: -טעות בהעברת קובץ: -Error moving to Recycle Bin: -טעות בהעברה לסל המיחזור: -Error opening file: -טעות בפתיחת קובץ: -Error parsing configuration file: -טעות ×‘× ×™×ª×•×— קובץ ×§×•× ×¤×™×’×•×¨×¦×™×”: -Error reading file attributes: -טעות בקרי×ת ×ª×›×•× ×•×ª קובץ: -Error reading file: -טעות בקרי×ת קובץ: -Error reading from synchronization database: -טעות בקרי××” מבסיס ×”× ×ª×•× ×™× ×©×œ ×”×¡× ×›×¨×•×Ÿ: -Error reading security context: - -Error resolving symbolic link: -טעות ×‘×¤×¢× ×•×— מר××” ×ž×§×•× ×¡×™×ž×œ×™ (Symbolic Link) -Error setting directory lock: - -Error setting privilege: - -Error starting Volume Shadow Copy Service! -טעות ×‘×˜×¢×™× ×ª מעתיק ×¦×œ×œ×™× (Shadow Copy Service)! -Error traversing directory: -טעות בהצלבת מחיצות -Error when monitoring directories. -טעות ×‘× ×™×ª×•×¨ מחיצות. -Error writing file: -טעות בכתיבת קובת: -Error writing security context: - -Error writing to synchronization database: -טעות ×‘×¨×™×©×•× ×œ×‘×¡×™×¡ × ×ª×•× ×™ ×¡× ×›×¨×•×Ÿ: -Example -דוגמה -Exclude -×”×•×¦× -Exclude all rows -×”×•×¦× ×›×œ שורות -Exclude temporarily -×”×•×¦× ×–×ž× ×™×ª -Exclude via filter: -×”×•×¦× ×‘×¢×–×¨×ª ×¡× ×Ÿ: -Exit instantly -×¦× ×ž×™×“×™×ª -Extension -סיומת -External applications -×ª×•×›× ×” ×—×™×¦×•× ×™×ª -Fatal Error -שגי××” פטלית -Feedback and suggestions are welcome at: -:תגובות והצעות ותקבלו בברכה -File %x has an invalid date! -קובץ %x מכיל מידע שגוי! -File already exists. Overwrite? -קובץ ×§×™×™× ×”×× ×œ×“×¨×•×¡? -File content -תכולת הקובץ -File does not exist: -קובץ ×œ× ×§×™×™×: -File list exported! -רשימת ×§×‘×¦×™× ×™×•×¦××”! -File size and date -גודל קובץ ות×ריך -Filename -×©× ×§×•×‘×¥ -Files %x have the same date but a different size! -קובץ %x בעל ת×ריך ×–×”×” ×ך גודל ×©×•× ×” -Files are found equal if\n - file content\nis the same -×§×‘×¦×™× × ×—×©×‘×™× ×›×–×”×™× \n - במקרה והתוכן ×–×”×” -Files are found equal if\n - filesize\n - last write time and date\nare the same -×§×‘×¦×™× × ×—×©×‘×™× ×›×–×”×™× \n - גודל הקובץ \n - זמן כתיבה ות×ריך ×–×”×™× -Files that are equal on both sides -×§×‘×¦×™× ×–×”×™× ×‘×©×™× ×”×¦×“×“×™× -Files that exist on both sides, left one is newer -×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×©× ×™ ×”×¦×“×“×™× -השמ×לי חדש יותר -Files that exist on both sides, right one is newer -×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×©× ×™ ×”×¦×“×“×™× -×”×™×ž× ×™ חדש יותר -Files that have different content -×§×‘×¦×™× ×‘×¢×œ×™ תוכן ×©×•× ×” -Files/folders that exist on left side only -×§×‘×¦×™× ×•×ª×™×§×™×•×ª ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” השמ×לית בלבד -Files/folders that exist on right side only -×§×‘×¦×™× ×•×ª×™×§×™×•×ª ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” ×”×™×ž× ×™×ª בלבד -Filter files -קבצי ×”×ž×¡× ×Ÿ -Filter is active -×ž×¡× ×Ÿ פעיל -Filter settings have changed! -קביעת ×”×ž×¡× ×Ÿ ×©×•× ×•! -Filter: All pairs -כל הזוגות :×ž×¡×•× ×Ÿ -Filter: Single pair -זוג ×חד :×ž×¡×•× ×Ÿ -Find -חפש -Find what: -חפש מה: -Folder Comparison and Synchronization -×¡× ×›×¨×•×Ÿ ×§×‘×¦×™× ×•×ž×—×™×¦×•×ª -Folder pairs - -Follow - -Free disk space available: -×ž×§×•× ×¤× ×•×™ בדיסק: -Free disk space required: - -FreeFileSync Batch Job -FreeFileSync עבודת ×צווה -FreeFileSync at Sourceforge -FreeFileSync ב Sourceforge -FreeFileSync batch file -FreeFileSync קובץ ×צווה -FreeFileSync configuration -FreeFileSync הגדרות -FreeFileSync is up to date! -FreeFileSync מעודכן בגירסה ×”××—×¨×•× ×”! -Full path -שביל ×ž×œ× -Generating database... -מיצר בסיס × ×ª×•× ×™×... -Generating file list... -מיצר רשימת קבצי×... -Global settings -×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™× -Help -עזרה -Hidden dialogs: -די××œ×•×’×™× ×ž×•×¡×ª×¨×™×: -Hide all error and warning messages -הסתר ×ת כל הודעות ההזהרה והטעות -Hide conflicts -הסתר ×§×•× ×¤×œ×™×§×˜×™× -Hide excluded items -×”×—×‘× ×¤×¨×™×˜×™× ×œ× × ×‘×—×¨×™× -Hide files that are different -×”×—×‘× ×¤×¨×˜×™× ×©×•× ×™× -Hide files that are equal -×”×—×‘× ×¤×¨×˜×™× ×©××™× × ×©×•×•×™× -Hide files that are newer on left -×”×—×‘× ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד שמ×ל -Hide files that are newer on right -×”×—×‘× ×§×‘×¦×™××“×©×™× ×™×•×ª×¨ בצד ימין -Hide files that exist on left side only -×”×—×‘× ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד שמ×ל -Hide files that exist on right side only -×”×—×‘× ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד ימין -Hide files that will be created on the left side -×”×—×‘× ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד שמ×ל -Hide files that will be created on the right side -×”×—×‘× ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד ימין -Hide files that will be deleted on the left side -×”×—×‘× ×§×‘×¦×™× ×©×™×ž×—×§×• בצד שמ×ל -Hide files that will be deleted on the right side -×”×—×‘× ×§×‘×¦×™× ×©×™×ž×—×§×• בצד ימין -Hide files that will be overwritten on left side -×”×—×‘× ×§×‘×¦×™× ×שר ידרסו בצד ימין -Hide files that will be overwritten on right side -הסתר ×§×‘×¦×™× ×שר ידרסו בעמודה ×”×™×ž× ×™×ª -Hide files that won't be copied -×”×—×‘× ×§×‘×¦×™× ×שר ×œ× ×™×•×¢×ª×§×• -Hide filtered or temporarily excluded files -×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו ×œ× ×‘×—×•×¨×™× -Hide further error messages during the current process -×”×—×‘× ×”×¢×¨×•×ª ו×זהרות בהמשך התהליך ×”× ×•×›×—×™ -Hints: -טיפי×: -Homepage -:×תר-הבית -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -×–×”×” והפץ ×©×™× ×•×™×™× ×‘×©× ×™×™ ×”×¦×“×“×™× ×‘×¢×–×¨×ª בסיס × ×ª×•× ×™× ×ž×—×™×§×•×ª ×•×§×•× ×¤×œ×™×§×˜×™× ×ž×–×•×”×™× ×‘×ופן ×וטומטי -Idle time between detection of last change and execution of command line in seconds - -If you like FFS -:תרומה תתקבל בברכה -Ignore - -Ignore errors -×”×ª×¢×œ× ×ž×˜×¢×•×™×•×ª -Ignore subsequent errors -התעלפ מטעויות × ×™×©× ×•×ª -Include -כלול -Include all rows -כלול ×ת כל השורות -Include temporarily -כלול ×–×ž× ×™×ª -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -כלול: *.doc;*.zip;*.exe\n ×ל תכלול: \\stuff\\temp\\* -Incompatible synchronization database format: -מסד × ×ª×•× ×™× ×©×œ ×”×¡× ×›×¨×•×Ÿ ×œ× ×ª×•××: -Info -מידע -Information -הסבר -Initial synchronization: -×¡× ×›×¨×•×Ÿ ר××©×•× ×™: -Integrate external applications into context menu. The following macros are available: -:הטמע ×ª×•×›× ×•×ª ×—×™×¦×•× ×™×•×ª לתפריט המקרו הב××™× ×ž×•×›× ×™× -Invalid FreeFileSync config file! - -Last used configurations (press DEL to remove from list) - -Leave as unresolved conflict -הש×ר ×›×§×•× ×¤×œ×™×§×˜ ×œ× ×ž×˜×•×¤×œ -Left -שמ×ל -Legend -×ž×§×¨× -Load configuration from file -טען ×§×•× ×¤×™×’×•×¨×¦×™×” מקובץ -Log-messages: -הודעת יומן: -Logging -×¨×™×©×•× ×‘×™×•×ž×Ÿ -Main bar - -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -×œ× × ×ª×ž×›×ª בגרסה ×–×ת ×× × ×”×ª×§×Ÿ גרסה 64 WOW64 העתקת צל ב -Match case -×ותיות הת×× -Maximum number of logfiles: - -Memory allocation failed! - -Minimum Idle Time [seconds] - -Mirror ->> -מר××” ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. - -Monitoring active... -× ×˜×¨ ×רכיב... -More than 50% of the total number of files will be copied or deleted! -יותר מ 50% ×ž×”×§×‘×¦×™× ×™×ž×—×§×• ×ו יועתקו -Move column down -הורד עמודה -Move column up -העלה עמודה -Move files into a time-stamped subdirectory -העבר ×§×‘×¦×™× ×œ×ª×•×š מחיצות ×¢× ×©× ×”×ž×›×™×œ טביעת זמן ות×ריך -Moving %x to Recycle Bin -העבר %x לסל המיחזור -Moving Symbolic Link %x to user-defined directory %y - -Moving file %x to user-defined directory %y -העבר קובץ %x למחיצה מות×מת ×ישית %y -Moving folder %x to user-defined directory %y -העבר תיקיה %x למחיצה מות×מת ×ישית %y -Multiple... -הכפל... -No change since last synchronization! -×ין ×©×™× ×•×™ מ××– ×”×¡× ×›×¨×•×Ÿ ×”×חרון! -No filter selected -×œ× × ×‘×—×¨ ×ž×¡× ×Ÿ פעיל -Not enough free disk space available in: -:×ין מספיק זכרון ×¤× ×•×™ ב -Nothing to synchronize according to configuration! -×ין מה ×œ×¡× ×›×¨×Ÿ ×¢"פ ×”×§×•× ×¤×™×’×•×¨×¦×™×”! -Number of files and directories that will be created -מספר התקיות ×•×”×§×‘×¦×™× ×שר ×¢×•×ž×“×™× ×œ×”×™×•×¦×¨ -Number of files and directories that will be deleted -מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª ×”×¢×•×ž×“×™× ×œ×”×™×ž×—×§ -Number of files that will be overwritten -מספר ×”×§×‘×¦×™× ×”×¢×•×ž×“×™× ×œ×”×™×“×¨×¡ -One of the FreeFileSync database entries within the following file is not yet existing: -×חד מקובצי בסיס ×”× ×ª×•× ×™× ×”×ž×•×›× ×¡×™× ×”×‘× ×¢×“×™×™×Ÿ ×œ× ×§×™×™× -One of the FreeFileSync database files is not yet existing: -×חד מקובצי בסיס ×”× ×ª×•× ×™× ×”×‘× ×¢×“×™×™×Ÿ ×œ× ×§×™×™× -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -תיקיות ×•×§×‘×¦×™× ×שר עברו ×¡×™× ×•×Ÿ יבחרו ×œ×¡× ×›×¨×•×Ÿ ×”×¡×™× ×•×Ÿ יוכל ×œ× ×ª×™×‘ היחסי לת'יות ×”×ž×¡×•× ×›×¨× ×•×ª -Open with Explorer -פתח בעזרת ×ª×•×›× ×ª הגלישה -Open with default application -פתח בעזרת ×”×ª×•×›× ×” ×”× ×‘×—×¨×ª -Operation aborted! -הפעולה בוטלה! -Operation: -פעולה: -Overview -מבט כללי -Overwriting Symbolic Link %x in %y - -Overwriting file %x in %y - -Pause -עצור -Paused -עצור -Planned directory deletion is in conflict with its subdirectories and -files! -מחיצה המיועדת למחיקה מצויה בסתירה לתקיות ×”×ž×©× ×” ×•×œ×§×‘×¦×™× -Please run a Compare first before synchronizing! -הרץ השוו××” ×œ×¤× ×™ ×¡× ×›×¨×•×Ÿ! -Press \"Switch\" to open FreeFileSync GUI mode. -\"לחץ\" לפתיחת FreeFileSync בממשק גרפי. -Processing folder pair: -מבצע זיווז מחיצות: -Published under the GNU General Public License: -GNU ×ž×¤×•×¨×¡× ×‘×ž×¡×’×¨×ª: -Question -ש×לה -RealtimeSync - Automated Synchronization -RealtimeSync - ×¡×™× ×›×¨×•×Ÿ ×וטומטי -RealtimeSync configuration -RealtimeSync בקרת תצורה -Recycle Bin not yet supported for this system! -סל המחזור ×œ× ×‘×ª×ž×š כרגע במערכת הפעלה זו! -Relative path -× ×ª×™×‘ יחסי -Remove alternate settings -תצורה מרוחקת ××œ×˜×¨× ×˜×™×‘×™×ª -Remove folder -הסר מחיצה -Remove folder pair -הסר זוג מחיצות -Report translation error -:דווח שגי×ת ×ª×¨×’×•× -Reset -×פס -Reset view - -Restore all hidden dialogs? - -Right -ימין -S&ave configuration... -שמ&ןר תצורה... -S&witch view -החל&×£ תצוגה -Save changes to current configuration? -שמור ×©×™× ×•×™×™× ×œ×ª×•×¨×” × ×•×›×—×™×ª? -Save current configuration to file -שמור תצורה לקובץ -Scanning... -סורק... -Scanning: -סורק: -Select a folder -בחר מחיצה -Select alternate synchronization settings -בחר ×ž×©×ª× ×™ ×¡× ×›×¨×•×Ÿ ××œ×˜×¨× ×˜×™×‘×™×™× -Select logfile directory: -בחר מחיצה לתיקית-יומן -Select variant: -בחר ×ž×©×ª× ×”: -Select view - -Set direction: -בחר כוון: -Setting default synchronization directions: Old files will be overwritten with newer files. -בחר בררת מחדל של ×¡× ×›×¨×•×Ÿ ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨. -Show \"%x\" - -Show conflicts -הר××” ×§×•× ×¤×œ×™×§×˜×™× -Show files that are different -הר××” ×§×‘×¦×™× ×©×•× ×™× -Show files that are equal -הר××” ×§×‘×¦×™× ×©×•×•×” -Show files that are newer on left -הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ על העמודה השמ×לית -Show files that are newer on right -הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ על העמודה ×”×™×ž× ×™×ª -Show files that exist on left side only -הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” השמ×לית בלבד -Show files that exist on right side only -הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” ×”×™×ž× ×™×ª בלבד -Show files that will be created on the left side -הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בעמודה השמ×לית -Show files that will be created on the right side -הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בעמודה ×”×™×ž× ×™×ª -Show files that will be deleted on the left side -הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בעמודה השמ×לית -Show files that will be deleted on the right side -הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בעמודה ×”×™×ž× ×™×ª -Show files that will be overwritten on left side -הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בעמודה השמ×לית -Show files that will be overwritten on right side -הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בעמודה ×”×™×ž× ×™×ª -Show files that won't be copied -הר××” ×§×‘×¦×™× ×©×œ× ×™×•×¢×ª×§×• -Show hidden dialogs -הר××” די××•×œ×•×’×™× × ×¡×ª×¨×™× -Show popup -הר××” ×—×œ×•× ×•×ª ×§×•×¤×¦×™× -Show popup on errors or warnings -הר××” ×—×œ×•× ×•×ª ×§×•×¤×¦×™× ×‘×–×ž×Ÿ טעות ×ו תקלה -Significant difference detected: -התגלה ×©×•× ×™ גדול מידי: -Silent mode -מוד שקט -Size -גודל -Source code written completely in C++ utilizing: -C++ קוד מקור × ×¨×©× ×‘×ž×”×“×¨ -Source directory does not exist anymore: -מחיצת המקור ×œ× × ×ž×¦×ת: -Speed: -מהירות: -Start -התחל -Start minimized and write status information to a logfile - -Start synchronization -התחל ×¡× ×›×¨×•×Ÿ -Statistics -סטטיסטיקה -Status feedback -היזון חוזר -Stop -עצור -Swap sides -החלף ×¦×“×“×™× -Switching to FreeFileSync GUI mode... -החלף לתצורת ממשק חזותי... -Symbolic Link handling - -Symlinks %x have the same date but a different target! - -Synchronization Preview -תצוגה מקדימה של ×¡× ×›×¨×•×Ÿ -Synchronization aborted! -×¡×™× ×›×¨×•×Ÿ בוטל! -Synchronization completed successfully! -×¡×™× ×›×¨×•×Ÿ ×”×•×©×œ× ×‘×”×¦×œ×—×”! -Synchronization completed with errors! -×¡× ×›×¨×•×Ÿ ×”×•×©×œ× ×¢× ×©×’×™×ות! -Synchronization settings -×ž×©×ª× ×™ ×¡× ×›×¨×•×Ÿ -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -×¡× ×›×¨×Ÿ .doc, .zip und .exe כל ×”×§×‘×¦×™× ×‘×ª×™×§×™×ª ×ž×©× ×” \"temp\". -Synchronize... -...×¡× ×›×¨×Ÿ -Synchronizing... -×ž×¡× ×›×¨×Ÿ... -Target directory already existing! -מחיצת מטרה כבר קיימת! -Target file already existing! -קובץ מטרה כבר קיי×! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -בכל ×¤×¢× ×©×›×œ המחיצות מ×ופשרות למשל ×‘×”×›× ×¡×ª מקלון זכרון \n שורת הפקודות מתבצעת -The file does not contain a valid configuration: -קובץ ×–×” ×œ× ×ž×›×™×œ ×§×•× ×¤×™×’×•×¨×¦×™×” ברת תוקף -The file was not processed by last synchronization! -קובץ ×–×” ×œ× ×˜×•×¤×œ ×‘×¡× ×›×¨×•×Ÿ ×”×חרון! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -הורי×ציה ×”×–×ת מעריכה ×ת 2 ×”×§×‘×¦×™× ×‘×ž×™×“×” שווה ×›×שר ×©×ž× ×–×”×” ויש ×œ×”× ×’×•×“×œ ×–×”×” ות×ריך ×”×¨×™×©×•× ×”×חרון ×–×”×” -Time -זמן -Time elapsed: -זמן עבר: -Time remaining: -זמן × ×•×ª×¨: -Total amount of data that will be transferred -סך הכל × ×ª×•× ×™× ×œ×”×¢×‘×¨×” -Total time: -זמן מקומי: -Transfer file and directory permissions\n(Requires Administrator rights) - -Unable to connect to sourceforge.net! -×ין תקשורת ל sourceforge.net! -Unable to create logfile! -×œ× ×ž×¡×•×’×œ ליצור יומן! -Unresolved conflicts existing! -×§×™×™× ×§×•× ×¤×œ×™×§×˜ ×œ× ×¤×ª×•×¨! -Update -> -שדרג-> -Updating attributes of %x - -Usage: -שימוש: -Use Recycle Bin -השתמש בסל המיחזור -Use Recycle Bin when deleting or overwriting files -השתמש בסל המיחזור ×›×שר מוחק ×ו דורס ×§×‘×¦×™× -User-defined directory for deletion was not specified! -מחיצה מות×מת ×ישית למחיקה ×œ× ×ž×•×’×“×¨×ª! -Variant -×ž×©×ª× ×” -Verifying file %x -מ×מת קובץ %x -Versioning - -Volume name %x not part of filename %y! -×›× ×•× ×Ÿ %x ×œ× ×‘× ×ª×™×‘ של קובץ %y! -Waiting for missing directories... - -Waiting while directory is locked (%x)... - -Warning -×זהרה -When the comparison is started with this option set the following decision tree is processed: -:×›×שר ההשוו××” מתחילה בעזרת הבחירות ×”× ×‘×—×¨×•×ª ×¢×¥ ההחלטות ×”×‘× ×ž×ª×‘×¦×¢ -You can ignore conflicts and continue synchronization. -ב×פשרותך ×œ×”×ª×¢×œ× ×ž×”×§×•× ×¤×œ×™×§×˜×™× ×•×œ×”×ž×©×™×š ×‘×¡× ×›×¨×•×Ÿ -You can ignore this error to consider the directory as empty. - -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -!ב×פשרותך ×œ× ×¡×•×ª ×œ×¡× ×›×¨×Ÿ ×ת ×”×¢×¦×ž×™× ×”× ×•×ª×¨×™× ×ž×‘×œ×™ להשוות מחדש -different -×©×•× ×” -file exists on both sides -קובץ × ×ž×¦× ×‘×“× ×™ ×”×¦×“×“×™× -on one side only -בצד ×חד בלבד diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index 545d3b29..093db082 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -1,910 +1,1030 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- A GNU fordÃtócsomag Windows portja\n wxWidgets \t- NyÃlt forráskódú GUI keretrendszer\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- NyÃlt forráskódú IDE -%x / %y objects deleted successfully -%X / %Y objektum sikeresen törölve -%x Bytes -%x bájt -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x nap -%x directories -%x mappa -%x files -%x fájl -%x hour(s) -%x óra -%x kB -%x kB -%x min -%x perc -%x of %y rows in view -%x sor látható a(z) %y sorból -%x of 1 row in view -%x sor látható az 1 sorból -%x sec -%x másodperc -%x% -%x% -&Abort -&MegszakÃt -&About... -&A programról... -&Advanced -&Haladó -&Cancel -&Mégsem -&Check for new version -&Új verzió keresése -&Content -&Tartalom -&Create batch job... -&Kötegelt feladat létrehozása... -&Default -&Alapértelmezett -&Exit -&Kilépés -&Export file list... -&Fájllista exportálása... -&File -&Fájl -&Find next -&KövetkezÅ‘ keresése -&Global settings... -&Globális beállÃtások... -&Help -&Súgó -&Ignore -&Kihagy -&Language -&Nyelv -&Load -&Betöltés -&Load configuration... -&BeállÃtások betöltése... -&New -&Új -&No -&Nem -&OK -&OK -&Pause -&Szünet -&Program -&Program -&Quit -&Kilépés -&Restore -&VisszaállÃtás -&Retry -&Ismét -&Save -&Mentés -&Switch -&Váltás -&Yes -&Igen -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Internetkapcsolat szükséges!) -- Other side's counterpart to %dir -- A %dir másik oldalon szereplÅ‘ párja -- Other side's counterpart to %name -- A %name másik oldalon szereplÅ‘ párja -- conflict -- ütközés -- conflict (same date, different size) -- ütközés (ugyanaz a dátum, különbözÅ‘ méret) -- different -- különbözÅ‘ -- directory part only -- csak a mappa részét -- equal -- egyezik -- exists left only -- csak a bal oldalon létezik -- exists right only -- csak a jobb oldalon létezik -- full file or directory name -- teljes fájl- vagy mappanév -- left -- bal oldali -- left newer -- a bal oldali újabb -- right -- jobb oldali -- right newer -- a jobb oldali újabb -/sec -/másodperc -1 directory -1 mappa -1 file -1 fájl -1. &Compare -1. &ÖsszehasonlÃtás -1. Enter relative file or directory names separated by ';' or a new line. -1. A relatÃv fájl- és mappanevek megadása pontosvesszÅ‘vel elválasztva vagy új sorban. -1. Select directories to monitor. -1. Válaszd ki a figyelendÅ‘ mappákat. -2. &Synchronize... -2. &Szinkronizálás -2. Enter a command line. -2. Add meg a parancssort. -2. Use wildcard characters '*' and '?'. -2. A csillag ('*') és a kérdÅ‘jel ('?') helyettesÃtÅ‘ karakterek megengedettek. -3. Exclude files directly on main grid via context menu. -3. Fájlok közvetlen kizárása a fÅ‘ listából helyi menü segÃtségével. -3. Press 'Start'. -3. Nyomd meg a Start gombot. -<Automatic> -<Automatikus> -<Directory> -<Mappa> -<Last session> -<Utolsó munkamenet> -<Symlink> -<Symlink> -<multiple selection> -<többszörös kijelölés> -A directory input field is empty. -Valamelyik mappa megadására szolgáló mezÅ‘ üres. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Egy olyan mappa kerül módosÃtásra, amely tagja több mappa párosnak! Kérjük, nézd át a szinkronizációs beállÃtásokat! -A newer version of FreeFileSync is available: -ElérhetÅ‘ a FreeFileSync egy újabb verziója: -Abort requested: Waiting for current operation to finish... -MegszakÃtási kérelem: Várakozás a folyamatban lévÅ‘ művelet befejezésére... -Abort synchronization immediately -Szinkronizáció azonnali megszakÃtása -Aborted -MegszakÃtva -About -A programról -Action -Művelet -Add folder -Mappa hozzáadása -Add folder pair -Mappa pár megadása -All directories in sync! -Minden mappa szinkronban! -An exception occurred! -Kivétel keletkezett! -As a result the files are separated into the following categories: -Eredményképpen a fájlok a következÅ‘ kategóriákra bomlanak: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezÅ‘ként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Ãgy a fájlok dátuma nem számÃt semmit.\n\nEnnek az opciónak az engedélyezésével a döntési fa kisebb lesz: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Egy kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indÃtáshoz egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelÅ‘jével. -At least one directory input field is empty. -Legalább az egyik mappa beviteli mezÅ‘ üres. -Auto-adjust columns -Oszlopok automatikus igazÃtása -Batch execution -Kötegelt végrehajtás -Batch file created successfully! -A kötegelt feladat fájl létrehozása sikerült! -Batch job -Kötegelt feladat -Big thanks for localizing FreeFileSync goes out to: -Nagy köszönet a FreeFileSync lokalizációjáért\na következÅ‘ személyeknek: -Both sides have changed since last synchronization! -Mindkét oldal megváltozott az utolsó szikronizálás óta! -Browse -Tallózás -Browse directory -Mappa tallózása -Cannot determine sync-direction: -Nem lehet meghatározni a szinkronizáció irányát: -Cannot find %x -Nem található: %x -Category -Kategória -Clear filter settings -SzűrÅ‘beállÃtások törlése -Comma separated list -Comma separated values -Command line -Parancssor -Command line is empty! -A parancssor üres! -Compare -ÖsszehasonlÃtás -Compare both sides -Mindkét oldal összehasonlÃtása -Compare by \"File content\" -ÖsszehasonlÃtás \"fájltartalom\" alapján -Compare by \"File size and date\" -ÖsszehasonlÃtás \"fájlméret és dátum alapján\" -Compare by... -ÖsszehasonlÃtás -Comparing content of files %x -%x fájlok tartalmának összehasonlÃtása -Comparing content... -Tartalom összehasonlÃtása... -Comparing files by content failed. -Sikertelen a fájlok összehasonlÃtása tartalom alapján. -Comparison Result -Az összehasonlÃtás eredménye -Comparison settings -ÖsszehasonlÃtási beállÃtások -Completed -Befejezve -Configuration -BeállÃtás -Configuration loaded! -BeállÃtások betöltve! -Configuration overview: -BeállÃtások áttekintése: -Configuration saved! -BeállÃtások elmentve! -Configure filter -SzűrÅ‘ beállÃtása -Configure your own synchronization rules. -Saját szinkronizálási szabályok beállÃtása. -Confirm -MegerÅ‘sÃtés -Conflict detected: -Ãœtközés történt: -Conflicts/files that cannot be categorized -Kategorizálhatatlan ütközések/fájlok -Continue -Folytatás -Conversion error: -Konverziós hiba: -Copy attributes only from left to right -Attribútumok másolása kizárólag balról jobbra -Copy attributes only from right to left -Attribútumok másolása kizárólag jobbról balra -Copy filesystem permissions -Fájlrendszer jogosultságok másolása -Copy from left to right -Másolás a bal oldalról a jobb oldalra -Copy from left to right overwriting -Másolás a bal oldalról a jobb oldalra felülÃrással -Copy from right to left -Másolás a jobb oldalról a bal oldalra -Copy from right to left overwriting -Másolás a jobb oldalról a bal oldalra felülÃrással -Copy locked files -Zárolt fájlok másolása -Copy new or updated files to right folder. -Új vagy frissÃtett fájlok másolása a jobb oldali mappába. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással\n(Adminisztrátori jogok szükségesek) -Copy to clipboard\tCTRL+C -Másolás a vágólapra\tCTRL+C -Copying new Symbolic Link %x to %y -A(z) %x új symlink másolása a(z) %y symlinkbe -Copying new file %x to %y -A(z) %x új fájl másolása a(z) %y fájlba -Could not determine volume name for file: -A következÅ‘ fájlnak nem lehet meghatározni a kötetnevét: -Could not initialize directory monitoring: -A mappafigyelés inicializálása sikertelen: -Could not load a required DLL: -A szükséges DLL betöltése sikertelen: -Could not read values for the following XML nodes: -A következÅ‘ XML-csomópontok értékének beolvasása sikertelen: -Create a batch job -Kötegelt feladat létrehozása -Creating folder %x -%x mappa létrehozása -Custom -Egyedi -Customize columns -Oszlopok testreszabása -Customize... -Testreszabás... -D-Click -D-Klikk -DECISION TREE -DÖNTÉSI FA -Data verification error: Source and target file have different content! -AdatellenÅ‘rzési hiba: A forrás és cél fájl tartalma különbözik! -Date -Dátum -Delete files/folders existing on left side only -Csak a bal oldalon létezÅ‘ fájlok/mappák törlése -Delete files/folders existing on right side only -Csak a jobb oldalon létezÅ‘ fájlok/mappák törlése -Delete files\tDEL -Fájlok törlése\tDEL -Delete on both sides -Törlés mindkét oldalon -Delete on both sides even if the file is selected on one side only -Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve -Delete or overwrite files permanently -A fájlok folyamatos törlése vagy felülÃrása -Delete permanently -Folyamatosan törölni -Deleting Symbolic Link %x -Symlink törlése: %x -Deleting file %x -Fájl törlése %x -Deleting folder %x -Mappa törlése %x -Deletion handling -Törlések kezelése -Description -Megjegyzés -Direct -Közvetlen -Directories are dependent! Be careful when setting up synchronization rules: -A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat: -Directories to watch -FigyelendÅ‘ mappák -Directory -Mappa -Directory does not exist: -A mappa nem létezik: -Do not show this dialog again -Ne mutasd újra ezt a párbeszédablakot -Do nothing -Nincs mit csinálni -Do you really want to delete the following object(s)? -Valóban törölni akarja a az alábbi objektumo(ka)t? -Do you really want to move the following object(s) to the Recycle Bin? -Valóban a Lomtárba (Recycle Bin) akarja mozgatni az alábbi objektumo(ka)t? -Do you want FreeFileSync to automatically check for updates every week? -Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissÃtést? -Donate with PayPal -Ha szereted a FreeFileSync-et, támogasd a PayPal segÃtségével. -Download now? -Letöltsem most? -Drag && drop -Húzd && Ejtsd -Elements found: -Talált elemek száma: -Elements processed: -Feldolgozott elemek száma: -Elements remaining: -HátralévÅ‘ elemek száma: -Email -E-mail -Encoding extended time information: %x -KibÅ‘vÃtett idÅ‘információk kódolása: %x -Endless loop when traversing directory: -Végtelen hurok a mappák bejárásakor: -Equal files/folders that differ in attributes only -Egyforma fájlok/mappák, melyek csak attribútumaikban különböznek -Error -Hiba -Error changing modification time: -Az utolsó változtatás dátumának módosÃtása sikertelen: -Error copying file permissions: -Hiba történt a fájl jogosultságainak másolása közben: -Error copying file: -A fájl másolása sikertelen: -Error copying locked file %x! -Hiba történt a(z) %x zárolt fájl másolása közben! -Error copying symbolic link: -Hiba történt a szimbolikus link másolása közben: -Error creating directory: -A mappa létrehozása sikertelen: -Error deleting directory: -A mappa törlése sikertelen: -Error deleting file: -A fájl törlése sikertelen: -Error handling -Hibakezelés -Error loading library function: -A könyvtári funkció betöltése sikertelen: -Error moving directory: -Hiba a mappa mozgatásakor: -Error moving file: -Hiba a fájl mozgatásakor: -Error moving to Recycle Bin: -A Lomtárba (Recycle Bin) mozgatás sikertelen: -Error opening file: -A fájl megnyitása sikertelen: -Error parsing configuration file: -A beállÃtásokat tartalmazó fájl feldolgozása sikertelen: -Error reading file attributes: -A fájl attribútumainak olvasása sikertelen: -Error reading file: -A fájl olvasása sikertelen: -Error reading from synchronization database: -Hiba történt a szinkronizációs adatbázis olvasása közben: -Error reading security context: -A biztonsági cÃmke olvasása sikertelen: -Error resolving symbolic link: -A szimbolikus link feloldása sikertelen: -Error setting directory lock: -Hiba történt a mappa zárolása közben: -Error setting privilege: -Hiba történt a jogok beállÃtása közben: -Error starting Volume Shadow Copy Service! -Hiba történt a Volume Shadow Copy szolgáltatás indÃtása közben! -Error traversing directory: -A mappa átnézése sikertelen: -Error when monitoring directories. -Hiba történt a mappák figyelése közben. -Error writing file: -A fájl Ãrása sikertelen: -Error writing security context: -A biztonsági cÃmke Ãrása sikertelen: -Error writing to synchronization database: -Hiba történt a szinkronizációs adatbázis Ãrása közben: -Example -Példa -Exclude -Kizár -Exclude all rows -Minden sor kizárása -Exclude temporarily -Ideiglenesen kizár -Exclude via filter: -Kizárás szűrÅ‘ segÃtségével: -Exit instantly -Kilépés azonnal -Extension -Kiterjesztés -External applications -KülsÅ‘ alkalmazások -Fatal Error -Kritikus hiba -Feedback and suggestions are welcome at: -A visszajelzéseket és javaslatokat ide várjuk: -File %x has an invalid date! -A(z) %x fájlnak érvénytelen a dátuma! -File already exists. Overwrite? -A fájl már létezik. FelülÃrjuk? -File content -fájl tartalma alapján -File does not exist: -A következÅ‘ fájl nem létezik: -File list exported! -A fájllista exportálása befejezÅ‘dött! -File size and date -fájlméret és dátum alapján -Filename -Fájlnév -Files %x have the same date but a different size! -A(z) %x fájlok dátuma megegyezik, de a mérete nem! -Files are found equal if\n - file content\nis the same -A fájlok megegyezÅ‘ ha\n - a fájlok tartalma\nmegegyezik -Files are found equal if\n - filesize\n - last write time and date\nare the same -A fájlok megegyezÅ‘ ha\n - a fájlméret\n - az utolsó módosÃtás dátuma\nmegegyezik -Files that are equal on both sides -MegegyezÅ‘ fájlok mindkét oldalon -Files that exist on both sides, left one is newer -Mindkét oldalon létezÅ‘ fájlok, de a bal oldali újabb -Files that exist on both sides, right one is newer -Mindkét oldalon létezÅ‘ fájlok, de a jobb oldali újabb -Files that have different content -Fájlok, amelyeknek különbözÅ‘ a tartalmuk: -Files/folders that exist on left side only -Csak a bal oldalon létezÅ‘ fájlok/mappák -Files/folders that exist on right side only -Csak a jobb oldalon létezÅ‘ fájlok/mappák -Filter files -Fájlok szűrése -Filter is active -A szűrÅ‘ aktÃv -Filter settings have changed! -A szűrÅ‘beállÃtások megváltoztak! -Filter: All pairs -SzűrÅ‘: Minden pár -Filter: Single pair -SzűrÅ‘: Egy pár -Find -Keresés: -Find what: -Mit keresünk: -Folder Comparison and Synchronization -Mappa összehasonlÃtás és szinkronizáció -Folder pairs -Mappa párok -Follow -Követés -Free disk space available: -Szabad lemezterület: -Free disk space required: -Szükséges szabad lemezterület: -FreeFileSync Batch Job -FreeFileSync kötegelt feladat -FreeFileSync at Sourceforge -FreeFileSync a Sourceforge-on -FreeFileSync batch file -FreeFileSync kötegelt fájl -FreeFileSync configuration -FreeFileSync beállÃtások -FreeFileSync is up to date! -A FreeFileSync naprakész! -Full path -Teljes elérési útvonal -Generating database... -Adatbázis generálása... -Generating file list... -Fájllista generálása... -Global settings -Globális beállÃtások -Help -Súgó -Hidden dialogs: -Rejtett párbeszédablakok: -Hide all error and warning messages -Összes hibaüzenet és figyelmeztetés elrejtése -Hide conflicts -Ãœtközések elrejtése -Hide excluded items -A kizárt elemek elrejtése -Hide files that are different -A nem egyezÅ‘ fájlok elrejtése -Hide files that are equal -Az egyezÅ‘ fájlok elrejtése -Hide files that are newer on left -A bal oldalon lévÅ‘ újabb fájlok elrejtése -Hide files that are newer on right -A jobb oldalon lévÅ‘ újabb fájlok elrejtése -Hide files that exist on left side only -Csak a bal oldalon létezÅ‘ fájlok elrejtése -Hide files that exist on right side only -Csak a jobb oldalon létezÅ‘ fájlok elrejtése -Hide files that will be created on the left side -A bal oldalon létrehozandó fájlok elrejtése. -Hide files that will be created on the right side -A jobb oldalon létrehozandó fájlok elrejtése. -Hide files that will be deleted on the left side -A bal oldalon törlendÅ‘ fájlok elrejtése. -Hide files that will be deleted on the right side -A jobb oldalon törlendÅ‘ fájlok elrejtése. -Hide files that will be overwritten on left side -A bal oldalon felülÃrandó fájlok elrejtése -Hide files that will be overwritten on right side -A jobb oldalon felülÃrandó fájlok elrejtése -Hide files that won't be copied -A nem másolandó fájlok elrejtése -Hide filtered or temporarily excluded files -A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése -Hide further error messages during the current process -A további hibaüzenetek elrejtése az aktuális folyamat során -Hints: -Tippek: -Homepage -Honlap -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Mindkét oldal változásainak azonosÃtása és tárolása adatbázis segÃtségével. A törlések és ütközések automatikusan észlelÅ‘dnek. -Idle time between detection of last change and execution of command line in seconds -A tétlenség hossza másodpercekben az utolsó változás észlelése és a parancssor végrehajtása között. -If you like FFS -FFS támogatása -Ignore -Figyelmen kÃvül hagy -Ignore errors -Hibák figyelmen kÃvül hagyása -Ignore subsequent errors -KésÅ‘bbi hibák figyelmen kÃvül hagyása -Include -Csatol -Include all rows -Minden sort csatolni -Include temporarily -Ideiglenesen csatolni -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Csatol: *.doc;*.zip;*.exe\nKizár: \\stuff\\temp\\* -Incompatible synchronization database format: -Inkompatibilis szinkronizációs adatbázis formátum: -Info -Információ -Information -Információ -Initial synchronization: -ElsÅ‘ szinkronizáció: -Integrate external applications into context menu. The following macros are available: -KülsÅ‘ alkalmazás integrálása a helyi menübe. Az elérhetÅ‘ makrók a következÅ‘k: -Invalid FreeFileSync config file! -Érvénytelen a FreeFileSync beállÃtásait tartalmazó fájl! -Last used configurations (press DEL to remove from list) -Utoljára használt beállÃtások (DEL billentyűvel törölhetÅ‘ a listából) -Leave as unresolved conflict -Feloldatlan ütközésként hagyni -Left -Bal oldal -Legend -ElÅ‘zmény -Load configuration from file -BeállÃtások betöltése fájlból -Log-messages: -Naplóbejegyzések: -Logging -Naplózás -Main bar -FÅ‘ panel -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et. -Match case -Kis-/nagybetű egyezés -Maximum number of logfiles: -Naplófájlok maximális száma: -Memory allocation failed! -Sikertelen memóriafoglalás! -Minimum Idle Time [seconds] -Minimális tétlenségi idÅ‘ (másodpercek) -Mirror ->> -Tükrözés ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival. -Monitoring active... -Figyelés aktÃv... -More than 50% of the total number of files will be copied or deleted! -Az összes fájl több mint 50%-a másolva vagy törölve lesz! -Move column down -Oszlop mozgatása lefelé -Move column up -Oszlop mozgatása felfelé -Move files into a time-stamped subdirectory -Fájlok másolása idÅ‘bélyeggel ellátott almappába -Moving %x to Recycle Bin -%x mozgatása a Lomtárba (Recycle Bin) -Moving Symbolic Link %x to user-defined directory %y -A(z) %x symlink másolása a felhasználó által megadott %y mappába -Moving file %x to user-defined directory %y -%x fájl mozgatása a felhasználó által megadott %y mappába -Moving folder %x to user-defined directory %y -%x mappa mozgatása a felhasználó által megadott %y mappába -Multiple... -SokszorosÃtás -No change since last synchronization! -Az utolsó szinkronizálás után nem történt változás. -No filter selected -Nincs szűrÅ‘ kiválasztva -Not enough free disk space available in: -Nincs elég szabad lemezterület: -Nothing to synchronize according to configuration! -A beállÃtásoknak megfelelÅ‘en nincs mit szinkronizálni! -Number of files and directories that will be created -A létrehozandó fájlok és mappák száma -Number of files and directories that will be deleted -A törlendÅ‘ fájlok és mappák száma -Number of files that will be overwritten -A felülÃrandó fájlok száma -One of the FreeFileSync database entries within the following file is not yet existing: -A FreeFileSync a következÅ‘ fájlban lévÅ‘ egyik adatbázisbejegyzése nem található: -One of the FreeFileSync database files is not yet existing: -A FreeFileSync egyik adatbázisfájlja nem létezik: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Csak a szűrésnek megfelelÅ‘ fájlok/mappák lesznek kijelölve szinkronizáláshoz. A szűrÅ‘ a szinkronizálás alap mappáihoz relatÃv fájl- és mappanevekre lesz alkalmazva. -Open with Explorer -Megnyitás Explorerrel -Open with default application -Megnyitás az alapértelmezett alkalmazással -Operation aborted! -Művelet megszakÃtva! -Operation: -Művelet: -Overview -Összefoglaló -Overwriting Symbolic Link %x in %y -A(z) %x symlink fölülÃrása a(z) %y mappában -Overwriting file %x in %y -A(z) %x fájl fölülÃrása a(z) %y mappában -Pause -Szünet -Paused -Szüneteltetve -Planned directory deletion is in conflict with its subdirectories and -files! -A tervezett mappának a törlése ütközik az almappáival és fájljaival. -Please run a Compare first before synchronizing! -Kérjük, futtass le egy összehasonlÃtást mielÅ‘tt szinkronizálnál! -Press \"Switch\" to open FreeFileSync GUI mode. -Kérjük, nyomja meg a \"Váltás\" gombot a GUI mód megnyitásához. -Processing folder pair: -Mappapár feldolgozása: -Published under the GNU General Public License: -Kiadva a GNU General Public License alatt: -Question -Kérdés -RealtimeSync - Automated Synchronization -RealtimeSync - Automatikus szinkronizálás -RealtimeSync configuration -RealtimeSync beállÃtások -Recycle Bin not yet supported for this system! -A Lomtár (Recycle Bin) nem támogatott ezen a rendszeren! -Relative path -RelatÃv útvonal -Remove alternate settings -AlternatÃv beállÃtások eltávolÃtása -Remove folder -Mappa eltávolÃtása -Remove folder pair -Mappa párok eltávolÃtása -Report translation error -FordÃtói hiba bejelentése -Reset -HelyreállÃtás -Reset view -Nézet visszaállÃtása -Restore all hidden dialogs? -Az összes rejtett párbeszédablakot visszaállÃtsuk? -Right -Jobb oldal -S&ave configuration... -BeállÃtások mentés&e... -S&witch view -Nézet v&áltása -Save changes to current configuration? -Mentsük a beállÃtások változásait? -Save current configuration to file -Aktuális beállÃtások mentése fájlba -Scanning... -Vizsgálat folyamatban... -Scanning: -Vizsgálat: -Select a folder -Mappa kiválasztása -Select alternate synchronization settings -AlternatÃv szinkronizációs beállÃtások kiválasztása -Select logfile directory: -Naplófájl mappájának kiválasztása: -Select variant: -Változat kiválasztása: -Select view -Nézet kiválasztása -Set direction: -Irány -Setting default synchronization directions: Old files will be overwritten with newer files. -Alapértelmezett szinkronizációs irányok beállÃtása: a régebbi fájlok felülÃródnak az újabbakkal. -Show \"%x\" -\"%x\" mutatása -Show conflicts -Ãœtközések mutatása -Show files that are different -EltérÅ‘ fájlok mutatása -Show files that are equal -EgyezÅ‘ fájlok mutatása -Show files that are newer on left -A bal oldali újabb fájlok mutatása -Show files that are newer on right -A jobb oldali újabb fájlok mutatása -Show files that exist on left side only -Csak a bal oldalon létezÅ‘ fájlok mutatása -Show files that exist on right side only -Csak a jobb oldalon létezÅ‘ fájlok mutatása -Show files that will be created on the left side -A bal oldalon létrehozandó fájlok mutatása -Show files that will be created on the right side -A jobb oldalon létrehozandó fájlok mutatása -Show files that will be deleted on the left side -A bal oldalon törlendÅ‘ fájlok mutatása -Show files that will be deleted on the right side -A jobb oldalon törlendÅ‘ fájlok mutatása -Show files that will be overwritten on left side -A bal oldalon felülÃrandó fájlok mutatása -Show files that will be overwritten on right side -A jobb oldalon felülÃrandó fájlok mutatása -Show files that won't be copied -A nem másolandó fájlok mutatása -Show hidden dialogs -Rejtett párbeszédablakok mutatása -Show popup -Felbukkanó ablak mutatása -Show popup on errors or warnings -ÉrtesÃtés felbukkanó ablakban a hibákról és figyelmeztetésekrÅ‘l -Significant difference detected: -JelentÅ‘s különbség érzékelve: -Silent mode -Csendes mód -Size -Méret -Source code written completely in C++ utilizing: -A forráskód teljes egészében C++-ban Ãródott\na következÅ‘k felhasználásával: -Source directory does not exist anymore: -A forrásként megadott mappa többé nem létezik: -Speed: -Sebesség: -Start -IndÃtás -Start minimized and write status information to a logfile -IndÃtás lekicsinyÃtve és a státuszinformációk mentése naplófájlba -Start synchronization -Szinkronizáció indÃtása -Statistics -Statisztikák -Status feedback -Státusz visszajelzés -Stop -MegállÃtás -Swap sides -Oldalak felcserélése -Switching to FreeFileSync GUI mode... -Váltás a FreeFileSync GUI módjára... -Symbolic Link handling -Symlink kezelés -Symlinks %x have the same date but a different target! -A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem! -Synchronization Preview -Szinkronizáció elÅ‘nézete -Synchronization aborted! -A szinkronizáció megszakÃtva! -Synchronization completed successfully! -A szinkronizáció sikeresen befejezÅ‘dött! -Synchronization completed with errors! -A szinkronizáció befejezÅ‘dött, de akadtak hibák! -Synchronization settings -Szinkronizáció beállÃtásai -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Minden .doc, .zip és .exe fájl szinkronizálása a \"temp\" almappában találhatók kivételével. -Synchronize... -Szinkronizálás -Synchronizing... -Szinkronizálás folyamatban... -Target directory already existing! -A célmappa már létezik! -Target file already existing! -A célként megadott fájl már létezik! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -A parancssor végrehajtódik minden alkalommal, ha:\n- minden mappa elérhetÅ‘vé válik (pl. USB-kulcs csatlakoztatása)\n- fájlok módosulnak az adott mappákban és almappákban -The file does not contain a valid configuration: -A következÅ‘ fájl nem tartalmaz érvényes beállÃtásokat: -The file was not processed by last synchronization! -A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Ez a változat akkor tekint egyezÅ‘nek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosÃtásuk ideje azonos. -Time -IdÅ‘ -Time elapsed: -Eltelt idÅ‘: -Time remaining: -HátralévÅ‘ idÅ‘: -Total amount of data that will be transferred -A mozgatandó adatok összmérete -Total time: -Becsült idÅ‘: -Transfer file and directory permissions\n(Requires Administrator rights) -Fájlok és mappák jogosultságainak átvitele\n(Adminisztrátori jogok szükségesek) -Unable to connect to sourceforge.net! -A csatlakozás a sourceforge.net-hez sikertelen! -Unable to create logfile! -Nem lehet létrehozni a naplófájlt! -Unresolved conflicts existing! -Feloldatlan ütközések vannak! -Update -> -FrissÃtés -> -Updating attributes of %x -A(z) %x attribútumainak frissÃtése -Usage: -Használat: -Use Recycle Bin -Lomtár (Recycle Bin) használata -Use Recycle Bin when deleting or overwriting files -A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülÃrásánál -User-defined directory for deletion was not specified! -A törléshez nem lett mappa megadva a felhasználó által! -Variant -Variáns -Verifying file %x -%x fájl ellenÅ‘rzése -Versioning -Verziókövetés -Volume name %x not part of filename %y! -A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév! -Waiting for missing directories... -Várakozás a hiányzó mappákra... -Waiting while directory is locked (%x)... -Várakozás a mappa zárolásának a feloldására (%x)... -Warning -Figyelem -When the comparison is started with this option set the following decision tree is processed: -Ha az összehasonlÃtás ezekkel a beállÃtásokkal lesz elindÃtva, akkor a következÅ‘ döntési fa érvényesül: -You can ignore conflicts and continue synchronization. -Figyelmen kÃvül hagyhatod az ütközéseket és folytathatod a szinkronizálást. -You can ignore this error to consider the directory as empty. -Figyelmen kÃvül hagyhatod ezt a hibát, üresnek tekintve a mappát. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlÃtás újbóli elvégzése NÉLKÃœL)! -different -különbözÅ‘ -file exists on both sides -mindkét oldalon létezÅ‘ fájlok -on one side only -csak az egy oldalon létezÅ‘ fájlok +<header> + <language name>Magyar</language name> + <translator>Demon</translator> + <locale>hu_HU</locale> + <flag file>hungary.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target></target> +<source>Open with default application</source> +<target>Megnyitás az alapértelmezett alkalmazással</target> +<source>Browse directory</source> +<target>Mappa tallózása</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automatikus szinkronizálás</target> +<source>Browse</source> +<target>Tallózás</target> +<source>Error resolving symbolic link:</source> +<target>A szimbolikus link feloldása sikertelen:</target> +<source>Select alternate synchronization settings</source> +<target>AlternatÃv szinkronizációs beállÃtások kiválasztása</target> +<source>No filter selected</source> +<target>Nincs szűrÅ‘ kiválasztva</target> +<source>Filter is active</source> +<target>A szűrÅ‘ aktÃv</target> +<source>Clear filter settings</source> +<target>SzűrÅ‘beállÃtások törlése</target> +<source>Remove alternate settings</source> +<target>AlternatÃv beállÃtások eltávolÃtása</target> +<source>Create a batch job</source> +<target>Kötegelt feladat létrehozása</target> +<source>Synchronization settings</source> +<target>Szinkronizáció beállÃtásai</target> +<source>Comparison settings</source> +<target>ÖsszehasonlÃtási beállÃtások</target> +<source>About</source> +<target>A programról</target> +<source>Error</source> +<target>Hiba</target> +<source>Warning</source> +<target>Figyelem</target> +<source>Question</source> +<target>Kérdés</target> +<source>Confirm</source> +<target>MegerÅ‘sÃtés</target> +<source>Configure filter</source> +<target>SzűrÅ‘ beállÃtása</target> +<source>Customize columns</source> +<target>Oszlopok testreszabása</target> +<source>Global settings</source> +<target>Globális beállÃtások</target> +<source>Synchronization Preview</source> +<target>Szinkronizáció elÅ‘nézete</target> +<source>Find</source> +<target>Keresés:</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target></target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Mappa></target> +<source>Size</source> +<target>Méret</target> +<source>Date</source> +<target>Dátum</target> +<source>Full path</source> +<target>Teljes elérési útvonal</target> +<source>Filename</source> +<target>Fájlnév</target> +<source>Relative path</source> +<target>RelatÃv útvonal</target> +<source>Directory</source> +<target>Mappa</target> +<source>Extension</source> +<target>Kiterjesztés</target> +<source>Comparison Result</source> +<target>Az összehasonlÃtás eredménye</target> +<source>Incompatible synchronization database format:</source> +<target>Inkompatibilis szinkronizációs adatbázis formátum:</target> +<source>Initial synchronization:</source> +<target>ElsÅ‘ szinkronizáció:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>A FreeFileSync egyik adatbázisfájlja nem létezik:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>A FreeFileSync a következÅ‘ fájlban lévÅ‘ egyik adatbázisbejegyzése nem található:</target> +<source>Error reading from synchronization database:</source> +<target>Hiba történt a szinkronizációs adatbázis olvasása közben:</target> +<source>An exception occurred!</source> +<target>Kivétel keletkezett!</target> +<source>Error deleting file:</source> +<target>A fájl törlése sikertelen:</target> +<source>Error reading file attributes:</source> +<target>A fájl attribútumainak olvasása sikertelen:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Várakozás a mappa zárolásának a feloldására (%x)...</target> +<source>Error setting directory lock:</source> +<target>Hiba történt a mappa zárolása közben:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +</target> +<source>Info</source> +<target>Információ</target> +<source>Fatal Error</source> +<target>Kritikus hiba</target> +<source>File does not exist:</source> +<target>A következÅ‘ fájl nem létezik:</target> +<source>Error parsing configuration file:</source> +<target>A beállÃtásokat tartalmazó fájl feldolgozása sikertelen:</target> +<source>Error writing file:</source> +<target>A fájl Ãrása sikertelen:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Érvénytelen a FreeFileSync beállÃtásait tartalmazó fájl!</target> +<source>/sec</source> +<target>/másodperc</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +</target> +<source>S&ave configuration...</source> +<target>BeállÃtások mentés&e...</target> +<source>&Load configuration...</source> +<target>&BeállÃtások betöltése...</target> +<source>&Quit</source> +<target>&Kilépés</target> +<source>&File</source> +<target>&Fájl</target> +<source>&Content</source> +<target>&Tartalom</target> +<source>&About...</source> +<target>&A programról...</target> +<source>&Help</source> +<target>&Súgó</target> +<source>Usage:</source> +<target>Használat:</target> +<source>1. Select directories to monitor.</source> +<target>1. Válaszd ki a figyelendÅ‘ mappákat.</target> +<source>2. Enter a command line.</source> +<target>2. Add meg a parancssort.</target> +<source>3. Press 'Start'.</source> +<target>3. Nyomd meg a Start gombot.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +A parancssor végrehajtódik minden alkalommal, ha: +- minden mappa elérhetÅ‘vé válik (pl. USB-kulcs csatlakoztatása) +- fájlok módosulnak az adott mappákban és almappákban +</target> +<source>Directories to watch</source> +<target>FigyelendÅ‘ mappák</target> +<source>Add folder</source> +<target>Mappa hozzáadása</target> +<source>Remove folder</source> +<target>Mappa eltávolÃtása</target> +<source>Select a folder</source> +<target>Mappa kiválasztása</target> +<source>Command line</source> +<target>Parancssor</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimális tétlenségi idÅ‘ (másodpercek)</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>A tétlenség hossza másodpercekben az utolsó változás észlelése és a parancssor végrehajtása között.</target> +<source>Start</source> +<target>IndÃtás</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync beállÃtások</target> +<source>File already exists. Overwrite?</source> +<target>A fájl már létezik. FelülÃrjuk?</target> +<source>&Restore</source> +<target>&VisszaállÃtás</target> +<source>&Exit</source> +<target>&Kilépés</target> +<source>Monitoring active...</source> +<target>Figyelés aktÃv...</target> +<source>Waiting for missing directories...</source> +<target>Várakozás a hiányzó mappákra...</target> +<source>Command line is empty!</source> +<target>A parancssor üres!</target> +<source>Could not initialize directory monitoring:</source> +<target>A mappafigyelés inicializálása sikertelen:</target> +<source>A directory input field is empty.</source> +<target>Valamelyik mappa megadására szolgáló mezÅ‘ üres.</target> +<source>Error when monitoring directories.</source> +<target>Hiba történt a mappák figyelése közben.</target> +<source>Drag && drop</source> +<target>Húzd && Ejtsd</target> +<source>Conversion error:</source> +<target>Konverziós hiba:</target> +<source>Error moving file:</source> +<target>Hiba a fájl mozgatásakor:</target> +<source>Operation aborted!</source> +<target>Művelet megszakÃtva!</target> +<source>Target file already existing!</source> +<target>A célként megadott fájl már létezik!</target> +<source>Error moving directory:</source> +<target>Hiba a mappa mozgatásakor:</target> +<source>Target directory already existing!</source> +<target>A célmappa már létezik!</target> +<source>Error deleting directory:</source> +<target>A mappa törlése sikertelen:</target> +<source>Error changing modification time:</source> +<target>Az utolsó változtatás dátumának módosÃtása sikertelen:</target> +<source>Error loading library function:</source> +<target>A könyvtári funkció betöltése sikertelen:</target> +<source>Error reading security context:</source> +<target>A biztonsági cÃmke olvasása sikertelen:</target> +<source>Error writing security context:</source> +<target>A biztonsági cÃmke Ãrása sikertelen:</target> +<source>Error copying file permissions:</source> +<target>Hiba történt a fájl jogosultságainak másolása közben:</target> +<source>Error creating directory:</source> +<target>A mappa létrehozása sikertelen:</target> +<source>Error copying symbolic link:</source> +<target>Hiba történt a szimbolikus link másolása közben:</target> +<source>Error copying file:</source> +<target>A fájl másolása sikertelen:</target> +<source>Error opening file:</source> +<target>A fájl megnyitása sikertelen:</target> +<source>Error reading file:</source> +<target>A fájl olvasása sikertelen:</target> +<source>Endless loop when traversing directory:</source> +<target>Végtelen hurok a mappák bejárásakor:</target> +<source>Error traversing directory:</source> +<target>A mappa átnézése sikertelen:</target> +<source>Error setting privilege:</source> +<target>Hiba történt a jogok beállÃtása közben:</target> +<source>Error moving to Recycle Bin:</source> +<target>A Lomtárba (Recycle Bin) mozgatás sikertelen:</target> +<source>Could not load a required DLL:</source> +<target>A szükséges DLL betöltése sikertelen:</target> +<source>Error writing to synchronization database:</source> +<target>Hiba történt a szinkronizációs adatbázis Ãrása közben:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Hiba történt a Volume Shadow Copy szolgáltatás indÃtása közben!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et.</target> +<source>Could not determine volume name for file:</source> +<target>A következÅ‘ fájlnak nem lehet meghatározni a kötetnevét:</target> +<source>Volume name %x not part of filename %y!</source> +<target>A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>A következÅ‘ XML-csomópontok értékének beolvasása sikertelen:</target> +<source>Show popup</source> +<target>Felbukkanó ablak mutatása</target> +<source>Show popup on errors or warnings</source> +<target>ÉrtesÃtés felbukkanó ablakban a hibákról és figyelmeztetésekrÅ‘l</target> +<source>Ignore errors</source> +<target>Hibák figyelmen kÃvül hagyása</target> +<source>Hide all error and warning messages</source> +<target>Összes hibaüzenet és figyelmeztetés elrejtése</target> +<source>Exit instantly</source> +<target>Kilépés azonnal</target> +<source>Abort synchronization immediately</source> +<target>Szinkronizáció azonnali megszakÃtása</target> +<source>Logging</source> +<target>Naplózás</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync kötegelt fájl</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync beállÃtások</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync kötegelt feladat</target> +<source>Unable to create logfile!</source> +<target>Nem lehet létrehozni a naplófájlt!</target> +<source>Batch execution</source> +<target>Kötegelt végrehajtás</target> +<source>Log-messages:</source> +<target>Naplóbejegyzések:</target> +<source>Stop</source> +<target>MegállÃtás</target> +<source>Total time:</source> +<target>Becsült idÅ‘:</target> +<source>Synchronization aborted!</source> +<target>A szinkronizáció megszakÃtva!</target> +<source>Synchronization completed with errors!</source> +<target>A szinkronizáció befejezÅ‘dött, de akadtak hibák!</target> +<source>Synchronization completed successfully!</source> +<target>A szinkronizáció sikeresen befejezÅ‘dött!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Kérjük, nyomja meg a "Váltás" gombot a GUI mód megnyitásához.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Váltás a FreeFileSync GUI módjára...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>A csatlakozás a sourceforge.net-hez sikertelen!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>ElérhetÅ‘ a FreeFileSync egy újabb verziója:</target> +<source>Download now?</source> +<target>Letöltsem most?</target> +<source>Information</source> +<target>Információ</target> +<source>FreeFileSync is up to date!</source> +<target>A FreeFileSync naprakész!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissÃtést?</target> +<source>(Requires an Internet connection!)</source> +<target>(Internetkapcsolat szükséges!)</target> +<source>1. &Compare</source> +<target>1. &ÖsszehasonlÃtás</target> +<source>2. &Synchronize...</source> +<target>2. &Szinkronizálás</target> +<source>S&witch view</source> +<target>Nézet v&áltása</target> +<source>&New</source> +<target>&Új</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&Nyelv</target> +<source>&Global settings...</source> +<target>&Globális beállÃtások...</target> +<source>&Create batch job...</source> +<target>&Kötegelt feladat létrehozása...</target> +<source>&Export file list...</source> +<target>&Fájllista exportálása...</target> +<source>&Advanced</source> +<target>&Haladó</target> +<source>&Check for new version</source> +<target>&Új verzió keresése</target> +<source>Compare</source> +<target>ÖsszehasonlÃtás</target> +<source>Compare both sides</source> +<target>Mindkét oldal összehasonlÃtása</target> +<source>&Abort</source> +<target>&MegszakÃt</target> +<source>Synchronize...</source> +<target>Szinkronizálás</target> +<source>Start synchronization</source> +<target>Szinkronizáció indÃtása</target> +<source>Swap sides</source> +<target>Oldalak felcserélése</target> +<source>Add folder pair</source> +<target>Mappa pár megadása</target> +<source>Remove folder pair</source> +<target>Mappa párok eltávolÃtása</target> +<source>Save current configuration to file</source> +<target>Aktuális beállÃtások mentése fájlba</target> +<source>Load configuration from file</source> +<target>BeállÃtások betöltése fájlból</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Utoljára használt beállÃtások (DEL billentyűvel törölhetÅ‘ a listából)</target> +<source>Hide excluded items</source> +<target>A kizárt elemek elrejtése</target> +<source>Hide filtered or temporarily excluded files</source> +<target>A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése</target> +<source>Number of files and directories that will be created</source> +<target>A létrehozandó fájlok és mappák száma</target> +<source>Number of files that will be overwritten</source> +<target>A felülÃrandó fájlok száma</target> +<source>Number of files and directories that will be deleted</source> +<target>A törlendÅ‘ fájlok és mappák száma</target> +<source>Total amount of data that will be transferred</source> +<target>A mozgatandó adatok összmérete</target> +<source>Left</source> +<target>Bal oldal</target> +<source>Right</source> +<target>Jobb oldal</target> +<source>Batch job</source> +<target>Kötegelt feladat</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Egy kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indÃtáshoz egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelÅ‘jével.</target> +<source>Help</source> +<target>Súgó</target> +<source>Configuration overview:</source> +<target>BeállÃtások áttekintése:</target> +<source>Filter files</source> +<target>Fájlok szűrése</target> +<source>Status feedback</source> +<target>Státusz visszajelzés</target> +<source>Silent mode</source> +<target>Csendes mód</target> +<source>Start minimized and write status information to a logfile</source> +<target>IndÃtás lekicsinyÃtve és a státuszinformációk mentése naplófájlba</target> +<source>Error handling</source> +<target>Hibakezelés</target> +<source>Overview</source> +<target>Összefoglaló</target> +<source>Select logfile directory:</source> +<target>Naplófájl mappájának kiválasztása:</target> +<source>Maximum number of logfiles:</source> +<target>Naplófájlok maximális száma:</target> +<source>&Save</source> +<target>&Mentés</target> +<source>&Load</source> +<target>&Betöltés</target> +<source>&Cancel</source> +<target>&Mégsem</target> +<source>Elements found:</source> +<target>Talált elemek száma:</target> +<source>Elements remaining:</source> +<target>HátralévÅ‘ elemek száma:</target> +<source>Speed:</source> +<target>Sebesség:</target> +<source>Time remaining:</source> +<target>HátralévÅ‘ idÅ‘:</target> +<source>Time elapsed:</source> +<target>Eltelt idÅ‘:</target> +<source>Operation:</source> +<target>Művelet:</target> +<source>Select variant:</source> +<target>Változat kiválasztása:</target> +<source><Automatic></source> +<target><Automatikus></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Mindkét oldal változásainak azonosÃtása és tárolása adatbázis segÃtségével. A törlések és ütközések automatikusan észlelÅ‘dnek.</target> +<source>Mirror ->></source> +<target>Tükrözés ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival.</target> +<source>Update -></source> +<target>FrissÃtés -></target> +<source>Copy new or updated files to right folder.</source> +<target>Új vagy frissÃtett fájlok másolása a jobb oldali mappába.</target> +<source>Custom</source> +<target>Egyedi</target> +<source>Configure your own synchronization rules.</source> +<target>Saját szinkronizálási szabályok beállÃtása.</target> +<source>Deletion handling</source> +<target>Törlések kezelése</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>BeállÃtás</target> +<source>Category</source> +<target>Kategória</target> +<source>Action</source> +<target>Művelet</target> +<source>Files/folders that exist on left side only</source> +<target>Csak a bal oldalon létezÅ‘ fájlok/mappák</target> +<source>Files/folders that exist on right side only</source> +<target>Csak a jobb oldalon létezÅ‘ fájlok/mappák</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Mindkét oldalon létezÅ‘ fájlok, de a bal oldali újabb</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Mindkét oldalon létezÅ‘ fájlok, de a jobb oldali újabb</target> +<source>Files that have different content</source> +<target>Fájlok, amelyeknek különbözÅ‘ a tartalmuk:</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Kategorizálhatatlan ütközések/fájlok</target> +<source>Compare by...</source> +<target>ÖsszehasonlÃtás</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +A fájlok megegyezÅ‘ ha + - a fájlméret + - az utolsó módosÃtás dátuma +megegyezik +</target> +<source>File size and date</source> +<target>fájlméret és dátum alapján</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +A fájlok megegyezÅ‘ ha + - a fájlok tartalma +megegyezik +</target> +<source>File content</source> +<target>fájl tartalma alapján</target> +<source>Symbolic Link handling</source> +<target>Symlink kezelés</target> +<source>Synchronizing...</source> +<target>Szinkronizálás folyamatban...</target> +<source>Elements processed:</source> +<target>Feldolgozott elemek száma:</target> +<source>&Pause</source> +<target>&Szünet</target> +<source>Compare by "File size and date"</source> +<target>ÖsszehasonlÃtás "fájlméret és dátum alapján"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Ez a változat akkor tekint egyezÅ‘nek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosÃtásuk ideje azonos.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Ha az összehasonlÃtás ezekkel a beállÃtásokkal lesz elindÃtva, akkor a következÅ‘ döntési fa érvényesül:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Eredményképpen a fájlok a következÅ‘ kategóriákra bomlanak:</target> +<source>- equal</source> +<target>- egyezik</target> +<source>- left newer</source> +<target>- a bal oldali újabb</target> +<source>- right newer</source> +<target>- a jobb oldali újabb</target> +<source>- exists left only</source> +<target>- csak a bal oldalon létezik</target> +<source>- exists right only</source> +<target>- csak a jobb oldalon létezik</target> +<source>- conflict</source> +<target>- ütközés</target> +<source>Compare by "File content"</source> +<target>ÖsszehasonlÃtás "fájltartalom" alapján</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezÅ‘ként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Ãgy a fájlok dátuma nem számÃt semmit. + +Ennek az opciónak az engedélyezésével a döntési fa kisebb lesz: +</target> +<source>- different</source> +<target>- különbözÅ‘</target> +<source>Source code written in C++ utilizing:</source> +<target></target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target> +Nagy köszönet a FreeFileSync lokalizációjáért +a következÅ‘ személyeknek: +</target> +<source>Feedback and suggestions are welcome at:</source> +<target>A visszajelzéseket és javaslatokat ide várjuk:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync a Sourceforge-on</target> +<source>Homepage</source> +<target>Honlap</target> +<source>If you like FFS</source> +<target>FFS támogatása</target> +<source>Donate with PayPal</source> +<target>Ha szereted a FreeFileSync-et, támogasd a PayPal segÃtségével.</target> +<source>Email</source> +<target>E-mail</target> +<source>Report translation error</source> +<target>FordÃtói hiba bejelentése</target> +<source>Published under the GNU General Public License:</source> +<target>Kiadva a GNU General Public License alatt:</target> +<source>Ignore subsequent errors</source> +<target>KésÅ‘bbi hibák figyelmen kÃvül hagyása</target> +<source>Hide further error messages during the current process</source> +<target>A további hibaüzenetek elrejtése az aktuális folyamat során</target> +<source>&Ignore</source> +<target>&Kihagy</target> +<source>&Retry</source> +<target>&Ismét</target> +<source>Do not show this dialog again</source> +<target>Ne mutasd újra ezt a párbeszédablakot</target> +<source>&Switch</source> +<target>&Váltás</target> +<source>&Yes</source> +<target>&Igen</target> +<source>&No</source> +<target>&Nem</target> +<source>Delete on both sides</source> +<target>Törlés mindkét oldalon</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve</target> +<source>Use Recycle Bin</source> +<target>Lomtár (Recycle Bin) használata</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target></target> +<source>Hints:</source> +<target>Tippek:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. A relatÃv fájl- és mappanevek megadása pontosvesszÅ‘vel elválasztva vagy új sorban.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. A csillag ('*') és a kérdÅ‘jel ('?') helyettesÃtÅ‘ karakterek megengedettek.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Fájlok közvetlen kizárása a fÅ‘ listából helyi menü segÃtségével.</target> +<source>Example</source> +<target>Példa</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target></target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Minden .doc, .zip és .exe fájl szinkronizálása a "temp" almappában találhatók kivételével.</target> +<source>Include</source> +<target>Csatol</target> +<source>Exclude</source> +<target>Kizár</target> +<source>Select time span:</source> +<target></target> +<source>Minimum file size:</source> +<target></target> +<source>Maximum file size:</source> +<target></target> +<source>&Default</source> +<target>&Alapértelmezett</target> +<source>Move column up</source> +<target>Oszlop mozgatása felfelé</target> +<source>Move column down</source> +<target>Oszlop mozgatása lefelé</target> +<source>Copy locked files</source> +<target>Zárolt fájlok másolása</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással +(Adminisztrátori jogok szükségesek) +</target> +<source>Copy filesystem permissions</source> +<target>Fájlrendszer jogosultságok másolása</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Fájlok és mappák jogosultságainak átvitele +(Adminisztrátori jogok szükségesek) +</target> +<source>Hidden dialogs:</source> +<target>Rejtett párbeszédablakok:</target> +<source>Reset</source> +<target>HelyreállÃtás</target> +<source>Show hidden dialogs</source> +<target>Rejtett párbeszédablakok mutatása</target> +<source>External applications</source> +<target>KülsÅ‘ alkalmazások</target> +<source>Description</source> +<target>Megjegyzés</target> +<source>Variant</source> +<target>Variáns</target> +<source>Statistics</source> +<target>Statisztikák</target> +<source>Find what:</source> +<target>Mit keresünk:</target> +<source>Match case</source> +<target>Kis-/nagybetű egyezés</target> +<source>&Find next</source> +<target>&KövetkezÅ‘ keresése</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlÃtás újbóli elvégzése NÉLKÃœL)!</target> +<source>Batch file created successfully!</source> +<target>A kötegelt feladat fájl létrehozása sikerült!</target> +<source>Main bar</source> +<target>FÅ‘ panel</target> +<source>Folder pairs</source> +<target>Mappa párok</target> +<source>Select view</source> +<target>Nézet kiválasztása</target> +<source>Folder Comparison and Synchronization</source> +<target>Mappa összehasonlÃtás és szinkronizáció</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>A Lomtár (Recycle Bin) nem támogatott ezen a rendszeren!</target> +<source>Set direction:</source> +<target>Irány</target> +<source>Exclude temporarily</source> +<target>Ideiglenesen kizár</target> +<source>Include temporarily</source> +<target>Ideiglenesen csatolni</target> +<source>Exclude via filter:</source> +<target>Kizárás szűrÅ‘ segÃtségével:</target> +<source><multiple selection></source> +<target><többszörös kijelölés></target> +<source>D-Click</source> +<target>D-Klikk</target> +<source>Copy to clipboard CTRL+C</source> +<target>Másolás a vágólapra CTRL+C</target> +<source>Delete files DEL</source> +<target>Fájlok törlése DEL</target> +<source>Customize...</source> +<target>Testreszabás...</target> +<source>Auto-adjust columns</source> +<target>Oszlopok automatikus igazÃtása</target> +<source>Include all rows</source> +<target>Minden sort csatolni</target> +<source>Exclude all rows</source> +<target>Minden sor kizárása</target> +<source>Reset view</source> +<target>Nézet visszaállÃtása</target> +<source>Show "%x"</source> +<target>"%x" mutatása</target> +<source><Last session></source> +<target><Utolsó munkamenet></target> +<source>Configuration saved!</source> +<target>BeállÃtások elmentve!</target> +<source>Save changes to current configuration?</source> +<target>Mentsük a beállÃtások változásait?</target> +<source>Configuration loaded!</source> +<target>BeállÃtások betöltve!</target> +<source>Hide files that exist on left side only</source> +<target>Csak a bal oldalon létezÅ‘ fájlok elrejtése</target> +<source>Show files that exist on left side only</source> +<target>Csak a bal oldalon létezÅ‘ fájlok mutatása</target> +<source>Hide files that exist on right side only</source> +<target>Csak a jobb oldalon létezÅ‘ fájlok elrejtése</target> +<source>Show files that exist on right side only</source> +<target>Csak a jobb oldalon létezÅ‘ fájlok mutatása</target> +<source>Hide files that are newer on left</source> +<target>A bal oldalon lévÅ‘ újabb fájlok elrejtése</target> +<source>Show files that are newer on left</source> +<target>A bal oldali újabb fájlok mutatása</target> +<source>Hide files that are newer on right</source> +<target>A jobb oldalon lévÅ‘ újabb fájlok elrejtése</target> +<source>Show files that are newer on right</source> +<target>A jobb oldali újabb fájlok mutatása</target> +<source>Hide files that are equal</source> +<target>Az egyezÅ‘ fájlok elrejtése</target> +<source>Show files that are equal</source> +<target>EgyezÅ‘ fájlok mutatása</target> +<source>Hide files that are different</source> +<target>A nem egyezÅ‘ fájlok elrejtése</target> +<source>Show files that are different</source> +<target>EltérÅ‘ fájlok mutatása</target> +<source>Hide conflicts</source> +<target>Ãœtközések elrejtése</target> +<source>Show conflicts</source> +<target>Ãœtközések mutatása</target> +<source>Hide files that will be created on the left side</source> +<target>A bal oldalon létrehozandó fájlok elrejtése.</target> +<source>Show files that will be created on the left side</source> +<target>A bal oldalon létrehozandó fájlok mutatása</target> +<source>Hide files that will be created on the right side</source> +<target>A jobb oldalon létrehozandó fájlok elrejtése.</target> +<source>Show files that will be created on the right side</source> +<target>A jobb oldalon létrehozandó fájlok mutatása</target> +<source>Hide files that will be deleted on the left side</source> +<target>A bal oldalon törlendÅ‘ fájlok elrejtése.</target> +<source>Show files that will be deleted on the left side</source> +<target>A bal oldalon törlendÅ‘ fájlok mutatása</target> +<source>Hide files that will be deleted on the right side</source> +<target>A jobb oldalon törlendÅ‘ fájlok elrejtése.</target> +<source>Show files that will be deleted on the right side</source> +<target>A jobb oldalon törlendÅ‘ fájlok mutatása</target> +<source>Hide files that will be overwritten on left side</source> +<target>A bal oldalon felülÃrandó fájlok elrejtése</target> +<source>Show files that will be overwritten on left side</source> +<target>A bal oldalon felülÃrandó fájlok mutatása</target> +<source>Hide files that will be overwritten on right side</source> +<target>A jobb oldalon felülÃrandó fájlok elrejtése</target> +<source>Show files that will be overwritten on right side</source> +<target>A jobb oldalon felülÃrandó fájlok mutatása</target> +<source>Hide files that won't be copied</source> +<target>A nem másolandó fájlok elrejtése</target> +<source>Show files that won't be copied</source> +<target>A nem másolandó fájlok mutatása</target> +<source>All directories in sync!</source> +<target>Minden mappa szinkronban!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Kérjük, futtass le egy összehasonlÃtást mielÅ‘tt szinkronizálnál!</target> +<source>Comma separated list</source> +<target>Comma separated values</target> +<source>Legend</source> +<target>ElÅ‘zmény</target> +<source>File list exported!</source> +<target>A fájllista exportálása befejezÅ‘dött!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +</target> +<source>Scanning...</source> +<target>Vizsgálat folyamatban...</target> +<source>Comparing content...</source> +<target>Tartalom összehasonlÃtása...</target> +<source>Paused</source> +<target>Szüneteltetve</target> +<source>Aborted</source> +<target>MegszakÃtva</target> +<source>Completed</source> +<target>Befejezve</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>MegszakÃtási kérelem: Várakozás a folyamatban lévÅ‘ művelet befejezésére...</target> +<source>Continue</source> +<target>Folytatás</target> +<source>Pause</source> +<target>Szünet</target> +<source>Cannot find %x</source> +<target>Nem található: %x</target> +<source>DECISION TREE</source> +<target>DÖNTÉSI FA</target> +<source>file exists on both sides</source> +<target>mindkét oldalon létezÅ‘ fájlok</target> +<source>on one side only</source> +<target>csak az egy oldalon létezÅ‘ fájlok</target> +<source>- left</source> +<target>- bal oldali</target> +<source>- right</source> +<target>- jobb oldali</target> +<source>different</source> +<target>különbözÅ‘</target> +<source>- conflict (same date, different size)</source> +<target>- ütközés (ugyanaz a dátum, különbözÅ‘ méret)</target> +<source>Inactive</source> +<target></target> +<source>Second</source> +<target></target> +<source>Minute</source> +<target></target> +<source>Hour</source> +<target></target> +<source>Day</source> +<target></target> +<source>Byte</source> +<target></target> +<source>KB</source> +<target></target> +<source>MB</source> +<target></target> +<source>Filter: All pairs</source> +<target>SzűrÅ‘: Minden pár</target> +<source>Filter: Single pair</source> +<target>SzűrÅ‘: Egy pár</target> +<source>Ignore</source> +<target>Figyelmen kÃvül hagy</target> +<source>Direct</source> +<target>Közvetlen</target> +<source>Follow</source> +<target>Követés</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>KülsÅ‘ alkalmazás integrálása a helyi menübe. Az elérhetÅ‘ makrók a következÅ‘k:</target> +<source>- full file or directory name</source> +<target>- teljes fájl- vagy mappanév</target> +<source>- directory part only</source> +<target>- csak a mappa részét</target> +<source>- Other side's counterpart to %name</source> +<target>- A %name másik oldalon szereplÅ‘ párja</target> +<source>- Other side's counterpart to %dir</source> +<target>- A %dir másik oldalon szereplÅ‘ párja</target> +<source>Restore all hidden dialogs?</source> +<target>Az összes rejtett párbeszédablakot visszaállÃtsuk?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +</target> +<source>Leave as unresolved conflict</source> +<target>Feloldatlan ütközésként hagyni</target> +<source>Delete permanently</source> +<target>Folyamatosan törölni</target> +<source>Delete or overwrite files permanently</source> +<target>A fájlok folyamatos törlése vagy felülÃrása</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülÃrásánál</target> +<source>Versioning</source> +<target>Verziókövetés</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Fájlok másolása idÅ‘bélyeggel ellátott almappába</target> +<source>Cannot determine sync-direction:</source> +<target>Nem lehet meghatározni a szinkronizáció irányát:</target> +<source>Filter settings have changed!</source> +<target>A szűrÅ‘beállÃtások megváltoztak!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Mindkét oldal megváltozott az utolsó szikronizálás óta!</target> +<source>No change since last synchronization!</source> +<target>Az utolsó szinkronizálás után nem történt változás.</target> +<source>The file was not processed by last synchronization!</source> +<target>A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>A tervezett mappának a törlése ütközik az almappáival és fájljaival.</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Alapértelmezett szinkronizációs irányok beállÃtása: a régebbi fájlok felülÃródnak az újabbakkal.</target> +<source>The file does not contain a valid configuration:</source> +<target>A következÅ‘ fájl nem tartalmaz érvényes beállÃtásokat:</target> +<source>Scanning:</source> +<target>Vizsgálat:</target> +<source>Encoding extended time information: %x</source> +<target>KibÅ‘vÃtett idÅ‘információk kódolása: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Figyelmen kÃvül hagyhatod ezt a hibát, üresnek tekintve a mappát.</target> +<source>Directory does not exist:</source> +<target>A mappa nem létezik:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:</target> +<source>Comparing content of files %x</source> +<target>%x fájlok tartalmának összehasonlÃtása</target> +<source>Memory allocation failed!</source> +<target>Sikertelen memóriafoglalás!</target> +<source>File %x has an invalid date!</source> +<target>A(z) %x fájlnak érvénytelen a dátuma!</target> +<source>Conflict detected:</source> +<target>Ãœtközés történt:</target> +<source>Files %x have the same date but a different size!</source> +<target>A(z) %x fájlok dátuma megegyezik, de a mérete nem!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem!</target> +<source>Comparing files by content failed.</source> +<target>Sikertelen a fájlok összehasonlÃtása tartalom alapján.</target> +<source>Generating file list...</source> +<target>Fájllista generálása...</target> +<source>Multiple...</source> +<target>SokszorosÃtás</target> +<source>Files that are equal on both sides</source> +<target>MegegyezÅ‘ fájlok mindkét oldalon</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Egyforma fájlok/mappák, melyek csak attribútumaikban különböznek</target> +<source>Copy from right to left</source> +<target>Másolás a jobb oldalról a bal oldalra</target> +<source>Copy from left to right</source> +<target>Másolás a bal oldalról a jobb oldalra</target> +<source>Delete files/folders existing on left side only</source> +<target>Csak a bal oldalon létezÅ‘ fájlok/mappák törlése</target> +<source>Delete files/folders existing on right side only</source> +<target>Csak a jobb oldalon létezÅ‘ fájlok/mappák törlése</target> +<source>Copy from right to left overwriting</source> +<target>Másolás a jobb oldalról a bal oldalra felülÃrással</target> +<source>Copy from left to right overwriting</source> +<target>Másolás a bal oldalról a jobb oldalra felülÃrással</target> +<source>Do nothing</source> +<target>Nincs mit csinálni</target> +<source>Copy attributes only from right to left</source> +<target>Attribútumok másolása kizárólag jobbról balra</target> +<source>Copy attributes only from left to right</source> +<target>Attribútumok másolása kizárólag balról jobbra</target> +<source>Deleting file %x</source> +<target>Fájl törlése %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Symlink törlése: %x</target> +<source>Deleting folder %x</source> +<target>Mappa törlése %x</target> +<source>Moving %x to Recycle Bin</source> +<target>%x mozgatása a Lomtárba (Recycle Bin)</target> +<source>Moving file %x to user-defined directory %y</source> +<target>%x fájl mozgatása a felhasználó által megadott %y mappába</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>%x mappa mozgatása a felhasználó által megadott %y mappába</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>A(z) %x symlink másolása a felhasználó által megadott %y mappába</target> +<source>Copying new file %x to %y</source> +<target>A(z) %x új fájl másolása a(z) %y fájlba</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>A(z) %x új symlink másolása a(z) %y symlinkbe</target> +<source>Overwriting file %x in %y</source> +<target>A(z) %x fájl fölülÃrása a(z) %y mappában</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>A(z) %x symlink fölülÃrása a(z) %y mappában</target> +<source>Creating folder %x</source> +<target>%x mappa létrehozása</target> +<source>Verifying file %x</source> +<target>%x fájl ellenÅ‘rzése</target> +<source>Updating attributes of %x</source> +<target>A(z) %x attribútumainak frissÃtése</target> +<source>Source directory does not exist anymore:</source> +<target>A forrásként megadott mappa többé nem létezik:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>A beállÃtásoknak megfelelÅ‘en nincs mit szinkronizálni!</target> +<source>Target directory name must not be empty!</source> +<target></target> +<source>User-defined directory for deletion was not specified!</source> +<target>A törléshez nem lett mappa megadva a felhasználó által!</target> +<source>Unresolved conflicts existing!</source> +<target>Feloldatlan ütközések vannak!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Figyelmen kÃvül hagyhatod az ütközéseket és folytathatod a szinkronizálást.</target> +<source>Significant difference detected:</source> +<target>JelentÅ‘s különbség érzékelve:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Az összes fájl több mint 50%-a másolva vagy törölve lesz!</target> +<source>Not enough free disk space available in:</source> +<target>Nincs elég szabad lemezterület:</target> +<source>Free disk space required:</source> +<target>Szükséges szabad lemezterület:</target> +<source>Free disk space available:</source> +<target>Szabad lemezterület:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Egy olyan mappa kerül módosÃtásra, amely tagja több mappa párosnak! Kérjük, nézd át a szinkronizációs beállÃtásokat!</target> +<source>Processing folder pair:</source> +<target>Mappapár feldolgozása:</target> +<source>Generating database...</source> +<target>Adatbázis generálása...</target> +<source>Error copying locked file %x!</source> +<target>Hiba történt a(z) %x zárolt fájl másolása közben!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>AdatellenÅ‘rzési hiba: A forrás és cél fájl tartalma különbözik!</target> diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index 4c465335..404d1fb5 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -1,910 +1,1026 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port della GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y oggetti cancellati con successo -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x giorno(i) -%x directories -%x cartelle -%x files -%x files -%x hour(s) -%x ora(e) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x di %y righe visualizzate -%x of 1 row in view -%x di 1 riga visualizzata -%x sec -%x sec -%x% -%x% -&Abort -&Abbandona -&About... -&Informazioni... -&Advanced -&Avanzate -&Cancel -&Annulla -&Check for new version -&Controlla la presenza di nuove versioni -&Content -&Contenuto -&Create batch job... -&Crea un job in batch... -&Default -&Default -&Exit -&Esci -&Export file list... -&Esporta la lista dei file... -&File -&File -&Find next -&Trova successivo -&Global settings... -&Preferenze... -&Help -&Aiuto -&Ignore -&Ignora -&Language -&Lingua -&Load -&Carica -&Load configuration... -&Carica la configurazione... -&New -&Nuovo -&No -&No -&OK -&OK -&Pause -&Pausa -&Program -&Programma -&Quit -&Esci -&Restore -&Ripristina -&Retry -&Riprova -&Save -&Salva -&Switch -&Switch -&Yes -&Si -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Richiede una connessione Internet!) -- Other side's counterpart to %dir -- L'altro lato e' equivalente a %dir -- Other side's counterpart to %name -- L'altro lato e' equivalente a %name -- conflict -- conflitto -- conflict (same date, different size) -- conflitto (stessa data, dimensione diversa) -- different -- file diversi -- directory part only -- solo parte di directory -- equal -- file identici -- exists left only -- il file esiste solo a sinistra -- exists right only -- il file esiste solo a destra -- full file or directory name -- file completo o nome directory -- left -- a sinistra -- left newer -- file di sinistra più recente -- right -- a destra -- right newer -- file di destra più recente -/sec -/sec -1 directory -1 directory -1 file -1 file -1. &Compare -1. &Compara -1. Enter relative file or directory names separated by ';' or a new line. -1. Inserisci i nomi relativi di file o directory separati da ';' o su una nuova riga. -1. Select directories to monitor. -1. Seleziona cartelle da monitorare. -2. &Synchronize... -2. &Sincronizza... -2. Enter a command line. -2. Inserisci linea di comando. -2. Use wildcard characters '*' and '?'. -2. Sono ammessi i caratteri generici '*' e '?'. -3. Exclude files directly on main grid via context menu. -3. Escludi i file direttamente sulla griglia principale tramite il menu contestuale. -3. Press 'Start'. -3. Premi 'Start'. -<Automatic> -<Automatico> -<Directory> -<Directory> -<Last session> -<Ultima sessione> -<Symlink> -<Symlink> -<multiple selection> -<selezione multipla> -A directory input field is empty. -Un campo directory di input è vuoto. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Una directory che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione! -A newer version of FreeFileSync is available: -E' disponibile una nuova versione di FreeFileSync: -Abort requested: Waiting for current operation to finish... -Abbandono richiesto: in attesa della fine dell'operazione in corso... -Abort synchronization immediately -Interrompi immediatamente la sincronizzazione -Aborted -Abbandono riuscito -About -A proposito di -Action -Azioni -Add folder -Aggiungi cartella -Add folder pair -Aggiungi una coppia di cartelle -All directories in sync! -Tutte le directory in sync! -An exception occurred! -Si è verificato un problema! -As a result the files are separated into the following categories: -I file risultano infine ripartiti nelle seguenti categorie: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate.\n\nAbilitando questa opzione l'albero delle decisioni è semplificato: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Componi un file batch per la sincronia automatica. Per partire in modalità batch fai semplicemente seguire il nome del file all'eseguibile di FreeFileSync: FreeFileSync.exe <nomefilebatch>. Puoi anche schedulare l'operazione nelle operazioni pianificate del sistema operativo. -At least one directory input field is empty. -Almeno un campo di inserimento cartella e' vuoto. -Auto-adjust columns -Larghezza automatica colonne -Batch execution -Esecuzione in batch -Batch file created successfully! -Creazione batch file riuscita! -Batch job -Batch job -Big thanks for localizing FreeFileSync goes out to: -Per la traduzione di FreeFileSync, un grazie va a: -Both sides have changed since last synchronization! -Entrambi i lati sono cambiati dall'ultima sincronizzazione! -Browse -Sfoglia -Browse directory -Sfoglia cartelle -Cannot determine sync-direction: -Impossibile determinare direzione di sincronia: -Cannot find %x -Impossibile trovare %x -Category -Categoria -Clear filter settings -Pulisci impostazioni filtro -Comma separated list -Lista di elementi separati da virgola -Command line -Linea di comando -Command line is empty! -Linea di comando e' vuota! -Compare -Compara -Compare both sides -Compara le due liste -Compare by \"File content\" -Compara per \"Contenuto dei file\" -Compare by \"File size and date\" -Compara per \"Data e dimensione\" -Compare by... -Compara per... -Comparing content of files %x -Comparazione contenuto del file %x -Comparing content... -Comparazione contenuto... -Comparing files by content failed. -Comparazione file in base al contenuto fallita. -Comparison Result -Risultato della comparazione -Comparison settings -Impostazioni di comparazione -Completed -Completato -Configuration -Configurazione -Configuration loaded! -Configurazione caricata! -Configuration overview: -Controllo configurazione: -Configuration saved! -Configurazione salvata! -Configure filter -Configurazione dei filtri -Configure your own synchronization rules. -Configura le tue regole di sincronizzazione. -Confirm -Conferma -Conflict detected: -Rilevato conflitto: -Conflicts/files that cannot be categorized -Conflitti/files senza categoria di appartenenza -Continue -Continua -Conversion error: -Errore di conversione: -Copy attributes only from left to right -Copia attributi solo da sinistra a destra -Copy attributes only from right to left -Copia attributi solo da destra a sinistra -Copy filesystem permissions -Copia permessi del filesystem -Copy from left to right -Copia da sinistra a destra -Copy from left to right overwriting -Copia sinistra a destra sovrascrivendo -Copy from right to left -Copia da destra a sinistra -Copy from right to left overwriting -Copia da destra a sinistra sovrascrivendo -Copy locked files -Copia file bloccati -Copy new or updated files to right folder. -Copia file nuovi o aggiornati nella cartella di destra. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copia file condivisi o bloccati usando il Servizio Volume Shadow Copy\n(Richiede diritti di Administrator) -Copy to clipboard\tCTRL+C -Copia nella clipboard\tCTRL+C -Copying new Symbolic Link %x to %y -Copia di nuovo Link Simbolico %x su %y in corso -Copying new file %x to %y -Copia di nuovo file %x su %y in corso -Could not determine volume name for file: -Impossibile determinare il nome volume per il file: -Could not initialize directory monitoring: -Monitoraggio directory non inizializzabile: -Could not load a required DLL: -Impossibile caricare una DLL richiesta: -Could not read values for the following XML nodes: -Impossibile leggere i valori per i seguenti nodi XML: -Create a batch job -Creazione di un job batch -Creating folder %x -Creazione cartella %x -Custom -Personalizza -Customize columns -Personalizza colonne -Customize... -Personalizza... -D-Click -D-Click -DECISION TREE -ALBERO DELLE DECISIONI -Data verification error: Source and target file have different content! -Errore in verifica data: I file sorgente e destinazione hanno differente contenuto! -Date -Data -Delete files/folders existing on left side only -Elimina files/cartelle esistenti solo a sinistra -Delete files/folders existing on right side only -Elimina files/cartelle esistenti solo a destra -Delete files\tDEL -Elimina file\tDEL -Delete on both sides -Cancella su entrambi i lati -Delete on both sides even if the file is selected on one side only -Cancella su entrambi i lati anche se il file è selezionato su un solo lato. -Delete or overwrite files permanently -Cancella o sovrascrivi file definitivamente -Delete permanently -Cancella definitivamente -Deleting Symbolic Link %x -Eliminazione Link Simbolico %x -Deleting file %x -Eliminazione file %x -Deleting folder %x -Eliminazione cartella %x -Deletion handling -Gestione cancellazione -Description -Descrizione -Direct -Diretto -Directories are dependent! Be careful when setting up synchronization rules: -Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione: -Directories to watch -Directory da controllare -Directory -Directory -Directory does not exist: -La directory non esiste: -Do not show this dialog again -Non visualizzare più questo messaggio -Do nothing -Non fare nulla -Do you really want to delete the following object(s)? -Vuoi veramente eliminare i seguenti oggetti? -Do you really want to move the following object(s) to the Recycle Bin? -Vuoi veramente spostare i seguenti oggetti nel Cestino? -Do you want FreeFileSync to automatically check for updates every week? -Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana? -Donate with PayPal -Fai una donazione con PayPal -Download now? -Scaricare ora? -Drag && drop -Drag && drop -Elements found: -Elementi trovati: -Elements processed: -Elementi processati: -Elements remaining: -Elementi rimanenti: -Email -Email -Encoding extended time information: %x -Codifica estesa informazioni orario: %x -Endless loop when traversing directory: -Loop senza fine attraverso le directory: -Equal files/folders that differ in attributes only -Considera uguali file/cartelle che differiscono solo per gli attributi -Error -Errore -Error changing modification time: -Errore durante la modifica della data: -Error copying file permissions: -Errore durante la copia dei permessi su file: -Error copying file: -Errore durante la copia del file: -Error copying locked file %x! -Errore durante la copia del file bloccato %x! -Error copying symbolic link: -Errore durante la copia del link simbolico: -Error creating directory: -Errore durante la creazione della directory: -Error deleting directory: -Errore durante l'eliminazione delle directory: -Error deleting file: -Errore durante l'eliminazione del file: -Error handling -Gestione degli errori -Error loading library function: -Errore nel caricamento della funzione libreria: -Error moving directory: -Errore nello spostamento directory: -Error moving file: -Errore nello spostamento file: -Error moving to Recycle Bin: -Errore durante lo spostamento nel Cestino: -Error opening file: -Errore in apertura file: -Error parsing configuration file: -Errore nell'analisi del file di configurazione: -Error reading file attributes: -Errore di lettura degli attributi file: -Error reading file: -Errore durante la lettura del file: -Error reading from synchronization database: -Errore in lettura dal database di sincronizzione: -Error reading security context: -Errore in lettura del contesto di sicurezza: -Error resolving symbolic link: -Errore nella risoluzione di collegamento simbolico: -Error setting directory lock: -Errore nell'impostazione del blocco directory: -Error setting privilege: -Errore nell'impostazione dei privilegi: -Error starting Volume Shadow Copy Service! -Errore in avvio del Servizio Volume Shadow Copy! -Error traversing directory: -Errore nel percorso della directory: -Error when monitoring directories. -Errore durante il monitoraggio directory. -Error writing file: -Errore durante la scrittura del file: -Error writing security context: -Errore in scrittura del contesto di sicurezza: -Error writing to synchronization database: -Errore in scrittura sul database di sincronizzazione: -Example -Esempio -Exclude -Escludi -Exclude all rows -Escludi tutte le righe -Exclude temporarily -Escludi temporaneamente -Exclude via filter: -Escludi tramite filtro: -Exit instantly -Esci istantaneamente -Extension -Estensione -External applications -Applicazioni esterne -Fatal Error -Fatal Error -Feedback and suggestions are welcome at: -Commenti e suggerimenti sono i benvenuti: -File %x has an invalid date! -Il file %x ha una data non valida! -File already exists. Overwrite? -Il file esiste già . Lo vuoi sovrascrivere? -File content -Contenuto del file -File does not exist: -Il file non esiste: -File list exported! -Lista dei file esportata! -File size and date -Dimensione e data del file -Filename -Nome del file -Files %x have the same date but a different size! -I file %x hanno la stessa data ma dimensione diversa! -Files are found equal if\n - file content\nis the same -I file sono considerati identici se\n - il contenuto\nè identico -Files are found equal if\n - filesize\n - last write time and date\nare the same -I file sono considerati identici se\n - dimensione\n - data e ora sono identici -Files that are equal on both sides -Files identici su entrambi i lati -Files that exist on both sides, left one is newer -Files esistenti su entrambi i lati, più recenti a sinistra -Files that exist on both sides, right one is newer -Files esistenti su entrambi i lati, più recenti a destra -Files that have different content -Files con contenuto differente -Files/folders that exist on left side only -Files/cartelle esistenti solo a sinistra -Files/folders that exist on right side only -Files/cartelle esistenti solo a destra -Filter files -Filtro dei files -Filter is active -Il filtro e' attivo -Filter settings have changed! -Le impostazioni del filtro sono cambiate! -Filter: All pairs -Filtro: Tutte le coppie -Filter: Single pair -Filtro: Singola coppia -Find -Trova -Find what: -Trova cosa: -Folder Comparison and Synchronization -Comparazione di Cartelle e Sincronizzazione -Folder pairs -Coppia di cartelle -Follow -Segui -Free disk space available: -Spazio libero su disco disponibile: -Free disk space required: -Spazio libero su disco richiesto: -FreeFileSync Batch Job -FreeFileSync Batch Job -FreeFileSync at Sourceforge -FreeFileSync su Sourceforge -FreeFileSync batch file -FreeFileSync batch file -FreeFileSync configuration -Configurazione di FreeFileSync -FreeFileSync is up to date! -FreeFileSync è aggiornato! -Full path -Percorso completo -Generating database... -Generazione database... -Generating file list... -Generazione lista dei file... -Global settings -Preferenze -Help -Aiuto -Hidden dialogs: -Messaggi nascosti: -Hide all error and warning messages -Nascondi tutti gli errori e i messaggi d'avviso -Hide conflicts -Nascondi i conflitti -Hide excluded items -Nascondi oggetti esclusi -Hide files that are different -Nascondi i file differenti -Hide files that are equal -Nascondi i file identici -Hide files that are newer on left -Nascondi i file più recenti a sinistra -Hide files that are newer on right -Nascondi i file più recenti a destra -Hide files that exist on left side only -Nascondi i file esistenti solo a sinistra -Hide files that exist on right side only -Nascondi i file esistenti solo a destra -Hide files that will be created on the left side -Nascondi i file che verranno creati sul lato sinistro -Hide files that will be created on the right side -Nascondi i file che verranno creati sul lato destro -Hide files that will be deleted on the left side -Nascondi i file che verranno cancellati sul lato sinistro -Hide files that will be deleted on the right side -Nascondi i file che verranno cancellati sul lato destro -Hide files that will be overwritten on left side -Nascondi i file che verranno sovrascritti sul lato sinistro -Hide files that will be overwritten on right side -Nascondi i file che verranno sovrascritti sul lato destro -Hide files that won't be copied -Nascondi i file che non saranno copiati -Hide filtered or temporarily excluded files -Nascondi file filtrati o temporaneamente esclusi -Hide further error messages during the current process -Non mostrare i successivi messaggi d'errore durante il processo corrente -Hints: -Consigli: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente. -Idle time between detection of last change and execution of command line in seconds -Tempo di attesa in secondi fra il rilevamento dell'ultima modifica e l'esecuzione della linea di comando -If you like FFS -Se ti piace FFS -Ignore -Ignora -Ignore errors -Ignora gli errori -Ignore subsequent errors -Ignora gli errori successivi -Include -Includi -Include all rows -Includi tutte le righe -Include temporarily -Includi temporaneamente -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Includi: *.doc;*.zip;*.exe\nEscludi: \\stuff\\temp\\* -Incompatible synchronization database format: -Formato database di sincronizzazione incompatibile: -Info -Info -Information -Informazioni -Initial synchronization: -Prima sincronizzazione: -Integrate external applications into context menu. The following macros are available: -Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro: -Invalid FreeFileSync config file! -File di configurazione FreeFileSync non valido! -Last used configurations (press DEL to remove from list) -Ultima configurazione utilizzata (premi DEL per rimuovere dalla lista) -Leave as unresolved conflict -Lascia come conflitti irrisolti -Left -Sinistra -Legend -Legenda -Load configuration from file -Carica configurazione da file -Log-messages: -Log-messages: -Logging -Logging -Main bar -Barra principale -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit. -Match case -Corrispondenza -Maximum number of logfiles: -Numero massimo di logfiles: -Memory allocation failed! -Allocazione di memoria fallita! -Minimum Idle Time [seconds] -Tempo minimo di attesa [seconds] -Mirror ->> -Mirror ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Mirror backup della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione. -Monitoring active... -Monitoraggio attivo... -More than 50% of the total number of files will be copied or deleted! -Piu' del 50% del totale dei files saranno copiati o cancellati! -Move column down -Sposta colonna giu' -Move column up -Sposta colonna su' -Move files into a time-stamped subdirectory -Sposta file in una sotto-cartella datata -Moving %x to Recycle Bin -Spostamento di %x nel Cestino -Moving Symbolic Link %x to user-defined directory %y -Spostamento Link Simbolico %x su directory definita dall'utente %y -Moving file %x to user-defined directory %y -Spostamento del file %x nella directory personalizzata %y -Moving folder %x to user-defined directory %y -Spostamento di cartella %x nella directory personalizzata %y -Multiple... -Multiplo... -No change since last synchronization! -Nessun cambiamento dall'ultima sincronizzazione! -No filter selected -Nessun filtro selezionato -Not enough free disk space available in: -Spazio libero su disco insufficiente in: -Nothing to synchronize according to configuration! -Niente da sincronizzare in questa configurazione! -Number of files and directories that will be created -Numero di file e cartelle che verranno creati -Number of files and directories that will be deleted -Numero di file e cartelle che verranno eliminati -Number of files that will be overwritten -Numero di file che verranno sovrascritti -One of the FreeFileSync database entries within the following file is not yet existing: -Una voce del database di FreeFileSync nel seguente file non e' ancora stata creata: -One of the FreeFileSync database files is not yet existing: -Un file database di FreeFileSync non è ancora stato creato: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Solo file e directory che passano il filtro saranno selezionati per la sincronizzazione. Il filtro verrà applicato al nome relativo(!) sulla base delle directory di sincronizzazione. -Open with Explorer -Apri con Explorer -Open with default application -Apri con applicazione di default -Operation aborted! -Operazione abortita! -Operation: -Operazione: -Overview -Controllo generale -Overwriting Symbolic Link %x in %y -Sovrascrittura di Link Simbolico %x in %y in corso -Overwriting file %x in %y -Sovrascrittura di file %x in %y in corso -Pause -Pausa -Paused -In pausa -Planned directory deletion is in conflict with its subdirectories and -files! -La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files! -Please run a Compare first before synchronizing! -Prima di sincronizzare effettua una Comparazione! -Press \"Switch\" to open FreeFileSync GUI mode. -Premi \"Switch\" per aprire modalità GUI di FreeFileSync -Processing folder pair: -Elaborazione coppia di cartelle: -Published under the GNU General Public License: -Pubblicato sotto licenza GNU General Public: -Question -Domanda -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronizzazione Automatizzata -RealtimeSync configuration -Configurazione di RealtimeSync -Recycle Bin not yet supported for this system! -Cestino non ancora supportato per questo sistema! -Relative path -Percorso relativo -Remove alternate settings -Rimuovi impostazioni alternative -Remove folder -Rimuovi cartella -Remove folder pair -Elimina la coppia di cartelle -Report translation error -Segnala errori di traduzione -Reset -Reset -Reset view -Resetta vista -Restore all hidden dialogs? -Ripristinare tutti i dialoghi nascosti? -Right -Destra -S&ave configuration... -S&alva la configurazione... -S&witch view -C&ommuta vista -Save changes to current configuration? -Salvare i cambiamenti alla configurazione corrente? -Save current configuration to file -Salva su file la configurazione corrente -Scanning... -Analisi in corso... -Scanning: -Analisi in corso: -Select a folder -Seleziona una cartella -Select alternate synchronization settings -Seleziona impostazioni di sincronizzazione alternative -Select logfile directory: -Seleziona cartella per il file di log: -Select variant: -Selezionare una variante: -Select view -Seleziona vista -Set direction: -Imposta direzione: -Setting default synchronization directions: Old files will be overwritten with newer files. -Imposta direzioni di sincronizzazione di default: I vecchi file saranno sovrascritti dai nuovi. -Show \"%x\" -Mostra \"%x\" -Show conflicts -Mostra conflitti -Show files that are different -Mostra file differenti -Show files that are equal -Mostra file identici -Show files that are newer on left -Mostra file di sinistra più recenti che a destra -Show files that are newer on right -Mostra file di destra più recenti che a sinistra -Show files that exist on left side only -Mostra file esistenti solo a sinistra -Show files that exist on right side only -Mostra file esistenti solo a destra -Show files that will be created on the left side -Mostra file che verranno creati sul lato sinistro -Show files that will be created on the right side -Mostra file che verranno creati sul lato destro -Show files that will be deleted on the left side -Mostra file che verranno cancellati sul lato sinistro -Show files that will be deleted on the right side -Mostra file che verranno cancellati sul lato destro -Show files that will be overwritten on left side -Mostra file che verranno sovrascritti sul lato sinistro -Show files that will be overwritten on right side -Mostra file che verranno sovrascritti sul lato destro -Show files that won't be copied -Mostra file che non saranno copiati -Show hidden dialogs -Mostra messaggi nascosti -Show popup -Mostra popup -Show popup on errors or warnings -Mostra popup degli errori o avvisi -Significant difference detected: -Riscontrate differenze significative: -Silent mode -Modalità Silenziosa -Size -Dimensione -Source code written completely in C++ utilizing: -Codice sorgente scritto completamente in C++ \ne utilizzando: -Source directory does not exist anymore: -La directory sorgente non è più esistente: -Speed: -Velocita': -Start -Avvia -Start minimized and write status information to a logfile -Lancia minimizzato e scrivi informazioni di stato in un file log -Start synchronization -Avvia sincronizzazione -Statistics -Statistiche -Status feedback -Feedback di stato -Stop -Stop -Swap sides -Inverti i lati -Switching to FreeFileSync GUI mode... -Switch alla modalità GUI di FreeFileSync... -Symbolic Link handling -Gestione Link Simbolico -Symlinks %x have the same date but a different target! -Symlinks %x hanno stessa data ma differente target! -Synchronization Preview -Anteprima Sincronizzazione -Synchronization aborted! -Sincronizzazione abortita! -Synchronization completed successfully! -Sincronizzazione completata con successo! -Synchronization completed with errors! -Sincronizzazione terminata con errori! -Synchronization settings -Parametri di sincronizzazione -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella \"temp\". -Synchronize... -Sincronizza... -Synchronizing... -Sincronizzazione in corso... -Target directory already existing! -Directory di destinazione già esistente! -Target file already existing! -File destinazione già esistente! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -La linea di comando è eseguita ogni volta che:\n- tutte le cartelle diventano disponibili (es: inserimento memoria USB)\n- file in queste cartelle o sottocartelle vengono modificati -The file does not contain a valid configuration: -Il file non contiene una configurazione valida -The file was not processed by last synchronization! -Il file non era processato nell'ultima sincronizzazione! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora. -Time -Ora -Time elapsed: -Tempo trascorso: -Time remaining: -Tempo rimanente: -Total amount of data that will be transferred -Volume dei dati che verranno trasferiti -Total time: -Tempo totale: -Transfer file and directory permissions\n(Requires Administrator rights) -Trasferisci file e permessi sulle cartelle\n(Richiede diritti di Administrator) -Unable to connect to sourceforge.net! -Impossibile collegarsi a sourceforge.net! -Unable to create logfile! -Impossibile creaer il file di log! -Unresolved conflicts existing! -Sono presenti conflitti irrisolti! -Update -> -Aggiorna -> -Updating attributes of %x -Aggiornamento attributi di %x -Usage: -Uso: -Use Recycle Bin -Usa il Cestino -Use Recycle Bin when deleting or overwriting files -Usa il Cestino quando si cancella o sovrascrive un file -User-defined directory for deletion was not specified! -Directory personalizzata per la cancellazione non specificata! -Variant -Variante -Verifying file %x -Verifica di file %x -Versioning -Versioning -Volume name %x not part of filename %y! -Il nome volume %x non è parte del nome file %y! -Waiting for missing directories... -In attesa delle directory mancanti... -Waiting while directory is locked (%x)... -Attendi mentre la directory è bloccata (%x)... -Warning -Attenzione -When the comparison is started with this option set the following decision tree is processed: -Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni: -You can ignore conflicts and continue synchronization. -Puoi ignorare i conflitti e continuare la sincronizzazione. -You can ignore this error to consider the directory as empty. -Puoi ignorare questo errore per considerare la directory come vuota. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) ! -different -file differenti -file exists on both sides -file esistente su entrambi i lati -on one side only -file esistente su un solo lato +<header> + <language name>Italiano</language name> + <translator>Emmo</translator> + <locale>it_IT</locale> + <flag file>italy.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target></target> +<source>Open with default application</source> +<target>Apri con applicazione di default</target> +<source>Browse directory</source> +<target>Sfoglia cartelle</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Sincronizzazione Automatizzata</target> +<source>Browse</source> +<target>Sfoglia</target> +<source>Error resolving symbolic link:</source> +<target>Errore nella risoluzione di collegamento simbolico:</target> +<source>Select alternate synchronization settings</source> +<target>Seleziona impostazioni di sincronizzazione alternative</target> +<source>No filter selected</source> +<target>Nessun filtro selezionato</target> +<source>Filter is active</source> +<target>Il filtro e' attivo</target> +<source>Clear filter settings</source> +<target>Pulisci impostazioni filtro</target> +<source>Remove alternate settings</source> +<target>Rimuovi impostazioni alternative</target> +<source>Create a batch job</source> +<target>Creazione di un job batch</target> +<source>Synchronization settings</source> +<target>Parametri di sincronizzazione</target> +<source>Comparison settings</source> +<target>Impostazioni di comparazione</target> +<source>About</source> +<target>A proposito di</target> +<source>Error</source> +<target>Errore</target> +<source>Warning</source> +<target>Attenzione</target> +<source>Question</source> +<target>Domanda</target> +<source>Confirm</source> +<target>Conferma</target> +<source>Configure filter</source> +<target>Configurazione dei filtri</target> +<source>Customize columns</source> +<target>Personalizza colonne</target> +<source>Global settings</source> +<target>Preferenze</target> +<source>Synchronization Preview</source> +<target>Anteprima Sincronizzazione</target> +<source>Find</source> +<target>Trova</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target></target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +</target> +<source><Symlink></source> +<target><Symlink></target> +<source><Directory></source> +<target><Directory></target> +<source>Size</source> +<target>Dimensione</target> +<source>Date</source> +<target>Data</target> +<source>Full path</source> +<target>Percorso completo</target> +<source>Filename</source> +<target>Nome del file</target> +<source>Relative path</source> +<target>Percorso relativo</target> +<source>Directory</source> +<target>Directory</target> +<source>Extension</source> +<target>Estensione</target> +<source>Comparison Result</source> +<target>Risultato della comparazione</target> +<source>Incompatible synchronization database format:</source> +<target>Formato database di sincronizzazione incompatibile:</target> +<source>Initial synchronization:</source> +<target>Prima sincronizzazione:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Un file database di FreeFileSync non è ancora stato creato:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Una voce del database di FreeFileSync nel seguente file non e' ancora stata creata:</target> +<source>Error reading from synchronization database:</source> +<target>Errore in lettura dal database di sincronizzione:</target> +<source>An exception occurred!</source> +<target>Si è verificato un problema!</target> +<source>Error deleting file:</source> +<target>Errore durante l'eliminazione del file:</target> +<source>Error reading file attributes:</source> +<target>Errore di lettura degli attributi file:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Attendi mentre la directory è bloccata (%x)...</target> +<source>Error setting directory lock:</source> +<target>Errore nell'impostazione del blocco directory:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Fatal Error</target> +<source>File does not exist:</source> +<target>Il file non esiste:</target> +<source>Error parsing configuration file:</source> +<target>Errore nell'analisi del file di configurazione:</target> +<source>Error writing file:</source> +<target>Errore durante la scrittura del file:</target> +<source>Invalid FreeFileSync config file!</source> +<target>File di configurazione FreeFileSync non valido!</target> +<source>/sec</source> +<target>/sec</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +</target> +<source>S&ave configuration...</source> +<target>S&alva la configurazione...</target> +<source>&Load configuration...</source> +<target>&Carica la configurazione...</target> +<source>&Quit</source> +<target>&Esci</target> +<source>&File</source> +<target>&File</target> +<source>&Content</source> +<target>&Contenuto</target> +<source>&About...</source> +<target>&Informazioni...</target> +<source>&Help</source> +<target>&Aiuto</target> +<source>Usage:</source> +<target>Uso:</target> +<source>1. Select directories to monitor.</source> +<target>1. Seleziona cartelle da monitorare.</target> +<source>2. Enter a command line.</source> +<target>2. Inserisci linea di comando.</target> +<source>3. Press 'Start'.</source> +<target>3. Premi 'Start'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +La linea di comando è eseguita ogni volta che: +- tutte le cartelle diventano disponibili (es: inserimento memoria USB) +- file in queste cartelle o sottocartelle vengono modificati +</target> +<source>Directories to watch</source> +<target>Directory da controllare</target> +<source>Add folder</source> +<target>Aggiungi cartella</target> +<source>Remove folder</source> +<target>Rimuovi cartella</target> +<source>Select a folder</source> +<target>Seleziona una cartella</target> +<source>Command line</source> +<target>Linea di comando</target> +<source>Minimum Idle Time [seconds]</source> +<target>Tempo minimo di attesa [seconds]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Tempo di attesa in secondi fra il rilevamento dell'ultima modifica e l'esecuzione della linea di comando</target> +<source>Start</source> +<target>Avvia</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>Configurazione di RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Il file esiste già . Lo vuoi sovrascrivere?</target> +<source>&Restore</source> +<target>&Ripristina</target> +<source>&Exit</source> +<target>&Esci</target> +<source>Monitoring active...</source> +<target>Monitoraggio attivo...</target> +<source>Waiting for missing directories...</source> +<target>In attesa delle directory mancanti...</target> +<source>Command line is empty!</source> +<target>Linea di comando e' vuota!</target> +<source>Could not initialize directory monitoring:</source> +<target>Monitoraggio directory non inizializzabile:</target> +<source>A directory input field is empty.</source> +<target>Un campo directory di input è vuoto.</target> +<source>Error when monitoring directories.</source> +<target>Errore durante il monitoraggio directory.</target> +<source>Drag && drop</source> +<target>Drag && drop</target> +<source>Conversion error:</source> +<target>Errore di conversione:</target> +<source>Error moving file:</source> +<target>Errore nello spostamento file:</target> +<source>Operation aborted!</source> +<target>Operazione abortita!</target> +<source>Target file already existing!</source> +<target>File destinazione già esistente!</target> +<source>Error moving directory:</source> +<target>Errore nello spostamento directory:</target> +<source>Target directory already existing!</source> +<target>Directory di destinazione già esistente!</target> +<source>Error deleting directory:</source> +<target>Errore durante l'eliminazione delle directory:</target> +<source>Error changing modification time:</source> +<target>Errore durante la modifica della data:</target> +<source>Error loading library function:</source> +<target>Errore nel caricamento della funzione libreria:</target> +<source>Error reading security context:</source> +<target>Errore in lettura del contesto di sicurezza:</target> +<source>Error writing security context:</source> +<target>Errore in scrittura del contesto di sicurezza:</target> +<source>Error copying file permissions:</source> +<target>Errore durante la copia dei permessi su file:</target> +<source>Error creating directory:</source> +<target>Errore durante la creazione della directory:</target> +<source>Error copying symbolic link:</source> +<target>Errore durante la copia del link simbolico:</target> +<source>Error copying file:</source> +<target>Errore durante la copia del file:</target> +<source>Error opening file:</source> +<target>Errore in apertura file:</target> +<source>Error reading file:</source> +<target>Errore durante la lettura del file:</target> +<source>Endless loop when traversing directory:</source> +<target>Loop senza fine attraverso le directory:</target> +<source>Error traversing directory:</source> +<target>Errore nel percorso della directory:</target> +<source>Error setting privilege:</source> +<target>Errore nell'impostazione dei privilegi:</target> +<source>Error moving to Recycle Bin:</source> +<target>Errore durante lo spostamento nel Cestino:</target> +<source>Could not load a required DLL:</source> +<target>Impossibile caricare una DLL richiesta:</target> +<source>Error writing to synchronization database:</source> +<target>Errore in scrittura sul database di sincronizzazione:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Errore in avvio del Servizio Volume Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit.</target> +<source>Could not determine volume name for file:</source> +<target>Impossibile determinare il nome volume per il file:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Il nome volume %x non è parte del nome file %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Impossibile leggere i valori per i seguenti nodi XML:</target> +<source>Show popup</source> +<target>Mostra popup</target> +<source>Show popup on errors or warnings</source> +<target>Mostra popup degli errori o avvisi</target> +<source>Ignore errors</source> +<target>Ignora gli errori</target> +<source>Hide all error and warning messages</source> +<target>Nascondi tutti gli errori e i messaggi d'avviso</target> +<source>Exit instantly</source> +<target>Esci istantaneamente</target> +<source>Abort synchronization immediately</source> +<target>Interrompi immediatamente la sincronizzazione</target> +<source>Logging</source> +<target>Logging</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync batch file</target> +<source>FreeFileSync configuration</source> +<target>Configurazione di FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Batch Job</target> +<source>Unable to create logfile!</source> +<target>Impossibile creaer il file di log!</target> +<source>Batch execution</source> +<target>Esecuzione in batch</target> +<source>Log-messages:</source> +<target>Log-messages:</target> +<source>Stop</source> +<target>Stop</target> +<source>Total time:</source> +<target>Tempo totale:</target> +<source>Synchronization aborted!</source> +<target>Sincronizzazione abortita!</target> +<source>Synchronization completed with errors!</source> +<target>Sincronizzazione terminata con errori!</target> +<source>Synchronization completed successfully!</source> +<target>Sincronizzazione completata con successo!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Premi "Switch" per aprire modalità GUI di FreeFileSync</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Switch alla modalità GUI di FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Impossibile collegarsi a sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>E' disponibile una nuova versione di FreeFileSync:</target> +<source>Download now?</source> +<target>Scaricare ora?</target> +<source>Information</source> +<target>Informazioni</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync è aggiornato!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana?</target> +<source>(Requires an Internet connection!)</source> +<target>(Richiede una connessione Internet!)</target> +<source>1. &Compare</source> +<target>1. &Compara</target> +<source>2. &Synchronize...</source> +<target>2. &Sincronizza...</target> +<source>S&witch view</source> +<target>C&ommuta vista</target> +<source>&New</source> +<target>&Nuovo</target> +<source>&Program</source> +<target>&Programma</target> +<source>&Language</source> +<target>&Lingua</target> +<source>&Global settings...</source> +<target>&Preferenze...</target> +<source>&Create batch job...</source> +<target>&Crea un job in batch...</target> +<source>&Export file list...</source> +<target>&Esporta la lista dei file...</target> +<source>&Advanced</source> +<target>&Avanzate</target> +<source>&Check for new version</source> +<target>&Controlla la presenza di nuove versioni</target> +<source>Compare</source> +<target>Compara</target> +<source>Compare both sides</source> +<target>Compara le due liste</target> +<source>&Abort</source> +<target>&Abbandona</target> +<source>Synchronize...</source> +<target>Sincronizza...</target> +<source>Start synchronization</source> +<target>Avvia sincronizzazione</target> +<source>Swap sides</source> +<target>Inverti i lati</target> +<source>Add folder pair</source> +<target>Aggiungi una coppia di cartelle</target> +<source>Remove folder pair</source> +<target>Elimina la coppia di cartelle</target> +<source>Save current configuration to file</source> +<target>Salva su file la configurazione corrente</target> +<source>Load configuration from file</source> +<target>Carica configurazione da file</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Ultima configurazione utilizzata (premi DEL per rimuovere dalla lista)</target> +<source>Hide excluded items</source> +<target>Nascondi oggetti esclusi</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Nascondi file filtrati o temporaneamente esclusi</target> +<source>Number of files and directories that will be created</source> +<target>Numero di file e cartelle che verranno creati</target> +<source>Number of files that will be overwritten</source> +<target>Numero di file che verranno sovrascritti</target> +<source>Number of files and directories that will be deleted</source> +<target>Numero di file e cartelle che verranno eliminati</target> +<source>Total amount of data that will be transferred</source> +<target>Volume dei dati che verranno trasferiti</target> +<source>Left</source> +<target>Sinistra</target> +<source>Right</source> +<target>Destra</target> +<source>Batch job</source> +<target>Batch job</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Componi un file batch per la sincronia automatica. Per partire in modalità batch fai semplicemente seguire il nome del file all'eseguibile di FreeFileSync: FreeFileSync.exe <nomefilebatch>. Puoi anche schedulare l'operazione nelle operazioni pianificate del sistema operativo.</target> +<source>Help</source> +<target>Aiuto</target> +<source>Configuration overview:</source> +<target>Controllo configurazione:</target> +<source>Filter files</source> +<target>Filtro dei files</target> +<source>Status feedback</source> +<target>Feedback di stato</target> +<source>Silent mode</source> +<target>Modalità Silenziosa</target> +<source>Start minimized and write status information to a logfile</source> +<target>Lancia minimizzato e scrivi informazioni di stato in un file log</target> +<source>Error handling</source> +<target>Gestione degli errori</target> +<source>Overview</source> +<target>Controllo generale</target> +<source>Select logfile directory:</source> +<target>Seleziona cartella per il file di log:</target> +<source>Maximum number of logfiles:</source> +<target>Numero massimo di logfiles:</target> +<source>&Save</source> +<target>&Salva</target> +<source>&Load</source> +<target>&Carica</target> +<source>&Cancel</source> +<target>&Annulla</target> +<source>Elements found:</source> +<target>Elementi trovati:</target> +<source>Elements remaining:</source> +<target>Elementi rimanenti:</target> +<source>Speed:</source> +<target>Velocita':</target> +<source>Time remaining:</source> +<target>Tempo rimanente:</target> +<source>Time elapsed:</source> +<target>Tempo trascorso:</target> +<source>Operation:</source> +<target>Operazione:</target> +<source>Select variant:</source> +<target>Selezionare una variante:</target> +<source><Automatic></source> +<target><Automatico></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente.</target> +<source>Mirror ->></source> +<target>Mirror ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Mirror backup della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione.</target> +<source>Update -></source> +<target>Aggiorna -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copia file nuovi o aggiornati nella cartella di destra.</target> +<source>Custom</source> +<target>Personalizza</target> +<source>Configure your own synchronization rules.</source> +<target>Configura le tue regole di sincronizzazione.</target> +<source>Deletion handling</source> +<target>Gestione cancellazione</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configurazione</target> +<source>Category</source> +<target>Categoria</target> +<source>Action</source> +<target>Azioni</target> +<source>Files/folders that exist on left side only</source> +<target>Files/cartelle esistenti solo a sinistra</target> +<source>Files/folders that exist on right side only</source> +<target>Files/cartelle esistenti solo a destra</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Files esistenti su entrambi i lati, più recenti a sinistra</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Files esistenti su entrambi i lati, più recenti a destra</target> +<source>Files that have different content</source> +<target>Files con contenuto differente</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflitti/files senza categoria di appartenenza</target> +<source>Compare by...</source> +<target>Compara per...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +I file sono considerati identici se + - dimensione + - data e ora sono identici +</target> +<source>File size and date</source> +<target>Dimensione e data del file</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +I file sono considerati identici se + - il contenuto +è identico +</target> +<source>File content</source> +<target>Contenuto del file</target> +<source>Symbolic Link handling</source> +<target>Gestione Link Simbolico</target> +<source>Synchronizing...</source> +<target>Sincronizzazione in corso...</target> +<source>Elements processed:</source> +<target>Elementi processati:</target> +<source>&Pause</source> +<target>&Pausa</target> +<source>Compare by "File size and date"</source> +<target>Compara per "Data e dimensione"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni:</target> +<source>As a result the files are separated into the following categories:</source> +<target>I file risultano infine ripartiti nelle seguenti categorie:</target> +<source>- equal</source> +<target>- file identici</target> +<source>- left newer</source> +<target>- file di sinistra più recente</target> +<source>- right newer</source> +<target>- file di destra più recente</target> +<source>- exists left only</source> +<target>- il file esiste solo a sinistra</target> +<source>- exists right only</source> +<target>- il file esiste solo a destra</target> +<source>- conflict</source> +<target>- conflitto</target> +<source>Compare by "File content"</source> +<target>Compara per "Contenuto dei file"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate. + +Abilitando questa opzione l'albero delle decisioni è semplificato: +</target> +<source>- different</source> +<target>- file diversi</target> +<source>Source code written in C++ utilizing:</source> +<target></target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Per la traduzione di FreeFileSync, un grazie va a:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Commenti e suggerimenti sono i benvenuti:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync su Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>Se ti piace FFS</target> +<source>Donate with PayPal</source> +<target>Fai una donazione con PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Segnala errori di traduzione</target> +<source>Published under the GNU General Public License:</source> +<target>Pubblicato sotto licenza GNU General Public:</target> +<source>Ignore subsequent errors</source> +<target>Ignora gli errori successivi</target> +<source>Hide further error messages during the current process</source> +<target>Non mostrare i successivi messaggi d'errore durante il processo corrente</target> +<source>&Ignore</source> +<target>&Ignora</target> +<source>&Retry</source> +<target>&Riprova</target> +<source>Do not show this dialog again</source> +<target>Non visualizzare più questo messaggio</target> +<source>&Switch</source> +<target>&Switch</target> +<source>&Yes</source> +<target>&Si</target> +<source>&No</source> +<target>&No</target> +<source>Delete on both sides</source> +<target>Cancella su entrambi i lati</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Cancella su entrambi i lati anche se il file è selezionato su un solo lato.</target> +<source>Use Recycle Bin</source> +<target>Usa il Cestino</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target></target> +<source>Hints:</source> +<target>Consigli:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Inserisci i nomi relativi di file o directory separati da ';' o su una nuova riga.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Sono ammessi i caratteri generici '*' e '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Escludi i file direttamente sulla griglia principale tramite il menu contestuale.</target> +<source>Example</source> +<target>Esempio</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target></target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella "temp".</target> +<source>Include</source> +<target>Includi</target> +<source>Exclude</source> +<target>Escludi</target> +<source>Select time span:</source> +<target></target> +<source>Minimum file size:</source> +<target></target> +<source>Maximum file size:</source> +<target></target> +<source>&Default</source> +<target>&Default</target> +<source>Move column up</source> +<target>Sposta colonna su'</target> +<source>Move column down</source> +<target>Sposta colonna giu'</target> +<source>Copy locked files</source> +<target>Copia file bloccati</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copia file condivisi o bloccati usando il Servizio Volume Shadow Copy +(Richiede diritti di Administrator) +</target> +<source>Copy filesystem permissions</source> +<target>Copia permessi del filesystem</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Trasferisci file e permessi sulle cartelle +(Richiede diritti di Administrator) +</target> +<source>Hidden dialogs:</source> +<target>Messaggi nascosti:</target> +<source>Reset</source> +<target>Reset</target> +<source>Show hidden dialogs</source> +<target>Mostra messaggi nascosti</target> +<source>External applications</source> +<target>Applicazioni esterne</target> +<source>Description</source> +<target>Descrizione</target> +<source>Variant</source> +<target>Variante</target> +<source>Statistics</source> +<target>Statistiche</target> +<source>Find what:</source> +<target>Trova cosa:</target> +<source>Match case</source> +<target>Corrispondenza</target> +<source>&Find next</source> +<target>&Trova successivo</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) !</target> +<source>Batch file created successfully!</source> +<target>Creazione batch file riuscita!</target> +<source>Main bar</source> +<target>Barra principale</target> +<source>Folder pairs</source> +<target>Coppia di cartelle</target> +<source>Select view</source> +<target>Seleziona vista</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparazione di Cartelle e Sincronizzazione</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Cestino non ancora supportato per questo sistema!</target> +<source>Set direction:</source> +<target>Imposta direzione:</target> +<source>Exclude temporarily</source> +<target>Escludi temporaneamente</target> +<source>Include temporarily</source> +<target>Includi temporaneamente</target> +<source>Exclude via filter:</source> +<target>Escludi tramite filtro:</target> +<source><multiple selection></source> +<target><selezione multipla></target> +<source>D-Click</source> +<target>D-Click</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copia nella clipboard CTRL+C</target> +<source>Delete files DEL</source> +<target>Elimina file DEL</target> +<source>Customize...</source> +<target>Personalizza...</target> +<source>Auto-adjust columns</source> +<target>Larghezza automatica colonne</target> +<source>Include all rows</source> +<target>Includi tutte le righe</target> +<source>Exclude all rows</source> +<target>Escludi tutte le righe</target> +<source>Reset view</source> +<target>Resetta vista</target> +<source>Show "%x"</source> +<target>Mostra "%x"</target> +<source><Last session></source> +<target><Ultima sessione></target> +<source>Configuration saved!</source> +<target>Configurazione salvata!</target> +<source>Save changes to current configuration?</source> +<target>Salvare i cambiamenti alla configurazione corrente?</target> +<source>Configuration loaded!</source> +<target>Configurazione caricata!</target> +<source>Hide files that exist on left side only</source> +<target>Nascondi i file esistenti solo a sinistra</target> +<source>Show files that exist on left side only</source> +<target>Mostra file esistenti solo a sinistra</target> +<source>Hide files that exist on right side only</source> +<target>Nascondi i file esistenti solo a destra</target> +<source>Show files that exist on right side only</source> +<target>Mostra file esistenti solo a destra</target> +<source>Hide files that are newer on left</source> +<target>Nascondi i file più recenti a sinistra</target> +<source>Show files that are newer on left</source> +<target>Mostra file di sinistra più recenti che a destra</target> +<source>Hide files that are newer on right</source> +<target>Nascondi i file più recenti a destra</target> +<source>Show files that are newer on right</source> +<target>Mostra file di destra più recenti che a sinistra</target> +<source>Hide files that are equal</source> +<target>Nascondi i file identici</target> +<source>Show files that are equal</source> +<target>Mostra file identici</target> +<source>Hide files that are different</source> +<target>Nascondi i file differenti</target> +<source>Show files that are different</source> +<target>Mostra file differenti</target> +<source>Hide conflicts</source> +<target>Nascondi i conflitti</target> +<source>Show conflicts</source> +<target>Mostra conflitti</target> +<source>Hide files that will be created on the left side</source> +<target>Nascondi i file che verranno creati sul lato sinistro</target> +<source>Show files that will be created on the left side</source> +<target>Mostra file che verranno creati sul lato sinistro</target> +<source>Hide files that will be created on the right side</source> +<target>Nascondi i file che verranno creati sul lato destro</target> +<source>Show files that will be created on the right side</source> +<target>Mostra file che verranno creati sul lato destro</target> +<source>Hide files that will be deleted on the left side</source> +<target>Nascondi i file che verranno cancellati sul lato sinistro</target> +<source>Show files that will be deleted on the left side</source> +<target>Mostra file che verranno cancellati sul lato sinistro</target> +<source>Hide files that will be deleted on the right side</source> +<target>Nascondi i file che verranno cancellati sul lato destro</target> +<source>Show files that will be deleted on the right side</source> +<target>Mostra file che verranno cancellati sul lato destro</target> +<source>Hide files that will be overwritten on left side</source> +<target>Nascondi i file che verranno sovrascritti sul lato sinistro</target> +<source>Show files that will be overwritten on left side</source> +<target>Mostra file che verranno sovrascritti sul lato sinistro</target> +<source>Hide files that will be overwritten on right side</source> +<target>Nascondi i file che verranno sovrascritti sul lato destro</target> +<source>Show files that will be overwritten on right side</source> +<target>Mostra file che verranno sovrascritti sul lato destro</target> +<source>Hide files that won't be copied</source> +<target>Nascondi i file che non saranno copiati</target> +<source>Show files that won't be copied</source> +<target>Mostra file che non saranno copiati</target> +<source>All directories in sync!</source> +<target>Tutte le directory in sync!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Prima di sincronizzare effettua una Comparazione!</target> +<source>Comma separated list</source> +<target>Lista di elementi separati da virgola</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Lista dei file esportata!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +</target> +<source>Scanning...</source> +<target>Analisi in corso...</target> +<source>Comparing content...</source> +<target>Comparazione contenuto...</target> +<source>Paused</source> +<target>In pausa</target> +<source>Aborted</source> +<target>Abbandono riuscito</target> +<source>Completed</source> +<target>Completato</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abbandono richiesto: in attesa della fine dell'operazione in corso...</target> +<source>Continue</source> +<target>Continua</target> +<source>Pause</source> +<target>Pausa</target> +<source>Cannot find %x</source> +<target>Impossibile trovare %x</target> +<source>DECISION TREE</source> +<target>ALBERO DELLE DECISIONI</target> +<source>file exists on both sides</source> +<target>file esistente su entrambi i lati</target> +<source>on one side only</source> +<target>file esistente su un solo lato</target> +<source>- left</source> +<target>- a sinistra</target> +<source>- right</source> +<target>- a destra</target> +<source>different</source> +<target>file differenti</target> +<source>- conflict (same date, different size)</source> +<target>- conflitto (stessa data, dimensione diversa)</target> +<source>Inactive</source> +<target></target> +<source>Second</source> +<target></target> +<source>Minute</source> +<target></target> +<source>Hour</source> +<target></target> +<source>Day</source> +<target></target> +<source>Byte</source> +<target></target> +<source>KB</source> +<target></target> +<source>MB</source> +<target></target> +<source>Filter: All pairs</source> +<target>Filtro: Tutte le coppie</target> +<source>Filter: Single pair</source> +<target>Filtro: Singola coppia</target> +<source>Ignore</source> +<target>Ignora</target> +<source>Direct</source> +<target>Diretto</target> +<source>Follow</source> +<target>Segui</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro:</target> +<source>- full file or directory name</source> +<target>- file completo o nome directory</target> +<source>- directory part only</source> +<target>- solo parte di directory</target> +<source>- Other side's counterpart to %name</source> +<target>- L'altro lato e' equivalente a %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- L'altro lato e' equivalente a %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Ripristinare tutti i dialoghi nascosti?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +</target> +<source>Leave as unresolved conflict</source> +<target>Lascia come conflitti irrisolti</target> +<source>Delete permanently</source> +<target>Cancella definitivamente</target> +<source>Delete or overwrite files permanently</source> +<target>Cancella o sovrascrivi file definitivamente</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Usa il Cestino quando si cancella o sovrascrive un file</target> +<source>Versioning</source> +<target>Versioning</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Sposta file in una sotto-cartella datata</target> +<source>Cannot determine sync-direction:</source> +<target>Impossibile determinare direzione di sincronia:</target> +<source>Filter settings have changed!</source> +<target>Le impostazioni del filtro sono cambiate!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Entrambi i lati sono cambiati dall'ultima sincronizzazione!</target> +<source>No change since last synchronization!</source> +<target>Nessun cambiamento dall'ultima sincronizzazione!</target> +<source>The file was not processed by last synchronization!</source> +<target>Il file non era processato nell'ultima sincronizzazione!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Imposta direzioni di sincronizzazione di default: I vecchi file saranno sovrascritti dai nuovi.</target> +<source>The file does not contain a valid configuration:</source> +<target>Il file non contiene una configurazione valida</target> +<source>Scanning:</source> +<target>Analisi in corso:</target> +<source>Encoding extended time information: %x</source> +<target>Codifica estesa informazioni orario: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Puoi ignorare questo errore per considerare la directory come vuota.</target> +<source>Directory does not exist:</source> +<target>La directory non esiste:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:</target> +<source>Comparing content of files %x</source> +<target>Comparazione contenuto del file %x</target> +<source>Memory allocation failed!</source> +<target>Allocazione di memoria fallita!</target> +<source>File %x has an invalid date!</source> +<target>Il file %x ha una data non valida!</target> +<source>Conflict detected:</source> +<target>Rilevato conflitto:</target> +<source>Files %x have the same date but a different size!</source> +<target>I file %x hanno la stessa data ma dimensione diversa!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symlinks %x hanno stessa data ma differente target!</target> +<source>Comparing files by content failed.</source> +<target>Comparazione file in base al contenuto fallita.</target> +<source>Generating file list...</source> +<target>Generazione lista dei file...</target> +<source>Multiple...</source> +<target>Multiplo...</target> +<source>Files that are equal on both sides</source> +<target>Files identici su entrambi i lati</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Considera uguali file/cartelle che differiscono solo per gli attributi</target> +<source>Copy from right to left</source> +<target>Copia da destra a sinistra</target> +<source>Copy from left to right</source> +<target>Copia da sinistra a destra</target> +<source>Delete files/folders existing on left side only</source> +<target>Elimina files/cartelle esistenti solo a sinistra</target> +<source>Delete files/folders existing on right side only</source> +<target>Elimina files/cartelle esistenti solo a destra</target> +<source>Copy from right to left overwriting</source> +<target>Copia da destra a sinistra sovrascrivendo</target> +<source>Copy from left to right overwriting</source> +<target>Copia sinistra a destra sovrascrivendo</target> +<source>Do nothing</source> +<target>Non fare nulla</target> +<source>Copy attributes only from right to left</source> +<target>Copia attributi solo da destra a sinistra</target> +<source>Copy attributes only from left to right</source> +<target>Copia attributi solo da sinistra a destra</target> +<source>Deleting file %x</source> +<target>Eliminazione file %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Eliminazione Link Simbolico %x</target> +<source>Deleting folder %x</source> +<target>Eliminazione cartella %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Spostamento di %x nel Cestino</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Spostamento del file %x nella directory personalizzata %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Spostamento di cartella %x nella directory personalizzata %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Spostamento Link Simbolico %x su directory definita dall'utente %y</target> +<source>Copying new file %x to %y</source> +<target>Copia di nuovo file %x su %y in corso</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copia di nuovo Link Simbolico %x su %y in corso</target> +<source>Overwriting file %x in %y</source> +<target>Sovrascrittura di file %x in %y in corso</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Sovrascrittura di Link Simbolico %x in %y in corso</target> +<source>Creating folder %x</source> +<target>Creazione cartella %x</target> +<source>Verifying file %x</source> +<target>Verifica di file %x</target> +<source>Updating attributes of %x</source> +<target>Aggiornamento attributi di %x</target> +<source>Source directory does not exist anymore:</source> +<target>La directory sorgente non è più esistente:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Niente da sincronizzare in questa configurazione!</target> +<source>Target directory name must not be empty!</source> +<target></target> +<source>User-defined directory for deletion was not specified!</source> +<target>Directory personalizzata per la cancellazione non specificata!</target> +<source>Unresolved conflicts existing!</source> +<target>Sono presenti conflitti irrisolti!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Puoi ignorare i conflitti e continuare la sincronizzazione.</target> +<source>Significant difference detected:</source> +<target>Riscontrate differenze significative:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Piu' del 50% del totale dei files saranno copiati o cancellati!</target> +<source>Not enough free disk space available in:</source> +<target>Spazio libero su disco insufficiente in:</target> +<source>Free disk space required:</source> +<target>Spazio libero su disco richiesto:</target> +<source>Free disk space available:</source> +<target>Spazio libero su disco disponibile:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Una directory che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione!</target> +<source>Processing folder pair:</source> +<target>Elaborazione coppia di cartelle:</target> +<source>Generating database...</source> +<target>Generazione database...</target> +<source>Error copying locked file %x!</source> +<target>Errore durante la copia del file bloccato %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Errore in verifica data: I file sorgente e destinazione hanno differente contenuto!</target> diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index eb020dc6..4a44248b 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -1,910 +1,1048 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã—㟠-%x Bytes -%x ãƒã‚¤ãƒˆ -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x æ—¥ -%x directories -%x ディレクトリ -%x files -%x 個ã®ãƒ•ã‚¡ã‚¤ãƒ« -%x hour(s) -%x 時間 -%x kB -%x kB -%x min -%x 分 -%x of %y rows in view -%x / %y 行を表示 -%x of 1 row in view -%x / 1 行を表示 -%x sec -%x 秒 -%x% -%x% -&Abort -æƒ…å ±(&A) -&About... -æƒ…å ±(&A)... -&Advanced -æ‹¡å¼µ(&A) -&Cancel -ã‚ャンセル(&C) -&Check for new version -ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C) -&Content -トピック(&C) -&Create batch job... -一括ジョブを作æˆ(&C)... -&Default -デフォルト(&D) -&Exit -終了(&E) -&Export file list... -ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)... -&File -ファイル(&F) -&Find next -次を検索(&F) -&Global settings... -全般的ãªè¨å®š(&G)... -&Help -ヘルプ(&H) -&Ignore -無視(&I) -&Language -使用言語(&L) -&Load -èªã¿è¾¼ã¿(&L) -&Load configuration... -構æˆè¨å®šã®èªã¿è¾¼ã¿(&L)... -&New -æ–°è¦(&N) -&No -ã„ã„ãˆ(&N) -&OK -&OK -&Pause -一時åœæ¢(&P) -&Program -プãƒã‚°ãƒ©ãƒ (&P) -&Quit -終了(&Q) -&Restore -修復(&R) -&Retry -å†è©¦è¡Œ(&R) -&Save -ä¿å˜(&S) -&Switch -切り替ãˆ(&S) -&Yes -ã¯ã„(&Y) -(Build: %x) -(ビルド: %x) -(Requires an Internet connection!) -(インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’å¿…è¦ã¨ã—ã¾ã™!) -- Other side's counterpart to %dir -- %dir ã®å対å´ã®å¯¾è±¡ -- Other side's counterpart to %name -- %name ã®å対å´ã®å¯¾è±¡ -- conflict -- ä¸ä¸€è‡´ -- conflict (same date, different size) -- ä¸ä¸€è‡´ (åŒã˜æ—¥ä»˜, ç•°ãªã‚‹ã‚µã‚¤ã‚º) -- different -- 差異ã‚ã‚Š -- directory part only -- ディレクトリ部ã®ã¿ -- equal -- åŒä¸€ -- exists left only -- å·¦å´ã«ã®ã¿å˜åœ¨ -- exists right only -- å³å´ã«ã®ã¿å˜åœ¨ -- full file or directory name -- 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/フォルダå -- left -- å·¦å´ -- left newer -- å·¦å´ã®æ–¹ãŒæ–°ã—ã„ -- right -- å³å´ -- right newer -- å³å´ã®æ–¹ãŒæ–°ã—ã„ -/sec -/秒 -1 directory -1 ディレクトリ -1 file -1 ファイル -1. &Compare -1. 比較(&C) -1. Enter relative file or directory names separated by ';' or a new line. -1. 相対ファイルã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ ';' ã¾ãŸã¯ 改行ã§åŒºåˆ‡ã£ã¦å…¥åŠ› -1. Select directories to monitor. -1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž -2. &Synchronize... -2. åŒæœŸå‡¦ç†(&S)... -2. Enter a command line. -2. コマンドラインを入力 -2. Use wildcard characters '*' and '?'. -2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚ -3. Exclude files directly on main grid via context menu. -3. コンテã‚ストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚ -3. Press 'Start'. -3. 'スタート'をクリック -<Automatic> -<自動> -<Directory> -<ディレクトリ> -<Last session> -<最後ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³> -<Symlink> -<シンボリックリンク> -<multiple selection> -<複数é¸æŠž> -A directory input field is empty. -ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“ -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -複数ペアã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¨å®šéƒ¨åˆ†ã«å¤‰æ›´ã•ã‚ŒãŸç®‡æ‰€ãŒã‚ã‚Šã¾ã™! åŒæœŸè¨å®šã‚’å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„! -A newer version of FreeFileSync is available: -FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™: -Abort requested: Waiting for current operation to finish... -ユーザã«ã‚ˆã‚‹ä¸æ–: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„... -Abort synchronization immediately -今ã™ãã«åŒæœŸå‡¦ç†ã‚’ä¸æ– -Aborted -ä¸æ– -About -æƒ…å ± -Action -æ“作 -Add folder -ãƒ•ã‚©ãƒ«ãƒ€ã‚’è¿½åŠ -Add folder pair -フォルダã®ãƒšã‚¢ã‚’è¿½åŠ -All directories in sync! -ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ! -An exception occurred! -例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ! -As a result the files are separated into the following categories: -ファイルã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªã«åˆ†é¡žã•ã‚Œã¾ã™: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -ã“ã®ã‚ªãƒ—ションã§ã¯ã€åŒã˜åå‰ã‚’共有ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å†…容ãŒåŒã˜å ´åˆã¯ã€åŒä¸€ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作よりã€ã‚€ã—ã‚æ•´åˆæ€§ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†æ™‚ã«å½¹ç«‹ã¤ã‚ªãƒ—ションã§ã™ã€‚ 従ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥æ™‚ã«ã¤ã„ã¦ã¯å…¨ã考慮ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n\nè¨å®šãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ãƒ„リー表示ãŒå°ã•ããªã‚Šã¾ã™ã€‚ -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -一括ã§åŒæœŸå‡¦ç†ã‚’è¡Œã†ãŸã‚ã®ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚ 一括モードを開始ã™ã‚‹ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘スåを実行ファイル\n< FreeFileSync.exe> \nã«ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã§æ¸¡ã™ã ã‘ã§ã™ã€‚ ã¾ãŸã€ã“ã®æ“作ã¯OSã®ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -At least one directory input field is empty. -å°‘ãªãã¨ã‚‚ã²ã¨ã¤ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„ -Auto-adjust columns -列ã®è‡ªå‹•èª¿æ•´ -Batch execution -一括処ç†ã‚’実行 -Batch file created successfully! -ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ! -Batch job -ä¸€æ‹¬å‡¦ç† -Big thanks for localizing FreeFileSync goes out to: -FreeFileSync ã®ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™: -Both sides have changed since last synchronization! -å‰å›žæœ€å¾Œã®åŒæœŸå‡¦ç†ä»¥é™ã€ä¸¡å´ã¨ã‚‚変更ãŒã‚ã‚Šã¾ã™! -Browse -å‚ç…§ -Browse directory -ディレクトリをå‚ç…§ -Cannot determine sync-direction: -åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“: -Cannot find %x -%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ -Category -カテゴリ -Clear filter settings -フィルターè¨å®šã‚’クリア -Comma separated list -カンマ区切り -Command line -コマンドライン -Command line is empty! -コマンドラインãŒç©ºç™½ã§ã™! -Compare -比較 -Compare both sides -両方を比較 -Compare by \"File content\" -\"ファイルã®å†…容\" を比較 -Compare by \"File size and date\" -\"ファイルサイズã¨æ—¥ä»˜\" を比較 -Compare by... -比較対象... -Comparing content of files %x -ファイル %x ã®å†…å®¹ã‚’æ¯”è¼ƒä¸ -Comparing content... -内容を比較ä¸... -Comparing files by content failed. -ファイル内容ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—㟠-Comparison Result -比較çµæžœ -Comparison settings -比較è¨å®š -Completed -完了ã—ã¾ã—㟠-Configuration -構æˆè¨å®š -Configuration loaded! -構æˆè¨å®šã‚’èªã¿è¾¼ã¿ä¸! -Configuration overview: -構æˆè¨å®šã®æ¦‚è¦: -Configuration saved! -構æˆè¨å®šã¯ä¿å˜ã•ã‚Œã¾ã—ãŸ! -Configure filter -フィルターè¨å®š -Configure your own synchronization rules. -ã‚ãªãŸã®è¨å®šã—ãŸåŒæœŸè¦å‰‡ã‚’使用ã—ã¾ã™ã€‚ -Confirm -ç¢ºèª -Conflict detected: -検出ã•ã‚ŒãŸç«¶åˆ: -Conflicts/files that cannot be categorized -分類ã®ã§ããªã„競åˆ/ファイル -Continue -続行 -Conversion error: -変æ›ã‚¨ãƒ©ãƒ¼: -Copy attributes only from left to right -属性ã®ã¿å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー -Copy attributes only from right to left -属性ã®ã¿å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー -Copy filesystem permissions -ファイルシステム・パーミッションをコピー -Copy from left to right -å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー -Copy from left to right overwriting -å·¦ã‹ã‚‰å³ã«ä¸Šæ›¸ãコピー -Copy from right to left -å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー -Copy from right to left overwriting -å³ã‹ã‚‰å·¦ã«ä¸Šæ›¸ãコピー -Copy locked files -ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー -Copy new or updated files to right folder. -æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -ボリュームシャドーコピーを使用ã—ã¦å…±æœ‰/ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー\n(管ç†è€…権é™ãŒå¿…è¦) -Copy to clipboard\tCTRL+C -クリップボードã«ã‚³ãƒ”ー\tCTRL+C -Copying new Symbolic Link %x to %y -シンボリックリンク %x ã‚’ %y ã«ã‚³ãƒ”ãƒ¼ä¸ -Copying new file %x to %y -ファイル %x ã‚’ %y ã«ã‚³ãƒ”ãƒ¼ä¸ -Could not determine volume name for file: -ファイルã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“: -Could not initialize directory monitoring: -監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“: -Could not load a required DLL: -å¿…è¦ãªDLLã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“: -Could not read values for the following XML nodes: -以下㮠XMLノードã®å€¤ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“: -Create a batch job -ä¸€æ‹¬ã‚¸ãƒ§ãƒ–ã‚’ä½œæˆ -Creating folder %x -フォルダ %x を作æˆä¸ -Custom -カスタム-Customize columns -列ã®èª¿æ•´ -Customize... -カスタマイズ... -D-Click -W-クリック -DECISION TREE -[判定ツリー] -Data verification error: Source and target file have different content! -データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™! -Date -データ -Delete files/folders existing on left side only -å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除 -Delete files/folders existing on right side only -å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除 -Delete files\tDEL -ファイルを削除\tDEL -Delete on both sides -両方を削除 -Delete on both sides even if the file is selected on one side only -片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹ -Delete or overwrite files permanently -ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤ -Delete permanently -完全ã«å‰Šé™¤ -Deleting Symbolic Link %x -シンボリックリンク %x ã‚’å‰Šé™¤ä¸ -Deleting file %x -ファイル %x ã‚’å‰Šé™¤ä¸ -Deleting folder %x -フォルダ %x ã‚’å‰Šé™¤ä¸ -Deletion handling -削除ã®å–り扱ㄠ-Description -説明 -Direct -æ–¹å‘ -Directories are dependent! Be careful when setting up synchronization rules: -ディレクトリãŒä¾å˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„: -Directories to watch -ディレクトリを監視 -Directory -ディレクトリ -Directory does not exist: -ディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“: -Do not show this dialog again -次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„ -Do nothing -何もã—ãªã„ -Do you really want to delete the following object(s)? -本当ã«ä»¥ä¸‹ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã™ã‹? -Do you really want to move the following object(s) to the Recycle Bin? -本当ã«ä»¥ä¸‹ã®ã‚ªãƒ–ジェクト(複)をゴミ箱ã«ç§»å‹•ã—ã¾ã™ã‹? -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSync ã®ã‚¢ãƒƒãƒ—デートã®æœ‰ç„¡ã®ç¢ºèªã‚’自動的ã«æ¯Žé€±è¡Œã„ã¾ã™ã‹> -Donate with PayPal -PayPal ã‹ã‚‰å¯„付ã™ã‚‹ -Download now? -ダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹? -Drag && drop -ドラッグ && ドãƒãƒƒãƒ— -Elements found: -見ã¤ã‹ã£ãŸè¦ç´ : -Elements processed: -処ç†ã•ã‚ŒãŸè¦ç´ : -Elements remaining: -残りã®è¦ç´ : -Email -E-メール -Encoding extended time information: %x -æ‹¡å¼µã•ã‚ŒãŸæ™‚é–“æƒ…å ±ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°: %x -Endless loop when traversing directory: -ディレクトリ移動ä¸ã«ç„¡é™ãƒ«ãƒ¼ãƒ—ãŒç™ºç”Ÿ: -Equal files/folders that differ in attributes only -åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã§ã€å±žæ€§ã®ã¿ç•°ãªã‚‹ -Error -エラー -Error changing modification time: -時間ã®ä¿®æ£ä¸ã®ã‚¨ãƒ©ãƒ¼: -Error copying file permissions: -パーミッションコピーä¸ã®ã‚¨ãƒ©ãƒ¼ -Error copying file: -ファイルã®ã‚³ãƒ”ーã«å¤±æ•—: -Error copying locked file %x! -コピーã«å¤±æ•—! ファイル%x ã¯ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™! -Error copying symbolic link: -シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—: -Error creating directory: -ディレクトリ作æˆã‚¨ãƒ©ãƒ¼: -Error deleting directory: -ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼: -Error deleting file: -ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼: -Error handling -ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚: -Error loading library function: -ライブラリèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error moving directory: -ディレクトリ移動ã«å¤±æ•—: -Error moving file: -ファイルã®ç§»å‹•ã«å¤±æ•—: -Error moving to Recycle Bin: -ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—: -Error opening file: -ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—: -Error parsing configuration file: -構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™: -Error reading file attributes: -ファイル属性ã®å–å¾—ã«å¤±æ•—: -Error reading file: -ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error reading from synchronization database: -åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error reading security context: -ã‚»ã‚ュリティ・コンテã‚ストã®èªã¿å–りエラー: -Error resolving symbolic link: -シンボリックリンクã®è§£æ±ºã«å¤±æ•—: -Error setting directory lock: -ディレクトリè¨å®šã«å¤±æ•—(ãƒãƒƒã‚¯): -Error setting privilege: -特権ã®è¨å®šã‚¨ãƒ©ãƒ¼: -Error starting Volume Shadow Copy Service! -ボリュームシャドウコピーã®é–‹å§‹ã«å¤±æ•—! -Error traversing directory: -ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼: -Error when monitoring directories. -ディレクトリã®ç›£è¦–エラー -Error writing file: -ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error writing security context: -ã‚»ã‚ュリティ・コンテã‚ストã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error writing to synchronization database: -åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Example -例 -Exclude -除外 -Exclude all rows -ã™ã¹ã¦ã®è¡Œã‚’除外 -Exclude temporarily -一時フォルダを除外 -Exclude via filter: -フィルターを通ã—ã¦é™¤å¤– -Exit instantly -ã™ãã«çµ‚了 -Extension -æ‹¡å¼µå -External applications -外部アプリケーション -Fatal Error -致命的ãªã‚¨ãƒ©ãƒ¼ -Feedback and suggestions are welcome at: -フィードãƒãƒƒã‚¯ã€æ案ãªã©: -File %x has an invalid date! -ファイル %x ã®æ—¥ä»˜ã¯ç„¡åŠ¹ãªã‚‚ã®ã§ã™! -File already exists. Overwrite? -ファイルã¯å˜åœ¨ã—ã¾ã™ã€ä¸Šæ›¸ãã—ã¾ã™ã‹? -File content -ファイルã®å†…容 -File does not exist: -ファイルãŒå˜åœ¨ã—ã¾ã›ã‚“: -File list exported! -ファイル一覧ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå®Œäº†! -File size and date -ファイルサイズã¨æ—¥ä»˜ -Filename -ファイルå -Files %x have the same date but a different size! -ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™! -Files are found equal if\n - file content\nis the same -ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイル内容\nã§åˆ¤æ–ã™ã‚‹ -Files are found equal if\n - filesize\n - last write time and date\nare the same -ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイルサイズ\n - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜\nã§åˆ¤æ–ã™ã‚‹ -Files that are equal on both sides -両å´ã§åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ« -Files that exist on both sides, left one is newer -両å´ã«å˜åœ¨ã™ã‚‹ãŒã€å·¦å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„ -Files that exist on both sides, right one is newer -両å´ã«å˜åœ¨ã™ã‚‹ãŒã€å³å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„ -Files that have different content -内容ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ« -Files/folders that exist on left side only -å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ -Files/folders that exist on right side only -å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ -Filter files -ファイルフィルター -Filter is active -フィルターを有効化 -Filter settings have changed! -フィルターè¨å®šã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™! -Filter: All pairs -フィルター:ã™ã¹ã¦ã®ãƒšã‚¢ -Filter: Single pair -フィルター:å˜ä¸€ãƒšã‚¢ -Find -検索 -Find what: -検索語: -Folder Comparison and Synchronization -フォルダã®æ¯”較ã¨åŒæœŸ -Folder pairs -フォルダ・ペア -Follow -フォãƒãƒ¼ -Free disk space available: -利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡: -Free disk space required: -å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡: -FreeFileSync Batch Job -FreeFileSync 一括ジョブ -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge -FreeFileSync batch file -FreeFileSync ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ« -FreeFileSync configuration -FreeFileSync 構æˆè¨å®š -FreeFileSync is up to date! -FreeFileSync ã¯æœ€æ–°ã§ã™! -Full path -フルパス -Generating database... -データベースを作æˆä¸... -Generating file list... -ファイル一覧を作æˆä¸... -Global settings -全般的ãªè¨å®š -Help -ヘルプ -Hidden dialogs: -ダイアãƒã‚°ã‚’éš ã™ -Hide all error and warning messages -ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º -Hide conflicts -ä¸ä¸€è‡´ã‚’éš ã™ -Hide excluded items -é™¤å¤–ã‚¢ã‚¤ãƒ†ãƒ ã‚’éš ã™ -Hide files that are different -ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º -Hide files that are equal -åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º -Hide files that are newer on left -å·¦å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º -Hide files that are newer on right -å³å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º -Hide files that exist on left side only -å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º -Hide files that exist on right side only -å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º -Hide files that will be created on the left side -å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that will be created on the right side -å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that will be deleted on the left side -å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that will be deleted on the right side -å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that will be overwritten on left side -å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that will be overwritten on right side -å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide files that won't be copied -コピーã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™ -Hide filtered or temporarily excluded files -フィルターã€ã¾ãŸã¯ä¸€æ™‚é™¤å¤–ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™ -Hide further error messages during the current process -ç¾åœ¨ã®å‡¦ç†ä¸ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„ -Hints: -ヒント: -Homepage -ホームページ -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -データベースを使用ã—ã¦ã€ä¸¡å´ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›´ã‚’特定ã—ã¾ã™ã€‚ 削除ã€ç«¶åˆã¯è‡ªå‹•çš„ã«æ¤œå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -Idle time between detection of last change and execution of command line in seconds -最後ã®å¤‰æ›´ã®æ¤œå‡ºã‹ã‚‰ã€æ¬¡ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã™ã‚‹ã¾ã§ã®å¾…機時間(秒) -If you like FFS -FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ -Ignore -無視 -Ignore errors -エラーを無視 -Ignore subsequent errors -以é™ã®ã‚¨ãƒ©ãƒ¼ã‚’無視 -Include -å«ã‚ã‚‹ -Include all rows -ã™ã¹ã¦ã®è¡Œã‚’å«ã‚ã‚‹ -Include temporarily -一時フォルダをå«ã‚ã‚‹ -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -å«ã‚ã‚‹: *.doc;*.zip;*.exe\n除外: \\stuff\\temp\\* -Incompatible synchronization database format: -åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›¸å¼ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“: -Info -æƒ…å ± -Information -インフォメーション -Initial synchronization: -åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–: -Integrate external applications into context menu. The following macros are available: -外部ã®ã‚¢ãƒ—リケーションをコンテã‚ストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒãŒåˆ©ç”¨ã§ãã¾ã™: -Invalid FreeFileSync config file! -無効㪠FreeFileSync 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™! -Last used configurations (press DEL to remove from list) -å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨å®š(DEL ã‚ーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™) -Leave as unresolved conflict -未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™ -Left -å·¦å´ -Legend -凡例 -Load configuration from file -外部ファイルã‹ã‚‰æ§‹æˆè¨å®šã‚’èªã¿è¾¼ã¿ã¾ã™ -Log-messages: -ãƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: -Logging -ãƒã‚° -Main bar -メインãƒãƒ¼ -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ シャドウコピーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。 -Match case -æ–‡å—種を区別 -Maximum number of logfiles: -ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°: -Memory allocation failed! -メモリ割り当ã¦ã«å¤±æ•—! -Minimum Idle Time [seconds] -最å°å¾…機時間[秒] -Mirror ->> -ミラー >> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -å·¦å´ã«åˆã‚ã›ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—. å³å´ã®ãƒ•ã‚©ãƒ«ãƒ€å†…容ãŒåŒæœŸå‡¦ç†å¾Œã«å·¦å´ã¨åŒã˜ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚ -Monitoring active... -監視を開始ã—ã¾ã™... -More than 50% of the total number of files will be copied or deleted! -ファイルåˆè¨ˆç·æ•°ã® 50% 以上ãŒå‰Šé™¤ã€ã¾ãŸã¯ã‚³ãƒ”ーã•ã‚Œã¾ã™ -Move column down -列を下ã«ç§»å‹• -Move column up -列を上ã«ç§»å‹• -Move files into a time-stamped subdirectory -ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹• -Moving %x to Recycle Bin -%x をゴミ箱ã«ç§»å‹•ä¸ -Moving Symbolic Link %x to user-defined directory %y -シンボリックリンク %x をユーザ定義ディレクトリ %y ã«ã‚³ãƒ”ãƒ¼ä¸ -Moving file %x to user-defined directory %y -ファイル %x をユーザ定義ディレクトリ %y ã«ç§»å‹• -Moving folder %x to user-defined directory %y -フォルダ %x をユーザ定義ディレクトリ %y ã«ç§»å‹• -Multiple... -複数処ç†... -No change since last synchronization! -å‰å›žã®åŒæœŸä»¥é™ã€å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“! -No filter selected -フィルターé¸æŠžãªã— -Not enough free disk space available in: -利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡ãŒè¶³ã‚Šã¾ã›ã‚“: -Nothing to synchronize according to configuration! -構æˆè¨å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“! -Number of files and directories that will be created -作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•° -Number of files and directories that will be deleted -削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•° -Number of files that will be overwritten -上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•° -One of the FreeFileSync database entries within the following file is not yet existing: -FreeFileSync データベースã«ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯å˜åœ¨ã—ã¾ã›ã‚“: -One of the FreeFileSync database files is not yet existing: -FreeFileSync データベースファイルãŒå˜åœ¨ã—ã¾ã›ã‚“: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -フィルターã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿åŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€åŒæœŸåŸºæº–ディレクトリã¸ã®ç›¸å¯¾çš„(!)ãªåå‰ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ -Open with Explorer -エクスプãƒãƒ¼ãƒ©ã§é–‹ã -Open with default application -既定アプリケーションã§é–‹ã -Operation aborted! -æ“作ã®ä¸æ–! -Operation: -æ“作: -Overview -æ¦‚è¦ -Overwriting Symbolic Link %x in %y -シンボリックリンク %x ã‚’ %y ã«ä¸Šæ›¸ãä¸ -Overwriting file %x in %y -ファイル %x ã‚’ %y ã«ä¸Šæ›¸ãä¸ -Pause -一時åœæ¢ -Paused -一時åœæ¢ä¸ -Planned directory deletion is in conflict with its subdirectories and -files! -ディレクトリを削除ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç«¶åˆãŒèµ·ã“ã‚‹å¯èƒ½å§“ãŒã‚ã‚Šã¾ã™! -Please run a Compare first before synchronizing! -åŒæœŸå‡¦ç†ã‚’実行ã™ã‚‹å‰ã«æ¯”較を行ã£ã¦ãã ã•ã„! -Press \"Switch\" to open FreeFileSync GUI mode. - \"切り替ãˆ\" を押ã™ã¨ FreeFileSync GUI モードã§é–‹ãã¾ã™ -Processing folder pair: -フォルダペアを処ç†ä¸: -Published under the GNU General Public License: -Published under the GNU General Public License: -Question -è³ªå• -RealtimeSync - Automated Synchronization -リアルタイムåŒæœŸ - 自動åŒæœŸ -RealtimeSync configuration -リアルタイムåŒæœŸã®æ§‹æˆè¨å®š -Recycle Bin not yet supported for this system! -ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ã‚´ãƒŸç®±ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“! -Relative path -相対パス -Remove alternate settings -代替è¨å®šã‚’除去 -Remove folder -フォルダ除去 -Remove folder pair -フォルダペアを除去 -Report translation error -翻訳エラーã®è©³ç´° -Reset -リセット -Reset view -表示リセット -Restore all hidden dialogs? -éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’ã™ã¹ã¦æˆ»ã—ã¾ã™ã‹? -Right -å³å´ -S&ave configuration... -構æˆè¨å®šã‚’ä¿å˜(&A)... -S&witch view -表示切り替ãˆ(&W) -Save changes to current configuration? -ç¾åœ¨ã®æ§‹æˆã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹? -Save current configuration to file -ç¾åœ¨ã®è¨å®šã‚’ファイルã«ä¿å˜ -Scanning... -スã‚ャンä¸... -Scanning: -スã‚ャン: -Select a folder -フォルダをé¸æŠž -Select alternate synchronization settings -代替åŒæœŸè¨å®šã‚’é¸æŠž -Select logfile directory: -ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜å…ˆã‚’é¸æŠž: -Select variant: -変数をé¸æŠž: -Select view -表示é¸æŠž -Set direction: -æ–¹å‘ã®è¨å®š: -Setting default synchronization directions: Old files will be overwritten with newer files. -åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã -Show \"%x\" -\"%x\" を表示 -Show conflicts -ä¸ä¸€è‡´ã‚’表示 -Show files that are different -差異ã®ã‚るファイルを表示 -Show files that are equal -åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that are newer on left -å·¦å´ã®æ–°ã—ã„ファイルを表示 -Show files that are newer on right -å³å´ã®æ–°ã—ã„ファイルを表示 -Show files that exist on left side only -å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that exist on right side only -å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be created on the left side -å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be created on the right side -å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be deleted on the left side -å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be deleted on the right side -å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be overwritten on left side -å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that will be overwritten on right side -å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show files that won't be copied -コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示 -Show hidden dialogs -éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示 -Show popup -ãƒãƒƒãƒ—アップ表示 -Show popup on errors or warnings -エラー/è¦å‘Šã‚’ãƒãƒƒãƒ—アップ表示 -Significant difference detected: -é‡å¤§ãªå·®ç•°ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ: -Silent mode -サイレントモード -Size -サイズ -Source code written completely in C++ utilizing: -ソースコード㯠C++ ã§æ›¸ã‹ã‚Œã€ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã™: -Source directory does not exist anymore: -ソースディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“: -Speed: -速度: -Start -開始 -Start minimized and write status information to a logfile -最å°åŒ–状態ã§èµ·å‹•ã—ã¦ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…å ±ã‚’ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出㙠-Start synchronization -åŒæœŸã®é–‹å§‹ -Statistics -統計 -Status feedback -状態 フィードãƒãƒƒã‚¯ -Stop -åœæ¢ -Swap sides -パãƒãƒ«ã‚’入れ替㈠-Switching to FreeFileSync GUI mode... -FreeFileSync GUI モードã®åˆ‡ã‚Šæ›¿ãˆä¸... -Symbolic Link handling -シンボリックリンク・リンクã®å–り扱ㄠ-Symlinks %x have the same date but a different target! -シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒä¸€ã§ã™ãŒã€ç•°ãªã‚‹å¯¾è±¡ãŒã‚ã‚Šã¾ã™! -Synchronization Preview -åŒæœŸå‡¦ç†ã®ãƒ—レビュー -Synchronization aborted! -åŒæœŸå‡¦ç†ã‚’ä¸æ–! -Synchronization completed successfully! -åŒæœŸå‡¦ç†ã¯ã™ã¹ã¦æ£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸ! -Synchronization completed with errors! -åŒæœŸå‡¦ç†ã¯ã€ã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã„ã¾ã™! -Synchronization settings -åŒæœŸå‡¦ç†è¨å®š -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -\"temp\" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ -Synchronize... -åŒæœŸå‡¦ç†... -Synchronizing... -åŒæœŸå‡¦ç†ä¸... -Target directory already existing! -対象ディレクトリã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™! -Target file already existing! -対象ファイルã¯æ—¢ã«å˜åœ¨ã—ã¾ã™! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãã®éƒ½åº¦å®Ÿè¡Œã•ã‚Œã¾ã™:\n- ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§åˆ©ç”¨å¯èƒ½ã§ã™ (例. USB スティックã®æŒ¿å…¥æ™‚)\n- ディレクトリã€ã¾ãŸã¯ã‚µãƒ–ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ›´æ–°ã•ã‚Œã¾ã™ã€‚ -The file does not contain a valid configuration: -ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“: -The file was not processed by last synchronization! -ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ€å¾Œã®åŒæœŸæ“作時ã«å‡¦ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚ -Time -時間 -Time elapsed: -経éŽæ™‚é–“: -Time remaining: -残り時間: -Total amount of data that will be transferred -転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡ -Total time: -åˆè¨ˆæ™‚é–“: -Transfer file and directory permissions\n(Requires Administrator rights) -ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ーミッション転é€\n(管ç†è€…権é™ãŒå¿…è¦) -Unable to connect to sourceforge.net! -Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“! -Unable to create logfile! -ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆå‡ºæ¥ã¾ã›ã‚“! -Unresolved conflicts existing! -未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™! -Update -> -æ›´æ–° -> -Updating attributes of %x -%x ã®å±žæ€§ã‚’æ›´æ–° -Usage: -使用方法: -Use Recycle Bin -ゴミ箱を使用 -Use Recycle Bin when deleting or overwriting files -ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹ -User-defined directory for deletion was not specified! -ユーザ定義ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“! -Variant -変化 -Verifying file %x -ファイル %x ã®æ¤œè¨¼ä¸ -Versioning -ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘ -Volume name %x not part of filename %y! -ボリュームå %x ã«ãƒ•ã‚¡ã‚¤ãƒ«å %y ã¯ã‚ã‚Šã¾ã›ã‚“! -Waiting for missing directories... -見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…æ©Ÿä¸ -Waiting while directory is locked (%x)... -待機時間ä¸ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ãƒãƒƒã‚¯ã•ã‚Œã¾ã™(%x)... -Warning -è¦å‘Š -When the comparison is started with this option set the following decision tree is processed: -ã“ã®ã‚ªãƒ—ションã§æ¯”較を開始ã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™: -You can ignore conflicts and continue synchronization. -ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ -You can ignore this error to consider the directory as empty. -ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚ -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)! -different -差異ã‚ã‚Š -file exists on both sides -両å´ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« -on one side only -片å´ã®ã¿ +<header> + <language name>日本語</language name> + <translator>Tilt</translator> + <locale>ja_JP</locale> + <flag file>japan.png</flag file> + <plural forms>1</plural forms> + <plural definition>0</plural definition> +</header> + +<source>Show in Explorer</source> +<target>エクスプãƒãƒ¼ãƒ©ã§è¡¨ç¤º</target> +<source>Open with default application</source> +<target>既定アプリケーションã§é–‹ã</target> +<source>Browse directory</source> +<target>ディレクトリをå‚ç…§</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>リアルタイムåŒæœŸ - 自動åŒæœŸ</target> +<source>Browse</source> +<target>å‚ç…§</target> +<source>Error resolving symbolic link:</source> +<target>シンボリックリンクã®è§£æ±ºã«å¤±æ•—:</target> +<source>Select alternate synchronization settings</source> +<target>代替åŒæœŸè¨å®šã‚’é¸æŠž</target> +<source>No filter selected</source> +<target>フィルターé¸æŠžãªã—</target> +<source>Filter is active</source> +<target>フィルターを有効化</target> +<source>Clear filter settings</source> +<target>フィルターè¨å®šã‚’クリア</target> +<source>Remove alternate settings</source> +<target>代替è¨å®šã‚’除去</target> +<source>Create a batch job</source> +<target>一括ジョブを作æˆ</target> +<source>Synchronization settings</source> +<target>åŒæœŸå‡¦ç†è¨å®š</target> +<source>Comparison settings</source> +<target>比較è¨å®š</target> +<source>About</source> +<target>æƒ…å ±</target> +<source>Error</source> +<target>エラー</target> +<source>Warning</source> +<target>è¦å‘Š</target> +<source>Question</source> +<target>質å•</target> +<source>Confirm</source> +<target>確èª</target> +<source>Configure filter</source> +<target>フィルターè¨å®š</target> +<source>Customize columns</source> +<target>列ã®èª¿æ•´</target> +<source>Global settings</source> +<target>全般的ãªè¨å®š</target> +<source>Synchronization Preview</source> +<target>åŒæœŸå‡¦ç†ã®ãƒ—レビュー</target> +<source>Find</source> +<target>検索</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x ãƒã‚¤ãƒˆ</pluralform> +</target> +<source><Symlink></source> +<target><シンボリックリンク></target> +<source><Directory></source> +<target><ディレクトリ></target> +<source>Size</source> +<target>サイズ</target> +<source>Date</source> +<target>データ</target> +<source>Full path</source> +<target>フルパス</target> +<source>Filename</source> +<target>ファイルå</target> +<source>Relative path</source> +<target>相対パス</target> +<source>Directory</source> +<target>ディレクトリ</target> +<source>Extension</source> +<target>æ‹¡å¼µå</target> +<source>Comparison Result</source> +<target>比較çµæžœ</target> +<source>Incompatible synchronization database format:</source> +<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›¸å¼ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“:</target> +<source>Initial synchronization:</source> +<target>åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>FreeFileSync データベースファイルãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>FreeFileSync データベースã«ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯å˜åœ¨ã—ã¾ã›ã‚“:</target> +<source>Error reading from synchronization database:</source> +<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>An exception occurred!</source> +<target>例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ!</target> +<source>Error deleting file:</source> +<target>ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target> +<source>Error reading file attributes:</source> +<target>ファイル属性ã®å–å¾—ã«å¤±æ•—:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>待機時間ä¸ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ãƒãƒƒã‚¯ã•ã‚Œã¾ã™(%x)...</target> +<source>Error setting directory lock:</source> +<target>ディレクトリè¨å®šã«å¤±æ•—(ãƒãƒƒã‚¯):</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x 秒.</pluralform> +</target> +<source>Info</source> +<target>æƒ…å ±</target> +<source>Fatal Error</source> +<target>致命的ãªã‚¨ãƒ©ãƒ¼</target> +<source>File does not exist:</source> +<target>ファイルãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> +<source>Error parsing configuration file:</source> +<target>構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™:</target> +<source>Error writing file:</source> +<target>ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>Invalid FreeFileSync config file!</source> +<target>無効㪠FreeFileSync 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™!</target> +<source>/sec</source> +<target>/秒</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x 分.</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x 時間</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x æ—¥</pluralform> +</target> +<source>S&ave configuration...</source> +<target>構æˆè¨å®šã‚’ä¿å˜(&A)...</target> +<source>&Load configuration...</source> +<target>構æˆè¨å®šã®èªã¿è¾¼ã¿(&L)...</target> +<source>&Quit</source> +<target>終了(&Q)</target> +<source>&File</source> +<target>ファイル(&F)</target> +<source>&Content</source> +<target>トピック(&C)</target> +<source>&About...</source> +<target>æƒ…å ±(&A)...</target> +<source>&Help</source> +<target>ヘルプ(&H)</target> +<source>Usage:</source> +<target>使用方法:</target> +<source>1. Select directories to monitor.</source> +<target>1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž</target> +<source>2. Enter a command line.</source> +<target>2. コマンドラインを入力</target> +<source>3. Press 'Start'.</source> +<target>3. 'スタート'をクリック</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãã®éƒ½åº¦å®Ÿè¡Œã•ã‚Œã¾ã™: +- ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§åˆ©ç”¨å¯èƒ½ã§ã™ (例. USB スティックã®æŒ¿å…¥æ™‚) +- ディレクトリã€ã¾ãŸã¯ã‚µãƒ–ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ›´æ–°ã•ã‚Œã¾ã™ã€‚ +</target> +<source>Directories to watch</source> +<target>ディレクトリを監視</target> +<source>Add folder</source> +<target>ãƒ•ã‚©ãƒ«ãƒ€ã‚’è¿½åŠ </target> +<source>Remove folder</source> +<target>フォルダ除去</target> +<source>Select a folder</source> +<target>フォルダをé¸æŠž</target> +<source>Command line</source> +<target>コマンドライン</target> +<source>Minimum Idle Time [seconds]</source> +<target>最å°å¾…機時間[秒]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>最後ã®å¤‰æ›´ã®æ¤œå‡ºã‹ã‚‰ã€æ¬¡ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã™ã‚‹ã¾ã§ã®å¾…機時間(秒)</target> +<source>Start</source> +<target>開始</target> +<source>(Build: %x)</source> +<target>(ビルド: %x)</target> +<source>RealtimeSync configuration</source> +<target>リアルタイムåŒæœŸã®æ§‹æˆè¨å®š</target> +<source>File already exists. Overwrite?</source> +<target>ファイルã¯å˜åœ¨ã—ã¾ã™ã€ä¸Šæ›¸ãã—ã¾ã™ã‹?</target> +<source>&Restore</source> +<target>修復(&R)</target> +<source>&Exit</source> +<target>終了(&E)</target> +<source>Monitoring active...</source> +<target>監視を開始ã—ã¾ã™...</target> +<source>Waiting for missing directories...</source> +<target>見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…æ©Ÿä¸</target> +<source>Command line is empty!</source> +<target>コマンドラインãŒç©ºç™½ã§ã™!</target> +<source>Could not initialize directory monitoring:</source> +<target>監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“:</target> +<source>A directory input field is empty.</source> +<target>ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“</target> +<source>Error when monitoring directories.</source> +<target>ディレクトリã®ç›£è¦–エラー</target> +<source>Drag && drop</source> +<target>ドラッグ && ドãƒãƒƒãƒ—</target> +<source>Conversion error:</source> +<target>変æ›ã‚¨ãƒ©ãƒ¼:</target> +<source>Error moving file:</source> +<target>ファイルã®ç§»å‹•ã«å¤±æ•—:</target> +<source>Operation aborted!</source> +<target>æ“作ã®ä¸æ–!</target> +<source>Target file already existing!</source> +<target>対象ファイルã¯æ—¢ã«å˜åœ¨ã—ã¾ã™!</target> +<source>Error moving directory:</source> +<target>ディレクトリ移動ã«å¤±æ•—:</target> +<source>Target directory already existing!</source> +<target>対象ディレクトリã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™!</target> +<source>Error deleting directory:</source> +<target>ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target> +<source>Error changing modification time:</source> +<target>時間ã®ä¿®æ£ä¸ã®ã‚¨ãƒ©ãƒ¼:</target> +<source>Error loading library function:</source> +<target>ライブラリèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>Error reading security context:</source> +<target>ã‚»ã‚ュリティ・コンテã‚ストã®èªã¿å–りエラー:</target> +<source>Error writing security context:</source> +<target>ã‚»ã‚ュリティ・コンテã‚ストã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>Error copying file permissions:</source> +<target>パーミッションコピーä¸ã®ã‚¨ãƒ©ãƒ¼</target> +<source>Error creating directory:</source> +<target>ディレクトリ作æˆã‚¨ãƒ©ãƒ¼:</target> +<source>Error copying symbolic link:</source> +<target>シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—:</target> +<source>Error copying file:</source> +<target>ファイルã®ã‚³ãƒ”ーã«å¤±æ•—:</target> +<source>Error opening file:</source> +<target>ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—:</target> +<source>Error reading file:</source> +<target>ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>Endless loop when traversing directory:</source> +<target>ディレクトリ移動ä¸ã«ç„¡é™ãƒ«ãƒ¼ãƒ—ãŒç™ºç”Ÿ:</target> +<source>Error traversing directory:</source> +<target>ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼:</target> +<source>Error setting privilege:</source> +<target>特権ã®è¨å®šã‚¨ãƒ©ãƒ¼:</target> +<source>Error moving to Recycle Bin:</source> +<target>ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—:</target> +<source>Could not load a required DLL:</source> +<target>å¿…è¦ãªDLLã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“:</target> +<source>Error writing to synchronization database:</source> +<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>ボリュームシャドウコピーã®é–‹å§‹ã«å¤±æ•—!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ シャドウコピーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。</target> +<source>Could not determine volume name for file:</source> +<target>ファイルã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target> +<source>Volume name %x not part of filename %y!</source> +<target>ボリュームå %x ã«ãƒ•ã‚¡ã‚¤ãƒ«å %y ã¯ã‚ã‚Šã¾ã›ã‚“!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>以下㮠XMLノードã®å€¤ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“:</target> +<source>Show popup</source> +<target>ãƒãƒƒãƒ—アップ表示</target> +<source>Show popup on errors or warnings</source> +<target>エラー/è¦å‘Šã‚’ãƒãƒƒãƒ—アップ表示</target> +<source>Ignore errors</source> +<target>エラーを無視</target> +<source>Hide all error and warning messages</source> +<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target> +<source>Exit instantly</source> +<target>ã™ãã«çµ‚了</target> +<source>Abort synchronization immediately</source> +<target>今ã™ãã«åŒæœŸå‡¦ç†ã‚’ä¸æ–</target> +<source>Logging</source> +<target>ãƒã‚°</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync 構æˆè¨å®š</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync 一括ジョブ</target> +<source>Unable to create logfile!</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆå‡ºæ¥ã¾ã›ã‚“!</target> +<source>Batch execution</source> +<target>一括処ç†ã‚’実行</target> +<source>Log-messages:</source> +<target>ãƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸:</target> +<source>Stop</source> +<target>åœæ¢</target> +<source>Total time:</source> +<target>åˆè¨ˆæ™‚é–“:</target> +<source>Synchronization aborted!</source> +<target>åŒæœŸå‡¦ç†ã‚’ä¸æ–!</target> +<source>Synchronization completed with errors!</source> +<target>åŒæœŸå‡¦ç†ã¯ã€ã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã„ã¾ã™!</target> +<source>Synchronization completed successfully!</source> +<target>åŒæœŸå‡¦ç†ã¯ã™ã¹ã¦æ£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸ!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>"切り替ãˆ" を押ã™ã¨ FreeFileSync GUI モードã§é–‹ãã¾ã™</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>FreeFileSync GUI モードã®åˆ‡ã‚Šæ›¿ãˆä¸...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™:</target> +<source>Download now?</source> +<target>ダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹?</target> +<source>Information</source> +<target>インフォメーション</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync ã¯æœ€æ–°ã§ã™!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>FreeFileSync ã®ã‚¢ãƒƒãƒ—デートã®æœ‰ç„¡ã®ç¢ºèªã‚’自動的ã«æ¯Žé€±è¡Œã„ã¾ã™ã‹></target> +<source>(Requires an Internet connection!)</source> +<target>(インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’å¿…è¦ã¨ã—ã¾ã™!)</target> +<source>1. &Compare</source> +<target>1. 比較(&C)</target> +<source>2. &Synchronize...</source> +<target>2. åŒæœŸå‡¦ç†(&S)...</target> +<source>S&witch view</source> +<target>表示切り替ãˆ(&W)</target> +<source>&New</source> +<target>æ–°è¦(&N)</target> +<source>&Program</source> +<target>プãƒã‚°ãƒ©ãƒ (&P)</target> +<source>&Language</source> +<target>使用言語(&L)</target> +<source>&Global settings...</source> +<target>全般的ãªè¨å®š(&G)...</target> +<source>&Create batch job...</source> +<target>一括ジョブを作æˆ(&C)...</target> +<source>&Export file list...</source> +<target>ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)...</target> +<source>&Advanced</source> +<target>æ‹¡å¼µ(&A)</target> +<source>&Check for new version</source> +<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C)</target> +<source>Compare</source> +<target>比較</target> +<source>Compare both sides</source> +<target>両方を比較</target> +<source>&Abort</source> +<target>æƒ…å ±(&A)</target> +<source>Synchronize...</source> +<target>åŒæœŸå‡¦ç†...</target> +<source>Start synchronization</source> +<target>åŒæœŸã®é–‹å§‹</target> +<source>Swap sides</source> +<target>パãƒãƒ«ã‚’入れ替ãˆ</target> +<source>Add folder pair</source> +<target>フォルダã®ãƒšã‚¢ã‚’è¿½åŠ </target> +<source>Remove folder pair</source> +<target>フォルダペアを除去</target> +<source>Save current configuration to file</source> +<target>ç¾åœ¨ã®è¨å®šã‚’ファイルã«ä¿å˜</target> +<source>Load configuration from file</source> +<target>外部ファイルã‹ã‚‰æ§‹æˆè¨å®šã‚’èªã¿è¾¼ã¿ã¾ã™</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨å®š(DEL ã‚ーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target> +<source>Hide excluded items</source> +<target>é™¤å¤–ã‚¢ã‚¤ãƒ†ãƒ ã‚’éš ã™</target> +<source>Hide filtered or temporarily excluded files</source> +<target>フィルターã€ã¾ãŸã¯ä¸€æ™‚é™¤å¤–ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target> +<source>Number of files and directories that will be created</source> +<target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target> +<source>Number of files that will be overwritten</source> +<target>上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°</target> +<source>Number of files and directories that will be deleted</source> +<target>削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target> +<source>Total amount of data that will be transferred</source> +<target>転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡</target> +<source>Left</source> +<target>å·¦å´</target> +<source>Right</source> +<target>å³å´</target> +<source>Batch job</source> +<target>一括処ç†</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target> +一括ã§åŒæœŸå‡¦ç†ã‚’è¡Œã†ãŸã‚ã®ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚ 一括モードを開始ã™ã‚‹ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘スåを実行ファイル +< FreeFileSync.exe> +ã«ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã§æ¸¡ã™ã ã‘ã§ã™ã€‚ ã¾ãŸã€ã“ã®æ“作ã¯OSã®ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +</target> +<source>Help</source> +<target>ヘルプ</target> +<source>Configuration overview:</source> +<target>構æˆè¨å®šã®æ¦‚è¦:</target> +<source>Filter files</source> +<target>ファイルフィルター</target> +<source>Status feedback</source> +<target>状態 フィードãƒãƒƒã‚¯</target> +<source>Silent mode</source> +<target>サイレントモード</target> +<source>Start minimized and write status information to a logfile</source> +<target>最å°åŒ–状態ã§èµ·å‹•ã—ã¦ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…å ±ã‚’ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã™</target> +<source>Error handling</source> +<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target> +<source>Overview</source> +<target>概è¦</target> +<source>Select logfile directory:</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜å…ˆã‚’é¸æŠž:</target> +<source>Maximum number of logfiles:</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°:</target> +<source>&Save</source> +<target>ä¿å˜(&S)</target> +<source>&Load</source> +<target>èªã¿è¾¼ã¿(&L)</target> +<source>&Cancel</source> +<target>ã‚ャンセル(&C)</target> +<source>Elements found:</source> +<target>見ã¤ã‹ã£ãŸè¦ç´ :</target> +<source>Elements remaining:</source> +<target>残りã®è¦ç´ :</target> +<source>Speed:</source> +<target>速度:</target> +<source>Time remaining:</source> +<target>残り時間:</target> +<source>Time elapsed:</source> +<target>経éŽæ™‚é–“:</target> +<source>Operation:</source> +<target>æ“作:</target> +<source>Select variant:</source> +<target>変数をé¸æŠž:</target> +<source><Automatic></source> +<target><自動></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>データベースを使用ã—ã¦ã€ä¸¡å´ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›´ã‚’特定ã—ã¾ã™ã€‚ 削除ã€ç«¶åˆã¯è‡ªå‹•çš„ã«æ¤œå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</target> +<source>Mirror ->></source> +<target>ミラー >></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>å·¦å´ã«åˆã‚ã›ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—. å³å´ã®ãƒ•ã‚©ãƒ«ãƒ€å†…容ãŒåŒæœŸå‡¦ç†å¾Œã«å·¦å´ã¨åŒã˜ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚</target> +<source>Update -></source> +<target>æ›´æ–° -></target> +<source>Copy new or updated files to right folder.</source> +<target>æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー</target> +<source>Custom</source> +<target>カスタム</target> +<source>Configure your own synchronization rules.</source> +<target>ã‚ãªãŸã®è¨å®šã—ãŸåŒæœŸè¦å‰‡ã‚’使用ã—ã¾ã™ã€‚</target> +<source>Deletion handling</source> +<target>削除ã®å–り扱ã„</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>構æˆè¨å®š</target> +<source>Category</source> +<target>カテゴリ</target> +<source>Action</source> +<target>æ“作</target> +<source>Files/folders that exist on left side only</source> +<target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target> +<source>Files/folders that exist on right side only</source> +<target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target> +<source>Files that exist on both sides, left one is newer</source> +<target>両å´ã«å˜åœ¨ã™ã‚‹ãŒã€å·¦å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„</target> +<source>Files that exist on both sides, right one is newer</source> +<target>両å´ã«å˜åœ¨ã™ã‚‹ãŒã€å³å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„</target> +<source>Files that have different content</source> +<target>内容ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</target> +<source>Conflicts/files that cannot be categorized</source> +<target>分類ã®ã§ããªã„競åˆ/ファイル</target> +<source>Compare by...</source> +<target>比較対象...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ + - ファイルサイズ + - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜ +ã§åˆ¤æ–ã™ã‚‹ +</target> +<source>File size and date</source> +<target>ファイルサイズã¨æ—¥ä»˜</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ + - ファイル内容 +ã§åˆ¤æ–ã™ã‚‹ +</target> +<source>File content</source> +<target>ファイルã®å†…容</target> +<source>Symbolic Link handling</source> +<target>シンボリックリンク・リンクã®å–り扱ã„</target> +<source>Synchronizing...</source> +<target>åŒæœŸå‡¦ç†ä¸...</target> +<source>Elements processed:</source> +<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target> +<source>&Pause</source> +<target>一時åœæ¢(&P)</target> +<source>Compare by "File size and date"</source> +<target>"ファイルサイズã¨æ—¥ä»˜" を比較</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>ã“ã®ã‚ªãƒ—ションã§æ¯”較を開始ã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™:</target> +<source>As a result the files are separated into the following categories:</source> +<target>ファイルã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªã«åˆ†é¡žã•ã‚Œã¾ã™:</target> +<source>- equal</source> +<target>- åŒä¸€</target> +<source>- left newer</source> +<target>- å·¦å´ã®æ–¹ãŒæ–°ã—ã„</target> +<source>- right newer</source> +<target>- å³å´ã®æ–¹ãŒæ–°ã—ã„</target> +<source>- exists left only</source> +<target>- å·¦å´ã«ã®ã¿å˜åœ¨</target> +<source>- exists right only</source> +<target>- å³å´ã«ã®ã¿å˜åœ¨</target> +<source>- conflict</source> +<target>- ä¸ä¸€è‡´</target> +<source>Compare by "File content"</source> +<target>"ファイルã®å†…容" を比較</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +ã“ã®ã‚ªãƒ—ションã§ã¯ã€åŒã˜åå‰ã‚’共有ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å†…容ãŒåŒã˜å ´åˆã¯ã€åŒä¸€ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作よりã€ã‚€ã—ã‚æ•´åˆæ€§ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†æ™‚ã«å½¹ç«‹ã¤ã‚ªãƒ—ションã§ã™ã€‚ 従ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥æ™‚ã«ã¤ã„ã¦ã¯å…¨ã考慮ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + +è¨å®šãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ãƒ„リー表示ãŒå°ã•ããªã‚Šã¾ã™ã€‚ +</target> +<source>- different</source> +<target>- 差異ã‚ã‚Š</target> +<source>Source code written in C++ utilizing:</source> +<target></target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>FreeFileSync ã®ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>フィードãƒãƒƒã‚¯ã€æ案ãªã©:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync at Sourceforge</target> +<source>Homepage</source> +<target>ホームページ</target> +<source>If you like FFS</source> +<target>FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ</target> +<source>Donate with PayPal</source> +<target>PayPal ã‹ã‚‰å¯„付ã™ã‚‹</target> +<source>Email</source> +<target>E-メール</target> +<source>Report translation error</source> +<target>翻訳エラーã®è©³ç´°</target> +<source>Published under the GNU General Public License:</source> +<target>Published under the GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>以é™ã®ã‚¨ãƒ©ãƒ¼ã‚’無視</target> +<source>Hide further error messages during the current process</source> +<target>ç¾åœ¨ã®å‡¦ç†ä¸ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„</target> +<source>&Ignore</source> +<target>無視(&I)</target> +<source>&Retry</source> +<target>å†è©¦è¡Œ(&R)</target> +<source>Do not show this dialog again</source> +<target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target> +<source>&Switch</source> +<target>切り替ãˆ(&S)</target> +<source>&Yes</source> +<target>ã¯ã„(&Y)</target> +<source>&No</source> +<target>ã„ã„ãˆ(&N)</target> +<source>Delete on both sides</source> +<target>両方を削除</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹</target> +<source>Use Recycle Bin</source> +<target>ゴミ箱を使用</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +ã™ã¹ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼è¨å®šã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿ãŒåŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚ +注æ„: åå‰ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€ãƒ¡ã‚¤ãƒ³åŒæœŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨åŒæ§˜ã®åå‰ã«é©ç”¨ +</target> +<source>Hints:</source> +<target>ヒント:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. 相対ファイルã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ ';' ã¾ãŸã¯ 改行ã§åŒºåˆ‡ã£ã¦å…¥åŠ›</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. コンテã‚ストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚</target> +<source>Example</source> +<target>例</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +å«ã‚ã‚‹: *.doc;*.zip;*.exe +除外: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>"temp" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ</target> +<source>Include</source> +<target>å«ã‚ã‚‹</target> +<source>Exclude</source> +<target>除外</target> +<source>Select time span:</source> +<target>タイムスパンをé¸æŠž</target> +<source>Minimum file size:</source> +<target>最å°ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º:</target> +<source>Maximum file size:</source> +<target>最大ファイルサイズ:</target> +<source>&Default</source> +<target>デフォルト(&D)</target> +<source>Move column up</source> +<target>列を上ã«ç§»å‹•</target> +<source>Move column down</source> +<target>列を下ã«ç§»å‹•</target> +<source>Copy locked files</source> +<target>ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +ボリュームシャドーコピーを使用ã—ã¦å…±æœ‰/ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー +(管ç†è€…権é™ãŒå¿…è¦) +</target> +<source>Copy filesystem permissions</source> +<target>ファイルシステム・パーミッションをコピー</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ãƒ¼ãƒŸãƒƒã‚·ãƒ§ãƒ³è»¢é€ +(管ç†è€…権é™ãŒå¿…è¦) +</target> +<source>Hidden dialogs:</source> +<target>ダイアãƒã‚°ã‚’éš ã™</target> +<source>Reset</source> +<target>リセット</target> +<source>Show hidden dialogs</source> +<target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</target> +<source>External applications</source> +<target>外部アプリケーション</target> +<source>Description</source> +<target>説明</target> +<source>Variant</source> +<target>変化</target> +<source>Statistics</source> +<target>統計</target> +<source>Find what:</source> +<target>検索語:</target> +<source>Match case</source> +<target>æ–‡å—種を区別</target> +<source>&Find next</source> +<target>次を検索(&F)</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)!</target> +<source>Batch file created successfully!</source> +<target>ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ!</target> +<source>Main bar</source> +<target>メインãƒãƒ¼</target> +<source>Folder pairs</source> +<target>フォルダ・ペア</target> +<source>Select view</source> +<target>表示é¸æŠž</target> +<source>Folder Comparison and Synchronization</source> +<target>フォルダã®æ¯”較ã¨åŒæœŸ</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ã‚´ãƒŸç®±ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“!</target> +<source>Set direction:</source> +<target>æ–¹å‘ã®è¨å®š:</target> +<source>Exclude temporarily</source> +<target>一時フォルダを除外</target> +<source>Include temporarily</source> +<target>一時フォルダをå«ã‚ã‚‹</target> +<source>Exclude via filter:</source> +<target>フィルターを通ã—ã¦é™¤å¤–</target> +<source><multiple selection></source> +<target><複数é¸æŠž></target> +<source>D-Click</source> +<target>W-クリック</target> +<source>Copy to clipboard CTRL+C</source> +<target>クリップボードã«ã‚³ãƒ”ー CTRL+C</target> +<source>Delete files DEL</source> +<target>ファイルを削除 DEL</target> +<source>Customize...</source> +<target>カスタマイズ...</target> +<source>Auto-adjust columns</source> +<target>列ã®è‡ªå‹•èª¿æ•´</target> +<source>Include all rows</source> +<target>ã™ã¹ã¦ã®è¡Œã‚’å«ã‚ã‚‹</target> +<source>Exclude all rows</source> +<target>ã™ã¹ã¦ã®è¡Œã‚’除外</target> +<source>Reset view</source> +<target>表示リセット</target> +<source>Show "%x"</source> +<target>"%x" を表示</target> +<source><Last session></source> +<target><最後ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³></target> +<source>Configuration saved!</source> +<target>構æˆè¨å®šã¯ä¿å˜ã•ã‚Œã¾ã—ãŸ!</target> +<source>Save changes to current configuration?</source> +<target>ç¾åœ¨ã®æ§‹æˆã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹?</target> +<source>Configuration loaded!</source> +<target>構æˆè¨å®šã‚’èªã¿è¾¼ã¿ä¸!</target> +<source>Hide files that exist on left side only</source> +<target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> +<source>Show files that exist on left side only</source> +<target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that exist on right side only</source> +<target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> +<source>Show files that exist on right side only</source> +<target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that are newer on left</source> +<target>å·¦å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target> +<source>Show files that are newer on left</source> +<target>å·¦å´ã®æ–°ã—ã„ファイルを表示</target> +<source>Hide files that are newer on right</source> +<target>å³å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target> +<source>Show files that are newer on right</source> +<target>å³å´ã®æ–°ã—ã„ファイルを表示</target> +<source>Hide files that are equal</source> +<target>åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> +<source>Show files that are equal</source> +<target>åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that are different</source> +<target>ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> +<source>Show files that are different</source> +<target>差異ã®ã‚るファイルを表示</target> +<source>Hide conflicts</source> +<target>ä¸ä¸€è‡´ã‚’éš ã™</target> +<source>Show conflicts</source> +<target>ä¸ä¸€è‡´ã‚’表示</target> +<source>Hide files that will be created on the left side</source> +<target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be created on the left side</source> +<target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that will be created on the right side</source> +<target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be created on the right side</source> +<target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that will be deleted on the left side</source> +<target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be deleted on the left side</source> +<target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that will be deleted on the right side</source> +<target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be deleted on the right side</source> +<target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that will be overwritten on left side</source> +<target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be overwritten on left side</source> +<target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that will be overwritten on right side</source> +<target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> +<source>Show files that will be overwritten on right side</source> +<target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>Hide files that won't be copied</source> +<target>コピーã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target> +<source>Show files that won't be copied</source> +<target>コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> +<source>All directories in sync!</source> +<target>ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>åŒæœŸå‡¦ç†ã‚’実行ã™ã‚‹å‰ã«æ¯”較を行ã£ã¦ãã ã•ã„!</target> +<source>Comma separated list</source> +<target>カンマ区切り</target> +<source>Legend</source> +<target>凡例</target> +<source>File list exported!</source> +<target>ファイル一覧ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå®Œäº†!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%x ã®ã‚ªãƒ–ジェクトãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x ディレクトリ</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x ファイル</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x / %y 行を表示</pluralform> +</target> +<source>Scanning...</source> +<target>スã‚ャンä¸...</target> +<source>Comparing content...</source> +<target>内容を比較ä¸...</target> +<source>Paused</source> +<target>一時åœæ¢ä¸</target> +<source>Aborted</source> +<target>ä¸æ–</target> +<source>Completed</source> +<target>完了ã—ã¾ã—ãŸ</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>ユーザã«ã‚ˆã‚‹ä¸æ–: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„...</target> +<source>Continue</source> +<target>続行</target> +<source>Pause</source> +<target>一時åœæ¢</target> +<source>Cannot find %x</source> +<target>%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“</target> +<source>DECISION TREE</source> +<target>[判定ツリー]</target> +<source>file exists on both sides</source> +<target>両å´ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</target> +<source>on one side only</source> +<target>片å´ã®ã¿</target> +<source>- left</source> +<target>- å·¦å´</target> +<source>- right</source> +<target>- å³å´</target> +<source>different</source> +<target>差異ã‚ã‚Š</target> +<source>- conflict (same date, different size)</source> +<target>- ä¸ä¸€è‡´ (åŒã˜æ—¥ä»˜, ç•°ãªã‚‹ã‚µã‚¤ã‚º)</target> +<source>Inactive</source> +<target>éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–</target> +<source>Second</source> +<target>秒</target> +<source>Minute</source> +<target>分</target> +<source>Hour</source> +<target>時間</target> +<source>Day</source> +<target>æ—¥</target> +<source>Byte</source> +<target>ãƒã‚¤ãƒˆ</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>フィルター:ã™ã¹ã¦ã®ãƒšã‚¢</target> +<source>Filter: Single pair</source> +<target>フィルター:å˜ä¸€ãƒšã‚¢</target> +<source>Ignore</source> +<target>無視</target> +<source>Direct</source> +<target>æ–¹å‘</target> +<source>Follow</source> +<target>フォãƒãƒ¼</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>外部ã®ã‚¢ãƒ—リケーションをコンテã‚ストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒãŒåˆ©ç”¨ã§ãã¾ã™:</target> +<source>- full file or directory name</source> +<target>- 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/フォルダå</target> +<source>- directory part only</source> +<target>- ディレクトリ部ã®ã¿</target> +<source>- Other side's counterpart to %name</source> +<target>- %name ã®å対å´ã®å¯¾è±¡</target> +<source>- Other side's counterpart to %dir</source> +<target>- %dir ã®å対å´ã®å¯¾è±¡</target> +<source>Restore all hidden dialogs?</source> +<target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’ã™ã¹ã¦æˆ»ã—ã¾ã™ã‹?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>本当㫠%x ã®ã‚ªãƒ–ジェクトをゴミ箱ã«ç§»å‹•ã—ã¾ã™ã‹?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>本当ã«ä»¥ä¸‹ %x ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã™ã‹?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™</target> +<source>Delete permanently</source> +<target>完全ã«å‰Šé™¤</target> +<source>Delete or overwrite files permanently</source> +<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target> +<source>Versioning</source> +<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target> +<source>Move files into a time-stamped subdirectory</source> +<target>ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹•</target> +<source>Cannot determine sync-direction:</source> +<target>åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target> +<source>Filter settings have changed!</source> +<target>フィルターè¨å®šã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™!</target> +<source>Both sides have changed since last synchronization!</source> +<target>å‰å›žæœ€å¾Œã®åŒæœŸå‡¦ç†ä»¥é™ã€ä¸¡å´ã¨ã‚‚変更ãŒã‚ã‚Šã¾ã™!</target> +<source>No change since last synchronization!</source> +<target>å‰å›žã®åŒæœŸä»¥é™ã€å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“!</target> +<source>The file was not processed by last synchronization!</source> +<target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ€å¾Œã®åŒæœŸæ“作時ã«å‡¦ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>ディレクトリを削除ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç«¶åˆãŒèµ·ã“ã‚‹å¯èƒ½å§“ãŒã‚ã‚Šã¾ã™!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã</target> +<source>The file does not contain a valid configuration:</source> +<target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:</target> +<source>Scanning:</source> +<target>スã‚ャン:</target> +<source>Encoding extended time information: %x</source> +<target>æ‹¡å¼µã•ã‚ŒãŸæ™‚é–“æƒ…å ±ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚</target> +<source>Directory does not exist:</source> +<target>ディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>ディレクトリãŒä¾å˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target> +<source>Comparing content of files %x</source> +<target>ファイル %x ã®å†…容を比較ä¸</target> +<source>Memory allocation failed!</source> +<target>メモリ割り当ã¦ã«å¤±æ•—!</target> +<source>File %x has an invalid date!</source> +<target>ファイル %x ã®æ—¥ä»˜ã¯ç„¡åŠ¹ãªã‚‚ã®ã§ã™!</target> +<source>Conflict detected:</source> +<target>検出ã•ã‚ŒãŸç«¶åˆ:</target> +<source>Files %x have the same date but a different size!</source> +<target>ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒä¸€ã§ã™ãŒã€ç•°ãªã‚‹å¯¾è±¡ãŒã‚ã‚Šã¾ã™!</target> +<source>Comparing files by content failed.</source> +<target>ファイル内容ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ</target> +<source>Generating file list...</source> +<target>ファイル一覧を作æˆä¸...</target> +<source>Multiple...</source> +<target>複数処ç†...</target> +<source>Files that are equal on both sides</source> +<target>両å´ã§åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«</target> +<source>Equal files/folders that differ in attributes only</source> +<target>åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã§ã€å±žæ€§ã®ã¿ç•°ãªã‚‹</target> +<source>Copy from right to left</source> +<target>å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー</target> +<source>Copy from left to right</source> +<target>å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー</target> +<source>Delete files/folders existing on left side only</source> +<target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target> +<source>Delete files/folders existing on right side only</source> +<target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target> +<source>Copy from right to left overwriting</source> +<target>å³ã‹ã‚‰å·¦ã«ä¸Šæ›¸ãコピー</target> +<source>Copy from left to right overwriting</source> +<target>å·¦ã‹ã‚‰å³ã«ä¸Šæ›¸ãコピー</target> +<source>Do nothing</source> +<target>何もã—ãªã„</target> +<source>Copy attributes only from right to left</source> +<target>属性ã®ã¿å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー</target> +<source>Copy attributes only from left to right</source> +<target>属性ã®ã¿å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー</target> +<source>Deleting file %x</source> +<target>ファイル %x を削除ä¸</target> +<source>Deleting Symbolic Link %x</source> +<target>シンボリックリンク %x を削除ä¸</target> +<source>Deleting folder %x</source> +<target>フォルダ %x を削除ä¸</target> +<source>Moving %x to Recycle Bin</source> +<target>%x をゴミ箱ã«ç§»å‹•ä¸</target> +<source>Moving file %x to user-defined directory %y</source> +<target>ファイル %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>フォルダ %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>シンボリックリンク %x をユーザ定義ディレクトリ %y ã«ã‚³ãƒ”ーä¸</target> +<source>Copying new file %x to %y</source> +<target>ファイル %x ã‚’ %y ã«ã‚³ãƒ”ーä¸</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>シンボリックリンク %x ã‚’ %y ã«ã‚³ãƒ”ーä¸</target> +<source>Overwriting file %x in %y</source> +<target>ファイル %x ã‚’ %y ã«ä¸Šæ›¸ãä¸</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>シンボリックリンク %x ã‚’ %y ã«ä¸Šæ›¸ãä¸</target> +<source>Creating folder %x</source> +<target>フォルダ %x を作æˆä¸</target> +<source>Verifying file %x</source> +<target>ファイル %x ã®æ¤œè¨¼ä¸</target> +<source>Updating attributes of %x</source> +<target>%x ã®å±žæ€§ã‚’æ›´æ–°</target> +<source>Source directory does not exist anymore:</source> +<target>ソースディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>構æˆè¨å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“!</target> +<source>Target directory name must not be empty!</source> +<target>対象ディレクトリåãŒç©ºç™½ã§ã™!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>ユーザ定義ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!</target> +<source>Unresolved conflicts existing!</source> +<target>未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚</target> +<source>Significant difference detected:</source> +<target>é‡å¤§ãªå·®ç•°ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>ファイルåˆè¨ˆç·æ•°ã® 50% 以上ãŒå‰Šé™¤ã€ã¾ãŸã¯ã‚³ãƒ”ーã•ã‚Œã¾ã™</target> +<source>Not enough free disk space available in:</source> +<target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡ãŒè¶³ã‚Šã¾ã›ã‚“:</target> +<source>Free disk space required:</source> +<target>å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target> +<source>Free disk space available:</source> +<target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>複数ペアã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¨å®šéƒ¨åˆ†ã«å¤‰æ›´ã•ã‚ŒãŸç®‡æ‰€ãŒã‚ã‚Šã¾ã™! åŒæœŸè¨å®šã‚’å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„!</target> +<source>Processing folder pair:</source> +<target>フォルダペアを処ç†ä¸:</target> +<source>Generating database...</source> +<target>データベースを作æˆä¸...</target> +<source>Error copying locked file %x!</source> +<target>コピーã«å¤±æ•—! ファイル%x ã¯ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™!</target> diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng index 6de32f72..30b2ef4f 100644 --- a/BUILD/Languages/korean.lng +++ b/BUILD/Languages/korean.lng @@ -1,912 +1,1042 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y ê°œì˜ ê°œì²´ ì‚ì œ 성공 -%x Bytes -%x ë°”ì´íŠ¸ -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x ì¼ -%x directories -%x ë””ë ‰í† ë¦¬ -%x files -%x íŒŒì¼ -%x hour(s) -%x 시간 -%x kB -%x kB -%x min -%x 분 -%x of %y rows in view -%x / %y í–‰ 표시 -%x of 1 row in view -%x / 1 í–‰ 표시 -%x sec -%x ì´ˆ -%x% -%x% -&Abort -ìž‘ì—… 중지(&A) -&About... -ìƒì„¸ ì •ë³´(&A) -&Advanced -ê³ ê¸‰ 옵션(&A) -&Cancel -취소(&C) -&Check for new version -ë²„ì „ ì—…ë°ì´íŠ¸ 확ì¸(&C) -&Content -ë„ì›€ë§ ë‚´ìš© -&Create batch job... -ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±(&C) -&Default -기본 ì„¤ì •/ê°’(&D) -&Exit -나가기(&E) -&Export file list... -íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기(&E) -&File -파ì¼(&F) -&Find next -ë‹¤ìŒ ê²€ìƒ‰(&F) -&Global settings... -ì „ì²´ ì„¤ì •(&G) -&Help -ë„움ë§(&H) -&Ignore -무시(&I) -&Language -언어 ì„ íƒ(&L) -&Load -로드(&L) -&Load configuration... -ì„¤ì • 로드 -&New -ì‹ ê·œ ìž‘ì—… -&No -아니오(&N) -&OK -&OK -&Pause -ì¼ì‹œì •ì§€(&P) -&Program -프로그램(&P) -&Quit -종료 -&Restore -ë³µì›(&R) -&Retry -다시 ì‹œë„(&R) -&Save -ì €ìž¥(&S) -&Switch -ì „í™˜[Switch](&S) -&Yes -예(&Y) -(Build: %x) -(빌드: %x) -(Requires an Internet connection!) -(ì¸í„°ë„· ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤!) -- Other side's counterpart to %dir -- %dir ì˜ ë°˜ëŒ€ì¸¡ ëŒ€ìƒ -- Other side's counterpart to %name -- %name ì˜ ë°˜ëŒ€ì¸¡ ëŒ€ìƒ -- conflict -- 충ëŒ/불ì¼ì¹˜ -- conflict (same date, different size) -- 충ëŒ/불ì¼ì¹˜ (ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다름) -- different -- 다름 -- directory part only -- ë””ë ‰í† ë¦¬ 부분만 -- equal -- ê°™ìŒ -- exists left only -- 좌측ì—만 존재함 -- exists right only -- 우측ì—만 존재함 -- full file or directory name -- ì „ì²´ íŒŒì¼ ë˜ëŠ” ë””ë ‰í† ë¦¬ ì´ë¦„ -- left -- 좌측 -- left newer -- ì¢Œì¸¡ì´ ë” ìµœì‹ -- right -- 우측 -- right newer -- ìš°ì¸¡ì´ ë” ìµœì‹ -/sec -/ì´ˆ -1 directory -1 ë””ë ‰í† ë¦¬ -1 file -1 íŒŒì¼ -1. &Compare -1. ë¹„êµ -1. Enter relative file or directory names separated by ';' or a new line. -1. ê´€ë ¨ 파ì¼ì´ë‚˜ ë””ë ‰í† ë¦¬ ì´ë¦„ì„ ';'ë¡œ 구분하거나, ì¤„ì„ ë°”ê¿” ìž…ë ¥í•˜ì„¸ìš”. -1. Select directories to monitor. -1. 모니터 í• ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”. -2. &Synchronize... -2. ë™ê¸°í™” -2. Enter a command line. -2. ëª…ë ¹ 줄(커맨드ë¼ì¸)ì„ ìž…ë ¥í•˜ì„¸ìš”. -2. Use wildcard characters '*' and '?'. -2. 와ì¼ë“œì¹´ë“œ ë¬¸ìž '*' ë° '?' ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. -3. Exclude files directly on main grid via context menu. -3. 컨í…스트 메뉴ì—ì„œ ì§ì ‘ 파ì¼ì„ ì œì™¸í•©ë‹ˆë‹¤. -3. Press 'Start'. -3. '시작'ì„ ëˆ„ë¥´ì„¸ìš”. -<Automatic> -<ìžë™> -<Directory> -<ë””ë ‰í† ë¦¬> -<Last session> -<마지막 세션> -<Symlink> -<심 ë§í¬> -<multiple selection> -<복수 ì„ íƒ> -A directory input field is empty. -ë””ë ‰í† ë¦¬ ìž…ë ¥ 필드가 비어 있습니다. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -다중 í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ ë””ë ‰í† ë¦¬ê°€ 변경 ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•´ 주세요. -A newer version of FreeFileSync is available: -새로운 ë²„ì „ì˜ FreeFileSyncê°€ 나왔습니다. -Abort requested: Waiting for current operation to finish... -사용ìžì— ì˜í•œ ìž‘ì—… 중지 : 현재 ìž‘ì—… 종료 대기 중... -Abort synchronization immediately -ë™ê¸°í™” ìž‘ì—… 즉시 중단 -Aborted -ì¤‘ì§€ë¨ -About -ìƒì„¸ì •ë³´ -Action -실행 -Add folder -í´ë” 추가 -Add folder pair -í’€ë” íŽ˜ì–´(ì§) 추가 -All directories in sync! -ëª¨ë“ ë””ë ‰í† ë¦¬ ë™ê¸°í™”! -An exception occurred! -예외 ë°œìƒ! -As a result the files are separated into the following categories: -파ì¼ì€ 다ìŒê³¼ ê°™ì€ ì¹´í…Œê³ ë¦¬ë¡œ 분류ë©ë‹ˆë‹¤ : -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -ì´ ì˜µì…˜ì—서는 2ê°œì˜ íŒŒì¼ì´ ê°™ì€ ì´ë¦„ì„ ê°–ëŠ” 경우, ë‚´ìš©ë„ ì •í™•ížˆ ë™ì¼í• ì‹œì—만 ê°™ì€ íŒŒì¼ë¡œ 간주합니다. 백업 작업보다는 파ì¼ë“¤ì˜ ì¼ê´€ì„± ì²´í¬ì— ë” ìœ ìš©í•œ 옵션으로ì¨, íŒŒì¼ ë‚ ì§œ ë° ì‹œê°„ì€ ì „í˜€ ê³ ë ¤ë˜ì§€ 않습니다. \n\në˜í•œ í™œì„±í™”ëœ ì˜ì‚¬ê²°ì • íŠ¸ë¦¬ë„ ë‹¤ìŒê³¼ ê°™ì´ ì¢€ ë” ìž‘ì•„ì§‘ë‹ˆë‹¤ : -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -ìžë™ ë™ê¸°í™” ì¼ê´„ìž‘ì—…ì„ ìœ„í•´ Batch Fileì„ ìƒì„±í•©ë‹ˆë‹¤. ì¼ê´„ 모드를 시작하기 ìœ„í•´ì„ , 실행 가능한 FreeFileSync í˜•ì‹ : FreeFileSync.exe <batchfile>ë¡œ íŒŒì¼ ì´ë¦„ì„ ì§€ì •í•´ 주기만 하면 ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ O/S(ìš´ì˜ì²´ì œ)ì˜ ìž‘ì—…ê´€ë¦¬ìžì—ì„œë„ ì‹¤í–‰ 가능합니다. -At least one directory input field is empty. -최소 1ê°œì˜ ë””ë ‰í† ë¦¬ ìž…ë ¥ ì˜ì—ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤. -Auto-adjust columns -ì—´ ìžë™ì •ë ¬ -Batch execution -ì¼ê´„ìž‘ì—… 실행 -Batch file created successfully! -ì¼ê´„ìž‘ì—… íŒŒì¼ [Batch File] ìƒì„± 성공! -Batch job -ì¼ê´„처리 ìž‘ì—… -Big thanks for localizing FreeFileSync goes out to: -FreeFileSync 현지화 ìž‘ì—… í˜‘ì¡°ì— ê¹Šì€ ê°ì‚¬ 드립니다 : -Both sides have changed since last synchronization! -마지막 ë™ê¸°í™” ìž‘ì—… ì´í›„, 양측 ëª¨ë‘ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤! -Browse -브ë¼ìš°ì¦ˆ -Browse directory -ë””ë ‰í† ë¦¬ 브ë¼ìš°ì¦ˆ -Cannot determine sync-direction: -ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í• ìˆ˜ 없습니다 : -Cannot find %x -%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다. -Cannot write to empty directory path! +<header> + <language name>í•œêµì–´</language name> + <translator>Simon Park</translator> + <locale>ko_KR</locale> + <flag file>south_korea.png</flag file> + <plural forms>1</plural forms> + <plural definition>0</plural definition> +</header> -Category -ì¹´í…Œê³ ë¦¬ -Clear filter settings -í•„í„° ì„¤ì • 지우기 -Comma separated list -콤마 분리 ëª©ë¡ -Command line -ëª…ë ¹ 줄 (커맨드ë¼ì¸) -Command line is empty! -ëª…ë ¹ 줄 (커맨드ë¼ì¸)ì´ ë¹„ì–´ 있습니다! -Compare -비 êµ -Compare both sides -양측 ë¹„êµ -Compare by \"File content\" -\"íŒŒì¼ ë‚´ìš©\" 별 ë¹„êµ -Compare by \"File size and date\" -\"íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ\" 별 ë¹„êµ -Compare by... -ëŒ€ìƒ ë³„ 비êµ... -Comparing content of files %x -íŒŒì¼ %x ë‚´ìš© 별 ë¹„êµ ì¤‘ -Comparing content... -ë‚´ìš© ë¹„êµ ì¤‘... -Comparing files by content failed. -ë‚´ìš© 별 íŒŒì¼ ë¹„êµ ì‹¤íŒ¨ -Comparison Result -ë¹„êµ ê²°ê³¼ -Comparison settings -ë¹„êµ ì„¤ì • -Completed -완료 -Configuration -구성 ì„¤ì • -Configuration loaded! -ì„¤ì • 로드 완료! -Configuration overview: -êµ¬ì„±ì„¤ì • 개요 : -Configuration saved! -ì„¤ì • ì €ìž¥ 완료! -Configure filter -ì„¤ì • í•„í„° -Configure your own synchronization rules. -ê°œì¸ ë™ê¸°í™” 규칙 ì„¤ì • -Confirm -í™•ì¸ -Conflict detected: -íƒì§€ëœ 충ëŒ/불ì¼ì¹˜ : -Conflicts/files that cannot be categorized -ë¶„ë¥˜í• ìˆ˜ 없는 충ëŒ/íŒŒì¼ -Continue -ê³„ì† -Conversion error: -변환 오류 : -Copy attributes only from left to right -ì†ì„±ë§Œ 좌측ì—ì„œ 우측으로 복사 -Copy attributes only from right to left -ì†ì„±ë§Œ 우측ì—ì„œ 좌측으로 복사 -Copy filesystem permissions -íŒŒì¼ ì‹œìŠ¤í…œ 권한 복사 -Copy from left to right -좌측ì—ì„œ 우측으로 복사 -Copy from left to right overwriting -좌측ì—ì„œ 우측으로 ë®ì–´ì“°ê¸° 복사 -Copy from right to left -우측ì—ì„œ 좌측으로 복사 -Copy from right to left overwriting -우측ì—ì„œ 좌측으로 ë®ì–´ì“°ê¸° 복사 -Copy locked files -ë½ ê±¸ë¦° íŒŒì¼ ë³µì‚¬ -Copy new or updated files to right folder. -ì‹ ê·œ ë˜ëŠ” ê°±ì‹ íŒŒì¼ì„ 우측 í´ë”ë¡œ 복사 -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Volume Shadow Copy를 사용하여 ê³µìœ ë˜ëŠ” ë½ ê±¸ë¦° 파ì¼ì„ 복사\n(ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”) -Copy to clipboard\tCTRL+C -í´ë¦½ë³´ë“œì— 복사\tCTRL+C -Copying new Symbolic Link %x to %y -ì‹ ê·œ ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) %y (으)ë¡œ 복사 중 -Copying new file %x to %y -ì‹ ê·œ íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사 중 -Could not determine volume name for file: -íŒŒì¼ ë³¼ë¥¨ ì´ë¦„ì„ ê²°ì •í• ìˆ˜ 없습니다 : -Could not initialize directory monitoring: -ë””ë ‰í† ë¦¬ 모니터ë§ì„ 초기화 í• ìˆ˜ 없습니다 : -Could not load a required DLL: -필요한 DLLì„ ë¡œë“œí• ìˆ˜ 없습니다 : -Could not read values for the following XML nodes: -ë‹¤ìŒ XML 노드 ê°’ì„ ì½ì–´ ë“¤ì¼ ìˆ˜ 없습니다 : -Create a batch job -ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„± -Creating folder %x -í´ë” %x ìƒì„± 중 -Custom -ê°œì¸ ì„¤ì • -Customize columns -ê°œì¸ ì„¤ì • - ì—´ ì¡°ì • -Customize... -ê°œì¸ ì„¤ì •í™”... -D-Click -D-í´ë¦ -DECISION TREE -[ì˜ì‚¬ê²°ì • 트리] -Data verification error: Source and target file have different content! -ë°ì´í„° í™•ì¸ ì˜¤ë¥˜ : 소스 ë° íƒ€ê²Ÿ 파ì¼ì˜ ë‚´ìš©ì´ ë‹¤ë¦…ë‹ˆë‹¤! -Date -ë‚ ì§œ -Delete files/folders existing on left side only -좌측ì—만 존재하는 파ì¼/í´ë” ì‚ì œ -Delete files/folders existing on right side only -우측ì—만 존재하는 파ì¼/í´ë” ì‚ì œ -Delete files\tDEL -íŒŒì¼ ì‚ì œ\tDEL -Delete on both sides -양측 ëª¨ë‘ ì‚ì œ -Delete on both sides even if the file is selected on one side only -ì–´ëŠ í•œìª½ì˜ íŒŒì¼ë§Œ ì„ íƒí•˜ë”ë¼ë„ 양측 ëª¨ë‘ ì‚ì œ -Delete or overwrite files permanently -íŒŒì¼ ì˜êµ¬ ì‚ì œ ë˜ëŠ” ë®ì–´ì“°ê¸° -Delete permanently -ì˜êµ¬ ì‚ì œ -Deleting Symbolic Link %x -ì‹¬ë³¼ë¦ ë§í¬ %x ì‚ì œ 중 -Deleting file %x -íŒŒì¼ %x ì‚ì œ 중 -Deleting folder %x -í´ë” %x ì‚ì œ 중 -Deletion handling -ì‚ì œ 처리 중 -Description -설명 -Direct -다ì´ë ‰íŠ¸ -Directories are dependent! Be careful when setting up synchronization rules: -ë””ë ‰í† ë¦¬ê°€ ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 ì„¤ì • ì‹œ, ì£¼ì˜ í•˜ì‹ì‹œì˜¤. -Directories to watch -ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬ -Directory -ë””ë ‰í† ë¦¬ -Directory does not exist: -ë””ë ‰í† ë¦¬ê°€ 존재하지 않습니다 : -Do not show this dialog again -다ìŒë¶€í„° 표시하지 ì•ŠìŒ -Do nothing -아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ -Do you really want to delete the following object(s)? -ë‹¤ìŒ ê°œì²´ë¥¼ ì •ë§ë¡œ ì‚ì œí•˜ê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ? -Do you really want to move the following object(s) to the Recycle Bin? -ë‹¤ìŒ ê°œì²´ë¥¼ ì •ë§ë¡œ 휴지통으로 ì´ë™í•˜ê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ? -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSyncê°€ 매주 ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë¥¼ 확ì¸í•˜ë„ë¡ í•˜ì‹œê² ìŠµë‹ˆê¹Œ? -Donate with PayPal -PayPalë¡œ 기부하기 -Download now? -지금 다운로드 í•˜ì‹œê² ìŠµë‹ˆê¹Œ? -Drag && drop -드래그 && ë“œëž -Elements found: -ë°œê²¬ëœ ìš”ì†Œ : -Elements processed: -ì²˜ë¦¬ëœ ìš”ì†Œ : -Elements remaining: -ë‚¨ì€ ìš”ì†Œ : -Email -ì´ë©”ì¼ -Encoding extended time information: %x -ì¸ì½”딩 확장 시간 ì •ë³´ : %x -Endless loop when traversing directory: -ë””ë ‰í† ë¦¬ ì´ë™ 중 무한 루프 ë°œìƒ : -Equal files/folders that differ in attributes only -ì†ì„±ë§Œ 다른 ë™ì¼ 파ì¼/í´ë” -Error -오류 -Error changing modification time: -시간 ìˆ˜ì • 중 ë°œìƒí•œ 오류 : -Error copying file permissions: -íŒŒì¼ ê¶Œí•œ 복사 중 ë°œìƒí•œ 오류 : -Error copying file: -íŒŒì¼ ë³µì‚¬ 중 ë°œìƒí•œ 오류 : -Error copying locked file %x! -복사 실패! íŒŒì¼ %x ì— ë½ì´ ê±¸ë ¤ 있습니다. -Error copying symbolic link: -ì‹¬ë³¼ë¦ ë§í¬ 복사 중 ë°œìƒí•œ 오류 : -Error creating directory: -ë””ë ‰í† ë¦¬ ìƒì„± 중 ë°œìƒí•œ 오류 : -Error deleting directory: -ë””ë ‰í† ë¦¬ ì‚ì œ 중 ë°œìƒí•œ 오류 : -Error deleting file: -íŒŒì¼ ì‚ì œ 중 ë°œìƒí•œ 오류 : -Error handling -처리 ê³¼ì • 중 ë°œìƒí•œ 오류 : -Error loading library function: -ë¼ì´ë¸ŒëŸ¬ë¦¬ 기능 로드 중 ë°œìƒí•œ 오류 : -Error moving directory: -ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 : -Error moving file: -íŒŒì¼ ì´ë™ 중 ë°œìƒí•œ 오류 : -Error moving to Recycle Bin: -휴지통으로 ì´ë™ 중 ë°œìƒí•œ 오류 : -Error opening file: -파ì¼ì„ ì—´ë˜ ì¤‘ ë°œìƒí•œ 오류 : -Error parsing configuration file: -ì„¤ì •íŒŒì¼ ë¶„ì„ ì¤‘ ë°œìƒí•œ 오류 : -Error reading file attributes: -íŒŒì¼ ì†ì„±ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 : -Error reading file: -파ì¼ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 : -Error reading from synchronization database: -ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ë¡œë¶€í„° ì½ì–´ 들ì´ë˜ 중 ë°œìƒí•œ 오류 : -Error reading security context: -보안 컨í…스트를 ì½ë˜ 중 ë°œìƒí•œ 오류 : -Error resolving symbolic link: -ì‹¬ë³¼ë¦ ë§í¬ë¥¼ í•´ê²°í•˜ë˜ ì¤‘ ë°œìƒí•œ 오류 : -Error setting directory lock: -ë””ë ‰í† ë¦¬ ë½ ì„¤ì • 중 ë°œìƒí•œ 오류 : -Error setting privilege: -특권(프리빌리지) ì„¤ì • 중 ë°œìƒí•œ 오류 : -Error starting Volume Shadow Copy Service! -Volume Shadow Copy Service 시작 중 오류 ë°œìƒ! -Error traversing directory: -ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 : -Error when monitoring directories. -ë””ë ‰í† ë¦¬ ëª¨ë‹ˆí„°ë§ ì¤‘ ë°œìƒí•œ 오류 : -Error writing file: -파ì¼ì„ ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 : -Error writing security context: -보안 컨í…스트를 ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 : -Error writing to synchronization database: -ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ì— ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 : -Example -보기/예 -Exclude -ì œì™¸ -Exclude all rows -ì „ì²´ í–‰(로우) ì œì™¸ -Exclude temporarily -ìž„ì‹œ ì œì™¸ -Exclude via filter: -필터를 통하여 ì œì™¸ -Exit instantly -즉시 종료 -Extension -í™•ìž¥ìž -External applications -외부 ì• í”Œë¦¬ì¼€ì´ì…˜ -Fatal Error -치명ì 오류 -Feedback and suggestions are welcome at: -피드백 ë° ì œì•ˆì‚¬í•ì€ 아래로 ë³´ë‚´ 주ì‹ì‹œì˜¤ : -File %x has an invalid date! -íŒŒì¼ %x ì˜ ë‚ ì§œê°€ ìœ íš¨í•˜ì§€ 않습니다! -File already exists. Overwrite? -파ì¼ì´ ì´ë¯¸ 존재합니다. ë®ì–´ ì“°ì‹œê² ìŠµë‹ˆê¹Œ? -File content -íŒŒì¼ ë‚´ìš© -File does not exist: -파ì¼ì´ 존재하지 않습니다 : -File list exported! -íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기 완료! -File size and date -íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ -Filename -íŒŒì¼ ì´ë¦„ -Files %x have the same date but a different size! -íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다! -Files are found equal if\n - file content\nis the same -ë§Œì¼ \n - íŒŒì¼ ë‚´ìš©\n ì´ ê°™ì„ ê²½ìš°, ë™ì¼í•œ 파ì¼ë¡œ 간주 -Files are found equal if\n - filesize\n - last write time and date\nare the same -ë§Œì¼ \n - íŒŒì¼ í¬ê¸°\n - 최종 기입 시간 ë° ì¼ìž\n ì´ ê°™ì„ ê²½ìš°, ë™ì¼í•œ 파ì¼ë¡œ 간주 -Files that are equal on both sides -양측 ëª¨ë‘ ë™ì¼í•œ íŒŒì¼ -Files that exist on both sides, left one is newer -파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼. -Files that exist on both sides, right one is newer -파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼. -Files that have different content -ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ -Files/folders that exist on left side only -좌측ì—만 존재하는 파ì¼/í´ë” -Files/folders that exist on right side only -우측ì—만 존재하는 파ì¼/í´ë” -Filter files -íŒŒì¼ í•„í„° -Filter is active -í•„í„° 활성화 ìƒíƒœ -Filter settings have changed! -í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다! -Filter: All pairs -í•„í„° : ëª¨ë“ íŽ˜ì–´(ì§) -Filter: Single pair -í•„í„° : ë‹¨ì¼ íŽ˜ì–´(ì§) -Find -검색 -Find what: -검색어 : -Folder Comparison and Synchronization -í´ë” ë¹„êµ ë° ë™ê¸°í™” -Folder pairs -í´ë” 페어(ì§) -Follow -팔로우 -Free disk space available: -사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ : -Free disk space required: -필요한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ : -FreeFileSync Batch Job -FreeFileSync ì¼ê´„ ìž‘ì—… [Batch Job] -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge [오픈소스 보기] -FreeFileSync batch file -FreeFileSync 뱃치 íŒŒì¼ -FreeFileSync configuration -FreeFileSync 구성 ì„¤ì • -FreeFileSync is up to date! -FreeFileSync 는 현재 ìµœì‹ ë²„ì „ ìƒíƒœìž…니다! -Full path -ì „ì²´ 경로 -Generating database... -ë°ì´í„°ë² ì´ìŠ¤ ìƒì„± 중... -Generating file list... -íŒŒì¼ ë¦¬ìŠ¤íŠ¸ ìƒì„± 중... -Global settings -ì „ì²´ ì„¤ì • -Help -ë„ì›€ë§ -Hidden dialogs: -다ì´ì–¼ë¡œê·¸ 숨기기 -Hide all error and warning messages -ëª¨ë“ ì˜¤ë¥˜/ê²½ê³ ë©”ì„¸ì§€ 숨기기 -Hide conflicts -ì¶©ëŒ ë‚´ìš© 숨기기 -Hide excluded items -ì œì™¸ ì•„ì´í…œ 숨기기 -Hide files that are different -ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that are equal -ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that are newer on left -ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that are newer on right -ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that exist on left side only -좌측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that exist on right side only -우측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be created on the left side -ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be created on the right side -ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be deleted on the left side -좌측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be deleted on the right side -우측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be overwritten on left side -ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that will be overwritten on right side -ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide files that won't be copied -복사ë˜ì§€ ì•Šì„ íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide filtered or temporarily excluded files -í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë íŒŒì¼ ìˆ¨ê¸°ê¸° -Hide further error messages during the current process -현재 ì²˜ë¦¬ê³¼ì • ë™ì•ˆ 추가오류 메세지 숨기기 -Hints: -힌트 : -Homepage -홈페ì´ì§€ -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하여, 양측 변경사í•ì„ 확ì¸í•©ë‹ˆë‹¤. ì‚ì œ ë° ì¶©ëŒ ë‚´ì—ì€ ìžë™ ê°ì§€ë©ë‹ˆë‹¤. -Idle time between detection of last change and execution of command line in seconds -마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ì»¤ë©˜ë“œë¼ì¸ 실행까지 대기시간 (ì´ˆ) -If you like FFS -기부하기^^ -Ignore -무시 -Ignore errors -오류 무시 -Ignore subsequent errors -ì´í›„ 오류 무시 -Include -í¬í•¨ -Include all rows -ëª¨ë“ í–‰(로우) í¬í•¨ -Include temporarily -ìž„ì‹œ í¬í•¨ -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -í¬í•¨ : *.doc;*.zip;*.exe\nì œì™¸: \\stuff\\temp\\* -Incompatible synchronization database format: -호환ë˜ì§€ 않는 ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ í˜•ì‹ : -Info -ì •ë³´ -Information -ì¸í¬ë©”ì´ì…˜ (ì •ë³´) -Initial synchronization: -초기 ë™ê¸°í™” : -Integrate external applications into context menu. The following macros are available: -외부 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ Context Menuì— í†µí•©. ë‹¤ìŒ ë§¤í¬ë¡œê°€ 사용 가능합니다 : -Invalid FreeFileSync config file! -ìœ íš¨í•˜ì§€ ì•Šì€ FreeFileSync ì„¤ì • 파ì¼! -Last used configurations (press DEL to remove from list) -마지막으로 사용한 ì„¤ì • (DEL 키를 누르면 리스트ì—ì„œ ì‚ì œ) -Leave as unresolved conflict -í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기 -Left -좌측 -Legend -범례 -Load configuration from file -외부 파ì¼ë¡œë¶€í„° ì„¤ì • 로드 -Log-messages: -로그 메세지 : -Logging -로그 -Main bar -ë©”ì¸ ë°” -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -WOW64 ì—ì„œì˜ Shadow Copy 는 지ì›í•˜ì§€ 않습니다. FreeFileSync 64-bit ë²„ì „ì„ ì‚¬ìš©í•˜ì„¸ìš”. -Match case -대문ìž/ì†Œë¬¸ìž êµ¬ë¶„ -Maximum number of logfiles: -최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ : -Memory allocation failed! -메모리 í• ë‹¹ 실패! -Minimum Idle Time [seconds] -최소 대기시간 [ì´ˆ] -Mirror ->> -미러 ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -좌측 í´ë” 백업 미러. ë™ê¸°í™” ì´í›„ 우측 í´ë”는 좌측 í´ë”와 ì™„ì „ížˆ ë˜‘ê°™ì´ ë§¤ì¹˜ ë˜ë„ë¡ ë³€ê²½ ë©ë‹ˆë‹¤. -Monitoring active... -ëª¨ë‹ˆí„°ë§ í™œì„±í™”... -More than 50% of the total number of files will be copied or deleted! -ì´ íŒŒì¼ ê°œìˆ˜ì˜ 50% ì´ìƒì´ 복사ë˜ê±°ë‚˜ ì‚ì œ ë©ë‹ˆë‹¤! -Move column down -ì—´(컬럼) 아래로 ì´ë™ -Move column up -ì—´(컬럼) 위로 ì´ë™ -Move files into a time-stamped subdirectory -파ì¼ì„ 타임 스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™ -Moving %x to Recycle Bin -%x ì„(를) 휴지통으로 ì´ë™ 중 -Moving Symbolic Link %x to user-defined directory %y -ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y ë¡œ ì´ë™ 중 -Moving file %x to user-defined directory %y -íŒŒì¼ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y ë¡œ ì´ë™ 중 -Moving folder %x to user-defined directory %y -í´ë” %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y ë¡œ ì´ë™ 중 -Multiple... -다중처리 (멀티플) ìž‘ì—…... -No change since last synchronization! -마지막 ë™ê¸°í™” ì´í›„ ë³€ê²½ì‚¬í• ì—†ìŒ! -No filter selected -ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ -Not enough free disk space available in: -사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤ : -Nothing to synchronize according to configuration! -êµ¬ì„±ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í• ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤! -Number of files and directories that will be created -ìƒì„±ë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수 -Number of files and directories that will be deleted -ì‚ì œë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수 -Number of files that will be overwritten -ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜ -One of the FreeFileSync database entries within the following file is not yet existing: -ë‹¤ìŒ íŒŒì¼ ë‚´ì— ìžˆëŠ” FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ 엔트리 중 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 : -One of the FreeFileSync database files is not yet existing: -FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ íŒŒì¼ ì¤‘ 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 : -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -í•„í„°ë§ì„ 통과하는 파ì¼/ë””ë ‰í† ë¦¬ ë§Œì˜ ë™ê¸°í™”를 위해 ì„ íƒí•©ë‹ˆë‹¤. 기준 ë™ê¸°í™” ë””ë ‰í† ë¦¬ 대ìƒ(!) ì´ë¦„ì„ í•„í„°ëŠ” ì 용합니다. -Open with Explorer -ìµìŠ¤í”Œë¡œëŸ¬ë¡œ 열기 -Open with default application -기본값 ì• í”Œë¦¬ì¼€ì´ì…˜ìœ¼ë¡œ 열기 -Operation aborted! -ìž‘ì—… 중지! -Operation: -ìž‘ì—… : -Overview -개요 -Overwriting Symbolic Link %x in %y -ì‹¬ë³¼ë¦ ë§í¬ %x 를 %y ì— ë®ì–´ì“°ëŠ” 중 -Overwriting file %x in %y -íŒŒì¼ %x 를 %y ì— ë®ì–´ì“°ëŠ” 중 -Pause -ì¼ì‹œì •ì§€ -Paused -ì¼ì‹œì •ì§€ 중 -Planned directory deletion is in conflict with its subdirectories and -files! -ë””ë ‰í† ë¦¬ë¥¼ ì‚ì œí•˜ë©´ ì„œë¸Œë””ë ‰í† ë¦¬ ë° íŒŒì¼ê³¼ 충ëŒí•˜ê²Œ ë©ë‹ˆë‹¤! -Please run a Compare first before synchronizing! -ë™ê¸°í™” ìž‘ì—… ì´ì „ì— ë¹„êµë¥¼ ë¨¼ì € 실행해 주ì‹ì‹œì˜¤! -Press \"Switch\" to open FreeFileSync GUI mode. -FreeFileSync GUI 모드는 \"ì „í™˜\" ì„ ëˆ„ë¥´ë©´ 열립니다. -Processing folder pair: -í´ë” 페어 처리 중 : -Published under the GNU General Public License: -GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시 : -Question -질문 -RealtimeSync - Automated Synchronization -실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™” -RealtimeSync configuration -실시간 ë™ê¸°í™” ì„¤ì • -Recycle Bin not yet supported for this system! -본 시스템ì—서는 íœ´ì§€í†µì„ ì•„ì§ ì§€ì›í•˜ì§€ 않습니다. -Relative path -ëŒ€ìƒ ê²½ë¡œ -Remove alternate settings -ëŒ€ì²´ì„¤ì • ì œê±° -Remove folder -í´ë” ì œê±° -Remove folder pair -í´ë” 페어(ì§) ì œê±° -Report translation error -ë²ˆì— ê´€ë ¨ 오류 ë³´ê³ -Reset -리셋 -Reset view -보기 리셋 -Restore all hidden dialogs? -ëª¨ë“ ìˆ¨ê¸´ 다ì´ì–¼ë¡œê·¸ë¥¼ ë³µì› í•˜ì‹œê² ìŠµë‹ˆê¹Œ? -Right -우측 -S&ave configuration... -ì„¤ì • ì €ìž¥ -S&witch view -보기 ì „í™˜ -Save changes to current configuration? -현재 ì„¤ì •ì˜ ë³€ê²½ ë‚´ìš©ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ? -Save current configuration to file -현재 ì„¤ì •ì„ íŒŒì¼ë¡œ ì €ìž¥ -Scanning... -스캔 중... -Scanning: -스캔 : -Select a folder -í´ë” ì„ íƒ -Select alternate synchronization settings -대체 ë™ê¸°í™” ì„¤ì • ì„ íƒ -Select logfile directory: -ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ : -Select variant: -옵션 ì„ íƒ : -Select view -보기 ì„ íƒ -Set direction: -ë°©í–¥ ì„¤ì • : -Setting default synchronization directions: Old files will be overwritten with newer files. -기본값 ë™ê¸°í™” ë°©í–¥ ì„¤ì • : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ì“°ì—¬ 집니다. -Show \"%x\" -\"%x\" 표시 -Show conflicts -ì¶©ëŒ í‘œì‹œ -Show files that are different -ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ í‘œì‹œ -Show files that are equal -ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ í‘œì‹œ -Show files that are newer on left -ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ -Show files that are newer on right -ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ -Show files that exist on left side only -좌측ì—만 존재하는 íŒŒì¼ í‘œì‹œ -Show files that exist on right side only -우측ì—만 존재하는 íŒŒì¼ í‘œì‹œ -Show files that will be created on the left side -ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ -Show files that will be created on the right side -ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ -Show files that will be deleted on the left side -좌측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ -Show files that will be deleted on the right side -우측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ -Show files that will be overwritten on left side -ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ -Show files that will be overwritten on right side -ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ -Show files that won't be copied -복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ -Show hidden dialogs -숨긴 다ì´ì–¼ë¡œê·¸ 표시 -Show popup -íŒì—… 표시 -Show popup on errors or warnings -오류/ê²½ê³ ê´€ë ¨ íŒì—… 표시 -Significant difference detected: -중대한 ì°¨ì´ê°€ ê°ì§€ ë습니다 : -Silent mode -사ì¼ëŸ°íŠ¸ 모드 -Size -í¬ê¸° -Source code written completely in C++ utilizing: -소스 코드는 ì „ë¶€ C++ 언어로 아래 íˆ´ì„ ì‚¬ìš©í•˜ì—¬ 작성 ë˜ì—ˆìŠµë‹ˆë‹¤ : -Source directory does not exist anymore: -소스 ë””ë ‰í† ë¦¬ê°€ ë” ì´ìƒ 존재하지 않습니다 : -Speed: -ì†ë„ : -Start -시작 -Start minimized and write status information to a logfile -최소화 ìƒíƒœë¡œ ì‹œìž‘í•˜ê³ , 로그파ì¼ì— ìƒíƒœ ì •ë³´ë¥¼ ê¸°ë¡ -Start synchronization -ë™ê¸°í™” 시작 -Statistics -통계 -Status feedback -ìƒíƒœ 피드백 -Stop -ì •ì§€ -Swap sides -측면 위치 서로 바꾸기 -Switching to FreeFileSync GUI mode... -FreeFileSync GUI 모드로 ì „í™˜ 중... -Symbolic Link handling -ì‹¬ë³¼ë¦ ë§í¬ 처리 -Symlinks %x have the same date but a different target! -Symlinks %x ì˜ ë‚ ì§œëŠ” 같으나, 대ìƒì´ 다릅니다! -Synchronization Preview -ë™ê¸°í™” 미리보기 -Synchronization aborted! -ë™ê¸°í™” 중단! -Synchronization completed successfully! -ë™ê¸°í™”ê°€ 성공ì 으로 완료 ë습니다! -Synchronization completed with errors! -ë™ê¸°í™”ê°€ 완료ë˜ê¸´ 했으나, 오류가 있습니다! -Synchronization settings -ë™ê¸°í™” ì„¤ì • -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -서브í´ë” \"temp\" ì— ìžˆëŠ” 파ì¼ë“¤ì€ ì œì™¸í•˜ê³ , ì´ì™¸ ëª¨ë“ .doc, .zip, .exe í™•ìž¥ìž íŒŒì¼ ë™ê¸°í™” -Synchronize... -ë™ ê¸° í™” -Synchronizing... -ë™ê¸°í™” ìž‘ì—… 중... -Target directory already existing! -ëŒ€ìƒ ë””ë ‰í† ë¦¬ê°€ ì´ë¯¸ 존재합니다! -Target file already existing! -ëŒ€ìƒ íŒŒì¼ì´ ì´ë¯¸ 존재합니다! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -ì´ ì»¤ë©˜ë“œë¼ì¸ì€ ë‹¤ìŒ ê²½ìš° 매번 실행 ë©ë‹ˆë‹¤:\n- ëª¨ë“ ë””ë ‰í† ë¦¬ì—ì„œ 사용 ê°€ëŠ¥í• ì‹œ (예. USB 스틱 삽입시) \n- ë””ë ‰í† ë¦¬, ë˜ëŠ” ì„œë¸Œë””ë ‰í† ë¦¬ë‚´ì˜ íŒŒì¼ì€ 변경 ë©ë‹ˆë‹¤. -The file does not contain a valid configuration: -ì´ íŒŒì¼ì€ ìœ íš¨í•œ ì„¤ì • ê°’ì„ ê°–ê³ ìžˆì§€ 않습니다 : -The file was not processed by last synchronization! -ì´ íŒŒì¼ì€ 마지막 ë™ê¸°í™”ì—ì„œ 처리ë˜ì§€ 않았습니다! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -ì´ ì˜µì…˜ì€ ë™ì¼í•œ ì´ë¦„ì˜ 2ê°œì˜ íŒŒì¼ì´ ê°™ì€ í¬ê¸° ë° ê°™ì€ ë§ˆì§€ë§‰ 작성 ì¼ìž/ì‹œê°„ì„ ê°–ì„ ê²½ìš°, ì´ë“¤ 2ê°œ 파ì¼ì„ í‰ê°€í•©ë‹ˆë‹¤. -Time -시간 -Time elapsed: -경과 시간 : -Time remaining: -ë‚¨ì€ ì‹œê°„ : -Total amount of data that will be transferred -ì „ì†¡í•˜ê²Œ ë ì „ì²´ ë°ì´í„° 량 -Total time: -ì „ì²´ 시간 : -Transfer file and directory permissions\n(Requires Administrator rights) -íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 ì „ì†¡\n(ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨) -Unable to connect to sourceforge.net! -Sourceforge.netì— ì ‘ì†í• 수 없습니다! -Unable to create logfile! -ë¡œê·¸íŒŒì¼ ìƒì„±ì„ í• ìˆ˜ 없습니다! -Unresolved conflicts existing! -í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒì´ 있습니다! -Update -> -ì—…ë°ì´íŠ¸ -> -Updating attributes of %x -%x ì†ì„± ì—…ë°ì´íŠ¸ -Usage: -사용 : -Use Recycle Bin -휴지통 사용 -Use Recycle Bin when deleting or overwriting files -파ì¼ì„ ì‚ì œí•˜ê±°ë‚˜ ë®ì–´ì“°ê¸° í• ë•Œ, 휴지통 사용 -User-defined directory for deletion was not specified! -ì‚ì œë¥¼ 위한 ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ê°€ ì •í•´ì§€ì§€ 않았습니다! -Variant -옵션(변수) -Verifying file %x -íŒŒì¼ %x í™•ì¸ -Versioning -ë²„ì €ë‹ -Volume name %x not part of filename %y! -볼륨 ì´ë¦„ %x ê°€ íŒŒì¼ ì´ë¦„ %y ì˜ ì¼ë¶€ê°€ 아님! -Waiting for missing directories... -ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중... -Waiting while directory is locked (%x)... -ë””ë ‰í† ë¦¬ ìž ê¸ˆ 대기 중 (%x)... -Warning -ê²½ê³ -When the comparison is started with this option set the following decision tree is processed: -ì´ ì˜µì…˜ìœ¼ë¡œ 비êµë¥¼ ì‹œìž‘í• ê²½ìš°, 다ìŒê³¼ ê°™ì€ ì˜ì‚¬ê²°ì • 트리 ì„¤ì •ì´ ì²˜ë¦¬ë©ë‹ˆë‹¤ : -You can ignore conflicts and continue synchronization. -충ëŒì„ ë¬´ì‹œí•˜ê³ ë™ê¸°í™”를 계ì†í• 수 있습니다. -You can ignore this error to consider the directory as empty. -ë””ë ‰í† ë¦¬ê°€ 비었다는 오류는 ë¬´ì‹œí• ìˆ˜ 있습니다. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -잔여 ì•„ì´í…œì— 대한 ë™ê¸°í™”를 (다시 비êµí• 필요없ì´) 재시ë„í• ìˆ˜ 있습니다! -different -다름 -file exists on both sides -양측 모ë‘ì— íŒŒì¼ì´ 존재 -on one side only -한쪽ì—만 +<source>Show in Explorer</source> +<target>íƒìƒ‰ê¸°ì— 표시</target> +<source>Open with default application</source> +<target>기본값 ì• í”Œë¦¬ì¼€ì´ì…˜ìœ¼ë¡œ 열기</target> +<source>Browse directory</source> +<target>ë””ë ‰í† ë¦¬ 찾아보기</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™”</target> +<source>Browse</source> +<target>찾아보기</target> +<source>Error resolving symbolic link:</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ë¥¼ í•´ê²°í•˜ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Select alternate synchronization settings</source> +<target>대체 ë™ê¸°í™” ì„¤ì • ì„ íƒ</target> +<source>No filter selected</source> +<target>ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ</target> +<source>Filter is active</source> +<target>í•„í„° 활성화</target> +<source>Clear filter settings</source> +<target>í•„í„° ì„¤ì • 지우기</target> +<source>Remove alternate settings</source> +<target>ëŒ€ì²´ì„¤ì • ì œê±°</target> +<source>Create a batch job</source> +<target>ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±</target> +<source>Synchronization settings</source> +<target>ë™ê¸°í™” ì„¤ì •</target> +<source>Comparison settings</source> +<target>ë¹„êµ ì„¤ì •</target> +<source>About</source> +<target>ìƒì„¸ì •ë³´</target> +<source>Error</source> +<target>오류</target> +<source>Warning</source> +<target>ê²½ê³ </target> +<source>Question</source> +<target>질문</target> +<source>Confirm</source> +<target>확ì¸</target> +<source>Configure filter</source> +<target>í•„í„° ì„¤ì •</target> +<source>Customize columns</source> +<target>ê°œì¸ ì„¤ì • - ì—´ ì¡°ì •</target> +<source>Global settings</source> +<target>ì „ì²´ ì„¤ì •</target> +<source>Synchronization Preview</source> +<target>ë™ê¸°í™” 미리보기</target> +<source>Find</source> +<target>검색</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x ë°”ì´íŠ¸</pluralform> +</target> +<source><Symlink></source> +<target><심ë§í¬></target> +<source><Directory></source> +<target><ë””ë ‰í† ë¦¬></target> +<source>Size</source> +<target>í¬ê¸°</target> +<source>Date</source> +<target>ë‚ ì§œ</target> +<source>Full path</source> +<target>ì „ì²´ 경로</target> +<source>Filename</source> +<target>íŒŒì¼ ì´ë¦„</target> +<source>Relative path</source> +<target>ëŒ€ìƒ ê²½ë¡œ</target> +<source>Directory</source> +<target>ë””ë ‰í† ë¦¬</target> +<source>Extension</source> +<target>확장ìž</target> +<source>Comparison Result</source> +<target>ë¹„êµ ê²°ê³¼</target> +<source>Incompatible synchronization database format:</source> +<target>호환ë˜ì§€ 않는 ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ í˜•ì‹ :</target> +<source>Initial synchronization:</source> +<target>초기 ë™ê¸°í™” :</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ íŒŒì¼ ì¤‘ 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>ë‹¤ìŒ íŒŒì¼ ë‚´ì— ìžˆëŠ” FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ 엔트리 중 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :</target> +<source>Error reading from synchronization database:</source> +<target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ë¡œë¶€í„° ì½ì–´ 들ì´ë˜ 중 ë°œìƒí•œ 오류 :</target> +<source>An exception occurred!</source> +<target>예외 ë°œìƒ!</target> +<source>Error deleting file:</source> +<target>íŒŒì¼ ì‚ì œ 중 ë°œìƒí•œ 오류 :</target> +<source>Error reading file attributes:</source> +<target>íŒŒì¼ ì†ì„±ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> +<source>Waiting while directory is locked (%x)...</source> +<target>ë””ë ‰í† ë¦¬ ìž ê¸ˆ 대기 중 (%x)...</target> +<source>Error setting directory lock:</source> +<target>ë””ë ‰í† ë¦¬ ìž ê¸ˆ ì„¤ì • 중 ë°œìƒí•œ 오류 :</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%xì´ˆ</pluralform> +</target> +<source>Info</source> +<target>ì •ë³´</target> +<source>Fatal Error</source> +<target>치명ì 오류</target> +<source>File does not exist:</source> +<target>파ì¼ì´ 존재하지 않습니다 :</target> +<source>Error parsing configuration file:</source> +<target>ì„¤ì •íŒŒì¼ ë¶„ì„ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Error writing file:</source> +<target>파ì¼ì„ ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Invalid FreeFileSync config file!</source> +<target>ìœ íš¨í•˜ì§€ ì•Šì€ FreeFileSync ì„¤ì • 파ì¼!</target> +<source>/sec</source> +<target>/ì´ˆ</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x분</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x시간</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%xì¼</pluralform> +</target> +<source>S&ave configuration...</source> +<target>ì„¤ì • ì €ìž¥</target> +<source>&Load configuration...</source> +<target>ì„¤ì • 로드</target> +<source>&Quit</source> +<target>종료</target> +<source>&File</source> +<target>파ì¼(&F)</target> +<source>&Content</source> +<target>ë„ì›€ë§ ë‚´ìš©</target> +<source>&About...</source> +<target>ìƒì„¸ ì •ë³´(&A)</target> +<source>&Help</source> +<target>ë„움ë§(&H)</target> +<source>Usage:</source> +<target>사용 :</target> +<source>1. Select directories to monitor.</source> +<target>1. 모니터 대ìƒì´ ë ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”.</target> +<source>2. Enter a command line.</source> +<target>2. ëª…ë ¹ 줄(커맨드ë¼ì¸)ì„ ìž…ë ¥í•˜ì„¸ìš”.</target> +<source>3. Press 'Start'.</source> +<target>3. '시작'ì„ ëˆ„ë¥´ì„¸ìš”.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +커멘드ë¼ì¸ì€ 다ìŒê³¼ ê°™ì€ ê²½ìš°ì— ë§¤ë²ˆ 실행 ë©ë‹ˆë‹¤: +- ëª¨ë“ ë””ë ‰í† ë¦¬ê°€ 사용 ê°€ëŠ¥í• ê²½ìš° (예. USB 스틱 삽입시) +- 해당 ë””ë ‰í† ë¦¬ ë˜ëŠ” ì„œë¸Œë””ë ‰í† ë¦¬ ë‚´ì˜ íŒŒì¼ì´ 변경ë 경우 +</target> +<source>Directories to watch</source> +<target>ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬</target> +<source>Add folder</source> +<target>í´ë” 추가</target> +<source>Remove folder</source> +<target>í´ë” ì œê±°</target> +<source>Select a folder</source> +<target>í´ë” ì„ íƒ</target> +<source>Command line</source> +<target>ëª…ë ¹ 줄 (커맨드ë¼ì¸)</target> +<source>Minimum Idle Time [seconds]</source> +<target>최소 대기시간 [ì´ˆ]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ì»¤ë©˜ë“œë¼ì¸ 실행까지 대기시간 (ì´ˆ 단위)</target> +<source>Start</source> +<target>시작</target> +<source>(Build: %x)</source> +<target>(빌드: %x)</target> +<source>RealtimeSync configuration</source> +<target>실시간 ë™ê¸°í™” ì„¤ì •</target> +<source>File already exists. Overwrite?</source> +<target>파ì¼ì´ ì´ë¯¸ 존재합니다. ë®ì–´ ì“°ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<source>&Restore</source> +<target>ë³µì›(&R)</target> +<source>&Exit</source> +<target>나가기(&E)</target> +<source>Monitoring active...</source> +<target>ëª¨ë‹ˆí„°ë§ í™œì„±í™”...</target> +<source>Waiting for missing directories...</source> +<target>ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중...</target> +<source>Command line is empty!</source> +<target>ëª…ë ¹ 줄 (커맨드ë¼ì¸)ì´ ë¹„ì–´ 있습니다!</target> +<source>Could not initialize directory monitoring:</source> +<target>ë””ë ‰í† ë¦¬ 모니터ë§ì„ 초기화 í• ìˆ˜ 없습니다 :</target> +<source>A directory input field is empty.</source> +<target>ë””ë ‰í† ë¦¬ ìž…ë ¥ 필드가 비어 있습니다.</target> +<source>Error when monitoring directories.</source> +<target>ë””ë ‰í† ë¦¬ ëª¨ë‹ˆí„°ë§ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Drag && drop</source> +<target>드래그 && ë“œëž</target> +<source>Conversion error:</source> +<target>변환 오류 :</target> +<source>Error moving file:</source> +<target>íŒŒì¼ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> +<source>Operation aborted!</source> +<target>ìž‘ì—… 중지!</target> +<source>Target file already existing!</source> +<target>ëŒ€ìƒ íŒŒì¼ì´ ì´ë¯¸ 존재합니다!</target> +<source>Error moving directory:</source> +<target>ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> +<source>Target directory already existing!</source> +<target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ê°€ ì´ë¯¸ 존재합니다!</target> +<source>Error deleting directory:</source> +<target>ë””ë ‰í† ë¦¬ ì‚ì œ 중 ë°œìƒí•œ 오류 :</target> +<source>Error changing modification time:</source> +<target>시간 ìˆ˜ì • 중 ë°œìƒí•œ 오류 :</target> +<source>Error loading library function:</source> +<target>ë¼ì´ë¸ŒëŸ¬ë¦¬ 기능 로드 중 ë°œìƒí•œ 오류 :</target> +<source>Error reading security context:</source> +<target>보안 컨í…스트를 ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> +<source>Error writing security context:</source> +<target>보안 컨í…스트를 ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Error copying file permissions:</source> +<target>íŒŒì¼ ê¶Œí•œ 복사 중 ë°œìƒí•œ 오류 :</target> +<source>Error creating directory:</source> +<target>ë””ë ‰í† ë¦¬ ìƒì„± 중 ë°œìƒí•œ 오류 :</target> +<source>Error copying symbolic link:</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ 복사 중 ë°œìƒí•œ 오류 :</target> +<source>Error copying file:</source> +<target>íŒŒì¼ ë³µì‚¬ 중 ë°œìƒí•œ 오류 :</target> +<source>Error opening file:</source> +<target>파ì¼ì„ ì—´ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Error reading file:</source> +<target>파ì¼ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> +<source>Endless loop when traversing directory:</source> +<target>ë””ë ‰í† ë¦¬ ì´ë™ 중 무한 루프 ë°œìƒ :</target> +<source>Error traversing directory:</source> +<target>ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> +<source>Error setting privilege:</source> +<target>특권(프리빌리지) ì„¤ì • 중 ë°œìƒí•œ 오류 :</target> +<source>Error moving to Recycle Bin:</source> +<target>휴지통으로 ì´ë™ 중 ë°œìƒí•œ 오류 :</target> +<source>Could not load a required DLL:</source> +<target>필요한 DLLì„ ë¡œë“œí• ìˆ˜ 없습니다 :</target> +<source>Error writing to synchronization database:</source> +<target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ì— ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Volume Shadow Copy Service 시작 중 오류 ë°œìƒ!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>WOW64 ì—ì„œì˜ Shadow Copy 는 지ì›í•˜ì§€ 않습니다. FreeFileSync 64-bit ë²„ì „ì„ ì‚¬ìš©í•˜ì„¸ìš”.</target> +<source>Could not determine volume name for file:</source> +<target>íŒŒì¼ ë³¼ë¥¨ ì´ë¦„ì„ ê²°ì •í• ìˆ˜ 없습니다 :</target> +<source>Volume name %x not part of filename %y!</source> +<target>볼륨 ì´ë¦„ %x ì´(ê°€) íŒŒì¼ ì´ë¦„ %y ì˜ ì¼ë¶€ê°€ 아닙니다!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>ë‹¤ìŒ XML 노드 ê°’ì„ ì½ì–´ ë“¤ì¼ ìˆ˜ 없습니다 :</target> +<source>Show popup</source> +<target>íŒì—… 표시</target> +<source>Show popup on errors or warnings</source> +<target>오류/ê²½ê³ ê´€ë ¨ íŒì—… 표시</target> +<source>Ignore errors</source> +<target>오류 무시</target> +<source>Hide all error and warning messages</source> +<target>ëª¨ë“ ì˜¤ë¥˜/ê²½ê³ ë©”ì„¸ì§€ 숨기기</target> +<source>Exit instantly</source> +<target>즉시 종료</target> +<source>Abort synchronization immediately</source> +<target>ë™ê¸°í™” ìž‘ì—… 즉시 중단</target> +<source>Logging</source> +<target>로그 중</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync ì¼ê´„íŒŒì¼ [Batch File]</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync 구성 ì„¤ì •</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync ì¼ê´„ìž‘ì—… [Batch Job]</target> +<source>Unable to create logfile!</source> +<target>ë¡œê·¸íŒŒì¼ ìƒì„±ì„ í• ìˆ˜ 없습니다!</target> +<source>Batch execution</source> +<target>ì¼ê´„ìž‘ì—… 실행</target> +<source>Log-messages:</source> +<target>로그 메세지 :</target> +<source>Stop</source> +<target>ì •ì§€</target> +<source>Total time:</source> +<target>ì „ì²´ 시간 :</target> +<source>Synchronization aborted!</source> +<target>ë™ê¸°í™” 중단!</target> +<source>Synchronization completed with errors!</source> +<target>ë™ê¸°í™”ê°€ 완료ë˜ê¸´ 했으나, 오류가 있습니다!</target> +<source>Synchronization completed successfully!</source> +<target>ë™ê¸°í™”ê°€ 성공ì 으로 완료 ë습니다!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>FreeFileSync GUI 모드는 "ì „í™˜" ì„ ëˆ„ë¥´ë©´ 열립니다.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>FreeFileSync GUI 모드로 ì „í™˜ 중...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Sourceforge.netì— ì ‘ì†í• 수 없습니다!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>새로운 ë²„ì „ì˜ FreeFileSyncê°€ 나왔습니다.</target> +<source>Download now?</source> +<target>지금 다운로드 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<source>Information</source> +<target>ì¸í¬ë©”ì´ì…˜ (ì •ë³´)</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync 는 현재 ìµœì‹ ë²„ì „ ìƒíƒœìž…니다!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>FreeFileSyncê°€ 매주 ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë¥¼ 확ì¸í•˜ë„ë¡ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<source>(Requires an Internet connection!)</source> +<target>(ì¸í„°ë„· ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤!)</target> +<source>1. &Compare</source> +<target>1. 비êµ</target> +<source>2. &Synchronize...</source> +<target>2. ë™ê¸°í™”</target> +<source>S&witch view</source> +<target>보기 ì „í™˜</target> +<source>&New</source> +<target>ì‹ ê·œ ìž‘ì—…</target> +<source>&Program</source> +<target>프로그램(&P)</target> +<source>&Language</source> +<target>언어 ì„ íƒ(&L)</target> +<source>&Global settings...</source> +<target>ì „ì²´ ì„¤ì •(&G)</target> +<source>&Create batch job...</source> +<target>ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±(&C)</target> +<source>&Export file list...</source> +<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기(&E)</target> +<source>&Advanced</source> +<target>ê³ ê¸‰ê¸°ëŠ¥(&A)</target> +<source>&Check for new version</source> +<target>ë²„ì „ ì—…ë°ì´íŠ¸ 확ì¸(&C)</target> +<source>Compare</source> +<target>비 êµ</target> +<source>Compare both sides</source> +<target>양측 비êµ</target> +<source>&Abort</source> +<target>ìž‘ì—… 중지(&A)</target> +<source>Synchronize...</source> +<target>ë™ ê¸° í™”</target> +<source>Start synchronization</source> +<target>ë™ê¸°í™” 시작</target> +<source>Swap sides</source> +<target>양측 위치 바꾸기</target> +<source>Add folder pair</source> +<target>í´ë” 페어(ì§) 추가</target> +<source>Remove folder pair</source> +<target>í´ë” 페어(ì§) ì œê±°</target> +<source>Save current configuration to file</source> +<target>현재 ì„¤ì •ì„ íŒŒì¼ë¡œ ì €ìž¥</target> +<source>Load configuration from file</source> +<target>외부 파ì¼ë¡œë¶€í„° ì„¤ì • 로드</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>마지막으로 사용한 ì„¤ì • (DEL 키를 누르면 리스트ì—ì„œ ì‚ì œ)</target> +<source>Hide excluded items</source> +<target>ì œì™¸ ì•„ì´í…œ 숨기기</target> +<source>Hide filtered or temporarily excluded files</source> +<target>í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Number of files and directories that will be created</source> +<target>ìƒì„±ë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target> +<source>Number of files that will be overwritten</source> +<target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target> +<source>Number of files and directories that will be deleted</source> +<target>ì‚ì œë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target> +<source>Total amount of data that will be transferred</source> +<target>ì „ì†¡í•˜ê²Œ ë ì „ì²´ ë°ì´í„° 용량</target> +<source>Left</source> +<target>좌측</target> +<source>Right</source> +<target>우측</target> +<source>Batch job</source> +<target>ì¼ê´„ ìž‘ì—…</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>ìžë™ ë™ê¸°í™” ì¼ê´„ìž‘ì—…ì„ ìœ„í•´ Batch Fileì„ ìƒì„±í•©ë‹ˆë‹¤. ì¼ê´„ 모드를 시작하기 ìœ„í•´ì„ , 실행 가능한 FreeFileSync í˜•ì‹ : FreeFileSync.exe <batchfile>ë¡œ íŒŒì¼ ì´ë¦„ì„ ì§€ì •í•´ 주기만 하면 ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ O/S(ìš´ì˜ì²´ì œ)ì˜ ìž‘ì—…ê´€ë¦¬ìžì—ì„œë„ ì‹¤í–‰ 가능합니다.</target> +<source>Help</source> +<target>ë„움ë§</target> +<source>Configuration overview:</source> +<target>êµ¬ì„±ì„¤ì • 개요 :</target> +<source>Filter files</source> +<target>íŒŒì¼ í•„í„°</target> +<source>Status feedback</source> +<target>ìƒíƒœ 피드백</target> +<source>Silent mode</source> +<target>사ì¼ëŸ°íŠ¸ 모드</target> +<source>Start minimized and write status information to a logfile</source> +<target>최소화 ìƒíƒœë¡œ ì‹œìž‘í•˜ê³ , 로그파ì¼ì— ìƒíƒœ ì •ë³´ë¥¼ 기ë¡</target> +<source>Error handling</source> +<target>오류 ë°œìƒì‹œ :</target> +<source>Overview</source> +<target>개요</target> +<source>Select logfile directory:</source> +<target>ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ :</target> +<source>Maximum number of logfiles:</source> +<target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target> +<source>&Save</source> +<target>ì €ìž¥(&S)</target> +<source>&Load</source> +<target>로드(&L)</target> +<source>&Cancel</source> +<target>취소(&C)</target> +<source>Elements found:</source> +<target>ë°œê²¬ëœ ìš”ì†Œ :</target> +<source>Elements remaining:</source> +<target>ë‚¨ì€ ìš”ì†Œ :</target> +<source>Speed:</source> +<target>ì†ë„ :</target> +<source>Time remaining:</source> +<target>ë‚¨ì€ ì‹œê°„ :</target> +<source>Time elapsed:</source> +<target>경과 시간 :</target> +<source>Operation:</source> +<target>ìž‘ì—… :</target> +<source>Select variant:</source> +<target>옵션 ì„ íƒ :</target> +<source><Automatic></source> +<target><ìžë™></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하여, 양측 변경사í•ì„ 확ì¸í•©ë‹ˆë‹¤. ì‚ì œ ë° ì¶©ëŒ ë‚´ì—ì€ ìžë™ ê°ì§€ë©ë‹ˆë‹¤.</target> +<source>Mirror ->></source> +<target>미러 ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>좌측 í´ë” 백업 미러. ë™ê¸°í™” ì´í›„ 우측 í´ë”는 좌측 í´ë”와 ì™„ì „ížˆ ë˜‘ê°™ì´ ë§¤ì¹˜ ë˜ë„ë¡ ë³€ê²½ ë©ë‹ˆë‹¤.</target> +<source>Update -></source> +<target>ì—…ë°ì´íŠ¸ -></target> +<source>Copy new or updated files to right folder.</source> +<target>ì‹ ê·œ ë˜ëŠ” ê°±ì‹ íŒŒì¼ì„ 우측 í´ë”ë¡œ 복사</target> +<source>Custom</source> +<target>ê°œì¸ ì„¤ì •</target> +<source>Configure your own synchronization rules.</source> +<target>ê°œì¸ ë™ê¸°í™” 규칙 ì„¤ì •</target> +<source>Deletion handling</source> +<target>ì‚ì œ 처리 옵션</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>구성 ì„¤ì •</target> +<source>Category</source> +<target>ì¹´í…Œê³ ë¦¬</target> +<source>Action</source> +<target>실행</target> +<source>Files/folders that exist on left side only</source> +<target>좌측ì—만 존재하는 파ì¼/í´ë”</target> +<source>Files/folders that exist on right side only</source> +<target>우측ì—만 존재하는 파ì¼/í´ë”</target> +<source>Files that exist on both sides, left one is newer</source> +<target>파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.</target> +<source>Files that exist on both sides, right one is newer</source> +<target>파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.</target> +<source>Files that have different content</source> +<target>ë‚´ìš©ì´ ë‹¤ë¥¸ 파ì¼</target> +<source>Conflicts/files that cannot be categorized</source> +<target>ë¶„ë¥˜í• ìˆ˜ 없는 충ëŒ/파ì¼</target> +<source>Compare by...</source> +<target>ëŒ€ìƒ ë³„ 비êµ...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +양쪽 파ì¼ì˜ í¬ê¸°ì™€ +최종작성 시간 ë° ë‚ ì§œê°€ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주함. +</target> +<source>File size and date</source> +<target>íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +양쪽 파ì¼ì˜ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주함. +</target> +<source>File content</source> +<target>íŒŒì¼ ë‚´ìš©</target> +<source>Symbolic Link handling</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ 처리</target> +<source>Synchronizing...</source> +<target>ë™ê¸°í™” ìž‘ì—… 중...</target> +<source>Elements processed:</source> +<target>ì²˜ë¦¬ëœ ìš”ì†Œ :</target> +<source>&Pause</source> +<target>ì¼ì‹œì •ì§€(&P)</target> +<source>Compare by "File size and date"</source> +<target>"íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ" 별 비êµ</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>ì´ ì˜µì…˜ì€ ë™ì¼í•œ ì´ë¦„ì˜ 2ê°œ 파ì¼ì´ ê°™ì€ í¬ê¸° ë° ê°™ì€ ìµœì¢…ìž‘ì„± ë‚ ì§œì™€ ì‹œê°„ì„ ê°–ì„ ê²½ìš°, ì´ë“¤ 2ê°œ 파ì¼ì„ í‰ê°€í•©ë‹ˆë‹¤.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>ì´ ì˜µì…˜ìœ¼ë¡œ 비êµí• 경우, 다ìŒê³¼ ê°™ì€ ì˜ì‚¬ê²°ì • 트리 ì„¤ì •ìœ¼ë¡œ 처리ë©ë‹ˆë‹¤ :</target> +<source>As a result the files are separated into the following categories:</source> +<target>파ì¼ì€ 다ìŒê³¼ ê°™ì€ ì¹´í…Œê³ ë¦¬ë¡œ 분류ë©ë‹ˆë‹¤ :</target> +<source>- equal</source> +<target>- ê°™ìŒ</target> +<source>- left newer</source> +<target>- ì¢Œì¸¡ì´ ë” ìµœì‹ </target> +<source>- right newer</source> +<target>- ìš°ì¸¡ì´ ë” ìµœì‹ </target> +<source>- exists left only</source> +<target>- 좌측ì—만 존재함</target> +<source>- exists right only</source> +<target>- 우측ì—만 존재함</target> +<source>- conflict</source> +<target>- 충ëŒ/불ì¼ì¹˜</target> +<source>Compare by "File content"</source> +<target>"íŒŒì¼ ë‚´ìš©" 별 비êµ</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +ì´ ì˜µì…˜ì—서는 2ê°œ 파ì¼ì´ ê°™ì€ ì´ë¦„ì„ ê°–ëŠ” 경우, ë‚´ìš©ë„ ì •í™•ížˆ ë™ì¼í• ì‹œì—만 ê°™ì€ íŒŒì¼ë¡œ 간주합니다. 백업 작업보다는 파ì¼ë“¤ì˜ ì¼ê´€ì„± ì²´í¬ì— ë” ìœ ìš©í•œ 옵션으로ì¨, íŒŒì¼ ë‚ ì§œ ë° ì‹œê°„ì€ ì „í˜€ ê³ ë ¤ë˜ì§€ 않습니다. + +ë˜í•œ í™œì„±í™”ëœ ì˜ì‚¬ê²°ì • íŠ¸ë¦¬ë„ ë‹¤ìŒê³¼ ê°™ì´ ì¢€ ë” ìž‘ì•„ì§‘ë‹ˆë‹¤ : +</target> +<source>- different</source> +<target>- 다름</target> +<source>Source code written in C++ utilizing:</source> +<target>소스코드는 C++ 언어로 아래 íˆ´ì„ ì‚¬ìš©í•˜ì—¬ 작성ë˜ì—ˆìŠµë‹ˆë‹¤ :</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>FreeFileSync í˜„ì§€í™”ì— ë„ì›€ì„ ì£¼ì‹ ë¶„ë“¤ê»˜ ê¹Šì€ ê°ì‚¬ 드립니다 :</target> +<source>Feedback and suggestions are welcome at:</source> +<target>피드백 ë° ì œì•ˆì‚¬í•ì€ 아래로 ë³´ë‚´ 주ì‹ì‹œì˜¤ :</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync at Sourceforge [오픈소스 보기]</target> +<source>Homepage</source> +<target>홈페ì´ì§€</target> +<source>If you like FFS</source> +<target>기부하기^^</target> +<source>Donate with PayPal</source> +<target>PayPalë¡œ 기부하기</target> +<source>Email</source> +<target>ì´ë©”ì¼</target> +<source>Report translation error</source> +<target>ë²ˆì— ê´€ë ¨ 오류 ë³´ê³ </target> +<source>Published under the GNU General Public License:</source> +<target>GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시 :</target> +<source>Ignore subsequent errors</source> +<target>ì´í›„ 오류 무시</target> +<source>Hide further error messages during the current process</source> +<target>현재 ì²˜ë¦¬ê³¼ì • ë™ì•ˆ 추가오류 메세지 숨기기</target> +<source>&Ignore</source> +<target>무시(&I)</target> +<source>&Retry</source> +<target>다시 ì‹œë„(&R)</target> +<source>Do not show this dialog again</source> +<target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target> +<source>&Switch</source> +<target>ì „í™˜[Switch](&S)</target> +<source>&Yes</source> +<target>예(&Y)</target> +<source>&No</source> +<target>아니오(&N)</target> +<source>Delete on both sides</source> +<target>양측 ëª¨ë‘ ì‚ì œ</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>ì–´ëŠ í•œìª½ì˜ íŒŒì¼ë§Œ ì„ íƒí•˜ë”ë¼ë„ 양측 ëª¨ë‘ ì‚ì œ</target> +<source>Use Recycle Bin</source> +<target>휴지통 사용</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +ëª¨ë“ í•„í„° ì„¤ì •ê³¼ ì¼ì¹˜í•˜ëŠ” 파ì¼/ë””ë ‰í† ë¦¬ ë§Œì„ ë™ê¸°í™” 대ìƒìœ¼ë¡œ ì„ íƒí•©ë‹ˆë‹¤. +ì°¸ê³ : ë©”ì¸ ë™ê¸°í™” ë””ë ‰í† ë¦¬ì™€ 대비하여 í•„í„° ì´ë¦„ì„ ì§€ì •í•´ì•¼ 합니다. +</target> +<source>Hints:</source> +<target>힌트 :</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. ê´€ë ¨ 파ì¼ì´ë‚˜ ë””ë ‰í† ë¦¬ ì´ë¦„ì„ ';'ë¡œ 구분하거나, ì¤„ì„ ë°”ê¿” ìž…ë ¥í•˜ì„¸ìš”.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. 와ì¼ë“œì¹´ë“œ ë¬¸ìž '*' ë° '?' ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. 컨í…스트 메뉴ì—ì„œ ì§ì ‘ 파ì¼ì„ ì œì™¸í•©ë‹ˆë‹¤.</target> +<source>Example</source> +<target>보기/예</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +í¬í•¨ : *.doc;*.zip;*.exe +ì œì™¸ : \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>서브í´ë” "temp" ì— ìžˆëŠ” 파ì¼ë“¤ì€ ì œì™¸í•˜ê³ , ì´ì™¸ ëª¨ë“ .doc, .zip, .exe í™•ìž¥ìž íŒŒì¼ ë™ê¸°í™”</target> +<source>Include</source> +<target>í¬í•¨</target> +<source>Exclude</source> +<target>ì œì™¸</target> +<source>Select time span:</source> +<target>기간 ì„ íƒ :</target> +<source>Minimum file size:</source> +<target>최소 파ì¼í¬ê¸° :</target> +<source>Maximum file size:</source> +<target>최대 파ì¼í¬ê¸° :</target> +<source>&Default</source> +<target>기본 ì„¤ì •/ê°’(&D)</target> +<source>Move column up</source> +<target>ì—´(컬럼) 위로 ì´ë™</target> +<source>Move column down</source> +<target>ì—´(컬럼) 아래로 ì´ë™</target> +<source>Copy locked files</source> +<target>ë½ ê±¸ë¦° íŒŒì¼ ë³µì‚¬</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Volume Shadow Copy를 사용하여 ê³µìœ ë˜ëŠ” ë½ ê±¸ë¦° 파ì¼ì„ 복사 +(ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”) +</target> +<source>Copy filesystem permissions</source> +<target>íŒŒì¼ ì‹œìŠ¤í…œ 권한 복사</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 ì „ì†¡ +(ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨) +</target> +<source>Hidden dialogs:</source> +<target>다ì´ì–¼ë¡œê·¸ 숨기기</target> +<source>Reset</source> +<target>리셋</target> +<source>Show hidden dialogs</source> +<target>숨긴 다ì´ì–¼ë¡œê·¸ 표시</target> +<source>External applications</source> +<target>외부 ì• í”Œë¦¬ì¼€ì´ì…˜</target> +<source>Description</source> +<target>설명</target> +<source>Variant</source> +<target>옵션(변수)</target> +<source>Statistics</source> +<target>통계</target> +<source>Find what:</source> +<target>검색어 :</target> +<source>Match case</source> +<target>대문ìž/ì†Œë¬¸ìž êµ¬ë¶„</target> +<source>&Find next</source> +<target>ë‹¤ìŒ ê²€ìƒ‰(&F)</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>잔여 ì•„ì´í…œì— 대한 ë™ê¸°í™”를 (다시 비êµí• 필요없ì´) 재시ë„í• ìˆ˜ 있습니다!</target> +<source>Batch file created successfully!</source> +<target>ì¼ê´„작업파ì¼[Batch File]ì´ ì„±ê³µì 으로 ìƒì„± ë습니다!</target> +<source>Main bar</source> +<target>ë©”ì¸ ë°”</target> +<source>Folder pairs</source> +<target>í´ë” 페어(ì§)</target> +<source>Select view</source> +<target>보기 ì„ íƒ</target> +<source>Folder Comparison and Synchronization</source> +<target>í´ë” ë¹„êµ ë° ë™ê¸°í™”</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>본 시스템ì—서는 íœ´ì§€í†µì„ ì•„ì§ ì§€ì›í•˜ì§€ 않습니다.</target> +<source>Set direction:</source> +<target>ë°©í–¥ ì„¤ì • :</target> +<source>Exclude temporarily</source> +<target>ìž„ì‹œ ì œì™¸</target> +<source>Include temporarily</source> +<target>ìž„ì‹œ í¬í•¨</target> +<source>Exclude via filter:</source> +<target>필터를 통하여 ì œì™¸</target> +<source><multiple selection></source> +<target><복수 ì„ íƒ></target> +<source>D-Click</source> +<target>D-í´ë¦</target> +<source>Copy to clipboard CTRL+C</source> +<target>í´ë¦½ë³´ë“œì— 복사 CTRL+C</target> +<source>Delete files DEL</source> +<target>íŒŒì¼ ì‚ì œ DEL</target> +<source>Customize...</source> +<target>ê°œì¸ ì„¤ì •í™”...</target> +<source>Auto-adjust columns</source> +<target>ì—´ ìžë™ì •ë ¬</target> +<source>Include all rows</source> +<target>ëª¨ë“ í–‰(로우) í¬í•¨</target> +<source>Exclude all rows</source> +<target>ì „ì²´ í–‰(로우) ì œì™¸</target> +<source>Reset view</source> +<target>보기 리셋</target> +<source>Show "%x"</source> +<target>"%x" 표시</target> +<source><Last session></source> +<target><마지막 세션></target> +<source>Configuration saved!</source> +<target>ì„¤ì • ì €ìž¥ 완료!</target> +<source>Save changes to current configuration?</source> +<target>현재 ì„¤ì •ì˜ ë³€ê²½ ë‚´ìš©ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<source>Configuration loaded!</source> +<target>ì„¤ì • 로드 완료!</target> +<source>Hide files that exist on left side only</source> +<target>좌측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that exist on left side only</source> +<target>좌측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that exist on right side only</source> +<target>우측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that exist on right side only</source> +<target>우측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that are newer on left</source> +<target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that are newer on left</source> +<target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that are newer on right</source> +<target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that are newer on right</source> +<target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that are equal</source> +<target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that are equal</source> +<target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that are different</source> +<target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that are different</source> +<target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ í‘œì‹œ</target> +<source>Hide conflicts</source> +<target>ì¶©ëŒ ë‚´ìš© 숨기기</target> +<source>Show conflicts</source> +<target>ì¶©ëŒ í‘œì‹œ</target> +<source>Hide files that will be created on the left side</source> +<target>ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be created on the left side</source> +<target>ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that will be created on the right side</source> +<target>ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be created on the right side</source> +<target>ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that will be deleted on the left side</source> +<target>좌측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be deleted on the left side</source> +<target>좌측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that will be deleted on the right side</source> +<target>우측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be deleted on the right side</source> +<target>우측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that will be overwritten on left side</source> +<target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be overwritten on left side</source> +<target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that will be overwritten on right side</source> +<target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that will be overwritten on right side</source> +<target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target> +<source>Hide files that won't be copied</source> +<target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show files that won't be copied</source> +<target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ</target> +<source>All directories in sync!</source> +<target>ëª¨ë“ ë””ë ‰í† ë¦¬ ë™ê¸°í™”!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>ë™ê¸°í™” ìž‘ì—… ì´ì „ì— ë¹„êµë¥¼ ë¨¼ì € 실행해 주ì‹ì‹œì˜¤!</target> +<source>Comma separated list</source> +<target>콤마 분리 목ë¡</target> +<source>Legend</source> +<target>범례</target> +<source>File list exported!</source> +<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기 완료!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%xê°œ 대ìƒì´ 성공ì 으로 ì‚ì œ ë습니다!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%xê°œ ë””ë ‰í† ë¦¬</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%xê°œ 파ì¼</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>ë³´ê¸°ì— ë‚˜íƒ€ë‚œ %yê°œ í–‰ì˜ %xê°œ 대ìƒ</pluralform> +</target> +<source>Scanning...</source> +<target>스캔 중...</target> +<source>Comparing content...</source> +<target>ë‚´ìš© ë¹„êµ ì¤‘...</target> +<source>Paused</source> +<target>ì¼ì‹œì •ì§€ 중</target> +<source>Aborted</source> +<target>중지ë¨</target> +<source>Completed</source> +<target>완료</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>사용ìžì— ì˜í•œ ìž‘ì—… 중지 : 현재 ìž‘ì—… 종료 대기 중...</target> +<source>Continue</source> +<target>계ì†</target> +<source>Pause</source> +<target>ì¼ì‹œì •ì§€</target> +<source>Cannot find %x</source> +<target>%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target> +<source>DECISION TREE</source> +<target>[ì˜ì‚¬ê²°ì • 트리]</target> +<source>file exists on both sides</source> +<target>양측 모ë‘ì— íŒŒì¼ì´ 존재</target> +<source>on one side only</source> +<target>한쪽ì—만 존재</target> +<source>- left</source> +<target>- 좌측</target> +<source>- right</source> +<target>- 우측</target> +<source>different</source> +<target>다름</target> +<source>- conflict (same date, different size)</source> +<target>- 충ëŒ/불ì¼ì¹˜ (ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다름)</target> +<source>Inactive</source> +<target>비활성화</target> +<source>Second</source> +<target>ì´ˆ</target> +<source>Minute</source> +<target>분</target> +<source>Hour</source> +<target>시간</target> +<source>Day</source> +<target>ì¼</target> +<source>Byte</source> +<target>ë°”ì´íŠ¸</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>í•„í„° : ëª¨ë“ íŽ˜ì–´(ì§)</target> +<source>Filter: Single pair</source> +<target>í•„í„° : ë‹¨ì¼ íŽ˜ì–´(ì§)</target> +<source>Ignore</source> +<target>무시</target> +<source>Direct</source> +<target>다ì´ë ‰íŠ¸</target> +<source>Follow</source> +<target>팔로우</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>외부 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ Context Menuì— í†µí•©. ë‹¤ìŒ ë§¤í¬ë¡œê°€ 사용 가능합니다 :</target> +<source>- full file or directory name</source> +<target>- ì „ì²´ íŒŒì¼ ë˜ëŠ” ë””ë ‰í† ë¦¬ ì´ë¦„</target> +<source>- directory part only</source> +<target>- ë””ë ‰í† ë¦¬ 부분만</target> +<source>- Other side's counterpart to %name</source> +<target>- %name ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target> +<source>- Other side's counterpart to %dir</source> +<target>- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target> +<source>Restore all hidden dialogs?</source> +<target>ëª¨ë“ ìˆ¨ê¸´ 다ì´ì–¼ë¡œê·¸ë¥¼ ë³µì› í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ 휴지통으로 ì´ë™í•˜ì‹œê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ ì‚ì œí•˜ì‹œê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기</target> +<source>Delete permanently</source> +<target>ì˜êµ¬ ì‚ì œ</target> +<source>Delete or overwrite files permanently</source> +<target>íŒŒì¼ ì˜êµ¬ ì‚ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>파ì¼ì„ ì‚ì œí•˜ê±°ë‚˜ ë®ì–´ì“°ê¸° í• ë•Œ, 휴지통 사용</target> +<source>Versioning</source> +<target>ë²„ì €ë‹</target> +<source>Move files into a time-stamped subdirectory</source> +<target>파ì¼ì„ 타임 스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™</target> +<source>Cannot determine sync-direction:</source> +<target>ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í• ìˆ˜ 없습니다 :</target> +<source>Filter settings have changed!</source> +<target>í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다!</target> +<source>Both sides have changed since last synchronization!</source> +<target>마지막 ë™ê¸°í™” ìž‘ì—… ì´í›„, 양측 ëª¨ë‘ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤!</target> +<source>No change since last synchronization!</source> +<target>마지막 ë™ê¸°í™” ì´í›„ ë³€ê²½ì‚¬í• ì—†ìŒ!</target> +<source>The file was not processed by last synchronization!</source> +<target>ì´ íŒŒì¼ì€ 마지막 ë™ê¸°í™”ì—ì„œ 처리ë˜ì§€ 않았습니다!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>ë””ë ‰í† ë¦¬ë¥¼ ì‚ì œí•˜ë©´ ì„œë¸Œë””ë ‰í† ë¦¬ ë° íŒŒì¼ê³¼ 충ëŒí•˜ê²Œ ë©ë‹ˆë‹¤!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>기본값 ë™ê¸°í™” ë°©í–¥ ì„¤ì • : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ì“°ì—¬ 집니다.</target> +<source>The file does not contain a valid configuration:</source> +<target>ì´ íŒŒì¼ì€ ìœ íš¨í•œ ì„¤ì • ê°’ì„ ê°–ê³ ìžˆì§€ 않습니다 :</target> +<source>Scanning:</source> +<target>스캔 :</target> +<source>Encoding extended time information: %x</source> +<target>ì¸ì½”딩 확장 시간 ì •ë³´ : %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>ë””ë ‰í† ë¦¬ê°€ 비었다는 오류는 무시 가능합니다.</target> +<source>Directory does not exist:</source> +<target>ë””ë ‰í† ë¦¬ê°€ 존재하지 않습니다 :</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>ë””ë ‰í† ë¦¬ê°€ ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” ê·œì¹™ì„¤ì •ì‹œ, 주ì˜í•˜ì‹ì‹œì˜¤.</target> +<source>Comparing content of files %x</source> +<target>íŒŒì¼ %x ë‚´ìš© 별 ë¹„êµ ì¤‘</target> +<source>Memory allocation failed!</source> +<target>메모리 í• ë‹¹ 실패!</target> +<source>File %x has an invalid date!</source> +<target>íŒŒì¼ %x ì˜ ë‚ ì§œê°€ ìœ íš¨í•˜ì§€ 않습니다!</target> +<source>Conflict detected:</source> +<target>íƒì§€ëœ 충ëŒ/불ì¼ì¹˜ :</target> +<source>Files %x have the same date but a different size!</source> +<target>íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>심ë§í¬ %x ì˜ ë‚ ì§œëŠ” 같으나, 대ìƒì´ 다릅니다!</target> +<source>Comparing files by content failed.</source> +<target>ë‚´ìš© 별 íŒŒì¼ ë¹„êµ ì‹¤íŒ¨</target> +<source>Generating file list...</source> +<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ ìƒì„± 중...</target> +<source>Multiple...</source> +<target>다중처리 (멀티플) ìž‘ì—…...</target> +<source>Files that are equal on both sides</source> +<target>양측 ëª¨ë‘ ë™ì¼í•œ 파ì¼</target> +<source>Equal files/folders that differ in attributes only</source> +<target>ì†ì„±ë§Œ 다른 ë™ì¼ 파ì¼/í´ë”</target> +<source>Copy from right to left</source> +<target>우측ì—ì„œ 좌측으로 복사</target> +<source>Copy from left to right</source> +<target>좌측ì—ì„œ 우측으로 복사</target> +<source>Delete files/folders existing on left side only</source> +<target>좌측ì—만 존재하는 파ì¼/í´ë” ì‚ì œ</target> +<source>Delete files/folders existing on right side only</source> +<target>우측ì—만 존재하는 파ì¼/í´ë” ì‚ì œ</target> +<source>Copy from right to left overwriting</source> +<target>우측ì—ì„œ 좌측으로 ë®ì–´ì“°ê¸° 복사</target> +<source>Copy from left to right overwriting</source> +<target>좌측ì—ì„œ 우측으로 ë®ì–´ì“°ê¸° 복사</target> +<source>Do nothing</source> +<target>아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ</target> +<source>Copy attributes only from right to left</source> +<target>ì†ì„±ë§Œ 우측ì—ì„œ 좌측으로 복사</target> +<source>Copy attributes only from left to right</source> +<target>ì†ì„±ë§Œ 좌측ì—ì„œ 우측으로 복사</target> +<source>Deleting file %x</source> +<target>íŒŒì¼ %x ì‚ì œ 중</target> +<source>Deleting Symbolic Link %x</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì‚ì œ 중</target> +<source>Deleting folder %x</source> +<target>í´ë” %x ì‚ì œ 중</target> +<source>Moving %x to Recycle Bin</source> +<target>%x ì„(를) 휴지통으로 ì´ë™ 중</target> +<source>Moving file %x to user-defined directory %y</source> +<target>íŒŒì¼ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>í´ë” %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> +<source>Copying new file %x to %y</source> +<target>ì‹ ê·œ íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사 중</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>ì‹ ê·œ ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) %y (으)ë¡œ 복사 중</target> +<source>Overwriting file %x in %y</source> +<target>íŒŒì¼ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target> +<source>Creating folder %x</source> +<target>í´ë” %x ìƒì„± 중</target> +<source>Verifying file %x</source> +<target>íŒŒì¼ %x 확ì¸</target> +<source>Updating attributes of %x</source> +<target>%x ì†ì„± ì—…ë°ì´íŠ¸</target> +<source>Source directory does not exist anymore:</source> +<target>소스 ë””ë ‰í† ë¦¬ê°€ ë” ì´ìƒ 존재하지 않습니다 :</target> +<source>Nothing to synchronize according to configuration!</source> +<target>구성 ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í• ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤!</target> +<source>Target directory name must not be empty!</source> +<target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ ì´ë¦„ì´ ë¹„ì–´ì„œëŠ” 안 ë©ë‹ˆë‹¤!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>ì‚ì œë¥¼ 위한 ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ê°€ ì •í•´ì§€ì§€ 않았습니다!</target> +<source>Unresolved conflicts existing!</source> +<target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒì´ 있습니다!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>충ëŒì„ ë¬´ì‹œí•˜ê³ ë™ê¸°í™”를 계ì†í• 수 있습니다.</target> +<source>Significant difference detected:</source> +<target>중대한 ì°¨ì´ê°€ ê°ì§€ ë습니다 :</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>ì´ íŒŒì¼ ê°œìˆ˜ì˜ 50% ì´ìƒì´ 복사ë˜ê±°ë‚˜ ì‚ì œ ë©ë‹ˆë‹¤!</target> +<source>Not enough free disk space available in:</source> +<target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤ :</target> +<source>Free disk space required:</source> +<target>필요한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ :</target> +<source>Free disk space available:</source> +<target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ :</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>다중í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ ë””ë ‰í† ë¦¬ê°€ 변경ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•´ 주세요.</target> +<source>Processing folder pair:</source> +<target>í´ë” 페어 처리 중 :</target> +<source>Generating database...</source> +<target>ë°ì´í„°ë² ì´ìŠ¤ ìƒì„± 중...</target> +<source>Error copying locked file %x!</source> +<target>복사 실패! íŒŒì¼ %x ì— ë½ì´ ê±¸ë ¤ 있습니다.</target> +<source>Data verification error: Source and target file have different content!</source> +<target>ë°ì´í„° í™•ì¸ ì˜¤ë¥˜ : 소스 ë° íƒ€ê²Ÿ 파ì¼ì˜ ë‚´ìš©ì´ ë‹¤ë¦…ë‹ˆë‹¤!</target> diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 7ca5dfc1..f4c059a6 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -1,910 +1,1058 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y usuniÄ™tych obiektów -%x Bytes -%x Bajtów -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dni -%x directories -%x katalogi -%x files -%x pliki -%x hour(s) -%x godzin -%x kB -%x kB -%x min -%x minut -%x of %y rows in view -%x z %y wierszy w widoku -%x of 1 row in view -%x z 1 wiersza w widoku -%x sec -%x sekund -%x% -%x% -&Abort -&Przerwij -&About... -&O Programie... -&Advanced -&Zaawansowane -&Cancel -&Anuluj -&Check for new version -&Aktualizuj -&Content -&Zawartość -&Create batch job... -&Twórz plik wsadowy... -&Default -&DomyÅ›lne -&Exit -&WyjÅ›cie -&Export file list... -&Eksportuj listÄ™ plików... -&File -&Plik -&Find next -&Znajdź nastÄ™pny -&Global settings... -&Ustawienia programu... -&Help -&Pomoc -&Ignore -&Ignoruj -&Language -&JÄ™zyk -&Load -&Wczytaj -&Load configuration... -&Wczytaj konfiguracjÄ™... -&New -&Nowy -&No -&Nie -&OK -&OK -&Pause -&Pauza -&Program -&Program -&Quit -&Zamknij -&Restore -&Przywróć -&Retry -&Powtórz -&Save -&Zapisz -&Switch -&ZamieÅ„ -&Yes -&Tak -(Build: %x) -(BudujÄ™: %x) -(Requires an Internet connection!) -(Wymaga poÅ‚Ä…czenia z Internetem!) -- Other side's counterpart to %dir -- Odpowiednik %dir -- Other side's counterpart to %name -- Odpowiednik %name -- conflict -- konflikt -- conflict (same date, different size) -- konflikt (ta sama data, różny rozmiar) -- different -- różny -- directory part only -- tylko część katalogu -- equal -- równy -- exists left only -- istnieje tylko po lewej stronie -- exists right only -- istnieje tylko po prawej stronie -- full file or directory name -- peÅ‚na nazwa pliku lub katalogu -- left -- lewy -- left newer -- lewy jest nowszy -- right -- prawy -- right newer -- prawy jest nowszy -/sec -/sekundÄ™ -1 directory -1 katalog -1 file -1 plik -1. &Compare -1. &Porównaj -1. Enter relative file or directory names separated by ';' or a new line. -1. Wprowdź relatywne scieżki do plików lub katalogów oddzielone ';' lub nowÄ… liniÄ…. -1. Select directories to monitor. -1. Wprowadź katalogi do nadzorowania -2. &Synchronize... -2. &Synchronizuj... -2. Enter a command line. -2. Wprowadź komendÄ™. -2. Use wildcard characters '*' and '?'. -2. Użyj wieloznacznika (wildcard) '*' i '?'. -3. Exclude files directly on main grid via context menu. -3. Wyklucz pliki i foldery używajÄ…c prawego przycisku myszki. -3. Press 'Start'. -3. WciÅ›nij 'Start'. -<Automatic> -<Automatycznie> -<Directory> -<Katalog> -<Last session> -<Ostatnia sesja> -<Symlink> -<DowiÄ…zanie symboliczne> -<multiple selection> -<zaznaczone elementy> -A directory input field is empty. -Pole ze Å›cieżkÄ… katalogu jest puste. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Katalog zostanie zmodyfikowany w efekcie synchronizacji wielu par folderów! Zweryfikuj ustawienia synchronizacji! -A newer version of FreeFileSync is available: -DostÄ™pna jest nowa wersja FreeFileSync: -Abort requested: Waiting for current operation to finish... -Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania... -Abort synchronization immediately -Natychmiast zakoÅ„cz synchronizacjÄ™ -Aborted -Przerwana -About -O Programie -Action -Akcja -Add folder -Dodaj folder -Add folder pair -Dodaj foldery do porównania -All directories in sync! -Wszystkie katalogi zsynchronizowane! -An exception occurred! -WystÄ…piÅ‚ wyjÄ…tek! -As a result the files are separated into the following categories: -W rezultacie pliki zostaÅ‚y podzielone na nastÄ™pujÄ…ce kategorie: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Jak wskazuje nazwa, dwa pliki o tej samej nazwie sÄ… równe tylko i wyÅ‚Ä…cznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagÄ™. Ta opcja jest raczej użyteczna do sprawdzania spójnoÅ›ci plików niż zadaÅ„ kopii zapasowej.\n\nDrzewko decyzyjne dla tej opcji jest mniejsze: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Twórz plik wsadowy dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik klikajÄ…c dwa razy lub dodaj go do zadaÅ„ zaplanowanych Twojego systemu. Plik wsadowy może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe <plikwsadowy>. -At least one directory input field is empty. -Przynajmniej jedno pole jest puste. -Auto-adjust columns -Autodopasowanie kolumn -Batch execution -Uruchomienie pliku wsadowego -Batch file created successfully! -Plik wsadowy utworzony pomyÅ›lnie! -Batch job -Plik wsadowy -Big thanks for localizing FreeFileSync goes out to: -PodziÄ™kowania za tÅ‚umaczenie FreeFileSync: -Both sides have changed since last synchronization! -Obie strony ulegÅ‚y zmianie od ostatniej synchronizacji! -Browse -PrzeglÄ…daj -Browse directory -PrzeglÄ…daj katalog -Cannot determine sync-direction: -Nie można okreÅ›lić kierunku synchronizacji: -Cannot find %x -Nie można znaleźć %x -Category -Kategoria -Clear filter settings -Wyczyść ustawienia filtra -Comma separated list -Lista oddzielona przecinkami -Command line -Linia komend -Command line is empty! -Linia komend jest pusta! -Compare -Porównaj -Compare both sides -Porównaj foldery -Compare by \"File content\" -Porównaj przez \"Zawartość pliku\" -Compare by \"File size and date\" -Porównaj przez \"Rozmiar i data pliku\" -Compare by... -Porównaj przez... -Comparing content of files %x -Porównywanie zawartoÅ›ci plików %x -Comparing content... -Porównywanie zawartoÅ›ci... -Comparing files by content failed. -Porównywanie przez zawartość zakoÅ„czone niepowodzeniem. -Comparison Result -Rezultat porównywania -Comparison settings -Ustawienia porównywania -Completed -ZakoÅ„czono -Configuration -Konfiguracja -Configuration loaded! -Konfiguracja wczytana! -Configuration overview: -PrzeglÄ…d konfiguracji: -Configuration saved! -Konfiguracja zapisana! -Configure filter -Konfiguruj filtr -Configure your own synchronization rules. -Skonfiguruj swoje wÅ‚asne zasady synchronizacji. -Confirm -Potwierdź -Conflict detected: -Wykryto konflikt: -Conflicts/files that cannot be categorized -Konflikty/pliki, które nie mogÄ… być skategoryzowane -Continue -Kontynuuj -Conversion error: -BÅ‚Ä…d konwersji: -Copy attributes only from left to right -Kopiuj atrybuty tylko z lewej strony -Copy attributes only from right to left -Kopiuj atrybuty tylko z prawej strony -Copy filesystem permissions -Kopiuj uprawnienia plików -Copy from left to right -Kopiuj z lewej do prawej -Copy from left to right overwriting -Kopiuj z lewej do prawej nadpisujÄ…c -Copy from right to left -Kopiuj z prawej do lewej -Copy from right to left overwriting -Kopiuj z prawej do lewej nadpisujÄ…c -Copy locked files -Kopiuj zablokowane pliki -Copy new or updated files to right folder. -Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopiuj pliki udostÄ™pnione i zablokowane używajÄ…c usÅ‚ugi Volume Shadow Copy\n (Wymaga uprawnieÅ„ administratora) -Copy to clipboard\tCTRL+C -Kopiuj do pamiÄ™ci\tCTRL+C -Copying new Symbolic Link %x to %y -Kopiowanie nowego dowiÄ…zania symbolicznego %x -Copying new file %x to %y -Kopiowanie nowego pliku %x do %y -Could not determine volume name for file: -Nie można okreÅ›lić nazwy dysku dla pliku: -Could not initialize directory monitoring: -Nie można uruchomić monitora katalogów: -Could not load a required DLL: -Nie można zaÅ‚adować wymaganej biblioteki DLL: -Could not read values for the following XML nodes: -Nie można odczytać wartoÅ›ci dla danych gaÅ‚Ä™zi XML: -Create a batch job -Twórz plik wsadowy -Creating folder %x -Tworzenie folderu %x -Custom -WÅ‚asne -Customize columns -Dostosuj kolumny -Customize... -Dostosuj... -D-Click -Podw. klikniÄ™cie -DECISION TREE -DRZEWO DECYZYJNE -Data verification error: Source and target file have different content! -BÅ‚Ä…d weryfikacji danych: Plik źródÅ‚owy i docelowy różniÄ… siÄ™ zawartoÅ›ciÄ…! -Date -Data -Delete files/folders existing on left side only -UsuÅ„ pliki/foldery istniejÄ…ce tylko po lewej stronie -Delete files/folders existing on right side only -UsuÅ„ pliki/foldery istniejÄ…ce tylko po prawej stronie -Delete files\tDEL -UsuÅ„\tDEL -Delete on both sides -UsuÅ„ po obu stronach -Delete on both sides even if the file is selected on one side only -UsuÅ„ po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie -Delete or overwrite files permanently -UsuÅ„ lub nadpisz pliki na staÅ‚e -Delete permanently -UsuÅ„ na staÅ‚e -Deleting Symbolic Link %x -Usuwanie dowiÄ…zania symbolicznego %x -Deleting file %x -Usuwanie pliku %x -Deleting folder %x -Usuwanie folderu %x -Deletion handling -ObsÅ‚uga usuwania -Description -Opis -Direct -BezpoÅ›rednio -Directories are dependent! Be careful when setting up synchronization rules: -Katalogi sÄ… zależne! PamiÄ™taj o tym podczas ustawiania zasad synchronizacji: -Directories to watch -Katalogi do obserwacji -Directory -Katalog -Directory does not exist: -Katalog nie istnieje: -Do not show this dialog again -Nie pokazuj tego okna ponownie -Do nothing -Nic nie rób -Do you really want to delete the following object(s)? -Czy na pewno chcesz usunąć wybrane obiekty? -Do you really want to move the following object(s) to the Recycle Bin? -Czy na pewno chcesz przenieść wybrane pliki do kosza? -Do you want FreeFileSync to automatically check for updates every week? -Czy chcesz aby FreeFileSync sprawdzaÅ‚ uaktualnienia co tydzieÅ„? -Donate with PayPal -Wesprzyj z PayPal -Download now? -Pobrać teraz? -Drag && drop -Drag && Drop -Elements found: -Znalezione elementy: -Elements processed: -Przetworzeone elementy: -Elements remaining: -PozostaÅ‚e elementy: -Email -Poczta -Encoding extended time information: %x -Odkodowywanie rozszerzonych informacji o czasie: %x -Endless loop when traversing directory: -ZapÄ™tlenie podczas przeglÄ…dania katalogu: -Equal files/folders that differ in attributes only -Pliki/foldery różniÄ…ce siÄ™ tylko atrybutami -Error -BÅ‚Ä…d -Error changing modification time: -BÅ‚Ä…d zmiany godziny modyfikacji: -Error copying file permissions: -BÅ‚Ä…d podczas kopiowania uprawnieÅ„ pliku: -Error copying file: -BÅ‚Ä…d podczas kopiowania pliku: -Error copying locked file %x! -BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x! -Error copying symbolic link: -BÅ‚Ä…d podczas kopiowania dowiÄ…zania symbolicznego (symlink) -Error creating directory: -BÅ‚Ä…d podczas tworzenia katalogu: -Error deleting directory: -BÅ‚Ä…d podczas usuwania katalogu: -Error deleting file: -BÅ‚Ä…d podczas usuwania pliku: -Error handling -ObsÅ‚uga bÅ‚Ä™dów -Error loading library function: -BÅ‚Ä…d wczytywania funkcji: -Error moving directory: -BÅ‚Ä…d podczas przenoszenia katalogu: -Error moving file: -BÅ‚Ä…d podczas przenoszenia pliku: -Error moving to Recycle Bin: -BÅ‚Ä…d podczas przenoszenia do kosza: -Error opening file: -BÅ‚Ä…d odczytu pliku: -Error parsing configuration file: -BÅ‚Ä…d parsowania pliku konfiguracyjnego: -Error reading file attributes: -BÅ‚Ä…d odczytu atrybutów pliku: -Error reading file: -BÅ‚Ä…d odczytu pliku: -Error reading from synchronization database: -BÅ‚Ä…d odczytu z bazy danych synchronizacji: -Error reading security context: -BÅ‚Ä…d odczytu kontekstu bezpieczeÅ„stwa: -Error resolving symbolic link: -BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego: -Error setting directory lock: -BÅ‚Ä…d ustawiania blokady katalogu: -Error setting privilege: -BÅ‚Ä…d ustawiania uprawnieÅ„: -Error starting Volume Shadow Copy Service! -BÅ‚Ä…d podczas uruchamianiu usÅ‚ugi Shadow Copy! -Error traversing directory: -BÅ‚Ä…d podczas odczytywania katalogu: -Error when monitoring directories. -BÅ‚Ä…d podczas monitorowania katalogów. -Error writing file: -BÅ‚Ä…d zapisu pliku: -Error writing security context: -BÅ‚Ä…d zapisu kontekstu bezpieczeÅ„stwa: -Error writing to synchronization database: -BÅ‚Ä…d zapisu do bazy danych synchronizacji: -Example -PrzykÅ‚ad -Exclude -Wyklucz -Exclude all rows -Wyklucz wszystkie rzÄ™dy -Exclude temporarily -Wyklucz tymczasowo -Exclude via filter: -Dodaj filtr: -Exit instantly -Wyjdź natychmiastowo -Extension -Rozszerzenie -External applications -Aplikacje zewnÄ™trzne -Fatal Error -BÅ‚Ä…d krytyczny -Feedback and suggestions are welcome at: -Komentarze i sugestie mile widziane na: -File %x has an invalid date! -Plik %x ma nieprawidÅ‚owÄ… datÄ™! -File already exists. Overwrite? -Nadpisać istniejÄ…cy już plik? -File content -Zawartość pliku -File does not exist: -Plik nie istnieje: -File list exported! -Lista plików wyeksportowana! -File size and date -Rozmiar i data pliku -Filename -Nazwa pliku -Files %x have the same date but a different size! -Pliki %x majÄ… tÄ… samÄ… datÄ™ lecz różne rozmiary! -Files are found equal if\n - file content\nis the same -Pliki sÄ… jednakowe jeżeli\n - zawartość pliku\njest identyczna -Files are found equal if\n - filesize\n - last write time and date\nare the same -Pliki sÄ… jednakowe jeżeli\n - rozmiar pliku\n - czas i data modyfikacji\nsÄ… identyczne -Files that are equal on both sides -Pliki równe po obu stronach -Files that exist on both sides, left one is newer -Pliki, które istniejÄ… po obu stronach, lewa strona jest nowsza -Files that exist on both sides, right one is newer -Pliki, które istniejÄ… po obu stronach, prawa strona jest nowsza -Files that have different content -Pliki, które majÄ… różnÄ… zawartość -Files/folders that exist on left side only -Pliki/katalogi istniejÄ…ce tylko po lewej stronie -Files/folders that exist on right side only -Pliki/katalogi istniejÄ…ce tylko po prawej stronie -Filter files -Filtruj pliki -Filter is active -Filtr jest aktywny -Filter settings have changed! -Ustawienia filtra ulegÅ‚y zmianie! -Filter: All pairs -Filtr: Wszystkie pary -Filter: Single pair -Filtr: PojedyÅ„cza para -Find -Znajdź -Find what: -Co: -Folder Comparison and Synchronization -Porównywanie i Synchronizacja folderów -Folder pairs -Pary folderów -Follow -PodÄ…rzaj -Free disk space available: -Wolne miejsce: -Free disk space required: -Wymagane wolne miejsce: -FreeFileSync Batch Job -FreeFileSync plik wsadowy -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge -FreeFileSync batch file -FreeFileSync plik wsadowy -FreeFileSync configuration -Konfiguracja FreeFileSync -FreeFileSync is up to date! -FreeFileSync jest już uaktualniony! -Full path -PeÅ‚na scieżka -Generating database... -Generowanie bazy danych... -Generating file list... -Generowanie listy plików... -Global settings -Ustawienia programu -Help -Pomoc -Hidden dialogs: -Ukryte dialogi: -Hide all error and warning messages -Ukryj wszystkie informacje bÅ‚Ä™dach i ostrzeżeniach -Hide conflicts -Ukryj konflikty -Hide excluded items -Ukryj wykluczone pliki -Hide files that are different -Ukryj pliki, które sÄ… różne -Hide files that are equal -Ukryj pliki, które sÄ… równe -Hide files that are newer on left -Ukryj pliki, które sÄ… nowsze po lewej stronie -Hide files that are newer on right -Ukryj pliki, które sÄ… nowsze po prawej stronie -Hide files that exist on left side only -Ukryj pliki, które istniejÄ… tylko po lewej stronie -Hide files that exist on right side only -Ukryj pliki, które istniejÄ… tylko po prawej stronie -Hide files that will be created on the left side -Ukryj pliki, które bÄ™dÄ… utworzone po lewej stronie -Hide files that will be created on the right side -Ukryj pliki, które bÄ™dÄ… utworzone po prawej stronie -Hide files that will be deleted on the left side -Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie -Hide files that will be deleted on the right side -Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie -Hide files that will be overwritten on left side -Ukryj pliki, które zostanÄ… nadpisane po lewej stronie -Hide files that will be overwritten on right side -Ukryj pliki, które zostanÄ… nadpisane po prawej stronie -Hide files that won't be copied -Ukryj pliki, które nie bÄ™dÄ… kopiowane -Hide filtered or temporarily excluded files -Ukryj pliki filtrowane lub tymczasowo wykluczone -Hide further error messages during the current process -Ukryj kolejne informacje o bÅ‚Ä™dach dla tego zadania -Hints: -Wskazówki: -Homepage -Strona domowa -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Wykryj i zastosuj zmiany po obu stronach używajÄ…c bazy danych. UsuniÄ™cia i konflikty sÄ… wykrywane automatycznie. -Idle time between detection of last change and execution of command line in seconds -OdstÄ™p czasu w sekundach pomiÄ™dzy pomiÄ™dzy ostatniÄ… wykrytÄ… zmianÄ…, a wykonaniem komendy -If you like FFS -Jeżeli Ci siÄ™ podoba -Ignore -Ignoruj -Ignore errors -Ignoruj bÅ‚Ä™dy -Ignore subsequent errors -Ignoruj kolejne bÅ‚Ä™dy -Include -DoÅ‚Ä…cz -Include all rows -DoÅ‚Ä…cz wszystkie rzÄ™dy -Include temporarily -DoÅ‚Ä…cz tymczasowo -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -DoÅ‚Ä…cz: *.doc;*.zip;*.exe\nWyklucz: \\stuff\\temp\\* -Incompatible synchronization database format: -Niepoprawny format bazy danych dla synchronizacji: -Info -Info -Information -Informacja -Initial synchronization: -WstÄ™pna synchronizacja: -Integrate external applications into context menu. The following macros are available: -DoÅ‚Ä…cz zewnÄ™trznÄ… aplikacjÄ™ do menu kontekstowego. DostÄ™pne macra: -Invalid FreeFileSync config file! -NieprawidÅ‚owy plik konfiguracyjny! -Last used configurations (press DEL to remove from list) -Ostatnio użyta konfiguracja (naciÅ›nij DEL żeby usunąć z listy) -Leave as unresolved conflict -Zostaw jako nierozwiÄ…zany konflikt -Left -Lewy -Legend -Legenda -Load configuration from file -Wczytaj konfiguracjÄ™ z pliku -Log-messages: -Logi: -Logging -Tworzenie logów -Main bar -Główny pasek -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Tworzenie Shadow Copies dla WOW64 nie jest obsÅ‚ugiwane. Zainstaluj 64 bitowÄ… wersjÄ™ FreeFileSync. -Match case -UwzglÄ™dnij wielkość liter -Maximum number of logfiles: -Maksymalna liczba plików z logami: -Memory allocation failed! -BÅ‚Ä…d alokacji zasobów! -Minimum Idle Time [seconds] -Minimalny czas bezczynnoÅ›ci [sekundy] -Mirror ->> -Lustrzana ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu. -Monitoring active... -Monitorowanie aktywne... -More than 50% of the total number of files will be copied or deleted! -Ponad 50% plików zostanie skopiowanych lub usuniÄ™tych! -Move column down -PrzesuÅ„ kolumnÄ™ w dół -Move column up -PrzesuÅ„ kolumnÄ™ do góry -Move files into a time-stamped subdirectory -PrzenieÅ› pliki do oznaczonego podkatalogu -Moving %x to Recycle Bin -Przenoszenie %x do kosza. -Moving Symbolic Link %x to user-defined directory %y -Przenoszenie dowiÄ…zania symbolicznego %x do zdefiniowanego katalogu %y -Moving file %x to user-defined directory %y -Przenoszenie pliku %x do katalogu użytkownia %y -Moving folder %x to user-defined directory %y -Przenoszenie folderu %x do katalogu użytkownika %y -Multiple... -Wiele... -No change since last synchronization! -Brak zmian od ostatniej synchronizacji! -No filter selected -Nie wybrano żadnego filtra -Not enough free disk space available in: -Brak wystarczajÄ…cej przestrzeni dyskowej na: -Nothing to synchronize according to configuration! -Brak elementów do synchronizacji! -Number of files and directories that will be created -Liczba plików i katalogów, które zostanÄ… utworzone -Number of files and directories that will be deleted -Liczba plików i katalogów, które zostanÄ… usuniÄ™te -Number of files that will be overwritten -Liczba plików, które zostanÄ… nadpisane -One of the FreeFileSync database entries within the following file is not yet existing: -Jeden z wpisów bazy danych FreeFileSync dotyczÄ…cy pliku nie istnieje: -One of the FreeFileSync database files is not yet existing: -Jeden z plików bazy danych FreeFileSync nie istnieje: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Tylko pliki/katalogi zaakceptowane przez filtr bÄ™dÄ… synchronizowane. Filtr dziaÅ‚a dla nazw nazw relatywnych(!) wzglÄ™dem katalogu bazowego. -Open with Explorer -Otwórz za pomocÄ… Explorer -Open with default application -Otwórz za pomocÄ… domyÅ›lnej aplikacji -Operation aborted! -Operacja przerwana! -Operation: -Operacja: -Overview -PrzeglÄ…d -Overwriting Symbolic Link %x in %y -Nadpisywanie dowiÄ…zania symbolicznego %x, %y -Overwriting file %x in %y -Nadpisywanie pliku %x plikiem %y -Pause -Pauza -Paused -Pauza -Planned directory deletion is in conflict with its subdirectories and -files! -UsuniÄ™cie katalogów jest w konflikcie podkatalogami oraz plikami! -Please run a Compare first before synchronizing! -Przed synchronizacjÄ… należy uruchomić Porównaj! -Press \"Switch\" to open FreeFileSync GUI mode. -NaciÅ›nij \"PrzeÅ‚Ä…cz\" aby otworzyć moduÅ‚ GUI. -Processing folder pair: -Przetwarzanie folderów: -Published under the GNU General Public License: -UdostÄ™pnione na zasadach licencji GNU General Public License: -Question -Pytanie -RealtimeSync - Automated Synchronization -RealtimeSync - Automatyczna Synchronizacja -RealtimeSync configuration -RealtimeSync konfiguracja -Recycle Bin not yet supported for this system! -Kosz nie jest jeszcze wspierany dla tej wersji systemu! -Relative path -Relatywna Å›cieżka -Remove alternate settings -UsuÅ„ alternatywne ustawienia -Remove folder -UsuÅ„ folder -Remove folder pair -UsuÅ„ parÄ™ folderów -Report translation error -ZgÅ‚oÅ› bÅ‚Ä…d w tÅ‚umaczeniu -Reset -Resetuj -Reset view -Resetuj widok -Restore all hidden dialogs? -Przywrócić wszystkie ukryte dialogi? -Right -Prawy -S&ave configuration... -Z&apisz konfiguracjÄ™... -S&witch view -P&rzeÅ‚Ä…cz widok -Save changes to current configuration? -Zapisać zmiany obecnej konfiguracji? -Save current configuration to file -Zapisz aktualny plik konfiguracyjny -Scanning... -Skanowanie... -Scanning: -Skanowanie: -Select a folder -Wybierz folder -Select alternate synchronization settings -Stwórz alternatywne reguÅ‚y synchronizacji -Select logfile directory: -Wybierz katalog z logami: -Select variant: -Wybierz wariant: -Select view -OkreÅ›l widok -Set direction: -Kierunek synchronizacji: -Setting default synchronization directions: Old files will be overwritten with newer files. -Ustawianie domyÅ›lnego kierunku synchronizacji: Stare pliki zostanÄ… nadpisane nowszymi. -Show \"%x\" -Pokaż \"%x\" -Show conflicts -Pokaż konflikty -Show files that are different -Pokaż pliki, które siÄ™ różniÄ… -Show files that are equal -Pokaż pliki, które sÄ… równe -Show files that are newer on left -Pokaż pliki nowsze po lewej stronie -Show files that are newer on right -Pokaż pliki nowsze po prawej stronie -Show files that exist on left side only -Pokaż pliki istniejÄ…ce tylko po lewej stronie -Show files that exist on right side only -Pokaż pliki istniejÄ…ce tylko po prawej stronie -Show files that will be created on the left side -Pokaż pliki, które bÄ™dÄ… utworzone po lewej stronie -Show files that will be created on the right side -Pokaż pliki, które bÄ™dÄ… utworzone po prawej stronie -Show files that will be deleted on the left side -Pokaż pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie -Show files that will be deleted on the right side -Pokaż pliki, które bÄ™dÄ… usuniÄ™te po prawej stronie -Show files that will be overwritten on left side -Pokaż pliki, które zostanÄ… nadpisane po lewej stronie -Show files that will be overwritten on right side -Pokaż pliki, które zostanÄ… nadpisane po prawej stronie -Show files that won't be copied -Pokaż pliki, które nie bÄ™dÄ… kopiowane -Show hidden dialogs -Pokaż ukryte dialogi -Show popup -Pokaż okno popup -Show popup on errors or warnings -Pokaż okno popup dla bÅ‚Ä™dów i ostrzeżeÅ„ -Significant difference detected: -Wykryto znaczÄ…ce zmiany: -Silent mode -Tryb Cichy -Size -Rozmiar -Source code written completely in C++ utilizing: -Kod źródÅ‚owy napisany caÅ‚kowicie w C++ z wykorzystaniem: -Source directory does not exist anymore: -Katalog źródÅ‚owy nie istnieje: -Speed: -PrÄ™dkość: -Start -Rozpocznij -Start minimized and write status information to a logfile -Uruchom zminimalizowane i zapisuj informacje do pliku logów -Start synchronization -Rozpocznij synchronizacjÄ™ -Statistics -Statystyki -Status feedback -Opinia statusu -Stop -Zatrzymaj -Swap sides -ZamieÅ„ stronami -Switching to FreeFileSync GUI mode... -PrzeÅ‚Ä…czanie do trybu GUI FreeFileSync -Symbolic Link handling -ObsÅ‚uga dowiÄ…zaÅ„ symbolicznych -Symlinks %x have the same date but a different target! -DowiÄ…zanie symboliczne %x ma te same dane, ale inny cel! -Synchronization Preview -PodglÄ…d synchronizacji -Synchronization aborted! -Synchronizacja przerwana! -Synchronization completed successfully! -Synchronizacja zakoÅ„czona pomyÅ›lnie! -Synchronization completed with errors! -Synchronizacja zakoÅ„czona z bÅ‚Ä™dami. -Synchronization settings -Ustawienia synchronizacji -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu \"temp\" -Synchronize... -Synchronizuj... -Synchronizing... -SynchronizujÄ™... -Target directory already existing! -Katalog docelowy już istnieje! -Target file already existing! -Plik docelowy już istnieje! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Komenda jest wykonwywana za każdym razem gdy:\n- wszystkie katalogi bÄ™dÄ… dostÄ™pne (np. wÅ‚ożenie USB)\n- pliki w obrÄ™bie tych katalogów i podkatalogów ulegnÄ… zmianie -The file does not contain a valid configuration: -NieprawidÅ‚owy format pliku: -The file was not processed by last synchronization! -Plik nie zostaÅ‚ przetworzony podczas ostatniej synchronizacji! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Ten wariant traktuje dwa pliki jako równe w przypadku gdy majÄ… jednakowy rozmiar oraz tÄ… samÄ… datÄ™ i czas ostatniej modyfikacji. -Time -Czas -Time elapsed: -Czas: -Time remaining: -PozostaÅ‚y czas: -Total amount of data that will be transferred -Liczba danych do przekopiowania -Total time: -CaÅ‚kowity czas: -Transfer file and directory permissions\n(Requires Administrator rights) -Transfer uprawnieÅ„ plików i katalogów\n(Wymaga uprawnieÅ„ Administratora) -Unable to connect to sourceforge.net! -Nie można siÄ™ poÅ‚Ä…czyć z sourceforge.net! -Unable to create logfile! -Nie można utworzyć pliku z logami! -Unresolved conflicts existing! -IstniejÄ… nierozwiÄ…zane konflikty! -Update -> -Uaktualnij -> -Updating attributes of %x -Aktualizowanie atrybutów %x -Usage: -Użycie: -Use Recycle Bin -Użyj kosza -Use Recycle Bin when deleting or overwriting files -Używaj Kosza podczas usuwania lub nadpisywania plików -User-defined directory for deletion was not specified! -Katalog użytkownika dla elementów usuniÄ™tych nie zostaÅ‚ okreÅ›lony! -Variant -Wariant -Verifying file %x -Weryfikowanie pliku %x -Versioning -Wersjonowanie -Volume name %x not part of filename %y! -Dysk %x nie jest częściÄ… pliku %y! -Waiting for missing directories... -Oczekiwanie na brakujÄ…ce katalogi... -Waiting while directory is locked (%x)... -Blokada katalogu (%x), oczekiwanie... -Warning -Uwaga -When the comparison is started with this option set the following decision tree is processed: -Gdy porównywanie z zaznaczonÄ… opcjÄ… jest w toku, podejmowane sÄ… nastÄ™pujÄ…ce dezyje: -You can ignore conflicts and continue synchronization. -Możesz je zignorować i kontynuować synchronizacjÄ™. -You can ignore this error to consider the directory as empty. -Możesz zignorować ten bÅ‚Ä…d uznająć jeden z katalogów jako pusty. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Możesz spróbować synchronizować pozostaÅ‚e elementy ponownie (bez koniecznoÅ›ci ponownego porównywania)! -different -różny -file exists on both sides -plik istnieje po obu stronach -on one side only -tylko po jednej stronie +<header> + <language name>Polski</language name> + <translator>Wojtek Pietruszewski</translator> + <locale>pl_PL</locale> + <flag file>poland.png</flag file> + <plural forms>3</plural forms> + <plural definition>n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition> +</header> + +<source>Show in Explorer</source> +<target>WyÅ›wietl w explorerze</target> +<source>Open with default application</source> +<target>Otwórz za pomocÄ… domyÅ›lnej aplikacji</target> +<source>Browse directory</source> +<target>PrzeglÄ…daj katalog</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automatyczna Synchronizacja</target> +<source>Browse</source> +<target>PrzeglÄ…daj</target> +<source>Error resolving symbolic link:</source> +<target>BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego:</target> +<source>Select alternate synchronization settings</source> +<target>Stwórz alternatywne reguÅ‚y synchronizacji</target> +<source>No filter selected</source> +<target>Nie wybrano żadnego filtra</target> +<source>Filter is active</source> +<target>Filtr jest aktywny</target> +<source>Clear filter settings</source> +<target>Wyczyść ustawienia filtra</target> +<source>Remove alternate settings</source> +<target>UsuÅ„ alternatywne ustawienia</target> +<source>Create a batch job</source> +<target>Utwórz plik wsadowy</target> +<source>Synchronization settings</source> +<target>Ustawienia synchronizacji</target> +<source>Comparison settings</source> +<target>Ustawienia porównywania</target> +<source>About</source> +<target>O Programie</target> +<source>Error</source> +<target>BÅ‚Ä…d</target> +<source>Warning</source> +<target>Ostrzerzenie</target> +<source>Question</source> +<target>Pytanie</target> +<source>Confirm</source> +<target>Potwierdź</target> +<source>Configure filter</source> +<target>Konfiguruj filtr</target> +<source>Customize columns</source> +<target>Dostosuj kolumny</target> +<source>Global settings</source> +<target>Ustawienia programu</target> +<source>Synchronization Preview</source> +<target>PodglÄ…d synchronizacji</target> +<source>Find</source> +<target>Znajdź</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Bajt</pluralform> +<pluralform>%x Bajty</pluralform> +<pluralform>%x Bajtów</pluralform> +</target> +<source><Symlink></source> +<target><DowiÄ…zanie symboliczne></target> +<source><Directory></source> +<target><Katalog></target> +<source>Size</source> +<target>Rozmiar</target> +<source>Date</source> +<target>Data</target> +<source>Full path</source> +<target>PeÅ‚na scieżka</target> +<source>Filename</source> +<target>Nazwa pliku</target> +<source>Relative path</source> +<target>Relatywna Å›cieżka</target> +<source>Directory</source> +<target>Katalog</target> +<source>Extension</source> +<target>Rozszerzenie</target> +<source>Comparison Result</source> +<target>Rezultat porównywania</target> +<source>Incompatible synchronization database format:</source> +<target>Niepoprawny format bazy danych dla synchronizacji:</target> +<source>Initial synchronization:</source> +<target>WstÄ™pna synchronizacja:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Jeden z plików bazy danych FreeFileSync nie istnieje:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Jeden z wpisów bazy danych FreeFileSync dotyczÄ…cy pliku nie istnieje:</target> +<source>Error reading from synchronization database:</source> +<target>BÅ‚Ä…d odczytu z bazy danych synchronizacji:</target> +<source>An exception occurred!</source> +<target>WystÄ…piÅ‚ wyjÄ…tek!</target> +<source>Error deleting file:</source> +<target>BÅ‚Ä…d podczas usuwania pliku:</target> +<source>Error reading file attributes:</source> +<target>BÅ‚Ä…d odczytu atrybutów pliku:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Blokada katalogu (%x), oczekiwanie...</target> +<source>Error setting directory lock:</source> +<target>BÅ‚Ä…d ustawiania blokady katalogu:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sekunda</pluralform> +<pluralform>%x sekundy</pluralform> +<pluralform>%x sekund</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>BÅ‚Ä…d krytyczny</target> +<source>Invalid FreeFileSync config file!</source> +<target>NieprawidÅ‚owy plik konfiguracyjny!</target> +<source>File does not exist:</source> +<target>Plik nie istnieje:</target> +<source>Error parsing configuration file:</source> +<target>BÅ‚Ä…d parsowania pliku konfiguracyjnego:</target> +<source>Error writing file:</source> +<target>BÅ‚Ä…d zapisu pliku:</target> +<source>/sec</source> +<target>/sekundÄ™</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 minuta</pluralform> +<pluralform>%x minuty</pluralform> +<pluralform>%x minut</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 godzina</pluralform> +<pluralform>%x godziny</pluralform> +<pluralform>%x godzin</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 dzieÅ„</pluralform> +<pluralform>%x dni</pluralform> +<pluralform>%x dni</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Z&apisz konfiguracjÄ™...</target> +<source>&Load configuration...</source> +<target>&Wczytaj konfiguracjÄ™...</target> +<source>&Quit</source> +<target>&Zamknij</target> +<source>&File</source> +<target>&Plik</target> +<source>&Content</source> +<target>&Zawartość</target> +<source>&About...</source> +<target>&O Programie...</target> +<source>&Help</source> +<target>&Pomoc</target> +<source>Usage:</source> +<target>Użycie:</target> +<source>1. Select directories to monitor.</source> +<target>1. Wprowadź katalogi do nadzorowania</target> +<source>2. Enter a command line.</source> +<target>2. Wprowadź komendÄ™.</target> +<source>3. Press 'Start'.</source> +<target>3. WciÅ›nij 'Start'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Komenda jest wykonwywana za każdym razem gdy: +- wszystkie katalogi bÄ™dÄ… dostÄ™pne (np. wÅ‚ożenie USB) +- pliki w obrÄ™bie tych katalogów i podkatalogów ulegnÄ… zmianie +</target> +<source>Directories to watch</source> +<target>Katalogi do obserwacji</target> +<source>Add folder</source> +<target>Dodaj folder</target> +<source>Remove folder</source> +<target>UsuÅ„ folder</target> +<source>Select a folder</source> +<target>Wybierz folder</target> +<source>Command line</source> +<target>Linia komend</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimalny czas bezczynnoÅ›ci [sekundy]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>OdstÄ™p czasu w sekundach pomiÄ™dzy pomiÄ™dzy ostatniÄ… wykrytÄ… zmianÄ…, a wykonaniem komendy</target> +<source>Start</source> +<target>Rozpocznij</target> +<source>(Build: %x)</source> +<target>(BudujÄ™: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync konfiguracja</target> +<source>File already exists. Overwrite?</source> +<target>Nadpisać istniejÄ…cy już plik?</target> +<source>&Restore</source> +<target>&Przywróć</target> +<source>&Exit</source> +<target>&WyjÅ›cie</target> +<source>Monitoring active...</source> +<target>Monitorowanie aktywne...</target> +<source>Waiting for missing directories...</source> +<target>Oczekiwanie na brakujÄ…ce katalogi...</target> +<source>Command line is empty!</source> +<target>Linia komend jest pusta!</target> +<source>Could not initialize directory monitoring:</source> +<target>Nie można uruchomić monitora katalogów:</target> +<source>A directory input field is empty.</source> +<target>Pole ze Å›cieżkÄ… katalogu jest puste.</target> +<source>Error when monitoring directories.</source> +<target>BÅ‚Ä…d podczas monitorowania katalogów.</target> +<source>Drag && drop</source> +<target>Drag && Drop</target> +<source>Conversion error:</source> +<target>BÅ‚Ä…d konwersji:</target> +<source>Error moving file:</source> +<target>BÅ‚Ä…d podczas przenoszenia pliku:</target> +<source>Operation aborted!</source> +<target>Operacja przerwana!</target> +<source>Target file already existing!</source> +<target>Plik docelowy już istnieje!</target> +<source>Error moving directory:</source> +<target>BÅ‚Ä…d podczas przenoszenia katalogu:</target> +<source>Target directory already existing!</source> +<target>Katalog docelowy już istnieje!</target> +<source>Error deleting directory:</source> +<target>BÅ‚Ä…d podczas usuwania katalogu:</target> +<source>Error changing modification time:</source> +<target>BÅ‚Ä…d zmiany godziny modyfikacji:</target> +<source>Error loading library function:</source> +<target>BÅ‚Ä…d wczytywania funkcji:</target> +<source>Error reading security context:</source> +<target>BÅ‚Ä…d odczytu kontekstu bezpieczeÅ„stwa:</target> +<source>Error writing security context:</source> +<target>BÅ‚Ä…d zapisu kontekstu bezpieczeÅ„stwa:</target> +<source>Error copying file permissions:</source> +<target>BÅ‚Ä…d podczas kopiowania uprawnieÅ„ pliku:</target> +<source>Error creating directory:</source> +<target>BÅ‚Ä…d podczas tworzenia katalogu:</target> +<source>Error copying symbolic link:</source> +<target>BÅ‚Ä…d podczas kopiowania dowiÄ…zania symbolicznego (symlink)</target> +<source>Error copying file:</source> +<target>BÅ‚Ä…d podczas kopiowania pliku:</target> +<source>Error opening file:</source> +<target>BÅ‚Ä…d odczytu pliku:</target> +<source>Error reading file:</source> +<target>BÅ‚Ä…d odczytu pliku:</target> +<source>Endless loop when traversing directory:</source> +<target>ZapÄ™tlenie podczas przeglÄ…dania katalogu:</target> +<source>Error traversing directory:</source> +<target>BÅ‚Ä…d podczas odczytywania katalogu:</target> +<source>Error setting privilege:</source> +<target>BÅ‚Ä…d ustawiania uprawnieÅ„:</target> +<source>Error moving to Recycle Bin:</source> +<target>BÅ‚Ä…d podczas przenoszenia do kosza:</target> +<source>Could not load a required DLL:</source> +<target>Nie można zaÅ‚adować wymaganej biblioteki DLL:</target> +<source>Error writing to synchronization database:</source> +<target>BÅ‚Ä…d zapisu do bazy danych synchronizacji:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>BÅ‚Ä…d podczas uruchamianiu usÅ‚ugi Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Tworzenie Shadow Copies dla WOW64 nie jest obsÅ‚ugiwane. Zainstaluj 64 bitowÄ… wersjÄ™ FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Nie można okreÅ›lić nazwy dysku dla pliku:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Dysk %x nie jest częściÄ… pliku %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Nie można odczytać wartoÅ›ci dla danych gaÅ‚Ä™zi XML:</target> +<source>Show popup</source> +<target>Pokaż okno popup</target> +<source>Show popup on errors or warnings</source> +<target>Pokaż okno popup dla bÅ‚Ä™dów i ostrzeżeÅ„</target> +<source>Ignore errors</source> +<target>Ignoruj bÅ‚Ä™dy</target> +<source>Hide all error and warning messages</source> +<target>Ukryj wszystkie informacje bÅ‚Ä™dach i ostrzeżeniach</target> +<source>Exit instantly</source> +<target>Wyjdź natychmiastowo</target> +<source>Abort synchronization immediately</source> +<target>Natychmiast zakoÅ„cz synchronizacjÄ™</target> +<source>Logging</source> +<target>Tworzenie logów</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync plik wsadowy</target> +<source>FreeFileSync configuration</source> +<target>Konfiguracja FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync plik wsadowy</target> +<source>Unable to create logfile!</source> +<target>Nie można utworzyć pliku z logami!</target> +<source>Batch execution</source> +<target>Uruchomienie pliku wsadowego</target> +<source>Log-messages:</source> +<target>Logi:</target> +<source>Stop</source> +<target>Zatrzymaj</target> +<source>Total time:</source> +<target>CaÅ‚kowity czas:</target> +<source>Synchronization aborted!</source> +<target>Synchronizacja przerwana!</target> +<source>Synchronization completed with errors!</source> +<target>Synchronizacja zakoÅ„czona z bÅ‚Ä™dami.</target> +<source>Synchronization completed successfully!</source> +<target>Synchronizacja zakoÅ„czona pomyÅ›lnie!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>NaciÅ›nij "PrzeÅ‚Ä…cz" aby otworzyć moduÅ‚ GUI.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>PrzeÅ‚Ä…czanie do trybu GUI FreeFileSync</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Nie można siÄ™ poÅ‚Ä…czyć z sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>DostÄ™pna jest nowa wersja FreeFileSync:</target> +<source>Download now?</source> +<target>Pobrać teraz?</target> +<source>Information</source> +<target>Informacja</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync jest już uaktualniony!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Czy chcesz aby FreeFileSync sprawdzaÅ‚ uaktualnienia co tydzieÅ„?</target> +<source>(Requires an Internet connection!)</source> +<target>(Wymaga poÅ‚Ä…czenia z Internetem!)</target> +<source>1. &Compare</source> +<target>1. &Porównaj</target> +<source>2. &Synchronize...</source> +<target>2. &Synchronizuj...</target> +<source>S&witch view</source> +<target>P&rzeÅ‚Ä…cz widok</target> +<source>&New</source> +<target>&Nowy</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&JÄ™zyk</target> +<source>&Global settings...</source> +<target>&Ustawienia programu...</target> +<source>&Create batch job...</source> +<target>&Twórz plik wsadowy...</target> +<source>&Export file list...</source> +<target>&Eksportuj listÄ™ plików...</target> +<source>&Advanced</source> +<target>&Zaawansowane</target> +<source>&Check for new version</source> +<target>&Aktualizuj</target> +<source>Compare</source> +<target>Porównaj</target> +<source>Compare both sides</source> +<target>Porównaj foldery</target> +<source>&Abort</source> +<target>&Przerwij</target> +<source>Synchronize...</source> +<target>Synchronizuj...</target> +<source>Start synchronization</source> +<target>Rozpocznij synchronizacjÄ™</target> +<source>Swap sides</source> +<target>ZamieÅ„ stronami</target> +<source>Add folder pair</source> +<target>Dodaj foldery do porównania</target> +<source>Remove folder pair</source> +<target>UsuÅ„ parÄ™ folderów</target> +<source>Save current configuration to file</source> +<target>Zapisz aktualny plik konfiguracyjny</target> +<source>Load configuration from file</source> +<target>Wczytaj konfiguracjÄ™ z pliku</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Ostatnio użyta konfiguracja (naciÅ›nij DEL żeby usunąć z listy)</target> +<source>Hide excluded items</source> +<target>Ukryj wykluczone pliki</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Ukryj pliki filtrowane lub tymczasowo wykluczone</target> +<source>Number of files and directories that will be created</source> +<target>Liczba plików i katalogów, które zostanÄ… utworzone</target> +<source>Number of files that will be overwritten</source> +<target>Liczba plików, które zostanÄ… nadpisane</target> +<source>Number of files and directories that will be deleted</source> +<target>Liczba plików i katalogów, które zostanÄ… usuniÄ™te</target> +<source>Total amount of data that will be transferred</source> +<target>Liczba danych do przekopiowania</target> +<source>Left</source> +<target>Lewy</target> +<source>Right</source> +<target>Prawy</target> +<source>Batch job</source> +<target>Plik wsadowy</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Twórz plik wsadowy dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik klikajÄ…c dwa razy lub dodaj go do zadaÅ„ zaplanowanych Twojego systemu. Plik wsadowy może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe <plikwsadowy>.</target> +<source>Help</source> +<target>Pomoc</target> +<source>Configuration overview:</source> +<target>PrzeglÄ…d konfiguracji:</target> +<source>Filter files</source> +<target>Filtruj pliki</target> +<source>Status feedback</source> +<target>Opinia statusu</target> +<source>Silent mode</source> +<target>Tryb Cichy</target> +<source>Start minimized and write status information to a logfile</source> +<target>Uruchom zminimalizowane i zapisuj informacje do pliku logów</target> +<source>Error handling</source> +<target>ObsÅ‚uga bÅ‚Ä™dów</target> +<source>Overview</source> +<target>PrzeglÄ…d</target> +<source>Select logfile directory:</source> +<target>Wybierz katalog z logami:</target> +<source>Maximum number of logfiles:</source> +<target>Maksymalna liczba plików z logami:</target> +<source>&Save</source> +<target>&Zapisz</target> +<source>&Load</source> +<target>&Wczytaj</target> +<source>&Cancel</source> +<target>&Anuluj</target> +<source>Elements found:</source> +<target>Znalezione elementy:</target> +<source>Elements remaining:</source> +<target>PozostaÅ‚e elementy:</target> +<source>Speed:</source> +<target>PrÄ™dkość:</target> +<source>Time remaining:</source> +<target>PozostaÅ‚y czas:</target> +<source>Time elapsed:</source> +<target>Czas:</target> +<source>Operation:</source> +<target>Operacja:</target> +<source>Select variant:</source> +<target>Wybierz wariant:</target> +<source><Automatic></source> +<target><Automatycznie></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Wykryj i zastosuj zmiany po obu stronach używajÄ…c bazy danych. UsuniÄ™cia i konflikty sÄ… wykrywane automatycznie.</target> +<source>Mirror ->></source> +<target>Lustrzana ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target> +<source>Update -></source> +<target>Uaktualnij -></target> +<source>Copy new or updated files to right folder.</source> +<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target> +<source>Custom</source> +<target>WÅ‚asne</target> +<source>Configure your own synchronization rules.</source> +<target>Skonfiguruj swoje wÅ‚asne zasady synchronizacji.</target> +<source>Deletion handling</source> +<target>ObsÅ‚uga usuwania</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Konfiguracja</target> +<source>Category</source> +<target>Kategoria</target> +<source>Action</source> +<target>Akcja</target> +<source>Files/folders that exist on left side only</source> +<target>Pliki/katalogi istniejÄ…ce tylko po lewej stronie</target> +<source>Files/folders that exist on right side only</source> +<target>Pliki/katalogi istniejÄ…ce tylko po prawej stronie</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Pliki, które istniejÄ… po obu stronach, lewa strona jest nowsza</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Pliki, które istniejÄ… po obu stronach, prawa strona jest nowsza</target> +<source>Files that have different content</source> +<target>Pliki, które majÄ… różnÄ… zawartość</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Konflikty/pliki, które nie mogÄ… być skategoryzowane</target> +<source>Compare by...</source> +<target>Porównaj przez...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Pliki sÄ… jednakowe jeżeli + - rozmiar pliku + - czas i data modyfikacji +sÄ… identyczne +</target> +<source>File size and date</source> +<target>Rozmiar i data pliku</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Pliki sÄ… jednakowe jeżeli + - zawartość pliku +jest identyczna +</target> +<source>File content</source> +<target>Zawartość pliku</target> +<source>Symbolic Link handling</source> +<target>ObsÅ‚uga dowiÄ…zaÅ„ symbolicznych</target> +<source>Synchronizing...</source> +<target>SynchronizujÄ™...</target> +<source>Elements processed:</source> +<target>Przetworzeone elementy:</target> +<source>&Pause</source> +<target>&Pauza</target> +<source>Compare by "File size and date"</source> +<target>Porównaj przez "Rozmiar i data pliku"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Ten wariant traktuje dwa pliki jako równe w przypadku gdy majÄ… jednakowy rozmiar oraz tÄ… samÄ… datÄ™ i czas ostatniej modyfikacji.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Gdy porównywanie z zaznaczonÄ… opcjÄ… jest w toku, podejmowane sÄ… nastÄ™pujÄ…ce dezyje:</target> +<source>As a result the files are separated into the following categories:</source> +<target>W rezultacie pliki zostaÅ‚y podzielone na nastÄ™pujÄ…ce kategorie:</target> +<source>- equal</source> +<target>- równy</target> +<source>- left newer</source> +<target>- lewy jest nowszy</target> +<source>- right newer</source> +<target>- prawy jest nowszy</target> +<source>- exists left only</source> +<target>- istnieje tylko po lewej stronie</target> +<source>- exists right only</source> +<target>- istnieje tylko po prawej stronie</target> +<source>- conflict (same date, different size)</source> +<target>- konflikt (ta sama data, różny rozmiar)</target> +<source>Compare by "File content"</source> +<target>Porównaj przez "Zawartość pliku"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Jak wskazuje nazwa, dwa pliki o tej samej nazwie sÄ… równe tylko i wyÅ‚Ä…cznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagÄ™. Ta opcja jest raczej użyteczna do sprawdzania spójnoÅ›ci plików niż zadaÅ„ kopii zapasowej. + +Drzewko decyzyjne dla tej opcji jest mniejsze: +</target> +<source>- different</source> +<target>- różny</target> +<source>Source code written in C++ utilizing:</source> +<target>Kod stworzony w C++ z wykorzystaniem:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>PodziÄ™kowania za tÅ‚umaczenie FreeFileSync:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Komentarze i sugestie mile widziane na:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync na Sourceforge</target> +<source>Homepage</source> +<target>Strona domowa</target> +<source>If you like FFS</source> +<target>Jeżeli Ci siÄ™ podoba</target> +<source>Donate with PayPal</source> +<target>Wesprzyj z PayPal</target> +<source>Email</source> +<target>Poczta</target> +<source>Report translation error</source> +<target>ZgÅ‚oÅ› bÅ‚Ä…d w tÅ‚umaczeniu</target> +<source>Published under the GNU General Public License:</source> +<target>UdostÄ™pnione na zasadach licencji GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Ignoruj kolejne bÅ‚Ä™dy</target> +<source>Hide further error messages during the current process</source> +<target>Ukryj kolejne informacje o bÅ‚Ä™dach dla tego zadania</target> +<source>&Ignore</source> +<target>&Ignoruj</target> +<source>&Retry</source> +<target>&Powtórz</target> +<source>Do not show this dialog again</source> +<target>Nie pokazuj tego okna ponownie</target> +<source>&Switch</source> +<target>&ZamieÅ„</target> +<source>&Yes</source> +<target>&Tak</target> +<source>&No</source> +<target>&Nie</target> +<source>Delete on both sides</source> +<target>UsuÅ„ po obu stronach</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>UsuÅ„ po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie</target> +<source>Use Recycle Bin</source> +<target>Użyj kosza</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Tylko pliki i katalogi, które speÅ‚niÅ‚y wszystkie kryteria filtrów bÄ™dÄ… poddane synchronizacji. +Uwaga: Podana nazwa musi być relatywnÄ… Å›cieżkÄ… wzglÄ™dem synchronizowanych katalogów. +</target> +<source>Hints:</source> +<target>Wskazówki:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Wprowdź relatywne scieżki do plików lub katalogów oddzielone ';' lub nowÄ… liniÄ….</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Użyj wieloznacznika (wildcard) '*' i '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Wyklucz pliki i foldery używajÄ…c prawego przycisku myszki.</target> +<source>Example</source> +<target>PrzykÅ‚ad</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +UwzglÄ™dnik: *.doc;*zip*.exe +Wyklucz: \moje\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu "temp"</target> +<source>Include</source> +<target>DoÅ‚Ä…cz</target> +<source>Exclude</source> +<target>Wyklucz</target> +<source>Select time span:</source> +<target>OkreÅ›l różnicÄ™ czasu:</target> +<source>Minimum file size:</source> +<target>Minimalny rozmiar pliku:</target> +<source>Maximum file size:</source> +<target>Maksymalny rozmiar pliku:</target> +<source>&Default</source> +<target>&DomyÅ›lne</target> +<source>Move column up</source> +<target>PrzesuÅ„ kolumnÄ™ do góry</target> +<source>Move column down</source> +<target>PrzesuÅ„ kolumnÄ™ w dół</target> +<source>Copy locked files</source> +<target>Kopiuj zablokowane pliki</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopiuj pliki udostÄ™pnione i zablokowane używajÄ…c usÅ‚ugi Volume Shadow Copy + (Wymaga uprawnieÅ„ administratora) +</target> +<source>Copy filesystem permissions</source> +<target>Kopiuj uprawnienia plików</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transfer uprawnieÅ„ plików i katalogów +(Wymaga uprawnieÅ„ Administratora) +</target> +<source>Hidden dialogs:</source> +<target>Ukryte dialogi:</target> +<source>Reset</source> +<target>Resetuj</target> +<source>Show hidden dialogs</source> +<target>Pokaż ukryte dialogi</target> +<source>External applications</source> +<target>Aplikacje zewnÄ™trzne</target> +<source>Description</source> +<target>Opis</target> +<source>Variant</source> +<target>Wariant</target> +<source>Statistics</source> +<target>Statystyki</target> +<source>Find what:</source> +<target>Co:</target> +<source>Match case</source> +<target>UwzglÄ™dnij wielkość liter</target> +<source>&Find next</source> +<target>&Znajdź nastÄ™pny</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Możesz spróbować synchronizować pozostaÅ‚e elementy ponownie (bez koniecznoÅ›ci ponownego porównywania)!</target> +<source>Batch file created successfully!</source> +<target>Plik wsadowy utworzony pomyÅ›lnie!</target> +<source>Main bar</source> +<target>Główny pasek</target> +<source>Folder pairs</source> +<target>Pary folderów</target> +<source>Select view</source> +<target>OkreÅ›l widok</target> +<source>Folder Comparison and Synchronization</source> +<target>Porównywanie i Synchronizacja folderów</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Kosz nie jest jeszcze wspierany dla tej wersji systemu!</target> +<source>Set direction:</source> +<target>Kierunek synchronizacji:</target> +<source>Exclude temporarily</source> +<target>Wyklucz tymczasowo</target> +<source>Include temporarily</source> +<target>DoÅ‚Ä…cz tymczasowo</target> +<source>Exclude via filter:</source> +<target>Dodaj filtr:</target> +<source><multiple selection></source> +<target><zaznaczone elementy></target> +<source>D-Click</source> +<target>Podw. klikniÄ™cie</target> +<source>Copy to clipboard CTRL+C</source> +<target>Kopiuj do pamiÄ™ci CTRL+C</target> +<source>Delete files DEL</source> +<target>UsuÅ„ DEL</target> +<source>Customize...</source> +<target>Dostosuj...</target> +<source>Auto-adjust columns</source> +<target>Autodopasowanie kolumn</target> +<source>Include all rows</source> +<target>DoÅ‚Ä…cz wszystkie rzÄ™dy</target> +<source>Exclude all rows</source> +<target>Wyklucz wszystkie rzÄ™dy</target> +<source>Reset view</source> +<target>Resetuj widok</target> +<source>Show "%x"</source> +<target>Pokaż "%x"</target> +<source><Last session></source> +<target><Ostatnia sesja></target> +<source>Configuration saved!</source> +<target>Konfiguracja zapisana!</target> +<source>Save changes to current configuration?</source> +<target>Zapisać zmiany obecnej konfiguracji?</target> +<source>Configuration loaded!</source> +<target>Konfiguracja wczytana!</target> +<source>Hide files that exist on left side only</source> +<target>Ukryj pliki, które istniejÄ… tylko po lewej stronie</target> +<source>Show files that exist on left side only</source> +<target>Pokaż pliki istniejÄ…ce tylko po lewej stronie</target> +<source>Hide files that exist on right side only</source> +<target>Ukryj pliki, które istniejÄ… tylko po prawej stronie</target> +<source>Show files that exist on right side only</source> +<target>Pokaż pliki istniejÄ…ce tylko po prawej stronie</target> +<source>Hide files that are newer on left</source> +<target>Ukryj pliki, które sÄ… nowsze po lewej stronie</target> +<source>Show files that are newer on left</source> +<target>Pokaż pliki nowsze po lewej stronie</target> +<source>Hide files that are newer on right</source> +<target>Ukryj pliki, które sÄ… nowsze po prawej stronie</target> +<source>Show files that are newer on right</source> +<target>Pokaż pliki nowsze po prawej stronie</target> +<source>Hide files that are equal</source> +<target>Ukryj pliki, które sÄ… równe</target> +<source>Show files that are equal</source> +<target>Pokaż pliki, które sÄ… równe</target> +<source>Hide files that are different</source> +<target>Ukryj pliki, które sÄ… różne</target> +<source>Show files that are different</source> +<target>Pokaż pliki, które siÄ™ różniÄ…</target> +<source>Hide conflicts</source> +<target>Ukryj konflikty</target> +<source>Show conflicts</source> +<target>Pokaż konflikty</target> +<source>Hide files that will be created on the left side</source> +<target>Ukryj pliki, które bÄ™dÄ… utworzone po lewej stronie</target> +<source>Show files that will be created on the left side</source> +<target>Pokaż pliki, które bÄ™dÄ… utworzone po lewej stronie</target> +<source>Hide files that will be created on the right side</source> +<target>Ukryj pliki, które bÄ™dÄ… utworzone po prawej stronie</target> +<source>Show files that will be created on the right side</source> +<target>Pokaż pliki, które bÄ™dÄ… utworzone po prawej stronie</target> +<source>Hide files that will be deleted on the left side</source> +<target>Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> +<source>Show files that will be deleted on the left side</source> +<target>Pokaż pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> +<source>Hide files that will be deleted on the right side</source> +<target>Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> +<source>Show files that will be deleted on the right side</source> +<target>Pokaż pliki, które bÄ™dÄ… usuniÄ™te po prawej stronie</target> +<source>Hide files that will be overwritten on left side</source> +<target>Ukryj pliki, które zostanÄ… nadpisane po lewej stronie</target> +<source>Show files that will be overwritten on left side</source> +<target>Pokaż pliki, które zostanÄ… nadpisane po lewej stronie</target> +<source>Hide files that will be overwritten on right side</source> +<target>Ukryj pliki, które zostanÄ… nadpisane po prawej stronie</target> +<source>Show files that will be overwritten on right side</source> +<target>Pokaż pliki, które zostanÄ… nadpisane po prawej stronie</target> +<source>Hide files that won't be copied</source> +<target>Ukryj pliki, które nie bÄ™dÄ… kopiowane</target> +<source>Show files that won't be copied</source> +<target>Pokaż pliki, które nie bÄ™dÄ… kopiowane</target> +<source>All directories in sync!</source> +<target>Wszystkie katalogi zsynchronizowane!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Przed synchronizacjÄ… należy uruchomić Porównaj!</target> +<source>Comma separated list</source> +<target>Lista oddzielona przecinkami</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Lista plików wyeksportowana!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target></target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 katalog</pluralform> +<pluralform>%x katalogi</pluralform> +<pluralform>%x katalogów</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 plik</pluralform> +<pluralform>%x pliki</pluralform> +<pluralform>%x plików</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x z 1 rzÄ™du w widoku</pluralform> +<pluralform>%x z %y rzÄ™dów w widoku</pluralform> +<pluralform>%x z %y rzÄ™dów w widoku</pluralform> +</target> +<source>Scanning...</source> +<target>Skanowanie...</target> +<source>Comparing content...</source> +<target>Porównywanie zawartoÅ›ci...</target> +<source>Paused</source> +<target>Pauza</target> +<source>Aborted</source> +<target>Przerwana</target> +<source>Completed</source> +<target>ZakoÅ„czono</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania...</target> +<source>Continue</source> +<target>Kontynuuj</target> +<source>Pause</source> +<target>Pauza</target> +<source>Cannot find %x</source> +<target>Nie można znaleźć %x</target> +<source>DECISION TREE</source> +<target>DRZEWO DECYZYJNE</target> +<source>file exists on both sides</source> +<target>plik istnieje po obu stronach</target> +<source>on one side only</source> +<target>tylko po jednej stronie</target> +<source>same date</source> +<target></target> +<source>different date</source> +<target></target> +<source>Inactive</source> +<target>Nieaktywny</target> +<source>Second</source> +<target>Sekund</target> +<source>Minute</source> +<target>Minut</target> +<source>Hour</source> +<target>Godzin</target> +<source>Day</source> +<target>Dni</target> +<source>Byte</source> +<target>Bajtów</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtr: Wszystkie pary</target> +<source>Filter: Single pair</source> +<target>Filtr: PojedyÅ„cza para</target> +<source>Ignore</source> +<target>Ignoruj</target> +<source>Direct</source> +<target>BezpoÅ›rednio</target> +<source>Follow</source> +<target>PodÄ…rzaj</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>DoÅ‚Ä…cz zewnÄ™trznÄ… aplikacjÄ™ do menu kontekstowego. DostÄ™pne macra:</target> +<source>- full file or directory name</source> +<target>- peÅ‚na nazwa pliku lub katalogu</target> +<source>- directory part only</source> +<target>- tylko część katalogu</target> +<source>- Other side's counterpart to %name</source> +<target>- Odpowiednik %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Odpowiednik %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Przywrócić wszystkie ukryte dialogi?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Czy na pewno chcesz przenieÅ› ten obiekt do kosza?</pluralform> +<pluralform>Czy na pewno chcesz przenieÅ› %x obiekty do kosza?</pluralform> +<pluralform>Czy na pewno chcesz przenieÅ› %x obiektów do kosza?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Czy na pewno chcesz usunuÄ…c ten obiekt do kosza?</pluralform> +<pluralform>Czy na pewno chcesz usunÄ…c %x obiekty do kosza?</pluralform> +<pluralform>Czy na pewno chcesz usunąć %x obiektów do kosza?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Zostaw jako nierozwiÄ…zany konflikt</target> +<source>Delete permanently</source> +<target>UsuÅ„ na staÅ‚e</target> +<source>Delete or overwrite files permanently</source> +<target>UsuÅ„ lub nadpisz pliki na staÅ‚e</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target> +<source>Versioning</source> +<target>Wersjonowanie</target> +<source>Move files into a time-stamped subdirectory</source> +<target>PrzenieÅ› pliki do oznaczonego podkatalogu</target> +<source>Cannot determine sync-direction:</source> +<target>Nie można okreÅ›lić kierunku synchronizacji:</target> +<source>Filter settings have changed!</source> +<target>Ustawienia filtra ulegÅ‚y zmianie!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Obie strony ulegÅ‚y zmianie od ostatniej synchronizacji!</target> +<source>No change since last synchronization!</source> +<target>Brak zmian od ostatniej synchronizacji!</target> +<source>The file was not processed by last synchronization!</source> +<target>Plik nie zostaÅ‚ przetworzony podczas ostatniej synchronizacji!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>UsuniÄ™cie katalogów jest w konflikcie podkatalogami oraz plikami!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Ustawianie domyÅ›lnego kierunku synchronizacji: Stare pliki zostanÄ… nadpisane nowszymi.</target> +<source>The file does not contain a valid configuration:</source> +<target>NieprawidÅ‚owy format pliku:</target> +<source>Scanning:</source> +<target>Skanowanie:</target> +<source>Encoding extended time information: %x</source> +<target>Odkodowywanie rozszerzonych informacji o czasie: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Możesz zignorować ten bÅ‚Ä…d uznająć jeden z katalogów jako pusty.</target> +<source>Directory does not exist:</source> +<target>Katalog nie istnieje:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Katalogi sÄ… zależne! PamiÄ™taj o tym podczas ustawiania zasad synchronizacji:</target> +<source>Comparing content of files %x</source> +<target>Porównywanie zawartoÅ›ci plików %x</target> +<source>Memory allocation failed!</source> +<target>BÅ‚Ä…d alokacji zasobów!</target> +<source>File %x has an invalid date!</source> +<target>Plik %x ma nieprawidÅ‚owÄ… datÄ™!</target> +<source>Conflict detected:</source> +<target>Wykryto konflikt:</target> +<source>Files %x have the same date but a different size!</source> +<target>Pliki %x majÄ… tÄ… samÄ… datÄ™ lecz różne rozmiary!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>DowiÄ…zanie symboliczne %x ma te same dane, ale inny cel!</target> +<source>Comparing files by content failed.</source> +<target>Porównywanie przez zawartość zakoÅ„czone niepowodzeniem.</target> +<source>Generating file list...</source> +<target>Generowanie listy plików...</target> +<source>Multiple...</source> +<target>Wiele...</target> +<source>Files that are equal on both sides</source> +<target>Pliki równe po obu stronach</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Pliki/foldery różniÄ…ce siÄ™ tylko atrybutami</target> +<source>Copy from right to left</source> +<target>Kopiuj z prawej do lewej</target> +<source>Copy from left to right</source> +<target>Kopiuj z lewej do prawej</target> +<source>Delete files/folders existing on left side only</source> +<target>UsuÅ„ pliki/foldery istniejÄ…ce tylko po lewej stronie</target> +<source>Delete files/folders existing on right side only</source> +<target>UsuÅ„ pliki/foldery istniejÄ…ce tylko po prawej stronie</target> +<source>Copy from right to left overwriting</source> +<target>Kopiuj z prawej do lewej nadpisujÄ…c</target> +<source>Copy from left to right overwriting</source> +<target>Kopiuj z lewej do prawej nadpisujÄ…c</target> +<source>Do nothing</source> +<target>Nic nie rób</target> +<source>Copy attributes only from right to left</source> +<target>Kopiuj atrybuty tylko z prawej strony</target> +<source>Copy attributes only from left to right</source> +<target>Kopiuj atrybuty tylko z lewej strony</target> +<source>Deleting file %x</source> +<target>Usuwanie pliku %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Usuwanie dowiÄ…zania symbolicznego %x</target> +<source>Deleting folder %x</source> +<target>Usuwanie folderu %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Przenoszenie %x do kosza.</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Przenoszenie pliku %x do katalogu użytkownia %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Przenoszenie folderu %x do katalogu użytkownika %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Przenoszenie dowiÄ…zania symbolicznego %x do zdefiniowanego katalogu %y</target> +<source>Copying new file %x to %y</source> +<target>Kopiowanie nowego pliku %x do %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopiowanie nowego dowiÄ…zania symbolicznego %x</target> +<source>Overwriting file %x in %y</source> +<target>Nadpisywanie pliku %x plikiem %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Nadpisywanie dowiÄ…zania symbolicznego %x, %y</target> +<source>Creating folder %x</source> +<target>Tworzenie folderu %x</target> +<source>Verifying file %x</source> +<target>Weryfikowanie pliku %x</target> +<source>Updating attributes of %x</source> +<target>Aktualizowanie atrybutów %x</target> +<source>Source directory does not exist anymore:</source> +<target>Katalog źródÅ‚owy nie istnieje:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Brak elementów do synchronizacji!</target> +<source>Target directory name must not be empty!</source> +<target>Katalog docelowy nie może być pusty!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Katalog użytkownika dla elementów usuniÄ™tych nie zostaÅ‚ okreÅ›lony!</target> +<source>Unresolved conflicts existing!</source> +<target>IstniejÄ… nierozwiÄ…zane konflikty!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Możesz je zignorować i kontynuować synchronizacjÄ™.</target> +<source>Significant difference detected:</source> +<target>Wykryto znaczÄ…ce zmiany:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Ponad 50% plików zostanie skopiowanych lub usuniÄ™tych!</target> +<source>Not enough free disk space available in:</source> +<target>Brak wystarczajÄ…cej przestrzeni dyskowej na:</target> +<source>Free disk space required:</source> +<target>Wymagane wolne miejsce:</target> +<source>Free disk space available:</source> +<target>Wolne miejsce:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Katalog zostanie zmodyfikowany w efekcie synchronizacji wielu par folderów! Zweryfikuj ustawienia synchronizacji!</target> +<source>Processing folder pair:</source> +<target>Przetwarzanie folderów:</target> +<source>Generating database...</source> +<target>Generowanie bazy danych...</target> +<source>Error copying locked file %x!</source> +<target>BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>BÅ‚Ä…d weryfikacji danych: Plik źródÅ‚owy i docelowy różniÄ… siÄ™ zawartoÅ›ciÄ…!</target> diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index ecee1cfa..7198044d 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -1,910 +1,1025 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objectos eliminados com sucesso -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dia(s) -%x directories -%x pastas -%x files -%x ficheiros -%x hour(s) -%x hora(s) -%x kB -%x kB -%x min -%x min(s) -%x of %y rows in view -%x de %y ficheiros -%x of 1 row in view -%x de 1 linha -%x sec -%x seg(s) -%x% -%x% -&Abort -&Abortar -&About... -&Sobre... -&Advanced -&Avançado -&Cancel -&Cancelar -&Check for new version -&Procurar actualizações -&Content -&Conteúdo -&Create batch job... -&Criar um ficheiro batch... -&Default -&Config. Iniciais -&Exit -&Sair -&Export file list... -&Exportar lista de ficheiros... -&File -&Ficheiro -&Find next -&Procurar seguinte -&Global settings... -&Opções...... -&Help -&Ajuda -&Ignore -&Ignorar -&Language -&LÃngua -&Load -&Carregar -&Load configuration... -&Carregar configuração... -&New -&Novo -&No -&Não -&OK -&OK -&Pause -&Pausa -&Program -&Programa -&Quit -&Sair -&Restore -&Restaurar -&Retry -&Tentar de Novo -&Save -&Guardar -&Switch -&Trocar -&Yes -&Sim -(Build: %x) -(Build: %x) -(Requires an Internet connection!) -(Necessita acesso à Internet!) -- Other side's counterpart to %dir -- Contrapartida de %dir -- Other side's counterpart to %name -- Contrapartida de %name -- conflict -- conflito -- conflict (same date, different size) -- conflito (mesma data, tamanho diferente) -- different -- ficheiros diferentes -- directory part only -- apenas parte do directório -- equal -- ficheiros iguais -- exists left only -- existe apenas à esquerda -- exists right only -- existe apenas à direita -- full file or directory name -- nome completo do ficheiro ou directório -- left -- esquerda -- left newer -- mais novo à esquerda -- right -- direita -- right newer -- mais novo à direita -/sec -/seg -1 directory -1 pastas -1 file -1 ficheiro -1. &Compare -1. &Comparar -1. Enter relative file or directory names separated by ';' or a new line. -1. Inserir caminho(s) do(s) ficheiro(s) ou pasta(s) separados por ';' ou numa nova linha. -1. Select directories to monitor. -1. Seleccionar directórios a monitorizar. -2. &Synchronize... -2. &Sincronizar... -2. Enter a command line. -2. Insira linha de comando. -2. Use wildcard characters '*' and '?'. -2. Usar '*' e '?' como caracteres de procura. -3. Exclude files directly on main grid via context menu. -3. Excluir ficheiros directamente da grelha através do menu de contexto. -3. Press 'Start'. -3. Pressione 'Iniciar'. -<Automatic> -<Automático> -<Directory> -<Directório> -<Last session> -<Última Sessão> -<Symlink> -<Link Simbólico> -<multiple selection> -<Selecção Múltipla> -A directory input field is empty. -Um campo de directório está vazio. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Um directório que pertencente a conjunto de vários directórios vai ser alterado! Por favor, verifique as opções de sincronização! -A newer version of FreeFileSync is available: -Mais recente versão do FreeFileSync disponÃvel: -Abort requested: Waiting for current operation to finish... -Abortar pedido: À espera do fim da operação... -Abort synchronization immediately -Abortar sincronização imediatamente -Aborted -Abortado -About -Sobre -Action -Acção -Add folder -Adicionar pasta -Add folder pair -Adicionar um par de pastas -All directories in sync! -Todas as pastas sincronizadas! -An exception occurred! -Ocorreu uma excepção! -As a result the files are separated into the following categories: -Como resultado, os ficheiros foram separados nas seguintes categorias: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta.\n\nCom esta opção, a arvoré de decisão é menor: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Criar um batch para sincronização automática. Para iniciar o modo batch, passar o nome do ficheiro para o executável do FreeFileSync: FreeFileSync.exe <ficheiro batch>. Também pode ser calendarizado no programador de tarefas. -At least one directory input field is empty. -Pelo menos um dos campos está vazio. -Auto-adjust columns -Auto ajustar colunas -Batch execution -Execução do batch -Batch file created successfully! -Ficheiro batch criado com sucesso! -Batch job -Ficheiro Batch -Big thanks for localizing FreeFileSync goes out to: -Pela tradução de FreeFileSync, um agradecimento a: -Both sides have changed since last synchronization! -Ambos os lados tiveram alterações desde a última sincronização! -Browse -Procurar -Browse directory -Procurar directório -Cannot determine sync-direction: -Não é possÃvel saber a direcção de sincronização: -Cannot find %x -Não é possÃvel descobrir %x -Category -Categoria -Clear filter settings -Limpar opções do filtro -Comma separated list -Lista de itens separados por virgula -Command line -Linha de comandos -Command line is empty! -Linha de comandos vazia! -Compare -Comparar -Compare both sides -Comparar listas -Compare by \"File content\" -Comparar por \"Conteúdo dos ficheiros\" -Compare by \"File size and date\" -Comparar por \"Data e tamanho dos ficheiros\" -Compare by... -Comparar por... -Comparing content of files %x -A comparar o conteúdo do ficheiro %x -Comparing content... -A comparar... -Comparing files by content failed. -A comparação de ficheiros por conteúdo falhou. -Comparison Result -Resultados da Comparação -Comparison settings -Opções de Comparação -Completed -Terminado -Configuration -Configuração -Configuration loaded! -Configuração carregada! -Configuration overview: -Parametros de configuração: -Configuration saved! -Configuração guardada! -Configure filter -Configuração dos filtros -Configure your own synchronization rules. -Configure as suas regras de sincronização. -Confirm -Confirmar -Conflict detected: -Conflito detectado: -Conflicts/files that cannot be categorized -Conflitos/ficheiros que não podem ser categorizados -Continue -Continuar -Conversion error: -Erro de conversão: -Copy attributes only from left to right -Copiar atributos apenas da esquerda para a direita -Copy attributes only from right to left -Copiar atributos apenas da direita para a esquerda -Copy filesystem permissions -Copiar permissões do sistema de ficheiros -Copy from left to right -Copiar da esquerda para a direita -Copy from left to right overwriting -Copiar da esquerda para a direita com sobreposição -Copy from right to left -Copiar da direita para a esquerda -Copy from right to left overwriting -Copiar da direita para a esquerda com sobreposição -Copy locked files -Copiar ficheiros bloqueados -Copy new or updated files to right folder. -Copiar ficheiros novos ou actualizados para a direita -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy\n (Requer direitos de administrador) -Copy to clipboard\tCTRL+C -Copiar para a Ãrea de transferência\tCTRL+C -Copying new Symbolic Link %x to %y -Copiar novo link simbólico %x para %y -Copying new file %x to %y -Copiar novo ficheiro %x para %y -Could not determine volume name for file: -Não é possÃvel determinar o nome do volume para o ficheiro: -Could not initialize directory monitoring: -Não é possÃvel iniciar monitorização do directório: -Could not load a required DLL: -Não foi possÃvel carregar a DLL: -Could not read values for the following XML nodes: -Não foi possÃvel ler os valores dos seguintes nós XML: -Create a batch job -Criar ficheiro batch -Creating folder %x -Criar pasta %x -Custom -Personalizado -Customize columns -Personalizar colunas -Customize... -Personalizar... -D-Click -Duplo Clique -DECISION TREE -ÃRVORE DE DECISÃO -Data verification error: Source and target file have different content! -Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente! -Date -Data -Delete files/folders existing on left side only -Eliminar itens existentes apenas no lado esquerdo -Delete files/folders existing on right side only -Eliminar itens existentes apenas no lado direito -Delete files\tDEL -Eliminar ficheiros\tDEL -Delete on both sides -Eliminar em ambos os lados -Delete on both sides even if the file is selected on one side only -Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado -Delete or overwrite files permanently -Apagar ou substituir ficheiros permanentemente -Delete permanently -Apagar permanentemente -Deleting Symbolic Link %x -Apagar link simbólico %x -Deleting file %x -Apagar ficheiro %x -Deleting folder %x -Apagar pasta %x -Deletion handling -Controlo eliminação -Description -Descrição -Direct -Direto -Directories are dependent! Be careful when setting up synchronization rules: -Directórios são dependentes! Cuidado ao definir as regras de sincronização: -Directories to watch -Directórios a observar -Directory -Directório -Directory does not exist: -A pasta não existe: -Do not show this dialog again -Não mostrar novamente -Do nothing -Não fazer nada -Do you really want to delete the following object(s)? -Quer mesmo eliminar o(s) seguinte(s) item(s) ? -Do you really want to move the following object(s) to the Recycle Bin? -Quer mesmo mover o(s) seguinte(s) objecto(s) para a Reciclagem? -Do you want FreeFileSync to automatically check for updates every week? -Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas? -Donate with PayPal -Doar usando PayPal -Download now? -Fazer download agora? -Drag && drop -Pegar && largar -Elements found: -Elementos encontrados: -Elements processed: -Elementos processados: -Elements remaining: -Elementos restantes: -Email -Email -Encoding extended time information: %x -A codificar dados temporais extendidos: %x -Endless loop when traversing directory: -Loop infinito ao percorrer directório: -Equal files/folders that differ in attributes only -Ficheiros/Pastas iguais que diferem apenas nos atributos -Error -Erro -Error changing modification time: -Erro ao mudar a hora de modificação: -Error copying file permissions: -Erro ao copiar permissões dos ficheiros: -Error copying file: -Erro ao copiar ficheiro: -Error copying locked file %x! -Erro ao copiar ficheiro bloqueado %x! -Error copying symbolic link: -Erro ao copiar o link: -Error creating directory: -Erro ao criar a pasta: -Error deleting directory: -Erro ao eliminar a pasta: -Error deleting file: -Erro ao eliminar o ficheiro: -Error handling -Controlador de erros -Error loading library function: -Erro ao carregar a livraria: -Error moving directory: -Erro ao mover o directório: -Error moving file: -Erro ao mover o ficheiro: -Error moving to Recycle Bin: -Erro ao mover para a Reciclagem: -Error opening file: -Erro ao abrir ficheiro: -Error parsing configuration file: -Erro de leitura do ficheiro de configuração: -Error reading file attributes: -Erro ao ler atributos do ficheiro: -Error reading file: -Erro de leitura de ficheiro: -Error reading from synchronization database: -Erro ao ler a base de dados de sincronização: -Error reading security context: -Erro ao ler contexto de segurança: -Error resolving symbolic link: -Erro na resolução do link simbólico: -Error setting directory lock: -Erro ao bloquear directório: -Error setting privilege: -Erro ao estabelecer privilégios: -Error starting Volume Shadow Copy Service! -Erro ao iniciar o serviço Volume Shadow Copy! -Error traversing directory: -Erro ao percorrer a pasta: -Error when monitoring directories. -Erro ao monitorizar os directórios. -Error writing file: -Erro de escrita no ficheiro: -Error writing security context: -Erro de escrita no contexto de segurança: -Error writing to synchronization database: -Erro na escrita da base de dados de sincronização: -Example -Exemplo -Exclude -Excluir -Exclude all rows -Excluir todas linhas -Exclude temporarily -Excluir temporariamente -Exclude via filter: -Excluir por filtro: -Exit instantly -Sair imediatamente -Extension -Extensão -External applications -Aplicações externas -Fatal Error -Erro fatal -Feedback and suggestions are welcome at: -Comentários e sugestões são benvindos em: -File %x has an invalid date! -Ficheiro %x tem data inválida! -File already exists. Overwrite? -O ficheiro já existe. Deseja substituir? -File content -Conteúdo do ficheiro -File does not exist: -O ficheiro não existe: -File list exported! -Lista dos ficheiros exportada! -File size and date -Data e tamanho do ficheiro -Filename -Nome do ficheiro -Files %x have the same date but a different size! -Os ficheiros %x têm a mesma data, mas tamanho diferente! -Files are found equal if\n - file content\nis the same -Os ficheiros são considerados iguais se\n - o conteúdo é o mesmo -Files are found equal if\n - filesize\n - last write time and date\nare the same -Os ficheiros são considerados iguais se\n - o tamanho\n - data e hora são iguais -Files that are equal on both sides -Ficheiros iguais dos dois lados -Files that exist on both sides, left one is newer -Ficheiros existentes dos dois lados, à esquerda é mais recente -Files that exist on both sides, right one is newer -Ficheiros existentes dos dois lados, à direita é mais recente -Files that have different content -Ficheiros com conteúdo diferente -Files/folders that exist on left side only -Ficheiros/pastas existentes somente à esquerda -Files/folders that exist on right side only -Ficheiros/pastas existentes somente à direita -Filter files -Filtrar ficheiros -Filter is active -Filtro activo -Filter settings have changed! -Opções de filtro alteradas! -Filter: All pairs -Filtro: Todos os pares -Filter: Single pair -Filtro: Par simples -Find -Procurar -Find what: -Procurar: -Folder Comparison and Synchronization -Comparação e Sincronização de pastas -Folder pairs -Par de directório -Follow -Seguir -Free disk space available: -Espaço livre em disco: -Free disk space required: -Espaço livre necessário em disco: -FreeFileSync Batch Job -FreeFileSync Ficheiro batch -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge -FreeFileSync batch file -FreeFileSync Ficheiro batch -FreeFileSync configuration -FreeFileSync configuração -FreeFileSync is up to date! -FreeFileSync está actualizado! -Full path -Caminho completo -Generating database... -A gerar base de dados... -Generating file list... -A gerar lista ficheiros... -Global settings -Opções -Help -Ajuda -Hidden dialogs: -Diálogos ocultos: -Hide all error and warning messages -Ocultar todas as mensagens de erro ou aviso -Hide conflicts -Ocultar conflitos -Hide excluded items -Ocultar itens excluidos -Hide files that are different -Ocultar ficheiros diferentes -Hide files that are equal -Ocultar ficheiros iguais -Hide files that are newer on left -Ocultar ficheiros mais recentes à esquerda -Hide files that are newer on right -Ocultar ficheiros mais recentes à direita -Hide files that exist on left side only -Ocultar ficheiros existentes somente à esquerda -Hide files that exist on right side only -Ocultar ficheiros existentes somente à direita -Hide files that will be created on the left side -Ocultar ficheiros a ser criados à esquerda -Hide files that will be created on the right side -Ocultar ficheiros a ser criados à direita -Hide files that will be deleted on the left side -Ocultar ficheiros a ser apagados à esquerda -Hide files that will be deleted on the right side -Ocultar ficheiros a ser apagados à direita -Hide files that will be overwritten on left side -Ocultar ficheiros a ser substituidos do lado esquerdo -Hide files that will be overwritten on right side -Ocultar ficheiros a ser substituidos do lado direito -Hide files that won't be copied -Ocultar ficheiros que não serão copiados -Hide filtered or temporarily excluded files -Ocultar ficheiros filtrados ou temporariamente excluidos -Hide further error messages during the current process -Ocultar próximas mensagens de erro durante este processo -Hints: -Dicas: -Homepage -Site -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente. -Idle time between detection of last change and execution of command line in seconds -Tempo de espera entre a última alteração e a execução do comando em segundos -If you like FFS -Se gosta do FreeFileSync -Ignore -Ignorar -Ignore errors -Ignorar erros -Ignore subsequent errors -Ignorar erros subsequentes -Include -Incluir -Include all rows -Incluir todas as linhas -Include temporarily -Incluir temporariamente -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\* -Incompatible synchronization database format: -Formato de base de dados de sincronização incompatÃvel: -Info -Info -Information -Informação -Initial synchronization: -Sincronização inicial: -Integrate external applications into context menu. The following macros are available: -Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis: -Invalid FreeFileSync config file! -Ficheiro de configuração do FreeFileSync inválido! -Last used configurations (press DEL to remove from list) -Última configuração utilizada (pressione DEL para remover da lista) -Leave as unresolved conflict -Deixar como conflito -Left -Esquerda -Legend -Legenda -Load configuration from file -Carregar configuração do ficheiro -Log-messages: -Log de mensagens: -Logging -A escrever em log -Main bar -Barra principal -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Fazer cópias fantasma em WOW64 não é suportado. Por favor usar a versão 64-bit. -Match case -Correspondência -Maximum number of logfiles: -Número máximo de ficheiros log: -Memory allocation failed! -Alocação de memória falhou! -Minimum Idle Time [seconds] -Tempo de espera [segundos] -Mirror ->> -Espelhar ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização. -Monitoring active... -Monitorizar activo... -More than 50% of the total number of files will be copied or deleted! -Mais de 50% dos ficheiros vai ser copiado ou apagado! -Move column down -Mover coluna para baixo -Move column up -Mover coluna para cima -Move files into a time-stamped subdirectory -Mover ficheiros para uma pasta com a data -Moving %x to Recycle Bin -A mover %x para a Reciclagem -Moving Symbolic Link %x to user-defined directory %y -A mover link simbólico %x para o directório %y -Moving file %x to user-defined directory %y -A mover ficheiro %x para o directório &y -Moving folder %x to user-defined directory %y -A mover pasta %x para o directório %y -Multiple... -Multiplo... -No change since last synchronization! -Não há alterações desde a sincronização! -No filter selected -Nenhum filtro seleccionado -Not enough free disk space available in: -Não há espaço livre suficiente em: -Nothing to synchronize according to configuration! -Nada a sincronizar de acordo com a configuração! -Number of files and directories that will be created -Número de itens a ser criados -Number of files and directories that will be deleted -Número de itens a ser eliminados -Number of files that will be overwritten -Número de ficheiros substituidos -One of the FreeFileSync database entries within the following file is not yet existing: -Uma das entradas da base de dados dentro do seguinte ficheiro não existe: -One of the FreeFileSync database files is not yet existing: -Um dos ficheiros da base de dados não existe: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Apenas ficheiros/directórios que passem o filtro serão seleccionados para sincronização. O filtro será aplicado ao nome relativo(!) ao directório base de sincronização. -Open with Explorer -Abrir com o Explorer -Open with default application -Abrir com a aplicação associada -Operation aborted! -Operação abortada! -Operation: -Operação: -Overview -Vista -Overwriting Symbolic Link %x in %y -Sobrepor link simbólico %x em %y -Overwriting file %x in %y -Sobrepor ficheiro %x em %y -Pause -Pausa -Paused -Em pausa -Planned directory deletion is in conflict with its subdirectories and -files! -Eliminação de directorio planeada está em conflito com subdirectorios e/ou ficheiros! -Please run a Compare first before synchronizing! -Use Comparar antes da primeira sincronização! -Press \"Switch\" to open FreeFileSync GUI mode. -Clique \"Trocar\" para abrir o GUI do FreeFileSync. -Processing folder pair: -A processar o par do directorio: -Published under the GNU General Public License: -Publicado sobre GNU General Public License: -Question -Questão -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronização Automática -RealtimeSync configuration -Configuração do RealtimeSync -Recycle Bin not yet supported for this system! -Reciclagem não é suportada para este sistema! -Relative path -Caminho -Remove alternate settings -Remover opções alternativas -Remove folder -Remover pasta(s) -Remove folder pair -Remover o par de pastas -Report translation error -Informar um erro de tradução -Reset -Reiniciar -Reset view -Restaurar vista -Restore all hidden dialogs? -Restaurar os diálogos escondidos? -Right -Direita -S&ave configuration... -G&uardar a configuração... -S&witch view -&Mudar vista -Save changes to current configuration? -Guardar alterações à configuração? -Save current configuration to file -Guardar o actual ficheiro de configuração -Scanning... -A pesquisar... -Scanning: -A pesquisar: -Select a folder -Seleccione uma pasta -Select alternate synchronization settings -Seleccionar opções alternativas de sincronização -Select logfile directory: -Seleccione directório para ficheiro log: -Select variant: -Seleccione uma variante: -Select view -Seleccionar vista -Set direction: -Escolher direcção: -Setting default synchronization directions: Old files will be overwritten with newer files. -Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituÃdos pelos novos. -Show \"%x\" -Mostrar \"%x\" -Show conflicts -Mostrar conflitos -Show files that are different -Mostrar ficheiros diferentes -Show files that are equal -Mostrar ficheiros iguais -Show files that are newer on left -Mostrar ficheiros mais recentes à esquerda -Show files that are newer on right -Mostrar ficheiros mais recentes à direita -Show files that exist on left side only -Mostrar ficheiros existentes somente à esquerda -Show files that exist on right side only -Mostrar ficheiros existentes somente à direita -Show files that will be created on the left side -Mostrar ficheiros a ser criados à esquerda -Show files that will be created on the right side -Mostrar ficheiros a ser criados à direita -Show files that will be deleted on the left side -Mostrar ficheiros a ser apagados à esquerda -Show files that will be deleted on the right side -Mostrar ficheiros a ser apagados à direita -Show files that will be overwritten on left side -Mostrar ficheiros a ser substituidos do lado esquerdo -Show files that will be overwritten on right side -Mostrar ficheiros a ser substituidos do lado direito -Show files that won't be copied -Mostrar ficheiros que não serão copiados -Show hidden dialogs -Mostrar diálogos ocultos -Show popup -Mostrar popups -Show popup on errors or warnings -Mostrar popup c/ erros ou avisos -Significant difference detected: -Diferença significativa detectada: -Silent mode -Modo silencioso -Size -Tamanho -Source code written completely in C++ utilizing: -Código fonte todo escrito em C++ utilizando: -Source directory does not exist anymore: -A pasta de origem já não existe: -Speed: -Velocidade: -Start -Iniciar -Start minimized and write status information to a logfile -Iniciar minimizado e escrever info de estado para o log -Start synchronization -Iniciar a sincronização -Statistics -EstatÃsticas -Status feedback -Retorno de estado -Stop -Parar -Swap sides -Trocar lados -Switching to FreeFileSync GUI mode... -A abrir o GUI do FreeFileSync... -Symbolic Link handling -Tratamento de links simbólicos -Symlinks %x have the same date but a different target! -Links simbólicos %x tem a mesma data mas diferente destino! -Synchronization Preview -Previsualizar sincronização -Synchronization aborted! -Sincronização abortada! -Synchronization completed successfully! -Sincronização completa com sucesso! -Synchronization completed with errors! -Sincronização completa com erros! -Synchronization settings -Parâmetros de sincronização -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizar todos os ficheiros .doc, .zip e .exe excepto os da pasta \"temp\". -Synchronize... -Sincronizar... -Synchronizing... -A sincronizar... -Target directory already existing! -Directório de destino já existe! -Target file already existing! -Ficheiro de destino já existe! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -A linha de comandos é executada cada vez que:\n- os directórios ficam disponÃveis (i.e. pen USB)\n- ficheiros nos directórios ou subdirectórios são modificados -The file does not contain a valid configuration: -O ficheiro não contém uma configuração válida: -The file was not processed by last synchronization! -O ficheiro não foi processado na última sincronização! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação. -Time -Hora -Time elapsed: -Tempo passado: -Time remaining: -Tempo restante: -Total amount of data that will be transferred -Volume de dados a ser transferido -Total time: -Tempo total: -Transfer file and directory permissions\n(Requires Administrator rights) -Transferir ficheiro e permissões\n(Requer direitos de administrador) -Unable to connect to sourceforge.net! -Não é possÃvel ligar a sourceforge.net! -Unable to create logfile! -Não é possÃvel criar ficheiro log! -Unresolved conflicts existing! -Existem conflitos por resolver! -Update -> -Actualizar -> -Updating attributes of %x -Actualizar atributos de %x -Usage: -Uso: -Use Recycle Bin -Utilizar Reciclagem -Use Recycle Bin when deleting or overwriting files -Utilizar Reciclagem ao apagar ou substituir ficheiros -User-defined directory for deletion was not specified! -Directório para eliminação não foi especificado! -Variant -Variável -Verifying file %x -A verificar ficheiro %x -Versioning +<header> + <language name>Português</language name> + <translator>QuestMark</translator> + <locale>pt_PT</locale> + <flag file>portugal.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> -Volume name %x not part of filename %y! -Nome do volume %x não faz parte do ficheiro %y! -Waiting for missing directories... -Aguardar pelos directórios em falta... -Waiting while directory is locked (%x)... -Aguardar enquanto o directório é bloqueado (%x)... -Warning -Atenção -When the comparison is started with this option set the following decision tree is processed: -Usar a seguinte árvore de decisão quando inicia com estas opções de comparação: -You can ignore conflicts and continue synchronization. -Pode ignorar os conflitos e continuar a sincronização. -You can ignore this error to consider the directory as empty. -Pode ignorar este erro para considerar o directório como vazio. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) ! -different -ficheiros diferentes -file exists on both sides -ficheiro existente em ambos os lados -on one side only -ficheiro existente apenas num lado +<source>Show in Explorer</source> +<target></target> +<source>Open with default application</source> +<target>Abrir com a aplicação associada</target> +<source>Browse directory</source> +<target>Procurar directório</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Sincronização Automática</target> +<source>Browse</source> +<target>Procurar</target> +<source>Error resolving symbolic link:</source> +<target>Erro na resolução do link simbólico:</target> +<source>Select alternate synchronization settings</source> +<target>Seleccionar opções alternativas de sincronização</target> +<source>No filter selected</source> +<target>Nenhum filtro seleccionado</target> +<source>Filter is active</source> +<target>Filtro activo</target> +<source>Clear filter settings</source> +<target>Limpar opções do filtro</target> +<source>Remove alternate settings</source> +<target>Remover opções alternativas</target> +<source>Create a batch job</source> +<target>Criar ficheiro batch</target> +<source>Synchronization settings</source> +<target>Parâmetros de sincronização</target> +<source>Comparison settings</source> +<target>Opções de Comparação</target> +<source>About</source> +<target>Sobre</target> +<source>Error</source> +<target>Erro</target> +<source>Warning</source> +<target>Atenção</target> +<source>Question</source> +<target>Questão</target> +<source>Confirm</source> +<target>Confirmar</target> +<source>Configure filter</source> +<target>Configuração dos filtros</target> +<source>Customize columns</source> +<target>Personalizar colunas</target> +<source>Global settings</source> +<target>Opções</target> +<source>Synchronization Preview</source> +<target>Previsualizar sincronização</target> +<source>Find</source> +<target>Procurar</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target></target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +</target> +<source><Symlink></source> +<target><Link Simbólico></target> +<source><Directory></source> +<target><Directório></target> +<source>Size</source> +<target>Tamanho</target> +<source>Date</source> +<target>Data</target> +<source>Full path</source> +<target>Caminho completo</target> +<source>Filename</source> +<target>Nome do ficheiro</target> +<source>Relative path</source> +<target>Caminho</target> +<source>Directory</source> +<target>Directório</target> +<source>Extension</source> +<target>Extensão</target> +<source>Comparison Result</source> +<target>Resultados da Comparação</target> +<source>Incompatible synchronization database format:</source> +<target>Formato de base de dados de sincronização incompatÃvel:</target> +<source>Initial synchronization:</source> +<target>Sincronização inicial:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Um dos ficheiros da base de dados não existe:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Uma das entradas da base de dados dentro do seguinte ficheiro não existe:</target> +<source>Error reading from synchronization database:</source> +<target>Erro ao ler a base de dados de sincronização:</target> +<source>An exception occurred!</source> +<target>Ocorreu uma excepção!</target> +<source>Error deleting file:</source> +<target>Erro ao eliminar o ficheiro:</target> +<source>Error reading file attributes:</source> +<target>Erro ao ler atributos do ficheiro:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Aguardar enquanto o directório é bloqueado (%x)...</target> +<source>Error setting directory lock:</source> +<target>Erro ao bloquear directório:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Erro fatal</target> +<source>File does not exist:</source> +<target>O ficheiro não existe:</target> +<source>Error parsing configuration file:</source> +<target>Erro de leitura do ficheiro de configuração:</target> +<source>Error writing file:</source> +<target>Erro de escrita no ficheiro:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Ficheiro de configuração do FreeFileSync inválido!</target> +<source>/sec</source> +<target>/seg</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +</target> +<source>S&ave configuration...</source> +<target>G&uardar a configuração...</target> +<source>&Load configuration...</source> +<target>&Carregar configuração...</target> +<source>&Quit</source> +<target>&Sair</target> +<source>&File</source> +<target>&Ficheiro</target> +<source>&Content</source> +<target>&Conteúdo</target> +<source>&About...</source> +<target>&Sobre...</target> +<source>&Help</source> +<target>&Ajuda</target> +<source>Usage:</source> +<target>Uso:</target> +<source>1. Select directories to monitor.</source> +<target>1. Seleccionar directórios a monitorizar.</target> +<source>2. Enter a command line.</source> +<target>2. Insira linha de comando.</target> +<source>3. Press 'Start'.</source> +<target>3. Pressione 'Iniciar'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +A linha de comandos é executada cada vez que: +- os directórios ficam disponÃveis (i.e. pen USB) +- ficheiros nos directórios ou subdirectórios são modificados +</target> +<source>Directories to watch</source> +<target>Directórios a observar</target> +<source>Add folder</source> +<target>Adicionar pasta</target> +<source>Remove folder</source> +<target>Remover pasta(s)</target> +<source>Select a folder</source> +<target>Seleccione uma pasta</target> +<source>Command line</source> +<target>Linha de comandos</target> +<source>Minimum Idle Time [seconds]</source> +<target>Tempo de espera [segundos]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Tempo de espera entre a última alteração e a execução do comando em segundos</target> +<source>Start</source> +<target>Iniciar</target> +<source>(Build: %x)</source> +<target>(Build: %x)</target> +<source>RealtimeSync configuration</source> +<target>Configuração do RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>O ficheiro já existe. Deseja substituir?</target> +<source>&Restore</source> +<target>&Restaurar</target> +<source>&Exit</source> +<target>&Sair</target> +<source>Monitoring active...</source> +<target>Monitorizar activo...</target> +<source>Waiting for missing directories...</source> +<target>Aguardar pelos directórios em falta...</target> +<source>Command line is empty!</source> +<target>Linha de comandos vazia!</target> +<source>Could not initialize directory monitoring:</source> +<target>Não é possÃvel iniciar monitorização do directório:</target> +<source>A directory input field is empty.</source> +<target>Um campo de directório está vazio.</target> +<source>Error when monitoring directories.</source> +<target>Erro ao monitorizar os directórios.</target> +<source>Drag && drop</source> +<target>Pegar && largar</target> +<source>Conversion error:</source> +<target>Erro de conversão:</target> +<source>Error moving file:</source> +<target>Erro ao mover o ficheiro:</target> +<source>Operation aborted!</source> +<target>Operação abortada!</target> +<source>Target file already existing!</source> +<target>Ficheiro de destino já existe!</target> +<source>Error moving directory:</source> +<target>Erro ao mover o directório:</target> +<source>Target directory already existing!</source> +<target>Directório de destino já existe!</target> +<source>Error deleting directory:</source> +<target>Erro ao eliminar a pasta:</target> +<source>Error changing modification time:</source> +<target>Erro ao mudar a hora de modificação:</target> +<source>Error loading library function:</source> +<target>Erro ao carregar a livraria:</target> +<source>Error reading security context:</source> +<target>Erro ao ler contexto de segurança:</target> +<source>Error writing security context:</source> +<target>Erro de escrita no contexto de segurança:</target> +<source>Error copying file permissions:</source> +<target>Erro ao copiar permissões dos ficheiros:</target> +<source>Error creating directory:</source> +<target>Erro ao criar a pasta:</target> +<source>Error copying symbolic link:</source> +<target>Erro ao copiar o link:</target> +<source>Error copying file:</source> +<target>Erro ao copiar ficheiro:</target> +<source>Error opening file:</source> +<target>Erro ao abrir ficheiro:</target> +<source>Error reading file:</source> +<target>Erro de leitura de ficheiro:</target> +<source>Endless loop when traversing directory:</source> +<target>Loop infinito ao percorrer directório:</target> +<source>Error traversing directory:</source> +<target>Erro ao percorrer a pasta:</target> +<source>Error setting privilege:</source> +<target>Erro ao estabelecer privilégios:</target> +<source>Error moving to Recycle Bin:</source> +<target>Erro ao mover para a Reciclagem:</target> +<source>Could not load a required DLL:</source> +<target>Não foi possÃvel carregar a DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Erro na escrita da base de dados de sincronização:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Erro ao iniciar o serviço Volume Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Fazer cópias fantasma em WOW64 não é suportado. Por favor usar a versão 64-bit.</target> +<source>Could not determine volume name for file:</source> +<target>Não é possÃvel determinar o nome do volume para o ficheiro:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Nome do volume %x não faz parte do ficheiro %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Não foi possÃvel ler os valores dos seguintes nós XML:</target> +<source>Show popup</source> +<target>Mostrar popups</target> +<source>Show popup on errors or warnings</source> +<target>Mostrar popup c/ erros ou avisos</target> +<source>Ignore errors</source> +<target>Ignorar erros</target> +<source>Hide all error and warning messages</source> +<target>Ocultar todas as mensagens de erro ou aviso</target> +<source>Exit instantly</source> +<target>Sair imediatamente</target> +<source>Abort synchronization immediately</source> +<target>Abortar sincronização imediatamente</target> +<source>Logging</source> +<target>A escrever em log</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync Ficheiro batch</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync configuração</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Ficheiro batch</target> +<source>Unable to create logfile!</source> +<target>Não é possÃvel criar ficheiro log!</target> +<source>Batch execution</source> +<target>Execução do batch</target> +<source>Log-messages:</source> +<target>Log de mensagens:</target> +<source>Stop</source> +<target>Parar</target> +<source>Total time:</source> +<target>Tempo total:</target> +<source>Synchronization aborted!</source> +<target>Sincronização abortada!</target> +<source>Synchronization completed with errors!</source> +<target>Sincronização completa com erros!</target> +<source>Synchronization completed successfully!</source> +<target>Sincronização completa com sucesso!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Clique "Trocar" para abrir o GUI do FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>A abrir o GUI do FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Não é possÃvel ligar a sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Mais recente versão do FreeFileSync disponÃvel:</target> +<source>Download now?</source> +<target>Fazer download agora?</target> +<source>Information</source> +<target>Informação</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync está actualizado!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas?</target> +<source>(Requires an Internet connection!)</source> +<target>(Necessita acesso à Internet!)</target> +<source>1. &Compare</source> +<target>1. &Comparar</target> +<source>2. &Synchronize...</source> +<target>2. &Sincronizar...</target> +<source>S&witch view</source> +<target>&Mudar vista</target> +<source>&New</source> +<target>&Novo</target> +<source>&Program</source> +<target>&Programa</target> +<source>&Language</source> +<target>&LÃngua</target> +<source>&Global settings...</source> +<target>&Opções......</target> +<source>&Create batch job...</source> +<target>&Criar um ficheiro batch...</target> +<source>&Export file list...</source> +<target>&Exportar lista de ficheiros...</target> +<source>&Advanced</source> +<target>&Avançado</target> +<source>&Check for new version</source> +<target>&Procurar actualizações</target> +<source>Compare</source> +<target>Comparar</target> +<source>Compare both sides</source> +<target>Comparar listas</target> +<source>&Abort</source> +<target>&Abortar</target> +<source>Synchronize...</source> +<target>Sincronizar...</target> +<source>Start synchronization</source> +<target>Iniciar a sincronização</target> +<source>Swap sides</source> +<target>Trocar lados</target> +<source>Add folder pair</source> +<target>Adicionar um par de pastas</target> +<source>Remove folder pair</source> +<target>Remover o par de pastas</target> +<source>Save current configuration to file</source> +<target>Guardar o actual ficheiro de configuração</target> +<source>Load configuration from file</source> +<target>Carregar configuração do ficheiro</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Última configuração utilizada (pressione DEL para remover da lista)</target> +<source>Hide excluded items</source> +<target>Ocultar itens excluidos</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Ocultar ficheiros filtrados ou temporariamente excluidos</target> +<source>Number of files and directories that will be created</source> +<target>Número de itens a ser criados</target> +<source>Number of files that will be overwritten</source> +<target>Número de ficheiros substituidos</target> +<source>Number of files and directories that will be deleted</source> +<target>Número de itens a ser eliminados</target> +<source>Total amount of data that will be transferred</source> +<target>Volume de dados a ser transferido</target> +<source>Left</source> +<target>Esquerda</target> +<source>Right</source> +<target>Direita</target> +<source>Batch job</source> +<target>Ficheiro Batch</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Criar um batch para sincronização automática. Para iniciar o modo batch, passar o nome do ficheiro para o executável do FreeFileSync: FreeFileSync.exe <ficheiro batch>. Também pode ser calendarizado no programador de tarefas.</target> +<source>Help</source> +<target>Ajuda</target> +<source>Configuration overview:</source> +<target>Parametros de configuração:</target> +<source>Filter files</source> +<target>Filtrar ficheiros</target> +<source>Status feedback</source> +<target>Retorno de estado</target> +<source>Silent mode</source> +<target>Modo silencioso</target> +<source>Start minimized and write status information to a logfile</source> +<target>Iniciar minimizado e escrever info de estado para o log</target> +<source>Error handling</source> +<target>Controlador de erros</target> +<source>Overview</source> +<target>Vista</target> +<source>Select logfile directory:</source> +<target>Seleccione directório para ficheiro log:</target> +<source>Maximum number of logfiles:</source> +<target>Número máximo de ficheiros log:</target> +<source>&Save</source> +<target>&Guardar</target> +<source>&Load</source> +<target>&Carregar</target> +<source>&Cancel</source> +<target>&Cancelar</target> +<source>Elements found:</source> +<target>Elementos encontrados:</target> +<source>Elements remaining:</source> +<target>Elementos restantes:</target> +<source>Speed:</source> +<target>Velocidade:</target> +<source>Time remaining:</source> +<target>Tempo restante:</target> +<source>Time elapsed:</source> +<target>Tempo passado:</target> +<source>Operation:</source> +<target>Operação:</target> +<source>Select variant:</source> +<target>Seleccione uma variante:</target> +<source><Automatic></source> +<target><Automático></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente.</target> +<source>Mirror ->></source> +<target>Espelhar ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização.</target> +<source>Update -></source> +<target>Actualizar -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copiar ficheiros novos ou actualizados para a direita</target> +<source>Custom</source> +<target>Personalizado</target> +<source>Configure your own synchronization rules.</source> +<target>Configure as suas regras de sincronização.</target> +<source>Deletion handling</source> +<target>Controlo eliminação</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuração</target> +<source>Category</source> +<target>Categoria</target> +<source>Action</source> +<target>Acção</target> +<source>Files/folders that exist on left side only</source> +<target>Ficheiros/pastas existentes somente à esquerda</target> +<source>Files/folders that exist on right side only</source> +<target>Ficheiros/pastas existentes somente à direita</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Ficheiros existentes dos dois lados, à esquerda é mais recente</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Ficheiros existentes dos dois lados, à direita é mais recente</target> +<source>Files that have different content</source> +<target>Ficheiros com conteúdo diferente</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflitos/ficheiros que não podem ser categorizados</target> +<source>Compare by...</source> +<target>Comparar por...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Os ficheiros são considerados iguais se + - o tamanho + - data e hora são iguais +</target> +<source>File size and date</source> +<target>Data e tamanho do ficheiro</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Os ficheiros são considerados iguais se + - o conteúdo é o mesmo +</target> +<source>File content</source> +<target>Conteúdo do ficheiro</target> +<source>Symbolic Link handling</source> +<target>Tratamento de links simbólicos</target> +<source>Synchronizing...</source> +<target>A sincronizar...</target> +<source>Elements processed:</source> +<target>Elementos processados:</target> +<source>&Pause</source> +<target>&Pausa</target> +<source>Compare by "File size and date"</source> +<target>Comparar por "Data e tamanho dos ficheiros"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Usar a seguinte árvore de decisão quando inicia com estas opções de comparação:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Como resultado, os ficheiros foram separados nas seguintes categorias:</target> +<source>- equal</source> +<target>- ficheiros iguais</target> +<source>- left newer</source> +<target>- mais novo à esquerda</target> +<source>- right newer</source> +<target>- mais novo à direita</target> +<source>- exists left only</source> +<target>- existe apenas à esquerda</target> +<source>- exists right only</source> +<target>- existe apenas à direita</target> +<source>- conflict</source> +<target>- conflito</target> +<source>Compare by "File content"</source> +<target>Comparar por "Conteúdo dos ficheiros"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta. + +Com esta opção, a arvoré de decisão é menor: +</target> +<source>- different</source> +<target>- ficheiros diferentes</target> +<source>Source code written in C++ utilizing:</source> +<target></target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Pela tradução de FreeFileSync, um agradecimento a:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Comentários e sugestões são benvindos em:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync na Sourceforge</target> +<source>Homepage</source> +<target>Site</target> +<source>If you like FFS</source> +<target>Se gosta do FreeFileSync</target> +<source>Donate with PayPal</source> +<target>Doar usando PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Informar um erro de tradução</target> +<source>Published under the GNU General Public License:</source> +<target>Publicado sobre GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Ignorar erros subsequentes</target> +<source>Hide further error messages during the current process</source> +<target>Ocultar próximas mensagens de erro durante este processo</target> +<source>&Ignore</source> +<target>&Ignorar</target> +<source>&Retry</source> +<target>&Tentar de Novo</target> +<source>Do not show this dialog again</source> +<target>Não mostrar novamente</target> +<source>&Switch</source> +<target>&Trocar</target> +<source>&Yes</source> +<target>&Sim</target> +<source>&No</source> +<target>&Não</target> +<source>Delete on both sides</source> +<target>Eliminar em ambos os lados</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado</target> +<source>Use Recycle Bin</source> +<target>Utilizar Reciclagem</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target></target> +<source>Hints:</source> +<target>Dicas:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Inserir caminho(s) do(s) ficheiro(s) ou pasta(s) separados por ';' ou numa nova linha.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Usar '*' e '?' como caracteres de procura.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Excluir ficheiros directamente da grelha através do menu de contexto.</target> +<source>Example</source> +<target>Exemplo</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target></target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sincronizar todos os ficheiros .doc, .zip e .exe excepto os da pasta "temp".</target> +<source>Include</source> +<target>Incluir</target> +<source>Exclude</source> +<target>Excluir</target> +<source>Select time span:</source> +<target></target> +<source>Minimum file size:</source> +<target></target> +<source>Maximum file size:</source> +<target></target> +<source>&Default</source> +<target>&Config. Iniciais</target> +<source>Move column up</source> +<target>Mover coluna para cima</target> +<source>Move column down</source> +<target>Mover coluna para baixo</target> +<source>Copy locked files</source> +<target>Copiar ficheiros bloqueados</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy + (Requer direitos de administrador) +</target> +<source>Copy filesystem permissions</source> +<target>Copiar permissões do sistema de ficheiros</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transferir ficheiro e permissões +(Requer direitos de administrador) +</target> +<source>Hidden dialogs:</source> +<target>Diálogos ocultos:</target> +<source>Reset</source> +<target>Reiniciar</target> +<source>Show hidden dialogs</source> +<target>Mostrar diálogos ocultos</target> +<source>External applications</source> +<target>Aplicações externas</target> +<source>Description</source> +<target>Descrição</target> +<source>Variant</source> +<target>Variável</target> +<source>Statistics</source> +<target>EstatÃsticas</target> +<source>Find what:</source> +<target>Procurar:</target> +<source>Match case</source> +<target>Correspondência</target> +<source>&Find next</source> +<target>&Procurar seguinte</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) !</target> +<source>Batch file created successfully!</source> +<target>Ficheiro batch criado com sucesso!</target> +<source>Main bar</source> +<target>Barra principal</target> +<source>Folder pairs</source> +<target>Par de directório</target> +<source>Select view</source> +<target>Seleccionar vista</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparação e Sincronização de pastas</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Reciclagem não é suportada para este sistema!</target> +<source>Set direction:</source> +<target>Escolher direcção:</target> +<source>Exclude temporarily</source> +<target>Excluir temporariamente</target> +<source>Include temporarily</source> +<target>Incluir temporariamente</target> +<source>Exclude via filter:</source> +<target>Excluir por filtro:</target> +<source><multiple selection></source> +<target><Selecção Múltipla></target> +<source>D-Click</source> +<target>Duplo Clique</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copiar para a Ãrea de transferência CTRL+C</target> +<source>Delete files DEL</source> +<target>Eliminar ficheiros DEL</target> +<source>Customize...</source> +<target>Personalizar...</target> +<source>Auto-adjust columns</source> +<target>Auto ajustar colunas</target> +<source>Include all rows</source> +<target>Incluir todas as linhas</target> +<source>Exclude all rows</source> +<target>Excluir todas linhas</target> +<source>Reset view</source> +<target>Restaurar vista</target> +<source>Show "%x"</source> +<target>Mostrar "%x"</target> +<source><Last session></source> +<target><Última Sessão></target> +<source>Configuration saved!</source> +<target>Configuração guardada!</target> +<source>Save changes to current configuration?</source> +<target>Guardar alterações à configuração?</target> +<source>Configuration loaded!</source> +<target>Configuração carregada!</target> +<source>Hide files that exist on left side only</source> +<target>Ocultar ficheiros existentes somente à esquerda</target> +<source>Show files that exist on left side only</source> +<target>Mostrar ficheiros existentes somente à esquerda</target> +<source>Hide files that exist on right side only</source> +<target>Ocultar ficheiros existentes somente à direita</target> +<source>Show files that exist on right side only</source> +<target>Mostrar ficheiros existentes somente à direita</target> +<source>Hide files that are newer on left</source> +<target>Ocultar ficheiros mais recentes à esquerda</target> +<source>Show files that are newer on left</source> +<target>Mostrar ficheiros mais recentes à esquerda</target> +<source>Hide files that are newer on right</source> +<target>Ocultar ficheiros mais recentes à direita</target> +<source>Show files that are newer on right</source> +<target>Mostrar ficheiros mais recentes à direita</target> +<source>Hide files that are equal</source> +<target>Ocultar ficheiros iguais</target> +<source>Show files that are equal</source> +<target>Mostrar ficheiros iguais</target> +<source>Hide files that are different</source> +<target>Ocultar ficheiros diferentes</target> +<source>Show files that are different</source> +<target>Mostrar ficheiros diferentes</target> +<source>Hide conflicts</source> +<target>Ocultar conflitos</target> +<source>Show conflicts</source> +<target>Mostrar conflitos</target> +<source>Hide files that will be created on the left side</source> +<target>Ocultar ficheiros a ser criados à esquerda</target> +<source>Show files that will be created on the left side</source> +<target>Mostrar ficheiros a ser criados à esquerda</target> +<source>Hide files that will be created on the right side</source> +<target>Ocultar ficheiros a ser criados à direita</target> +<source>Show files that will be created on the right side</source> +<target>Mostrar ficheiros a ser criados à direita</target> +<source>Hide files that will be deleted on the left side</source> +<target>Ocultar ficheiros a ser apagados à esquerda</target> +<source>Show files that will be deleted on the left side</source> +<target>Mostrar ficheiros a ser apagados à esquerda</target> +<source>Hide files that will be deleted on the right side</source> +<target>Ocultar ficheiros a ser apagados à direita</target> +<source>Show files that will be deleted on the right side</source> +<target>Mostrar ficheiros a ser apagados à direita</target> +<source>Hide files that will be overwritten on left side</source> +<target>Ocultar ficheiros a ser substituidos do lado esquerdo</target> +<source>Show files that will be overwritten on left side</source> +<target>Mostrar ficheiros a ser substituidos do lado esquerdo</target> +<source>Hide files that will be overwritten on right side</source> +<target>Ocultar ficheiros a ser substituidos do lado direito</target> +<source>Show files that will be overwritten on right side</source> +<target>Mostrar ficheiros a ser substituidos do lado direito</target> +<source>Hide files that won't be copied</source> +<target>Ocultar ficheiros que não serão copiados</target> +<source>Show files that won't be copied</source> +<target>Mostrar ficheiros que não serão copiados</target> +<source>All directories in sync!</source> +<target>Todas as pastas sincronizadas!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Use Comparar antes da primeira sincronização!</target> +<source>Comma separated list</source> +<target>Lista de itens separados por virgula</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Lista dos ficheiros exportada!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +</target> +<source>Scanning...</source> +<target>A pesquisar...</target> +<source>Comparing content...</source> +<target>A comparar...</target> +<source>Paused</source> +<target>Em pausa</target> +<source>Aborted</source> +<target>Abortado</target> +<source>Completed</source> +<target>Terminado</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abortar pedido: À espera do fim da operação...</target> +<source>Continue</source> +<target>Continuar</target> +<source>Pause</source> +<target>Pausa</target> +<source>Cannot find %x</source> +<target>Não é possÃvel descobrir %x</target> +<source>DECISION TREE</source> +<target>ÃRVORE DE DECISÃO</target> +<source>file exists on both sides</source> +<target>ficheiro existente em ambos os lados</target> +<source>on one side only</source> +<target>ficheiro existente apenas num lado</target> +<source>- left</source> +<target>- esquerda</target> +<source>- right</source> +<target>- direita</target> +<source>different</source> +<target>ficheiros diferentes</target> +<source>- conflict (same date, different size)</source> +<target>- conflito (mesma data, tamanho diferente)</target> +<source>Inactive</source> +<target></target> +<source>Second</source> +<target></target> +<source>Minute</source> +<target></target> +<source>Hour</source> +<target></target> +<source>Day</source> +<target></target> +<source>Byte</source> +<target></target> +<source>KB</source> +<target></target> +<source>MB</source> +<target></target> +<source>Filter: All pairs</source> +<target>Filtro: Todos os pares</target> +<source>Filter: Single pair</source> +<target>Filtro: Par simples</target> +<source>Ignore</source> +<target>Ignorar</target> +<source>Direct</source> +<target>Direto</target> +<source>Follow</source> +<target>Seguir</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis:</target> +<source>- full file or directory name</source> +<target>- nome completo do ficheiro ou directório</target> +<source>- directory part only</source> +<target>- apenas parte do directório</target> +<source>- Other side's counterpart to %name</source> +<target>- Contrapartida de %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Contrapartida de %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Restaurar os diálogos escondidos?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +</target> +<source>Leave as unresolved conflict</source> +<target>Deixar como conflito</target> +<source>Delete permanently</source> +<target>Apagar permanentemente</target> +<source>Delete or overwrite files permanently</source> +<target>Apagar ou substituir ficheiros permanentemente</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target> +<source>Versioning</source> +<target></target> +<source>Move files into a time-stamped subdirectory</source> +<target>Mover ficheiros para uma pasta com a data</target> +<source>Cannot determine sync-direction:</source> +<target>Não é possÃvel saber a direcção de sincronização:</target> +<source>Filter settings have changed!</source> +<target>Opções de filtro alteradas!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Ambos os lados tiveram alterações desde a última sincronização!</target> +<source>No change since last synchronization!</source> +<target>Não há alterações desde a sincronização!</target> +<source>The file was not processed by last synchronization!</source> +<target>O ficheiro não foi processado na última sincronização!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Eliminação de directorio planeada está em conflito com subdirectorios e/ou ficheiros!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituÃdos pelos novos.</target> +<source>The file does not contain a valid configuration:</source> +<target>O ficheiro não contém uma configuração válida:</target> +<source>Scanning:</source> +<target>A pesquisar:</target> +<source>Encoding extended time information: %x</source> +<target>A codificar dados temporais extendidos: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Pode ignorar este erro para considerar o directório como vazio.</target> +<source>Directory does not exist:</source> +<target>A pasta não existe:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Directórios são dependentes! Cuidado ao definir as regras de sincronização:</target> +<source>Comparing content of files %x</source> +<target>A comparar o conteúdo do ficheiro %x</target> +<source>Memory allocation failed!</source> +<target>Alocação de memória falhou!</target> +<source>File %x has an invalid date!</source> +<target>Ficheiro %x tem data inválida!</target> +<source>Conflict detected:</source> +<target>Conflito detectado:</target> +<source>Files %x have the same date but a different size!</source> +<target>Os ficheiros %x têm a mesma data, mas tamanho diferente!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Links simbólicos %x tem a mesma data mas diferente destino!</target> +<source>Comparing files by content failed.</source> +<target>A comparação de ficheiros por conteúdo falhou.</target> +<source>Generating file list...</source> +<target>A gerar lista ficheiros...</target> +<source>Multiple...</source> +<target>Multiplo...</target> +<source>Files that are equal on both sides</source> +<target>Ficheiros iguais dos dois lados</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Ficheiros/Pastas iguais que diferem apenas nos atributos</target> +<source>Copy from right to left</source> +<target>Copiar da direita para a esquerda</target> +<source>Copy from left to right</source> +<target>Copiar da esquerda para a direita</target> +<source>Delete files/folders existing on left side only</source> +<target>Eliminar itens existentes apenas no lado esquerdo</target> +<source>Delete files/folders existing on right side only</source> +<target>Eliminar itens existentes apenas no lado direito</target> +<source>Copy from right to left overwriting</source> +<target>Copiar da direita para a esquerda com sobreposição</target> +<source>Copy from left to right overwriting</source> +<target>Copiar da esquerda para a direita com sobreposição</target> +<source>Do nothing</source> +<target>Não fazer nada</target> +<source>Copy attributes only from right to left</source> +<target>Copiar atributos apenas da direita para a esquerda</target> +<source>Copy attributes only from left to right</source> +<target>Copiar atributos apenas da esquerda para a direita</target> +<source>Deleting file %x</source> +<target>Apagar ficheiro %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Apagar link simbólico %x</target> +<source>Deleting folder %x</source> +<target>Apagar pasta %x</target> +<source>Moving %x to Recycle Bin</source> +<target>A mover %x para a Reciclagem</target> +<source>Moving file %x to user-defined directory %y</source> +<target>A mover ficheiro %x para o directório &y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>A mover pasta %x para o directório %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>A mover link simbólico %x para o directório %y</target> +<source>Copying new file %x to %y</source> +<target>Copiar novo ficheiro %x para %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copiar novo link simbólico %x para %y</target> +<source>Overwriting file %x in %y</source> +<target>Sobrepor ficheiro %x em %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Sobrepor link simbólico %x em %y</target> +<source>Creating folder %x</source> +<target>Criar pasta %x</target> +<source>Verifying file %x</source> +<target>A verificar ficheiro %x</target> +<source>Updating attributes of %x</source> +<target>Actualizar atributos de %x</target> +<source>Source directory does not exist anymore:</source> +<target>A pasta de origem já não existe:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Nada a sincronizar de acordo com a configuração!</target> +<source>Target directory name must not be empty!</source> +<target></target> +<source>User-defined directory for deletion was not specified!</source> +<target>Directório para eliminação não foi especificado!</target> +<source>Unresolved conflicts existing!</source> +<target>Existem conflitos por resolver!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Pode ignorar os conflitos e continuar a sincronização.</target> +<source>Significant difference detected:</source> +<target>Diferença significativa detectada:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Mais de 50% dos ficheiros vai ser copiado ou apagado!</target> +<source>Not enough free disk space available in:</source> +<target>Não há espaço livre suficiente em:</target> +<source>Free disk space required:</source> +<target>Espaço livre necessário em disco:</target> +<source>Free disk space available:</source> +<target>Espaço livre em disco:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Um directório que pertencente a conjunto de vários directórios vai ser alterado! Por favor, verifique as opções de sincronização!</target> +<source>Processing folder pair:</source> +<target>A processar o par do directorio:</target> +<source>Generating database...</source> +<target>A gerar base de dados...</target> +<source>Error copying locked file %x!</source> +<target>Erro ao copiar ficheiro bloqueado %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente!</target> diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index d0e6d266..a7827513 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -1,912 +1,1049 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objetos apagados com sucesso -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dia(s) -%x directories -%x diretórios -%x files -%x arquivos -%x hour(s) -%x hora(s) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x de %y arquivos -%x of 1 row in view -%x de 1 linha -%x sec -%x seg -%x% -%x% -&Abort -&Abortar -&About... -&Sobre... -&Advanced -&Avançado -&Cancel -&Cancelar -&Check for new version -&Procurar novas versões -&Content -&Conteúdo -&Create batch job... -C&riar um arquivo batch... -&Default -&Config. Padrão -&Exit -&Sair -&Export file list... -&Exportar lista de arquivos... -&File -&Arquivo -&Find next -&Localizar próxima -&Global settings... -&Configurações... -&Help -&Ajuda -&Ignore -&Ignorar -&Language -&Idioma -&Load -&Carregar -&Load configuration... -&Carregar configuração... -&New -&Novo -&No -&Não -&OK -&OK -&Pause -&Pausa -&Program -&Programa -&Quit -&Sair -&Restore -&Restaurar -&Retry -&Tentar Novamente -&Save -&Salvar -&Switch -&Alterar -&Yes -&Sim -(Build: %x) -(Versão: %x) -(Requires an Internet connection!) -(Requer conexão com a Internet!) -- Other side's counterpart to %dir -- Correspondente do outro lado a %dir -- Other side's counterpart to %name -- Correspondente do outro lado a %name -- conflict -- conflito -- conflict (same date, different size) -- conflito (mesma data, tamanho diferente) -- different -- diferente -- directory part only -- apenas a parte do diretório -- equal -- igual -- exists left only -- existe apenas à esquerda -- exists right only -- existe apenas à direita -- full file or directory name -- nome completo do arquivo ou diretório -- left -- esquerda -- left newer -- mais recente à esquerda -- right -- direita -- right newer -- mais recente à direita -/sec -/seg -1 directory -1 diretório -1 file -1 arquivo -1. &Compare -1. C&omparar -1. Enter relative file or directory names separated by ';' or a new line. -1. Entre os nomes dos arquivos ou diretórios relativos separados por ';' ou uma nova linha. -1. Select directories to monitor. -1. Selecione os diretórios para monitorar. -2. &Synchronize... -2. S&incronizar... -2. Enter a command line. -2. Entre uma linha de comando. -2. Use wildcard characters '*' and '?'. -2. Usar '*' e '?' como caracteres coringa. -3. Exclude files directly on main grid via context menu. -3. Excluir arquivos diretamente do grid principal através do menu de contexto. -3. Press 'Start'. -3. Pressione 'Iniciar'. -<Automatic> -<Automático> -<Directory> -<Diretório> -<Last session> -<Última Sessão> -<Symlink> -<Link Simbólico> -<multiple selection> -<seleção múltipla> -A directory input field is empty. -Um campo de entrada de diretório está vazio. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Um diretório será modificado o qual é parte de múltiplos pares de pastas! Por favor revise suas configurações de sincronização! -A newer version of FreeFileSync is available: -Uma nova versão do FreeFileSync foi encontrada: -Abort requested: Waiting for current operation to finish... -Cancelar solicitado: Esperando fim da operação... -Abort synchronization immediately -Cancelar a sincronização imediatamente -Aborted -Cancelado -About -Sobre -Action -Ação -Add folder -Adicionar pasta -Add folder pair -Adicionar par de pastas -All directories in sync! -Todos os diretórios em sincronismo! -An exception occurred! -Ocorreu uma exceção! -As a result the files are separated into the following categories: -Como resultado, os arquivos são separados nas seguintes categorias: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Como o nome sugere, dois arquivos com o mesmo nome são assinalados como iguais se e somente se eles tiverem o mesmo conteúdo. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos arquivos não é levada em consideração.\n\nCom esta opção, a árvore de decisão é menor: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Monta um arquivo batch para sincronização automatizada. Para iniciar o modo batch, passar o nome do arquivo para o executável do FreeFileSync: FreeFileSync.exe <arquivo batch>. Também pode ser programado no Agendador de Tarefas do sistema operacional. -At least one directory input field is empty. -Pelo menos um dos campos de entrada de diretório está vazio. -Auto-adjust columns -Autoajustar colunas -Batch execution -Execução do batch -Batch file created successfully! -Arquivo batch criado com sucesso! -Batch job -Arquivo Batch -Big thanks for localizing FreeFileSync goes out to: -Pela tradução do FreeFileSync, um agradecimento a: -Both sides have changed since last synchronization! -Ambos os lados foram alterados desde a última sincronização! -Browse -Procurar -Browse directory -Navegar pelo diretório -Cannot determine sync-direction: -Não foi possÃvel determinar a direção de sincronização: -Cannot find %x -Não foi possÃvel encontrar %x -Cannot write to empty directory path! +<header> + <language name>Português do Brasil</language name> + <translator>Edison Aranha</translator> + <locale>pt_BR</locale> + <flag file>brazil.png</flag file> + <plural forms>2</plural forms> + <plural definition>n <= 1 ? 0 : 1</plural definition> +</header> -Category -Categoria -Clear filter settings -Limpar configurações do filtro -Comma separated list -Lista de itens separada por vÃrgula -Command line -Linha de comando -Command line is empty! -Linha de comando está vazia! -Compare -Comparar -Compare both sides -Comparar os dois lados -Compare by \"File content\" -Comparar por \"Conteúdo dos arquivos\" -Compare by \"File size and date\" -Comparar por \"Data e tamanho dos arquivos\" -Compare by... -Comparar por... -Comparing content of files %x -Comparando conteúdo do arquivo %x -Comparing content... -Comparando conteúdo... -Comparing files by content failed. -Comparação de arquivos pelo conteúdo falhou. -Comparison Result -Resultado da Comparação -Comparison settings -Configurações da comparação -Completed -Finalizado -Configuration -Configuração -Configuration loaded! -Configuração carregada! -Configuration overview: -Parâmetros de configuração: -Configuration saved! -Configuração salva! -Configure filter -Configurar filtros -Configure your own synchronization rules. -Configure as suas próprias regras de sincronização. -Confirm -Confirmar -Conflict detected: -Conflito detectado: -Conflicts/files that cannot be categorized -Conflitos/arquivos que não podem ser categorizados -Continue -Continuar -Conversion error: -Erro de conversão: -Copy attributes only from left to right -Copiar atributos somente da esquerda para a direita -Copy attributes only from right to left -Copiar atributos somente da direita para a esquerda -Copy filesystem permissions -Copiar permissões de arquivos e diretórios -Copy from left to right -Copiar da esquerda para a direita -Copy from left to right overwriting -Copiar da esquerda para a direita substituindo -Copy from right to left -Copiar da direita para a esquerda -Copy from right to left overwriting -Copiar da direita para a esquerda substituindo -Copy locked files -Copiar arquivos bloqueados (em uso) -Copy new or updated files to right folder. -Copiar arquivos novos ou atualizados para a pasta da direita -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copiar arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópias de Sombra de Volume\n(Requer direitos de Administrador) -Copy to clipboard\tCTRL+C -Copiar para a Ãrea de transferência\tCTRL+C -Copying new Symbolic Link %x to %y -Copiando novo Link Simbólico %x para %y -Copying new file %x to %y -Copiando novo arquivo %x para %y -Could not determine volume name for file: -Não foi possÃvel determinar o nome do volume para o arquivo: -Could not initialize directory monitoring: -Não foi possÃvel inicializar o monitoramento de diretórios: -Could not load a required DLL: -Não foi possÃvel carregar uma DLL requerida: -Could not read values for the following XML nodes: -Não foi possÃvel ler os valores para os seguintes nós XML: -Create a batch job -Criar arquivo batch -Creating folder %x -Criando pasta %x -Custom -Personalizado -Customize columns -Personalizar colunas -Customize... -Personalizar... -D-Click -Duplo Click -DECISION TREE -ÃRVORE DE DECISÃO -Data verification error: Source and target file have different content! -Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo! -Date -Data -Delete files/folders existing on left side only -Apagar arquivos/pastas existentes apenas no lado esquerdo -Delete files/folders existing on right side only -Apagar arquivos/pastas existentes apenas no lado direito -Delete files\tDEL -Apagar arquivos\tDEL -Delete on both sides -Apagar em ambos os lados -Delete on both sides even if the file is selected on one side only -Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado -Delete or overwrite files permanently -Apagar ou substituir arquivos permanentemente -Delete permanently -Apagar permanentemente -Deleting Symbolic Link %x -Apagando Link Simbólico %x -Deleting file %x -Apagando arquivo %x -Deleting folder %x -Apagando pasta %x -Deletion handling -Tratamento da exclusão -Description -Descrição -Direct -Direto -Directories are dependent! Be careful when setting up synchronization rules: -Diretórios são dependentes! Cuidado ao definir as regras de sincronização: -Directories to watch -Diretórios para monitorar -Directory -Diretório -Directory does not exist: -Diretório não existe: -Do not show this dialog again -Não mostrar esse diálogo novamente -Do nothing -Não fazer nada -Do you really want to delete the following object(s)? -Quer mesmo apagar o(s) seguinte(s) item(s) ? -Do you really want to move the following object(s) to the Recycle Bin? -Quer mesmo mover o(s) seguinte(s) item(s) para a Lixeira? -Do you want FreeFileSync to automatically check for updates every week? -Deseja que o FreeFileSync procure automaticamente novas versões toda semana? -Donate with PayPal -Doar usando PayPal -Download now? -Baixar agora? -Drag && drop -Arrastar && Soltar -Elements found: -Elementos encontrados: -Elements processed: -Elementos processados: -Elements remaining: -Elementos faltantes: -Email -Email -Encoding extended time information: %x -Codificando informações adicionais de tempo: %x -Endless loop when traversing directory: -Loop infinito quando percorrendo diretório: -Equal files/folders that differ in attributes only -Arquivos/pastas iguais que diferem apenas nos atributos -Error -Erro -Error changing modification time: -Erro ao mudar a hora de modificação: -Error copying file permissions: -Erro ao copiar permissões do arquivo: -Error copying file: -Erro ao copiar arquivo: -Error copying locked file %x! -Erro ao copiar arquivo bloqueado %x! -Error copying symbolic link: -Erro ao copiar links simbólicos: -Error creating directory: -Erro ao criar diretório: -Error deleting directory: -Erro ao apagar diretório: -Error deleting file: -Erro ao apagar arquivo: -Error handling -Tratamento de erros -Error loading library function: -Erro ao carregar a biblioteca de funções: -Error moving directory: -Erro movendo diretório: -Error moving file: -Erro movendo arquivo: -Error moving to Recycle Bin: -Erro ao mover para a Lixeira: -Error opening file: -Erro ao abrir arquivo: -Error parsing configuration file: -Erro de leitura do arquivo de configuração: -Error reading file attributes: -Erro ao ler atributos do arquivo: -Error reading file: -Erro ao ler arquivo: -Error reading from synchronization database: -Erro ao ler do banco de dados de sincronização: -Error reading security context: -Erro ao ler contexto de segurança: -Error resolving symbolic link: -Erro na resolução de link simbólico: -Error setting directory lock: -Erro ao definir bloqueio no diretório: -Error setting privilege: -Erro ao definir privilégio: -Error starting Volume Shadow Copy Service! -Erro ao inicializar o Serviço de Cópias de Sombra de Volume! -Error traversing directory: -Erro ao percorrer diretório: -Error when monitoring directories. -Erro monitorando diretórios. -Error writing file: -Erro ao escrever arquivo: -Error writing security context: -Erro ao escrever contexto de segurança: -Error writing to synchronization database: -Erro ao escrever no banco de dados de sincronização: -Example -Exemplo -Exclude -Excluir -Exclude all rows -Excluir todas as linhas -Exclude temporarily -Excluir temporariamente -Exclude via filter: -Excluir por filtro: -Exit instantly -Sair instantaneamente -Extension -Extensão -External applications -Aplicações externas -Fatal Error -Erro fatal -Feedback and suggestions are welcome at: -Comentários e sugestões são bem-vindos em: -File %x has an invalid date! -Arquivo %x tem uma data inválida! -File already exists. Overwrite? -O arquivo já existe. Deseja substituir? -File content -Conteúdo do arquivo -File does not exist: -O arquivo não existe: -File list exported! -Lista de arquivos exportada! -File size and date -Data e tamanho do arquivo -Filename -Nome do arquivo -Files %x have the same date but a different size! -Arquivos %x têm a mesma data mas tamanhos diferentes! -Files are found equal if\n - file content\nis the same -Os arquivos são considerados iguais se\n - o conteúdo do arquivo\né o mesmo -Files are found equal if\n - filesize\n - last write time and date\nare the same -Os arquivos são considerados iguais se\n - o tamanho\n - e a data e hora da última modificação\nsão iguais -Files that are equal on both sides -Arquivos que são iguais em ambos os lados -Files that exist on both sides, left one is newer -Arquivos que existem nos dois lados, sendo à esquerda mais recentes -Files that exist on both sides, right one is newer -Arquivos que existem nos dois lados, sendo à direita mais recentes -Files that have different content -Arquivos que possuem conteúdo diferente -Files/folders that exist on left side only -Arquivos/pastas que existem somente à esquerda -Files/folders that exist on right side only -Arquivos/pastas que existem somente à direita -Filter files -Filtrar arquivos -Filter is active -Filtro está ativo -Filter settings have changed! -As configurações do filtro foram alteradas! -Filter: All pairs -Filtro: Todos os pares -Filter: Single pair -Filtro: Apenas um par -Find -Localizar -Find what: -Localizar o que: -Folder Comparison and Synchronization -Comparação e Sincronização de Pastas -Folder pairs -Pares de pastas -Follow -Seguir -Free disk space available: -Espaço livre em disco: -Free disk space required: -Espaço livre em disco requerido: -FreeFileSync Batch Job -FreeFileSync Arquivo batch -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge -FreeFileSync batch file -FreeFileSync Arquivo batch -FreeFileSync configuration -FreeFileSync configuração -FreeFileSync is up to date! -FreeFileSync está atualizado! -Full path -Caminho completo -Generating database... -Gerando banco de dados... -Generating file list... -Gerando lista de arquivos... -Global settings -Configurações -Help -Ajuda -Hidden dialogs: -Diálogos ocultados: -Hide all error and warning messages -Ocultar todas as mensagens de erro ou aviso -Hide conflicts -Ocultar conflitos -Hide excluded items -Ocultar itens excluÃdos -Hide files that are different -Ocultar arquivos que são diferentes -Hide files that are equal -Ocultar arquivos que são iguais -Hide files that are newer on left -Ocultar arquivos que são mais recentes à esquerda -Hide files that are newer on right -Ocultar arquivos que são mais recentes à direita -Hide files that exist on left side only -Ocultar arquivos que existem somente à esquerda -Hide files that exist on right side only -Ocultar arquivos que existem somente à direita -Hide files that will be created on the left side -Ocultar arquivos que serão criados no lado esquerdo -Hide files that will be created on the right side -Ocultar arquivos que serão criados no lado direito -Hide files that will be deleted on the left side -Ocultar arquivos que serão apagados no lado esquerdo -Hide files that will be deleted on the right side -Ocultar arquivos que serão apagados no lado direito -Hide files that will be overwritten on left side -Ocultar arquivos que serão substituÃdos no lado esquerdo -Hide files that will be overwritten on right side -Ocultar arquivos que serão substituÃdos no lado direito -Hide files that won't be copied -Ocultar arquivos que não serão copiados -Hide filtered or temporarily excluded files -Ocultar arquivos filtrados ou temporariamente excluÃdos -Hide further error messages during the current process -Ocultar próximas mensagens de erro durante este processo -Hints: -Dicas: -Homepage -Homepage -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identificar e propagar mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente. -Idle time between detection of last change and execution of command line in seconds -Tempo ocioso entre detecção da última mudança e da execução da linha de comando em segundos -If you like FFS -Se gosta do FFS -Ignore -Ignorar -Ignore errors -Ignorar erros -Ignore subsequent errors -Ignorar erros subsequentes -Include -Incluir -Include all rows -Incluir todas as linhas -Include temporarily -Incluir temporariamente -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\* -Incompatible synchronization database format: -Formato de banco de dados de sincronização incompatÃvel: -Info -Info -Information -Informação -Initial synchronization: -Sincronização inicial: -Integrate external applications into context menu. The following macros are available: -Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis: -Invalid FreeFileSync config file! -Arquivo de configuração do FreeFileSync inválido! -Last used configurations (press DEL to remove from list) -Últimas configurações usadas (pressione DEL para remover da lista) -Leave as unresolved conflict -Deixar como conflito não resolvido -Left -Esquerda -Legend -Legenda -Load configuration from file -Carregar configuração do arquivo -Log-messages: -Log de mensagens: -Logging -Gravando log -Main bar -Barra principal -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync. -Match case -Diferenciar maiúsculas e minúsculas -Maximum number of logfiles: -Número máximo de arquivos de log: -Memory allocation failed! -Alocação de memória falhou! -Minimum Idle Time [seconds] -MÃnimo Tempo Ocioso [segundos] -Mirror ->> -Espelhar ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Backup espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização. -Monitoring active... -Monitoramento ativo... -More than 50% of the total number of files will be copied or deleted! -Mais de 50% do número total de arquivos será copiado ou apagado! -Move column down -Mover coluna para baixo -Move column up -Mover coluna para cima -Move files into a time-stamped subdirectory -Mover arquivos para um subdiretório com carimbo de tempo -Moving %x to Recycle Bin -Movendo %x para a Lixeira -Moving Symbolic Link %x to user-defined directory %y -Movendo Link Simbólico %x para o diretório especificado %y -Moving file %x to user-defined directory %y -Movendo arquivo %x para o diretório especificado %y -Moving folder %x to user-defined directory %y -Movendo pasta %x para o diretório especificado %y -Multiple... -Múltiplos... -No change since last synchronization! -Nenhuma mudança desde a última sincronização! -No filter selected -Nenhum filtro selecionado -Not enough free disk space available in: -Espaço em disco insuficiente em: -Nothing to synchronize according to configuration! -Nada para sincronizar de acordo com a configuração! -Number of files and directories that will be created -Número de arquivos e diretórios que serão criados -Number of files and directories that will be deleted -Número de arquivos e diretórios que serão apagados -Number of files that will be overwritten -Número de arquivos que serão substituÃdos -One of the FreeFileSync database entries within the following file is not yet existing: -Um das entradas do bancos de dados do FreeFileSync dentro do seguinte arquivo ainda não existe: -One of the FreeFileSync database files is not yet existing: -Um dos arquivos de bancos de dados do FreeFileSync ainda não existe: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Apenas arquivos/diretórios que passarem o filtro serão selecionados para sincronização. O filtro será aplicado ao nome relativo(!) aos diretórios base de sincronização. -Open with Explorer -Abrir com Explorer -Open with default application -Abrir com aplicativo padrão -Operation aborted! -Operação cancelada! -Operation: -Operação: -Overview -Parâmetros -Overwriting Symbolic Link %x in %y -SubstituÃndo Link Simbólico %x em %y -Overwriting file %x in %y -SubstituÃndo arquivo %x em %y -Pause -Pausa -Paused -Pausado -Planned directory deletion is in conflict with its subdirectories and -files! -O diretório a ser apagado está em conflito com seus subdiretórios e -arquivos! -Please run a Compare first before synchronizing! -Por favor execute primeiro a Comparação antes de sincronizar! -Press \"Switch\" to open FreeFileSync GUI mode. -Pressione \"Alterar\" para abrir o modo GUI do FreeFileSync. -Processing folder pair: -Processando par de pastas: -Published under the GNU General Public License: -Publicado sobre a GNU General Public License: -Question -Questão -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronização Automátizada -RealtimeSync configuration -Configuração do RealtimeSync -Recycle Bin not yet supported for this system! -Lixeira ainda não suportada por esse sistema! -Relative path -Caminho relativo -Remove alternate settings -Remover configurações alternativas -Remove folder -Remover pasta -Remove folder pair -Remover par de pastas -Report translation error -Reportar erro de tradução -Reset -Restaurar -Reset view -Restaurar visualização -Restore all hidden dialogs? -Restaurar todos os diálogos ocultados? -Right -Direita -S&ave configuration... -S&alvar configuração... -S&witch view -A<erar visualização -Save changes to current configuration? -Salvar modificações para a configuração atual? -Save current configuration to file -Salvar configuração atual para arquivo -Scanning... -Pesquisando... -Scanning: -Pesquisando: -Select a folder -Selecione uma pasta -Select alternate synchronization settings -Selecionar configuração de sincronização alternativa -Select logfile directory: -Escolha um diretório para salvar o arquivo log: -Select variant: -Selecione um modo: -Select view -Selecionar visualização -Set direction: -Configurar direção -Setting default synchronization directions: Old files will be overwritten with newer files. -Configurando direções padrões de sincronização: Arquivos antigos serão substituÃdos por arquivos mais novos. -Show \"%x\" -Mostrar \"%x\" -Show conflicts -Mostrar conflitos -Show files that are different -Mostrar arquivos que são diferentes -Show files that are equal -Mostrar arquivos que são iguais -Show files that are newer on left -Mostrar arquivos que são mais recentes à esquerda -Show files that are newer on right -Mostrar arquivos que são mais recentes à direita -Show files that exist on left side only -Mostrar arquivos que existem somente à esquerda -Show files that exist on right side only -Mostrar arquivos que existem somente à direita -Show files that will be created on the left side -Mostrar arquivos que serão criados no lado esquerdo -Show files that will be created on the right side -Mostrar arquivos que serão criados no lado direito -Show files that will be deleted on the left side -Mostrar arquivos que serão apagados no lado esquerdo -Show files that will be deleted on the right side -Mostrar arquivos que serão apagados no lado direito -Show files that will be overwritten on left side -Mostrar arquivos que serão substituÃdos no lado esquerdo -Show files that will be overwritten on right side -Mostrar arquivos que serão substituÃdos no lado direito -Show files that won't be copied -Mostrar arquivos que não serão copiados -Show hidden dialogs -Mostrar diálogos ocultados -Show popup -Mostrar popup -Show popup on errors or warnings -Mostrar popup com erros ou avisos -Significant difference detected: -Diferença significativa detectada: -Silent mode -Modo silencioso -Size -Tamanho -Source code written completely in C++ utilizing: -Código fonte todo escrito em C++ utilizando: -Source directory does not exist anymore: -Diretório de origem não existe mais: -Speed: -Velocidade: -Start -Iniciar -Start minimized and write status information to a logfile -Iniciar minimizado e escrever informação de status em um arquivo de log -Start synchronization -Iniciar sincronização -Statistics -EstatÃsticas -Status feedback -Informação do Status -Stop -Parar -Swap sides -Inverter lados -Switching to FreeFileSync GUI mode... -Alterando para o modo GUI do FreeFileSync... -Symbolic Link handling -Tratamento de Links Simbólicos -Symlinks %x have the same date but a different target! -Links Simbólicos %x têm a mesma data mas um destino diferente! -Synchronization Preview -Pré-visualização da Sincronização -Synchronization aborted! -Sincronização cancelada! -Synchronization completed successfully! -Sincronização finalizada com sucesso! -Synchronization completed with errors! -Sincronização finalizada com erros! -Synchronization settings -Parâmetros de sincronização -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta \"temp\". -Synchronize... -Sincronizar... -Synchronizing... -Sincronizando... -Target directory already existing! -Diretório de destino já existe! -Target file already existing! -Arquivo de destino já existe! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -A linha de comando é executada cada vez que:\n- todos os diretórios ficam disponÃveis (ex.: inserção de uma Pen Drive)\n- arquivos dentro desses diretórios ou subdiretórios são modificados -The file does not contain a valid configuration: -O arquivo não contém uma configuração válida: -The file was not processed by last synchronization! -O arquivo não foi processado pela última sincronização! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação. -Time -Hora -Time elapsed: -Tempo passado: -Time remaining: -Tempo restante: -Total amount of data that will be transferred -Volume de dados que será transferido -Total time: -Tempo total: -Transfer file and directory permissions\n(Requires Administrator rights) -Transferir permissões de arquivos e diretórios\n(Requer direitos de Administrador) -Unable to connect to sourceforge.net! -Não foi possÃvel conectar a sourceforge.net! -Unable to create logfile! -Não foi possÃvel criar arquivo log! -Unresolved conflicts existing! -Conflitos não resolvidos existentes! -Update -> -Atualizar -> -Updating attributes of %x -Atualizando atributos de %x -Usage: -Uso: -Use Recycle Bin -Utilizar Lixeira -Use Recycle Bin when deleting or overwriting files -Usar a Lixeira quando apagar ou substituir arquivos -User-defined directory for deletion was not specified! -Diretório especificado para arquivos apagados não foi definido! -Variant -Modo -Verifying file %x -Verificando arquivo %x -Versioning -Controle de versões -Volume name %x not part of filename %y! -Nome do volume %x não é parte do arquivo %y! -Waiting for missing directories... -Esperando por diretórios faltantes... -Waiting while directory is locked (%x)... -Esperando enquanto o diretório é travado (%x)... -Warning -Atenção -When the comparison is started with this option set the following decision tree is processed: -Quando a comparação é iniciada com esta opção, a seguinte árvore de decisão é processada: -You can ignore conflicts and continue synchronization. -Você pode ignorar os conflitos e continuar a sincronização. -You can ignore this error to consider the directory as empty. -Você pode ignorar esse erro para considerar o diretório como vazio. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)! -different -diferente -file exists on both sides -arquivo existe em ambos os lados -on one side only -existente apenas em um lado +<source>Show in Explorer</source> +<target>Mostrar no Explorer</target> +<source>Open with default application</source> +<target>Abrir com aplicativo padrão</target> +<source>Browse directory</source> +<target>Navegar pelo diretório</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Sincronização Automatizada</target> +<source>Browse</source> +<target>Procurar</target> +<source>Error resolving symbolic link:</source> +<target>Erro na resolução de link simbólico:</target> +<source>Select alternate synchronization settings</source> +<target>Selecionar configuração de sincronização alternativa</target> +<source>No filter selected</source> +<target>Nenhum filtro selecionado</target> +<source>Filter is active</source> +<target>Filtro está ativo</target> +<source>Clear filter settings</source> +<target>Limpar configurações do filtro</target> +<source>Remove alternate settings</source> +<target>Remover configurações alternativas</target> +<source>Create a batch job</source> +<target>Criar arquivo batch</target> +<source>Synchronization settings</source> +<target>Parâmetros de sincronização</target> +<source>Comparison settings</source> +<target>Configurações da comparação</target> +<source>About</source> +<target>Sobre</target> +<source>Error</source> +<target>Erro</target> +<source>Warning</source> +<target>Atenção</target> +<source>Question</source> +<target>Questão</target> +<source>Confirm</source> +<target>Confirmar</target> +<source>Configure filter</source> +<target>Configurar filtros</target> +<source>Customize columns</source> +<target>Personalizar colunas</target> +<source>Global settings</source> +<target>Configurações</target> +<source>Synchronization Preview</source> +<target>Pré-visualização da Sincronização</target> +<source>Find</source> +<target>Localizar</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</target> +<source><Symlink></source> +<target><Link Simbólico></target> +<source><Directory></source> +<target><Diretório></target> +<source>Size</source> +<target>Tamanho</target> +<source>Date</source> +<target>Data</target> +<source>Full path</source> +<target>Caminho completo</target> +<source>Filename</source> +<target>Nome do arquivo</target> +<source>Relative path</source> +<target>Caminho relativo</target> +<source>Directory</source> +<target>Diretório</target> +<source>Extension</source> +<target>Extensão</target> +<source>Comparison Result</source> +<target>Resultado da Comparação</target> +<source>Incompatible synchronization database format:</source> +<target>Formato de banco de dados de sincronização incompatÃvel:</target> +<source>Initial synchronization:</source> +<target>Sincronização inicial:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Um dos arquivos de bancos de dados do FreeFileSync ainda não existe:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Um das entradas do bancos de dados do FreeFileSync dentro do seguinte arquivo ainda não existe:</target> +<source>Error reading from synchronization database:</source> +<target>Erro ao ler do banco de dados de sincronização:</target> +<source>An exception occurred!</source> +<target>Ocorreu uma exceção!</target> +<source>Error deleting file:</source> +<target>Erro ao apagar arquivo:</target> +<source>Error reading file attributes:</source> +<target>Erro ao ler atributos do arquivo:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Esperando enquanto o diretório é travado (%x)...</target> +<source>Error setting directory lock:</source> +<target>Erro ao definir bloqueio no diretório:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 seg</pluralform> +<pluralform>%x seg</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Erro fatal</target> +<source>File does not exist:</source> +<target>O arquivo não existe:</target> +<source>Error parsing configuration file:</source> +<target>Erro de leitura do arquivo de configuração:</target> +<source>Error writing file:</source> +<target>Erro ao escrever arquivo:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Arquivo de configuração do FreeFileSync inválido!</target> +<source>/sec</source> +<target>/seg</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 hora</pluralform> +<pluralform>%x horas</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 dia</pluralform> +<pluralform>%x dias</pluralform> +</target> +<source>S&ave configuration...</source> +<target>S&alvar configuração...</target> +<source>&Load configuration...</source> +<target>&Carregar configuração...</target> +<source>&Quit</source> +<target>&Sair</target> +<source>&File</source> +<target>&Arquivo</target> +<source>&Content</source> +<target>&Conteúdo</target> +<source>&About...</source> +<target>&Sobre...</target> +<source>&Help</source> +<target>&Ajuda</target> +<source>Usage:</source> +<target>Uso:</target> +<source>1. Select directories to monitor.</source> +<target>1. Selecione os diretórios para monitorar.</target> +<source>2. Enter a command line.</source> +<target>2. Entre uma linha de comando.</target> +<source>3. Press 'Start'.</source> +<target>3. Pressione 'Iniciar'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +A linha de comando é executada cada vez que: +- todos os diretórios ficam disponÃveis (ex.: inserção de uma Pen Drive) +- arquivos dentro desses diretórios ou subdiretórios são modificados +</target> +<source>Directories to watch</source> +<target>Diretórios para monitorar</target> +<source>Add folder</source> +<target>Adicionar pasta</target> +<source>Remove folder</source> +<target>Remover pasta</target> +<source>Select a folder</source> +<target>Selecione uma pasta</target> +<source>Command line</source> +<target>Linha de comando</target> +<source>Minimum Idle Time [seconds]</source> +<target>MÃnimo Tempo Ocioso [segundos]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Tempo ocioso entre detecção da última mudança e da execução da linha de comando em segundos</target> +<source>Start</source> +<target>Iniciar</target> +<source>(Build: %x)</source> +<target>(Versão: %x)</target> +<source>RealtimeSync configuration</source> +<target>Configuração do RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>O arquivo já existe. Deseja substituir?</target> +<source>&Restore</source> +<target>&Restaurar</target> +<source>&Exit</source> +<target>&Sair</target> +<source>Monitoring active...</source> +<target>Monitoramento ativo...</target> +<source>Waiting for missing directories...</source> +<target>Esperando por diretórios faltantes...</target> +<source>Command line is empty!</source> +<target>Linha de comando está vazia!</target> +<source>Could not initialize directory monitoring:</source> +<target>Não foi possÃvel inicializar o monitoramento de diretórios:</target> +<source>A directory input field is empty.</source> +<target>Um campo de entrada de diretório está vazio.</target> +<source>Error when monitoring directories.</source> +<target>Erro monitorando diretórios.</target> +<source>Drag && drop</source> +<target>Arrastar && Soltar</target> +<source>Conversion error:</source> +<target>Erro de conversão:</target> +<source>Error moving file:</source> +<target>Erro movendo arquivo:</target> +<source>Operation aborted!</source> +<target>Operação cancelada!</target> +<source>Target file already existing!</source> +<target>Arquivo de destino já existe!</target> +<source>Error moving directory:</source> +<target>Erro movendo diretório:</target> +<source>Target directory already existing!</source> +<target>Diretório de destino já existe!</target> +<source>Error deleting directory:</source> +<target>Erro ao apagar diretório:</target> +<source>Error changing modification time:</source> +<target>Erro ao mudar a hora de modificação:</target> +<source>Error loading library function:</source> +<target>Erro ao carregar a biblioteca de funções:</target> +<source>Error reading security context:</source> +<target>Erro ao ler contexto de segurança:</target> +<source>Error writing security context:</source> +<target>Erro ao escrever contexto de segurança:</target> +<source>Error copying file permissions:</source> +<target>Erro ao copiar permissões do arquivo:</target> +<source>Error creating directory:</source> +<target>Erro ao criar diretório:</target> +<source>Error copying symbolic link:</source> +<target>Erro ao copiar links simbólicos:</target> +<source>Error copying file:</source> +<target>Erro ao copiar arquivo:</target> +<source>Error opening file:</source> +<target>Erro ao abrir arquivo:</target> +<source>Error reading file:</source> +<target>Erro ao ler arquivo:</target> +<source>Endless loop when traversing directory:</source> +<target>Loop infinito quando percorrendo diretório:</target> +<source>Error traversing directory:</source> +<target>Erro ao percorrer diretório:</target> +<source>Error setting privilege:</source> +<target>Erro ao definir privilégio:</target> +<source>Error moving to Recycle Bin:</source> +<target>Erro ao mover para a Lixeira:</target> +<source>Could not load a required DLL:</source> +<target>Não foi possÃvel carregar uma DLL requerida:</target> +<source>Error writing to synchronization database:</source> +<target>Erro ao escrever no banco de dados de sincronização:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Erro ao inicializar o Serviço de Cópias de Sombra de Volume!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Não foi possÃvel determinar o nome do volume para o arquivo:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Nome do volume %x não é parte do arquivo %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Não foi possÃvel ler os valores para os seguintes nós XML:</target> +<source>Show popup</source> +<target>Mostrar popup</target> +<source>Show popup on errors or warnings</source> +<target>Mostrar popup com erros ou avisos</target> +<source>Ignore errors</source> +<target>Ignorar erros</target> +<source>Hide all error and warning messages</source> +<target>Ocultar todas as mensagens de erro ou aviso</target> +<source>Exit instantly</source> +<target>Sair instantaneamente</target> +<source>Abort synchronization immediately</source> +<target>Cancelar a sincronização imediatamente</target> +<source>Logging</source> +<target>Gravando log</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync Arquivo batch</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync configuração</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Arquivo batch</target> +<source>Unable to create logfile!</source> +<target>Não foi possÃvel criar arquivo log!</target> +<source>Batch execution</source> +<target>Execução do batch</target> +<source>Log-messages:</source> +<target>Log de mensagens:</target> +<source>Stop</source> +<target>Parar</target> +<source>Total time:</source> +<target>Tempo total:</target> +<source>Synchronization aborted!</source> +<target>Sincronização cancelada!</target> +<source>Synchronization completed with errors!</source> +<target>Sincronização finalizada com erros!</target> +<source>Synchronization completed successfully!</source> +<target>Sincronização finalizada com sucesso!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Pressione "Alterar" para abrir o modo GUI do FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Alterando para o modo GUI do FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Não foi possÃvel conectar a sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Uma nova versão do FreeFileSync foi encontrada:</target> +<source>Download now?</source> +<target>Baixar agora?</target> +<source>Information</source> +<target>Informação</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync está atualizado!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Deseja que o FreeFileSync procure automaticamente novas versões toda semana?</target> +<source>(Requires an Internet connection!)</source> +<target>(Requer conexão com a Internet!)</target> +<source>1. &Compare</source> +<target>1. C&omparar</target> +<source>2. &Synchronize...</source> +<target>2. S&incronizar...</target> +<source>S&witch view</source> +<target>A<erar visualização</target> +<source>&New</source> +<target>&Novo</target> +<source>&Program</source> +<target>&Programa</target> +<source>&Language</source> +<target>&Idioma</target> +<source>&Global settings...</source> +<target>&Configurações...</target> +<source>&Create batch job...</source> +<target>C&riar um arquivo batch...</target> +<source>&Export file list...</source> +<target>&Exportar lista de arquivos...</target> +<source>&Advanced</source> +<target>&Avançado</target> +<source>&Check for new version</source> +<target>&Procurar novas versões</target> +<source>Compare</source> +<target>Comparar</target> +<source>Compare both sides</source> +<target>Comparar os dois lados</target> +<source>&Abort</source> +<target>&Abortar</target> +<source>Synchronize...</source> +<target>Sincronizar...</target> +<source>Start synchronization</source> +<target>Iniciar sincronização</target> +<source>Swap sides</source> +<target>Inverter lados</target> +<source>Add folder pair</source> +<target>Adicionar par de pastas</target> +<source>Remove folder pair</source> +<target>Remover par de pastas</target> +<source>Save current configuration to file</source> +<target>Salvar configuração atual para arquivo</target> +<source>Load configuration from file</source> +<target>Carregar configuração do arquivo</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Últimas configurações usadas (pressione DEL para remover da lista)</target> +<source>Hide excluded items</source> +<target>Ocultar itens excluÃdos</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Ocultar arquivos filtrados ou temporariamente excluÃdos</target> +<source>Number of files and directories that will be created</source> +<target>Número de arquivos e diretórios que serão criados</target> +<source>Number of files that will be overwritten</source> +<target>Número de arquivos que serão substituÃdos</target> +<source>Number of files and directories that will be deleted</source> +<target>Número de arquivos e diretórios que serão apagados</target> +<source>Total amount of data that will be transferred</source> +<target>Volume de dados que será transferido</target> +<source>Left</source> +<target>Esquerda</target> +<source>Right</source> +<target>Direita</target> +<source>Batch job</source> +<target>Arquivo Batch</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Monta um arquivo batch para sincronização automatizada. Para iniciar o modo batch, passar o nome do arquivo para o executável do FreeFileSync: FreeFileSync.exe <arquivo batch>. Também pode ser programado no Agendador de Tarefas do sistema operacional.</target> +<source>Help</source> +<target>Ajuda</target> +<source>Configuration overview:</source> +<target>Parâmetros de configuração:</target> +<source>Filter files</source> +<target>Filtrar arquivos</target> +<source>Status feedback</source> +<target>Informação do Status</target> +<source>Silent mode</source> +<target>Modo silencioso</target> +<source>Start minimized and write status information to a logfile</source> +<target>Iniciar minimizado e escrever informação de status em um arquivo de log</target> +<source>Error handling</source> +<target>Tratamento de erros</target> +<source>Overview</source> +<target>Parâmetros</target> +<source>Select logfile directory:</source> +<target>Escolha um diretório para salvar o arquivo log:</target> +<source>Maximum number of logfiles:</source> +<target>Número máximo de arquivos de log:</target> +<source>&Save</source> +<target>&Salvar</target> +<source>&Load</source> +<target>&Carregar</target> +<source>&Cancel</source> +<target>&Cancelar</target> +<source>Elements found:</source> +<target>Elementos encontrados:</target> +<source>Elements remaining:</source> +<target>Elementos faltantes:</target> +<source>Speed:</source> +<target>Velocidade:</target> +<source>Time remaining:</source> +<target>Tempo restante:</target> +<source>Time elapsed:</source> +<target>Tempo passado:</target> +<source>Operation:</source> +<target>Operação:</target> +<source>Select variant:</source> +<target>Selecione um modo:</target> +<source><Automatic></source> +<target><Automático></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identificar e propagar mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente.</target> +<source>Mirror ->></source> +<target>Espelhar ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Backup espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização.</target> +<source>Update -></source> +<target>Atualizar -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copiar arquivos novos ou atualizados para a pasta da direita</target> +<source>Custom</source> +<target>Personalizado</target> +<source>Configure your own synchronization rules.</source> +<target>Configure as suas próprias regras de sincronização.</target> +<source>Deletion handling</source> +<target>Tratamento da exclusão</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuração</target> +<source>Category</source> +<target>Categoria</target> +<source>Action</source> +<target>Ação</target> +<source>Files/folders that exist on left side only</source> +<target>Arquivos/pastas que existem somente à esquerda</target> +<source>Files/folders that exist on right side only</source> +<target>Arquivos/pastas que existem somente à direita</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Arquivos que existem nos dois lados, sendo à esquerda mais recentes</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Arquivos que existem nos dois lados, sendo à direita mais recentes</target> +<source>Files that have different content</source> +<target>Arquivos que possuem conteúdo diferente</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflitos/arquivos que não podem ser categorizados</target> +<source>Compare by...</source> +<target>Comparar por...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Os arquivos são considerados iguais se + - o tamanho + - e a data e hora da última modificação +são iguais +</target> +<source>File size and date</source> +<target>Data e tamanho do arquivo</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Os arquivos são considerados iguais se + - o conteúdo do arquivo +é o mesmo +</target> +<source>File content</source> +<target>Conteúdo do arquivo</target> +<source>Symbolic Link handling</source> +<target>Tratamento de Links Simbólicos</target> +<source>Synchronizing...</source> +<target>Sincronizando...</target> +<source>Elements processed:</source> +<target>Elementos processados:</target> +<source>&Pause</source> +<target>&Pausar</target> +<source>Compare by "File size and date"</source> +<target>Comparar por "Data e tamanho dos arquivos"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Quando a comparação é iniciada com esta opção, a seguinte árvore de decisão é processada:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Como resultado, os arquivos são separados nas seguintes categorias:</target> +<source>- equal</source> +<target>- igual</target> +<source>- left newer</source> +<target>- mais recente à esquerda</target> +<source>- right newer</source> +<target>- mais recente à direita</target> +<source>- exists left only</source> +<target>- existe apenas à esquerda</target> +<source>- exists right only</source> +<target>- existe apenas à direita</target> +<source>- conflict (same date, different size)</source> +<target>- conflito (mesma data, tamanho diferente)</target> +<source>Compare by "File content"</source> +<target>Comparar por "Conteúdo dos arquivos"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Como o nome sugere, dois arquivos com o mesmo nome são assinalados como iguais se e somente se eles tiverem o mesmo conteúdo. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos arquivos não é levada em consideração. + +Com esta opção habilitada, a árvore de decisão é menor: +</target> +<source>- different</source> +<target>- diferente</target> +<source>Source code written in C++ utilizing:</source> +<target>Código-fonte escrito em C++ utilizando:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Pela tradução do FreeFileSync, um agradecimento a:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Comentários e sugestões são bem-vindos em:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync na Sourceforge</target> +<source>Homepage</source> +<target>Homepage</target> +<source>If you like FFS</source> +<target>Se gosta do FFS</target> +<source>Donate with PayPal</source> +<target>Doar usando PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>Reportar erro de tradução</target> +<source>Published under the GNU General Public License:</source> +<target>Publicado sobre a GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Ignorar erros subsequentes</target> +<source>Hide further error messages during the current process</source> +<target>Ocultar próximas mensagens de erro durante este processo</target> +<source>&Ignore</source> +<target>&Ignorar</target> +<source>&Retry</source> +<target>&Tentar Novamente</target> +<source>Do not show this dialog again</source> +<target>Não mostrar esse diálogo novamente</target> +<source>&Switch</source> +<target>&Alterar</target> +<source>&Yes</source> +<target>&Sim</target> +<source>&No</source> +<target>&Não</target> +<source>Delete on both sides</source> +<target>Apagar em ambos os lados</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado</target> +<source>Use Recycle Bin</source> +<target>Utilizar Lixeira</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Apenas arquivos/diretórios que satisfazem todos as configurações dos filtros serão selecionados para sincronização. +Nota: O nome do filtro deve ser especificado relativo(!) ao diretório principal de sincronização. +</target> +<source>Hints:</source> +<target>Dicas:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Entre os nomes dos arquivos ou diretórios relativos separados por ';' ou uma nova linha.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Usar '*' e '?' como caracteres coringa.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Excluir arquivos diretamente do grid principal através do menu de contexto.</target> +<source>Example</source> +<target>Exemplo</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Incluir: *.doc;*.zip;*.exe +Excluir: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta "temp".</target> +<source>Include</source> +<target>Incluir</target> +<source>Exclude</source> +<target>Excluir</target> +<source>Select time span:</source> +<target>Selecione o perÃodo de tempo:</target> +<source>Minimum file size:</source> +<target>Tamanho mÃnimo do arquivo:</target> +<source>Maximum file size:</source> +<target>Tamanho máximo do arquivo:</target> +<source>&Default</source> +<target>&Config. Padrão</target> +<source>Move column up</source> +<target>Mover coluna para cima</target> +<source>Move column down</source> +<target>Mover coluna para baixo</target> +<source>Copy locked files</source> +<target>Copiar arquivos bloqueados (em uso)</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copiar arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópias de Sombra de Volume +(Requer direitos de Administrador) +</target> +<source>Copy filesystem permissions</source> +<target>Copiar permissões de arquivos e diretórios</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transferir permissões de arquivos e diretórios +(Requer direitos de Administrador) +</target> +<source>Hidden dialogs:</source> +<target>Diálogos ocultados:</target> +<source>Reset</source> +<target>Restaurar</target> +<source>Show hidden dialogs</source> +<target>Mostrar diálogos ocultados</target> +<source>External applications</source> +<target>Aplicações externas</target> +<source>Description</source> +<target>Descrição</target> +<source>Variant</source> +<target>Modo</target> +<source>Statistics</source> +<target>EstatÃsticas</target> +<source>Find what:</source> +<target>Localizar o que:</target> +<source>Match case</source> +<target>Diferenciar maiúsculas e minúsculas</target> +<source>&Find next</source> +<target>&Localizar próxima</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)!</target> +<source>Batch file created successfully!</source> +<target>Arquivo batch criado com sucesso!</target> +<source>Main bar</source> +<target>Barra principal</target> +<source>Folder pairs</source> +<target>Pares de pastas</target> +<source>Select view</source> +<target>Selecionar visualização</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparação e Sincronização de Pastas</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Lixeira ainda não suportada por esse sistema!</target> +<source>Set direction:</source> +<target>Configurar direção</target> +<source>Exclude temporarily</source> +<target>Excluir temporariamente</target> +<source>Include temporarily</source> +<target>Incluir temporariamente</target> +<source>Exclude via filter:</source> +<target>Excluir por filtro:</target> +<source><multiple selection></source> +<target><seleção múltipla></target> +<source>D-Click</source> +<target>Duplo Click</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copiar para a Ãrea de transferência CTRL+C</target> +<source>Delete files DEL</source> +<target>Apagar arquivos DEL</target> +<source>Customize...</source> +<target>Personalizar...</target> +<source>Auto-adjust columns</source> +<target>Autoajustar colunas</target> +<source>Include all rows</source> +<target>Incluir todas as linhas</target> +<source>Exclude all rows</source> +<target>Excluir todas as linhas</target> +<source>Reset view</source> +<target>Restaurar visualização</target> +<source>Show "%x"</source> +<target>Mostrar "%x"</target> +<source><Last session></source> +<target><Última sessão></target> +<source>Configuration saved!</source> +<target>Configuração salva!</target> +<source>Save changes to current configuration?</source> +<target>Salvar modificações para a configuração atual?</target> +<source>Configuration loaded!</source> +<target>Configuração carregada!</target> +<source>Hide files that exist on left side only</source> +<target>Ocultar arquivos que existem somente à esquerda</target> +<source>Show files that exist on left side only</source> +<target>Mostrar arquivos que existem somente à esquerda</target> +<source>Hide files that exist on right side only</source> +<target>Ocultar arquivos que existem somente à direita</target> +<source>Show files that exist on right side only</source> +<target>Mostrar arquivos que existem somente à direita</target> +<source>Hide files that are newer on left</source> +<target>Ocultar arquivos que são mais recentes à esquerda</target> +<source>Show files that are newer on left</source> +<target>Mostrar arquivos que são mais recentes à esquerda</target> +<source>Hide files that are newer on right</source> +<target>Ocultar arquivos que são mais recentes à direita</target> +<source>Show files that are newer on right</source> +<target>Mostrar arquivos que são mais recentes à direita</target> +<source>Hide files that are equal</source> +<target>Ocultar arquivos que são iguais</target> +<source>Show files that are equal</source> +<target>Mostrar arquivos que são iguais</target> +<source>Hide files that are different</source> +<target>Ocultar arquivos que são diferentes</target> +<source>Show files that are different</source> +<target>Mostrar arquivos que são diferentes</target> +<source>Hide conflicts</source> +<target>Ocultar conflitos</target> +<source>Show conflicts</source> +<target>Mostrar conflitos</target> +<source>Hide files that will be created on the left side</source> +<target>Ocultar arquivos que serão criados no lado esquerdo</target> +<source>Show files that will be created on the left side</source> +<target>Mostrar arquivos que serão criados no lado esquerdo</target> +<source>Hide files that will be created on the right side</source> +<target>Ocultar arquivos que serão criados no lado direito</target> +<source>Show files that will be created on the right side</source> +<target>Mostrar arquivos que serão criados no lado direito</target> +<source>Hide files that will be deleted on the left side</source> +<target>Ocultar arquivos que serão apagados no lado esquerdo</target> +<source>Show files that will be deleted on the left side</source> +<target>Mostrar arquivos que serão apagados no lado esquerdo</target> +<source>Hide files that will be deleted on the right side</source> +<target>Ocultar arquivos que serão apagados no lado direito</target> +<source>Show files that will be deleted on the right side</source> +<target>Mostrar arquivos que serão apagados no lado direito</target> +<source>Hide files that will be overwritten on left side</source> +<target>Ocultar arquivos que serão substituÃdos no lado esquerdo</target> +<source>Show files that will be overwritten on left side</source> +<target>Mostrar arquivos que serão substituÃdos no lado esquerdo</target> +<source>Hide files that will be overwritten on right side</source> +<target>Ocultar arquivos que serão substituÃdos no lado direito</target> +<source>Show files that will be overwritten on right side</source> +<target>Mostrar arquivos que serão substituÃdos no lado direito</target> +<source>Hide files that won't be copied</source> +<target>Ocultar arquivos que não serão copiados</target> +<source>Show files that won't be copied</source> +<target>Mostrar arquivos que não serão copiados</target> +<source>All directories in sync!</source> +<target>Todos os diretórios em sincronismo!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Por favor execute primeiro a Comparação antes de sincronizar!</target> +<source>Comma separated list</source> +<target>Lista de itens separada por vÃrgula</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Lista de arquivos exportada!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Objeto apagado com sucesso!</pluralform> +<pluralform>%x objetos apagados com sucesso!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 diretório</pluralform> +<pluralform>%x diretórios</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 Arquivo</pluralform> +<pluralform>%x Arquivos</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x de 1 linha</pluralform> +<pluralform>%x de %y linhas</pluralform> +</target> +<source>Scanning...</source> +<target>Pesquisando...</target> +<source>Comparing content...</source> +<target>Comparando conteúdo...</target> +<source>Paused</source> +<target>Pausado</target> +<source>Aborted</source> +<target>Cancelado</target> +<source>Completed</source> +<target>Finalizado</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Cancelar solicitado: Esperando fim da operação...</target> +<source>Continue</source> +<target>Continuar</target> +<source>Pause</source> +<target>Pausar</target> +<source>Cannot find %x</source> +<target>Não foi possÃvel encontrar %x</target> +<source>DECISION TREE</source> +<target>ÃRVORE DE DECISÃO</target> +<source>file exists on both sides</source> +<target>arquivo existe em ambos os lados</target> +<source>on one side only</source> +<target>existente apenas em um lado</target> +<source>different</source> +<target>diferente</target> +<source>Inactive</source> +<target>Inativo</target> +<source>Second</source> +<target>Segundo</target> +<source>Minute</source> +<target>Minuto</target> +<source>Hour</source> +<target>Hora</target> +<source>Day</source> +<target>Dia</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtro: Todos os pares</target> +<source>Filter: Single pair</source> +<target>Filtro: Apenas um par</target> +<source>Ignore</source> +<target>Ignorar</target> +<source>Direct</source> +<target>Direto</target> +<source>Follow</source> +<target>Seguir</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis:</target> +<source>- full file or directory name</source> +<target>- nome completo do arquivo ou diretório</target> +<source>- directory part only</source> +<target>- apenas a parte do diretório</target> +<source>- Other side's counterpart to %name</source> +<target>- Correspondente do outro lado a %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Correspondente do outro lado a %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Restaurar todos os diálogos ocultados?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Você tem certeza que deseja mover o seguinte objeto para a Lixeira?</pluralform> +<pluralform>Você tem certeza que deseja mover os seguintes %x objetos para a Lixeira?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Você tem certeza que deseja apagar o seguinte objeto?</pluralform> +<pluralform>Você tem certeza que deseja apagar os seguintes %x objetos?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Deixar como conflito não resolvido</target> +<source>Delete permanently</source> +<target>Apagar permanentemente</target> +<source>Delete or overwrite files permanently</source> +<target>Apagar ou substituir arquivos permanentemente</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Usar a Lixeira quando apagar ou substituir arquivos</target> +<source>Versioning</source> +<target>Controle de versões</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Mover arquivos para um subdiretório com carimbo de tempo</target> +<source>Cannot determine sync-direction:</source> +<target>Não foi possÃvel determinar a direção de sincronização:</target> +<source>Filter settings have changed!</source> +<target>As configurações do filtro foram alteradas!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Ambos os lados foram alterados desde a última sincronização!</target> +<source>No change since last synchronization!</source> +<target>Nenhuma mudança desde a última sincronização!</target> +<source>The file was not processed by last synchronization!</source> +<target>O arquivo não foi processado pela última sincronização!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>O diretório a ser apagado está em conflito com seus subdiretórios e -arquivos!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Configurando direções padrões de sincronização: Arquivos antigos serão substituÃdos por arquivos mais novos.</target> +<source>The file does not contain a valid configuration:</source> +<target>O arquivo não contém uma configuração válida:</target> +<source>Scanning:</source> +<target>Pesquisando:</target> +<source>Encoding extended time information: %x</source> +<target>Codificando informações adicionais de tempo: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Você pode ignorar esse erro para considerar o diretório como vazio.</target> +<source>Directory does not exist:</source> +<target>Diretório não existe:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Diretórios são dependentes! Cuidado ao definir as regras de sincronização:</target> +<source>Comparing content of files %x</source> +<target>Comparando conteúdo do arquivo %x</target> +<source>Memory allocation failed!</source> +<target>Alocação de memória falhou!</target> +<source>File %x has an invalid date!</source> +<target>Arquivo %x tem uma data inválida!</target> +<source>Conflict detected:</source> +<target>Conflito detectado:</target> +<source>Files %x have the same date but a different size!</source> +<target>Arquivos %x têm a mesma data mas tamanhos diferentes!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Links Simbólicos %x têm a mesma data mas um destino diferente!</target> +<source>Comparing files by content failed.</source> +<target>Comparação de arquivos pelo conteúdo falhou.</target> +<source>Generating file list...</source> +<target>Gerando lista de arquivos...</target> +<source>Multiple...</source> +<target>Múltiplos...</target> +<source>Files that are equal on both sides</source> +<target>Arquivos que são iguais em ambos os lados</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Arquivos/pastas iguais que diferem apenas nos atributos</target> +<source>Copy from right to left</source> +<target>Copiar da direita para a esquerda</target> +<source>Copy from left to right</source> +<target>Copiar da esquerda para a direita</target> +<source>Delete files/folders existing on left side only</source> +<target>Apagar arquivos/pastas existentes apenas no lado esquerdo</target> +<source>Delete files/folders existing on right side only</source> +<target>Apagar arquivos/pastas existentes apenas no lado direito</target> +<source>Copy from right to left overwriting</source> +<target>Copiar da direita para a esquerda substituindo</target> +<source>Copy from left to right overwriting</source> +<target>Copiar da esquerda para a direita substituindo</target> +<source>Do nothing</source> +<target>Não fazer nada</target> +<source>Copy attributes only from right to left</source> +<target>Copiar atributos somente da direita para a esquerda</target> +<source>Copy attributes only from left to right</source> +<target>Copiar atributos somente da esquerda para a direita</target> +<source>Deleting file %x</source> +<target>Apagando arquivo %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Apagando Link Simbólico %x</target> +<source>Deleting folder %x</source> +<target>Apagando pasta %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Movendo %x para a Lixeira</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Movendo arquivo %x para o diretório especificado %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Movendo pasta %x para o diretório especificado %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Movendo Link Simbólico %x para o diretório especificado %y</target> +<source>Copying new file %x to %y</source> +<target>Copiando novo arquivo %x para %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copiando novo Link Simbólico %x para %y</target> +<source>Overwriting file %x in %y</source> +<target>SubstituÃndo arquivo %x em %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>SubstituÃndo Link Simbólico %x em %y</target> +<source>Creating folder %x</source> +<target>Criando pasta %x</target> +<source>Verifying file %x</source> +<target>Verificando arquivo %x</target> +<source>Updating attributes of %x</source> +<target>Atualizando atributos de %x</target> +<source>Source directory does not exist anymore:</source> +<target>Diretório de origem não existe mais:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Nada para sincronizar de acordo com a configuração!</target> +<source>Target directory name must not be empty!</source> +<target>Nome do diretório de destino não pode estar vazio!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Diretório especificado para arquivos apagados não foi definido!</target> +<source>Unresolved conflicts existing!</source> +<target>Conflitos não resolvidos existentes!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Você pode ignorar os conflitos e continuar a sincronização.</target> +<source>Significant difference detected:</source> +<target>Diferença significativa detectada:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Mais de 50% do número total de arquivos será copiado ou apagado!</target> +<source>Not enough free disk space available in:</source> +<target>Espaço em disco insuficiente em:</target> +<source>Free disk space required:</source> +<target>Espaço livre em disco requerido:</target> +<source>Free disk space available:</source> +<target>Espaço livre em disco:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Um diretório será modificado o qual é parte de múltiplos pares de pastas! Por favor revise suas configurações de sincronização!</target> +<source>Processing folder pair:</source> +<target>Processando par de pastas:</target> +<source>Generating database...</source> +<target>Gerando banco de dados...</target> +<source>Error copying locked file %x!</source> +<target>Erro ao copiar arquivo bloqueado %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo!</target> diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index b27d789a..19db6f3b 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -1,912 +1,1066 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port din GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y obiecte È™terse cu succes -%x Bytes -%x BaiÈ›i -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x zile -%x directories -%x dosare -%x files -%x file -%x hour(s) -%x ore -%x kB -%x KB -%x min -%x min -%x of %y rows in view -%x din %y rînduri afiÈ™ate -%x of 1 row in view -%x din 1 rînd afiÈ™at -%x sec -%x sec -%x% -%x% -&Abort -&Anulează -&About... -&Despre... -&Advanced -&Avansate -&Cancel -&Anulează -&Check for new version -&Caută Versiune Nouă a Softului -&Content -&ConÈ›inut -&Create batch job... -&Creează o Sarcină Lot... -&Default -&Implicite -&Exit -&IeÈ™i -&Export file list... -&Exportă Lista de File... -&File -&Filă -&Find next -&GăseÈ™te Următorul -&Global settings... -&Setări Globale... -&Help -&Ajutor -&Ignore -&OK -&Language -&Limbă -&Load -&Deschide -&Load configuration... -&Deschide ConfiguraÈ›ia... -&New -ConfiguraÈ›ie &Nouă -&No -&Nu -&OK -&OK -&Pause -&Pauzează -&Program -&Program -&Quit -&IeÈ™i -&Restore -&Restaurează -&Retry -&Reîncearcă -&Save -&Salvează -&Switch -&Comută -&Yes -&Da -(Build: %x) -(Compilarea: %x) -(Requires an Internet connection!) -(Necesită o conexiune la internet!) -- Other side's counterpart to %dir -- corespondentul din partea opusă al lui %dir -- Other side's counterpart to %name -- corespondentul din partea opusă al lui %name -- conflict -- conflict -- conflict (same date, different size) -- conflict (aceeaÈ™i dată, mărime diferită) -- different -- diferite -- directory part only -- doar dosarele -- equal -- identice -- exists left only -- există doar în stînga -- exists right only -- există doar în dreapta -- full file or directory name -- numele complet al filei sau dosarului -- left -- stînga -- left newer -- cea mai nouă e în stînga -- right -- dreapta -- right newer -- cea mai nouă e în dreapta -/sec -/sec -1 directory -1 dosar -1 file -1 filă -1. &Compare -1. &Compară -1. Enter relative file or directory names separated by ';' or a new line. -1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou. -1. Select directories to monitor. -1. Selectează dosarele de monitorizat. -2. &Synchronize... -2. &Sincronizează... -2. Enter a command line. -2. Scrie calea. -2. Use wildcard characters '*' and '?'. -2. FoloseÈ™te metacaracterele '*' È™i '?' (asterisc È™i semn de întrebare). -3. Exclude files directly on main grid via context menu. -3. Exclude filele È™i dosarele direct de pe grila principală, cu ajutorul meniului contextual. -3. Press 'Start'. -3. Apasă 'PorneÈ™te'. -<Automatic> -<Sincronizare Inteligentă> -<Directory> -<Dosar> -<Last session> -<Ultima Sesiune> -<Symlink> -<Simlegătură> -<multiple selection> -<selectare multiplă> -A directory input field is empty. -Un cîmp de introducere a dosarului este gol. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare! -A newer version of FreeFileSync is available: -Este disponibilă o versiune nouă de FreeFileSync: -Abort requested: Waiting for current operation to finish... -Abandonare solicitată: Se aÈ™teaptă terminarea operaÈ›iunii în curs... -Abort synchronization immediately -Abandonează imediat sincronizarea -Aborted -Abandonată -About -Despre -Action -AcÈ›iune -Add folder -Adaugă Dosar -Add folder pair -Adaugă Pereche Nouă de Dosare -All directories in sync! -Toate dosarele au fost sincronizate! -An exception occurred! -A apărut o excepÈ›ie ! -As a result the files are separated into the following categories: -ÃŽn concluzie, filele sînt repartizate în categoriile următoare: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -AÈ™a cum sugerează È™i numele, două file cu acelaÈ™i nume sînt considerate identice dacă È™i numai dacă este identic È™i conÈ›inutul lor. Această opÈ›iune este utilă mai degrabă pentru verificările de consecvență decît pentru operaÈ›iunile de salvgardare [backup]. AÈ™a că timpurile filelor (data È™i ora) nu sînt luate deloc în considerare.\n\nCu această opÈ›iune activată, arborele de decizie e mai simplu: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Se poate crea o filă cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, precizează astfel numele filei lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe <filă lot>. Această operaÈ›iune poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler]. -At least one directory input field is empty. -Cel puÈ›in un cîmp de introducere a dosarului este gol. -Auto-adjust columns -Autoajustează Coloanele -Batch execution -Execută Fila Lot -Batch file created successfully! -Fila cu lotul de comenzi a fost creată cu succces ! -Batch job -Sarcină Lot -Big thanks for localizing FreeFileSync goes out to: -MulÈ›umiri pentru traducerea FreeFileSync: -Both sides have changed since last synchronization! -Ambele părÈ›i s-au modificat de la ultima sincronizare! -Browse -Explorează -Browse directory -Explorează Dosarul -Cannot determine sync-direction: -Nu se poate determina sensul de sincronizare: -Cannot find %x -Nu pot găsi %x -Cannot write to empty directory path! +<header> + <language name>Română</language name> + <translator>Alexandru Bogdan Munteanu</translator> + <locale>ro_RO</locale> + <flag file>romania.png</flag file> + <plural forms>3</plural forms> + <plural definition>n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2</plural definition> +</header> -Category -Categorie -Clear filter settings -Curăță Setările Filtrului -Comma separated list -Listă de elemente separate prin virgulă -Command line -Linie de comandă -Command line is empty! -Linia de comandă este goală! -Compare -Compară -Compare both sides -Compară PărÈ›ile Stîngă È™i Dreaptă -Compare by \"File content\" -Compară după \"ConÈ›inutul Filelor\" -Compare by \"File size and date\" -Compară după \"Data È™i Mărimea Filelor\" -Compare by... -Compară după: -Comparing content of files %x -Compar conÈ›inutul filelor %x -Comparing content... -Compar conÈ›inutul... -Comparing files by content failed. -Compararea filelor după conÈ›inut a eÈ™uat. -Comparison Result -Rezultatul Comparării -Comparison settings -Setările Comparării -Completed -Sincronizare Terminată -Configuration -ConfiguraÈ›ie -Configuration loaded! -ConfiguraÈ›ie încărcată ! -Configuration overview: -Panorama ConfiguraÈ›iei: -Configuration saved! -ConfiguraÈ›ie salvată ! -Configure filter -Configurează Filtrul -Configure your own synchronization rules. -Reguli de sincronizare definite de utilizator pentru fiecare situaÈ›ie. -Confirm -Confirmare -Conflict detected: -Conflict detectat: -Conflicts/files that cannot be categorized -SituaÈ›ii care nu pot fi incluse într-o anumită categorie -Continue -Continuă -Conversion error: -Eroare de convertire: -Copy attributes only from left to right -Copiază doar atributele de la stînga la dreapta -Copy attributes only from right to left -Copiază doar atributele de la dreapta la stînga -Copy filesystem permissions -Copiază permisiunile sistemului de file -Copy from left to right -Copiază de la Stînga la Dreapta -Copy from left to right overwriting -Copiază de la Stînga la Dreapta cu Suprascriere -Copy from right to left -Copiază de la Dreapta la Stînga -Copy from right to left overwriting -Copiază de la Dreapta la Stînga cu Suprascriere -Copy locked files -Copiază filele zăvorîte [locked] -Copy new or updated files to right folder. -Copiază în dosarul din dreapta filele actualizate sau noi. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copiază filele partajate sau zăvorîte folosind Serviciul de Salvgardare a Volumelor [Volume Shadow Copy]\n(Necesită drepturi de Administrator) -Copy to clipboard\tCTRL+C -Copiază în CliplanÈ™etă\tCTRL+C -Copying new Symbolic Link %x to %y -Copiez noua Legătură Simbolică %x în %y -Copying new file %x to %y -Copiez fila nouă %x în %y -Could not determine volume name for file: -Nu pot determina numele volumului pentru fila: -Could not initialize directory monitoring: -Nu pot iniÈ›ializa monitorizarea dosarelor: -Could not load a required DLL: -Nu pot încărca o filă DLL necesară: -Could not read values for the following XML nodes: -Nu pot citi valorile pentru următoarele noduri XML: -Create a batch job -Creează o Sarcină Lot -Creating folder %x -Creez dosarul %x -Custom -Sincronizare Personalizată -Customize columns -Personalizează coloanele -Customize... -Personalizează... -D-Click -Clic-Dreapta -DECISION TREE -ARBORE DECIZIONAL -Data verification error: Source and target file have different content! -Eroare la verificarea datelor: Filele sursă È™i È›intă au conÈ›inut diferit! -Date -Dată -Delete files/folders existing on left side only -Șterge Itemul din Stînga -Delete files/folders existing on right side only -Șterge Itemul din Dreapta -Delete files\tDEL -Șterge Filele\tDEL -Delete on both sides -Șterge din ambele părÈ›i -Delete on both sides even if the file is selected on one side only -Șterge din ambele părÈ›i, chiar dacă fila e selecÈ›ionată într-o singură parte -Delete or overwrite files permanently -Filele sînt È™terse sau suprascrise în mod definitiv -Delete permanently -Șterge definitiv -Deleting Symbolic Link %x -Șterg legătura simbolică %x -Deleting file %x -Șterg fila %x -Deleting folder %x -Șterg dosarul %x -Deletion handling -Gestionarea Ștergerii -Description -Descriere -Direct -DirecÈ›ionează -Directories are dependent! Be careful when setting up synchronization rules: -Dosarele sînt interdependente! AtenÈ›ie la setarea regulilor de sincronizare: -Directories to watch -Dosare de monitorizat -Directory -Dosar -Directory does not exist: -Dosarul nu există: -Do not show this dialog again -Nu afiÈ™a acest dialog din nou -Do nothing -Nici o AcÈ›iune -Do you really want to delete the following object(s)? -Sigur doreÈ™ti să È™tergi elementele următoare ? -Do you really want to move the following object(s) to the Recycle Bin? -Sigur doreÈ™ti să muÈ›i în Reciclator elementele următoare ? -Do you want FreeFileSync to automatically check for updates every week? -DoreÈ™ti ca FreeFileSync să caute automat actualizări în fiecare săptămînă ? -Donate with PayPal -Donează prin PayPal -Download now? -Descarc acum ? -Drag && drop -Trage un dosar peste compartiment sau foloseÈ™te butonul Explorează -Elements found: -Elemente Găsite: -Elements processed: -Elemente Procesate: -Elements remaining: -Elemente Rămase: -Email -E-mail -Encoding extended time information: %x -Codarea informaÈ›iilor timpului extins: %x -Endless loop when traversing directory: -Buclă infinită la parcurgerea dosarului: -Equal files/folders that differ in attributes only -File/Dosare identice care diferă doar prin atributele lor -Error -Eroare -Error changing modification time: -Eroare la schimbarea datei de modificare: -Error copying file permissions: -Eroare la copierea permisiunilor filei: -Error copying file: -Eroare la copierea filei: -Error copying locked file %x! -Eroare la copierea filei zăvorîte %x! -Error copying symbolic link: -Eroare la copierea legăturii simbolice: -Error creating directory: -Eroare la crearea dosarului: -Error deleting directory: -Eroare la È™tergerea dosarului: -Error deleting file: -Eroare la È™tergerea filei: -Error handling -Gestionarea Erorilor -Error loading library function: -Eroare la încărcarea bibliotecii de funcÈ›ii: -Error moving directory: -Eroare la mutarea dosarului: -Error moving file: -Eroare la mutarea filei: -Error moving to Recycle Bin: -Eroare la mutarea în Reciclator: -Error opening file: -Eroare la deschiderea filei: -Error parsing configuration file: -Eroare la parsarea filei de configurare: -Error reading file attributes: -Eroare la citirea atributelor filei: -Error reading file: -Eroare la citirea filei: -Error reading from synchronization database: -Eroare la citirea din baza de date a sincronizării: -Error reading security context: -Eroare la citirea contextului de securitate: -Error resolving symbolic link: -Eroare la rezolvarea legăturii simbolice: -Error setting directory lock: -Eroare la efectuarea zăvorîrii dosarului: -Error setting privilege: -Eroare la setarea privilegiului: -Error starting Volume Shadow Copy Service! -Eroare la pornirea serviciului Volume Shadow Copy! -Error traversing directory: -Eroare la parcurgerea dosarului: -Error when monitoring directories. -Eroare la monitorizarea dosarelor. -Error writing file: -Eroare la scrierea filei: -Error writing security context: -Eroare la scrierea contextului de securitate: -Error writing to synchronization database: -Eroare la scrierea în baza de date a sincronizării: -Example -Exemplu -Exclude -Excluse -Exclude all rows -Exclude Toate Rîndurile -Exclude temporarily -Exclude Temporar -Exclude via filter: -Exclude prin Filtru: -Exit instantly -IeÈ™i imediat -Extension -Extensie -External applications -AplicaÈ›ii Externe -Fatal Error -Eroare Fatală -Feedback and suggestions are welcome at: -Opiniile È™i sugestiile sînt binevenite: -File %x has an invalid date! -Fila %x are o dată nevalidă ! -File already exists. Overwrite? -Fila există deja. DoreÈ™ti s-o suprascrii? -File content -ConÈ›inutul Filelor -File does not exist: -Fila nu există: -File list exported! -Lista de file a fost exportată! -File size and date -Mărimea È™i Data Filelor -Filename -Numele Filei -Files %x have the same date but a different size! -Filele %x au aceeaÈ™i dată, dar mărime diferită! -Files are found equal if\n - file content\nis the same -Filele sînt considerate identice dacă\n - conÈ›inutul\neste identic -Files are found equal if\n - filesize\n - last write time and date\nare the same -Filele sînt considerate identice dacă\n - mărimea\n - È™i data ultimei modificări\nsînt identice -Files that are equal on both sides -File identice în ambele părÈ›i -Files that exist on both sides, left one is newer -File care există în ambele părÈ›i, cea din stînga fiind mai nouă -Files that exist on both sides, right one is newer -File care există în ambele părÈ›i, cea din dreapta fiind mai nouă -Files that have different content -File care au conÈ›inut diferit -Files/folders that exist on left side only -File sau dosare care există doar în partea stîngă -Files/folders that exist on right side only -File sau dosare care există doar în partea dreaptă -Filter files -Filtru de File -Filter is active -Filtrul este activ -Filter settings have changed! -Setările filtrului au fost schimbate! -Filter: All pairs -Filtru: Toate perechile -Filter: Single pair -Filtru: O singură pereche -Find -GăseÈ™te -Find what: -GăseÈ™te Asta: -Folder Comparison and Synchronization -Comparare È™i Sincronizare de Dosare -Folder pairs -Perechi de Dosare -Follow -UrmăreÈ™te -Free disk space available: -SpaÈ›iu de stocare disponibil: -Free disk space required: -SpaÈ›iu liber de stocare necesar: -FreeFileSync Batch Job -Sarcină cu lot de comenzi FreeFileSync -FreeFileSync at Sourceforge -FreeFileSync la Sourceforge -FreeFileSync batch file -Filă cu lot de comenzi FreeFileSync -FreeFileSync configuration -ConfiguraÈ›ie FreeFileSync -FreeFileSync is up to date! -Ai deja ultima versiune a softului! -Full path -Cale completă -Generating database... -Generez baza de date... -Generating file list... -Generez lista de file... -Global settings -Setări Globale -Help -Ajutor -Hidden dialogs: -Casete de dialog ascunse: -Hide all error and warning messages -Se ascund toate mesajele de eroare È™i de avertizare -Hide conflicts -Ascunde conflictele -Hide excluded items -Ascunde itemurile excluse -Hide files that are different -Ascunde filele care sînt diferite -Hide files that are equal -Ascunde filele care sînt identice -Hide files that are newer on left -Ascunde filele care sînt mai noi în stînga -Hide files that are newer on right -Ascunde filele care sînt mai noi în dreapta -Hide files that exist on left side only -Ascunde filele care există doar în stînga -Hide files that exist on right side only -Ascunde filele care există doar în dreapta -Hide files that will be created on the left side -Ascunde filele care vor fi create în stînga -Hide files that will be created on the right side -Ascunde filele care vor fi create în dreapta -Hide files that will be deleted on the left side -Ascunde filele care vor fi È™terse în stînga -Hide files that will be deleted on the right side -Ascunde filele care vor fi È™terse în dreapta -Hide files that will be overwritten on left side -Ascunde filele care vor fi suprascrise în stînga -Hide files that will be overwritten on right side -Ascunde filele care vor fi suprascrise în dreapta -Hide files that won't be copied -Ascunde filele care nu vor fi copiate -Hide filtered or temporarily excluded files -Ascunde filele filtrate sau excluse temporar -Hide further error messages during the current process -Ascunde mesajele de eroare apărute ulterior în timpul acestui proces -Hints: -Sfaturi: -Homepage -Sit -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identifică È™i propagă modificările în ambele părÈ›i folosind o bază de date. Ștergerile È™i conflictele sînt detectate automat. -Idle time between detection of last change and execution of command line in seconds -Timp de inactivitate (în secunde) între detectarea ulimei modificări È™i executarea liniei de comandă -If you like FFS -Donare pentru FFS -Ignore -Ignoră -Ignore errors -Ignoră erorile -Ignore subsequent errors -Ignoră (nu lua în seamă) erorile ulterioare -Include -Incluse -Include all rows -Include Toate Rîndurile -Include temporarily -Include Temporar -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incluse: *.doc;*.zip;*.exe\nExcluse: \\chestii\\temp\\* -Incompatible synchronization database format: -Format incompatibil al bazei de date a sincronizării: -Info -InformaÈ›ii -Information -InformaÈ›ii -Initial synchronization: -Sincronizare iniÈ›ială: -Integrate external applications into context menu. The following macros are available: -Include aplicaÈ›iile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi: -Invalid FreeFileSync config file! -Filă de configurare FreeFileSync nevalidă! -Last used configurations (press DEL to remove from list) -Ultimele configuraÈ›ii utilizate (apasă tasta DEL pentru a înlătura din listă) -Leave as unresolved conflict -Lasă ca Conflict Nerezolvat -Left -Stînga -Legend -Legendă -Load configuration from file -ÃŽncarcă configuraÈ›ia dintr-o filă -Log-messages: -Mesaje de jurnalizare: -Logging -Jurnalizez -Main bar -Bara Principală -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. FoloseÈ™te versiunea pe 64-biÈ›i a FreeFileSync. -Match case -PotriveÈ™te MAJ/min -Maximum number of logfiles: -Numărul maxim de file jurnal: -Memory allocation failed! -Alocarea memoriei a eÈ™uat! -Minimum Idle Time [seconds] -Timp Minim de Inactivitate [secunde] -Mirror ->> -Clonare =>> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Salvgardare în oglindă a dosarului stîng. Dosarul drept este modificat pentru a fi identic cu cel stîng după sincronizare. -Monitoring active... -Monitorizare activă... -More than 50% of the total number of files will be copied or deleted! -Peste 50% din numărul total de file vor fi copiate sau distruse! -Move column down -Mută coloana în jos -Move column up -Mută coloana în sus -Move files into a time-stamped subdirectory -Mută filele într-un subdosar cu marcaj de timp -Moving %x to Recycle Bin -Mut %x în Reciclator -Moving Symbolic Link %x to user-defined directory %y -Mut legătura simbolică %x în dosarul ales de utilizator %y -Moving file %x to user-defined directory %y -Mut fila %x în dosarul %y ales de utilizator -Moving folder %x to user-defined directory %y -Mut dosarul %x în dosarul %y ales de utilizator -Multiple... -Multiplu... -No change since last synchronization! -Nu sînt schimbări de la ultima sincronizare! -No filter selected -Nu a fost selectat nici un filtru -Not enough free disk space available in: -SpaÈ›iu de stocare insuficient pe: -Nothing to synchronize according to configuration! -Nu este nimic de sincronizat conform configuraÈ›iei! -Number of files and directories that will be created -Numărul de file È™i dosare care vor fi create -Number of files and directories that will be deleted -Numărul de file È™i dosare care vor fi È™terse -Number of files that will be overwritten -Numărul de file care vor fi suprascrise -One of the FreeFileSync database entries within the following file is not yet existing: -Una dintre intrările în baza de date FreeFileSync din fila următoare nu există: -One of the FreeFileSync database files is not yet existing: -Una dintre părÈ›i nu are o filă de tip bază de date FreeFileSync: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Doar filele sau dosarele care trec de filtru vor fi selecÈ›ionate pentru sincronizare. Filtrul va fi aplicat la numele elementelor aflate ierarhic sub dosarul de sincronizat. -Open with Explorer -Deschide în Windows Explorer -Open with default application -Deschide cu AplicaÈ›ia Implicită -Operation aborted! -OperaÈ›iune abandonată! -Operation: -OperaÈ›iune: -Overview -Panoramă -Overwriting Symbolic Link %x in %y -Suprascriu Legătura Simbolică %x în %y -Overwriting file %x in %y -Suprascriu fila %x în %y -Pause -Pauză -Paused -Pauzat -Planned directory deletion is in conflict with its subdirectories and -files! -Ștergerea plănuită a dosarului intră în conflict cu subdosarele È™i filele sale! -Please run a Compare first before synchronizing! -Rulează compararea înainte de a sincroniza! -Press \"Switch\" to open FreeFileSync GUI mode. -Apasă \"Comută\" pentru a deschide modul grafic al FreeFileSync -Processing folder pair: -Procesez perechea de dosare: -Published under the GNU General Public License: -Publicat sub licenÈ›a GNU GPL: -Question -ÃŽntrebare -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronizare Inteligentă -RealtimeSync configuration -RealtimeSync configuraÈ›ie -Recycle Bin not yet supported for this system! -Reciclatorul nu este încă suportat pentru acest sistem de operare! -Relative path -Calea Relativă -Remove alternate settings -ÃŽnlătură setările alternative -Remove folder -ÃŽnlătură Dosarul -Remove folder pair -ÃŽnlătură Perechea de Dosare -Report translation error -Raportarea erorilor de traducere -Reset -Resetează -Reset view -Resetează Vederea -Restore all hidden dialogs? -Restaurezi toate casetele de dialog ascunse? -Right -Dreapta -S&ave configuration... -S&alvează ConfiguraÈ›ia... -S&witch view -Schimbă &Vederea -Save changes to current configuration? -DoreÈ™ti să salvezi modificările configuraÈ›iei curente? -Save current configuration to file -Salvează într-o filă modificările configuraÈ›iei curente -Scanning... -Scanez... -Scanning: -Scanez: -Select a folder -Selectează un dosar -Select alternate synchronization settings -Selectează o altă configuraÈ›ie a sincronizării -Select logfile directory: -Selectează un dosar pentru fila .log: -Select variant: -Selectează Varianta de Sincronizare: -Select view -Selectează Vederea -Set direction: -Setează AcÈ›iunea ca în Icoana Alăturată: -Setting default synchronization directions: Old files will be overwritten with newer files. -Va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi. -Show \"%x\" -Arată \"%x\" -Show conflicts -Arată conflictele -Show files that are different -Arată filele diferite -Show files that are equal -Arată filele identice -Show files that are newer on left -Arată filele din stînga mai noi decît cele din dreapta -Show files that are newer on right -Arată filele din dreapta mai noi decît cele din stînga -Show files that exist on left side only -Arată filele care există doar în stînga -Show files that exist on right side only -Arată filele care există doar în dreapta -Show files that will be created on the left side -Arată filele care vor fi create în stînga -Show files that will be created on the right side -Arată filele care vor fi create în dreapta -Show files that will be deleted on the left side -Arată filele care vor fi È™terse în stînga -Show files that will be deleted on the right side -Arată filele care vor fi È™terse în dreapta -Show files that will be overwritten on left side -Arată filele care vor fi suprascrise în stînga -Show files that will be overwritten on right side -Arată filele care vor fi suprascrise în dreapta -Show files that won't be copied -Arată filele care nu vor fi copiate -Show hidden dialogs -Arată casetele de dialog ascunse -Show popup -Arată caseta de dialog -Show popup on errors or warnings -Se arată o casetă de dialog pentru fiecare eroare sau avertisment -Significant difference detected: -Diferență semnificativă detectată: -Silent mode -Mod silenÈ›ios -Size -Mărime -Source code written completely in C++ utilizing: -Cod sursă scris complet în C++ folosind: -Source directory does not exist anymore: -Dosarul sursă nu mai există: -Speed: -Viteză: -Start -PorneÈ™te -Start minimized and write status information to a logfile -PorneÈ™te minimizat È™i scrie informaÈ›iile de stare într-un jurnal -Start synchronization -PorneÈ™te Sincronizarea -Statistics -Statistici -Status feedback -EvoluÈ›ia stării -Stop -OpreÈ™te -Swap sides -Schimbă părÈ›ile între ele -Switching to FreeFileSync GUI mode... -Comut la modul grafic al FreeFileSync... -Symbolic Link handling -Prelucrarea Legăturilor Simbolice (Simlegături) -Symlinks %x have the same date but a different target! -Simlegăturile %x au aceeaÈ™i dată, dar È›inte diferite! -Synchronization Preview -Previzionarea Sincronizării -Synchronization aborted! -Sincronizare abandonată! -Synchronization completed successfully! -Sincronizare terminată cu succes! -Synchronization completed with errors! -Sincronizare terminată cu erori! -Synchronization settings -Setările Sincronizării -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizează filele .doc, .zip È™i .exe, cu excepÈ›ia celor din dosarul \"temp\". -Synchronize... -Sincronizează -Synchronizing... -Sincronizare aflată în curs... -Target directory already existing! -Dosarul È›intă există deja! -Target file already existing! -Fila È›intă există deja! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Linia de comandă este executată de fiecare dată cînd:\n- toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB)\n- filele conÈ›inute în aceste dosare sau subdosare sînt modificate -The file does not contain a valid configuration: -Fila nu conÈ›ine o configuraÈ›ie validă: -The file was not processed by last synchronization! -Fila nu a fost procesată la ultima sincronizare! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Această variantă defineÈ™te două file cu acelaÈ™i nume ca fiind identice atunci cînd au aceeaÈ™i mărime ȘI aceeaÈ™i dată È™i oră a ultimei modificări. -Time -Oră -Time elapsed: -Timp Scurs: -Time remaining: -Timp Rămas: -Total amount of data that will be transferred -Volumul total de date care va fi transferat -Total time: -Timp Total: -Transfer file and directory permissions\n(Requires Administrator rights) -Transferă permisiunile filelor È™i dosarelor\n(Necesită drepturi de Administrator) -Unable to connect to sourceforge.net! -Conectarea la situl sourceforge.net nu poate fi realizată! -Unable to create logfile! -Fila jurnal nu poate fi creată! -Unresolved conflicts existing! -Există conflicte nerezolvate! -Update -> -Actualizare => -Updating attributes of %x -Actualizez atributele lui %x -Usage: -Utilizare: -Use Recycle Bin -Mută în reciclator -Use Recycle Bin when deleting or overwriting files -Se foloseÈ™te Reciclatorul [Recycle Bin] cu ocazia È™tergerii sau suprascrierii unei file -User-defined directory for deletion was not specified! -Dosarul ales de utilizator pentru È™tergere nu a fost specificat ! -Variant -Varianta Sincronizării -Verifying file %x -Verific fila %x -Versioning -Versionare -Volume name %x not part of filename %y! -Numele volumului %x nu face parte din numele filei %y ! -Waiting for missing directories... -AÈ™tept ca dosarele lipsă să devină disponibile... -Waiting while directory is locked (%x)... -AÈ™tept ca dosarul să fie zăvorît (%x)... -Warning -Avertisment -When the comparison is started with this option set the following decision tree is processed: -Cînd compararea este pornită cu acest set de opÈ›iuni, este executat următorul arbore de decizie: -You can ignore conflicts and continue synchronization. -PoÈ›i ignora conflictele pentru a continua cu sincronizarea. -You can ignore this error to consider the directory as empty. -PoÈ›i ignora această eroare pentru ca dosarul să fie considerat gol. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -PoÈ›i încerca să sincronizezi din nou itemurile rămase (FÄ‚RÄ‚ a le recompara) ! -different -file diferite -file exists on both sides -fila există în ambele părÈ›i -on one side only -fila există doar într-o parte +<source>Show in Explorer</source> +<target>Arată în Explorator</target> +<source>Open with default application</source> +<target>Deschide cu AplicaÈ›ia Implicită</target> +<source>Browse directory</source> +<target>Explorează Dosarul</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Sincronizare Inteligentă</target> +<source>Browse</source> +<target>Explorează</target> +<source>Error resolving symbolic link:</source> +<target>Eroare la rezolvarea legăturii simbolice:</target> +<source>Select alternate synchronization settings</source> +<target>Selectează o altă configuraÈ›ie a sincronizării</target> +<source>No filter selected</source> +<target>Nu a fost selectat nici un filtru</target> +<source>Filter is active</source> +<target>Filtrul este activ</target> +<source>Clear filter settings</source> +<target>Curăță Setările Filtrului</target> +<source>Remove alternate settings</source> +<target>ÃŽnlătură setările alternative</target> +<source>Create a batch job</source> +<target>Creează o Sarcină Lot</target> +<source>Synchronization settings</source> +<target>Setările Sincronizării</target> +<source>Comparison settings</source> +<target>Setările Comparării</target> +<source>About</source> +<target>Despre</target> +<source>Error</source> +<target>Eroare</target> +<source>Warning</source> +<target>AtenÈ›ie</target> +<source>Question</source> +<target>ÃŽntrebare</target> +<source>Confirm</source> +<target>Confirmare</target> +<source>Configure filter</source> +<target>Configurează Filtrul</target> +<source>Customize columns</source> +<target>Personalizează coloanele</target> +<source>Global settings</source> +<target>Setări Globale</target> +<source>Synchronization Preview</source> +<target>Previzionarea Sincronizării</target> +<source>Find</source> +<target>GăseÈ™te</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Bait</pluralform> +<pluralform>%x BaiÈ›i</pluralform> +<pluralform>%x de BaiÈ›i</pluralform> +</target> +<source><Symlink></source> +<target><Simlegătură></target> +<source><Directory></source> +<target><Dosar></target> +<source>Size</source> +<target>Mărime</target> +<source>Date</source> +<target>Dată</target> +<source>Full path</source> +<target>Cale completă</target> +<source>Filename</source> +<target>Numele Filei</target> +<source>Relative path</source> +<target>Calea Relativă</target> +<source>Directory</source> +<target>Dosar</target> +<source>Extension</source> +<target>Extensie</target> +<source>Comparison Result</source> +<target>Rezultatul Comparării</target> +<source>Incompatible synchronization database format:</source> +<target>Format al bazei de date necompatibil cu versiunea softului:</target> +<source>Initial synchronization:</source> +<target>Sincronizare iniÈ›ială:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Una dintre părÈ›i nu are o filă de tip bază de date FreeFileSync:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Una dintre intrările în baza de date FreeFileSync din fila următoare nu există:</target> +<source>Error reading from synchronization database:</source> +<target>Eroare la citirea din baza de date a sincronizării:</target> +<source>An exception occurred!</source> +<target>A apărut o excepÈ›ie !</target> +<source>Error deleting file:</source> +<target>Eroare la È™tergerea filei:</target> +<source>Error reading file attributes:</source> +<target>Eroare la citirea atributelor filei:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>AÈ™tept ca dosarul să fie zăvorît (%x)...</target> +<source>Error setting directory lock:</source> +<target>Eroare la efectuarea zăvorîrii dosarului:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +<pluralform>%x de sec</pluralform> +</target> +<source>Info</source> +<target>InformaÈ›ii</target> +<source>Fatal Error</source> +<target>Eroare Fatală</target> +<source>File does not exist:</source> +<target>Fila nu există:</target> +<source>Error parsing configuration file:</source> +<target>Eroare la parsarea filei de configurare:</target> +<source>Error writing file:</source> +<target>Eroare la scrierea filei:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Filă de configurare FreeFileSync nevalidă!</target> +<source>/sec</source> +<target>/sec</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +<pluralform>%x de min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 oră</pluralform> +<pluralform>%x ore</pluralform> +<pluralform>%x de ore</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 zi</pluralform> +<pluralform>%x zile</pluralform> +<pluralform>%x de zile</pluralform> +</target> +<source>S&ave configuration...</source> +<target>S&alvează ConfiguraÈ›ia...</target> +<source>&Load configuration...</source> +<target>&Deschide ConfiguraÈ›ia...</target> +<source>&Quit</source> +<target>&IeÈ™i</target> +<source>&File</source> +<target>&Filă</target> +<source>&Content</source> +<target>&ConÈ›inut</target> +<source>&About...</source> +<target>&Despre...</target> +<source>&Help</source> +<target>&Ajutor</target> +<source>Usage:</source> +<target>Utilizare:</target> +<source>1. Select directories to monitor.</source> +<target>1. Selectează dosarele de monitorizat.</target> +<source>2. Enter a command line.</source> +<target>2. Scrie calea.</target> +<source>3. Press 'Start'.</source> +<target>3. Apasă 'PorneÈ™te'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Linia de comandă este executată de fiecare dată cînd: +- toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB) +- filele conÈ›inute în aceste dosare sau subdosare sînt modificate +</target> +<source>Directories to watch</source> +<target>Dosare de monitorizat</target> +<source>Add folder</source> +<target>Adaugă Dosar</target> +<source>Remove folder</source> +<target>ÃŽnlătură Dosarul</target> +<source>Select a folder</source> +<target>Selectează un dosar</target> +<source>Command line</source> +<target>Linie de comandă</target> +<source>Minimum Idle Time [seconds]</source> +<target>Timp Minim de Inactivitate [secunde]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Timp de inactivitate (în secunde) între detectarea ultimei modificări È™i executarea liniei de comandă</target> +<source>Start</source> +<target>PorneÈ™te</target> +<source>(Build: %x)</source> +<target>(CompilaÈ›ia: %x)</target> +<source>RealtimeSync configuration</source> +<target>ConfiguraÈ›ia RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Fila există deja. Vrei s-o suprascrii?</target> +<source>&Restore</source> +<target>&Restaurează</target> +<source>&Exit</source> +<target>&IeÈ™i</target> +<source>Monitoring active...</source> +<target>Monitorizare activă...</target> +<source>Waiting for missing directories...</source> +<target>AÈ™tept ca dosarele lipsă să devină disponibile...</target> +<source>Command line is empty!</source> +<target>Linia de comandă este goală!</target> +<source>Could not initialize directory monitoring:</source> +<target>Nu pot iniÈ›ializa monitorizarea dosarelor:</target> +<source>A directory input field is empty.</source> +<target>Cel puÈ›in unul din dosarele de comparat este nespecificat.</target> +<source>Error when monitoring directories.</source> +<target>Eroare la monitorizarea dosarelor.</target> +<source>Drag && drop</source> +<target>Trage un dosar peste compartiment sau foloseÈ™te butonul Explorează</target> +<source>Conversion error:</source> +<target>Eroare de convertire:</target> +<source>Error moving file:</source> +<target>Eroare la mutarea filei:</target> +<source>Operation aborted!</source> +<target>OperaÈ›ie abandonată!</target> +<source>Target file already existing!</source> +<target>Fila È›intă există deja!</target> +<source>Error moving directory:</source> +<target>Eroare la mutarea dosarului:</target> +<source>Target directory already existing!</source> +<target>Dosarul È›intă există deja!</target> +<source>Error deleting directory:</source> +<target>Eroare la È™tergerea dosarului:</target> +<source>Error changing modification time:</source> +<target>Eroare la schimbarea datei de modificare:</target> +<source>Error loading library function:</source> +<target>Eroare la încărcarea bibliotecii de funcÈ›ii:</target> +<source>Error reading security context:</source> +<target>Eroare la citirea contextului de securitate:</target> +<source>Error writing security context:</source> +<target>Eroare la scrierea contextului de securitate:</target> +<source>Error copying file permissions:</source> +<target>Eroare la copierea permisiunilor filei:</target> +<source>Error creating directory:</source> +<target>Eroare la crearea dosarului:</target> +<source>Error copying symbolic link:</source> +<target>Eroare la copierea legăturii simbolice:</target> +<source>Error copying file:</source> +<target>Eroare la copierea filei:</target> +<source>Error opening file:</source> +<target>Eroare la deschiderea filei:</target> +<source>Error reading file:</source> +<target>Eroare la citirea filei:</target> +<source>Endless loop when traversing directory:</source> +<target>Buclă infinită la parcurgerea dosarului:</target> +<source>Error traversing directory:</source> +<target>Eroare la parcurgerea dosarului:</target> +<source>Error setting privilege:</source> +<target>Eroare la setarea privilegiului:</target> +<source>Error moving to Recycle Bin:</source> +<target>Eroare la mutarea în Reciclator:</target> +<source>Could not load a required DLL:</source> +<target>Nu pot încărca o filă DLL necesară:</target> +<source>Error writing to synchronization database:</source> +<target>Eroare la scrierea în baza de date a sincronizării:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Eroare la pornirea serviciului Volume Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. FoloseÈ™te versiunea pe 64-biÈ›i a FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>Nu pot determina numele volumului pentru fila:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Numele volumului %x nu face parte din numele filei %y !</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Nu pot citi valorile pentru următoarele noduri XML:</target> +<source>Show popup</source> +<target>Arată casete de dialog</target> +<source>Show popup on errors or warnings</source> +<target>Este arătată o casetă de dialog pentru fiecare eroare sau avertisment</target> +<source>Ignore errors</source> +<target>Ignoră erorile</target> +<source>Hide all error and warning messages</source> +<target>Sînt ascunse toate mesajele de eroare È™i de avertizare</target> +<source>Exit instantly</source> +<target>IeÈ™i imediat</target> +<source>Abort synchronization immediately</source> +<target>Abandonează imediat sincronizarea</target> +<source>Logging</source> +<target>Jurnalizez</target> +<source>FreeFileSync batch file</source> +<target>Filă cu lot de comenzi FreeFileSync</target> +<source>FreeFileSync configuration</source> +<target>ConfiguraÈ›ie FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>Sarcină cu lot de comenzi FreeFileSync</target> +<source>Unable to create logfile!</source> +<target>Fila jurnal nu poate fi creată!</target> +<source>Batch execution</source> +<target>Execută Fila Lot</target> +<source>Log-messages:</source> +<target>Mesaje de jurnalizare:</target> +<source>Stop</source> +<target>OpreÈ™te</target> +<source>Total time:</source> +<target>Timp Total:</target> +<source>Synchronization aborted!</source> +<target>Sincronizare abandonată!</target> +<source>Synchronization completed with errors!</source> +<target>Sincronizare terminată cu erori!</target> +<source>Synchronization completed successfully!</source> +<target>Sincronizare terminată cu succes!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Apasă "Comută" pentru a deschide modul grafic al FreeFileSync</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Comut la modul grafic al FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Conectarea la situl sourceforge.net nu poate fi realizată!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Este disponibilă o versiune nouă a softului:</target> +<source>Download now?</source> +<target>Vrei s-o descarci acum ?</target> +<source>Information</source> +<target>InformaÈ›ii</target> +<source>FreeFileSync is up to date!</source> +<target>Ai deja ultima versiune a softului!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Vrei ca FreeFileSync să caute automat actualizări în fiecare săptămînă ?</target> +<source>(Requires an Internet connection!)</source> +<target>(Necesită o conexiune la internet!)</target> +<source>1. &Compare</source> +<target>1. &Compară</target> +<source>2. &Synchronize...</source> +<target>2. &Sincronizează...</target> +<source>S&witch view</source> +<target>Schimbă &Vederea</target> +<source>&New</source> +<target>ConfiguraÈ›ie &Nouă</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&Limbă</target> +<source>&Global settings...</source> +<target>&Setări Globale...</target> +<source>&Create batch job...</source> +<target>&Creează o Sarcină Lot...</target> +<source>&Export file list...</source> +<target>&Exportă Lista de File...</target> +<source>&Advanced</source> +<target>&Avansate</target> +<source>&Check for new version</source> +<target>&Caută Versiune Nouă a Softului</target> +<source>Compare</source> +<target>Compară</target> +<source>Compare both sides</source> +<target>Compară PărÈ›ile Stîngă È™i Dreaptă</target> +<source>&Abort</source> +<target>&Anulează</target> +<source>Synchronize...</source> +<target>Sincronizează</target> +<source>Start synchronization</source> +<target>PorneÈ™te Sincronizarea</target> +<source>Swap sides</source> +<target>Schimbă compartimentele stîng È™i drept între ele</target> +<source>Add folder pair</source> +<target>Adaugă Pereche Nouă de Dosare</target> +<source>Remove folder pair</source> +<target>ÃŽnlătură Perechea de Dosare</target> +<source>Save current configuration to file</source> +<target>Salvează într-o filă modificările configuraÈ›iei curente</target> +<source>Load configuration from file</source> +<target>ÃŽncarcă configuraÈ›ia dintr-o filă</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Ultimele configuraÈ›ii utilizate (apasă tasta DEL pentru a înlătura din listă)</target> +<source>Hide excluded items</source> +<target>Ascunde itemurile excluse</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Ascunde filele filtrate sau excluse temporar</target> +<source>Number of files and directories that will be created</source> +<target>Numărul de file È™i dosare care vor fi create</target> +<source>Number of files that will be overwritten</source> +<target>Numărul de file care vor fi suprascrise</target> +<source>Number of files and directories that will be deleted</source> +<target>Numărul de file È™i dosare care vor fi È™terse</target> +<source>Total amount of data that will be transferred</source> +<target>Volumul total de date care va fi transferat</target> +<source>Left</source> +<target>Stînga</target> +<source>Right</source> +<target>Dreapta</target> +<source>Batch job</source> +<target>Sarcină Lot</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Se poate crea o filă cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, precizează astfel numele filei lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe <filă lot>. Această operaÈ›ie poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler].</target> +<source>Help</source> +<target>Ajutor</target> +<source>Configuration overview:</source> +<target>Panorama ConfiguraÈ›iei:</target> +<source>Filter files</source> +<target>Filtru de File</target> +<source>Status feedback</source> +<target>AfiÈ™area Stării</target> +<source>Silent mode</source> +<target>Mod silenÈ›ios</target> +<source>Start minimized and write status information to a logfile</source> +<target>PorneÈ™te minimizat È™i scrie informaÈ›iile de stare într-un jurnal</target> +<source>Error handling</source> +<target>Gestionarea Erorilor</target> +<source>Overview</source> +<target>Panoramă</target> +<source>Select logfile directory:</source> +<target>Selectează un dosar pentru fila .log:</target> +<source>Maximum number of logfiles:</source> +<target>Numărul maxim de file jurnal:</target> +<source>&Save</source> +<target>&Salvează</target> +<source>&Load</source> +<target>&Deschide</target> +<source>&Cancel</source> +<target>&Anulează</target> +<source>Elements found:</source> +<target>Elemente Găsite:</target> +<source>Elements remaining:</source> +<target>Elemente Rămase:</target> +<source>Speed:</source> +<target>Viteză:</target> +<source>Time remaining:</source> +<target>Timp Rămas:</target> +<source>Time elapsed:</source> +<target>Timp Scurs:</target> +<source>Operation:</source> +<target>OperaÈ›ie:</target> +<source>Select variant:</source> +<target>Selectează Varianta de Sincronizare:</target> +<source><Automatic></source> +<target><Sincronizare Inteligentă></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identifică È™i propagă modificările în ambele părÈ›i folosind o bază de date. Ștergerile È™i conflictele sînt detectate automat.</target> +<source>Mirror ->></source> +<target>Clonare =>></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng.</target> +<source>Update -></source> +<target>Actualizare =></target> +<source>Copy new or updated files to right folder.</source> +<target>Copiază în dosarul din dreapta filele actualizate sau noi.</target> +<source>Custom</source> +<target>Sincronizare Personalizată</target> +<source>Configure your own synchronization rules.</source> +<target>Reguli de sincronizare definite de utilizator pentru fiecare situaÈ›ie.</target> +<source>Deletion handling</source> +<target>Gestionarea Ștergerii</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>ConfiguraÈ›ie</target> +<source>Category</source> +<target>Categorie</target> +<source>Action</source> +<target>AcÈ›iune</target> +<source>Files/folders that exist on left side only</source> +<target>File sau dosare care există doar în partea stîngă</target> +<source>Files/folders that exist on right side only</source> +<target>File sau dosare care există doar în partea dreaptă</target> +<source>Files that exist on both sides, left one is newer</source> +<target>File care există în ambele părÈ›i, cea din stînga fiind mai nouă</target> +<source>Files that exist on both sides, right one is newer</source> +<target>File care există în ambele părÈ›i, cea din dreapta fiind mai nouă</target> +<source>Files that have different content</source> +<target>File care au conÈ›inut diferit</target> +<source>Conflicts/files that cannot be categorized</source> +<target>SituaÈ›ii care nu pot fi incluse într-o anumită categorie</target> +<source>Compare by...</source> +<target>Compară după:</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Filele sînt considerate identice dacă + - mărimea + - È™i data ultimei modificări +sînt identice +</target> +<source>File size and date</source> +<target>Mărimea È™i Data Filelor</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filele sînt considerate identice dacă + - conÈ›inutul +este identic +</target> +<source>File content</source> +<target>ConÈ›inutul Filelor</target> +<source>Symbolic Link handling</source> +<target>Prelucrarea Legăturilor Simbolice (Simlegături)</target> +<source>Synchronizing...</source> +<target>Sincronizare Aflată în Curs...</target> +<source>Elements processed:</source> +<target>Elemente Procesate:</target> +<source>&Pause</source> +<target>&Pauzează</target> +<source>Compare by "File size and date"</source> +<target>Compară după "Data È™i Mărimea Filelor"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Această variantă defineÈ™te două file cu acelaÈ™i nume ca fiind identice atunci cînd au aceeaÈ™i mărime ȘI aceeaÈ™i dată È™i oră a ultimei modificări.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Cînd compararea este pornită cu acest set de opÈ›iuni, este executat următorul arbore de decizie:</target> +<source>As a result the files are separated into the following categories:</source> +<target>ÃŽn concluzie, filele sînt repartizate în categoriile următoare:</target> +<source>- equal</source> +<target>- identice</target> +<source>- left newer</source> +<target>- cea mai nouă e în stînga</target> +<source>- right newer</source> +<target>- cea mai nouă e în dreapta</target> +<source>- exists left only</source> +<target>- există doar în stînga</target> +<source>- exists right only</source> +<target>- există doar în dreapta</target> +<source>- conflict</source> +<target>- conflict</target> +<source>Compare by "File content"</source> +<target>Compară după "ConÈ›inutul Filelor"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +AÈ™a cum sugerează È™i numele, două file cu acelaÈ™i nume sînt considerate identice dacă È™i numai dacă este identic È™i conÈ›inutul lor. Această opÈ›iune este utilă mai degrabă pentru verificările de consecvență decît pentru operaÈ›iunile de conservare [backup]. AÈ™a că timpurile filelor (data È™i ora) nu sînt luate deloc în considerare. + +Cu această opÈ›iune activată, arborele de decizie e mai simplu: +</target> +<source>- different</source> +<target>- diferite</target> +<source>Source code written in C++ utilizing:</source> +<target>Cod sursă scris în C++ folosind:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>MulÈ›umiri pentru traducerea FreeFileSync:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Opiniile È™i sugestiile sînt binevenite:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync la Sourceforge</target> +<source>Homepage</source> +<target>Sit</target> +<source>If you like FFS</source> +<target>Donează pentru FFS</target> +<source>Donate with PayPal</source> +<target>Donează prin PayPal</target> +<source>Email</source> +<target>Adresă</target> +<source>Report translation error</source> +<target>Raportează erori de trad.</target> +<source>Published under the GNU General Public License:</source> +<target>Publicat sub licenÈ›a GNU GPL:</target> +<source>Ignore subsequent errors</source> +<target>Ignoră (nu lua în seamă) erorile ulterioare</target> +<source>Hide further error messages during the current process</source> +<target>Ascunde mesajele de eroare apărute ulterior în timpul acestui proces</target> +<source>&Ignore</source> +<target>&OK</target> +<source>&Retry</source> +<target>&Reîncearcă</target> +<source>Do not show this dialog again</source> +<target>Nu afiÈ™a acest dialog din nou</target> +<source>&Switch</source> +<target>&Comută</target> +<source>&Yes</source> +<target>&Da</target> +<source>&No</source> +<target>&Nu</target> +<source>Delete on both sides</source> +<target>Șterge din ambele părÈ›i</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Șterge din ambele părÈ›i, chiar dacă fila e selecÈ›ionată într-o singură parte</target> +<source>Use Recycle Bin</source> +<target>Mută în Reciclator</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Doar filele/dosarele care îndeplinesc toate condiÈ›iile filtrului vor fi selectate pentru sincronizare. +Notă: Filtrul de nume este relaÈ›ionat la calea dosarelor principale sincronizate (itemurile filtrate au specificată o cale relativă). +</target> +<source>Hints:</source> +<target>Sfaturi:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. FoloseÈ™te metacaracterele '*' È™i '?' (asterisc È™i semn de întrebare).</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Exclude filele È™i dosarele direct de pe grila principală, cu ajutorul meniului contextual.</target> +<source>Example</source> +<target>Exemplu</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Incluse: *.doc;*.zip;*.exe +Excluse: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sincronizează filele .doc, .zip È™i .exe, cu excepÈ›ia celor din dosarul "temp".</target> +<source>Include</source> +<target>Incluse</target> +<source>Exclude</source> +<target>Excluse</target> +<source>Select time span:</source> +<target>Intervalul de timp:</target> +<source>Minimum file size:</source> +<target>Mărimea minimă a filelor:</target> +<source>Maximum file size:</source> +<target>Mărimea maximă a filelor:</target> +<source>&Default</source> +<target>&Implicite</target> +<source>Move column up</source> +<target>Mută coloana în sus</target> +<source>Move column down</source> +<target>Mută coloana în jos</target> +<source>Copy locked files</source> +<target>Copiază filele zăvorîte [locked]</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copiază filele partajate sau zăvorîte folosind Serviciul de Conservare a Volumelor [Volume Shadow Copy] +(Necesită drepturi de Administrator) +</target> +<source>Copy filesystem permissions</source> +<target>Copiază permisiunile sistemului de file</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transferă permisiunile filelor È™i dosarelor +(Necesită drepturi de Administrator) +</target> +<source>Hidden dialogs:</source> +<target>Casete de dialog ascunse:</target> +<source>Reset</source> +<target>Resetează</target> +<source>Show hidden dialogs</source> +<target>Arată casetele de dialog ascunse</target> +<source>External applications</source> +<target>AplicaÈ›ii Externe</target> +<source>Description</source> +<target>Descriere</target> +<source>Variant</source> +<target>Varianta Sincronizării</target> +<source>Statistics</source> +<target>Statistici</target> +<source>Find what:</source> +<target>GăseÈ™te Asta:</target> +<source>Match case</source> +<target>PotriveÈ™te MAJ/min</target> +<source>&Find next</source> +<target>&GăseÈ™te Următorul</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>PoÈ›i încerca să sincronizezi din nou itemurile rămase (FÄ‚RÄ‚ recomparare) !</target> +<source>Batch file created successfully!</source> +<target>Fila cu lotul de comenzi a fost creată cu succces !</target> +<source>Main bar</source> +<target>Bara Principală</target> +<source>Folder pairs</source> +<target>Perechi de Dosare</target> +<source>Select view</source> +<target>Selectează Vederea</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparare È™i Sincronizare de Dosare</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Reciclatorul nu este încă suportat pentru acest sistem de operare!</target> +<source>Set direction:</source> +<target>Setează AcÈ›iunea ca în Icoana Alăturată:</target> +<source>Exclude temporarily</source> +<target>Exclude Temporar</target> +<source>Include temporarily</source> +<target>Include Temporar</target> +<source>Exclude via filter:</source> +<target>Exclude prin Filtru:</target> +<source><multiple selection></source> +<target><selectare multiplă></target> +<source>D-Click</source> +<target>Clic-Dreapta</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copiază în CliplanÈ™etă CTRL+C</target> +<source>Delete files DEL</source> +<target>Șterge Filele DEL</target> +<source>Customize...</source> +<target>Personalizează...</target> +<source>Auto-adjust columns</source> +<target>Autoajustează Coloanele</target> +<source>Include all rows</source> +<target>Include Toate Rîndurile</target> +<source>Exclude all rows</source> +<target>Exclude Toate Rîndurile</target> +<source>Reset view</source> +<target>Resetează Vederea</target> +<source>Show "%x"</source> +<target>Arată "%x"</target> +<source><Last session></source> +<target><Ultima Sesiune></target> +<source>Configuration saved!</source> +<target>ConfiguraÈ›ie salvată !</target> +<source>Save changes to current configuration?</source> +<target>Vrei să salvezi modificările configuraÈ›iei curente?</target> +<source>Configuration loaded!</source> +<target>ConfiguraÈ›ie încărcată !</target> +<source>Hide files that exist on left side only</source> +<target>Ascunde filele care există doar în stînga</target> +<source>Show files that exist on left side only</source> +<target>Arată filele care există doar în stînga</target> +<source>Hide files that exist on right side only</source> +<target>Ascunde filele care există doar în dreapta</target> +<source>Show files that exist on right side only</source> +<target>Arată filele care există doar în dreapta</target> +<source>Hide files that are newer on left</source> +<target>Ascunde filele care sînt mai noi în stînga</target> +<source>Show files that are newer on left</source> +<target>Arată filele din stînga mai noi decît cele din dreapta</target> +<source>Hide files that are newer on right</source> +<target>Ascunde filele care sînt mai noi în dreapta</target> +<source>Show files that are newer on right</source> +<target>Arată filele din dreapta mai noi decît cele din stînga</target> +<source>Hide files that are equal</source> +<target>Ascunde filele care sînt identice</target> +<source>Show files that are equal</source> +<target>Arată filele identice</target> +<source>Hide files that are different</source> +<target>Ascunde filele care sînt diferite</target> +<source>Show files that are different</source> +<target>Arată filele diferite</target> +<source>Hide conflicts</source> +<target>Ascunde conflictele</target> +<source>Show conflicts</source> +<target>Arată conflictele</target> +<source>Hide files that will be created on the left side</source> +<target>Ascunde filele care vor fi create în stînga</target> +<source>Show files that will be created on the left side</source> +<target>Arată filele care vor fi create în stînga</target> +<source>Hide files that will be created on the right side</source> +<target>Ascunde filele care vor fi create în dreapta</target> +<source>Show files that will be created on the right side</source> +<target>Arată filele care vor fi create în dreapta</target> +<source>Hide files that will be deleted on the left side</source> +<target>Ascunde filele care vor fi È™terse în stînga</target> +<source>Show files that will be deleted on the left side</source> +<target>Arată filele care vor fi È™terse în stînga</target> +<source>Hide files that will be deleted on the right side</source> +<target>Ascunde filele care vor fi È™terse în dreapta</target> +<source>Show files that will be deleted on the right side</source> +<target>Arată filele care vor fi È™terse în dreapta</target> +<source>Hide files that will be overwritten on left side</source> +<target>Ascunde filele care vor fi suprascrise în stînga</target> +<source>Show files that will be overwritten on left side</source> +<target>Arată filele care vor fi suprascrise în stînga</target> +<source>Hide files that will be overwritten on right side</source> +<target>Ascunde filele care vor fi suprascrise în dreapta</target> +<source>Show files that will be overwritten on right side</source> +<target>Arată filele care vor fi suprascrise în dreapta</target> +<source>Hide files that won't be copied</source> +<target>Ascunde filele care nu vor fi copiate</target> +<source>Show files that won't be copied</source> +<target>Arată filele care nu vor fi copiate</target> +<source>All directories in sync!</source> +<target>Toate dosarele au fost sincronizate!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Rulează compararea înainte de a sincroniza!</target> +<source>Comma separated list</source> +<target>Listă de elemente separate prin virgulă</target> +<source>Legend</source> +<target>Legendă</target> +<source>File list exported!</source> +<target>Lista de file a fost exportată!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Item È™ters cu succes!</pluralform> +<pluralform>%x itemuri È™terse cu succes!</pluralform> +<pluralform>%x de itemuri È™terse cu succes!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 dosar</pluralform> +<pluralform>%x dosare</pluralform> +<pluralform>%x de dosare</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 filă</pluralform> +<pluralform>%x file</pluralform> +<pluralform>%x de file</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x din 1 rînduri afiÈ™ate</pluralform> +<pluralform>%x din %y rînduri afiÈ™ate</pluralform> +<pluralform>%x din %y de rînduri afiÈ™ate</pluralform> +</target> +<source>Scanning...</source> +<target>Scanez...</target> +<source>Comparing content...</source> +<target>Compar conÈ›inutul...</target> +<source>Paused</source> +<target>Sincronizare Pauzată</target> +<source>Aborted</source> +<target>Sincronizare Abandonată</target> +<source>Completed</source> +<target>Sincronizare Terminată</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Abandonare solicitată: Se aÈ™teaptă terminarea operaÈ›iunii în curs...</target> +<source>Continue</source> +<target>Continuă</target> +<source>Pause</source> +<target>Pauzează</target> +<source>Cannot find %x</source> +<target>Nu pot găsi %x</target> +<source>DECISION TREE</source> +<target>ARBORE DECIZIONAL</target> +<source>file exists on both sides</source> +<target>fila există în ambele părÈ›i</target> +<source>on one side only</source> +<target>fila există doar într-o parte</target> +<source>- left</source> +<target>- stînga</target> +<source>- right</source> +<target>- dreapta</target> +<source>different</source> +<target>file diferite</target> +<source>- conflict (same date, different size)</source> +<target>- conflict (aceeaÈ™i dată, mărime diferită)</target> +<source>Inactive</source> +<target>Dezactivat</target> +<source>Second</source> +<target>Secunde</target> +<source>Minute</source> +<target>Minute</target> +<source>Hour</source> +<target>Ore</target> +<source>Day</source> +<target>Zile</target> +<source>Byte</source> +<target>BaiÈ›i</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtru: Toate perechile</target> +<source>Filter: Single pair</source> +<target>Filtru: O singură pereche</target> +<source>Ignore</source> +<target>Ignoră</target> +<source>Direct</source> +<target>DirecÈ›ionează</target> +<source>Follow</source> +<target>UrmăreÈ™te</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Include aplicaÈ›iile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi:</target> +<source>- full file or directory name</source> +<target>- numele complet al filei sau dosarului</target> +<source>- directory part only</source> +<target>- doar dosarele</target> +<source>- Other side's counterpart to %name</source> +<target>- corespondentul din partea opusă al lui %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- corespondentul din partea opusă al lui %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Restaurezi toate casetele de dialog ascunse?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Sigur vrei să muÈ›i în Reciclator itemul următor?</pluralform> +<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x itemuri?</pluralform> +<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x de itemuri?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Sigur vrei să È™tergi definitiv itemul următor?</pluralform> +<pluralform>Sigur vrei să È™tergi definitiv următoarele %x itemuri?</pluralform> +<pluralform>Sigur vrei să È™tergi definitiv următoarele %x de itemuri?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Lasă ca Conflict Nerezolvat</target> +<source>Delete permanently</source> +<target>Șterge definitiv</target> +<source>Delete or overwrite files permanently</source> +<target>Filele sînt È™terse sau suprascrise în mod definitiv</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Se foloseÈ™te Reciclatorul [Recycle Bin] cu ocazia È™tergerii sau suprascrierii unei file</target> +<source>Versioning</source> +<target>Versionare</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Mută filele într-un subdosar cu marcaj de timp</target> +<source>Cannot determine sync-direction:</source> +<target>Nu se poate determina sensul de sincronizare:</target> +<source>Filter settings have changed!</source> +<target>Setările filtrului au fost schimbate!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Ambele părÈ›i s-au modificat de la ultima sincronizare!</target> +<source>No change since last synchronization!</source> +<target>Nu sînt schimbări de la ultima sincronizare!</target> +<source>The file was not processed by last synchronization!</source> +<target>Fila nu a fost procesată la ultima sincronizare!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Ștergerea plănuită a dosarului intră în conflict cu subdosarele È™i filele sale!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Baza de date existentă va fi făcută compatibilă cu versiunea softului È™i apoi va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi.</target> +<source>The file does not contain a valid configuration:</source> +<target>Fila nu conÈ›ine o configuraÈ›ie validă:</target> +<source>Scanning:</source> +<target>Scanez:</target> +<source>Encoding extended time information: %x</source> +<target>Codarea informaÈ›iilor timpului extins: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>PoÈ›i ignora această eroare dacă vrei ca dosarul să fie considerat gol.</target> +<source>Directory does not exist:</source> +<target>Dosarul nu există:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Dosarele sînt interdependente! AtenÈ›ie la setarea regulilor de sincronizare:</target> +<source>Comparing content of files %x</source> +<target>Compar conÈ›inutul filelor %x</target> +<source>Memory allocation failed!</source> +<target>Alocarea memoriei a eÈ™uat!</target> +<source>File %x has an invalid date!</source> +<target>Fila %x are o dată nevalidă !</target> +<source>Conflict detected:</source> +<target>Conflict detectat:</target> +<source>Files %x have the same date but a different size!</source> +<target>Filele %x au aceeaÈ™i dată, dar mărime diferită!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Simlegăturile %x au aceeaÈ™i dată, dar È›inte diferite!</target> +<source>Comparing files by content failed.</source> +<target>Compararea filelor după conÈ›inut a eÈ™uat.</target> +<source>Generating file list...</source> +<target>Generez lista de file...</target> +<source>Multiple...</source> +<target>Multiplu...</target> +<source>Files that are equal on both sides</source> +<target>File identice în ambele părÈ›i</target> +<source>Equal files/folders that differ in attributes only</source> +<target>File/Dosare identice care diferă doar prin atributele lor</target> +<source>Copy from right to left</source> +<target>Copiază de la Dreapta la Stînga</target> +<source>Copy from left to right</source> +<target>Copiază de la Stînga la Dreapta</target> +<source>Delete files/folders existing on left side only</source> +<target>Șterge Itemul din Stînga</target> +<source>Delete files/folders existing on right side only</source> +<target>Șterge Itemul din Dreapta</target> +<source>Copy from right to left overwriting</source> +<target>Copiază de la Dreapta la Stînga cu Suprascriere</target> +<source>Copy from left to right overwriting</source> +<target>Copiază de la Stînga la Dreapta cu Suprascriere</target> +<source>Do nothing</source> +<target>Nici o AcÈ›iune</target> +<source>Copy attributes only from right to left</source> +<target>Copiază doar atributele de la dreapta la stînga</target> +<source>Copy attributes only from left to right</source> +<target>Copiază doar atributele de la stînga la dreapta</target> +<source>Deleting file %x</source> +<target>Șterg fila %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Șterg legătura simbolică %x</target> +<source>Deleting folder %x</source> +<target>Șterg dosarul %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Mut %x în Reciclator</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Mut fila %x în dosarul %y ales de utilizator</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Mut dosarul %x în dosarul %y ales de utilizator</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Mut legătura simbolică %x în dosarul ales de utilizator %y</target> +<source>Copying new file %x to %y</source> +<target>Copiez fila nouă %x în %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copiez noua Legătură Simbolică %x în %y</target> +<source>Overwriting file %x in %y</source> +<target>Suprascriu fila %x în %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Suprascriu Legătura Simbolică %x în %y</target> +<source>Creating folder %x</source> +<target>Creez dosarul %x</target> +<source>Verifying file %x</source> +<target>Verific fila %x</target> +<source>Updating attributes of %x</source> +<target>Actualizez atributele lui %x</target> +<source>Source directory does not exist anymore:</source> +<target>Dosarul sursă nu mai există:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Nu este nimic de sincronizat conform configuraÈ›iei!</target> +<source>Target directory name must not be empty!</source> +<target>Numele dosarului È›intă nu poate să lipsească!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Dosarul ales de utilizator pentru È™tergere nu a fost specificat !</target> +<source>Unresolved conflicts existing!</source> +<target>Există conflicte nerezolvate!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>PoÈ›i ignora conflictele pentru a continua cu sincronizarea.</target> +<source>Significant difference detected:</source> +<target>Diferență semnificativă detectată:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Peste 50% din numărul total de file vor fi copiate sau distruse!</target> +<source>Not enough free disk space available in:</source> +<target>SpaÈ›iu de stocare insuficient pe:</target> +<source>Free disk space required:</source> +<target>SpaÈ›iu liber necesar:</target> +<source>Free disk space available:</source> +<target>SpaÈ›iu liber disponibil:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!</target> +<source>Processing folder pair:</source> +<target>Procesez perechea de dosare:</target> +<source>Generating database...</source> +<target>Generez baza de date...</target> +<source>Error copying locked file %x!</source> +<target>Eroare la copierea filei zăvorîte %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Eroare la verificarea datelor: Filele sursă È™i È›intă au conÈ›inut diferit!</target> diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index 9eb00e1e..391fc9ff 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -1,912 +1,1065 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y объектов удалено удачно -%x Bytes -%x Байт -%x GB -%x ГБ -%x MB -%x МБ -%x PB -%x ПБ -%x TB -%x ТБ -%x day(s) -%x дн. -%x directories -%x папки -%x files -%x файл(ов) -%x hour(s) -%x ч -%x kB -%x кБ -%x min -%x мин -%x of %y rows in view -%x из %y Ñтрок(и) показано -%x of 1 row in view -%x из 1 Ñтрока показана -%x sec -%x Ñ -%x% -%x% -&Abort -&Отмена -&About... -&О программе... -&Advanced -&Дополнительно -&Cancel -&Отмена -&Check for new version -&Проверить наличие новой верÑии -&Content -&Справка -&Create batch job... -&Создать задание... -&Default -&По-умолчанию -&Exit -&Выход -&Export file list... -&ÐкÑпортировать ÑпиÑок файлов... -&File -&Файл -&Find next -&Ðайти далее -&Global settings... -&Глобальные наÑтройки... -&Help -&Помощь -&Ignore -&Игнорировать -&Language -&Язык -&Load -&Загрузить -&Load configuration... -&Загрузить наÑтройки Ñинхронизации... -&New -&ÐÐ¾Ð²Ð°Ñ -&No -&Ðет -&OK -&OK -&Pause -&Пауза -&Program -&Программа -&Quit -&Выход -&Restore -&ВоÑÑтановить -&Retry -&Повторить -&Save -&Сохранить -&Switch -&Переключить -&Yes -&Да -(Build: %x) -(Ñборка %x) -(Requires an Internet connection!) -(требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к Интернету!) -- Other side's counterpart to %dir -- Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны -- Other side's counterpart to %name -- аналогичный файл Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны -- conflict -- конфликт -- conflict (same date, different size) -- конфликт (даты Ñовпадают, размеры разные) -- different -- разные -- directory part only -- папка -- equal -- одинаковые -- exists left only -- только левые ÑущеÑтвуют -- exists right only -- только правые ÑущеÑтвуют -- full file or directory name -- файл -- left -- левые -- left newer -- левые новее -- right -- правые -- right newer -- правые новее -/sec -/Ñек. -1 directory -1 папка -1 file -1 файл -1. &Compare -1. &Сравнить -1. Enter relative file or directory names separated by ';' or a new line. -1. Введите имена файлов или папок, разделÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ';' или Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки. -1. Select directories to monitor. -1. Выберите папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°; -2. &Synchronize... -2. &Синхронизировать -2. Enter a command line. -2. Введите командную Ñтроку; -2. Use wildcard characters '*' and '?'. -2. ИÑпользуйте Ñимволы '*' и '?' Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ неизвеÑтных. -3. Exclude files directly on main grid via context menu. -3. ИÑключите файлы прÑмо в главном окне через контекÑтное меню. -3. Press 'Start'. -3. Ðажмите 'Старт'. -<Automatic> -<ÐвтоматичеÑкий> -<Directory> -<Папка> -<Last session> -<ПоÑледнÑÑ ÑеÑÑиÑ> -<Symlink> -<Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка> -<multiple selection> -<групповое выделение> -A directory input field is empty. -Поле ввода пути папки пуÑтое. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации! -A newer version of FreeFileSync is available: -ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync: -Abort requested: Waiting for current operation to finish... -Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ... -Abort synchronization immediately -Отменить Ñинхронизацию немедленно -Aborted -Отменено -About -О программе -Action -ДейÑтвие -Add folder -Добавить папку -Add folder pair -Добавить пару папок -All directories in sync! -Ð’Ñе папки Ñинхронизированы! -An exception occurred! -ИÑключение произошло! -As a result the files are separated into the following categories: -Как результат файлы разделÑÑŽÑ‚ÑÑ Ð½Ð° Ñледующие категории: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Как напиÑано в названии, два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем отмечаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, только еÑли они имеют то же Ñамое Ñодержание. Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоглаÑованноÑти, а не операции резервного копированиÑ. ПоÑтому даты файлов не учитываютÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ.\n\nС Ñтой опцией алгоритм короче: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Создайте файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ Ñинхронизации. Чтобы запуÑтить программу в Ñтом режиме проÑто передайте название файла на выполнение FreeFileSync: FreeFileSync.exe <batchfile>. Ðто также может быть запиÑано в планировщике задач Вашей операционной ÑиÑтемы. -At least one directory input field is empty. -По крайней мере, одно поле путей папок не заполнено. -Auto-adjust columns -Ðвтовыравнивание ширины колонок -Batch execution -Выполнение пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ -Batch file created successfully! -Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно! -Batch job -Пакетное задание -Big thanks for localizing FreeFileSync goes out to: -Большое ÑпаÑибо за перевод FreeFileSync: -Both sides have changed since last synchronization! -Со времени поÑледней Ñинхронизации Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон произошли изменениÑ! -Browse -Обзор -Browse directory -Обзор папок -Cannot determine sync-direction: -Ðевозможно определить направление Ñинхронизации: -Cannot find %x -Ðевозможно найти %x -Cannot write to empty directory path! +<header> + <language name>PуÑÑкий</language name> + <translator>Fayzullin T.N. aka Svobodniy</translator> + <locale>ru_RU</locale> + <flag file>russia.png</flag file> + <plural forms>3</plural forms> + <plural definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2</plural definition> +</header> -Category -ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ -Clear filter settings -ОчиÑтить наÑтройки фильтра -Comma separated list -СпиÑок, разделÑемый запÑтыми -Command line -ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока -Command line is empty! -ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока пуÑта! -Compare -Сравнить -Compare both sides -Сравнить обе Ñтороны -Compare by \"File content\" -Сравнивать по Ñодержимому -Compare by \"File size and date\" -Сравнивать по размеру и дате -Compare by... -Критерии ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ -Comparing content of files %x -Сравнение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² %x -Comparing content... -Сравнение ÑодержаниÑ... -Comparing files by content failed. -Сравнение файлов по Ñодержимому провалено. -Comparison Result -Результаты ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ -Comparison settings -ÐаÑтройки ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ -Completed -Завершено -Configuration -ÐаÑтройки -Configuration loaded! -ÐаÑтройки Ñинхронизации загружены! -Configuration overview: -ÐаÑтройки Ñинхронизации: -Configuration saved! -ÐаÑтройки Ñинхронизации Ñохранены! -Configure filter -ÐаÑтройки фильтра -Configure your own synchronization rules. -ÐаÑтроить Ñвои ÑобÑтвенные правила Ñинхронизации. -Confirm -Подтвердить -Conflict detected: -Обнаружен конфликт: -Conflicts/files that cannot be categorized -Конфликты/файлы, которые не могут быть отнеÑены к какой-либо категории -Continue -Продолжить -Conversion error: -Ошибка преобразованиÑ: -Copy attributes only from left to right -Копировать только атрибуты Ñлева направо -Copy attributes only from right to left -Копировать только атрибуты Ñправа налево -Copy filesystem permissions -Копировать права доÑтупа файловой ÑиÑтемы -Copy from left to right -Копировать Ñлева направо -Copy from left to right overwriting -Копировать Ñлева направо Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью -Copy from right to left -Копировать Ñправа налево -Copy from right to left overwriting -Копировать Ñправа налево Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью -Copy locked files -Копировать заблокированные файлы -Copy new or updated files to right folder. -Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Копирование общих или заблокированных файлов\nÑ Ð¸Ñпользованием Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°\n(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) -Copy to clipboard\tCTRL+C -Копировать в буфер обмена\tCTRL+C -Copying new Symbolic Link %x to %y -Копирование новой Ñимвольной ÑÑылки %x в %y -Copying new file %x to %y -Копирование нового файла %x в %y -Could not determine volume name for file: -Ðе удалоÑÑŒ определить название тома Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°: -Could not initialize directory monitoring: -Ðе удалоÑÑŒ инициализировать папку Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°: -Could not load a required DLL: -Ðе удалоÑÑŒ загрузить необходимые DLL: -Could not read values for the following XML nodes: -Ðе удалоÑÑŒ прочитать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñледующих XML запиÑей: -Create a batch job -Создать пакетное задание -Creating folder %x -Создание папки %x -Custom -Выборочно -Customize columns -Выбор колонок -Customize... -Выбрать колонки... -D-Click -Двойной клик -DECISION TREE -Древо решений -Data verification error: Source and target file have different content! -Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание! -Date -Дата -Delete files/folders existing on left side only -УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на левой Ñтороне -Delete files/folders existing on right side only -УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на правой Ñтороне -Delete files\tDEL -Удалить файл(Ñ‹)...\tDEL -Delete on both sides -Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон -Delete on both sides even if the file is selected on one side only -Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне -Delete or overwrite files permanently -УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину" -Delete permanently -УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину" -Deleting Symbolic Link %x -Удаление Ñимвольной ÑÑылки %x -Deleting file %x -Удаление файла %x -Deleting folder %x -Удаление папки %x -Deletion handling -ÐаÑтройки ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ -Description -ОпиÑание -Direct -ПрÑмое -Directories are dependent! Be careful when setting up synchronization rules: -ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации: -Directories to watch -Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ -Directory -Папка -Directory does not exist: -Папка не ÑущеÑтвует: -Do not show this dialog again -Больше не показывать Ñто окно -Do nothing -Ðичего не делать -Do you really want to delete the following object(s)? -Ð’Ñ‹ дейÑтвительно хотите удалить Ñледующие объекты? -Do you really want to move the following object(s) to the Recycle Bin? -Ð’Ñ‹ дейÑтвительно хотите отправить Ñледующие объекты в "Корзину"? -Do you want FreeFileSync to automatically check for updates every week? -Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю? -Donate with PayPal -Отправить деньги через PayPal -Download now? -Загрузить ÑейчаÑ? -Drag && drop -Drag && drop -Elements found: -Ðлементов найдено: -Elements processed: -Ðлементов обработано: -Elements remaining: -Ðлементов оÑталоÑÑŒ: -Email -Почта -Encoding extended time information: %x -Кодирование раÑширенной информации о времени: %x -Endless loop when traversing directory: -Зацикливание при вÑтрече переÑекающихÑÑ Ð¿ÑƒÑ‚ÐµÐ¹: -Equal files/folders that differ in attributes only -Одинаковые файлы/папки, которые отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами -Error -Ошибка -Error changing modification time: -Ошибка при изменении времени модификации файла: -Error copying file permissions: -Ошибка при копировании прав доÑтупа: -Error copying file: -Ошибка при копировании файла: -Error copying locked file %x! -Ошибка при копировании заблокированного файла %x! -Error copying symbolic link: -Ошибка при копировании Ñимвольной ÑÑылки: -Error creating directory: -Ошибка при Ñоздании папки: -Error deleting directory: -Ошибка при удалении папки: -Error deleting file: -Ошибка при удалении файла: -Error handling -Обработка ошибок -Error loading library function: -Ошибка при загрузке функции библиотеки: -Error moving directory: -Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸: -Error moving file: -Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°: -Error moving to Recycle Bin: -Ошибка при отправке в "Корзину": -Error opening file: -Ошибка при открытии файла: -Error parsing configuration file: -Ошибка при анализе файла наÑтроек Ñинхронизации: -Error reading file attributes: -Ошибка при чтении параметров файла: -Error reading file: -Ошибка при чтении файла: -Error reading from synchronization database: -Ошибка при чтении из базы данных Ñинхронизации: -Error reading security context: -Ошибка при чтении контекÑта безобаÑноÑти: -Error resolving symbolic link: -Ошибка при решении ÑимволичеÑкой ÑÑылки: -Error setting directory lock: -Ошибка блокировки папки: -Error setting privilege: -Ошибка уÑтановки привилегий: -Error starting Volume Shadow Copy Service! -Ошибка при запуÑке Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°! -Error traversing directory: -Ошибка при переÑечении папок: -Error when monitoring directories. -Ошибка при мониторинге папок. -Error writing file: -Ошибка при запиÑи файла: -Error writing security context: -Ошибка при запиÑи контекÑта безобаÑноÑти: -Error writing to synchronization database: -Ошибка при запиÑи в базу данных Ñинхронизации: -Example -Пример -Exclude -ИÑключить -Exclude all rows -Ðе отмечать ничего -Exclude temporarily -ИÑключить -Exclude via filter: -ИÑключить через фильтр: -Exit instantly -Выйти немедленно -Extension -РаÑширение -External applications -Внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -Fatal Error -КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° -Feedback and suggestions are welcome at: -Отзывы и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñылайте по адреÑу: -File %x has an invalid date! -Файл %x имеет недейÑтвительную дату! -File already exists. Overwrite? -Файл уже ÑущеÑтвует. ПерезапиÑать? -File content -Содержимое файла -File does not exist: -Файл не ÑущеÑтвует: -File list exported! -СпиÑок файлов ÑкÑпортирован! -File size and date -Размер и дата файла -Filename -Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° -Files %x have the same date but a different size! -Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру! -Files are found equal if\n - file content\nis the same -Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое -Files are found equal if\n - filesize\n - last write time and date\nare the same -Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые\n - размер файла\n - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ -Files that are equal on both sides -Файлы, одинаковые Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон -Files that exist on both sides, left one is newer -Файлы, ÑущеÑтвующие на обоих Ñторонах, левый новее -Files that exist on both sides, right one is newer -Файлы, ÑущеÑтвующие на обоих Ñторонах, правый новее -Files that have different content -Файлы, имеющие различное Ñодержание -Files/folders that exist on left side only -Файлы/папки, ÑущеÑтвующие только на левой Ñтороне -Files/folders that exist on right side only -Файлы/папки, ÑущеÑтвующие только на правой Ñтороне -Filter files -Фильтр файлов -Filter is active -Фильтр активен -Filter settings have changed! -ÐаÑтройки фильтра были изменены! -Filter: All pairs -Фильтр: Ð’Ñе пары -Filter: Single pair -Фильтр: Одна пара -Find -Ðайти -Find what: -Ðайти: -Folder Comparison and Synchronization -Сравнение и ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ -Folder pairs -Пары папок Ð´Ð»Ñ Ñинхронизации -Follow -ПоÑледовательное -Free disk space available: -ДоÑтупно Ñвободного меÑта на диÑке: -Free disk space required: -Требуемое Ñвободное меÑто на диÑке: -FreeFileSync Batch Job -Пакетное задание FreeFileSync -FreeFileSync at Sourceforge -FreeFileSync на Sourceforge -FreeFileSync batch file -Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync -FreeFileSync configuration -ÐаÑтройка FreeFileSync -FreeFileSync is up to date! -У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync! -Full path -Полный путь -Generating database... -Создание базы данных... -Generating file list... -Создание ÑпиÑка файлов... -Global settings -Глобальные наÑтройки -Help -Помощь -Hidden dialogs: -Скрытые диалоги -Hide all error and warning messages -Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми -Hide conflicts -Скрыть конфликтующие файлы -Hide excluded items -Скрыть иÑключенные пункты -Hide files that are different -Скрыть различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ -Hide files that are equal -Скрыть одинаковые файлы -Hide files that are newer on left -Скрыть файлы, которые новее Ñлева -Hide files that are newer on right -Скрыть файлы, которые новее Ñправа -Hide files that exist on left side only -Скрыть файлы, ÑущеÑтвующие только Ñлева -Hide files that exist on right side only -Скрыть файлы, ÑущеÑтвующие только Ñправа -Hide files that will be created on the left side -Скрыть файлы, которые будут Ñозданы на левой Ñтороне -Hide files that will be created on the right side -Скрыть файлы, которые будут Ñозданы на правой Ñтороне -Hide files that will be deleted on the left side -Скрыть файлы, которые будут удалены на левой Ñтороне -Hide files that will be deleted on the right side -Скрыть файлы, которые будут удалены на правой Ñтороне -Hide files that will be overwritten on left side -Скрыть файлы, которые будут перезапиÑаны на левой Ñтороне -Hide files that will be overwritten on right side -Скрыть файлы, которые будут перезапиÑаны на правой Ñтороне -Hide files that won't be copied -Скрыть файлы, которые не будут Ñкопированы -Hide filtered or temporarily excluded files -Скрыть отфильтрованные или временно иÑключенные файлы -Hide further error messages during the current process -Скрыть поÑледующие ошибки во Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ процеÑÑа -Hints: -ПодÑказка: -Homepage -Оф.Ñайт -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Ð’Ñ‹Ñвление и раÑпроÑтранение изменений на обеих Ñторонах Ñ Ð¸Ñпользованием базы данных. Удаленные файлы и конфликты определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки. -Idle time between detection of last change and execution of command line in seconds -Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ обнаружением поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ выполнением командной Ñтроки в Ñекундах -If you like FFS -ЕÑли Вам понравилÑÑ FFS -Ignore -Игнорировать -Ignore errors -Игнорировать ошибки -Ignore subsequent errors -Игнорировать поÑледующие ошибки -Include -Включить -Include all rows -Отметить вÑе -Include temporarily -Включить -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Включить: *.doc;*.zip;*.exe\nИÑключить: \\stuff\\temp\\* -Incompatible synchronization database format: -ÐеÑовмеÑтимый формат базы данных Ñинхронизации: -Info -Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ -Information -Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ -Initial synchronization: -ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ: -Integrate external applications into context menu. The following macros are available: -Интегрирует внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² контекÑтное меню.\nСледующие команды доÑтупны: -Invalid FreeFileSync config file! -Ðеверный файл конфигурации FreeFileSync! -Last used configurations (press DEL to remove from list) -ПоÑледние иÑпользованные наÑтройки Ñинхронизации\n(нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка) -Leave as unresolved conflict -ОÑтавить как нерешенный конфликт -Left -Слева -Legend -Легенда -Load configuration from file -Загрузить наÑтройки Ñинхронизации из файла -Log-messages: -Лог-ÑообщениÑ: -Logging -Лог-файлы -Main bar -Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии. -Match case -Учитывать региÑÑ‚Ñ€ -Maximum number of logfiles: -МакÑимальное количеÑтво лог-файлов: -Memory allocation failed! -Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти! (Ðе хватает памÑти) -Minimum Idle Time [seconds] -Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ [Ñекунд] -Mirror ->> -Зеркало ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ (резервнаÑ) ÐºÐ¾Ð¿Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹ чаÑти. Ð’ результате Ñинхронизации Ð¿Ñ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° будет изменена до полного ÑоответÑÑ‚Ð²Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹. -Monitoring active... -Мониторинг включен... -More than 50% of the total number of files will be copied or deleted! -Более 50% общего количеÑтва файлов будет Ñкопировано или удалено! -Move column down -ПеремеÑтить вниз -Move column up -ПеремеÑтить вверх -Move files into a time-stamped subdirectory -Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов) -Moving %x to Recycle Bin -Отправка %x в "Корзину" -Moving Symbolic Link %x to user-defined directory %y -Перемещение Ñимвольной ÑÑылки %x в заданную пользователем папку %y -Moving file %x to user-defined directory %y -Перемещение файла %x в заданную пользователем папку %y -Moving folder %x to user-defined directory %y -Перемещение папки %x в заданную пользователем папку %y -Multiple... -Различные варианты Ñинхронизации -No change since last synchronization! -Ðикаких изменений Ñ Ð¿Ð¾Ñледней Ñинхронизации! -No filter selected -Ðи один фильтр не выбран -Not enough free disk space available in: -Ðе доÑтаточно Ñвободного меÑта в: -Nothing to synchronize according to configuration! -Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации! -Number of files and directories that will be created -ЧиÑло файлов и папок, которые будут Ñозданы -Number of files and directories that will be deleted -ЧиÑло файлов и папок, которые будут удалены -Number of files that will be overwritten -ЧиÑло файлов, которые будут перезапиÑаны -One of the FreeFileSync database entries within the following file is not yet existing: -ЗапиÑей, отноÑÑщихÑÑ Ðº Ñледующим файлам, в базе данных FreeFileSync еще не ÑущеÑтвует: -One of the FreeFileSync database files is not yet existing: -Файла базы данных FreeFileSync еще не ÑущеÑтвует: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Только файлы/папки, которые проходÑÑ‚ фильтрацию будут отобраны Ð´Ð»Ñ Ñинхронизации. Фильтр будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем именам, отноÑÑщимÑÑ Ðº оÑновным Ñинхронизируемым папкам. -Open with Explorer -Открыть путь в Проводнике -Open with default application -Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию -Operation aborted! -ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°! -Operation: -ОперациÑ: -Overview -Ð“Ð»Ð°Ð²Ð½Ð°Ñ -Overwriting Symbolic Link %x in %y -ПерезапиÑÑŒ Ñимвольной ÑÑылки %x в %y -Overwriting file %x in %y -ПерезапиÑÑŒ файла %x в %y -Pause -Пауза -Paused -Пауза -Planned directory deletion is in conflict with its subdirectories and -files! -При удалении папки возник конфликт Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ подпапками или файлами! -Please run a Compare first before synchronizing! -ПожалуйÑта, запуÑтите Ñравнение перед Ñинхронизацией! -Press \"Switch\" to open FreeFileSync GUI mode. -Ðажмите \"Переключить\" Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого графичеÑкого интерфейÑа FreeFileSync. -Processing folder pair: -Обработка пары папок: -Published under the GNU General Public License: -ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License: -Question -Ð’Ð¾Ð¿Ñ€Ð¾Ñ -RealtimeSync - Automated Synchronization -RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ -RealtimeSync configuration -ÐаÑтройка RealtimeSync -Recycle Bin not yet supported for this system! -Корзина пока не поддерживаетÑÑ Ð´Ð»Ñ Ñтой ÑиÑтемы! -Relative path -ОтноÑительный путь -Remove alternate settings -Удалить альтернативные наÑтройки -Remove folder -Удалить папку -Remove folder pair -Удалить пару папок -Report translation error -Сообщить об ошибке перевода -Reset -СброÑить -Reset view -Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек вида -Restore all hidden dialogs? -Отображать вÑе Ñкрытые диалоговые окна? -Right -Справа -S&ave configuration... -Сохранить наÑтройки Ñинхронизации... -S&witch view -Переключить вид -Save changes to current configuration? -Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² текущих наÑтройках Ñинхронизации? -Save current configuration to file -Сохранить текущие наÑтройки Ñинхронизации в файл -Scanning... -Сканирование... -Scanning: -Сканирую: -Select a folder -Выбрать папку -Select alternate synchronization settings -Выбрать альтернативные наÑтройки Ñинхронизации -Select logfile directory: -Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов: -Select variant: -Выберите вариант: -Select view -СпиÑок файлов -Set direction: -Выберите направление: -Setting default synchronization directions: Old files will be overwritten with newer files. -ÐаÑтройка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñинхронизации по умолчанию:\nСтарые файлы будут заменены более новыми файлами. -Show \"%x\" -Показать \"%x\" -Show conflicts -Показать конфликтующие файлы -Show files that are different -Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ -Show files that are equal -Показать одинаковые файлы -Show files that are newer on left -Показать файлы, которые новее Ñлева -Show files that are newer on right -Показать файлы, которые новее Ñправа -Show files that exist on left side only -Показать файлы, ÑущеÑтвующие только Ñлева -Show files that exist on right side only -Показать файлы, ÑущеÑтвующие только Ñправа -Show files that will be created on the left side -Показать файлы, которые будут Ñозданы на левой Ñтороне -Show files that will be created on the right side -Показать файлы, которые будут Ñозданы на правой Ñтороне -Show files that will be deleted on the left side -Показать файлы, которые будут удалены на левой Ñтороне -Show files that will be deleted on the right side -Показать файлы, которые будут удалены на правой Ñтороне -Show files that will be overwritten on left side -Показать файлы, которые будут перезапиÑаны на левой Ñтороне -Show files that will be overwritten on right side -Показать файлы, которые будут перезапиÑаны на правой Ñтороне -Show files that won't be copied -Показать файлы, которые не будут Ñкопированы -Show hidden dialogs -Показать Ñкрытые диалоги -Show popup -Показывать вÑплывающие окна -Show popup on errors or warnings -Показывать вÑплывающие окна при ошибках и замечаниÑÑ… -Significant difference detected: -Обнаружено ÑущеÑтвенное различие: -Silent mode -Скрытый режим -Size -Размер -Source code written completely in C++ utilizing: -ИÑходный код напиÑан на С++ Ñ Ð¸Ñпользованием: -Source directory does not exist anymore: -ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует: -Speed: -СкороÑÑ‚ÑŒ: -Start -Старт -Start minimized and write status information to a logfile -ЗапуÑкать Ñвернутым и пиÑать информацию о ÑоÑтоÑнии в лог-файл -Start synchronization -Ðачать Ñинхронизацию -Statistics -СтатиÑтика -Status feedback -Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи -Stop -Стоп -Swap sides -ПоменÑÑ‚ÑŒ направление -Switching to FreeFileSync GUI mode... -Переключение на пользовательÑкий графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ FreeFileSync... -Symbolic Link handling -Обращение к Ñимвольной ÑÑылке -Symlinks %x have the same date but a different target! -Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но различное Ñодержание! -Synchronization Preview -ПредпроÑмотр Ñинхронизации -Synchronization aborted! -Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°! -Synchronization completed successfully! -Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно! -Synchronization completed with errors! -Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð° Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸! -Synchronization settings -ÐаÑтройки Ñинхронизации -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки \"temp\" -Synchronize... -Синхронизировать -Synchronizing... -СинхронизациÑ... -Target directory already existing! -ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует! -Target file already existing! -Конечный файл уже ÑущеÑтвует! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока выполнÑетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз, когда:\n- вÑе папки ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны (например, подключение переноÑного ноÑителÑ)\n- файлы в папках или подпапках изменены -The file does not contain a valid configuration: -Файл не Ñодержит дейÑтвительных наÑтроек Ñинхронизации: -The file was not processed by last synchronization! -Файл не был обработан при поÑледней Ñинхронизации! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Ðтот вариант Ñравнивает два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами и Ñчитает их равными, еÑли они имеют одинаковый размер файла и одинаковую дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ. -Time -Ð’Ñ€ÐµÐ¼Ñ -Time elapsed: -Времени прошло: -Time remaining: -Времени оÑталоÑÑŒ: -Total amount of data that will be transferred -Общий объем данных, который будет передаватьÑÑ -Total time: -Общее времÑ: -Transfer file and directory permissions\n(Requires Administrator rights) -Передача прав доÑтупа файла/папки\n(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) -Unable to connect to sourceforge.net! -Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net! -Unable to create logfile! -Ðевозможно Ñоздать лог-файл! -Unresolved conflicts existing! -СущеÑтвуют нерешенные конфликты -Update -> -Обновить -> -Updating attributes of %x -Обновление атрибутов %x -Usage: -ИнÑтрукциÑ: -Use Recycle Bin -ИÑпользовать "Корзину" -Use Recycle Bin when deleting or overwriting files -ИÑпользовать "Корзину" при удалении или перезапиÑи файлов -User-defined directory for deletion was not specified! -ПользовательÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ была указана! -Variant -Вариант -Verifying file %x -Проверка файла %x -Versioning -Перемещать удалÑемые файлы в заданную папку -Volume name %x not part of filename %y! -Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y! -Waiting for missing directories... -Ожидание пропущенных папок... -Waiting while directory is locked (%x)... -Ожидание ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñ Ð¿Ð°Ð¿ÐºÐ¸ (%x)... -Warning -Внимание -When the comparison is started with this option set the following decision tree is processed: -Когда Ñравнение запущено Ñ Ñтими критериÑми, алгоритм Ñледующий: -You can ignore conflicts and continue synchronization. -Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию. -You can ignore this error to consider the directory as empty. -Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)! -different -разные -file exists on both sides -файлы ÑущеÑтвуют на обоих Ñторонах -on one side only -файлы ÑущеÑтвуют только на одной Ñтороне +<source>Show in Explorer</source> +<target>Показать в Проводнике</target> +<source>Open with default application</source> +<target>Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию</target> +<source>Browse directory</source> +<target>Обзор папок</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ</target> +<source>Browse</source> +<target>Обзор</target> +<source>Error resolving symbolic link:</source> +<target>Ошибка при решении ÑимволичеÑкой ÑÑылки:</target> +<source>Select alternate synchronization settings</source> +<target>Выбрать альтернативные наÑтройки Ñинхронизации</target> +<source>No filter selected</source> +<target>Ðи один фильтр не выбран</target> +<source>Filter is active</source> +<target>Фильтр активен</target> +<source>Clear filter settings</source> +<target>ОчиÑтить наÑтройки фильтра</target> +<source>Remove alternate settings</source> +<target>Удалить альтернативные наÑтройки</target> +<source>Create a batch job</source> +<target>Создать пакетное задание</target> +<source>Synchronization settings</source> +<target>ÐаÑтройки Ñинхронизации</target> +<source>Comparison settings</source> +<target>ÐаÑтройки ÑравнениÑ</target> +<source>About</source> +<target>О программе</target> +<source>Error</source> +<target>Ошибка</target> +<source>Warning</source> +<target>Внимание</target> +<source>Question</source> +<target>ВопроÑ</target> +<source>Confirm</source> +<target>Подтвердить</target> +<source>Configure filter</source> +<target>ÐаÑтройки фильтра</target> +<source>Customize columns</source> +<target>Выбор колонок</target> +<source>Global settings</source> +<target>Глобальные наÑтройки</target> +<source>Synchronization Preview</source> +<target>ПредпроÑмотр Ñинхронизации</target> +<source>Find</source> +<target>Ðайти</target> +<source>%x MB</source> +<target>%x МБ</target> +<source>%x KB</source> +<target>%x КБ</target> +<source>%x GB</source> +<target>%x ГБ</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x Байт</pluralform> +<pluralform>%x Байта</pluralform> +<pluralform>%x Байт</pluralform> +</target> +<source><Symlink></source> +<target><Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка></target> +<source><Directory></source> +<target><Папка></target> +<source>Size</source> +<target>Размер</target> +<source>Date</source> +<target>Дата</target> +<source>Full path</source> +<target>Полный путь</target> +<source>Filename</source> +<target>Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°</target> +<source>Relative path</source> +<target>ОтноÑительный путь</target> +<source>Directory</source> +<target>Папка</target> +<source>Extension</source> +<target>РаÑширение</target> +<source>Comparison Result</source> +<target>Результаты ÑравнениÑ</target> +<source>Incompatible synchronization database format:</source> +<target>ÐеÑовмеÑтимый формат базы данных Ñинхронизации:</target> +<source>Initial synchronization:</source> +<target>ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Файла базы данных FreeFileSync еще не ÑущеÑтвует:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>ЗапиÑей, отноÑÑщихÑÑ Ðº Ñледующим файлам, в базе данных FreeFileSync еще не ÑущеÑтвует:</target> +<source>Error reading from synchronization database:</source> +<target>Ошибка при чтении из базы данных Ñинхронизации:</target> +<source>An exception occurred!</source> +<target>ИÑключение произошло!</target> +<source>Error deleting file:</source> +<target>Ошибка при удалении файла:</target> +<source>Error reading file attributes:</source> +<target>Ошибка при чтении параметров файла:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Ожидание ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñ Ð¿Ð°Ð¿ÐºÐ¸ (%x)...</target> +<source>Error setting directory lock:</source> +<target>Ошибка блокировки папки:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x Ñекунда</pluralform> +<pluralform>%x Ñекунды</pluralform> +<pluralform>%x Ñекунд</pluralform> +</target> +<source>Info</source> +<target>ИнформациÑ</target> +<source>Fatal Error</source> +<target>КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°</target> +<source>Invalid FreeFileSync config file!</source> +<target>Ðеверный файл конфигурации FreeFileSync!</target> +<source>File does not exist:</source> +<target>Файл не ÑущеÑтвует:</target> +<source>Error parsing configuration file:</source> +<target>Ошибка при анализе файла наÑтроек Ñинхронизации:</target> +<source>Error writing file:</source> +<target>Ошибка при запиÑи файла:</target> +<source>/sec</source> +<target>/Ñ</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x минута</pluralform> +<pluralform>%x минуты</pluralform> +<pluralform>%x минут</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x чаÑ</pluralform> +<pluralform>%x чаÑа</pluralform> +<pluralform>%x чаÑов</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x день</pluralform> +<pluralform>%x днÑ</pluralform> +<pluralform>%x дней</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Сохранить наÑтройки Ñинхронизации...</target> +<source>&Load configuration...</source> +<target>&Загрузить наÑтройки Ñинхронизации...</target> +<source>&Quit</source> +<target>&Выход</target> +<source>&File</source> +<target>&Файл</target> +<source>&Content</source> +<target>&Справка</target> +<source>&About...</source> +<target>&О программе...</target> +<source>&Help</source> +<target>&Помощь</target> +<source>Usage:</source> +<target>ИнÑтрукциÑ:</target> +<source>1. Select directories to monitor.</source> +<target>1. Выберите папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°;</target> +<source>2. Enter a command line.</source> +<target>2. Введите командную Ñтроку;</target> +<source>3. Press 'Start'.</source> +<target>3. Ðажмите 'Старт'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока выполнÑетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз, когда: +- вÑе папки ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны (например, подключение переноÑного ноÑителÑ) +- файлы в папках или подпапках изменены +</target> +<source>Directories to watch</source> +<target>Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</target> +<source>Add folder</source> +<target>Добавить папку</target> +<source>Remove folder</source> +<target>Удалить папку</target> +<source>Select a folder</source> +<target>Выбрать папку</target> +<source>Command line</source> +<target>ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока</target> +<source>Minimum Idle Time [seconds]</source> +<target>Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ [Ñекунд]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ обнаружением поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ выполнением командной Ñтроки в Ñекундах</target> +<source>Start</source> +<target>Старт</target> +<source>(Build: %x)</source> +<target>(Ñборка %x)</target> +<source>RealtimeSync configuration</source> +<target>ÐаÑтройка RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Файл уже ÑущеÑтвует. ПерезапиÑать?</target> +<source>&Restore</source> +<target>&ВоÑÑтановить</target> +<source>&Exit</source> +<target>&Выход</target> +<source>Monitoring active...</source> +<target>Мониторинг включен...</target> +<source>Waiting for missing directories...</source> +<target>Ожидание пропущенных папок...</target> +<source>Command line is empty!</source> +<target>ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока пуÑта!</target> +<source>Could not initialize directory monitoring:</source> +<target>Ðе удалоÑÑŒ инициализировать папку Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°:</target> +<source>A directory input field is empty.</source> +<target>Поле ввода пути папки пуÑтое.</target> +<source>Error when monitoring directories.</source> +<target>Ошибка при мониторинге папок.</target> +<source>Drag && drop</source> +<target>Drag && drop</target> +<source>Conversion error:</source> +<target>Ошибка преобразованиÑ:</target> +<source>Error moving file:</source> +<target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> +<source>Operation aborted!</source> +<target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target> +<source>Target file already existing!</source> +<target>Конечный файл уже ÑущеÑтвует!</target> +<source>Error moving directory:</source> +<target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸:</target> +<source>Target directory already existing!</source> +<target>ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует!</target> +<source>Error deleting directory:</source> +<target>Ошибка при удалении папки:</target> +<source>Error changing modification time:</source> +<target>Ошибка при изменении времени модификации файла:</target> +<source>Error loading library function:</source> +<target>Ошибка при загрузке функции библиотеки:</target> +<source>Error reading security context:</source> +<target>Ошибка при чтении контекÑта безобаÑноÑти:</target> +<source>Error writing security context:</source> +<target>Ошибка при запиÑи контекÑта безобаÑноÑти:</target> +<source>Error copying file permissions:</source> +<target>Ошибка при копировании прав доÑтупа:</target> +<source>Error creating directory:</source> +<target>Ошибка при Ñоздании папки:</target> +<source>Error copying symbolic link:</source> +<target>Ошибка при копировании Ñимвольной ÑÑылки:</target> +<source>Error copying file:</source> +<target>Ошибка при копировании файла:</target> +<source>Error opening file:</source> +<target>Ошибка при открытии файла:</target> +<source>Error reading file:</source> +<target>Ошибка при чтении файла:</target> +<source>Endless loop when traversing directory:</source> +<target>Зацикливание при вÑтрече переÑекающихÑÑ Ð¿ÑƒÑ‚ÐµÐ¹:</target> +<source>Error traversing directory:</source> +<target>Ошибка при переÑечении папок:</target> +<source>Error setting privilege:</source> +<target>Ошибка уÑтановки привилегий:</target> +<source>Error moving to Recycle Bin:</source> +<target>Ошибка при отправке в "Корзину":</target> +<source>Could not load a required DLL:</source> +<target>Ðе удалоÑÑŒ загрузить необходимые DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Ошибка при запиÑи в базу данных Ñинхронизации:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Ошибка при запуÑке Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии.</target> +<source>Could not determine volume name for file:</source> +<target>Ðе удалоÑÑŒ определить название тома Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y!</target> +<source>%x TB</source> +<target>%x ТБ</target> +<source>%x PB</source> +<target>%x ПБ</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Ðе удалоÑÑŒ прочитать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñледующих XML запиÑей:</target> +<source>Show popup</source> +<target>Показывать вÑплывающие окна</target> +<source>Show popup on errors or warnings</source> +<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target> +<source>Ignore errors</source> +<target>Игнорировать ошибки</target> +<source>Hide all error and warning messages</source> +<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target> +<source>Exit instantly</source> +<target>Выйти немедленно</target> +<source>Abort synchronization immediately</source> +<target>Отменить Ñинхронизацию немедленно</target> +<source>Logging</source> +<target>Лог-файлы</target> +<source>FreeFileSync batch file</source> +<target>Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync</target> +<source>FreeFileSync configuration</source> +<target>ÐаÑтройка FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>Пакетное задание FreeFileSync</target> +<source>Unable to create logfile!</source> +<target>Ðевозможно Ñоздать лог-файл!</target> +<source>Batch execution</source> +<target>Выполнение пакетного заданиÑ</target> +<source>Log-messages:</source> +<target>Лог-ÑообщениÑ:</target> +<source>Stop</source> +<target>Стоп</target> +<source>Total time:</source> +<target>Общее времÑ:</target> +<source>Synchronization aborted!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target> +<source>Synchronization completed with errors!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð° Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸!</target> +<source>Synchronization completed successfully!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Ðажмите "Переключить" Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого графичеÑкого интерфейÑа FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Переключение на пользовательÑкий графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync:</target> +<source>Download now?</source> +<target>Загрузить ÑейчаÑ?</target> +<source>Information</source> +<target>ИнформациÑ</target> +<source>FreeFileSync is up to date!</source> +<target>У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю?</target> +<source>(Requires an Internet connection!)</source> +<target>(требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к Интернету!)</target> +<source>1. &Compare</source> +<target>1. &Сравнить</target> +<source>2. &Synchronize...</source> +<target>2. &Синхронизировать</target> +<source>S&witch view</source> +<target>Переключить вид</target> +<source>&New</source> +<target>&ÐоваÑ</target> +<source>&Program</source> +<target>&Программа</target> +<source>&Language</source> +<target>&Язык</target> +<source>&Global settings...</source> +<target>&Глобальные наÑтройки...</target> +<source>&Create batch job...</source> +<target>&Создать задание...</target> +<source>&Export file list...</source> +<target>&ÐкÑпортировать ÑпиÑок файлов...</target> +<source>&Advanced</source> +<target>&Дополнительно</target> +<source>&Check for new version</source> +<target>&Проверить наличие новой верÑии</target> +<source>Compare</source> +<target>Сравнить</target> +<source>Compare both sides</source> +<target>Сравнить обе Ñтороны</target> +<source>&Abort</source> +<target>&Отмена</target> +<source>Synchronize...</source> +<target>Синхронизировать</target> +<source>Start synchronization</source> +<target>Ðачать Ñинхронизацию</target> +<source>Swap sides</source> +<target>ПоменÑÑ‚ÑŒ направление</target> +<source>Add folder pair</source> +<target>Добавить пару папок</target> +<source>Remove folder pair</source> +<target>Удалить пару папок</target> +<source>Save current configuration to file</source> +<target>Сохранить текущие наÑтройки Ñинхронизации в файл</target> +<source>Load configuration from file</source> +<target>Загрузить наÑтройки Ñинхронизации из файла</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target> +ПоÑледние иÑпользованные наÑтройки Ñинхронизации +(нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка) +</target> +<source>Hide excluded items</source> +<target>Скрыть иÑключенные пункты</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Скрыть отфильтрованные или временно иÑключенные файлы</target> +<source>Number of files and directories that will be created</source> +<target>ЧиÑло файлов и папок, которые будут Ñозданы</target> +<source>Number of files that will be overwritten</source> +<target>ЧиÑло файлов, которые будут перезапиÑаны</target> +<source>Number of files and directories that will be deleted</source> +<target>ЧиÑло файлов и папок, которые будут удалены</target> +<source>Total amount of data that will be transferred</source> +<target>Общий объем данных, который будет передаватьÑÑ</target> +<source>Left</source> +<target>Слева</target> +<source>Right</source> +<target>Справа</target> +<source>Batch job</source> +<target>Пакетное задание</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Создайте файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ Ñинхронизации. Чтобы запуÑтить программу в Ñтом режиме проÑто передайте название файла на выполнение FreeFileSync: FreeFileSync.exe <batchfile>. Ðто также может быть запиÑано в планировщике задач Вашей операционной ÑиÑтемы.</target> +<source>Help</source> +<target>Помощь</target> +<source>Configuration overview:</source> +<target>ÐаÑтройки Ñинхронизации:</target> +<source>Filter files</source> +<target>Фильтр файлов</target> +<source>Status feedback</source> +<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи</target> +<source>Silent mode</source> +<target>Скрытый режим</target> +<source>Start minimized and write status information to a logfile</source> +<target>ЗапуÑкать Ñвернутым и пиÑать информацию о ÑоÑтоÑнии в лог-файл</target> +<source>Error handling</source> +<target>Обработка ошибок</target> +<source>Overview</source> +<target>ГлавнаÑ</target> +<source>Select logfile directory:</source> +<target>Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов:</target> +<source>Maximum number of logfiles:</source> +<target>МакÑимальное количеÑтво лог-файлов:</target> +<source>&Save</source> +<target>&Сохранить</target> +<source>&Load</source> +<target>&Загрузить</target> +<source>&Cancel</source> +<target>&Отмена</target> +<source>Elements found:</source> +<target>Ðлементов найдено:</target> +<source>Elements remaining:</source> +<target>Ðлементов оÑталоÑÑŒ:</target> +<source>Speed:</source> +<target>СкороÑÑ‚ÑŒ:</target> +<source>Time remaining:</source> +<target>Времени оÑталоÑÑŒ:</target> +<source>Time elapsed:</source> +<target>Времени прошло:</target> +<source>Operation:</source> +<target>ОперациÑ:</target> +<source>Select variant:</source> +<target>Выберите вариант:</target> +<source><Automatic></source> +<target><ÐвтоматичеÑкий></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Ð’Ñ‹Ñвление и раÑпроÑтранение изменений на обеих Ñторонах Ñ Ð¸Ñпользованием базы данных. Удаленные файлы и конфликты определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.</target> +<source>Mirror ->></source> +<target>Зеркало ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ (резервнаÑ) ÐºÐ¾Ð¿Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹ чаÑти. Ð’ результате Ñинхронизации Ð¿Ñ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° будет изменена до полного ÑоответÑÑ‚Ð²Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹.</target> +<source>Update -></source> +<target>Обновить -></target> +<source>Copy new or updated files to right folder.</source> +<target>Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне.</target> +<source>Custom</source> +<target>Выборочно</target> +<source>Configure your own synchronization rules.</source> +<target>ÐаÑтроить Ñвои ÑобÑтвенные правила Ñинхронизации.</target> +<source>Deletion handling</source> +<target>ÐаÑтройки удалениÑ</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>ÐаÑтройки</target> +<source>Category</source> +<target>КатегориÑ</target> +<source>Action</source> +<target>ДейÑтвие</target> +<source>Files/folders that exist on left side only</source> +<target>Файлы/папки, ÑущеÑтвующие только на левой Ñтороне</target> +<source>Files/folders that exist on right side only</source> +<target>Файлы/папки, ÑущеÑтвующие только на правой Ñтороне</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Файлы, ÑущеÑтвующие на обоих Ñторонах, левый новее</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Файлы, ÑущеÑтвующие на обоих Ñторонах, правый новее</target> +<source>Files that have different content</source> +<target>Файлы, имеющие различное Ñодержание</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Конфликты/файлы, которые не могут быть отнеÑены к какой-либо категории</target> +<source>Compare by...</source> +<target>Критерии ÑравнениÑ</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые + - размер файла + - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ +</target> +<source>File size and date</source> +<target>Размер и дата файла</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target> +<source>File content</source> +<target>Содержимое файла</target> +<source>Symbolic Link handling</source> +<target>Обращение к Ñимвольной ÑÑылке</target> +<source>Synchronizing...</source> +<target>СинхронизациÑ...</target> +<source>Elements processed:</source> +<target>Ðлементов обработано:</target> +<source>&Pause</source> +<target>&Пауза</target> +<source>Compare by "File size and date"</source> +<target>Сравнивать по размеру и дате</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Ðтот вариант Ñравнивает два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами и Ñчитает их равными, еÑли они имеют одинаковый размер файла и одинаковую дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Когда Ñравнение запущено Ñ Ñтими критериÑми, алгоритм Ñледующий:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Как результат файлы разделÑÑŽÑ‚ÑÑ Ð½Ð° Ñледующие категории:</target> +<source>- equal</source> +<target>- одинаковые</target> +<source>- left newer</source> +<target>- левые новее</target> +<source>- right newer</source> +<target>- правые новее</target> +<source>- exists left only</source> +<target>- только левые ÑущеÑтвуют</target> +<source>- exists right only</source> +<target>- только правые ÑущеÑтвуют</target> +<source>- conflict (same date, different size)</source> +<target>- конфликт (даты Ñовпадают, размеры разные)</target> +<source>Compare by "File content"</source> +<target>Сравнивать по Ñодержимому</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Как напиÑано в названии, два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем отмечаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, только еÑли они имеют то же Ñамое Ñодержание. Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоглаÑованноÑти, а не операции резервного копированиÑ. ПоÑтому даты файлов не учитываютÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ. + +С Ñтой опцией алгоритм короче: +</target> +<source>- different</source> +<target>- разные</target> +<source>Source code written in C++ utilizing:</source> +<target>ИÑходный код напиÑан на C++ Ñ Ð¸Ñпользованием:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Большое ÑпаÑибо за перевод FreeFileSync:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Отзывы и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñылайте по адреÑу:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync на Sourceforge</target> +<source>Homepage</source> +<target>Оф.Ñайт</target> +<source>If you like FFS</source> +<target>ЕÑли Вам понравилÑÑ FFS</target> +<source>Donate with PayPal</source> +<target>Отправить деньги через PayPal</target> +<source>Email</source> +<target>Почта</target> +<source>Report translation error</source> +<target>Сообщить об ошибке перевода</target> +<source>Published under the GNU General Public License:</source> +<target>ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Игнорировать поÑледующие ошибки</target> +<source>Hide further error messages during the current process</source> +<target>Скрыть поÑледующие ошибки во Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ процеÑÑа</target> +<source>&Ignore</source> +<target>&Игнорировать</target> +<source>&Retry</source> +<target>&Повторить</target> +<source>Do not show this dialog again</source> +<target>Больше не показывать Ñто окно</target> +<source>&Switch</source> +<target>&Переключить</target> +<source>&Yes</source> +<target>&Да</target> +<source>&No</source> +<target>&Ðет</target> +<source>Delete on both sides</source> +<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне</target> +<source>Use Recycle Bin</source> +<target>ИÑпользовать "Корзину"</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Только файлы/папки, ÑоответÑтвующие вÑем наÑтройкам фильтра, будут выбраны Ð´Ð»Ñ Ñинхронизации. +Примечание: Фильтр имен должен быть задан отноÑительно оÑновных папок Ñинхронизации. +</target> +<source>Hints:</source> +<target>ПодÑказка:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Введите имена файлов или папок, разделÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ';' или Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. ИÑпользуйте Ñимволы '*' и '?' Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ неизвеÑтных.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. ИÑключите файлы прÑмо в главном окне через контекÑтное меню.</target> +<source>Example</source> +<target>Пример</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +ВключаÑ: *.doc;*.zip;*.exe +ИÑключаÑ: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки "temp"</target> +<source>Include</source> +<target>Включить</target> +<source>Exclude</source> +<target>ИÑключить</target> +<source>Select time span:</source> +<target>Выберите промежуток времени:</target> +<source>Minimum file size:</source> +<target>Минимальный размер файла:</target> +<source>Maximum file size:</source> +<target>МакÑимальный размер файла:</target> +<source>&Default</source> +<target>&По-умолчанию</target> +<source>Move column up</source> +<target>ПеремеÑтить вверх</target> +<source>Move column down</source> +<target>ПеремеÑтить вниз</target> +<source>Copy locked files</source> +<target>Копировать заблокированные файлы</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Копирование общих или заблокированных файлов +Ñ Ð¸Ñпользованием Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð° +(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) +</target> +<source>Copy filesystem permissions</source> +<target>Копировать права доÑтупа файловой ÑиÑтемы</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Передача прав доÑтупа файла/папки +(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) +</target> +<source>Hidden dialogs:</source> +<target>Скрытые диалоги</target> +<source>Reset</source> +<target>СброÑить</target> +<source>Show hidden dialogs</source> +<target>Показать Ñкрытые диалоги</target> +<source>External applications</source> +<target>Внешние приложениÑ</target> +<source>Description</source> +<target>ОпиÑание</target> +<source>Variant</source> +<target>Вариант</target> +<source>Statistics</source> +<target>СтатиÑтика</target> +<source>Find what:</source> +<target>Ðайти:</target> +<source>Match case</source> +<target>Учитывать региÑÑ‚Ñ€</target> +<source>&Find next</source> +<target>&Ðайти далее</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)!</target> +<source>Batch file created successfully!</source> +<target>Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно!</target> +<source>Main bar</source> +<target>Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ</target> +<source>Folder pairs</source> +<target>Пары папок Ð´Ð»Ñ Ñинхронизации</target> +<source>Select view</source> +<target>СпиÑок файлов</target> +<source>Folder Comparison and Synchronization</source> +<target>Сравнение и ÑинхронизациÑ</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Корзина пока не поддерживаетÑÑ Ð´Ð»Ñ Ñтой ÑиÑтемы!</target> +<source>Set direction:</source> +<target>Выберите направление:</target> +<source>Exclude temporarily</source> +<target>ИÑключить</target> +<source>Include temporarily</source> +<target>Включить</target> +<source>Exclude via filter:</source> +<target>ИÑключить через фильтр:</target> +<source><multiple selection></source> +<target><групповое выделение></target> +<source>D-Click</source> +<target>Двойной клик</target> +<source>Copy to clipboard CTRL+C</source> +<target>Копировать в буфер обмена CTRL+C</target> +<source>Delete files DEL</source> +<target>Удалить файл(Ñ‹)... DEL</target> +<source>Customize...</source> +<target>Выбрать колонки...</target> +<source>Auto-adjust columns</source> +<target>Ðвтовыравнивание ширины колонок</target> +<source>Include all rows</source> +<target>Отметить вÑе</target> +<source>Exclude all rows</source> +<target>Ðе отмечать ничего</target> +<source>Reset view</source> +<target>Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек вида</target> +<source>Show "%x"</source> +<target>Показать "%x"</target> +<source><Last session></source> +<target><ПоÑледнÑÑ ÑеÑÑиÑ></target> +<source>Configuration saved!</source> +<target>ÐаÑтройки Ñинхронизации Ñохранены!</target> +<source>Save changes to current configuration?</source> +<target>Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² текущих наÑтройках Ñинхронизации?</target> +<source>Configuration loaded!</source> +<target>ÐаÑтройки Ñинхронизации загружены!</target> +<source>Hide files that exist on left side only</source> +<target>Скрыть файлы, ÑущеÑтвующие только Ñлева</target> +<source>Show files that exist on left side only</source> +<target>Показать файлы, ÑущеÑтвующие только Ñлева</target> +<source>Hide files that exist on right side only</source> +<target>Скрыть файлы, ÑущеÑтвующие только Ñправа</target> +<source>Show files that exist on right side only</source> +<target>Показать файлы, ÑущеÑтвующие только Ñправа</target> +<source>Hide files that are newer on left</source> +<target>Скрыть файлы, которые новее Ñлева</target> +<source>Show files that are newer on left</source> +<target>Показать файлы, которые новее Ñлева</target> +<source>Hide files that are newer on right</source> +<target>Скрыть файлы, которые новее Ñправа</target> +<source>Show files that are newer on right</source> +<target>Показать файлы, которые новее Ñправа</target> +<source>Hide files that are equal</source> +<target>Скрыть одинаковые файлы</target> +<source>Show files that are equal</source> +<target>Показать одинаковые файлы</target> +<source>Hide files that are different</source> +<target>Скрыть различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target> +<source>Show files that are different</source> +<target>Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target> +<source>Hide conflicts</source> +<target>Скрыть конфликтующие файлы</target> +<source>Show conflicts</source> +<target>Показать конфликтующие файлы</target> +<source>Hide files that will be created on the left side</source> +<target>Скрыть файлы, которые будут Ñозданы на левой Ñтороне</target> +<source>Show files that will be created on the left side</source> +<target>Показать файлы, которые будут Ñозданы на левой Ñтороне</target> +<source>Hide files that will be created on the right side</source> +<target>Скрыть файлы, которые будут Ñозданы на правой Ñтороне</target> +<source>Show files that will be created on the right side</source> +<target>Показать файлы, которые будут Ñозданы на правой Ñтороне</target> +<source>Hide files that will be deleted on the left side</source> +<target>Скрыть файлы, которые будут удалены на левой Ñтороне</target> +<source>Show files that will be deleted on the left side</source> +<target>Показать файлы, которые будут удалены на левой Ñтороне</target> +<source>Hide files that will be deleted on the right side</source> +<target>Скрыть файлы, которые будут удалены на правой Ñтороне</target> +<source>Show files that will be deleted on the right side</source> +<target>Показать файлы, которые будут удалены на правой Ñтороне</target> +<source>Hide files that will be overwritten on left side</source> +<target>Скрыть файлы, которые будут перезапиÑаны на левой Ñтороне</target> +<source>Show files that will be overwritten on left side</source> +<target>Показать файлы, которые будут перезапиÑаны на левой Ñтороне</target> +<source>Hide files that will be overwritten on right side</source> +<target>Скрыть файлы, которые будут перезапиÑаны на правой Ñтороне</target> +<source>Show files that will be overwritten on right side</source> +<target>Показать файлы, которые будут перезапиÑаны на правой Ñтороне</target> +<source>Hide files that won't be copied</source> +<target>Скрыть файлы, которые не будут Ñкопированы</target> +<source>Show files that won't be copied</source> +<target>Показать файлы, которые не будут Ñкопированы</target> +<source>All directories in sync!</source> +<target>Ð’Ñе папки Ñинхронизированы!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>ПожалуйÑта, запуÑтите Ñравнение перед Ñинхронизацией!</target> +<source>Comma separated list</source> +<target>СпиÑок, разделÑемый запÑтыми</target> +<source>Legend</source> +<target>Легенда</target> +<source>File list exported!</source> +<target>СпиÑок файлов ÑкÑпортирован!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%x объект удален уÑпешно!</pluralform> +<pluralform>%x объекта удалены уÑпешно!</pluralform> +<pluralform>%x объектов удалены уÑпешно!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x папка</pluralform> +<pluralform>%x папки</pluralform> +<pluralform>%x папок</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x файл</pluralform> +<pluralform>%x файла</pluralform> +<pluralform>%x файлов</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x из %y Ñтроки показано</pluralform> +<pluralform>%x из %y Ñтрок показано</pluralform> +<pluralform>%x из %y Ñтрок показано</pluralform> +</target> +<source>Scanning...</source> +<target>Сканирование...</target> +<source>Comparing content...</source> +<target>Сравнение ÑодержаниÑ...</target> +<source>Paused</source> +<target>Пауза</target> +<source>Aborted</source> +<target>Отменено</target> +<source>Completed</source> +<target>Завершено</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ...</target> +<source>Continue</source> +<target>Продолжить</target> +<source>Pause</source> +<target>Пауза</target> +<source>Cannot find %x</source> +<target>Ðевозможно найти %x</target> +<source>DECISION TREE</source> +<target>Древо решений</target> +<source>file exists on both sides</source> +<target>файлы ÑущеÑтвуют на обоих Ñторонах</target> +<source>on one side only</source> +<target>файлы ÑущеÑтвуют только на одной Ñтороне</target> +<source>different</source> +<target>разные</target> +<source>Inactive</source> +<target>---</target> +<source>Second</source> +<target>Секунд</target> +<source>Minute</source> +<target>Минут</target> +<source>Hour</source> +<target>ЧаÑов</target> +<source>Day</source> +<target>Дней</target> +<source>Byte</source> +<target>Байт</target> +<source>KB</source> +<target>КБ</target> +<source>MB</source> +<target>МБ</target> +<source>Filter: All pairs</source> +<target>Фильтр: Ð’Ñе пары</target> +<source>Filter: Single pair</source> +<target>Фильтр: Одна пара</target> +<source>Ignore</source> +<target>Игнорировать</target> +<source>Direct</source> +<target>ПрÑмое</target> +<source>Follow</source> +<target>ПоÑледовательное</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target> +Интегрируйте внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² контекÑтное меню. +ДоÑтупны Ñледующие команды: +</target> +<source>- full file or directory name</source> +<target>- полный путь файла или папки</target> +<source>- directory part only</source> +<target>- чаÑÑ‚ÑŒ пути папки</target> +<source>- Other side's counterpart to %name</source> +<target>- аналогичный файл Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target> +<source>- Other side's counterpart to %dir</source> +<target>- Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target> +<source>Restore all hidden dialogs?</source> +<target>Отображать вÑе Ñкрытые диалоговые окна?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующий %x объект в "Корзину"?</pluralform> +<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объекта в "Корзину"?</pluralform> +<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объектов в "Корзину"?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующий %x объект?</pluralform> +<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объекта?</pluralform> +<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объектов?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>ОÑтавить как нерешенный конфликт</target> +<source>Delete permanently</source> +<target>УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> +<source>Delete or overwrite files permanently</source> +<target>УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target> +<source>Versioning</source> +<target>Перемещать удалÑемые файлы в заданную папку</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target> +<source>Cannot determine sync-direction:</source> +<target>Ðевозможно определить направление Ñинхронизации:</target> +<source>Filter settings have changed!</source> +<target>ÐаÑтройки фильтра были изменены!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Со времени поÑледней Ñинхронизации Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон произошли изменениÑ!</target> +<source>No change since last synchronization!</source> +<target>Ðикаких изменений Ñ Ð¿Ð¾Ñледней Ñинхронизации!</target> +<source>The file was not processed by last synchronization!</source> +<target>Файл не был обработан при поÑледней Ñинхронизации!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>При удалении папки возник конфликт Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ подпапками или файлами!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target> +ÐаÑтройка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñинхронизации по умолчанию: +Старые файлы будут заменены более новыми файлами. +</target> +<source>The file does not contain a valid configuration:</source> +<target>Файл не Ñодержит дейÑтвительных наÑтроек Ñинхронизации:</target> +<source>Scanning:</source> +<target>Сканирую:</target> +<source>Encoding extended time information: %x</source> +<target>Кодирование раÑширенной информации о времени: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target> +<source>Directory does not exist:</source> +<target>Папка не ÑущеÑтвует:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:</target> +<source>Comparing content of files %x</source> +<target>Сравнение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² %x</target> +<source>Memory allocation failed!</source> +<target>Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти! (Ðе хватает памÑти)</target> +<source>File %x has an invalid date!</source> +<target>Файл %x имеет недейÑтвительную дату!</target> +<source>Conflict detected:</source> +<target>Обнаружен конфликт:</target> +<source>Files %x have the same date but a different size!</source> +<target>Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но различное Ñодержание!</target> +<source>Comparing files by content failed.</source> +<target>Сравнение файлов по Ñодержимому провалено.</target> +<source>Generating file list...</source> +<target>Создание ÑпиÑка файлов...</target> +<source>Multiple...</source> +<target>Различные варианты Ñинхронизации</target> +<source>Files that are equal on both sides</source> +<target>Файлы, одинаковые Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Одинаковые файлы/папки, которые отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target> +<source>Copy from right to left</source> +<target>Копировать Ñправа налево</target> +<source>Copy from left to right</source> +<target>Копировать Ñлева направо</target> +<source>Delete files/folders existing on left side only</source> +<target>УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на левой Ñтороне</target> +<source>Delete files/folders existing on right side only</source> +<target>УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на правой Ñтороне</target> +<source>Copy from right to left overwriting</source> +<target>Копировать Ñправа налево Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью</target> +<source>Copy from left to right overwriting</source> +<target>Копировать Ñлева направо Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью</target> +<source>Do nothing</source> +<target>Ðичего не делать</target> +<source>Copy attributes only from right to left</source> +<target>Копировать только атрибуты Ñправа налево</target> +<source>Copy attributes only from left to right</source> +<target>Копировать только атрибуты Ñлева направо</target> +<source>Deleting file %x</source> +<target>Удаление файла %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Удаление Ñимвольной ÑÑылки %x</target> +<source>Deleting folder %x</source> +<target>Удаление папки %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Отправка %x в "Корзину"</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Перемещение файла %x в заданную пользователем папку %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Перемещение папки %x в заданную пользователем папку %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Перемещение Ñимвольной ÑÑылки %x в заданную пользователем папку %y</target> +<source>Copying new file %x to %y</source> +<target>Копирование нового файла %x в %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Копирование новой Ñимвольной ÑÑылки %x в %y</target> +<source>Overwriting file %x in %y</source> +<target>ПерезапиÑÑŒ файла %x в %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>ПерезапиÑÑŒ Ñимвольной ÑÑылки %x в %y</target> +<source>Creating folder %x</source> +<target>Создание папки %x</target> +<source>Verifying file %x</source> +<target>Проверка файла %x</target> +<source>Updating attributes of %x</source> +<target>Обновление атрибутов %x</target> +<source>Source directory does not exist anymore:</source> +<target>ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации!</target> +<source>Target directory name must not be empty!</source> +<target>Путь целевой папки не должен быть пуÑтым!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>ПользовательÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ была указана!</target> +<source>Unresolved conflicts existing!</source> +<target>СущеÑтвуют нерешенные конфликты</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию.</target> +<source>Significant difference detected:</source> +<target>Обнаружено ÑущеÑтвенное различие:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Более 50% общего количеÑтва файлов будет Ñкопировано или удалено!</target> +<source>Not enough free disk space available in:</source> +<target>Ðе доÑтаточно Ñвободного меÑта в:</target> +<source>Free disk space required:</source> +<target>Требуемое Ñвободное меÑто на диÑке:</target> +<source>Free disk space available:</source> +<target>ДоÑтупно Ñвободного меÑта на диÑке:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации!</target> +<source>Processing folder pair:</source> +<target>Обработка пары папок:</target> +<source>Generating database...</source> +<target>Создание базы данных...</target> +<source>Error copying locked file %x!</source> +<target>Ошибка при копировании заблокированного файла %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание!</target> diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index fbe0a03d..22870a5a 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -1,910 +1,1071 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port od GNU Compiler Collection\n wxWidgets \t- Open-Source GUI ogrodje\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objektov uspeÅ¡no izbrisanih -%x Bytes -%x Bajtov -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dan/dni -%x directories -%x imeniki -%x files -%x datoteke -%x hour(s) -%x ura/ur -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x od %y vrstic prikazanih -%x of 1 row in view -%x od 1 vrstice prikazane -%x sec -%x sek -%x% -%x% -&Abort -&Prekini -&About... -&O programu... -&Advanced -&Napredno -&Cancel -&PrekliÄi -&Check for new version -&Preveri za novo razliÄico -&Content -&Vsebina -&Create batch job... -&Ustvari batch opravilo... -&Default -&Privzeto -&Exit -&Izhod -&Export file list... -&Izvozi seznam datotek... -&File -&Datoteka -&Find next -&Najdi naslednje -&Global settings... -&Globalne nastavitve... -&Help -&PomoÄ -&Ignore -&Ignoriraj -&Language -&Jezik -&Load -&Naloži -&Load configuration... -Na&loži konfiguracijo... -&New -&Novo -&No -&Ne -&OK -&V redu -&Pause -&Premor -&Program -&Program -&Quit -&Zapri -&Restore -&Obnovi -&Retry -&Ponovi -&Save -&Shrani -&Switch -&Zamenjaj -&Yes -&Da -(Build: %x) -(Izgradnja: %x) -(Requires an Internet connection!) -(Zahteva povezavo z Internetom!) -- Other side's counterpart to %dir -- Duplikat z druge strani od %dir -- Other side's counterpart to %name -- Duplikat z druge strani od %name -- conflict -- spor -- conflict (same date, different size) -- spor (isti datum, razliÄna velikost) -- different -- razliÄni -- directory part only -- del, ki zajema samo imenike -- equal -- enaki -- exists left only -- obstaja samo na levi -- exists right only -- obstaja samo na desni -- full file or directory name -- polno ime datoteke ali imenika -- left -- levo -- left newer -- leva novejÅ¡a -- right -- desno -- right newer -- desna novejÅ¡a -/sec -/sek -1 directory -1 imenik -1 file -1 datoteka -1. &Compare -1. &Primerjaj -1. Enter relative file or directory names separated by ';' or a new line. -1. Vnesite relativna imena datotek ali imenikov loÄenih s ';' ali novo vrstico. -1. Select directories to monitor. -1. Izberite imenike za nadziranje -2. &Synchronize... -2. &Sinhroniziraj... -2. Enter a command line. -2. Vnesite ukazno-vrstico. -2. Use wildcard characters '*' and '?'. -2. Uporabite lahko tudi znake '*' in '?'. -3. Exclude files directly on main grid via context menu. -3. IzkljuÄite datoteke neposredno na glavni mreži s kontekstnim menujem. -3. Press 'Start'. -3. Pritisnite 'ZaÄni'. -<Automatic> -<Samodejno> -<Directory> -<Imenik> -<Last session> -<Zadnja seja> -<Symlink> -<SimboliÄna povezava> -<multiple selection> -<mnogokratna izbira> -A directory input field is empty. -Vpisno polje za imenik je prazno. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Imenik bo spremenjen, kar je del veÄkratnih parov map! Prosimo preglejte nastavitve sinhronizacije! -A newer version of FreeFileSync is available: -Na voljo je nova razliÄica FreeFileSync: -Abort requested: Waiting for current operation to finish... -Zahtevana je bila prekinitev: Äakam, da se zakljuÄi trenutna operacija... -Abort synchronization immediately -Takoj prekini sinhronizacijo -Aborted -Prekinitev uspela -About -O programu(1) -Action -Ukrep -Add folder -Dodaj mapo -Add folder pair -Dodaj par imenikov -All directories in sync! -Vsi imeniki so sinhronizirani! -An exception occurred! -Zgodila se je napaka! -As a result the files are separated into the following categories: -Kot rezultat so datoteke razdeljene v naslednje kategorije: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Kot že samo ime pove, sta dve datoteki oznaÄeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se Äasi datotek ne upoÅ¡tevajo.\n\nZ omogoÄeno to možnostjo je drevo odloÄanja manjÅ¡e: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Sestavi batch datoteko za samodejno sinhronizacijo. Da zaÄnete v batch naÄinu, preprosto podajte ime batch datoteke k FreeFileSync izvrÅ¡ilni datoteki: FreeFileSync.exe <imedatotekebatch>. To se lahko nastavi tudi v urniku opravil vaÅ¡ega operacijskega sistema. -At least one directory input field is empty. -Vsaj eno vnosno polje za vpis imenika je prazno. -Auto-adjust columns -Samo-prilagodi stolpce -Batch execution -Batch izvajanje -Batch file created successfully! -Datoteka batch je bila uspeÅ¡no ustvarjena! -Batch job -Batch opravilo -Big thanks for localizing FreeFileSync goes out to: -Zahvale za prevod FreeFileSync gredo: -Both sides have changed since last synchronization! -Obe strani sta se spremenili od zadnje sinhronizacije! -Browse -Brskaj -Browse directory -Brskaj po imeniku -Cannot determine sync-direction: -Ne morem doloÄiti sinhronizacijske smeri. -Cannot find %x -Ne najdem %x -Category -Kategorija -Clear filter settings -PoÄisti nastavitve filtra -Comma separated list -Seznam loÄen z vejico -Command line -Ukazna vrstica -Command line is empty! -Ukazna vrstica je prazna! -Compare -Primerjaj -Compare both sides -Primerjaj obe strani -Compare by \"File content\" -Primerjaj po \"Vsebini datotek\" -Compare by \"File size and date\" -Primerjaj po \"Datumu in velikosti\" -Compare by... -Primerjaj po... -Comparing content of files %x -Primerjam vsebino datotek %x -Comparing content... -Primerjam vsebino... -Comparing files by content failed. -Primerjava datotek po vsebini ni uspela. -Comparison Result -Rezultati primerjave -Comparison settings -Nastavitve primerjanja -Completed -ZakljuÄeno -Configuration -Konfiguracija -Configuration loaded! -Konfiguracija naložena! -Configuration overview: -Pregled konfiguracije: -Configuration saved! -Konfiguracija shranjena! -Configure filter -Konfiguriraj filter -Configure your own synchronization rules. -Konfigurirajte vaÅ¡a lastna sinhronizacijska pravila. -Confirm -Potrdi -Conflict detected: -Zaznan spor: -Conflicts/files that cannot be categorized -Prisotni so spori/datoteke, ki ne morejo biti kategorizirani -Continue -Nadaljuj -Conversion error: -Napaka pri pretvorbi: -Copy attributes only from left to right -Kopiraj atribute samo iz leve na desno -Copy attributes only from right to left -Kopiraj atribute samo iz desne na levo -Copy filesystem permissions -Kopiraj dovoljenja datoteÄnega sistema -Copy from left to right -Kopiraj iz leve na desno -Copy from left to right overwriting -Kopiraj iz leve na desno s prepisovanjem -Copy from right to left -Kopiraj iz desne na levo -Copy from right to left overwriting -Kopiraj iz desne na levo s prepisovanjem -Copy locked files -Kopiraj zaklenjene datoteke -Copy new or updated files to right folder. -Kopiraj nove ali posodobljene datoteke v desno mapo. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Shadow Copy\n(Zahteva pravice skrbnika) -Copy to clipboard\tCTRL+C -Kopiraj v odložiÅ¡Äe\tCTRL+C -Copying new Symbolic Link %x to %y -Kopiram novo SimboliÄno povezavo %x v %y -Copying new file %x to %y -Kopiram novo datoteko %x v %y -Could not determine volume name for file: -Ne morem doloÄiti imena volumna za datoteko: -Could not initialize directory monitoring: -Ne morem zaÄeti nadzorovanja imenikov: -Could not load a required DLL: -Ne morem naložiti zahtevano DLL: -Could not read values for the following XML nodes: -Ne morem brati vrednosti za naslednja XML vozliÅ¡Äa: -Create a batch job -Ustvari batch opravilo -Creating folder %x -Ustvarjam mapo %x -Custom -Po meri -Customize columns -Stolpce prikroji po meri -Customize... -Prilagodi... -D-Click -D-Klik -DECISION TREE -DREVO ODLOÄŒITEV -Data verification error: Source and target file have different content! -Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata razliÄno vsebino! -Date -Datum -Delete files/folders existing on left side only -IzbriÅ¡i datoteke/mape, ki obstajajo samo na levi strani -Delete files/folders existing on right side only -IzbriÅ¡i datoteke/mape, ki obstajajo samo na desni strani -Delete files\tDEL -IzbriÅ¡i datoteke\tDEL -Delete on both sides -IzbriÅ¡i na obeh straneh -Delete on both sides even if the file is selected on one side only -IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani -Delete or overwrite files permanently -Trajno izbriÅ¡i ali prepiÅ¡i datoteke -Delete permanently -Trajno izbriÅ¡i -Deleting Symbolic Link %x -Brisanje simboliÄne povezave %x -Deleting file %x -Brisanje datoteke %x -Deleting folder %x -Brisanje mape %x -Deletion handling -Ravnanje pri brisanju -Description -Opis -Direct -Neposredno -Directories are dependent! Be careful when setting up synchronization rules: -Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila: -Directories to watch -Imenika za nadzorovanje -Directory -Imenik -Directory does not exist: -Imenik ne obstaja: -Do not show this dialog again -Ne prikaži veÄ tega pogovornega okna -Do nothing -Ne naredi niÄesar -Do you really want to delete the following object(s)? -Ali resniÄno želite izbrisati naslednje objekte? -Do you really want to move the following object(s) to the Recycle Bin? -Ali resniÄno želite premakniti naslednje objekte v KoÅ¡? -Do you want FreeFileSync to automatically check for updates every week? -Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden? -Donate with PayPal -Doniraj s PayPal -Download now? -Prenesem sedaj? -Drag && drop -Povleci && spusti -Elements found: -Najdenih elementov: -Elements processed: -Obdelanih elementov: -Elements remaining: -Preostalih elementov: -Email -Email -Encoding extended time information: %x -Podrobne informacije o Äasu enkodiranja: %x -Endless loop when traversing directory: -NeskonÄna zanka pri prehodu imenika: -Equal files/folders that differ in attributes only -Enake datoteke/mape, ki se razlikujejo samo v atributih -Error -Napaka -Error changing modification time: -Napaka pri spreminjanju Äasa modifikacije: -Error copying file permissions: -Napaka pri kopiranju datoteÄnih dovoljenj: -Error copying file: -Napaka pri kopiranju datoteke: -Error copying locked file %x! -Napaka pri kopiranju zaklenjene datoteke %x! -Error copying symbolic link: -Napaka pri kopiranju simboliÄnih povezav: -Error creating directory: -Napaka pri ustvarjanju imenika: -Error deleting directory: -Napaka pri brisanju imenika: -Error deleting file: -Napaka pri brisanju datoteke: -Error handling -Napaka pri obravnavanju -Error loading library function: -Napaka pri nalaganju funkcije iz knjižnice: -Error moving directory: -Napaka pri premikanju imenika: -Error moving file: -Napaka pri premikanju datoteke: -Error moving to Recycle Bin: -Napaka pri premikanju v KoÅ¡: -Error opening file: -Napaka pri odpiranju datoteke: -Error parsing configuration file: -Napaka pri preverjanju konfiguracijske datoteke: -Error reading file attributes: -Napaka pri branju atributov datoteke: -Error reading file: -Napaka pri branju datoteke: -Error reading from synchronization database: -Napaka pri branju iz sinhronizacijske podatkovne baze: -Error reading security context: -Napaka pri branju varnostne skladnosti: -Error resolving symbolic link: -Napaka pri razreÅ¡evanju simboliÄne povezave: -Error setting directory lock: -Napaka pri nastavljanju zaklepanja imenika: -Error setting privilege: -Napaka pri nastavljanju privilegija: -Error starting Volume Shadow Copy Service! -Napaka pri zagonu servisa Volume Shadow Copy! -Error traversing directory: -Napaka pri prehajanju imenika: -Error when monitoring directories. -Napaka pri nadzorovanju imenikov. -Error writing file: -Napaka pri pisanju datoteke: -Error writing security context: -Napaka pri pisanju varnostne skladnosti: -Error writing to synchronization database: -Napaka pri pisanju v sinhronizacijsko podatkovno bazo: -Example -Primer -Exclude -IzkljuÄi -Exclude all rows -IzkljuÄi vse vrstice -Exclude temporarily -ZaÄasno izkljuÄi -Exclude via filter: -IzkljuÄi preko filtra: -Exit instantly -Zapusti v trenutku -Extension -RazÅ¡iritev -External applications -Zunanje aplikacije -Fatal Error -Usodna napaka -Feedback and suggestions are welcome at: -Povratne informacije in predlogi so dobrodoÅ¡li na: -File %x has an invalid date! -Datoteka %x ima neveljaven datum! -File already exists. Overwrite? -Datoteka že obstaja. PrepiÅ¡em? -File content -Vsebini datoteke -File does not exist: -Datoteka ne obstaja: -File list exported! -Seznam datotek je bil izvožen! -File size and date -Velikosti in datumu datoteke -Filename -Ime datoteke -Files %x have the same date but a different size! -Datoteki %x imata enak datum ampak razliÄno velikost! -Files are found equal if\n - file content\nis the same -Datoteki sta enaki, Äe\n - je vsebina datoteke\nenaka -Files are found equal if\n - filesize\n - last write time and date\nare the same -Datoteki sta enaki, Äe so\n - velikost datoteke\n - zadnji Äas spremembe in datum\nenaki -Files that are equal on both sides -Datoteki, ki sta enaki na obeh straneh -Files that exist on both sides, left one is newer -Datoteke, ki obstajajo na obeh straneh, leva je novejÅ¡a -Files that exist on both sides, right one is newer -Datoteke, ki obstajajo na obeh straneh, desna je novejÅ¡a -Files that have different content -Datoteke, ki imajo razliÄno vsebino -Files/folders that exist on left side only -Datoteke/mape, ki obstajajo samo na levi strani -Files/folders that exist on right side only -Datoteke/mape, ki obstajajo samo na desni strani -Filter files -Filtriraj datoteke -Filter is active -Filterj je aktiven -Filter settings have changed! -Nastavitve filtra so bile spremenjene! -Filter: All pairs -Filtriraj: Vse pare -Filter: Single pair -Filtriraj: En sam par -Find -Najdi -Find what: -Najdi kaj -Folder Comparison and Synchronization -Primerjava in sinhronizacija imenika -Folder pairs -Pari map -Follow -Sledi -Free disk space available: -Prosti disk, ki je na voljo: -Free disk space required: -Potreben prostor na disku: -FreeFileSync Batch Job -FreeFileSync Batch opravilo -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge -FreeFileSync batch file -FreeFileSync batch datoteka -FreeFileSync configuration -FreeFileSync konfiguracija -FreeFileSync is up to date! -FreeFileSync je posodobljen! -Full path -Polna pot -Generating database... -Ustvarjam podatkovno bazo... -Generating file list... -Ustvarjam seznam datotek... -Global settings -Globalne nastavitve -Help -PomoÄ -Hidden dialogs: -Skriti pogovori: -Hide all error and warning messages -Skrij vsa obvestila o napakah in opozorilih -Hide conflicts -Skrij spore -Hide excluded items -Skrij izkljuÄene predmete -Hide files that are different -Skrij datoteke ki so razliÄne -Hide files that are equal -Skrij enake datoteke -Hide files that are newer on left -Skrij najnovejÅ¡e datoteke na levi -Hide files that are newer on right -Skrij najnovejÅ¡e datoteke na desni -Hide files that exist on left side only -Skrij datoteke, ki obstajajo samo na levi strani -Hide files that exist on right side only -Skrij datoteke, ki obstajajo samo na desni strani -Hide files that will be created on the left side -Skrij datoteke, ki bodo ustvarjene na levi strani -Hide files that will be created on the right side -Skrij datoteke, ki bodo ustvarjene na desni strani -Hide files that will be deleted on the left side -Skrij datoteke, ki bodo izbrisane na levi strani -Hide files that will be deleted on the right side -Skrij datoteke, ki bodo izbrisane na desni strani -Hide files that will be overwritten on left side -Skrij datoteke, ki bodo prepisane na levi strani -Hide files that will be overwritten on right side -Skrij datoteke, ki bodo prepisane na desni strani -Hide files that won't be copied -Skrij datoteke, ki ne bodo kopirane -Hide filtered or temporarily excluded files -Skrij filtrirane ali zaÄasno izkljuÄene datoteke -Hide further error messages during the current process -Skrijte nadaljnja obvestila o napakah med trenutnim procesom -Hints: -Namigi: -Homepage -DomaÄa stran -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Prepoznaj in Å¡iri spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno. -Idle time between detection of last change and execution of command line in seconds -ÄŒas nedejavnosti med zaznavanjem zadnje spremembe in izvrÅ¡itvijo ukazne vrstice v sekundah -If you like FFS -ÄŒe vam je FFS vÅ¡eÄ -Ignore -Ignoriraj -Ignore errors -Ignoriraj napake -Ignore subsequent errors -Ignoriraj vse nadaljnje napake -Include -VkljuÄi -Include all rows -VkljuÄi se vrstice -Include temporarily -Trenutno vkljuÄi -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -VkljuÄi: *.doc;*.zip;*.exe\nIzkljuÄi: \\stuff\\temp\\* -Incompatible synchronization database format: -Nekompatibilen format sinhronizacijske podatkovne baze: -Info -Info -Information -Informacije -Initial synchronization: -ZaÄetna sinhronizacija: -Integrate external applications into context menu. The following macros are available: -Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri: -Invalid FreeFileSync config file! -Neveljavna FreeFileSync nastavitvena datoteka! -Last used configurations (press DEL to remove from list) -Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama) -Leave as unresolved conflict -Pusti kot nereÅ¡eni spor -Left -Levo -Legend -Legenda -Load configuration from file -Naloži konfiguracijo iz datoteke -Log-messages: -SporoÄila beleženja: -Logging -Beležim -Main bar -Glavna vrstica -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico. -Match case -Ujemaj se s primerom -Maximum number of logfiles: -Maksimalno Å¡tevilo datotek beleženja: -Memory allocation failed! -NeuspeÅ¡no dodeljevanje pomnilnika! -Minimum Idle Time [seconds] -Minimalen Äas nedejavnosti [sekunde] -Mirror ->> -Zrcalno ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natanÄno ujemala z levo mapo po sinhronizaciji. -Monitoring active... -Nadziranje aktivno... -More than 50% of the total number of files will be copied or deleted! -VeÄ kot 50% od celotnega Å¡tevila datotek bo kopiranih ali izbrisanih! -Move column down -Premakni stolpec dol -Move column up -Premakni stolpec gor -Move files into a time-stamped subdirectory -Premakni datoteke v Äasovno-oznaÄen podimenik -Moving %x to Recycle Bin -Premikam %x v KoÅ¡ -Moving Symbolic Link %x to user-defined directory %y -Premikam simboliÄno povezavo %x v uporabniÅ¡ko doloÄen imenik %y -Moving file %x to user-defined directory %y -Premikam datoteko %x v uporabniÅ¡ko-doloÄen imenik %y -Moving folder %x to user-defined directory %y -Premikam mapo %x v uporabniÅ¡ko-doloÄen imenik %y -Multiple... -VeÄkratno... -No change since last synchronization! -Ni sprememb od zadnje sinhronizacije! -No filter selected -Noben filter ni izbran -Not enough free disk space available in: -Na voljo ni dovolj prostega prostora na disku v: -Nothing to synchronize according to configuration! -Po trenutni konfiguraciji ni niÄ za sinhronizirati! -Number of files and directories that will be created -Å tevilo datotek in imenikov, ki bodo ustvarjeni -Number of files and directories that will be deleted -Å tevilo datotek in imenikov, ki bodo izbrisani -Number of files that will be overwritten -Å tevilo datotek, ki bodo prepisane -One of the FreeFileSync database entries within the following file is not yet existing: -Eden od FreeFileSync vnosov v podatkovni bazi znotraj naslednje datoteke Å¡e ne obstaja: -One of the FreeFileSync database files is not yet existing: -Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Samo datoteke/imeniki, ki preidejo filtriranje bodo izbrani za sinhronizacijo. Filter bo uveljavljnen k imenu relativno(!) na bazo sinhroniziranih imenikov. -Open with Explorer -Odpri z Raziskovalcem -Open with default application -Odpri s privzeto aplikacijo -Operation aborted! -Operacija prekinjena! -Operation: -Operacija: -Overview -Pregled -Overwriting Symbolic Link %x in %y -Prepisujem SimboliÄno povezavo %x v %y -Overwriting file %x in %y -Prepisujem datoteko %x v %y -Pause -Premor -Paused -Na premoru -Planned directory deletion is in conflict with its subdirectories and -files! -NaÄrtovano brisanje imenika je v sporu z njegovimi podimeniki in -datotekami! -Please run a Compare first before synchronizing! -Prosim najprej zaženite Primerjaj preden sinhronizirate! -Press \"Switch\" to open FreeFileSync GUI mode. -Pritisnite \"Zamenjaj\", da odprete FreeFileSync GUI naÄin. -Processing folder pair: -Obdelujem par map: -Published under the GNU General Public License: -Objavljeno pod licenco GNU General Public: -Question -VpraÅ¡anje -RealtimeSync - Automated Synchronization -RealtimeSync - Avtomatizirana sinhronizacija -RealtimeSync configuration -RealtimeSync nastavitve -Recycle Bin not yet supported for this system! -KoÅ¡ Å¡e ni podprt za ta sistem! -Relative path -Relativna pot -Remove alternate settings -Odstrani nadomestne nastavitve -Remove folder -Odstrani v mapo -Remove folder pair -Odstrani par imenikov -Report translation error -PoroÄaj o napaki prevoda -Reset -Ponastavi -Reset view -Ponastavi pogled -Restore all hidden dialogs? -Obnovim vse skrite pogovore? -Right -Desno -S&ave configuration... -Shr&ani konfiguracijo... -S&witch view -Sp&remeni pogled -Save changes to current configuration? -Shranim spremembe trenutne konfiguracije? -Save current configuration to file -Shrani trenutno konfiguracijo v datoteko -Scanning... -Pregledujem... -Scanning: -Pregledujem: -Select a folder -Izberite mapo -Select alternate synchronization settings -Izberite nadomestne nastavitve sinhronizacije -Select logfile directory: -Izberite imenik za datoteko beleženja: -Select variant: -Izberite varianto: -Select view -Izberite pogled -Set direction: -Nastavi smer: -Setting default synchronization directions: Old files will be overwritten with newer files. -Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami. -Show \"%x\" -Prikaži \"%x\" -Show conflicts -Prikaži spore -Show files that are different -Prikaži datoteke, ki so razliÄne -Show files that are equal -Prikaži datoteke, ki so enake -Show files that are newer on left -Prikaži datoteke, ki so novejÅ¡e na levi -Show files that are newer on right -Prikaži datoteke, ki so novejÅ¡e na desni -Show files that exist on left side only -Prikaži datoteke, ki obstajajo samo na levi -Show files that exist on right side only -Prikaži datoteke, ki obstajajo samo na desni -Show files that will be created on the left side -Prikaži datoteke, ki bodo ustvarjene na levi strani -Show files that will be created on the right side -Prikaži datoteke, ki bodo ustvarjene na desni strani -Show files that will be deleted on the left side -Prikaži datoteke, ki bodo izbrisane na levi strani -Show files that will be deleted on the right side -Prikaži datoteke, ki bodo izbrisane na desni strani -Show files that will be overwritten on left side -Prikaži datoteke, ki bodo prepisane na levi strani -Show files that will be overwritten on right side -Prikaži datoteke, ki bodo prepisane na desni strani -Show files that won't be copied -Prikaži datoteke, ki ne bodo kopirane -Show hidden dialogs -Prikaži skrite pogovore -Show popup -Prikaži pojavno okno -Show popup on errors or warnings -Prikaži pojavno okno pri napakah in opozorilih -Significant difference detected: -Zaznana je važna razlika: -Silent mode -Tihi naÄin -Size -Velikost -Source code written completely in C++ utilizing: -Izvorna koda napisana celotno v C++ z uporabo: -Source directory does not exist anymore: -Izvorni imenik ne obstaja veÄ: -Speed: -Hitrost: -Start -ZaÄni -Start minimized and write status information to a logfile -Zaženi pomanjÅ¡ano in piÅ¡i statusne informacije v datoteko za beleženje -Start synchronization -ZaÄni sinhronizacijo -Statistics -Statistika -Status feedback -Povratne informacije statusa -Stop -Ustavi -Swap sides -Zamenjaj strani -Switching to FreeFileSync GUI mode... -Preklapljam v FreeFileSync GUI naÄin... -Symbolic Link handling -Rokovanje s simboliÄnimi povezavami -Symlinks %x have the same date but a different target! -SimboliÄne povezave %x imajo isti datum, vendar razliÄni cilj! -Synchronization Preview -Predogled sinhronizacije -Synchronization aborted! -Sinhronizacija prekinjena! -Synchronization completed successfully! -Sinhronizacija uspeÅ¡no zakljuÄena! -Synchronization completed with errors! -Sinhronizacija se je konÄala z napakami! -Synchronization settings -Nastavitve sinhronizacije -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape \"temp\". -Synchronize... -Sinhroniziraj... -Synchronizing... -Sinhroniziram... -Target directory already existing! -Ciljni imenik že obstaja! -Target file already existing! -Ciljna datoteka že obstaja! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Ukazna vrstica se izvrÅ¡i vsakiÄ ko:\n- vsi imeniki postanejo dostopni (npr. ob vstavitvi USB kljuÄa)\n- so datoteke znotraj teh imenikov in podimenikov spremenjene -The file does not contain a valid configuration: -Datoteka ne vsebuje veljavne konfiguracije: -The file was not processed by last synchronization! -Datoteka ni bila obdelana z zadnjo sinhronizacijo! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja. -Time -ÄŒas -Time elapsed: -PreteÄen Äas: -Time remaining: -Preostali Äas: -Total amount of data that will be transferred -KoliÄina podatkov, ki bo preneÅ¡ena -Total time: -Celoten Äas: -Transfer file and directory permissions\n(Requires Administrator rights) -Prenesi dovoljenja datotek in imenikov\n(Zahteva pravice skrbnika) -Unable to connect to sourceforge.net! -Ne morem se povezati na sourceforge.net! -Unable to create logfile! -Ne morem ustvariti datoteko za beleženje! -Unresolved conflicts existing! -Obstajajo nereÅ¡eni spori! -Update -> -Posodobi -> -Updating attributes of %x -Posodabljam atribute od %x -Usage: -Uporaba: -Use Recycle Bin -Uporabi KoÅ¡ -Use Recycle Bin when deleting or overwriting files -Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek -User-defined directory for deletion was not specified! -UporabniÅ¡ko-doloÄen imenik za brisanje ni bil naveden! -Variant -RazliÄica -Verifying file %x -Preverjam datoteko %x -Versioning -Ustvarjanje razliÄiÄ -Volume name %x not part of filename %y! -Ime volumna %x ni del imena datoteke %y! -Waiting for missing directories... -ÄŒakam na manjkajoÄe imenike... -Waiting while directory is locked (%x)... -ÄŒakam, medtem ko se zaklepa imenik (%x)... -Warning -Pozor -When the comparison is started with this option set the following decision tree is processed: -Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄitev: -You can ignore conflicts and continue synchronization. -Lahko ignorirate spore in nadaljujete s sinhronizacijo. -You can ignore this error to consider the directory as empty. -To napako z obravnavanjem imenika kot praznega lahko ignorirate. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) ! -different -razliÄni -file exists on both sides -datoteka obstaja na obeh straneh -on one side only -samo na eni strani +<header> + <language name>SlovenÅ¡Äina</language name> + <translator>Matej BadaliÄ</translator> + <locale>sl_SI</locale> + <flag file>slovenia.png</flag file> + <plural forms>4</plural forms> + <plural definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Prikaži v Raziskovalcu</target> +<source>Open with default application</source> +<target>Odpri s privzeto aplikacijo</target> +<source>Browse directory</source> +<target>Brskaj po imeniku</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Avtomatizirana sinhronizacija</target> +<source>Browse</source> +<target>Brskaj</target> +<source>Error resolving symbolic link:</source> +<target>Napaka pri razreÅ¡evanju simboliÄne povezave:</target> +<source>Select alternate synchronization settings</source> +<target>Izberite nadomestne nastavitve sinhronizacije</target> +<source>No filter selected</source> +<target>Noben filter ni izbran</target> +<source>Filter is active</source> +<target>Filterj je aktiven</target> +<source>Clear filter settings</source> +<target>PoÄisti nastavitve filtra</target> +<source>Remove alternate settings</source> +<target>Odstrani nadomestne nastavitve</target> +<source>Create a batch job</source> +<target>Ustvari batch opravilo</target> +<source>Synchronization settings</source> +<target>Nastavitve sinhronizacije</target> +<source>Comparison settings</source> +<target>Nastavitve primerjanja</target> +<source>About</source> +<target>O programu(1)</target> +<source>Error</source> +<target>Napaka</target> +<source>Warning</source> +<target>Pozor</target> +<source>Question</source> +<target>VpraÅ¡anje</target> +<source>Confirm</source> +<target>Potrdi</target> +<source>Configure filter</source> +<target>Konfiguriraj filter</target> +<source>Customize columns</source> +<target>Stolpce prikroji po meri</target> +<source>Global settings</source> +<target>Globalne nastavitve</target> +<source>Synchronization Preview</source> +<target>Predogled sinhronizacije</target> +<source>Find</source> +<target>Najdi</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Bajt</pluralform> +<pluralform>%x Bajta</pluralform> +<pluralform>%x Bajti</pluralform> +<pluralform>%x Bajtov</pluralform> +</target> +<source><Symlink></source> +<target><SimboliÄna povezava></target> +<source><Directory></source> +<target><Imenik></target> +<source>Size</source> +<target>Velikost</target> +<source>Date</source> +<target>Datum</target> +<source>Full path</source> +<target>Polna pot</target> +<source>Filename</source> +<target>Ime datoteke</target> +<source>Relative path</source> +<target>Relativna pot</target> +<source>Directory</source> +<target>Imenik</target> +<source>Extension</source> +<target>RazÅ¡iritev</target> +<source>Comparison Result</source> +<target>Rezultati primerjave</target> +<source>Incompatible synchronization database format:</source> +<target>Nekompatibilen format sinhronizacijske podatkovne baze:</target> +<source>Initial synchronization:</source> +<target>ZaÄetna sinhronizacija:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Eden od FreeFileSync vnosov v podatkovni bazi znotraj naslednje datoteke Å¡e ne obstaja:</target> +<source>Error reading from synchronization database:</source> +<target>Napaka pri branju iz sinhronizacijske podatkovne baze:</target> +<source>An exception occurred!</source> +<target>Zgodila se je napaka!</target> +<source>Error deleting file:</source> +<target>Napaka pri brisanju datoteke:</target> +<source>Error reading file attributes:</source> +<target>Napaka pri branju atributov datoteke:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>ÄŒakam, medtem ko se zaklepa imenik (%x)...</target> +<source>Error setting directory lock:</source> +<target>Napaka pri nastavljanju zaklepanja imenika:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sek</pluralform> +<pluralform>%x sek</pluralform> +<pluralform>%x sek</pluralform> +<pluralform>%x sek</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Usodna napaka</target> +<source>File does not exist:</source> +<target>Datoteka ne obstaja:</target> +<source>Error parsing configuration file:</source> +<target>Napaka pri preverjanju konfiguracijske datoteke:</target> +<source>Error writing file:</source> +<target>Napaka pri pisanju datoteke:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Neveljavna FreeFileSync nastavitvena datoteka!</target> +<source>/sec</source> +<target>/sek</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +<pluralform>%x min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 ura</pluralform> +<pluralform>%x uri</pluralform> +<pluralform>%x ure</pluralform> +<pluralform>%x ur</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 dan</pluralform> +<pluralform>%x dni</pluralform> +<pluralform>%x dni</pluralform> +<pluralform>%x dni</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Shr&ani konfiguracijo...</target> +<source>&Load configuration...</source> +<target>Na&loži konfiguracijo...</target> +<source>&Quit</source> +<target>&Zapri</target> +<source>&File</source> +<target>&Datoteka</target> +<source>&Content</source> +<target>&Vsebina</target> +<source>&About...</source> +<target>&O programu...</target> +<source>&Help</source> +<target>&PomoÄ</target> +<source>Usage:</source> +<target>Uporaba:</target> +<source>1. Select directories to monitor.</source> +<target>1. Izberite imenike za nadziranje</target> +<source>2. Enter a command line.</source> +<target>2. Vnesite ukazno-vrstico.</target> +<source>3. Press 'Start'.</source> +<target>3. Pritisnite 'ZaÄni'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Ukazna vrstica se izvrÅ¡i vsakiÄ ko: +- vsi imeniki postanejo dostopni (npr. ob vstavitvi USB kljuÄa) +- so datoteke znotraj teh imenikov in podimenikov spremenjene +</target> +<source>Directories to watch</source> +<target>Imenika za nadzorovanje</target> +<source>Add folder</source> +<target>Dodaj mapo</target> +<source>Remove folder</source> +<target>Odstrani v mapo</target> +<source>Select a folder</source> +<target>Izberite mapo</target> +<source>Command line</source> +<target>Ukazna vrstica</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minimalen Äas nedejavnosti [sekunde]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>ÄŒas nedejavnosti med zaznavanjem zadnje spremembe in izvrÅ¡itvijo ukazne vrstice v sekundah</target> +<source>Start</source> +<target>ZaÄni</target> +<source>(Build: %x)</source> +<target>(Izgradnja: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync nastavitve</target> +<source>File already exists. Overwrite?</source> +<target>Datoteka že obstaja. PrepiÅ¡em?</target> +<source>&Restore</source> +<target>&Obnovi</target> +<source>&Exit</source> +<target>&Izhod</target> +<source>Monitoring active...</source> +<target>Nadziranje aktivno...</target> +<source>Waiting for missing directories...</source> +<target>ÄŒakam na manjkajoÄe imenike...</target> +<source>Command line is empty!</source> +<target>Ukazna vrstica je prazna!</target> +<source>Could not initialize directory monitoring:</source> +<target>Ne morem zaÄeti nadzorovanja imenikov:</target> +<source>A directory input field is empty.</source> +<target>Vpisno polje za imenik je prazno.</target> +<source>Error when monitoring directories.</source> +<target>Napaka pri nadzorovanju imenikov.</target> +<source>Drag && drop</source> +<target>Povleci && spusti</target> +<source>Conversion error:</source> +<target>Napaka pri pretvorbi:</target> +<source>Error moving file:</source> +<target>Napaka pri premikanju datoteke:</target> +<source>Operation aborted!</source> +<target>Operacija prekinjena!</target> +<source>Target file already existing!</source> +<target>Ciljna datoteka že obstaja!</target> +<source>Error moving directory:</source> +<target>Napaka pri premikanju imenika:</target> +<source>Target directory already existing!</source> +<target>Ciljni imenik že obstaja!</target> +<source>Error deleting directory:</source> +<target>Napaka pri brisanju imenika:</target> +<source>Error changing modification time:</source> +<target>Napaka pri spreminjanju Äasa modifikacije:</target> +<source>Error loading library function:</source> +<target>Napaka pri nalaganju funkcije iz knjižnice:</target> +<source>Error reading security context:</source> +<target>Napaka pri branju varnostne skladnosti:</target> +<source>Error writing security context:</source> +<target>Napaka pri pisanju varnostne skladnosti:</target> +<source>Error copying file permissions:</source> +<target>Napaka pri kopiranju datoteÄnih dovoljenj:</target> +<source>Error creating directory:</source> +<target>Napaka pri ustvarjanju imenika:</target> +<source>Error copying symbolic link:</source> +<target>Napaka pri kopiranju simboliÄnih povezav:</target> +<source>Error copying file:</source> +<target>Napaka pri kopiranju datoteke:</target> +<source>Error opening file:</source> +<target>Napaka pri odpiranju datoteke:</target> +<source>Error reading file:</source> +<target>Napaka pri branju datoteke:</target> +<source>Endless loop when traversing directory:</source> +<target>NeskonÄna zanka pri prehodu imenika:</target> +<source>Error traversing directory:</source> +<target>Napaka pri prehajanju imenika:</target> +<source>Error setting privilege:</source> +<target>Napaka pri nastavljanju privilegija:</target> +<source>Error moving to Recycle Bin:</source> +<target>Napaka pri premikanju v KoÅ¡:</target> +<source>Could not load a required DLL:</source> +<target>Ne morem naložiti zahtevano DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Napaka pri pisanju v sinhronizacijsko podatkovno bazo:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Napaka pri zagonu servisa Volume Shadow Copy!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico.</target> +<source>Could not determine volume name for file:</source> +<target>Ne morem doloÄiti imena volumna za datoteko:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Ime volumna %x ni del imena datoteke %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Ne morem brati vrednosti za naslednja XML vozliÅ¡Äa:</target> +<source>Show popup</source> +<target>Prikaži pojavno okno</target> +<source>Show popup on errors or warnings</source> +<target>Prikaži pojavno okno pri napakah in opozorilih</target> +<source>Ignore errors</source> +<target>Ignoriraj napake</target> +<source>Hide all error and warning messages</source> +<target>Skrij vsa obvestila o napakah in opozorilih</target> +<source>Exit instantly</source> +<target>Zapusti v trenutku</target> +<source>Abort synchronization immediately</source> +<target>Takoj prekini sinhronizacijo</target> +<source>Logging</source> +<target>Beležim</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync batch datoteka</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync konfiguracija</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Batch opravilo</target> +<source>Unable to create logfile!</source> +<target>Ne morem ustvariti datoteko za beleženje!</target> +<source>Batch execution</source> +<target>Batch izvajanje</target> +<source>Log-messages:</source> +<target>SporoÄila beleženja:</target> +<source>Stop</source> +<target>Ustavi</target> +<source>Total time:</source> +<target>Celoten Äas:</target> +<source>Synchronization aborted!</source> +<target>Sinhronizacija prekinjena!</target> +<source>Synchronization completed with errors!</source> +<target>Sinhronizacija se je konÄala z napakami!</target> +<source>Synchronization completed successfully!</source> +<target>Sinhronizacija uspeÅ¡no zakljuÄena!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Pritisnite "Zamenjaj", da odprete FreeFileSync GUI naÄin.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Preklapljam v FreeFileSync GUI naÄin...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Ne morem se povezati na sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Na voljo je nova razliÄica FreeFileSync:</target> +<source>Download now?</source> +<target>Prenesem sedaj?</target> +<source>Information</source> +<target>Informacije</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync je posodobljen!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden?</target> +<source>(Requires an Internet connection!)</source> +<target>(Zahteva povezavo z Internetom!)</target> +<source>1. &Compare</source> +<target>1. &Primerjaj</target> +<source>2. &Synchronize...</source> +<target>2. &Sinhroniziraj...</target> +<source>S&witch view</source> +<target>Sp&remeni pogled</target> +<source>&New</source> +<target>&Novo</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&Jezik</target> +<source>&Global settings...</source> +<target>&Globalne nastavitve...</target> +<source>&Create batch job...</source> +<target>&Ustvari batch opravilo...</target> +<source>&Export file list...</source> +<target>&Izvozi seznam datotek...</target> +<source>&Advanced</source> +<target>&Napredno</target> +<source>&Check for new version</source> +<target>&Preveri za novo razliÄico</target> +<source>Compare</source> +<target>Primerjaj</target> +<source>Compare both sides</source> +<target>Primerjaj obe strani</target> +<source>&Abort</source> +<target>&Prekini</target> +<source>Synchronize...</source> +<target>Sinhroniziraj...</target> +<source>Start synchronization</source> +<target>ZaÄni sinhronizacijo</target> +<source>Swap sides</source> +<target>Zamenjaj strani</target> +<source>Add folder pair</source> +<target>Dodaj par imenikov</target> +<source>Remove folder pair</source> +<target>Odstrani par imenikov</target> +<source>Save current configuration to file</source> +<target>Shrani trenutno konfiguracijo v datoteko</target> +<source>Load configuration from file</source> +<target>Naloži konfiguracijo iz datoteke</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target> +<source>Hide excluded items</source> +<target>Skrij izkljuÄene predmete</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Skrij filtrirane ali zaÄasno izkljuÄene datoteke</target> +<source>Number of files and directories that will be created</source> +<target>Å tevilo datotek in imenikov, ki bodo ustvarjeni</target> +<source>Number of files that will be overwritten</source> +<target>Å tevilo datotek, ki bodo prepisane</target> +<source>Number of files and directories that will be deleted</source> +<target>Å tevilo datotek in imenikov, ki bodo izbrisani</target> +<source>Total amount of data that will be transferred</source> +<target>KoliÄina podatkov, ki bo preneÅ¡ena</target> +<source>Left</source> +<target>Levo</target> +<source>Right</source> +<target>Desno</target> +<source>Batch job</source> +<target>Batch opravilo</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Sestavi batch datoteko za samodejno sinhronizacijo. Da zaÄnete v batch naÄinu, preprosto podajte ime batch datoteke k FreeFileSync izvrÅ¡ilni datoteki: FreeFileSync.exe <imedatotekebatch>. To se lahko nastavi tudi v urniku opravil vaÅ¡ega operacijskega sistema.</target> +<source>Help</source> +<target>PomoÄ</target> +<source>Configuration overview:</source> +<target>Pregled konfiguracije:</target> +<source>Filter files</source> +<target>Filtriraj datoteke</target> +<source>Status feedback</source> +<target>Povratne informacije statusa</target> +<source>Silent mode</source> +<target>Tihi naÄin</target> +<source>Start minimized and write status information to a logfile</source> +<target>Zaženi pomanjÅ¡ano in piÅ¡i statusne informacije v datoteko za beleženje</target> +<source>Error handling</source> +<target>Napaka pri obravnavanju</target> +<source>Overview</source> +<target>Pregled</target> +<source>Select logfile directory:</source> +<target>Izberite imenik za datoteko beleženja:</target> +<source>Maximum number of logfiles:</source> +<target>Maksimalno Å¡tevilo datotek beleženja:</target> +<source>&Save</source> +<target>&Shrani</target> +<source>&Load</source> +<target>&Naloži</target> +<source>&Cancel</source> +<target>&PrekliÄi</target> +<source>Elements found:</source> +<target>Najdenih elementov:</target> +<source>Elements remaining:</source> +<target>Preostalih elementov:</target> +<source>Speed:</source> +<target>Hitrost:</target> +<source>Time remaining:</source> +<target>Preostali Äas:</target> +<source>Time elapsed:</source> +<target>PreteÄen Äas:</target> +<source>Operation:</source> +<target>Operacija:</target> +<source>Select variant:</source> +<target>Izberite varianto:</target> +<source><Automatic></source> +<target><Samodejno></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Prepoznaj in Å¡iri spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno.</target> +<source>Mirror ->></source> +<target>Zrcalno ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natanÄno ujemala z levo mapo po sinhronizaciji.</target> +<source>Update -></source> +<target>Posodobi -></target> +<source>Copy new or updated files to right folder.</source> +<target>Kopiraj nove ali posodobljene datoteke v desno mapo.</target> +<source>Custom</source> +<target>Po meri</target> +<source>Configure your own synchronization rules.</source> +<target>Konfigurirajte vaÅ¡a lastna sinhronizacijska pravila.</target> +<source>Deletion handling</source> +<target>Ravnanje pri brisanju</target> +<source>&OK</source> +<target>&V redu</target> +<source>Configuration</source> +<target>Konfiguracija</target> +<source>Category</source> +<target>Kategorija</target> +<source>Action</source> +<target>Ukrep</target> +<source>Files/folders that exist on left side only</source> +<target>Datoteke/mape, ki obstajajo samo na levi strani</target> +<source>Files/folders that exist on right side only</source> +<target>Datoteke/mape, ki obstajajo samo na desni strani</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Datoteke, ki obstajajo na obeh straneh, leva je novejÅ¡a</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Datoteke, ki obstajajo na obeh straneh, desna je novejÅ¡a</target> +<source>Files that have different content</source> +<target>Datoteke, ki imajo razliÄno vsebino</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Prisotni so spori/datoteke, ki ne morejo biti kategorizirani</target> +<source>Compare by...</source> +<target>Primerjaj po...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Datoteki sta enaki, Äe so + - velikost datoteke + - zadnji Äas spremembe in datum +enaki +</target> +<source>File size and date</source> +<target>Velikosti in datumu datoteke</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Datoteki sta enaki, Äe + - je vsebina datoteke +enaka +</target> +<source>File content</source> +<target>Vsebini datoteke</target> +<source>Symbolic Link handling</source> +<target>Rokovanje s simboliÄnimi povezavami</target> +<source>Synchronizing...</source> +<target>Sinhroniziram...</target> +<source>Elements processed:</source> +<target>Obdelanih elementov:</target> +<source>&Pause</source> +<target>&Premor</target> +<source>Compare by "File size and date"</source> +<target>Primerjaj po "Datumu in velikosti"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄitev:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Kot rezultat so datoteke razdeljene v naslednje kategorije:</target> +<source>- equal</source> +<target>- enaki</target> +<source>- left newer</source> +<target>- leva novejÅ¡a</target> +<source>- right newer</source> +<target>- desna novejÅ¡a</target> +<source>- exists left only</source> +<target>- obstaja samo na levi</target> +<source>- exists right only</source> +<target>- obstaja samo na desni</target> +<source>- conflict (same date, different size)</source> +<target>- spor (isti datum, razliÄna velikost)</target> +<source>Compare by "File content"</source> +<target>Primerjaj po "Vsebini datotek"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Kot že samo ime pove, sta dve datoteki oznaÄeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se Äasi datotek ne upoÅ¡tevajo. + +Z omogoÄeno to možnostjo je drevo odloÄanja manjÅ¡e: +</target> +<source>- different</source> +<target>- razliÄni</target> +<source>Source code written in C++ utilizing:</source> +<target>Izvorna koda napisana v C++ z uporabo:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Zahvale za prevod FreeFileSync gredo:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Povratne informacije in predlogi so dobrodoÅ¡li na:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync na Sourceforge</target> +<source>Homepage</source> +<target>DomaÄa stran</target> +<source>If you like FFS</source> +<target>ÄŒe vam je FFS vÅ¡eÄ</target> +<source>Donate with PayPal</source> +<target>Doniraj s PayPal</target> +<source>Email</source> +<target>Email</target> +<source>Report translation error</source> +<target>PoroÄaj o napaki prevoda</target> +<source>Published under the GNU General Public License:</source> +<target>Objavljeno pod licenco GNU General Public:</target> +<source>Ignore subsequent errors</source> +<target>Ignoriraj vse nadaljnje napake</target> +<source>Hide further error messages during the current process</source> +<target>Skrijte nadaljnja obvestila o napakah med trenutnim procesom</target> +<source>&Ignore</source> +<target>&Ignoriraj</target> +<source>&Retry</source> +<target>&Ponovi</target> +<source>Do not show this dialog again</source> +<target>Ne prikaži veÄ tega pogovornega okna</target> +<source>&Switch</source> +<target>&Zamenjaj</target> +<source>&Yes</source> +<target>&Da</target> +<source>&No</source> +<target>&Ne</target> +<source>Delete on both sides</source> +<target>IzbriÅ¡i na obeh straneh</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani</target> +<source>Use Recycle Bin</source> +<target>Uporabi KoÅ¡</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Samo datoteke/imeniki, ki ustrezajo vsem nastavitvam filtra bodo izbrani za sinhronizacjo. +Opomba: Ime filtra mora biti doloÄen relativno(!) glede na glavne sinhronizacijske imenike. +</target> +<source>Hints:</source> +<target>Namigi:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Vnesite relativna imena datotek ali imenikov loÄenih s ';' ali novo vrstico.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Uporabite lahko tudi znake '*' in '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. IzkljuÄite datoteke neposredno na glavni mreži s kontekstnim menujem.</target> +<source>Example</source> +<target>Primer</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +VkljuÄi: *.doc;*.zip;*.exe +IzkljuÄi: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape "temp".</target> +<source>Include</source> +<target>VkljuÄi</target> +<source>Exclude</source> +<target>IzkljuÄi</target> +<source>Select time span:</source> +<target>Izberite Äasovno obdobje:</target> +<source>Minimum file size:</source> +<target>Minimalna velikost datoteke:</target> +<source>Maximum file size:</source> +<target>Maksimalna velikost datoteke:</target> +<source>&Default</source> +<target>&Privzeto</target> +<source>Move column up</source> +<target>Premakni stolpec gor</target> +<source>Move column down</source> +<target>Premakni stolpec dol</target> +<source>Copy locked files</source> +<target>Kopiraj zaklenjene datoteke</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Shadow Copy +(Zahteva pravice skrbnika) +</target> +<source>Copy filesystem permissions</source> +<target>Kopiraj dovoljenja datoteÄnega sistema</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Prenesi dovoljenja datotek in imenikov +(Zahteva pravice skrbnika) +</target> +<source>Hidden dialogs:</source> +<target>Skriti pogovori:</target> +<source>Reset</source> +<target>Ponastavi</target> +<source>Show hidden dialogs</source> +<target>Prikaži skrite pogovore</target> +<source>External applications</source> +<target>Zunanje aplikacije</target> +<source>Description</source> +<target>Opis</target> +<source>Variant</source> +<target>RazliÄica</target> +<source>Statistics</source> +<target>Statistika</target> +<source>Find what:</source> +<target>Najdi kaj</target> +<source>Match case</source> +<target>Ujemaj se s primerom</target> +<source>&Find next</source> +<target>&Najdi naslednje</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) !</target> +<source>Batch file created successfully!</source> +<target>Datoteka batch je bila uspeÅ¡no ustvarjena!</target> +<source>Main bar</source> +<target>Glavna vrstica</target> +<source>Folder pairs</source> +<target>Pari map</target> +<source>Select view</source> +<target>Izberite pogled</target> +<source>Folder Comparison and Synchronization</source> +<target>Primerjava in sinhronizacija imenika</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>KoÅ¡ Å¡e ni podprt za ta sistem!</target> +<source>Set direction:</source> +<target>Nastavi smer:</target> +<source>Exclude temporarily</source> +<target>ZaÄasno izkljuÄi</target> +<source>Include temporarily</source> +<target>Trenutno vkljuÄi</target> +<source>Exclude via filter:</source> +<target>IzkljuÄi preko filtra:</target> +<source><multiple selection></source> +<target><mnogokratna izbira></target> +<source>D-Click</source> +<target>D-Klik</target> +<source>Copy to clipboard CTRL+C</source> +<target>Kopiraj v odložiÅ¡Äe CTRL+C</target> +<source>Delete files DEL</source> +<target>IzbriÅ¡i datoteke DEL</target> +<source>Customize...</source> +<target>Prilagodi...</target> +<source>Auto-adjust columns</source> +<target>Samo-prilagodi stolpce</target> +<source>Include all rows</source> +<target>VkljuÄi se vrstice</target> +<source>Exclude all rows</source> +<target>IzkljuÄi vse vrstice</target> +<source>Reset view</source> +<target>Ponastavi pogled</target> +<source>Show "%x"</source> +<target>Prikaži "%x"</target> +<source><Last session></source> +<target><Zadnja seja></target> +<source>Configuration saved!</source> +<target>Konfiguracija shranjena!</target> +<source>Save changes to current configuration?</source> +<target>Shranim spremembe trenutne konfiguracije?</target> +<source>Configuration loaded!</source> +<target>Konfiguracija naložena!</target> +<source>Hide files that exist on left side only</source> +<target>Skrij datoteke, ki obstajajo samo na levi strani</target> +<source>Show files that exist on left side only</source> +<target>Prikaži datoteke, ki obstajajo samo na levi</target> +<source>Hide files that exist on right side only</source> +<target>Skrij datoteke, ki obstajajo samo na desni strani</target> +<source>Show files that exist on right side only</source> +<target>Prikaži datoteke, ki obstajajo samo na desni</target> +<source>Hide files that are newer on left</source> +<target>Skrij najnovejÅ¡e datoteke na levi</target> +<source>Show files that are newer on left</source> +<target>Prikaži datoteke, ki so novejÅ¡e na levi</target> +<source>Hide files that are newer on right</source> +<target>Skrij najnovejÅ¡e datoteke na desni</target> +<source>Show files that are newer on right</source> +<target>Prikaži datoteke, ki so novejÅ¡e na desni</target> +<source>Hide files that are equal</source> +<target>Skrij enake datoteke</target> +<source>Show files that are equal</source> +<target>Prikaži datoteke, ki so enake</target> +<source>Hide files that are different</source> +<target>Skrij datoteke ki so razliÄne</target> +<source>Show files that are different</source> +<target>Prikaži datoteke, ki so razliÄne</target> +<source>Hide conflicts</source> +<target>Skrij spore</target> +<source>Show conflicts</source> +<target>Prikaži spore</target> +<source>Hide files that will be created on the left side</source> +<target>Skrij datoteke, ki bodo ustvarjene na levi strani</target> +<source>Show files that will be created on the left side</source> +<target>Prikaži datoteke, ki bodo ustvarjene na levi strani</target> +<source>Hide files that will be created on the right side</source> +<target>Skrij datoteke, ki bodo ustvarjene na desni strani</target> +<source>Show files that will be created on the right side</source> +<target>Prikaži datoteke, ki bodo ustvarjene na desni strani</target> +<source>Hide files that will be deleted on the left side</source> +<target>Skrij datoteke, ki bodo izbrisane na levi strani</target> +<source>Show files that will be deleted on the left side</source> +<target>Prikaži datoteke, ki bodo izbrisane na levi strani</target> +<source>Hide files that will be deleted on the right side</source> +<target>Skrij datoteke, ki bodo izbrisane na desni strani</target> +<source>Show files that will be deleted on the right side</source> +<target>Prikaži datoteke, ki bodo izbrisane na desni strani</target> +<source>Hide files that will be overwritten on left side</source> +<target>Skrij datoteke, ki bodo prepisane na levi strani</target> +<source>Show files that will be overwritten on left side</source> +<target>Prikaži datoteke, ki bodo prepisane na levi strani</target> +<source>Hide files that will be overwritten on right side</source> +<target>Skrij datoteke, ki bodo prepisane na desni strani</target> +<source>Show files that will be overwritten on right side</source> +<target>Prikaži datoteke, ki bodo prepisane na desni strani</target> +<source>Hide files that won't be copied</source> +<target>Skrij datoteke, ki ne bodo kopirane</target> +<source>Show files that won't be copied</source> +<target>Prikaži datoteke, ki ne bodo kopirane</target> +<source>All directories in sync!</source> +<target>Vsi imeniki so sinhronizirani!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Prosim najprej zaženite Primerjaj preden sinhronizirate!</target> +<source>Comma separated list</source> +<target>Seznam loÄen z vejico</target> +<source>Legend</source> +<target>Legenda</target> +<source>File list exported!</source> +<target>Seznam datotek je bil izvožen!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Objekt uspeÅ¡no izbrisan!</pluralform> +<pluralform>%x objekta uspeÅ¡no izbrisana!</pluralform> +<pluralform>%x objekti uspeÅ¡no izbrisani!</pluralform> +<pluralform>%x objektov uspeÅ¡no izbrisanih!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 imenik</pluralform> +<pluralform>%x imenika</pluralform> +<pluralform>%x imeniki</pluralform> +<pluralform>%x imenikov</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 datoteka</pluralform> +<pluralform>%x datoteki</pluralform> +<pluralform>%x datoteke</pluralform> +<pluralform>%x datotek</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x od 1 vrstice v prikazu</pluralform> +<pluralform>%x od %y vrstic v prikazu</pluralform> +<pluralform>%x od %y vrstic v prikazu</pluralform> +<pluralform>%x od %y vrstic v prikazu</pluralform> +</target> +<source>Scanning...</source> +<target>Pregledujem...</target> +<source>Comparing content...</source> +<target>Primerjam vsebino...</target> +<source>Paused</source> +<target>Na premoru</target> +<source>Aborted</source> +<target>Prekinitev uspela</target> +<source>Completed</source> +<target>ZakljuÄeno</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Zahtevana je bila prekinitev: Äakam, da se zakljuÄi trenutna operacija...</target> +<source>Continue</source> +<target>Nadaljuj</target> +<source>Pause</source> +<target>Premor</target> +<source>Cannot find %x</source> +<target>Ne najdem %x</target> +<source>DECISION TREE</source> +<target>DREVO ODLOÄŒITEV</target> +<source>file exists on both sides</source> +<target>datoteka obstaja na obeh straneh</target> +<source>on one side only</source> +<target>samo na eni strani</target> +<source>different</source> +<target>razliÄni</target> +<source>Inactive</source> +<target>Neaktivno</target> +<source>Second</source> +<target>Sekunda</target> +<source>Minute</source> +<target>Minuta</target> +<source>Hour</source> +<target>Ura</target> +<source>Day</source> +<target>Dan</target> +<source>Byte</source> +<target>Bajt</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtriraj: Vse pare</target> +<source>Filter: Single pair</source> +<target>Filtriraj: En sam par</target> +<source>Ignore</source> +<target>Ignoriraj</target> +<source>Direct</source> +<target>Neposredno</target> +<source>Follow</source> +<target>Sledi</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri:</target> +<source>- full file or directory name</source> +<target>- polno ime datoteke ali imenika</target> +<source>- directory part only</source> +<target>- del, ki zajema samo imenike</target> +<source>- Other side's counterpart to %name</source> +<target>- Duplikat z druge strani od %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Duplikat z druge strani od %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Obnovim vse skrite pogovore?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Ali resniÄno želite premakniti naslednji objekt v KoÅ¡?</pluralform> +<pluralform>Ali resniÄno želite premakniti naslednja %x objekta v KoÅ¡?</pluralform> +<pluralform>Ali resniÄno želite premakniti naslednje %x objekte v KoÅ¡?</pluralform> +<pluralform>Ali resniÄno želite premakniti naslednjih %x objektov v KoÅ¡?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Ali resniÄno želite izbrisati naslednji objekt?</pluralform> +<pluralform>Ali resniÄno želite izbrisati naslednja %x objekta?</pluralform> +<pluralform>Ali resniÄno želite izbrisati naslednje %x objekte?</pluralform> +<pluralform>Ali resniÄno želite izbrisati naslednjih %x objektov?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Pusti kot nereÅ¡eni spor</target> +<source>Delete permanently</source> +<target>Trajno izbriÅ¡i</target> +<source>Delete or overwrite files permanently</source> +<target>Trajno izbriÅ¡i ali prepiÅ¡i datoteke</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek</target> +<source>Versioning</source> +<target>Ustvarjanje razliÄiÄ</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Premakni datoteke v Äasovno-oznaÄen podimenik</target> +<source>Cannot determine sync-direction:</source> +<target>Ne morem doloÄiti sinhronizacijske smeri.</target> +<source>Filter settings have changed!</source> +<target>Nastavitve filtra so bile spremenjene!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Obe strani sta se spremenili od zadnje sinhronizacije!</target> +<source>No change since last synchronization!</source> +<target>Ni sprememb od zadnje sinhronizacije!</target> +<source>The file was not processed by last synchronization!</source> +<target>Datoteka ni bila obdelana z zadnjo sinhronizacijo!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>NaÄrtovano brisanje imenika je v sporu z njegovimi podimeniki in -datotekami!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami.</target> +<source>The file does not contain a valid configuration:</source> +<target>Datoteka ne vsebuje veljavne konfiguracije:</target> +<source>Scanning:</source> +<target>Pregledujem:</target> +<source>Encoding extended time information: %x</source> +<target>Podrobne informacije o Äasu enkodiranja: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>To napako z obravnavanjem imenika kot praznega lahko ignorirate.</target> +<source>Directory does not exist:</source> +<target>Imenik ne obstaja:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:</target> +<source>Comparing content of files %x</source> +<target>Primerjam vsebino datotek %x</target> +<source>Memory allocation failed!</source> +<target>NeuspeÅ¡no dodeljevanje pomnilnika!</target> +<source>File %x has an invalid date!</source> +<target>Datoteka %x ima neveljaven datum!</target> +<source>Conflict detected:</source> +<target>Zaznan spor:</target> +<source>Files %x have the same date but a different size!</source> +<target>Datoteki %x imata enak datum ampak razliÄno velikost!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>SimboliÄne povezave %x imajo isti datum, vendar razliÄni cilj!</target> +<source>Comparing files by content failed.</source> +<target>Primerjava datotek po vsebini ni uspela.</target> +<source>Generating file list...</source> +<target>Ustvarjam seznam datotek...</target> +<source>Multiple...</source> +<target>VeÄkratno...</target> +<source>Files that are equal on both sides</source> +<target>Datoteki, ki sta enaki na obeh straneh</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Enake datoteke/mape, ki se razlikujejo samo v atributih</target> +<source>Copy from right to left</source> +<target>Kopiraj iz desne na levo</target> +<source>Copy from left to right</source> +<target>Kopiraj iz leve na desno</target> +<source>Delete files/folders existing on left side only</source> +<target>IzbriÅ¡i datoteke/mape, ki obstajajo samo na levi strani</target> +<source>Delete files/folders existing on right side only</source> +<target>IzbriÅ¡i datoteke/mape, ki obstajajo samo na desni strani</target> +<source>Copy from right to left overwriting</source> +<target>Kopiraj iz desne na levo s prepisovanjem</target> +<source>Copy from left to right overwriting</source> +<target>Kopiraj iz leve na desno s prepisovanjem</target> +<source>Do nothing</source> +<target>Ne naredi niÄesar</target> +<source>Copy attributes only from right to left</source> +<target>Kopiraj atribute samo iz desne na levo</target> +<source>Copy attributes only from left to right</source> +<target>Kopiraj atribute samo iz leve na desno</target> +<source>Deleting file %x</source> +<target>Brisanje datoteke %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Brisanje simboliÄne povezave %x</target> +<source>Deleting folder %x</source> +<target>Brisanje mape %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Premikam %x v KoÅ¡</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Premikam datoteko %x v uporabniÅ¡ko-doloÄen imenik %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Premikam mapo %x v uporabniÅ¡ko-doloÄen imenik %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Premikam simboliÄno povezavo %x v uporabniÅ¡ko doloÄen imenik %y</target> +<source>Copying new file %x to %y</source> +<target>Kopiram novo datoteko %x v %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopiram novo SimboliÄno povezavo %x v %y</target> +<source>Overwriting file %x in %y</source> +<target>Prepisujem datoteko %x v %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Prepisujem SimboliÄno povezavo %x v %y</target> +<source>Creating folder %x</source> +<target>Ustvarjam mapo %x</target> +<source>Verifying file %x</source> +<target>Preverjam datoteko %x</target> +<source>Updating attributes of %x</source> +<target>Posodabljam atribute od %x</target> +<source>Source directory does not exist anymore:</source> +<target>Izvorni imenik ne obstaja veÄ:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Po trenutni konfiguraciji ni niÄ za sinhronizirati!</target> +<source>Target directory name must not be empty!</source> +<target>Ime ciljnega imenika ne sme biti prazno!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>UporabniÅ¡ko-doloÄen imenik za brisanje ni bil naveden!</target> +<source>Unresolved conflicts existing!</source> +<target>Obstajajo nereÅ¡eni spori!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Lahko ignorirate spore in nadaljujete s sinhronizacijo.</target> +<source>Significant difference detected:</source> +<target>Zaznana je važna razlika:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>VeÄ kot 50% od celotnega Å¡tevila datotek bo kopiranih ali izbrisanih!</target> +<source>Not enough free disk space available in:</source> +<target>Na voljo ni dovolj prostega prostora na disku v:</target> +<source>Free disk space required:</source> +<target>Potreben prostor na disku:</target> +<source>Free disk space available:</source> +<target>Prosti disk, ki je na voljo:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Imenik bo spremenjen, kar je del veÄkratnih parov map! Prosimo preglejte nastavitve sinhronizacije!</target> +<source>Processing folder pair:</source> +<target>Obdelujem par map:</target> +<source>Generating database...</source> +<target>Ustvarjam podatkovno bazo...</target> +<source>Error copying locked file %x!</source> +<target>Napaka pri kopiranju zaklenjene datoteke %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata razliÄno vsebino!</target> diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index 9d40c389..99c1a5fd 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -1,910 +1,1049 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objetos borrados satisfactoriamente -%x Bytes -%x Bytes -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dia(s) -%x directories -%x directorios -%x files -%x archivos -%x hour(s) -%x hora(s) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x de %y filas en vista -%x of 1 row in view -%x de 1 fila en vista -%x sec -%x seg -%x% -%x% -&Abort -&Abortar -&About... -&Acerca de... -&Advanced -&Avanzado -&Cancel -&Cancelar -&Check for new version -&Comprobar si existe una nueva versión -&Content -&Contenido -&Create batch job... -&Crear tarea batch... -&Default -&Configuración por defecto -&Exit -&Salir -&Export file list... -&Exportar lista de archivos... -&File -&Archivo -&Find next -&Buscar siguiente -&Global settings... -&Opciones globales... -&Help -&Ayuda -&Ignore -&Ignorar -&Language -&Idioma -&Load -&Cargar -&Load configuration... -&Cargar configuración... -&New -&Nuevo -&No -&No -&OK -&OK -&Pause -&Pausa -&Program -&Programa -&Quit -&Salir -&Restore -&Restaurar -&Retry -&Reintentar -&Save -&Guardar -&Switch -&Cambiar -&Yes -&Si -(Build: %x) -(Completado: %x) -(Requires an Internet connection!) -(¡Conexión a Internet necesaria!) -- Other side's counterpart to %dir -- El otro lado equivale a %dir -- Other side's counterpart to %name -- El otro lado equivale a %name -- conflict -- conflicto -- conflict (same date, different size) -- conflicto (misma fecha, diferente tamaño) -- different -- diferentes -- directory part only -- sólo parte del directorio -- equal -- iguales -- exists left only -- existe sólo en la izquierda -- exists right only -- existe sólo en la derecha -- full file or directory name -- nombre completo del archivo o directorio -- left -- izquierda -- left newer -- más reciente en la izquierda -- right -- derecha -- right newer -- más reciente en la derecha -/sec -/seg -1 directory -1 directorio -1 file -1 archivo -1. &Compare -1. &Comparar -1. Enter relative file or directory names separated by ';' or a new line. -1. Introduzca los nombres de los archivos o directorios relativos separados por ';' o una nueva lÃnea. -1. Select directories to monitor. -1. Seleccione los directorios a visualizar. -2. &Synchronize... -2. &Sincronizar... -2. Enter a command line. -2. Introduzca una lÃnea de comandos. -2. Use wildcard characters '*' and '?'. -2. Usar caracteres comodÃn '*' y '?'. -3. Exclude files directly on main grid via context menu. -3. Excluir directamente archivos sobre las celdas a través del menú de contexto. -3. Press 'Start'. -3. Presione 'Inicio'. -<Automatic> -<Automático> -<Directory> -<Directorio> -<Last session> -<Última sesión> -<Symlink> -<Enlace simbólico> -<multiple selection> -<selección múltiple> -A directory input field is empty. -Un campo de directorio está vacÃo. -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Un directorio será modificado, el cual es parte de mútiples pares de carpetas. ¡Por favor, revise la configuración de la sincronización! -A newer version of FreeFileSync is available: -Una nueva versión de FreeFileSync está disponible: -Abort requested: Waiting for current operation to finish... -Solicitud de aborto: Esperando a que la operación actual finalice... -Abort synchronization immediately -Abortar sincronización inmediatamente -Aborted -Abortado -About -Acerca de -Action -Acción -Add folder -Añadir carpeta -Add folder pair -Añadir un par de carpetas -All directories in sync! -¡Todos los directorios en sincronización! -An exception occurred! -¡Ha ocurrido una excepción! -As a result the files are separated into the following categories: -Como resultado, los archivos están separados en las siguientes categorÃas: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Como el tÃtulo sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de copia de seguridad. Por lo tanto, las fechas de los archivos no se tienen en cuenta.\n\nCon esta opción habilitada el árbol de decisiones se reduce a: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el administrador de tareas de su sistema operativo. -At least one directory input field is empty. -Almenos un campo de entrada del directorio está vacÃo. -Auto-adjust columns -Ajustar automáticamente las columnas -Batch execution -Ejecución batch -Batch file created successfully! -¡El archivo batch ha sido creado correctamente! -Batch job -Tarea batch -Big thanks for localizing FreeFileSync goes out to: -Agradecimientos por la traducción de FreeFileSync a: -Both sides have changed since last synchronization! -¡Ambos lados han cambiado desde la última sincronizacion! -Browse -Examinar -Browse directory -Examinar directorio -Cannot determine sync-direction: -No se puede determinar la dirección de la sincronización: -Cannot find %x -No se puede encontrar %x -Category -CategorÃa -Clear filter settings -Limpiar opciones del filtrado -Comma separated list -Lista separada por comas -Command line -LÃnea de comandos -Command line is empty! -¡La lÃnea de comandos está vacÃa! -Compare -Comparar -Compare both sides -Comparar ambos lados -Compare by \"File content\" -Comparar por \"Contenido del archivo\" -Compare by \"File size and date\" -Comparar por \"Tamaño y fecha del archivo\" -Compare by... -Comparar por... -Comparing content of files %x -Comparación del contenido de los archivos %x -Comparing content... -Comparando contenido... -Comparing files by content failed. -La comparación de archivos por el contenido ha fallado. -Comparison Result -Resultado de la comparación -Comparison settings -Opciones de comparación -Completed -Terminado -Configuration -Configuración -Configuration loaded! -¡Configuración cargada! -Configuration overview: -Visión global de la configuración: -Configuration saved! -¡Configuración guardada! -Configure filter -Configurar filtro -Configure your own synchronization rules. -Configuración de sus propias reglas de sincronización. -Confirm -Confirmar -Conflict detected: -Conflicto detectado: -Conflicts/files that cannot be categorized -Conflictos/archivos que no pueden ser clasificados -Continue -Continuar -Conversion error: -Error de conversión: -Copy attributes only from left to right -Copiar sólo atributos de izquierda a derecha -Copy attributes only from right to left -Copiar sólo atributos de izquierda a derecha -Copy filesystem permissions -Permisos de copia del sistema de ficheros -Copy from left to right -Copiar de izquierda a derecha -Copy from left to right overwriting -Copiar de izquierda a derecha con sobreescritura -Copy from right to left -Copiar de derecha a izquierda -Copy from right to left overwriting -Copiar de derecha a izquierda con sobreescritura -Copy locked files -Copiar archivos bloqueados -Copy new or updated files to right folder. -Copiar archivos nuevos o actualizados a la carpeta de la derecha. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy"\n(Requiere derechos de administrador) -Copy to clipboard\tCTRL+C -Copiar al Portapapeles\tCTRL+C -Copying new Symbolic Link %x to %y -Copiando enlace simbólico nuevo de %x a %y -Copying new file %x to %y -Copiando archivo nuevo de %x a %y -Could not determine volume name for file: -No se ha podido determinar el nombre del volumen para el archivo: -Could not initialize directory monitoring: -No se ha podido inicializar la visualización de directorios: -Could not load a required DLL: -No se ha podido cargar el DLL solicitado: -Could not read values for the following XML nodes: -No se ha podido leer los valores para los siguientes nodos XML: -Create a batch job -Crear una tarea batch -Creating folder %x -Creando carpeta %x -Custom -Personalizado -Customize columns -Personalizar columnas -Customize... -Personalizar... -D-Click -Doble click -DECISION TREE -ÃRBOL DE DECISIÓN -Data verification error: Source and target file have different content! -Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente! -Date -Fecha -Delete files/folders existing on left side only -Borrar sólo archivos/carpetas existentes en el lado izquierdo -Delete files/folders existing on right side only -Borrar sólo archivos/carpetas existentes en el lado derecho -Delete files\tDEL -Borrar archivos\tDEL -Delete on both sides -Borrar en ambos lados -Delete on both sides even if the file is selected on one side only -Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado -Delete or overwrite files permanently -Borrar o sobreescribir archivos permanentemente -Delete permanently -Borrar permanentemente -Deleting Symbolic Link %x -Eliminando enlace simbólico %x -Deleting file %x -Borrar archivo %x -Deleting folder %x -Borrar carpeta %x -Deletion handling -Gestión de borrado -Description -Descripción -Direct -Enviar -Directories are dependent! Be careful when setting up synchronization rules: -¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización: -Directories to watch -Directorios a visualizar -Directory -Directorio -Directory does not exist: -El directorio no existe: -Do not show this dialog again -No volver a mostrar este diálogo -Do nothing -No hacer nada -Do you really want to delete the following object(s)? -¿Está seguro de querer borrar el/los siguiente(s) elemento(s)? -Do you really want to move the following object(s) to the Recycle Bin? -¿Está seguro de querer mover el/los siguiente(s) elemento(s) a la Papelera de Reciclaje? -Do you want FreeFileSync to automatically check for updates every week? -¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana? -Donate with PayPal -Donar a través de PayPal -Download now? -¿Descargar ahora? -Drag && drop -Arrastrar y soltar -Elements found: -Elementos encontrados: -Elements processed: -Elementos procesados: -Elements remaining: -Elementos restantes: -Email -Correo electrónico -Encoding extended time information: %x -Información temporal extendida de la codificación: %x -Endless loop when traversing directory: -Bucle infinito al buscar en el directorio: -Equal files/folders that differ in attributes only -Archivos/Carpetas iguales que sólo difieren en los atributos -Error -Error -Error changing modification time: -Error al cambiar hora de modificación: -Error copying file permissions: -Error al copiar permisos del fichero: -Error copying file: -Error al copiar archivo: -Error copying locked file %x! -¡Error al copiar archivo bloqueado %x! -Error copying symbolic link: -Error al copiar enlace simbólico: -Error creating directory: -Error al crear directorio: -Error deleting directory: -Error al borrar directorio: -Error deleting file: -Error al borrar archivo: -Error handling -Gestión de errores -Error loading library function: -Error al cargar la función de biblioteca: -Error moving directory: -Error al mover directorio: -Error moving file: -Error al mover archivo: -Error moving to Recycle Bin: -Error al mover a la Papelera de Reciclaje: -Error opening file: -Error al abrir archivo: -Error parsing configuration file: -Error al analizar el archivo de configuración: -Error reading file attributes: -Error al leer atributos del archivo: -Error reading file: -Error al leer archivo: -Error reading from synchronization database: -Error al leer de la base de datos de sincronización: -Error reading security context: -Error al leer en contexto de seguridad: -Error resolving symbolic link: -Error al resolver enlace simbólico: -Error setting directory lock: -Error al establecer bloqueo del directorio: -Error setting privilege: -Error al establecer privilegios: -Error starting Volume Shadow Copy Service! -¡Error al iniciar el servicio "Volume Shadow Copy"! -Error traversing directory: -Error al buscar en el directorio: -Error when monitoring directories. -Error al visualizar los directorios. -Error writing file: -Error al escribir archivo: -Error writing security context: -Error al escribir en contexto de seguridad: -Error writing to synchronization database: -Error al escribir en la base de datos de sincronización: -Example -Ejemplo -Exclude -Excluir -Exclude all rows -Excluir todas las columnas -Exclude temporarily -Excluir temporalmente -Exclude via filter: -Excluir a través del filtro: -Exit instantly -Salir inmediatamente -Extension -Extensión -External applications -Aplicaciones externas -Fatal Error -Error fatal -Feedback and suggestions are welcome at: -Comentarios y sugerencias son bienvenidos en: -File %x has an invalid date! -¡El archivo %x tiene una fecha inválida! -File already exists. Overwrite? -El archivo ya existe. ¿Quiere sobreescribirlo? -File content -Contenido del archivo -File does not exist: -El archivo no existe: -File list exported! -¡Lista de archivos exportada! -File size and date -Fecha y tamaño del archivo -Filename -Nombre del archivo -Files %x have the same date but a different size! -¡Los archivos %x tienen la misma fecha pero un tamaño diferente! -Files are found equal if\n - file content\nis the same -Los archivos serán considerados iguales si\n - el contenido del archivo\nes el mismo -Files are found equal if\n - filesize\n - last write time and date\nare the same -Los archivos serán considerados iguales si\n - tamaño del archivo\n - la hora y fecha de la última escritura\nson iguales -Files that are equal on both sides -Archivos que son iguales en ambos lados -Files that exist on both sides, left one is newer -Archivos que existen en ambos lados, el de la izquierda es más reciente -Files that exist on both sides, right one is newer -Archivos que existen en ambos lados, el de la derecha es más reciente -Files that have different content -Archivos que tienen un contenido diferente -Files/folders that exist on left side only -Archivos/carpetas que existen sólo en el lado izquierdo -Files/folders that exist on right side only -Archivos/carpetas que existen sólo en el lado derecho -Filter files -Filtrar archivos -Filter is active -Filtro activo -Filter settings have changed! -¡Las opciones de filtrado han cambiado! -Filter: All pairs -Filtro: Todos los pares -Filter: Single pair -Filtro: Sólo un par -Find -Buscar -Find what: -Buscar: -Folder Comparison and Synchronization -Comparación y Sincronización de Carpetas -Folder pairs -Pares de carpetas -Follow -Seguir -Free disk space available: -Espacio de disco disponible: -Free disk space required: -Espacio de disco necesario: -FreeFileSync Batch Job -Tarea batch de FreeFileSync -FreeFileSync at Sourceforge -FreeFileSync en Sourceforge -FreeFileSync batch file -Archivo batch de FreeFileSync -FreeFileSync configuration -Configuración de FreeFileSync -FreeFileSync is up to date! -¡FreeFileSync está actualizado! -Full path -Ruta completa -Generating database... -Generando base de datos... -Generating file list... -Generando lista de archivos... -Global settings -Opciones globales -Help -Ayuda -Hidden dialogs: -Diálogos ocultos: -Hide all error and warning messages -Ocultar todos los mensajes de error y aviso -Hide conflicts -Ocultar conflictos -Hide excluded items -Ocultar elementos excluidos -Hide files that are different -Ocultar archivos diferentes -Hide files that are equal -Ocultar archivos iguales -Hide files that are newer on left -Ocultar archivos más recientes en la izquierda -Hide files that are newer on right -Ocultar archivos más recientes en la derecha -Hide files that exist on left side only -Ocultar archivos que existen sólo en el lado izquierdo -Hide files that exist on right side only -Ocultar archivos que existen sólo en el lado derecho -Hide files that will be created on the left side -Ocultar archivos que serán creados en el lado izquierdo -Hide files that will be created on the right side -Ocultar archivos que serán creados en el lado derecho -Hide files that will be deleted on the left side -Ocultar archivos que serán eliminados en el lado izquierdo -Hide files that will be deleted on the right side -Ocultar archivos que serán eliminados en el lado derecho -Hide files that will be overwritten on left side -Ocultar archivos que serán sobreescritos en el lado izquierdo -Hide files that will be overwritten on right side -Ocultar archivos que serán sobreescritos en el lado derecho -Hide files that won't be copied -Ocultar archivos que no serán copiados -Hide filtered or temporarily excluded files -Ocultar archivos filtrados o temporalmente excluidos -Hide further error messages during the current process -Ocultar próximos mensajes de error durante el proceso actual -Hints: -Consejos: -Homepage -Página de inicio -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente. -Idle time between detection of last change and execution of command line in seconds -Tiempo de inactividad entre la detección del último cambio y la ejecución de la lÃnea de comandos en segundos -If you like FFS -Si te gusta FFS -Ignore -Ignorar -Ignore errors -Ignorar errores -Ignore subsequent errors -Ignorar errores posteriores -Include -Incluir -Include all rows -Incluir todas las filas -Include temporarily -Incluir temporalmente -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\* -Incompatible synchronization database format: -Formato de base de datos de sincronización incompatible: -Info -Info -Information -Información -Initial synchronization: -Sincronización inicial: -Integrate external applications into context menu. The following macros are available: -Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles: -Invalid FreeFileSync config file! -¡Archivo de configuración de FreeFileSync inválido! -Last used configurations (press DEL to remove from list) -Últimas configuraciones usadas (Pulsar DEL para quitar de la lista) -Leave as unresolved conflict -Dejar como conflicto sin resolver -Left -Izquierda -Legend -Leyenda -Load configuration from file -Cargar configuración desde archivo -Log-messages: -Registro de mensajes: -Logging -Iniciando sesión -Main bar -Barra principal -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync. -Match case -Distinción entre mayúsculas y minúsculas -Maximum number of logfiles: -Número máximo de archivos de registro: -Memory allocation failed! -¡La asignación de memoria ha fallado! -Minimum Idle Time [seconds] -Tiempo mÃnimo de espera [segundos] -Mirror ->> -Espejo ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización. -Monitoring active... -Visualización activa... -More than 50% of the total number of files will be copied or deleted! -¡Más del 50% del número total de archivos serán copiados o eliminados! -Move column down -Mover abajo la columna -Move column up -Mover arriba la columna -Move files into a time-stamped subdirectory -Mover archivos a un subdirectorio con marca de tiempo -Moving %x to Recycle Bin -Mover %x a la Papelera de Reciclaje -Moving Symbolic Link %x to user-defined directory %y -Mover enlace simbólico %x al directorio definido por el usuario %y -Moving file %x to user-defined directory %y -Mover el archivo %x al directorio definido por el usuario %y -Moving folder %x to user-defined directory %y -Mover la carpeta %x al directorio definido por el usuario %y -Multiple... -Múltiple... -No change since last synchronization! -¡Ningún cambio desde la última sincronización! -No filter selected -Ningún filtro seleccionado -Not enough free disk space available in: -Espacio en disco insuficiente en: -Nothing to synchronize according to configuration! -¡Nada que sincronizar de acuerdo con la configuración! -Number of files and directories that will be created -Número de archivos y directorios que serán creados -Number of files and directories that will be deleted -Número de archivos y directorios que serán eliminados -Number of files that will be overwritten -Número de archivos que serán sobreescritos -One of the FreeFileSync database entries within the following file is not yet existing: -Una de las entradas de la base de datos de FreeFileSync con el siguiente archivo aún no existe: -One of the FreeFileSync database files is not yet existing: -Uno de los archivos de la base de datos de FreeFileSync aún no existe: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Sólo los archivos/directorios que pasen el filtrado serán seleccionados para la sincronización. El filtro será aplicado al nombre relativo(!) a la base de directorios de sincronización. -Open with Explorer -Abrir con Explorer -Open with default application -Abrir con la aplicación por defecto -Operation aborted! -¡Operación abortada! -Operation: -Operación: -Overview -Visión global -Overwriting Symbolic Link %x in %y -Sobreescribiendo enlace simbólico %x en %y -Overwriting file %x in %y -Sobreescribiendo archivo %x en %y -Pause -Pausa -Paused -Pausado -Planned directory deletion is in conflict with its subdirectories and -files! -¡La eliminación planeada del directorio se encuentra en conflicto con sus subdirectorios y archivos! -Please run a Compare first before synchronizing! -¡Por favor, ejecute la comparación antes de la sincronización! -Press \"Switch\" to open FreeFileSync GUI mode. -Presionar \"Cambiar\" para abrir el modo GUI de FreeFileSync. -Processing folder pair: -Procesar un par de carpetas: -Published under the GNU General Public License: -Publicado bajo "GNU General Public License": -Question -Pregunta -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronización Automática -RealtimeSync configuration -Configuración de RealtimeSync -Recycle Bin not yet supported for this system! -¡La papelera de reciclaje no esta soportada en este sistema! -Relative path -Ruta relativa -Remove alternate settings -Eliminar opciones alternativas -Remove folder -Eliminar carpeta -Remove folder pair -Eliminar un par de carpetas -Report translation error -Informar de errores de traducción -Reset -Reiniciar -Reset view -Reiniciar vista -Restore all hidden dialogs? -¿Restaurar diálogos ocultos? -Right -Derecha -S&ave configuration... -G&uardar configuración... -S&witch view -C&ambiar vista -Save changes to current configuration? -¿Guardar los cambios de la configuración actual? -Save current configuration to file -Guardar configuración actual en un archivo -Scanning... -Escaneando... -Scanning: -Escanear: -Select a folder -Seleccione una carpeta -Select alternate synchronization settings -Seleccione opciones alternativas de sincronización -Select logfile directory: -Seleccione directorio para el archivo de registro: -Select variant: -Seleccione un tipo: -Select view -Sellecione vista -Set direction: -Indicar dirección: -Setting default synchronization directions: Old files will be overwritten with newer files. -Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos. -Show \"%x\" -Mostrar \"%x\" -Show conflicts -Mostrar conflictos -Show files that are different -Mostrar archivos diferentes -Show files that are equal -Mostrar archivos iguales -Show files that are newer on left -Mostrar archivos más recientes a la izquierda -Show files that are newer on right -Mostrar archivos más recientes a la derecha -Show files that exist on left side only -Mostrar sólo archivos existentes en la izquierda -Show files that exist on right side only -Mostrar sólo archivos existentes en la derecha -Show files that will be created on the left side -Mostrar archivos que serán creados en el lado izquierdo -Show files that will be created on the right side -Mostrar archivos que serán creados en el lado derecho -Show files that will be deleted on the left side -Mostrar archivos que serán eliminados en el lado izquierdo -Show files that will be deleted on the right side -Mostrar archivos que serán eliminados en el lado derecho -Show files that will be overwritten on left side -Mostrar archivos que serán sobreescritos en el lado izquierdo -Show files that will be overwritten on right side -Mostrar archivos que serán sobreescritos en el lado derecho -Show files that won't be copied -Mostrar archivos que no serán copiados -Show hidden dialogs -Mostrar diálogos ocultos -Show popup -Mostrar ventanas emergentes -Show popup on errors or warnings -Mostrar ventanas emergentes de errores o avisos -Significant difference detected: -Diferencia significante detectada: -Silent mode -Modo silencioso -Size -Tamaño -Source code written completely in C++ utilizing: -Código fuente escrito completamente en C++ utilizando: -Source directory does not exist anymore: -El directorio origen ya no existe: -Speed: -Velocidad: -Start -Iniciar -Start minimized and write status information to a logfile -Iniciar minimizado y escribir información de estado en un registro -Start synchronization -Iniciar sincronización -Statistics -EstadÃstica -Status feedback -Status feedback -Stop -Detener -Swap sides -Intercambiar lados -Switching to FreeFileSync GUI mode... -Cambiando al modo GUI de FreeFileSync... -Symbolic Link handling -Gestión de enlaces simbólicos -Symlinks %x have the same date but a different target! -¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente! -Synchronization Preview -Previsualización de la sincronización -Synchronization aborted! -¡Sincronización abortada! -Synchronization completed successfully! -¡Sincronización completada con éxito! -Synchronization completed with errors! -¡Sincronización completada con errores! -Synchronization settings -Opciones de sincronización -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta \"temp\". -Synchronize... -Sincronizar... -Synchronizing... -Sincronizando... -Target directory already existing! -¡El directorio de destino ya existe! -Target file already existing! -¡El archivo de destino ya existe! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -La lÃnea de comandos se ejecuta cada vez:\n- todos los directorios estan disponibles (ej. inserción de un lápiz USB)\n- archivos dentro de directorios o subdirectorios son modificados -The file does not contain a valid configuration: -El archivo no contiene una configuración válida: -The file was not processed by last synchronization! -¡El archivo no fue procesado por la última sincronización! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación. -Time -Hora -Time elapsed: -Tiempo transcurrido: -Time remaining: -Tiempo restante: -Total amount of data that will be transferred -Cantidad total de datos que serán transferidos -Total time: -Tiempo total: -Transfer file and directory permissions\n(Requires Administrator rights) -Transferir permisos de archivo y directorio\n(Requiere derechos de administrador) -Unable to connect to sourceforge.net! -¡Incapaz de conectar con sourceforge.net! -Unable to create logfile! -¡Incapaz de crear un archivo de registro! -Unresolved conflicts existing! -¡Existen conflictos sin resolver! -Update -> -Actualizar -> -Updating attributes of %x -Actualizar atributos de %x -Usage: -Uso: -Use Recycle Bin -Utilizar Papelera de Reciclaje -Use Recycle Bin when deleting or overwriting files -Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos -User-defined directory for deletion was not specified! -¡No se ha indicado el directorio definido por el usuario para el borrado! -Variant -Tipo -Verifying file %x -Verificación del archivo %x -Versioning -Control de versiones -Volume name %x not part of filename %y! -El nombre del volumen %x no es una parte del nombre de archivo %y -Waiting for missing directories... -Esperando directorios faltantes... -Waiting while directory is locked (%x)... -Esperando mientras el directorio se encuentre bloqueado (%x)... -Warning -Atención -When the comparison is started with this option set the following decision tree is processed: -Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones: -You can ignore conflicts and continue synchronization. -Puede ignorar conflictos y continuar con la sincronización. -You can ignore this error to consider the directory as empty. -Puede ignorar este error al considerar el directorio como vacÃo. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)! -different -diferentes -file exists on both sides -el archivo existe en ambos lados -on one side only -sólo en un lado +<header> + <language name>Español</language name> + <translator>Alexis MartÃnez</translator> + <locale>es_ES</locale> + <flag file>spain.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Mostrar en Explorer</target> +<source>Open with default application</source> +<target>Abrir con la aplicación por defecto</target> +<source>Browse directory</source> +<target>Examinar directorio</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Sincronización Automática</target> +<source>Browse</source> +<target>Examinar</target> +<source>Error resolving symbolic link:</source> +<target>Error al resolver enlace simbólico:</target> +<source>Select alternate synchronization settings</source> +<target>Seleccione opciones alternativas de sincronización</target> +<source>No filter selected</source> +<target>Ningún filtro seleccionado</target> +<source>Filter is active</source> +<target>Filtro activo</target> +<source>Clear filter settings</source> +<target>Limpiar opciones del filtrado</target> +<source>Remove alternate settings</source> +<target>Eliminar opciones alternativas</target> +<source>Create a batch job</source> +<target>Crear una tarea batch</target> +<source>Synchronization settings</source> +<target>Opciones de sincronización</target> +<source>Comparison settings</source> +<target>Opciones de comparación</target> +<source>About</source> +<target>Acerca de</target> +<source>Error</source> +<target>Error</target> +<source>Warning</source> +<target>Atención</target> +<source>Question</source> +<target>Pregunta</target> +<source>Confirm</source> +<target>Confirmar</target> +<source>Configure filter</source> +<target>Configurar filtro</target> +<source>Customize columns</source> +<target>Personalizar columnas</target> +<source>Global settings</source> +<target>Opciones globales</target> +<source>Synchronization Preview</source> +<target>Previsualización de la sincronización</target> +<source>Find</source> +<target>Buscar</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</target> +<source><Symlink></source> +<target><Enlace simbólico></target> +<source><Directory></source> +<target><Directorio></target> +<source>Size</source> +<target>Tamaño</target> +<source>Date</source> +<target>Fecha</target> +<source>Full path</source> +<target>Ruta completa</target> +<source>Filename</source> +<target>Nombre del archivo</target> +<source>Relative path</source> +<target>Ruta relativa</target> +<source>Directory</source> +<target>Directorio</target> +<source>Extension</source> +<target>Extensión</target> +<source>Comparison Result</source> +<target>Resultado de la comparación</target> +<source>Incompatible synchronization database format:</source> +<target>Formato de base de datos de sincronización incompatible:</target> +<source>Initial synchronization:</source> +<target>Sincronización inicial:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Uno de los archivos de la base de datos de FreeFileSync aún no existe:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Una de las entradas de la base de datos de FreeFileSync con el siguiente archivo aún no existe:</target> +<source>Error reading from synchronization database:</source> +<target>Error al leer de la base de datos de sincronización:</target> +<source>An exception occurred!</source> +<target>¡Ha ocurrido una excepción!</target> +<source>Error deleting file:</source> +<target>Error al borrar archivo:</target> +<source>Error reading file attributes:</source> +<target>Error al leer atributos del archivo:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Esperando mientras el directorio se encuentre bloqueado (%x)...</target> +<source>Error setting directory lock:</source> +<target>Error al establecer bloqueo del directorio:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 segundo</pluralform> +<pluralform>%x segundos</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Error fatal</target> +<source>File does not exist:</source> +<target>El archivo no existe:</target> +<source>Error parsing configuration file:</source> +<target>Error al analizar el archivo de configuración:</target> +<source>Error writing file:</source> +<target>Error al escribir archivo:</target> +<source>Invalid FreeFileSync config file!</source> +<target>¡Archivo de configuración de FreeFileSync inválido!</target> +<source>/sec</source> +<target>/seg</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 minuto</pluralform> +<pluralform>%x minutos</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 hora</pluralform> +<pluralform>%x horas</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 dÃa</pluralform> +<pluralform>%x dÃas</pluralform> +</target> +<source>S&ave configuration...</source> +<target>G&uardar configuración...</target> +<source>&Load configuration...</source> +<target>&Cargar configuración...</target> +<source>&Quit</source> +<target>&Salir</target> +<source>&File</source> +<target>&Archivo</target> +<source>&Content</source> +<target>&Contenido</target> +<source>&About...</source> +<target>&Acerca de...</target> +<source>&Help</source> +<target>&Ayuda</target> +<source>Usage:</source> +<target>Uso:</target> +<source>1. Select directories to monitor.</source> +<target>1. Seleccione los directorios a visualizar.</target> +<source>2. Enter a command line.</source> +<target>2. Introduzca una lÃnea de comandos.</target> +<source>3. Press 'Start'.</source> +<target>3. Presione 'Inicio'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +La lÃnea de comandos se ejecuta cada vez: +- todos los directorios estan disponibles (ej. inserción de un lápiz USB) +- archivos dentro de directorios o subdirectorios son modificados +</target> +<source>Directories to watch</source> +<target>Directorios a visualizar</target> +<source>Add folder</source> +<target>Añadir carpeta</target> +<source>Remove folder</source> +<target>Eliminar carpeta</target> +<source>Select a folder</source> +<target>Seleccione una carpeta</target> +<source>Command line</source> +<target>LÃnea de comandos</target> +<source>Minimum Idle Time [seconds]</source> +<target>Tiempo mÃnimo de espera [segundos]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Tiempo de inactividad entre la detección del último cambio y la ejecución de la lÃnea de comandos en segundos</target> +<source>Start</source> +<target>Iniciar</target> +<source>(Build: %x)</source> +<target>(Completado: %x)</target> +<source>RealtimeSync configuration</source> +<target>Configuración de RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>El archivo ya existe. ¿Quiere sobreescribirlo?</target> +<source>&Restore</source> +<target>&Restaurar</target> +<source>&Exit</source> +<target>&Salir</target> +<source>Monitoring active...</source> +<target>Visualización activa...</target> +<source>Waiting for missing directories...</source> +<target>Esperando directorios faltantes...</target> +<source>Command line is empty!</source> +<target>¡La lÃnea de comandos está vacÃa!</target> +<source>Could not initialize directory monitoring:</source> +<target>No se ha podido inicializar la visualización de directorios:</target> +<source>A directory input field is empty.</source> +<target>Un campo de directorio está vacÃo.</target> +<source>Error when monitoring directories.</source> +<target>Error al visualizar los directorios.</target> +<source>Drag && drop</source> +<target>Arrastrar y soltar</target> +<source>Conversion error:</source> +<target>Error de conversión:</target> +<source>Error moving file:</source> +<target>Error al mover archivo:</target> +<source>Operation aborted!</source> +<target>¡Operación abortada!</target> +<source>Target file already existing!</source> +<target>¡El archivo de destino ya existe!</target> +<source>Error moving directory:</source> +<target>Error al mover directorio:</target> +<source>Target directory already existing!</source> +<target>¡El directorio de destino ya existe!</target> +<source>Error deleting directory:</source> +<target>Error al borrar directorio:</target> +<source>Error changing modification time:</source> +<target>Error al cambiar hora de modificación:</target> +<source>Error loading library function:</source> +<target>Error al cargar la función de biblioteca:</target> +<source>Error reading security context:</source> +<target>Error al leer en contexto de seguridad:</target> +<source>Error writing security context:</source> +<target>Error al escribir en contexto de seguridad:</target> +<source>Error copying file permissions:</source> +<target>Error al copiar permisos del fichero:</target> +<source>Error creating directory:</source> +<target>Error al crear directorio:</target> +<source>Error copying symbolic link:</source> +<target>Error al copiar enlace simbólico:</target> +<source>Error copying file:</source> +<target>Error al copiar archivo:</target> +<source>Error opening file:</source> +<target>Error al abrir archivo:</target> +<source>Error reading file:</source> +<target>Error al leer archivo:</target> +<source>Endless loop when traversing directory:</source> +<target>Bucle infinito al buscar en el directorio:</target> +<source>Error traversing directory:</source> +<target>Error al buscar en el directorio:</target> +<source>Error setting privilege:</source> +<target>Error al establecer privilegios:</target> +<source>Error moving to Recycle Bin:</source> +<target>Error al mover a la Papelera de Reciclaje:</target> +<source>Could not load a required DLL:</source> +<target>No se ha podido cargar el DLL solicitado:</target> +<source>Error writing to synchronization database:</source> +<target>Error al escribir en la base de datos de sincronización:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>¡Error al iniciar el servicio "Volume Shadow Copy"!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync.</target> +<source>Could not determine volume name for file:</source> +<target>No se ha podido determinar el nombre del volumen para el archivo:</target> +<source>Volume name %x not part of filename %y!</source> +<target>El nombre del volumen %x no es una parte del nombre de archivo %y</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>No se ha podido leer los valores para los siguientes nodos XML:</target> +<source>Show popup</source> +<target>Mostrar ventanas emergentes</target> +<source>Show popup on errors or warnings</source> +<target>Mostrar ventanas emergentes de errores o avisos</target> +<source>Ignore errors</source> +<target>Ignorar errores</target> +<source>Hide all error and warning messages</source> +<target>Ocultar todos los mensajes de error y aviso</target> +<source>Exit instantly</source> +<target>Salir inmediatamente</target> +<source>Abort synchronization immediately</source> +<target>Abortar sincronización inmediatamente</target> +<source>Logging</source> +<target>Iniciando sesión</target> +<source>FreeFileSync batch file</source> +<target>Archivo batch de FreeFileSync</target> +<source>FreeFileSync configuration</source> +<target>Configuración de FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>Tarea batch de FreeFileSync</target> +<source>Unable to create logfile!</source> +<target>¡Incapaz de crear un archivo de registro!</target> +<source>Batch execution</source> +<target>Ejecución batch</target> +<source>Log-messages:</source> +<target>Registro de mensajes:</target> +<source>Stop</source> +<target>Detener</target> +<source>Total time:</source> +<target>Tiempo total:</target> +<source>Synchronization aborted!</source> +<target>¡Sincronización abortada!</target> +<source>Synchronization completed with errors!</source> +<target>¡Sincronización completada con errores!</target> +<source>Synchronization completed successfully!</source> +<target>¡Sincronización completada con éxito!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Presionar "Cambiar" para abrir el modo GUI de FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Cambiando al modo GUI de FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>¡Incapaz de conectar con sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>Una nueva versión de FreeFileSync está disponible:</target> +<source>Download now?</source> +<target>¿Descargar ahora?</target> +<source>Information</source> +<target>Información</target> +<source>FreeFileSync is up to date!</source> +<target>¡FreeFileSync está actualizado!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana?</target> +<source>(Requires an Internet connection!)</source> +<target>(¡Conexión a Internet necesaria!)</target> +<source>1. &Compare</source> +<target>1. &Comparar</target> +<source>2. &Synchronize...</source> +<target>2. &Sincronizar...</target> +<source>S&witch view</source> +<target>C&ambiar vista</target> +<source>&New</source> +<target>&Nuevo</target> +<source>&Program</source> +<target>&Programa</target> +<source>&Language</source> +<target>&Idioma</target> +<source>&Global settings...</source> +<target>&Opciones globales...</target> +<source>&Create batch job...</source> +<target>&Crear tarea batch...</target> +<source>&Export file list...</source> +<target>&Exportar lista de archivos...</target> +<source>&Advanced</source> +<target>&Avanzado</target> +<source>&Check for new version</source> +<target>&Comprobar si existe una nueva versión</target> +<source>Compare</source> +<target>Comparar</target> +<source>Compare both sides</source> +<target>Comparar ambos lados</target> +<source>&Abort</source> +<target>&Abortar</target> +<source>Synchronize...</source> +<target>Sincronizar...</target> +<source>Start synchronization</source> +<target>Iniciar sincronización</target> +<source>Swap sides</source> +<target>Intercambiar lados</target> +<source>Add folder pair</source> +<target>Añadir un par de carpetas</target> +<source>Remove folder pair</source> +<target>Eliminar un par de carpetas</target> +<source>Save current configuration to file</source> +<target>Guardar configuración actual en un archivo</target> +<source>Load configuration from file</source> +<target>Cargar configuración desde archivo</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target> +<source>Hide excluded items</source> +<target>Ocultar elementos excluidos</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Ocultar archivos filtrados o temporalmente excluidos</target> +<source>Number of files and directories that will be created</source> +<target>Número de archivos y directorios que serán creados</target> +<source>Number of files that will be overwritten</source> +<target>Número de archivos que serán sobreescritos</target> +<source>Number of files and directories that will be deleted</source> +<target>Número de archivos y directorios que serán eliminados</target> +<source>Total amount of data that will be transferred</source> +<target>Cantidad total de datos que serán transferidos</target> +<source>Left</source> +<target>Izquierda</target> +<source>Right</source> +<target>Derecha</target> +<source>Batch job</source> +<target>Tarea batch</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el administrador de tareas de su sistema operativo.</target> +<source>Help</source> +<target>Ayuda</target> +<source>Configuration overview:</source> +<target>Visión global de la configuración:</target> +<source>Filter files</source> +<target>Filtrar archivos</target> +<source>Status feedback</source> +<target>Status feedback</target> +<source>Silent mode</source> +<target>Modo silencioso</target> +<source>Start minimized and write status information to a logfile</source> +<target>Iniciar minimizado y escribir información de estado en un registro</target> +<source>Error handling</source> +<target>Gestión de errores</target> +<source>Overview</source> +<target>Visión global</target> +<source>Select logfile directory:</source> +<target>Seleccione directorio para el archivo de registro:</target> +<source>Maximum number of logfiles:</source> +<target>Número máximo de archivos de registro:</target> +<source>&Save</source> +<target>&Guardar</target> +<source>&Load</source> +<target>&Cargar</target> +<source>&Cancel</source> +<target>&Cancelar</target> +<source>Elements found:</source> +<target>Elementos encontrados:</target> +<source>Elements remaining:</source> +<target>Elementos restantes:</target> +<source>Speed:</source> +<target>Velocidad:</target> +<source>Time remaining:</source> +<target>Tiempo restante:</target> +<source>Time elapsed:</source> +<target>Tiempo transcurrido:</target> +<source>Operation:</source> +<target>Operación:</target> +<source>Select variant:</source> +<target>Seleccione un tipo:</target> +<source><Automatic></source> +<target><Automático></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente.</target> +<source>Mirror ->></source> +<target>Espejo ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización.</target> +<source>Update -></source> +<target>Actualizar -></target> +<source>Copy new or updated files to right folder.</source> +<target>Copiar archivos nuevos o actualizados a la carpeta de la derecha.</target> +<source>Custom</source> +<target>Personalizado</target> +<source>Configure your own synchronization rules.</source> +<target>Configuración de sus propias reglas de sincronización.</target> +<source>Deletion handling</source> +<target>Gestión de borrado</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Configuración</target> +<source>Category</source> +<target>CategorÃa</target> +<source>Action</source> +<target>Acción</target> +<source>Files/folders that exist on left side only</source> +<target>Archivos/carpetas que existen sólo en el lado izquierdo</target> +<source>Files/folders that exist on right side only</source> +<target>Archivos/carpetas que existen sólo en el lado derecho</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Archivos que existen en ambos lados, el de la izquierda es más reciente</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Archivos que existen en ambos lados, el de la derecha es más reciente</target> +<source>Files that have different content</source> +<target>Archivos que tienen un contenido diferente</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Conflictos/archivos que no pueden ser clasificados</target> +<source>Compare by...</source> +<target>Comparar por...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Los archivos serán considerados iguales si + - tamaño del archivo + - la hora y fecha de la última escritura +son iguales +</target> +<source>File size and date</source> +<target>Fecha y tamaño del archivo</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Los archivos serán considerados iguales si + - el contenido del archivo +es el mismo +</target> +<source>File content</source> +<target>Contenido del archivo</target> +<source>Symbolic Link handling</source> +<target>Gestión de enlaces simbólicos</target> +<source>Synchronizing...</source> +<target>Sincronizando...</target> +<source>Elements processed:</source> +<target>Elementos procesados:</target> +<source>&Pause</source> +<target>&Pausa</target> +<source>Compare by "File size and date"</source> +<target>Comparar por "Tamaño y fecha del archivo"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Como resultado, los archivos están separados en las siguientes categorÃas:</target> +<source>- equal</source> +<target>- iguales</target> +<source>- left newer</source> +<target>- más reciente en la izquierda</target> +<source>- right newer</source> +<target>- más reciente en la derecha</target> +<source>- exists left only</source> +<target>- existe sólo en la izquierda</target> +<source>- exists right only</source> +<target>- existe sólo en la derecha</target> +<source>- conflict (same date, different size)</source> +<target>- conflicto (misma fecha, diferente tamaño)</target> +<source>Compare by "File content"</source> +<target>Comparar por "Contenido del archivo"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Como el tÃtulo sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de copia de seguridad. Por lo tanto, las fechas de los archivos no se tienen en cuenta. + +Con esta opción habilitada el árbol de decisiones se reduce a: +</target> +<source>- different</source> +<target>- diferentes</target> +<source>Source code written in C++ utilizing:</source> +<target>Código fuente escrito en C++ utilizando:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Agradecimientos por la traducción de FreeFileSync a:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Comentarios y sugerencias son bienvenidos en:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync en Sourceforge</target> +<source>Homepage</source> +<target>Página de inicio</target> +<source>If you like FFS</source> +<target>Si te gusta FFS</target> +<source>Donate with PayPal</source> +<target>Donar a través de PayPal</target> +<source>Email</source> +<target>Correo electrónico</target> +<source>Report translation error</source> +<target>Informar de errores de traducción</target> +<source>Published under the GNU General Public License:</source> +<target>Publicado bajo "GNU General Public License":</target> +<source>Ignore subsequent errors</source> +<target>Ignorar errores posteriores</target> +<source>Hide further error messages during the current process</source> +<target>Ocultar próximos mensajes de error durante el proceso actual</target> +<source>&Ignore</source> +<target>&Ignorar</target> +<source>&Retry</source> +<target>&Reintentar</target> +<source>Do not show this dialog again</source> +<target>No volver a mostrar este diálogo</target> +<source>&Switch</source> +<target>&Cambiar</target> +<source>&Yes</source> +<target>&Si</target> +<source>&No</source> +<target>&No</target> +<source>Delete on both sides</source> +<target>Borrar en ambos lados</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado</target> +<source>Use Recycle Bin</source> +<target>Utilizar Papelera de Reciclaje</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Sólo los archivos/directorios que cumplan con todos los filtros serán seleccionados para la sincronización. +Nota: El nombre del filtro debe ser especificado en relación(!) a los directorios principales de sincronización. +</target> +<source>Hints:</source> +<target>Consejos:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Introduzca los nombres de los archivos o directorios relativos separados por ';' o una nueva lÃnea.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Usar caracteres comodÃn '*' y '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Excluir directamente archivos sobre las celdas a través del menú de contexto.</target> +<source>Example</source> +<target>Ejemplo</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Incluir: *.doc;*.zip;*.exe +Excluir: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta "temp".</target> +<source>Include</source> +<target>Incluir</target> +<source>Exclude</source> +<target>Excluir</target> +<source>Select time span:</source> +<target>Seleccionar intervalo de tiempo:</target> +<source>Minimum file size:</source> +<target>Tamaño mÃnimo de archivo:</target> +<source>Maximum file size:</source> +<target>Tamaño máximo de archivo</target> +<source>&Default</source> +<target>&Configuración por defecto</target> +<source>Move column up</source> +<target>Mover arriba la columna</target> +<source>Move column down</source> +<target>Mover abajo la columna</target> +<source>Copy locked files</source> +<target>Copiar archivos bloqueados</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy" +(Requiere derechos de administrador) +</target> +<source>Copy filesystem permissions</source> +<target>Permisos de copia del sistema de ficheros</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Transferir permisos de archivo y directorio +(Requiere derechos de administrador) +</target> +<source>Hidden dialogs:</source> +<target>Diálogos ocultos:</target> +<source>Reset</source> +<target>Reiniciar</target> +<source>Show hidden dialogs</source> +<target>Mostrar diálogos ocultos</target> +<source>External applications</source> +<target>Aplicaciones externas</target> +<source>Description</source> +<target>Descripción</target> +<source>Variant</source> +<target>Tipo</target> +<source>Statistics</source> +<target>EstadÃstica</target> +<source>Find what:</source> +<target>Buscar:</target> +<source>Match case</source> +<target>Distinción entre mayúsculas y minúsculas</target> +<source>&Find next</source> +<target>&Buscar siguiente</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)!</target> +<source>Batch file created successfully!</source> +<target>¡El archivo batch ha sido creado correctamente!</target> +<source>Main bar</source> +<target>Barra principal</target> +<source>Folder pairs</source> +<target>Pares de carpetas</target> +<source>Select view</source> +<target>Sellecione vista</target> +<source>Folder Comparison and Synchronization</source> +<target>Comparación y Sincronización de Carpetas</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>¡La papelera de reciclaje no esta soportada en este sistema!</target> +<source>Set direction:</source> +<target>Indicar dirección:</target> +<source>Exclude temporarily</source> +<target>Excluir temporalmente</target> +<source>Include temporarily</source> +<target>Incluir temporalmente</target> +<source>Exclude via filter:</source> +<target>Excluir a través del filtro:</target> +<source><multiple selection></source> +<target><selección múltiple></target> +<source>D-Click</source> +<target>Doble click</target> +<source>Copy to clipboard CTRL+C</source> +<target>Copiar al Portapapeles CTRL+C</target> +<source>Delete files DEL</source> +<target>Borrar archivos DEL</target> +<source>Customize...</source> +<target>Personalizar...</target> +<source>Auto-adjust columns</source> +<target>Ajustar automáticamente las columnas</target> +<source>Include all rows</source> +<target>Incluir todas las filas</target> +<source>Exclude all rows</source> +<target>Excluir todas las columnas</target> +<source>Reset view</source> +<target>Reiniciar vista</target> +<source>Show "%x"</source> +<target>Mostrar "%x"</target> +<source><Last session></source> +<target><Última sesión></target> +<source>Configuration saved!</source> +<target>¡Configuración guardada!</target> +<source>Save changes to current configuration?</source> +<target>¿Guardar los cambios de la configuración actual?</target> +<source>Configuration loaded!</source> +<target>¡Configuración cargada!</target> +<source>Hide files that exist on left side only</source> +<target>Ocultar archivos que existen sólo en el lado izquierdo</target> +<source>Show files that exist on left side only</source> +<target>Mostrar sólo archivos existentes en la izquierda</target> +<source>Hide files that exist on right side only</source> +<target>Ocultar archivos que existen sólo en el lado derecho</target> +<source>Show files that exist on right side only</source> +<target>Mostrar sólo archivos existentes en la derecha</target> +<source>Hide files that are newer on left</source> +<target>Ocultar archivos más recientes en la izquierda</target> +<source>Show files that are newer on left</source> +<target>Mostrar archivos más recientes a la izquierda</target> +<source>Hide files that are newer on right</source> +<target>Ocultar archivos más recientes en la derecha</target> +<source>Show files that are newer on right</source> +<target>Mostrar archivos más recientes a la derecha</target> +<source>Hide files that are equal</source> +<target>Ocultar archivos iguales</target> +<source>Show files that are equal</source> +<target>Mostrar archivos iguales</target> +<source>Hide files that are different</source> +<target>Ocultar archivos diferentes</target> +<source>Show files that are different</source> +<target>Mostrar archivos diferentes</target> +<source>Hide conflicts</source> +<target>Ocultar conflictos</target> +<source>Show conflicts</source> +<target>Mostrar conflictos</target> +<source>Hide files that will be created on the left side</source> +<target>Ocultar archivos que serán creados en el lado izquierdo</target> +<source>Show files that will be created on the left side</source> +<target>Mostrar archivos que serán creados en el lado izquierdo</target> +<source>Hide files that will be created on the right side</source> +<target>Ocultar archivos que serán creados en el lado derecho</target> +<source>Show files that will be created on the right side</source> +<target>Mostrar archivos que serán creados en el lado derecho</target> +<source>Hide files that will be deleted on the left side</source> +<target>Ocultar archivos que serán eliminados en el lado izquierdo</target> +<source>Show files that will be deleted on the left side</source> +<target>Mostrar archivos que serán eliminados en el lado izquierdo</target> +<source>Hide files that will be deleted on the right side</source> +<target>Ocultar archivos que serán eliminados en el lado derecho</target> +<source>Show files that will be deleted on the right side</source> +<target>Mostrar archivos que serán eliminados en el lado derecho</target> +<source>Hide files that will be overwritten on left side</source> +<target>Ocultar archivos que serán sobreescritos en el lado izquierdo</target> +<source>Show files that will be overwritten on left side</source> +<target>Mostrar archivos que serán sobreescritos en el lado izquierdo</target> +<source>Hide files that will be overwritten on right side</source> +<target>Ocultar archivos que serán sobreescritos en el lado derecho</target> +<source>Show files that will be overwritten on right side</source> +<target>Mostrar archivos que serán sobreescritos en el lado derecho</target> +<source>Hide files that won't be copied</source> +<target>Ocultar archivos que no serán copiados</target> +<source>Show files that won't be copied</source> +<target>Mostrar archivos que no serán copiados</target> +<source>All directories in sync!</source> +<target>¡Todos los directorios en sincronización!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>¡Por favor, ejecute la comparación antes de la sincronización!</target> +<source>Comma separated list</source> +<target>Lista separada por comas</target> +<source>Legend</source> +<target>Leyenda</target> +<source>File list exported!</source> +<target>¡Lista de archivos exportada!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>¡Objeto eliminado satisfactoriamente!</pluralform> +<pluralform>¡%x objetos eliminados satisfactoriamente!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 directorio</pluralform> +<pluralform>%x directorios</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 archivo</pluralform> +<pluralform>%x archivos</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x de una fila en vista</pluralform> +<pluralform>%x de %y filas en vista</pluralform> +</target> +<source>Scanning...</source> +<target>Escaneando...</target> +<source>Comparing content...</source> +<target>Comparando contenido...</target> +<source>Paused</source> +<target>Pausado</target> +<source>Aborted</source> +<target>Abortado</target> +<source>Completed</source> +<target>Terminado</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Solicitud de aborto: Esperando a que la operación actual finalice...</target> +<source>Continue</source> +<target>Continuar</target> +<source>Pause</source> +<target>Pausa</target> +<source>Cannot find %x</source> +<target>No se puede encontrar %x</target> +<source>DECISION TREE</source> +<target>ÃRBOL DE DECISIÓN</target> +<source>file exists on both sides</source> +<target>el archivo existe en ambos lados</target> +<source>on one side only</source> +<target>sólo en un lado</target> +<source>different</source> +<target>diferentes</target> +<source>Inactive</source> +<target>Inactivo</target> +<source>Second</source> +<target>Segundo</target> +<source>Minute</source> +<target>Minuto</target> +<source>Hour</source> +<target>Hora</target> +<source>Day</source> +<target>DÃa</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filtro: Todos los pares</target> +<source>Filter: Single pair</source> +<target>Filtro: Sólo un par</target> +<source>Ignore</source> +<target>Ignorar</target> +<source>Direct</source> +<target>Enviar</target> +<source>Follow</source> +<target>Seguir</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles:</target> +<source>- full file or directory name</source> +<target>- nombre completo del archivo o directorio</target> +<source>- directory part only</source> +<target>- sólo parte del directorio</target> +<source>- Other side's counterpart to %name</source> +<target>- El otro lado equivale a %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- El otro lado equivale a %dir</target> +<source>Restore all hidden dialogs?</source> +<target>¿Restaurar diálogos ocultos?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>¿De verdad quiere mover el siguiente objeto a la papelera de reciclaje?</pluralform> +<pluralform>¿De verdad quiere mover los siguientes %x objetos a la papelera de reciclaje?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>¿De verdad quiere eliminar el siguiente objeto?</pluralform> +<pluralform>¿De verdad quiere eliminar los siguientes %x objetos?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Dejar como conflicto sin resolver</target> +<source>Delete permanently</source> +<target>Borrar permanentemente</target> +<source>Delete or overwrite files permanently</source> +<target>Borrar o sobreescribir archivos permanentemente</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target> +<source>Versioning</source> +<target>Control de versiones</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Mover archivos a un subdirectorio con marca de tiempo</target> +<source>Cannot determine sync-direction:</source> +<target>No se puede determinar la dirección de la sincronización:</target> +<source>Filter settings have changed!</source> +<target>¡Las opciones de filtrado han cambiado!</target> +<source>Both sides have changed since last synchronization!</source> +<target>¡Ambos lados han cambiado desde la última sincronizacion!</target> +<source>No change since last synchronization!</source> +<target>¡Ningún cambio desde la última sincronización!</target> +<source>The file was not processed by last synchronization!</source> +<target>¡El archivo no fue procesado por la última sincronización!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>¡La eliminación planeada del directorio se encuentra en conflicto con sus subdirectorios y archivos!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos.</target> +<source>The file does not contain a valid configuration:</source> +<target>El archivo no contiene una configuración válida:</target> +<source>Scanning:</source> +<target>Escanear:</target> +<source>Encoding extended time information: %x</source> +<target>Información temporal extendida de la codificación: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Puede ignorar este error al considerar el directorio como vacÃo.</target> +<source>Directory does not exist:</source> +<target>El directorio no existe:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización:</target> +<source>Comparing content of files %x</source> +<target>Comparación del contenido de los archivos %x</target> +<source>Memory allocation failed!</source> +<target>¡La asignación de memoria ha fallado!</target> +<source>File %x has an invalid date!</source> +<target>¡El archivo %x tiene una fecha inválida!</target> +<source>Conflict detected:</source> +<target>Conflicto detectado:</target> +<source>Files %x have the same date but a different size!</source> +<target>¡Los archivos %x tienen la misma fecha pero un tamaño diferente!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente!</target> +<source>Comparing files by content failed.</source> +<target>La comparación de archivos por el contenido ha fallado.</target> +<source>Generating file list...</source> +<target>Generando lista de archivos...</target> +<source>Multiple...</source> +<target>Múltiple...</target> +<source>Files that are equal on both sides</source> +<target>Archivos que son iguales en ambos lados</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Archivos/Carpetas iguales que sólo difieren en los atributos</target> +<source>Copy from right to left</source> +<target>Copiar de derecha a izquierda</target> +<source>Copy from left to right</source> +<target>Copiar de izquierda a derecha</target> +<source>Delete files/folders existing on left side only</source> +<target>Borrar sólo archivos/carpetas existentes en el lado izquierdo</target> +<source>Delete files/folders existing on right side only</source> +<target>Borrar sólo archivos/carpetas existentes en el lado derecho</target> +<source>Copy from right to left overwriting</source> +<target>Copiar de derecha a izquierda con sobreescritura</target> +<source>Copy from left to right overwriting</source> +<target>Copiar de izquierda a derecha con sobreescritura</target> +<source>Do nothing</source> +<target>No hacer nada</target> +<source>Copy attributes only from right to left</source> +<target>Copiar sólo atributos de izquierda a derecha</target> +<source>Copy attributes only from left to right</source> +<target>Copiar sólo atributos de izquierda a derecha</target> +<source>Deleting file %x</source> +<target>Borrar archivo %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Eliminando enlace simbólico %x</target> +<source>Deleting folder %x</source> +<target>Borrar carpeta %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Mover %x a la Papelera de Reciclaje</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Mover el archivo %x al directorio definido por el usuario %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Mover la carpeta %x al directorio definido por el usuario %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Mover enlace simbólico %x al directorio definido por el usuario %y</target> +<source>Copying new file %x to %y</source> +<target>Copiando archivo nuevo de %x a %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Copiando enlace simbólico nuevo de %x a %y</target> +<source>Overwriting file %x in %y</source> +<target>Sobreescribiendo archivo %x en %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Sobreescribiendo enlace simbólico %x en %y</target> +<source>Creating folder %x</source> +<target>Creando carpeta %x</target> +<source>Verifying file %x</source> +<target>Verificación del archivo %x</target> +<source>Updating attributes of %x</source> +<target>Actualizar atributos de %x</target> +<source>Source directory does not exist anymore:</source> +<target>El directorio origen ya no existe:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>¡Nada que sincronizar de acuerdo con la configuración!</target> +<source>Target directory name must not be empty!</source> +<target>¡El nombre del directorio de destino no debe estar vacÃo!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>¡No se ha indicado el directorio definido por el usuario para el borrado!</target> +<source>Unresolved conflicts existing!</source> +<target>¡Existen conflictos sin resolver!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Puede ignorar conflictos y continuar con la sincronización.</target> +<source>Significant difference detected:</source> +<target>Diferencia significante detectada:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>¡Más del 50% del número total de archivos serán copiados o eliminados!</target> +<source>Not enough free disk space available in:</source> +<target>Espacio en disco insuficiente en:</target> +<source>Free disk space required:</source> +<target>Espacio de disco necesario:</target> +<source>Free disk space available:</source> +<target>Espacio de disco disponible:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Un directorio será modificado, el cual es parte de mútiples pares de carpetas. ¡Por favor, revise la configuración de la sincronización!</target> +<source>Processing folder pair:</source> +<target>Procesar un par de carpetas:</target> +<source>Generating database...</source> +<target>Generando base de datos...</target> +<source>Error copying locked file %x!</source> +<target>¡Error al copiar archivo bloqueado %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente!</target> diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index b245a7c9..af909742 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -1,910 +1,1055 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%x / %y objekt borttagna -%x Bytes -%x Byte -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x dag(ar) -%x directories -%x kataloger -%x files -%x filer -%x hour(s) -%x timma(r) -%x kB -%x kB -%x min -%x min -%x of %y rows in view -%x rader av %y i vyn -%x of 1 row in view -%x av 1 rad i vyn -%x sec -%x sek -%x% -%x% -&Abort -&Avbryt -&About... -&Om... -&Advanced -&Avancerat -&Cancel -&Avbryt -&Check for new version -&Sök efter uppdatering -&Content -&InnehÃ¥ll -&Create batch job... -&Skapa batch-jobb... -&Default -&Standard -&Exit -&Avsluta -&Export file list... -&Exportera fillista... -&File -&Arkiv -&Find next -&Sök nästa -&Global settings... -&Allmäna inställningar... -&Help -&Hjälp -&Ignore -&Ignorera -&Language -&SprÃ¥k -&Load -&Läs frÃ¥n fil -&Load configuration... -&Hämta inställningar frÃ¥n fil... -&New -&Nytt -&No -&Nej -&OK -&OK -&Pause -&Paus -&Program -&Program -&Quit -&Avsluta -&Restore -&Ã…terställ -&Retry -&Försök igen -&Save -&Spara -&Switch -&Växla -&Yes -&Ja -(Build: %x) -(Bygge: %x) -(Requires an Internet connection!) -(Kräver Internetuppkoppling!) -- Other side's counterpart to %dir -- Andra sidans motsvarighet till %dir -- Other side's counterpart to %name -- Andra sidans motsvarighet till %name -- conflict -- konflikt -- conflict (same date, different size) -- konflikt (samma datum, olika storlek) -- different -- olika -- directory part only -- Endast fil-/katalognamn -- equal -- lika -- exists left only -- finns endast till vänster -- exists right only -- finns endast till höger -- full file or directory name -- Full sökväg -- left -- vänster -- left newer -- vänster nyare -- right -- höger -- right newer -- höger nyare -/sec -/s -1 directory -1 katalog -1 file -1 fil -1. &Compare -1. &Jämför -1. Enter relative file or directory names separated by ';' or a new line. -1. Ange fil- eller katalognamn avgränsade med "," eller en ny rad -1. Select directories to monitor. -1. Välj kataloger att övervaka. -2. &Synchronize... -2. &Synkronisera... -2. Enter a command line. -2. Mata in ett kommando. -2. Use wildcard characters '*' and '?'. -2. Använd wildcard-tecknen '*' och '?' . -3. Exclude files directly on main grid via context menu. -3. Undanta filer direkt i huvudfönstret, via högerklicksmenyn. -3. Press 'Start'. -3. Tryck 'Start'. -<Automatic> -<Automatisk> -<Directory> -<Katalog> -<Last session> -<Senaste session> -<Symlink> -<Symboliska länkar> -<multiple selection> -<flerval> -A directory input field is empty. -Ett katalogfält är tomt -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -En katalog som är en del av flera katalogpar kommer att ändras! Kontrollera synkroniseringsinställningarna -A newer version of FreeFileSync is available: -En nyare version av FreeFileSync finns tillgänglig: -Abort requested: Waiting for current operation to finish... -Avbryter: Väntar pÃ¥ att aktuell process skall slutföras... -Abort synchronization immediately -Avbryt synkronisering omedelbart -Aborted -Användaren avbröt -About -Om -Action -Aktivitet -Add folder -Lägg till katalog -Add folder pair -Lägg till katalogpar -All directories in sync! -Alla kataloger synkade! -An exception occurred! -Ett undantag inträffade! -As a result the files are separated into the following categories: -Som ett resultat blir filerna separerade i följande kategorier: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Som namnet antyder, tvÃ¥ filer med samma namn beräknas som lika, endast om dom har samma innehÃ¥ll. Den här funktionen är mer användbar för konsistenskontroll, snarare än säkerhetskopiering. Därför tas inte tidsattributen med i beräkningen.\n\nMed det här alternativet aktiverat, blir beslutsträdet mindre: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -Montera en batch-fil för automatisk synkronisering. För att starta i batch-läge, lägg till filnamnet i startkommandot: FreeFileSync.exe <batch-fil>. Det kan ocksÃ¥ schemaläggas i Windows Schemaläggaren. -At least one directory input field is empty. -Minst 1 adressfält är tomt. -Auto-adjust columns -Autojustera kollumner -Batch execution -Batch-körning -Batch file created successfully! -Batch-filen skapades korrekt! -Batch job -Batch-jobb -Big thanks for localizing FreeFileSync goes out to: -Stort tack för översättningen av FreeFileSync gÃ¥r till: -Both sides have changed since last synchronization! -BÃ¥da sidor har ändrats sedan senaste synkroniseringen! -Browse -Bläddra -Browse directory -Sök upp katalog -Cannot determine sync-direction: -Kan inte bestämma synk-riktning: -Cannot find %x -Kan inte hitta %x -Category -Kategori -Clear filter settings -Rensa filterinställningar -Comma separated list -Komma-separerad lista -Command line -Kommandofält -Command line is empty! -Kommandofältet är tomt -Compare -Jämför -Compare both sides -Jämför bÃ¥da sidor -Compare by \"File content\" -Jämför: \"FilinnehÃ¥ll\" -Compare by \"File size and date\" -Jämför: \"Filstorlek och datum\" -Compare by... -Jämför... -Comparing content of files %x -Jämför filinnehÃ¥ll för %x -Comparing content... -Jämför innehÃ¥ll... -Comparing files by content failed. -Kunde inte jämföra filinnehÃ¥ll. -Comparison Result -Jämförelseresultat -Comparison settings -Jämförelseinställningar -Completed -Slutförd -Configuration -Inställningar -Configuration loaded! -Inställningar inlästa! -Configuration overview: -Översikt: -Configuration saved! -Inställningar sparade! -Configure filter -Filterinställningar -Configure your own synchronization rules. -Konfigurera dina egna synkroniseringsregler. -Confirm -Bekräfta -Conflict detected: -Konflikt upptäckt: -Conflicts/files that cannot be categorized -Konflikter/filer som inte kan kategoriseras -Continue -Fortsätt -Conversion error: -Konversionsfel: -Copy attributes only from left to right -Kopiera attribut endast frÃ¥n vänster till höger -Copy attributes only from right to left -Kopiera attribut endast frÃ¥n höger till vänster -Copy filesystem permissions -Kopiera filsystembehörigheter -Copy from left to right -Kopiera frÃ¥n vänster till höger -Copy from left to right overwriting -Kopiera frÃ¥n vänster till höger och skriv över mÃ¥let -Copy from right to left -Kopiera frÃ¥n höger till vänster -Copy from right to left overwriting -Kopiera frÃ¥n höger till vänster och skriv över mÃ¥let -Copy locked files -Kopiera lÃ¥sta filer -Copy new or updated files to right folder. -Kopiera nya och uppdaterade filer till höger katalog. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Kopiera delade eller lÃ¥sta filer med hjälp av Volume Shadow Copy Service\n(Kräver administratörsrättighet) -Copy to clipboard\tCTRL+C -Kopiera till urklipp\tCTRL+C -Copying new Symbolic Link %x to %y -Kopierar ny symbolisk länk %x to %y -Copying new file %x to %y -Kopierar ny fil %x till %y -Could not determine volume name for file: -Kan inte bestämma volym för fil: -Could not initialize directory monitoring: -Kan inte initiera katalogskanner: -Could not load a required DLL: -Kan inte läsa in nödvändig DLL: -Could not read values for the following XML nodes: -Kan inte läsa värden för följande XML-noder: -Create a batch job -Skapa ett batch-jobb -Creating folder %x -Skapar katalog %x -Custom -Anpassat -Customize columns -Anpassa kollumner -Customize... -Anpassar... -D-Click -HÃ¥ll ner D -DECISION TREE -BESLUTSTRÄD -Data verification error: Source and target file have different content! -Verifikationsfel: Källfil och mÃ¥lfil har olika innehÃ¥ll! -Date -Datum -Delete files/folders existing on left side only -Ta bort filer/kataloger som endast finns pÃ¥ vänster sida -Delete files/folders existing on right side only -Ta bort filer/kataloger som endast finns pÃ¥ höger sida -Delete files\tDEL -Ta bort filer\tDEL -Delete on both sides -Ta bort pÃ¥ bÃ¥da sidor -Delete on both sides even if the file is selected on one side only -Ta bort pÃ¥ bÃ¥da sidor, även om filen är markerad pÃ¥ endast en sida -Delete or overwrite files permanently -Ta bort eller skriv över permanent -Delete permanently -Ta bort permanent -Deleting Symbolic Link %x -Tar bort symbolisk länk %x -Deleting file %x -Tar bort filen %x -Deleting folder %x -Tar bort katalogen %x -Deletion handling -Borttagning -Description -Beskrivning -Direct -Direkt -Directories are dependent! Be careful when setting up synchronization rules: -Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler: -Directories to watch -Kataloger att övervaka -Directory -Katalog -Directory does not exist: -Katalogen finns inte: -Do not show this dialog again -Visa inte den här dialogrutan igen -Do nothing -Gör ingenting -Do you really want to delete the following object(s)? -Vill du verkligen ta bort följande objekt? -Do you really want to move the following object(s) to the Recycle Bin? -Vill du verkligen flytta följande objekt till papperskorgen? -Do you want FreeFileSync to automatically check for updates every week? -Vill du att FreeFileSync skall söka efter uppdateringar varje vecka? -Donate with PayPal -Donera via PayPal -Download now? -Ladda ner nu? -Drag && drop -Dra && släpp -Elements found: -Funna poster: -Elements processed: -Processade poster -Elements remaining: -Ã…terstÃ¥ende poster: -Email -e-post -Encoding extended time information: %x -Kodar utökad tidsinformation: %x -Endless loop when traversing directory: -Oändlig loop vid accessförsök pÃ¥ katalog: -Equal files/folders that differ in attributes only -Lika filer/kataloger som endast skiljer sig i attribut -Error -Fel -Error changing modification time: -Kan inte modifiera tidsstämpel: -Error copying file permissions: -Kan inte kopiera filsystembehörighet: -Error copying file: -Kan inte kopiera fil: -Error copying locked file %x! -Kan inte kopiera lÃ¥st fil %x! -Error copying symbolic link: -Kan inte kopiera symbolisk länk: -Error creating directory: -Kan inte skapa katalog: -Error deleting directory: -Kan inte ta bort katalog: -Error deleting file: -Kan inte ta bort fil: -Error handling -Felhantering -Error loading library function: -Kan inte starta biblioteksfunktion: -Error moving directory: -Kan inte flytta katalog: -Error moving file: -Kan inte flytta fil: -Error moving to Recycle Bin: -Kan inte flytta till papperskorgen: -Error opening file: -Kan inte öppna fil: -Error parsing configuration file: -Kan inte läsa in konfigurationsfil: -Error reading file attributes: -Kan inte läsa filattribut: -Error reading file: -Kan inte läsa fil: -Error reading from synchronization database: -Kan inte läsa frÃ¥n databasen: -Error reading security context: -Kan inte läsa säkerhetskontext: -Error resolving symbolic link: -Kan inte tyda symbolisk länk: -Error setting directory lock: -Kan inte lÃ¥sa katalogen: -Error setting privilege: -Kan inte ange privilegie: -Error starting Volume Shadow Copy Service! -Kan inte starta 'Volume Shadow Copy Service'! -Error traversing directory: -Accessfel pÃ¥ katalog: -Error when monitoring directories. -Fel vid övervakning av kataloger. -Error writing file: -Kan inte skriva fil: -Error writing security context: -Kan inte skriva säkerhetskontext: -Error writing to synchronization database: -Kan inte skriva till databas: -Example -Exempel -Exclude -Undanta -Exclude all rows -Undanta alla rader -Exclude temporarily -Undanta tillfälligt -Exclude via filter: -Lägg till i undantag: -Exit instantly -Avsluta omedelbart -Extension -Filformat -External applications -Externa program -Fatal Error -Allvarligt fel -Feedback and suggestions are welcome at: -Feedback och förslag är välkommna här: -File %x has an invalid date! -Filen %x har ett ogiltigt datum! -File already exists. Overwrite? -Filen finns redan. Vill du skriva över: -File content -FilinnehÃ¥ll -File does not exist: -Filen finns inte: -File list exported! -Fillista exporterad! -File size and date -Filstorlek och datum -Filename -Filnamn -Files %x have the same date but a different size! -Filerna %x har samma datum men olika storlek! -Files are found equal if\n - file content\nis the same -Filerna betecknas som lika om, \n - filinnehÃ¥llet\när lika -Files are found equal if\n - filesize\n - last write time and date\nare the same -Filerna betecknas som lika om, \n - filstorlek\n - 'senast använd' och datum\när lika -Files that are equal on both sides -Filer som är lika pÃ¥ bÃ¥da sidor -Files that exist on both sides, left one is newer -Filer som finns pÃ¥ bÃ¥da sidor, vänster är nyare -Files that exist on both sides, right one is newer -Filer som finns pÃ¥ bÃ¥da sidor, höger är nyare -Files that have different content -Filer som har olika innehÃ¥ll -Files/folders that exist on left side only -Filer/kataloger som finns pÃ¥ vänster sida enbart -Files/folders that exist on right side only -Filer/kataloger som finns pÃ¥ höger sida enbart -Filter files -Undantag -Filter is active -Filter är aktiverat -Filter settings have changed! -Filterinställningar har ändrats! -Filter: All pairs -Filter: Generella undantag -Filter: Single pair -Filter: Enstaka undantag -Find -Sök -Find what: -Sök efter: -Folder Comparison and Synchronization -Katalogjämförelse och synkronisering -Folder pairs -Katalogpar -Follow -Följ -Free disk space available: -Ledigt diskutrymme: -Free disk space required: -Krav pÃ¥ ledigt diskutrymme: -FreeFileSync Batch Job -FreeFileSync Batch-jobb -FreeFileSync at Sourceforge -FreeFileSync pÃ¥ Sourceforge -FreeFileSync batch file -FreeFileSync batch-fil -FreeFileSync configuration -FreeFileSync konfiguration -FreeFileSync is up to date! -FreeFileSync är uppdaterad! -Full path -Fullständig sökväg -Generating database... -Skapar databas... -Generating file list... -Skapar fillista... -Global settings -Allmäna inställningar -Help -Hjälp -Hidden dialogs: -Dolda meddelanden: -Hide all error and warning messages -Visa inte fel- och varningsmeddelanden -Hide conflicts -Visa inte konflikter -Hide excluded items -Visa inte undantagna objekt -Hide files that are different -Visa inte filer som är olika -Hide files that are equal -Visa inte filer som är lika -Hide files that are newer on left -Visa inte filer som är nyare till vänster -Hide files that are newer on right -Visa inte filer som är nyare till höger -Hide files that exist on left side only -Visa inte filer som endast finns till vänster -Hide files that exist on right side only -Visa inte filer som endast finns till höger -Hide files that will be created on the left side -Visa inte filer som kommer att skapas pÃ¥ vänster sida -Hide files that will be created on the right side -Visa inte filer som kommer att skapas pÃ¥ höger sida -Hide files that will be deleted on the left side -Visa inte filer som kommer att tas bort pÃ¥ vänster sida -Hide files that will be deleted on the right side -Visa inte filer som kommer att tas bort pÃ¥ höger sida -Hide files that will be overwritten on left side -Visa inte filer som kommer att skrivas över pÃ¥ vänster sida -Hide files that will be overwritten on right side -Visa inte filer som kommer att skrivas över pÃ¥ höger sida -Hide files that won't be copied -Visa inte filer som som inte kopieras -Hide filtered or temporarily excluded files -Visa inte filtrerade eller temporärt undantagna filer -Hide further error messages during the current process -Dölj vidare felmeddelanden under aktuell process -Hints: -LedtrÃ¥d: -Homepage -Hemsida -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Identifiera och visa förändringar pÃ¥ bÃ¥da sidor via databas. Borttagningar och konflikter upptäcks automatiskt. -Idle time between detection of last change and execution of command line in seconds -Väntetid mellan upptäckt av senaste ändring och verkställande av kommando, i sekunder -If you like FFS -Om du gillar FFS -Ignore -Ignorera -Ignore errors -Ignorera fel -Ignore subsequent errors -Ignorera följdfel -Include -Inkludera -Include all rows -Inkludera alla rader -Include temporarily -Inkludera tillfälligt -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Inkludera: *.doc;*.zip;*.exe\nUndanta: \\stuff\\temp\\* -Incompatible synchronization database format: -Inkompatibelt databasformat: -Info -Info -Information -Information -Initial synchronization: -Initial synkronisering: -Integrate external applications into context menu. The following macros are available: -Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga: -Invalid FreeFileSync config file! -Felaktig FreeFileSync konfigurationsfil! -Last used configurations (press DEL to remove from list) -Senast använda konfigurationer (Tryck DEL för att ta bort) -Leave as unresolved conflict -Ignorera konflikt -Left -Vänster -Legend -Förklaring -Load configuration from file -Hämta inställningar frÃ¥n fil -Log-messages: -Log-meddelanden: -Logging -Loggar -Main bar -Huvudfält -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället! -Match case -Matcha gemener/VERSALER -Maximum number of logfiles: -Max antal loggfiler: -Memory allocation failed! -Minnesallokering misslyckades! -Minimum Idle Time [seconds] -Minsta ledig tid [sekunder] -Mirror ->> -Spegla ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Speglar säkerhetskopia av vänster katalog. Höger katalog ändras för att exakt matcha vänster efter synkroniseringen. -Monitoring active... -Övervakning aktiverad... -More than 50% of the total number of files will be copied or deleted! -mer än 50% av totalt filantal kommer att kopieras eller tas bort! -Move column down -Flytta ner kollumn -Move column up -Flytta upp kollumn -Move files into a time-stamped subdirectory -Flytta filer till en tidsstämplad underkatalog -Moving %x to Recycle Bin -Flyttar %x till papperskorgen -Moving Symbolic Link %x to user-defined directory %y -Flyttar symbolisk länk %x till användardefinierad plats %y -Moving file %x to user-defined directory %y -Flyttar %x till %y -Moving folder %x to user-defined directory %y -Flyttar %x till %y -Multiple... -Multipla... -No change since last synchronization! -Inga ändringar sedan senaste synkronisering! -No filter selected -Inga filter aktiverade -Not enough free disk space available in: -Ej tillräckligt ledigt diskutrymme pÃ¥: -Nothing to synchronize according to configuration! -Inget att synkronisera enligt aktuella inställningar! -Number of files and directories that will be created -Antal filer och kataloger som kommer att skapas -Number of files and directories that will be deleted -Antal filer och kataloger som kommer att tas bort -Number of files that will be overwritten -Antal filer som kommer att skrivas över -One of the FreeFileSync database entries within the following file is not yet existing: -Ett av FreeFileSyncs databasobjekt saknas i följande fil: -One of the FreeFileSync database files is not yet existing: -En av FreeFileSyncs databasfiler saknas: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -Endast filer/kataloger som kvarstÃ¥r efter filtrering, kommer att markeras för synkronisering. -Open with Explorer -Öppna katalog -Open with default application -Öppna med standardprogram -Operation aborted! -Processen avbruten! -Operation: -Arbetsuppgift: -Overview -Översikt -Overwriting Symbolic Link %x in %y -Skriver över symbolisk länk %x i %y -Overwriting file %x in %y -Skriver över fil %x i %y -Pause -Paus -Paused -Pausad -Planned directory deletion is in conflict with its subdirectories and -files! -Planerad katalogborttagning är i konflikt med sina underkataloger och filer -Please run a Compare first before synchronizing! -Du mÃ¥ste trycka \"Jämför\" innan du kan synkronisera. -Press \"Switch\" to open FreeFileSync GUI mode. -Tryck pÃ¥ \"Växla\" för att öppna FreeFileSyncs grafiska läge -Processing folder pair: -Processar katalogpar: -Published under the GNU General Public License: -Publiserad under GNU General Public License: -Question -FrÃ¥ga -RealtimeSync - Automated Synchronization -RealtimeSync - Automatiserad synkronisering -RealtimeSync configuration -RealtimeSync konfiguration -Recycle Bin not yet supported for this system! -Stödet för papperskorg finns ännu inte i detta system -Relative path -Sökväg -Remove alternate settings -Ta bort alternativa inställningar -Remove folder -Ta bort katalog -Remove folder pair -Ta bort katalogpar -Report translation error -Rapportera översättningsfel -Reset -Ã…terställ -Reset view -Ã…terställ vy -Restore all hidden dialogs? -Vill du Ã¥terställa alla dolda dialoger? -Right -Höger -S&ave configuration... -S¶ inställningar... -S&witch view -B&yt sida -Save changes to current configuration? -Vill du spara ändringarna i aktuella inställningar? -Save current configuration to file -Spara aktuella inställningar till fil -Scanning... -Skannar... -Scanning: -Skannar: -Select a folder -Markera en katalog -Select alternate synchronization settings -Välj alternativa synkroniseringsinställningar -Select logfile directory: -Välj loggfilskatalog: -Select variant: -Välj variant: -Select view -Välj vy -Set direction: -Ange riktning: -Setting default synchronization directions: Old files will be overwritten with newer files. -Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner. -Show \"%x\" -Visa \"%x\" -Show conflicts -Visa konflikter -Show files that are different -Visa filer som är olika -Show files that are equal -Visa filer som är lika -Show files that are newer on left -Visa filer som är nyare till vänster -Show files that are newer on right -Visa filer som är nyare till höger -Show files that exist on left side only -Visa filer som endast finns till vänster -Show files that exist on right side only -Visa filer som endast finns till höger -Show files that will be created on the left side -Visa filer som kommer att skapas till vänster -Show files that will be created on the right side -Visa filer som kommer att skapas till höger -Show files that will be deleted on the left side -Visa filer som kommer att tas bort till vänster -Show files that will be deleted on the right side -Visa filer som kommer att tas bort till höger -Show files that will be overwritten on left side -Visa filer som skrivas över till vänster -Show files that will be overwritten on right side -Visa filer som skrivas över till höger -Show files that won't be copied -Visa filer som inte kommer att kopieras -Show hidden dialogs -Visa dolda meddelanden -Show popup -Visa popups -Show popup on errors or warnings -Visa popup vid fel eller varningar -Significant difference detected: -Betydande skillnad upptäckt: -Silent mode -Tyst läge -Size -Storlek -Source code written completely in C++ utilizing: -Source code written completely in C++ utilizing: -Source directory does not exist anymore: -Källkatalogen finns inte längre: -Speed: -Hastighet: -Start -Start -Start minimized and write status information to a logfile -Starta minimerad och skriv statusinformation till en loggfil -Start synchronization -Starta synkronisering -Statistics -Statistik -Status feedback -Status -Stop -Stopp -Swap sides -Byt sida -Switching to FreeFileSync GUI mode... -Växlar till FreeFileSyncs grafiska läge -Symbolic Link handling -Hantering av Symboliska länkar -Symlinks %x have the same date but a different target! -Symbolisk länk %x har samma datum, men annat mÃ¥l! -Synchronization Preview -Förhandsvisning -Synchronization aborted! -Synkronisering avbruten! -Synchronization completed successfully! -Synkronisering slutförd! -Synchronization completed with errors! -Synkronisering slutförd med fel! -Synchronization settings -Synkroniseringsinställningar -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -Synkronisera alla filer, .doc, .zip och .exe men inga undermappar \"temp\". -Synchronize... -Synkronisera -Synchronizing... -Synkroniserar... -Target directory already existing! -MÃ¥lkatalogen finns redan! -Target file already existing! -Filen finns redan! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Kommandot verkställes när:\n- alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts)\n- filer i berörda kataloger eller underkataloger ändras -The file does not contain a valid configuration: -Filen är ingen giltig konfigureringsfil: -The file was not processed by last synchronization! -Filen bearbetades inte vid senaste synkroniseringen -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling. -Time -Tid -Time elapsed: -Förfluten tid: -Time remaining: -Kvarvarande tid: -Total amount of data that will be transferred -Total mängd data som kommer att överföras -Total time: -Total tid: -Transfer file and directory permissions\n(Requires Administrator rights) -Överför fil- och katalogrättigheter\n(Kräver administratörsrättigheter) -Unable to connect to sourceforge.net! -Kan inte ansluta sourceforge.net! -Unable to create logfile! -Kan inte skapa loggfil! -Unresolved conflicts existing! -Obehandlad konflikt upptäckt! -Update -> -Uppdatera -> -Updating attributes of %x -Uppdaterar attribut för %x -Usage: -Användning: -Use Recycle Bin -Använd papperskorgen -Use Recycle Bin when deleting or overwriting files -Use Volume Shadow Copy Service to copy locked or shared files -User-defined directory for deletion was not specified! -Katalog för borttagning ej specifiserad! -Variant -Variant -Verifying file %x -Verifierar %x -Versioning -Versionshantering -Volume name %x not part of filename %y! -Volymnamn %x saknas i filnamn %y! -Waiting for missing directories... -Väntar pÃ¥ saknade destinationer... -Waiting while directory is locked (%x)... -Väntar medan katalogen lÃ¥ses (%x)... -Warning -Varning -When the comparison is started with this option set the following decision tree is processed: -När jämförelse startas med detta alternativ aktiverat, processas följande beslutsträd: -You can ignore conflicts and continue synchronization. -Du kan ignorera konflikter och fortsätta synkroniseringen. -You can ignore this error to consider the directory as empty. -Du kan bortse frÃ¥n det här felet och utgÃ¥ ifrÃ¥n att katalogen är tom -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Du kan försöka synkronisera Ã¥terstÃ¥ende objekt igen (utan att trycka \"Jämför\")! -different -olika -file exists on both sides -Filen finns pÃ¥ bÃ¥da sidor -on one side only -endast pÃ¥ en sida +<header> + <language name>Svenska</language name> + <translator>Ã…ke Engelbrektson</translator> + <locale>sv_SE</locale> + <flag file>sweden.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Visa i Utforskaren</target> +<source>Open with default application</source> +<target>Öppna med standardprogram</target> +<source>Browse directory</source> +<target>Sök upp katalog</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Automatiserad synkronisering</target> +<source>Browse</source> +<target>Bläddra</target> +<source>Error resolving symbolic link:</source> +<target>Kan inte tyda symbolisk länk:</target> +<source>Select alternate synchronization settings</source> +<target>Välj alternativa synkroniseringsinställningar</target> +<source>No filter selected</source> +<target>Inga filter aktiverade</target> +<source>Filter is active</source> +<target>Filter är aktiverat</target> +<source>Clear filter settings</source> +<target>Rensa filterinställningar</target> +<source>Remove alternate settings</source> +<target>Ta bort alternativa inställningar</target> +<source>Create a batch job</source> +<target>Skapa ett batch-jobb</target> +<source>Synchronization settings</source> +<target>Synkroniseringsinställningar</target> +<source>Comparison settings</source> +<target>Jämförelseinställningar</target> +<source>About</source> +<target>Om</target> +<source>Error</source> +<target>Fel</target> +<source>Warning</source> +<target>Varning</target> +<source>Question</source> +<target>FrÃ¥ga</target> +<source>Confirm</source> +<target>Bekräfta</target> +<source>Configure filter</source> +<target>Filterinställningar</target> +<source>Customize columns</source> +<target>Anpassa kollumner</target> +<source>Global settings</source> +<target>Allmäna inställningar</target> +<source>Synchronization Preview</source> +<target>Förhandsvisning</target> +<source>Find</source> +<target>Sök</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Byte</pluralform> +<pluralform>%x Byte</pluralform> +</target> +<source><Symlink></source> +<target><Symboliska länkar></target> +<source><Directory></source> +<target><Katalog></target> +<source>Size</source> +<target>Storlek</target> +<source>Date</source> +<target>Datum</target> +<source>Full path</source> +<target>Fullständig sökväg</target> +<source>Filename</source> +<target>Filnamn</target> +<source>Relative path</source> +<target>Sökväg</target> +<source>Directory</source> +<target>Katalog</target> +<source>Extension</source> +<target>Filformat</target> +<source>Comparison Result</source> +<target>Jämförelseresultat</target> +<source>Incompatible synchronization database format:</source> +<target>Inkompatibelt databasformat:</target> +<source>Initial synchronization:</source> +<target>Initial synkronisering:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>En av FreeFileSyncs databasfiler saknas:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Ett av FreeFileSyncs databasobjekt saknas i följande fil:</target> +<source>Error reading from synchronization database:</source> +<target>Kan inte läsa frÃ¥n databasen:</target> +<source>An exception occurred!</source> +<target>Ett undantag inträffade!</target> +<source>Error deleting file:</source> +<target>Kan inte ta bort fil:</target> +<source>Error reading file attributes:</source> +<target>Kan inte läsa filattribut:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Väntar medan katalogen lÃ¥ses (%x)...</target> +<source>Error setting directory lock:</source> +<target>Kan inte lÃ¥sa katalogen:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 sek</pluralform> +<pluralform>%x sek</pluralform> +</target> +<source>Info</source> +<target>Info</target> +<source>Fatal Error</source> +<target>Allvarligt fel</target> +<source>File does not exist:</source> +<target>Filen finns inte:</target> +<source>Error parsing configuration file:</source> +<target>Kan inte läsa in konfigurationsfil:</target> +<source>Error writing file:</source> +<target>Kan inte skriva fil:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Felaktig FreeFileSync konfigurationsfil!</target> +<source>/sec</source> +<target>/s</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 timma</pluralform> +<pluralform>%x timmar</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 dag</pluralform> +<pluralform>%x dagar</pluralform> +</target> +<source>S&ave configuration...</source> +<target>S¶ inställningar...</target> +<source>&Load configuration...</source> +<target>&Hämta inställningar frÃ¥n fil...</target> +<source>&Quit</source> +<target>&Avsluta</target> +<source>&File</source> +<target>&Arkiv</target> +<source>&Content</source> +<target>&InnehÃ¥ll</target> +<source>&About...</source> +<target>&Om...</target> +<source>&Help</source> +<target>&Hjälp</target> +<source>Usage:</source> +<target>Användning:</target> +<source>1. Select directories to monitor.</source> +<target>1. Välj kataloger att övervaka.</target> +<source>2. Enter a command line.</source> +<target>2. Mata in ett kommando.</target> +<source>3. Press 'Start'.</source> +<target>3. Tryck 'Start'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Kommandot verkställes när: +- alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts) +- filer i berörda kataloger eller underkataloger ändras +</target> +<source>Directories to watch</source> +<target>Kataloger att övervaka</target> +<source>Add folder</source> +<target>Lägg till katalog</target> +<source>Remove folder</source> +<target>Ta bort katalog</target> +<source>Select a folder</source> +<target>Markera en katalog</target> +<source>Command line</source> +<target>Kommandofält</target> +<source>Minimum Idle Time [seconds]</source> +<target>Minsta ledig tid [sekunder]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Väntetid mellan upptäckt av senaste ändring och verkställande av kommando, i sekunder</target> +<source>Start</source> +<target>Start</target> +<source>(Build: %x)</source> +<target>(Bygge: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync konfiguration</target> +<source>File already exists. Overwrite?</source> +<target>Filen finns redan. Vill du skriva över:</target> +<source>&Restore</source> +<target>&Ã…terställ</target> +<source>&Exit</source> +<target>&Avsluta</target> +<source>Monitoring active...</source> +<target>Övervakning aktiverad...</target> +<source>Waiting for missing directories...</source> +<target>Väntar pÃ¥ saknade destinationer...</target> +<source>Command line is empty!</source> +<target>Kommandofältet är tomt</target> +<source>Could not initialize directory monitoring:</source> +<target>Kan inte initiera katalogskanner:</target> +<source>A directory input field is empty.</source> +<target>Ett katalogfält är tomt</target> +<source>Error when monitoring directories.</source> +<target>Fel vid övervakning av kataloger.</target> +<source>Drag && drop</source> +<target>Dra && släpp</target> +<source>Conversion error:</source> +<target>Konversionsfel:</target> +<source>Error moving file:</source> +<target>Kan inte flytta fil:</target> +<source>Operation aborted!</source> +<target>Processen avbruten!</target> +<source>Target file already existing!</source> +<target>Filen finns redan!</target> +<source>Error moving directory:</source> +<target>Kan inte flytta katalog:</target> +<source>Target directory already existing!</source> +<target>MÃ¥lkatalogen finns redan!</target> +<source>Error deleting directory:</source> +<target>Kan inte ta bort katalog:</target> +<source>Error changing modification time:</source> +<target>Kan inte modifiera tidsstämpel:</target> +<source>Error loading library function:</source> +<target>Kan inte starta biblioteksfunktion:</target> +<source>Error reading security context:</source> +<target>Kan inte läsa säkerhetskontext:</target> +<source>Error writing security context:</source> +<target>Kan inte skriva säkerhetskontext:</target> +<source>Error copying file permissions:</source> +<target>Kan inte kopiera filsystembehörighet:</target> +<source>Error creating directory:</source> +<target>Kan inte skapa katalog:</target> +<source>Error copying symbolic link:</source> +<target>Kan inte kopiera symbolisk länk:</target> +<source>Error copying file:</source> +<target>Kan inte kopiera fil:</target> +<source>Error opening file:</source> +<target>Kan inte öppna fil:</target> +<source>Error reading file:</source> +<target>Kan inte läsa fil:</target> +<source>Endless loop when traversing directory:</source> +<target>Oändlig loop vid accessförsök pÃ¥ katalog:</target> +<source>Error traversing directory:</source> +<target>Accessfel pÃ¥ katalog:</target> +<source>Error setting privilege:</source> +<target>Kan inte ange privilegie:</target> +<source>Error moving to Recycle Bin:</source> +<target>Kan inte flytta till papperskorgen:</target> +<source>Could not load a required DLL:</source> +<target>Kan inte läsa in nödvändig DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Kan inte skriva till databas:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Kan inte starta 'Volume Shadow Copy Service'!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället!</target> +<source>Could not determine volume name for file:</source> +<target>Kan inte bestämma volym för fil:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Volymnamn %x saknas i filnamn %y!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Kan inte läsa värden för följande XML-noder:</target> +<source>Show popup</source> +<target>Visa popups</target> +<source>Show popup on errors or warnings</source> +<target>Visa popup vid fel eller varningar</target> +<source>Ignore errors</source> +<target>Ignorera fel</target> +<source>Hide all error and warning messages</source> +<target>Visa inte fel- och varningsmeddelanden</target> +<source>Exit instantly</source> +<target>Avsluta omedelbart</target> +<source>Abort synchronization immediately</source> +<target>Avbryt synkronisering omedelbart</target> +<source>Logging</source> +<target>Loggar</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync batch-fil</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync konfiguration</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Batch-jobb</target> +<source>Unable to create logfile!</source> +<target>Kan inte skapa loggfil!</target> +<source>Batch execution</source> +<target>Batch-körning</target> +<source>Log-messages:</source> +<target>Log-meddelanden:</target> +<source>Stop</source> +<target>Stopp</target> +<source>Total time:</source> +<target>Total tid:</target> +<source>Synchronization aborted!</source> +<target>Synkronisering avbruten!</target> +<source>Synchronization completed with errors!</source> +<target>Synkronisering slutförd med fel!</target> +<source>Synchronization completed successfully!</source> +<target>Synkronisering slutförd!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>Tryck pÃ¥ "Växla" för att öppna FreeFileSyncs grafiska läge</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Växlar till FreeFileSyncs grafiska läge</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Kan inte ansluta sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>En nyare version av FreeFileSync finns tillgänglig:</target> +<source>Download now?</source> +<target>Ladda ner nu?</target> +<source>Information</source> +<target>Information</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync är uppdaterad!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Vill du att FreeFileSync skall söka efter uppdateringar varje vecka?</target> +<source>(Requires an Internet connection!)</source> +<target>(Kräver Internetuppkoppling!)</target> +<source>1. &Compare</source> +<target>1. &Jämför</target> +<source>2. &Synchronize...</source> +<target>2. &Synkronisera...</target> +<source>S&witch view</source> +<target>V&äxla sida</target> +<source>&New</source> +<target>&Nytt</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>&SprÃ¥k</target> +<source>&Global settings...</source> +<target>&Allmäna inställningar...</target> +<source>&Create batch job...</source> +<target>&Skapa batch-jobb...</target> +<source>&Export file list...</source> +<target>&Exportera fillista...</target> +<source>&Advanced</source> +<target>&Avancerat</target> +<source>&Check for new version</source> +<target>&Sök efter uppdatering</target> +<source>Compare</source> +<target>Jämför</target> +<source>Compare both sides</source> +<target>Jämför bÃ¥da sidor</target> +<source>&Abort</source> +<target>&Avbryt</target> +<source>Synchronize...</source> +<target>Synkronisera</target> +<source>Start synchronization</source> +<target>Starta synkronisering</target> +<source>Swap sides</source> +<target>Byt sida</target> +<source>Add folder pair</source> +<target>Lägg till katalogpar</target> +<source>Remove folder pair</source> +<target>Ta bort katalogpar</target> +<source>Save current configuration to file</source> +<target>Spara aktuella inställningar till fil</target> +<source>Load configuration from file</source> +<target>Hämta inställningar frÃ¥n fil</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target> +<source>Hide excluded items</source> +<target>Visa inte undantagna objekt</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Visa inte filtrerade eller temporärt undantagna filer</target> +<source>Number of files and directories that will be created</source> +<target>Antal filer och kataloger som kommer att skapas</target> +<source>Number of files that will be overwritten</source> +<target>Antal filer som kommer att skrivas över</target> +<source>Number of files and directories that will be deleted</source> +<target>Antal filer och kataloger som kommer att tas bort</target> +<source>Total amount of data that will be transferred</source> +<target>Total mängd data som kommer att överföras</target> +<source>Left</source> +<target>Vänster</target> +<source>Right</source> +<target>Höger</target> +<source>Batch job</source> +<target>Batch-jobb</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Montera en batch-fil för automatisk synkronisering. För att starta i batch-läge, lägg till filnamnet i startkommandot: FreeFileSync.exe <batch-fil>. Det kan ocksÃ¥ schemaläggas i Windows Schemaläggaren.</target> +<source>Help</source> +<target>Hjälp</target> +<source>Configuration overview:</source> +<target>Översikt:</target> +<source>Filter files</source> +<target>Undantag</target> +<source>Status feedback</source> +<target>Status</target> +<source>Silent mode</source> +<target>Tyst läge</target> +<source>Start minimized and write status information to a logfile</source> +<target>Starta minimerad och skriv statusinformation till en loggfil</target> +<source>Error handling</source> +<target>Felhantering</target> +<source>Overview</source> +<target>Översikt</target> +<source>Select logfile directory:</source> +<target>Välj loggfilskatalog:</target> +<source>Maximum number of logfiles:</source> +<target>Max antal loggfiler:</target> +<source>&Save</source> +<target>&Spara</target> +<source>&Load</source> +<target>&Läs in</target> +<source>&Cancel</source> +<target>&Avbryt</target> +<source>Elements found:</source> +<target>Funna poster:</target> +<source>Elements remaining:</source> +<target>Ã…terstÃ¥ende poster:</target> +<source>Speed:</source> +<target>Hastighet:</target> +<source>Time remaining:</source> +<target>Kvarvarande tid:</target> +<source>Time elapsed:</source> +<target>Förfluten tid:</target> +<source>Operation:</source> +<target>Arbetsuppgift:</target> +<source>Select variant:</source> +<target>Välj variant:</target> +<source><Automatic></source> +<target><Automatisk></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Identifiera och visa förändringar pÃ¥ bÃ¥da sidor via databas. Borttagningar och konflikter upptäcks automatiskt.</target> +<source>Mirror ->></source> +<target>Spegla ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Speglar säkerhetskopia av vänster katalog. Höger katalog ändras för att exakt matcha vänster efter synkroniseringen.</target> +<source>Update -></source> +<target>Uppdatera -></target> +<source>Copy new or updated files to right folder.</source> +<target>Kopiera nya och uppdaterade filer till höger katalog.</target> +<source>Custom</source> +<target>Anpassat</target> +<source>Configure your own synchronization rules.</source> +<target>Konfigurera dina egna synkroniseringsregler.</target> +<source>Deletion handling</source> +<target>Borttagning</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>Inställningar</target> +<source>Category</source> +<target>Kategori</target> +<source>Action</source> +<target>Aktivitet</target> +<source>Files/folders that exist on left side only</source> +<target>Filer/kataloger som finns pÃ¥ vänster sida enbart</target> +<source>Files/folders that exist on right side only</source> +<target>Filer/kataloger som finns pÃ¥ höger sida enbart</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Filer som finns pÃ¥ bÃ¥da sidor, vänster är nyare</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Filer som finns pÃ¥ bÃ¥da sidor, höger är nyare</target> +<source>Files that have different content</source> +<target>Filer som har olika innehÃ¥ll</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Konflikter/filer som inte kan kategoriseras</target> +<source>Compare by...</source> +<target>Jämför...</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Filerna betecknas som lika om, + - filstorlek + - 'senast ändrad' och datum +är lika +</target> +<source>File size and date</source> +<target>Filstorlek och datum</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filerna betecknas som lika om, + - filinnehÃ¥llet +är lika +</target> +<source>File content</source> +<target>FilinnehÃ¥ll</target> +<source>Symbolic Link handling</source> +<target>Hantering av Symboliska länkar</target> +<source>Synchronizing...</source> +<target>Synkroniserar...</target> +<source>Elements processed:</source> +<target>Processade poster</target> +<source>&Pause</source> +<target>&Paus</target> +<source>Compare by "File size and date"</source> +<target>Jämför: "Filstorlek och datum"</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>När jämförelse startas med detta alternativ aktiverat, processas följande beslutsträd:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Som ett resultat blir filerna separerade i följande kategorier:</target> +<source>- equal</source> +<target>- lika</target> +<source>- left newer</source> +<target>- vänster nyare</target> +<source>- right newer</source> +<target>- höger nyare</target> +<source>- exists left only</source> +<target>- finns endast till vänster</target> +<source>- exists right only</source> +<target>- finns endast till höger</target> +<source>- conflict</source> +<target>- konflikt</target> +<source>Compare by "File content"</source> +<target>Jämför: "FilinnehÃ¥ll"</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Som namnet antyder, tvÃ¥ filer med samma namn beräknas som lika, endast om dom har samma innehÃ¥ll. Den här funktionen är mer användbar för konsistenskontroll, snarare än säkerhetskopiering. Därför tas inte tidsattributen med i beräkningen. + +Med det här alternativet aktiverat, blir beslutsträdet mindre: +</target> +<source>- different</source> +<target>- olika</target> +<source>Source code written in C++ utilizing:</source> +<target>Källkod skriven i C++ med hjälp av:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Stort tack för översättningen av FreeFileSync gÃ¥r till:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Feedback och förslag är välkommna här:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync pÃ¥ Sourceforge</target> +<source>Homepage</source> +<target>Hemsida</target> +<source>If you like FFS</source> +<target>Om du gillar FFS</target> +<source>Donate with PayPal</source> +<target>Donera via PayPal</target> +<source>Email</source> +<target>e-post</target> +<source>Report translation error</source> +<target>Rapportera översättningsfel</target> +<source>Published under the GNU General Public License:</source> +<target>Publiserad under GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Ignorera följdfel</target> +<source>Hide further error messages during the current process</source> +<target>Dölj vidare felmeddelanden under aktuell process</target> +<source>&Ignore</source> +<target>&Ignorera</target> +<source>&Retry</source> +<target>&Försök igen</target> +<source>Do not show this dialog again</source> +<target>Visa inte den här dialogrutan igen</target> +<source>&Switch</source> +<target>&Växla</target> +<source>&Yes</source> +<target>&Ja</target> +<source>&No</source> +<target>&Nej</target> +<source>Delete on both sides</source> +<target>Ta bort pÃ¥ bÃ¥da sidor</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Ta bort pÃ¥ bÃ¥da sidor, även om filen är markerad pÃ¥ endast en sida</target> +<source>Use Recycle Bin</source> +<target>Använd papperskorgen</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Endast filer/kataloger som matchar alla filterinställningar, kommer att väljas ut för synkronisering +Notis: Namnfiltret mÃ¥ste specificeras relativt(!) till överordnade synkroniseringskataloger +</target> +<source>Hints:</source> +<target>Tips:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Ange fil- eller katalognamn separerade med "," eller ny rad</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. Använd jokertecknen '*' och '?' .</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Undanta filer direkt i huvudfönstret, via högerklicksmenyn.</target> +<source>Example</source> +<target>Exempel</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Inkludera: *.doc;*.zip;*.exe +Undanta: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Synkronisera alla .doc-, .zip- och .exe-filer, men utelämna allt i underkatalog "temp".</target> +<source>Include</source> +<target>Inkludera</target> +<source>Exclude</source> +<target>Undanta</target> +<source>Select time span:</source> +<target>Ange tidsspann:</target> +<source>Minimum file size:</source> +<target>Min. filstorlek:</target> +<source>Maximum file size:</source> +<target>Max. filstorlek:</target> +<source>&Default</source> +<target>&Standard</target> +<source>Move column up</source> +<target>Flytta upp kollumn</target> +<source>Move column down</source> +<target>Flytta ner kollumn</target> +<source>Copy locked files</source> +<target>Kopiera lÃ¥sta filer</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Kopiera delade eller lÃ¥sta filer med hjälp av Volume Shadow Copy Service +(Kräver administratörsrättighet) +</target> +<source>Copy filesystem permissions</source> +<target>Kopiera filsystembehörigheter</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Överför fil- och katalogrättigheter +(Kräver administratörsrättigheter) +</target> +<source>Hidden dialogs:</source> +<target>Dolda meddelanden:</target> +<source>Reset</source> +<target>Ã…terställ</target> +<source>Show hidden dialogs</source> +<target>Visa dolda meddelanden</target> +<source>External applications</source> +<target>Externa program</target> +<source>Description</source> +<target>Beskrivning</target> +<source>Variant</source> +<target>Variant</target> +<source>Statistics</source> +<target>Statistik</target> +<source>Find what:</source> +<target>Sök efter:</target> +<source>Match case</source> +<target>Matcha gemener/VERSALER</target> +<source>&Find next</source> +<target>&Sök nästa</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Du kan försöka synkronisera Ã¥terstÃ¥ende objekt igen (utan att trycka "Jämför")!</target> +<source>Batch file created successfully!</source> +<target>Batch-filen skapades korrekt!</target> +<source>Main bar</source> +<target>Huvudfält</target> +<source>Folder pairs</source> +<target>Katalogpar</target> +<source>Select view</source> +<target>Välj vy</target> +<source>Folder Comparison and Synchronization</source> +<target>Katalogjämförelse och synkronisering</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Stödet för papperskorg finns ännu inte i detta system</target> +<source>Set direction:</source> +<target>Ange riktning:</target> +<source>Exclude temporarily</source> +<target>Undanta tillfälligt</target> +<source>Include temporarily</source> +<target>Inkludera tillfälligt</target> +<source>Exclude via filter:</source> +<target>Lägg till i undantag:</target> +<source><multiple selection></source> +<target><flerval></target> +<source>D-Click</source> +<target>HÃ¥ll ner D</target> +<source>Copy to clipboard CTRL+C</source> +<target>Kopiera till urklipp CTRL+C</target> +<source>Delete files DEL</source> +<target>Ta bort filer DEL</target> +<source>Customize...</source> +<target>Anpassar...</target> +<source>Auto-adjust columns</source> +<target>Autojustera kollumner</target> +<source>Include all rows</source> +<target>Inkludera alla rader</target> +<source>Exclude all rows</source> +<target>Undanta alla rader</target> +<source>Reset view</source> +<target>Ã…terställ vy</target> +<source>Show "%x"</source> +<target>Visa "%x"</target> +<source><Last session></source> +<target><Senaste session></target> +<source>Configuration saved!</source> +<target>Inställningar sparade!</target> +<source>Save changes to current configuration?</source> +<target>Vill du spara ändringarna i aktuella inställningar?</target> +<source>Configuration loaded!</source> +<target>Inställningar inlästa!</target> +<source>Hide files that exist on left side only</source> +<target>Visa inte filer som endast finns till vänster</target> +<source>Show files that exist on left side only</source> +<target>Visa filer som endast finns till vänster</target> +<source>Hide files that exist on right side only</source> +<target>Visa inte filer som endast finns till höger</target> +<source>Show files that exist on right side only</source> +<target>Visa filer som endast finns till höger</target> +<source>Hide files that are newer on left</source> +<target>Visa inte filer som är nyare till vänster</target> +<source>Show files that are newer on left</source> +<target>Visa filer som är nyare till vänster</target> +<source>Hide files that are newer on right</source> +<target>Visa inte filer som är nyare till höger</target> +<source>Show files that are newer on right</source> +<target>Visa filer som är nyare till höger</target> +<source>Hide files that are equal</source> +<target>Visa inte filer som är lika</target> +<source>Show files that are equal</source> +<target>Visa filer som är lika</target> +<source>Hide files that are different</source> +<target>Visa inte filer som är olika</target> +<source>Show files that are different</source> +<target>Visa filer som är olika</target> +<source>Hide conflicts</source> +<target>Visa inte konflikter</target> +<source>Show conflicts</source> +<target>Visa konflikter</target> +<source>Hide files that will be created on the left side</source> +<target>Visa inte filer som kommer att skapas pÃ¥ vänster sida</target> +<source>Show files that will be created on the left side</source> +<target>Visa filer som kommer att skapas till vänster</target> +<source>Hide files that will be created on the right side</source> +<target>Visa inte filer som kommer att skapas pÃ¥ höger sida</target> +<source>Show files that will be created on the right side</source> +<target>Visa filer som kommer att skapas till höger</target> +<source>Hide files that will be deleted on the left side</source> +<target>Visa inte filer som kommer att tas bort pÃ¥ vänster sida</target> +<source>Show files that will be deleted on the left side</source> +<target>Visa filer som kommer att tas bort till vänster</target> +<source>Hide files that will be deleted on the right side</source> +<target>Visa inte filer som kommer att tas bort pÃ¥ höger sida</target> +<source>Show files that will be deleted on the right side</source> +<target>Visa filer som kommer att tas bort till höger</target> +<source>Hide files that will be overwritten on left side</source> +<target>Visa inte filer som kommer att skrivas över pÃ¥ vänster sida</target> +<source>Show files that will be overwritten on left side</source> +<target>Visa filer som skrivas över till vänster</target> +<source>Hide files that will be overwritten on right side</source> +<target>Visa inte filer som kommer att skrivas över pÃ¥ höger sida</target> +<source>Show files that will be overwritten on right side</source> +<target>Visa filer som skrivas över till höger</target> +<source>Hide files that won't be copied</source> +<target>Visa inte filer som som inte kopieras</target> +<source>Show files that won't be copied</source> +<target>Visa filer som inte kommer att kopieras</target> +<source>All directories in sync!</source> +<target>Alla kataloger synkade!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Du mÃ¥ste trycka "Jämför" innan du kan synkronisera.</target> +<source>Comma separated list</source> +<target>Komma-separerad lista</target> +<source>Legend</source> +<target>Förklaring</target> +<source>File list exported!</source> +<target>Fillista exporterad!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>Objektet borttaget!</pluralform> +<pluralform>%x objekt borttagna!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 katalog</pluralform> +<pluralform>%x kataloger</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 fil</pluralform> +<pluralform>%x filer</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x av 1 rad i vyn</pluralform> +<pluralform>%x av %y rader i vyn</pluralform> +</target> +<source>Scanning...</source> +<target>Skannar...</target> +<source>Comparing content...</source> +<target>Jämför innehÃ¥ll...</target> +<source>Paused</source> +<target>Pausad</target> +<source>Aborted</source> +<target>Användaren avbröt</target> +<source>Completed</source> +<target>Slutförd</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Avbryter: Väntar pÃ¥ att aktuell process skall slutföras...</target> +<source>Continue</source> +<target>Fortsätt</target> +<source>Pause</source> +<target>Paus</target> +<source>Cannot find %x</source> +<target>Kan inte hitta %x</target> +<source>DECISION TREE</source> +<target>BESLUTSTRÄD</target> +<source>file exists on both sides</source> +<target>Filen finns pÃ¥ bÃ¥da sidor</target> +<source>on one side only</source> +<target>endast pÃ¥ en sida</target> +<source>- left</source> +<target>- vänster</target> +<source>- right</source> +<target>- höger</target> +<source>different</source> +<target>olika</target> +<source>- conflict (same date, different size)</source> +<target>- konflikt (samma datum, olika storlek)</target> +<source>Inactive</source> +<target>Inaktiv</target> +<source>Second</source> +<target>Sekund</target> +<source>Minute</source> +<target>Minut</target> +<source>Hour</source> +<target>Timma</target> +<source>Day</source> +<target>Dag</target> +<source>Byte</source> +<target>Byte</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Filter: Generella undantag</target> +<source>Filter: Single pair</source> +<target>Filter: Enstaka undantag</target> +<source>Ignore</source> +<target>Ignorera</target> +<source>Direct</source> +<target>Direkt</target> +<source>Follow</source> +<target>Följ</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga:</target> +<source>- full file or directory name</source> +<target>- Full sökväg</target> +<source>- directory part only</source> +<target>- Endast fil-/katalognamn</target> +<source>- Other side's counterpart to %name</source> +<target>- Andra sidans motsvarighet till %name</target> +<source>- Other side's counterpart to %dir</source> +<target>- Andra sidans motsvarighet till %dir</target> +<source>Restore all hidden dialogs?</source> +<target>Vill du Ã¥terställa alla dolda dialoger?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Vill du verkligen flytta följande objekt till Papperskorgen?</pluralform> +<pluralform>Vill du verkligen flytta följande %x objekt till Papperskorgen?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Vill du verkligen ta bort följande objekt?</pluralform> +<pluralform>Vill du verkligen ta bort följande %x objekt?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Ignorera konflikt</target> +<source>Delete permanently</source> +<target>Ta bort permanent</target> +<source>Delete or overwrite files permanently</source> +<target>Ta bort eller skriv över permanent</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Use Volume Shadow Copy Service to copy locked or shared files</target> +<source>Versioning</source> +<target>Versionshantering</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Flytta filer till en tidsstämplad underkatalog</target> +<source>Cannot determine sync-direction:</source> +<target>Kan inte bestämma synk-riktning:</target> +<source>Filter settings have changed!</source> +<target>Filterinställningar har ändrats!</target> +<source>Both sides have changed since last synchronization!</source> +<target>BÃ¥da sidor har ändrats sedan senaste synkroniseringen!</target> +<source>No change since last synchronization!</source> +<target>Inga ändringar sedan senaste synkronisering!</target> +<source>The file was not processed by last synchronization!</source> +<target>Filen bearbetades inte vid senaste synkroniseringen</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Planerad katalogborttagning är i konflikt med sina underkataloger och filer</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.</target> +<source>The file does not contain a valid configuration:</source> +<target>Filen är ingen giltig konfigureringsfil:</target> +<source>Scanning:</source> +<target>Skannar:</target> +<source>Encoding extended time information: %x</source> +<target>Kodar utökad tidsinformation: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Du kan bortse frÃ¥n det här felet och utgÃ¥ ifrÃ¥n att katalogen är tom</target> +<source>Directory does not exist:</source> +<target>Katalogen finns inte:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target> +<source>Comparing content of files %x</source> +<target>Jämför filinnehÃ¥ll för %x</target> +<source>Memory allocation failed!</source> +<target>Minnesallokering misslyckades!</target> +<source>File %x has an invalid date!</source> +<target>Filen %x har ett ogiltigt datum!</target> +<source>Conflict detected:</source> +<target>Konflikt upptäckt:</target> +<source>Files %x have the same date but a different size!</source> +<target>Filerna %x har samma datum men olika storlek!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Symbolisk länk %x har samma datum, men annat mÃ¥l!</target> +<source>Comparing files by content failed.</source> +<target>Kunde inte jämföra filinnehÃ¥ll.</target> +<source>Generating file list...</source> +<target>Skapar fillista...</target> +<source>Multiple...</source> +<target>Multipla...</target> +<source>Files that are equal on both sides</source> +<target>Filer som är lika pÃ¥ bÃ¥da sidor</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Lika filer/kataloger som endast skiljer sig i attribut</target> +<source>Copy from right to left</source> +<target>Kopiera frÃ¥n höger till vänster</target> +<source>Copy from left to right</source> +<target>Kopiera frÃ¥n vänster till höger</target> +<source>Delete files/folders existing on left side only</source> +<target>Ta bort filer/kataloger som endast finns pÃ¥ vänster sida</target> +<source>Delete files/folders existing on right side only</source> +<target>Ta bort filer/kataloger som endast finns pÃ¥ höger sida</target> +<source>Copy from right to left overwriting</source> +<target>Kopiera frÃ¥n höger till vänster och skriv över mÃ¥let</target> +<source>Copy from left to right overwriting</source> +<target>Kopiera frÃ¥n vänster till höger och skriv över mÃ¥let</target> +<source>Do nothing</source> +<target>Gör ingenting</target> +<source>Copy attributes only from right to left</source> +<target>Kopiera attribut endast frÃ¥n höger till vänster</target> +<source>Copy attributes only from left to right</source> +<target>Kopiera attribut endast frÃ¥n vänster till höger</target> +<source>Deleting file %x</source> +<target>Tar bort filen %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Tar bort symbolisk länk %x</target> +<source>Deleting folder %x</source> +<target>Tar bort katalogen %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Flyttar %x till papperskorgen</target> +<source>Moving file %x to user-defined directory %y</source> +<target>Flyttar %x till %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>Flyttar %x till %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>Flyttar symbolisk länk %x till användardefinierad plats %y</target> +<source>Copying new file %x to %y</source> +<target>Kopierar ny fil %x till %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Kopierar ny symbolisk länk %x to %y</target> +<source>Overwriting file %x in %y</source> +<target>Skriver över fil %x i %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>Skriver över symbolisk länk %x i %y</target> +<source>Creating folder %x</source> +<target>Skapar katalog %x</target> +<source>Verifying file %x</source> +<target>Verifierar %x</target> +<source>Updating attributes of %x</source> +<target>Uppdaterar attribut för %x</target> +<source>Source directory does not exist anymore:</source> +<target>Källkatalogen finns inte längre:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Inget att synkronisera enligt aktuella inställningar!</target> +<source>Target directory name must not be empty!</source> +<target>MÃ¥lkatalogens namn mÃ¥ste anges</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Katalog för borttagning ej specifiserad!</target> +<source>Unresolved conflicts existing!</source> +<target>Obehandlad konflikt upptäckt!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Du kan ignorera konflikter och fortsätta synkroniseringen.</target> +<source>Significant difference detected:</source> +<target>Betydande skillnad upptäckt:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>mer än 50% av totalt filantal kommer att kopieras eller tas bort!</target> +<source>Not enough free disk space available in:</source> +<target>Ej tillräckligt ledigt diskutrymme pÃ¥:</target> +<source>Free disk space required:</source> +<target>Krav pÃ¥ ledigt diskutrymme:</target> +<source>Free disk space available:</source> +<target>Ledigt diskutrymme:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>En katalog som är en del av flera katalogpar kommer att ändras! Kontrollera synkroniseringsinställningarna</target> +<source>Processing folder pair:</source> +<target>Processar katalogpar:</target> +<source>Generating database...</source> +<target>Skapar databas...</target> +<source>Error copying locked file %x!</source> +<target>Kan inte kopiera lÃ¥st fil %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Verifikationsfel: Källfil och mÃ¥lfil har olika innehÃ¥ll!</target> diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index 65576d6e..1c520618 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -1,910 +1,1053 @@ - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE -%x / %y objects deleted successfully -%y ögeden %x tanesi sorunsuz silindi -%x Bytes -%x Bayt -%x GB -%x GB -%x MB -%x MB -%x PB -%x PB -%x TB -%x TB -%x day(s) -%x gün -%x directories -%x klasör -%x files -%x dosya -%x hour(s) -%x saat -%x kB -%x kB -%x min -%x dakika -%x of %y rows in view -%y satırın %x tanesi görüntüleniyor -%x of 1 row in view -1 satırın %x tanesi görüntüleniyor -%x sec -%x saniye -%x% -%x% -&Abort -V&azgeç -&About... -H&akkında... -&Advanced -&GeliÅŸmiÅŸ -&Cancel -Ä°&ptal -&Check for new version -Yeni &sürüm denetimi -&Content -İçe&rik -&Create batch job... -&Toplu komut iÅŸi oluÅŸtur... -&Default -&Varsayılan -&Exit -Çı&kış -&Export file list... -Dosya list&esini ver... -&File -&Dosya -&Find next -&Sonrakini bul -&Global settings... -&Genel ayarlar... -&Help -&Yardım -&Ignore -&Yoksay -&Language -Di&l -&Load -Yük&le -&Load configuration... -Yapılandırmayı a&l... -&New -Ye&ni -&No -&Hayır -&OK -&Tamam -&Pause -&Duraklat -&Program -&Program -&Quit -Çı&k -&Restore -Ge&ri yükle -&Retry -&Yeniden dene -&Save -&Kaydet -&Switch -&DeÄŸiÅŸtir -&Yes -&Evet -(Build: %x) -(Yapım: %x) -(Requires an Internet connection!) -(Ä°nternet baÄŸlantısı gereklidir!) -- Other side's counterpart to %dir -- %dir klasörünün diÄŸer taraftaki karşılığı -- Other side's counterpart to %name -- %name diÄŸer taraftaki karşılığı -- conflict -- tutarsızlık -- conflict (same date, different size) -- tutarsızlık (aynı tarih, farklı boyut) -- different -- farklı -- directory part only -- Yalnız klasör kısmı -- equal -- eÅŸit -- exists left only -- yalnız solda olan -- exists right only -- yalnız saÄŸda olan -- full file or directory name -- tam dosya ya da klasör adı -- left -- sol -- left newer -- soldaki daha yeni -- right -- saÄŸ -- right newer -- saÄŸdaki daha yeni -/sec -/san -1 directory -1 klasör -1 file -1 dosya -1. &Compare -1. &KarşılaÅŸtır -1. Enter relative file or directory names separated by ';' or a new line. -1. Bağıl dosya ya da klasör adlarını ';' ile ayırarak ya da ayrı satırlar ÅŸeklinde yazın. -1. Select directories to monitor. -1. Ä°zlenecek klasörleri seçin. -2. &Synchronize... -2. &EÅŸleÅŸtir... -2. Enter a command line. -2. Bir komut satırı yazın. -2. Use wildcard characters '*' and '?'. -2. '*' ve '?' jokerleri kullanılabilsin. -3. Exclude files directly on main grid via context menu. -3. Ana listedeki dosyaları saÄŸ fare tuÅŸu menüsüyle doÄŸrudan dışla. -3. Press 'Start'. -3. 'BaÅŸlat'a Tıklayın. -<Automatic> -<KendiliÄŸinden> -<Directory> -<Klasör> -<Last session> -<Önceki oturum> -<Symlink> -<SmblkbaÄŸlantı> -<multiple selection> -<çoklu seçim> -A directory input field is empty. -Bir klasör giriÅŸ alanı boÅŸ -A directory will be modified which is part of multiple folder pairs! Please review synchronization settings! -Çoklu klasör çiftlerinin bir parçası olduÄŸan bir klasör düzenlenecek! Lütfen eÅŸleÅŸtirme ayarlarınızı gözden geçirin! -A newer version of FreeFileSync is available: -FreeFileSync programının yeni bir sürümü yayınlanmış: -Abort requested: Waiting for current operation to finish... -Vazgeçildi: Yürürlükteki iÅŸlemin bitmesi bekleniyor... -Abort synchronization immediately -EÅŸleÅŸtirmeyi hemen bırak -Aborted -Vazgeçildi -About -Hakkında -Action -Ä°ÅŸlem -Add folder -Klasör ekle -Add folder pair -Klasör çifti ekle -All directories in sync! -Tüm klasörler eÅŸ! -An exception occurred! -OlaÄŸan dışı bir durum oluÅŸtu! -As a result the files are separated into the following categories: -Sonuç olarak dosyalar ÅŸu kategorilere göre ayrılır: -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: -Bu seçenekte, yalnızca aynı ada sahip iki dosyanın içeriÄŸi aynıysa eÅŸit olarak kabul edilirler. Bu seçenek yedekleme iÅŸlemlerinden daha çok, uyuÅŸma denetimi için yararlıdır. Bu yüzden dosya tarihleri hiç bir zaman dikkate alınmaz.\n\nBu seçenekle karşılaÅŸtırma yapıldığında, ÅŸu karar aÄŸacı iÅŸlenir: -Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. -KendiliÄŸinden eÅŸleÅŸtirme için bir toplu komut dosyası oluÅŸturabilirsiniz. Programı toplu komut kipinde baÅŸlatmak için, komut dosyasını FreeFileSync çalışan dosyasına parametre olarak ÅŸu ÅŸekilde ekleyerek çalıştırın: FreeFileSync.exe <Komut Dosyası Adı>. Ayrıca bu komut dosyasını iÅŸletim sistemindeki görev zamanlayıcı ile istediÄŸiniz zamanlarda da çalıştırabilirsiniz. -At least one directory input field is empty. -En az bir klasör giriÅŸ alanı boÅŸ. -Auto-adjust columns -Sütunları kendiliÄŸinden hizala -Batch execution -Toplu komut yürütme -Batch file created successfully! -Toplu komut dosyası sorunsuz oluÅŸturuldu! -Batch job -Toplu komut iÅŸi -Big thanks for localizing FreeFileSync goes out to: -FreeFileSync çevirisinden dolayı çok teÅŸekkürler: -Both sides have changed since last synchronization! -Son eÅŸleÅŸtirmeden bu yana iki yanın içeriÄŸi de deÄŸiÅŸmiÅŸ! -Browse -Gözat -Browse directory -Klasöre gözat -Cannot determine sync-direction: -EÅŸleÅŸtirme yönü belirlenemedi: -Cannot find %x -%x bulunamadı -Category -Kategori -Clear filter settings -Süzgeç ayarlarını temizle -Comma separated list -Virgül ile ayrılmış liste -Command line -Komut satırı -Command line is empty! -Komut satırı boÅŸ! -Compare -KarşılaÅŸtır -Compare both sides -Ä°ki tarafı da karşılaÅŸtır -Compare by \"File content\" -\"Dosya içeriÄŸi\"ne göre karşılaÅŸtırma -Compare by \"File size and date\" -\"Dosya boyutu ve tarihi\"ne göre karşılaÅŸtırma -Compare by... -KarşılaÅŸtırma ölçütünü seçin: -Comparing content of files %x -%x dosyalarının içeriÄŸi karşılaÅŸtırılıyor -Comparing content... -İçerik karşılaÅŸtırılıyor... -Comparing files by content failed. -Dosyaların içerikleri karşılaÅŸtırılamadı. -Comparison Result -KarşılaÅŸtırma sonucu -Comparison settings -KarşılaÅŸtırma ayarları -Completed -Tamamlandı -Configuration -Yapılandırma -Configuration loaded! -Yapılandırma yüklendi! -Configuration overview: -Yapılandırma özeti: -Configuration saved! -Yapılandırma kaydedildi! -Configure filter -Yapılandırma süzgeci -Configure your own synchronization rules. -Buradan kendi eÅŸleÅŸtirme kurallarınızı yapılandırabilirsiniz. -Confirm -DoÄŸrula -Conflict detected: -ÇeliÅŸki bulundu: -Conflicts/files that cannot be categorized -Kategorize edilemeyen tutarsızlıklar/dosyalar -Continue -Devam et -Conversion error: -Dönüştürme hatası: -Copy attributes only from left to right -Öznitelikleri yalnızca soldan saÄŸa kopyala -Copy attributes only from right to left -Öznitelikleri yalnızca saÄŸdan sola kopyala -Copy filesystem permissions -Dosya sistemi izinlerini de kopyala -Copy from left to right -Soldan saÄŸa kopyala -Copy from left to right overwriting -Soldan saÄŸa üzerine yazarak kopyala -Copy from right to left -SaÄŸdan sola kopyala -Copy from right to left overwriting -SaÄŸdan sola üzerine yazarak kopyala -Copy locked files -Kilitli dosyaları da kopyala -Copy new or updated files to right folder. -Yalnız yeni ya da güncellenmiÅŸ dosyalar soldan saÄŸa kopyalanır. -Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights) -Paylaşılmış ya da kilitli dosyaları Birim Gölge Kopya Hizmetini\n kullanarak kopyala (Yönetici izinlerine gerek duyar) -Copy to clipboard\tCTRL+C -Panoya kopyala\tCTRL+C -Copying new Symbolic Link %x to %y -Yeni sembolik baÄŸlantı %x %y üzerine kopyalanıyor -Copying new file %x to %y -Yeni dosya %x %y üzerine kopyalanıyor -Could not determine volume name for file: -Åžu dosya için birim adı belirlenemedi: -Could not initialize directory monitoring: -Klasör izlemesi baÅŸlatılamadı: -Could not load a required DLL: -Gerekli bir DLL yüklenemedi: -Could not read values for the following XML nodes: -Åžu XML düğümlerindeki deÄŸerler okunamadı: -Create a batch job -Toplu komut iÅŸi oluÅŸtur -Creating folder %x -%x klasörü oluÅŸturuluyor -Custom -Özel -Customize columns -Sütunları özelleÅŸtir -Customize... -ÖzelleÅŸtir... -D-Click -D-TuÅŸu -DECISION TREE -KARAR AÄžACI -Data verification error: Source and target file have different content! -Veri doÄŸrulama hatası: Kaynak ve hedef dosyası içeriÄŸi farklı! -Date -Tarih -Delete files/folders existing on left side only -Yalnız sol tarafta olan dosyaları/klasörleri sil -Delete files/folders existing on right side only -Yalnız saÄŸ tarafta olan dosyaları/klasörleri sil -Delete files\tDEL -Dosyaları sil\tDEL -Delete on both sides -Her iki yandakini de sil -Delete on both sides even if the file is selected on one side only -Dosya yalnız bir tarafta seçili olsa bile her iki yandakini de sil -Delete or overwrite files permanently -Dosyaları kalıcı olarak siler ya da üzerine yazar -Delete permanently -Kalıcı olarak sil -Deleting Symbolic Link %x -%z sembolik baÄŸlantısı siliniyor -Deleting file %x -%x dosyası siliniyor -Deleting folder %x -%x klasörü siliniyor -Deletion handling -Silme eyleminde: -Description -Açıklama -Direct -DoÄŸrudan -Directories are dependent! Be careful when setting up synchronization rules: -Klasörler bağımlı! EÅŸleÅŸtirme kurallarını koyarken dikkatli olun: -Directories to watch -Ä°zlenecek klasörler -Directory -Klasör -Directory does not exist: -Klasör bulunamadı: -Do not show this dialog again -Bu iletiyi yeniden gösterme -Do nothing -Hiçbir ÅŸey yapma -Do you really want to delete the following object(s)? -Gerçekten ÅŸu ögeleri silmek istiyor musunuz? -Do you really want to move the following object(s) to the Recycle Bin? -Gerçekten ÅŸu ögeleri Geri Dönüşüm Kutusu'na atmak istiyor musunuz? -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz? -Donate with PayPal -PayPal ile bağış yapın -Download now? -Åžimdi indir? -Drag && drop -Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz -Elements found: -Bulunan bileÅŸenler: -Elements processed: -Ä°ÅŸlenen bileÅŸenler: -Elements remaining: -Kalan bileÅŸenler: -Email -E-posta -Encoding extended time information: %x -Uzatılmış zaman bilgisi kodlanıyor: %x -Endless loop when traversing directory: -Klasörlerde dolaşırken sonsuz döngü: -Equal files/folders that differ in attributes only -Yalnızca öznitelikleri farklı olan dosya ya da klasörleri eÅŸitle -Error -Hata -Error changing modification time: -DeÄŸiÅŸiklik tarihini deÄŸiÅŸtirirken hata: -Error copying file permissions: -Dosya izinleri kopyalanırken hata: -Error copying file: -Dosya kopyalanırken hata: -Error copying locked file %x! -Kilitli dosya %x kopyalanırken hata! -Error copying symbolic link: -Sembolik baÄŸlantı kopyalanırken hata: -Error creating directory: -Klasör oluÅŸturulurken hata: -Error deleting directory: -Klasör silinirken hata: -Error deleting file: -Dosya silinirken hata: -Error handling -Hata olduÄŸunda: -Error loading library function: -Kütüphane iÅŸlevi yüklenirken hata: -Error moving directory: -Klasör taşınırken hata: -Error moving file: -Dosya taşınırken hata: -Error moving to Recycle Bin: -Geri Dönüşüm Kutusu'na atılırken hata: -Error opening file: -Dosya açılırken hata: -Error parsing configuration file: -Yapılandırma dosyası çözümlenirken hata: -Error reading file attributes: -Dosya öznitelikleri okunurken hata: -Error reading file: -Dosya okunurken hata: -Error reading from synchronization database: -EÅŸleÅŸtirme veri tabanı okunurken hata: -Error reading security context: -Güüvenlik baÄŸlamı okunurken hata: -Error resolving symbolic link: -Sembolik baÄŸlantı çözümlenirken hata: -Error setting directory lock: -Klasör kilitlenirken hata: -Error setting privilege: -Ä°zinler ayarlanırken hata: -Error starting Volume Shadow Copy Service! -Birim Gölge Kopya hizmeti baÅŸlatılırken hata! -Error traversing directory: -Klasörde dolaşırken hata: -Error when monitoring directories. -Klasörler izlenirken hata. -Error writing file: -Dosya yazılırken hata: -Error writing security context: -Güvenlik baÄŸlamı yazılırken hata: -Error writing to synchronization database: -EÅŸleÅŸtirme veri tabanına yazılırken hata: -Example -Örnek -Exclude -Dışlanacaklar: -Exclude all rows -Tüm satırları dışla -Exclude temporarily -Geçici olarak dışla -Exclude via filter: -Süzerek dışarda bırak: -Exit instantly -Hemen çık -Extension -Uzantı -External applications -Dış uygulamalar -Fatal Error -Ölümcül Hata -Feedback and suggestions are welcome at: -Geri bildirim ve önerileriniz için: -File %x has an invalid date! -%x dosyasının tarihi geçersiz! -File already exists. Overwrite? -Dosya zaten var. Ãœzerine yazılsın mı? -File content -Dosya içeriÄŸi -File does not exist: -Dosya bulunamadı: -File list exported! -Dosya listesi verilmiÅŸ! -File size and date -Dosya boyutu ve tarihi -Filename -Dosya adı -Files %x have the same date but a different size! -%x dosyalarının tarihleri aynı fakat boyutları farklı! -Files are found equal if\n - file content\nis the same -EÅŸit dosyalar aranırken\n - dosya içeriÄŸi\naynı olanlara bakılır -Files are found equal if\n - filesize\n - last write time and date\nare the same -EÅŸit dosyalar aranırken\n - dosya boyutu\n - son kayıt zamanı ve tarihi\naynı olanlara bakılır -Files that are equal on both sides -Her iki yanda da eÅŸit olan dosyalar -Files that exist on both sides, left one is newer -Her iki yanda da bulunup, solda daha yeni olan dosyalar -Files that exist on both sides, right one is newer -Her iki yanda da bulunup, saÄŸda daha yeni olan dosyalar -Files that have different content -Farklı içeriÄŸe sahip dosyalar -Files/folders that exist on left side only -Yalnız sol yanda bulunan dosya ve klasörler -Files/folders that exist on right side only -Yalnız saÄŸ yanda bulunan dosya ve klasörler -Filter files -Dosya süzgeci -Filter is active -Etkin süzgeç -Filter settings have changed! -Süzgeç ayarları deÄŸiÅŸtirildi! -Filter: All pairs -Süzgeç: Tüm çiftler -Filter: Single pair -Süzgeç: Tek çift -Find -Bul -Find what: -Aranacak: -Folder Comparison and Synchronization -Klasör KarşılaÅŸtırma ve EÅŸleÅŸtirme -Folder pairs -Klasör çiftleri -Follow -Ä°zle -Free disk space available: -Kullanılabilir disk alanı: -Free disk space required: -Gereken boÅŸ disk alanı: -FreeFileSync Batch Job -FreeFileSync Toplu Komut Ä°ÅŸi -FreeFileSync at Sourceforge -Sourceforge sitesinde FreeFileSync -FreeFileSync batch file -FreeFileSync toplu komut dosyası -FreeFileSync configuration -FreeFileSync yapılandırması -FreeFileSync is up to date! -FreeFileSync güncel! -Full path -Tam yol -Generating database... -Veri tabanı oluÅŸturuluyor... -Generating file list... -Dosya listesi oluÅŸturuluyor... -Global settings -Genel ayarlar -Help -Yardım -Hidden dialogs: -GizlenmiÅŸ iletiler: -Hide all error and warning messages -Tüm hata ve uyarı iletilerini gizler -Hide conflicts -ÇeliÅŸkileri gizle -Hide excluded items -Dışlanan ögeleri gizle -Hide files that are different -Farklı olan dosyaları gizle -Hide files that are equal -EÅŸit olan dosyaları gizle -Hide files that are newer on left -Solda daha yeni olan dosyaları gizle -Hide files that are newer on right -SaÄŸda daha yeni olan dosyaları gizle -Hide files that exist on left side only -Yalnız sol yanda bulunan dosyaları gizle -Hide files that exist on right side only -Yalnız saÄŸ yanda bulunan dosyaları gizle -Hide files that will be created on the left side -Sol yanda oluÅŸturulacak dosyaları gizle -Hide files that will be created on the right side -SaÄŸ yanda oluÅŸturulacak dosyaları gizle -Hide files that will be deleted on the left side -Sol yanda silinecek dosyaları gizle -Hide files that will be deleted on the right side -SaÄŸ yanda silinecek dosyaları gizle -Hide files that will be overwritten on left side -Sol yanda üzerine yazılacak dosyaları gizle -Hide files that will be overwritten on right side -SaÄŸ yanda üzerine yazılacak dosyaları gizle -Hide files that won't be copied -Kopyalanmayacak dosyaları gizle -Hide filtered or temporarily excluded files -Süzülmüş ya da geçici olarak dışlanmış dosyaları gizle -Hide further error messages during the current process -Yürürlükteki iÅŸlem boyunca baÅŸka hata iletisi gösterme -Hints: -Ä°puçları: -Homepage -Ana sayfa -Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically. -Bir veritabanı kullanarak iki yandaki deÄŸiÅŸiklikleri belirler ve günceller. Silinme ve tutarsızlıklar kendiliÄŸinden algılanır. -Idle time between detection of last change and execution of command line in seconds -Son deÄŸiÅŸikliÄŸin algılanması ile komut satırının yürütülmesi arasındaki bekleme süresi -If you like FFS -FFS’i beÄŸendiyseniz -Ignore -Yoksay -Ignore errors -Hataları yoksay -Ignore subsequent errors -Sonraki hataları yoksay -Include -Katılacaklar: -Include all rows -Tüm satırları kat -Include temporarily -Geçici olarak kat -Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\* -Kat: *.doc;*.zip;*.exe\nDışla: \\stuff\\temp\\* -Incompatible synchronization database format: -Uyumsuz eÅŸleÅŸtirme veritabanı biçimi: -Info -Bilgi -Information -Bilgi -Initial synchronization: -BaÅŸlangıç eÅŸleÅŸtirmesi: -Integrate external applications into context menu. The following macros are available: -Dış uygulamaları saÄŸ tuÅŸ menüsüne ekler. Åžu makrolar kullanılabilir: -Invalid FreeFileSync config file! -Geçersiz FreeFileSync yapılandırma dosyası! -Last used configurations (press DEL to remove from list) -Son kullanılan yapılandırmalar (listeden silmek için DEL tuÅŸuna basın) -Leave as unresolved conflict -ÇözülmemiÅŸ tutarsızlık olarak bırak -Left -Sol -Legend -Gösterge -Load configuration from file -Dosyadan yapılandırmayı yükle -Log-messages: -Günlük iletileri: -Logging -Günlükleme -Main bar -Ana çubuk -Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version. -WOW64 üzerinde gölge kopyalama desteklenmiyor. FreeFileSync 64-bit sürümünü kullanın -Match case -Büyük/küçük harf uydur -Maximum number of logfiles: -En fazla günlük dosyası sayısı: -Memory allocation failed! -Bellek ayrılamadı! -Minimum Idle Time [seconds] -En az boÅŸta bekleme süresi [saniye] -Mirror ->> -Yansı ->> -Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -Sol klasörün yansı yedeÄŸi. EÅŸleÅŸtirmeden sonra saÄŸ klasör, sol klasörün tamamen aynısı olacak. -Monitoring active... -Ä°zleme etkin... -More than 50% of the total number of files will be copied or deleted! -Dosyaların yarıdan fazlası kopyalanacak ya da silinecek! -Move column down -Sütunu aÅŸağı taşı -Move column up -Sütunu yukarı taşı -Move files into a time-stamped subdirectory -Dosyaları zaman damgasıyla bir alt klasöre taşır -Moving %x to Recycle Bin -%x Geri Dönüşüm Kutusu'na atılıyor -Moving Symbolic Link %x to user-defined directory %y -%x sembolik baÄŸlantısı kullanıcının belirttiÄŸi %y klasörüne taşınıyor -Moving file %x to user-defined directory %y -%x dosyası kullanıcının tanımladığı %y klasörüne taşınıyor -Moving folder %x to user-defined directory %y -%x klasörü kullanıcının tanımladığı %y klasörüne taşınıyor -Multiple... -Çoklu... -No change since last synchronization! -Son eÅŸleÅŸtirmeden bu yana deÄŸiÅŸik olmamış! -No filter selected -Hiç süzgeç seçilmedi -Not enough free disk space available in: -Åžurada yeterli disk alanı yok : -Nothing to synchronize according to configuration! -Yapılandırmaya göre eÅŸleÅŸtirilecek bir ÅŸey yok! -Number of files and directories that will be created -OluÅŸturulacak dosya ve klasör sayısı -Number of files and directories that will be deleted -Silinecek dosya ve klasör sayısı -Number of files that will be overwritten -Ãœzerine yazılacak dosya sayısı -One of the FreeFileSync database entries within the following file is not yet existing: -Åžu dosyadaki FreeFileSync veritabanı kayıtlarından biri henüz yok: -One of the FreeFileSync database files is not yet existing: -FreeFileSync veritabanı dosyalarından biri henüz yok: -Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories. -EÅŸleÅŸtirme için yalnız süzgeçten geçen dosya ve klasörler seçilir. Süzgeç, temel eÅŸleÅŸtirme klasörlerine adlarla iliÅŸkili olarak uygulanır. -Open with Explorer -Gezgin ile aç -Open with default application -Varsayılan uygulama ile aç -Operation aborted! -Ä°ÅŸlemden vazgeçildi! -Operation: -Ä°ÅŸlem: -Overview -Özet -Overwriting Symbolic Link %x in %y -%y içindeki %x sembolik baÄŸlantısının üzerine yazılıyor -Overwriting file %x in %y -%y içindeki %x dosyasının üzerine yazılıyor -Pause -Duraklat -Paused -Duraklatıldı -Planned directory deletion is in conflict with its subdirectories and -files! -Planlanmış klasörün silinmesi alt klasör ve dosyalarıyla çeliÅŸiyor! -Please run a Compare first before synchronizing! -Lütfen eÅŸleÅŸtirmeden önce karşılaÅŸtırma yapın! -Press \"Switch\" to open FreeFileSync GUI mode. -FreeFileSync grafik kullanıcı arayüzünü açmak için \"Geç\" düğmesine tıklayın -Processing folder pair: -Ä°ÅŸlenen klasör çifti: -Published under the GNU General Public License: -GNU Genel Kamu Lisansına ÅŸartları altında yayınlanmıştır: -Question -Soru -RealtimeSync - Automated Synchronization -RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme -RealtimeSync configuration -RealtimeSync yapılandırması -Recycle Bin not yet supported for this system! -Geri Dönüşüm Kutusu bu sistemde desteklenmiyor! -Relative path -Bağıl klasör yolu -Remove alternate settings -Alternatif ayarları sil -Remove folder -Klasörü sil -Remove folder pair -Klasör çiftini sil -Report translation error -Çeviri hatasını bildir -Reset -Sıfırla -Reset view -Görünümü sıfırla -Restore all hidden dialogs? -Tüm gizlenmiÅŸ iletiler gösterilsin mi? -Right -SaÄŸ -S&ave configuration... -Y&apılandırmayı kaydet... -S&witch view -Orta görünümü &deÄŸiÅŸtir -Save changes to current configuration? -DeÄŸiÅŸiklikleri ÅŸu anki yapılandırmaya kaydetmek ister misiniz? -Save current configuration to file -Geçerli yapılandırmayı dosyaya kaydet -Scanning... -Taranıyor... -Scanning: -Taranıyor: -Select a folder -Bir klasör seçin -Select alternate synchronization settings -Alternatif eÅŸleÅŸtirme ayarlarını seçin -Select logfile directory: -Kayıt dosyası klasörünü seçin: -Select variant: -DeÄŸiÅŸkeni seçin: -Select view -Görünümü seçin -Set direction: -Yönü seçin: -Setting default synchronization directions: Old files will be overwritten with newer files. -Varsayılan eÅŸleÅŸtirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak. -Show \"%x\" -\"%x\" panelini göster -Show conflicts -ÇeliÅŸkileri göster -Show files that are different -Farklı olan dosyaları göster -Show files that are equal -EÅŸit olan dosyaları göster -Show files that are newer on left -Solda daha yeni olan dosyaları göster -Show files that are newer on right -SaÄŸda daha yeni olan dosyaları göster -Show files that exist on left side only -Yalnız sol tarafta bulunan dosyaları göster -Show files that exist on right side only -Yalnız saÄŸ tarafta bulunan dosyaları göster -Show files that will be created on the left side -Yalnız sol tarafta oluÅŸturulacak dosyaları göster -Show files that will be created on the right side -Yalnız saÄŸ tarafta oluÅŸturulacak dosyaları göster -Show files that will be deleted on the left side -Yalnız sol tarafta silinecek dosyaları göster -Show files that will be deleted on the right side -Yalnız saÄŸ tarafta silinecek dosyaları göster -Show files that will be overwritten on left side -Yalnız sol tarafta üzerine yazılacak dosyaları göster -Show files that will be overwritten on right side -Yalnız saÄŸ tarafta üzerine yazılacak dosyaları göster -Show files that won't be copied -Kopyalanmayacak dosyaları göster -Show hidden dialogs -GizlenmiÅŸ iletileri göster -Show popup -Açılır pencerede göster -Show popup on errors or warnings -Hata ve uyarıları açılır bir pencerede gösterir -Significant difference detected: -Önemli fark saptandı: -Silent mode -Sessiz kip -Size -Boyut -Source code written completely in C++ utilizing: -Kaynak kod tümüyle C++ kullanılarak yazıldı: -Source directory does not exist anymore: -Kaynak klasör artık yok: -Speed: -Hız: -Start -BaÅŸla -Start minimized and write status information to a logfile -Simge durumuna küçültülmüş olarak baÅŸlat ve durum bilgisini günlük dosyasına yaz -Start synchronization -EÅŸleÅŸtirmeyi baÅŸlat -Statistics -Ä°statistikler -Status feedback -Durum geri bildirimi -Stop -Durdur -Swap sides -SaÄŸ ve sol yanı deÄŸiÅŸtir -Switching to FreeFileSync GUI mode... -FreeFileSync grafik kullanıcı arayüzüne geçiliyor... -Symbolic Link handling -Sembolik baÄŸlantı iÅŸleme -Symlinks %x have the same date but a different target! -Sembolik baÄŸlantılar %x aynı tarihli fakat hedefleri farklı! -Synchronization Preview -EÅŸleÅŸtirme önizlemesi -Synchronization aborted! -EÅŸleÅŸtirme durduruldu! -Synchronization completed successfully! -EÅŸleÅŸtirme sorunsuz tamamlandı! -Synchronization completed with errors! -EÅŸleÅŸtirme hatalarla tamamlandı! -Synchronization settings -EÅŸleÅŸtirme ayarları -Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\". -\"temp\" alt klasöründeki herÅŸey hariç, tüm .doc, .zip ve .exe dosyalarını eÅŸleÅŸtir. -Synchronize... -EÅŸleÅŸtir... -Synchronizing... -EÅŸleÅŸtiriliyor... -Target directory already existing! -Hedef klasör zaten var! -Target file already existing! -Hedef dosya zaten var! -The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified -Her seferinde çalıştırılacak komut satırı:\n- tüm klasörler geçerli (örneÄŸin USB bellek takıldığında)\n- bu klasörlerin ya da alt klasörlerin içindeki dosyalar deÄŸiÅŸtirildiÄŸinde -The file does not contain a valid configuration: -Dosya geçerli bir yapılandırma içermiyor: -The file was not processed by last synchronization! -Dosya son eÅŸleÅŸtirmede iÅŸlenmemiÅŸ! -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. -Bu seçenek, aynı adlı iki dosyanın, aynı boyuta ve aynı son deÄŸiÅŸiklik tarihine sahip olması durumunda eÅŸit olması anlamına gelir. -Time -Zaman -Time elapsed: -Geçen zaman: -Time remaining: -Kalan zaman: -Total amount of data that will be transferred -Aktarılacak toplam veri miktarı -Total time: -Toplam zaman: -Transfer file and directory permissions\n(Requires Administrator rights) -Dosya ve klasör izinlerini de aktar\n(Yönetici izinlerine gerek duyar) -Unable to connect to sourceforge.net! -sourceforge.net sitesine baÄŸlanılamıyor! -Unable to create logfile! -Günlük dosyası oluÅŸturulamıyor! -Unresolved conflicts existing! -ÇözülmemiÅŸ tutarsızlıklar var! -Update -> -Güncelle -> -Updating attributes of %x -%x öznitelikleri güncelleniyor -Usage: -Kullanım: -Use Recycle Bin -Geri Dönüşüm Kutusu'nu kullan -Use Recycle Bin when deleting or overwriting files -Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır -User-defined directory for deletion was not specified! -Silme için kullanıcının belirttiÄŸi dizin belirtilmemiÅŸ! -Variant -DeÄŸiÅŸken -Verifying file %x -%x dosyası doÄŸrulanıyor -Versioning -Sürümlendirme -Volume name %x not part of filename %y! -%x birim adı, %y dosya adının parçası deÄŸil! -Waiting for missing directories... -Kayıp klasörler için bekleniyor... -Waiting while directory is locked (%x)... -Klasör kilitli olduÄŸundan bekleniyor (%x)... -Warning -Uyarı -When the comparison is started with this option set the following decision tree is processed: +<header> + <language name>Türkçe</language name> + <translator>Kaya Zeren</translator> + <locale>tr_TR</locale> + <flag file>turkey.png</flag file> + <plural forms>2</plural forms> + <plural definition>n == 1 ? 0 : 1</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Tarayıcıda Göster</target> +<source>Open with default application</source> +<target>Varsayılan uygulama ile aç</target> +<source>Browse directory</source> +<target>Klasöre gözat</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme</target> +<source>Browse</source> +<target>Gözat</target> +<source>Error resolving symbolic link:</source> +<target>Sembolik baÄŸlantı çözümlenirken hata:</target> +<source>Select alternate synchronization settings</source> +<target>Alternatif eÅŸleÅŸtirme ayarlarını seçin</target> +<source>No filter selected</source> +<target>Hiç süzgeç seçilmedi</target> +<source>Filter is active</source> +<target>Etkin süzgeç</target> +<source>Clear filter settings</source> +<target>Süzgeç ayarlarını temizle</target> +<source>Remove alternate settings</source> +<target>Alternatif ayarları sil</target> +<source>Create a batch job</source> +<target>Toplu komut iÅŸi oluÅŸtur</target> +<source>Synchronization settings</source> +<target>EÅŸleÅŸtirme ayarları</target> +<source>Comparison settings</source> +<target>KarşılaÅŸtırma ayarları</target> +<source>About</source> +<target>Hakkında</target> +<source>Error</source> +<target>Hata</target> +<source>Warning</source> +<target>Uyarı</target> +<source>Question</source> +<target>Soru</target> +<source>Confirm</source> +<target>DoÄŸrula</target> +<source>Configure filter</source> +<target>Yapılandırma süzgeci</target> +<source>Customize columns</source> +<target>Sütunları özelleÅŸtir</target> +<source>Global settings</source> +<target>Genel ayarlar</target> +<source>Synchronization Preview</source> +<target>EÅŸleÅŸtirme önizlemesi</target> +<source>Find</source> +<target>Bul</target> +<source>%x MB</source> +<target>%x MB</target> +<source>%x KB</source> +<target>%x KB</target> +<source>%x GB</source> +<target>%x GB</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>1 Bayt</pluralform> +<pluralform>%x Bayt</pluralform> +</target> +<source><Symlink></source> +<target><SmblkbaÄŸlantı></target> +<source><Directory></source> +<target><Klasör></target> +<source>Size</source> +<target>Boyut</target> +<source>Date</source> +<target>Tarih</target> +<source>Full path</source> +<target>Tam yol</target> +<source>Filename</source> +<target>Dosya adı</target> +<source>Relative path</source> +<target>Bağıl klasör yolu</target> +<source>Directory</source> +<target>Klasör</target> +<source>Extension</source> +<target>Uzantı</target> +<source>Comparison Result</source> +<target>KarşılaÅŸtırma sonucu</target> +<source>Incompatible synchronization database format:</source> +<target>Uyumsuz eÅŸleÅŸtirme veritabanı biçimi:</target> +<source>Initial synchronization:</source> +<target>BaÅŸlangıç eÅŸleÅŸtirmesi:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>FreeFileSync veritabanı dosyalarından biri henüz yok:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>Åžu dosyadaki FreeFileSync veritabanı kayıtlarından biri henüz yok:</target> +<source>Error reading from synchronization database:</source> +<target>EÅŸleÅŸtirme veri tabanı okunurken hata:</target> +<source>An exception occurred!</source> +<target>OlaÄŸan dışı bir durum oluÅŸtu!</target> +<source>Error deleting file:</source> +<target>Dosya silinirken hata:</target> +<source>Error reading file attributes:</source> +<target>Dosya öznitelikleri okunurken hata:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>Klasör kilitli olduÄŸundan bekleniyor (%x)...</target> +<source>Error setting directory lock:</source> +<target>Klasör kilitlenirken hata:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>1 saniye</pluralform> +<pluralform>%x saniye</pluralform> +</target> +<source>Info</source> +<target>Bilgi</target> +<source>Fatal Error</source> +<target>Ölümcül Hata</target> +<source>File does not exist:</source> +<target>Dosya bulunamadı:</target> +<source>Error parsing configuration file:</source> +<target>Yapılandırma dosyası çözümlenirken hata:</target> +<source>Error writing file:</source> +<target>Dosya yazılırken hata:</target> +<source>Invalid FreeFileSync config file!</source> +<target>Geçersiz FreeFileSync yapılandırma dosyası!</target> +<source>/sec</source> +<target>/san</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>1 dakika</pluralform> +<pluralform>%x dakika</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>1 saat</pluralform> +<pluralform>%x saat</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>1 gün</pluralform> +<pluralform>%x gün</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Y&apılandırmayı kaydet...</target> +<source>&Load configuration...</source> +<target>Yapılandırmayı a&l...</target> +<source>&Quit</source> +<target>Çı&k</target> +<source>&File</source> +<target>&Dosya</target> +<source>&Content</source> +<target>İçe&rik</target> +<source>&About...</source> +<target>H&akkında...</target> +<source>&Help</source> +<target>&Yardım</target> +<source>Usage:</source> +<target>Kullanım:</target> +<source>1. Select directories to monitor.</source> +<target>1. Ä°zlenecek klasörleri seçin.</target> +<source>2. Enter a command line.</source> +<target>2. Bir komut satırı yazın.</target> +<source>3. Press 'Start'.</source> +<target>3. 'BaÅŸlat'a Tıklayın.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Her seferinde çalıştırılacak komut satırı: +- tüm klasörler geçerli (örneÄŸin USB bellek takıldığında) +- bu klasörlerin ya da alt klasörlerin içindeki dosyalar deÄŸiÅŸtirildiÄŸinde +</target> +<source>Directories to watch</source> +<target>Ä°zlenecek klasörler</target> +<source>Add folder</source> +<target>Klasör ekle</target> +<source>Remove folder</source> +<target>Klasörü sil</target> +<source>Select a folder</source> +<target>Bir klasör seçin</target> +<source>Command line</source> +<target>Komut satırı</target> +<source>Minimum Idle Time [seconds]</source> +<target>En az boÅŸta bekleme süresi [saniye]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Son deÄŸiÅŸikliÄŸin algılanması ile komut satırının yürütülmesi arasındaki bekleme süresi</target> +<source>Start</source> +<target>BaÅŸla</target> +<source>(Build: %x)</source> +<target>(Yapım: %x)</target> +<source>RealtimeSync configuration</source> +<target>RealtimeSync yapılandırması</target> +<source>File already exists. Overwrite?</source> +<target>Dosya zaten var. Ãœzerine yazılsın mı?</target> +<source>&Restore</source> +<target>Ge&ri yükle</target> +<source>&Exit</source> +<target>Çı&kış</target> +<source>Monitoring active...</source> +<target>Ä°zleme etkin...</target> +<source>Waiting for missing directories...</source> +<target>Kayıp klasörler için bekleniyor...</target> +<source>Command line is empty!</source> +<target>Komut satırı boÅŸ!</target> +<source>Could not initialize directory monitoring:</source> +<target>Klasör izlemesi baÅŸlatılamadı:</target> +<source>A directory input field is empty.</source> +<target>Bir klasör giriÅŸ alanı boÅŸ</target> +<source>Error when monitoring directories.</source> +<target>Klasörler izlenirken hata.</target> +<source>Drag && drop</source> +<target>Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz</target> +<source>Conversion error:</source> +<target>Dönüştürme hatası:</target> +<source>Error moving file:</source> +<target>Dosya taşınırken hata:</target> +<source>Operation aborted!</source> +<target>Ä°ÅŸlemden vazgeçildi!</target> +<source>Target file already existing!</source> +<target>Hedef dosya zaten var!</target> +<source>Error moving directory:</source> +<target>Klasör taşınırken hata:</target> +<source>Target directory already existing!</source> +<target>Hedef klasör zaten var!</target> +<source>Error deleting directory:</source> +<target>Klasör silinirken hata:</target> +<source>Error changing modification time:</source> +<target>DeÄŸiÅŸiklik tarihini deÄŸiÅŸtirirken hata:</target> +<source>Error loading library function:</source> +<target>Kütüphane iÅŸlevi yüklenirken hata:</target> +<source>Error reading security context:</source> +<target>Güüvenlik baÄŸlamı okunurken hata:</target> +<source>Error writing security context:</source> +<target>Güvenlik baÄŸlamı yazılırken hata:</target> +<source>Error copying file permissions:</source> +<target>Dosya izinleri kopyalanırken hata:</target> +<source>Error creating directory:</source> +<target>Klasör oluÅŸturulurken hata:</target> +<source>Error copying symbolic link:</source> +<target>Sembolik baÄŸlantı kopyalanırken hata:</target> +<source>Error copying file:</source> +<target>Dosya kopyalanırken hata:</target> +<source>Error opening file:</source> +<target>Dosya açılırken hata:</target> +<source>Error reading file:</source> +<target>Dosya okunurken hata:</target> +<source>Endless loop when traversing directory:</source> +<target>Klasörlerde dolaşırken sonsuz döngü:</target> +<source>Error traversing directory:</source> +<target>Klasörde dolaşırken hata:</target> +<source>Error setting privilege:</source> +<target>Ä°zinler ayarlanırken hata:</target> +<source>Error moving to Recycle Bin:</source> +<target>Geri Dönüşüm Kutusu'na atılırken hata:</target> +<source>Could not load a required DLL:</source> +<target>Gerekli bir DLL yüklenemedi:</target> +<source>Error writing to synchronization database:</source> +<target>EÅŸleÅŸtirme veri tabanına yazılırken hata:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Birim Gölge Kopya hizmeti baÅŸlatılırken hata!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>WOW64 üzerinde gölge kopyalama desteklenmiyor. FreeFileSync 64-bit sürümünü kullanın</target> +<source>Could not determine volume name for file:</source> +<target>Åžu dosya için birim adı belirlenemedi:</target> +<source>Volume name %x not part of filename %y!</source> +<target>%x birim adı, %y dosya adının parçası deÄŸil!</target> +<source>%x TB</source> +<target>%x TB</target> +<source>%x PB</source> +<target>%x PB</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Åžu XML düğümlerindeki deÄŸerler okunamadı:</target> +<source>Show popup</source> +<target>Açılır pencerede göster</target> +<source>Show popup on errors or warnings</source> +<target>Hata ve uyarıları açılır bir pencerede gösterir</target> +<source>Ignore errors</source> +<target>Hataları yoksay</target> +<source>Hide all error and warning messages</source> +<target>Tüm hata ve uyarı iletilerini gizler</target> +<source>Exit instantly</source> +<target>Hemen çık</target> +<source>Abort synchronization immediately</source> +<target>EÅŸleÅŸtirmeyi hemen bırak</target> +<source>Logging</source> +<target>Günlükleme</target> +<source>FreeFileSync batch file</source> +<target>FreeFileSync toplu komut dosyası</target> +<source>FreeFileSync configuration</source> +<target>FreeFileSync yapılandırması</target> +<source>FreeFileSync Batch Job</source> +<target>FreeFileSync Toplu Komut Ä°ÅŸi</target> +<source>Unable to create logfile!</source> +<target>Günlük dosyası oluÅŸturulamıyor!</target> +<source>Batch execution</source> +<target>Toplu komut yürütme</target> +<source>Log-messages:</source> +<target>Günlük iletileri:</target> +<source>Stop</source> +<target>Durdur</target> +<source>Total time:</source> +<target>Toplam zaman:</target> +<source>Synchronization aborted!</source> +<target>EÅŸleÅŸtirme durduruldu!</target> +<source>Synchronization completed with errors!</source> +<target>EÅŸleÅŸtirme hatalarla tamamlandı!</target> +<source>Synchronization completed successfully!</source> +<target>EÅŸleÅŸtirme sorunsuz tamamlandı!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>FreeFileSync grafik kullanıcı arayüzünü açmak için "Geç" düğmesine tıklayın</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>FreeFileSync grafik kullanıcı arayüzüne geçiliyor...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>sourceforge.net sitesine baÄŸlanılamıyor!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>FreeFileSync programının yeni bir sürümü yayınlanmış:</target> +<source>Download now?</source> +<target>Åžimdi indir?</target> +<source>Information</source> +<target>Bilgi</target> +<source>FreeFileSync is up to date!</source> +<target>FreeFileSync güncel!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz?</target> +<source>(Requires an Internet connection!)</source> +<target>(Ä°nternet baÄŸlantısı gereklidir!)</target> +<source>1. &Compare</source> +<target>1. &KarşılaÅŸtır</target> +<source>2. &Synchronize...</source> +<target>2. &EÅŸleÅŸtir...</target> +<source>S&witch view</source> +<target>Orta görünümü &deÄŸiÅŸtir</target> +<source>&New</source> +<target>Ye&ni</target> +<source>&Program</source> +<target>&Program</target> +<source>&Language</source> +<target>Di&l</target> +<source>&Global settings...</source> +<target>&Genel ayarlar...</target> +<source>&Create batch job...</source> +<target>&Toplu komut iÅŸi oluÅŸtur...</target> +<source>&Export file list...</source> +<target>Dosya list&esini ver...</target> +<source>&Advanced</source> +<target>&GeliÅŸmiÅŸ</target> +<source>&Check for new version</source> +<target>Yeni &sürüm denetimi</target> +<source>Compare</source> +<target>KarşılaÅŸtır</target> +<source>Compare both sides</source> +<target>Ä°ki tarafı da karşılaÅŸtır</target> +<source>&Abort</source> +<target>V&azgeç</target> +<source>Synchronize...</source> +<target>EÅŸleÅŸtir...</target> +<source>Start synchronization</source> +<target>EÅŸleÅŸtirmeyi baÅŸlat</target> +<source>Swap sides</source> +<target>SaÄŸ ve sol yanı deÄŸiÅŸtir</target> +<source>Add folder pair</source> +<target>Klasör çifti ekle</target> +<source>Remove folder pair</source> +<target>Klasör çiftini sil</target> +<source>Save current configuration to file</source> +<target>Geçerli yapılandırmayı dosyaya kaydet</target> +<source>Load configuration from file</source> +<target>Dosyadan yapılandırmayı yükle</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target>Son kullanılan yapılandırmalar (listeden silmek için DEL tuÅŸuna basın)</target> +<source>Hide excluded items</source> +<target>Dışlanan ögeleri gizle</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizle</target> +<source>Number of files and directories that will be created</source> +<target>OluÅŸturulacak dosya ve klasör sayısı</target> +<source>Number of files that will be overwritten</source> +<target>Ãœzerine yazılacak dosya sayısı</target> +<source>Number of files and directories that will be deleted</source> +<target>Silinecek dosya ve klasör sayısı</target> +<source>Total amount of data that will be transferred</source> +<target>Aktarılacak toplam veri miktarı</target> +<source>Left</source> +<target>Sol</target> +<source>Right</source> +<target>SaÄŸ</target> +<source>Batch job</source> +<target>Toplu komut iÅŸi</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>KendiliÄŸinden eÅŸleÅŸtirme için bir toplu komut dosyası oluÅŸturabilirsiniz. Programı toplu komut kipinde baÅŸlatmak için, komut dosyasını FreeFileSync çalışan dosyasına parametre olarak ÅŸu ÅŸekilde ekleyerek çalıştırın: FreeFileSync.exe <Komut Dosyası Adı>. Ayrıca bu komut dosyasını iÅŸletim sistemindeki görev zamanlayıcı ile istediÄŸiniz zamanlarda da çalıştırabilirsiniz.</target> +<source>Help</source> +<target>Yardım</target> +<source>Configuration overview:</source> +<target>Yapılandırma özeti:</target> +<source>Filter files</source> +<target>Dosya süzgeci</target> +<source>Status feedback</source> +<target>Durum geri bildirimi</target> +<source>Silent mode</source> +<target>Sessiz kip</target> +<source>Start minimized and write status information to a logfile</source> +<target>Simge durumuna küçültülmüş olarak baÅŸlat ve durum bilgisini günlük dosyasına yaz</target> +<source>Error handling</source> +<target>Hata olduÄŸunda:</target> +<source>Overview</source> +<target>Özet</target> +<source>Select logfile directory:</source> +<target>Kayıt dosyası klasörünü seçin:</target> +<source>Maximum number of logfiles:</source> +<target>En fazla günlük dosyası sayısı:</target> +<source>&Save</source> +<target>&Kaydet</target> +<source>&Load</source> +<target>Yük&le</target> +<source>&Cancel</source> +<target>Ä°&ptal</target> +<source>Elements found:</source> +<target>Bulunan bileÅŸenler:</target> +<source>Elements remaining:</source> +<target>Kalan bileÅŸenler:</target> +<source>Speed:</source> +<target>Hız:</target> +<source>Time remaining:</source> +<target>Kalan zaman:</target> +<source>Time elapsed:</source> +<target>Geçen zaman:</target> +<source>Operation:</source> +<target>Ä°ÅŸlem:</target> +<source>Select variant:</source> +<target>DeÄŸiÅŸkeni seçin:</target> +<source><Automatic></source> +<target><KendiliÄŸinden></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>Bir veritabanı kullanarak iki yandaki deÄŸiÅŸiklikleri belirler ve günceller. Silinme ve tutarsızlıklar kendiliÄŸinden algılanır.</target> +<source>Mirror ->></source> +<target>Yansı ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Sol klasörün yansı yedeÄŸi. EÅŸleÅŸtirmeden sonra saÄŸ klasör, sol klasörün tamamen aynısı olacak.</target> +<source>Update -></source> +<target>Güncelle -></target> +<source>Copy new or updated files to right folder.</source> +<target>Yalnız yeni ya da güncellenmiÅŸ dosyalar soldan saÄŸa kopyalanır.</target> +<source>Custom</source> +<target>Özel</target> +<source>Configure your own synchronization rules.</source> +<target>Buradan kendi eÅŸleÅŸtirme kurallarınızı yapılandırabilirsiniz.</target> +<source>Deletion handling</source> +<target>Silme eyleminde:</target> +<source>&OK</source> +<target>&Tamam</target> +<source>Configuration</source> +<target>Yapılandırma</target> +<source>Category</source> +<target>Kategori</target> +<source>Action</source> +<target>Ä°ÅŸlem</target> +<source>Files/folders that exist on left side only</source> +<target>Yalnız sol yanda bulunan dosya ve klasörler</target> +<source>Files/folders that exist on right side only</source> +<target>Yalnız saÄŸ yanda bulunan dosya ve klasörler</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Her iki yanda da bulunup, solda daha yeni olan dosyalar</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Her iki yanda da bulunup, saÄŸda daha yeni olan dosyalar</target> +<source>Files that have different content</source> +<target>Farklı içeriÄŸe sahip dosyalar</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Kategorize edilemeyen tutarsızlıklar/dosyalar</target> +<source>Compare by...</source> +<target>KarşılaÅŸtırma ölçütünü seçin:</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +EÅŸit dosyalar aranırken + - dosya boyutu + - son kayıt zamanı ve tarihi +aynı olanlara bakılır +</target> +<source>File size and date</source> +<target>Dosya boyutu ve tarihi</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target> +EÅŸit dosyalar aranırken + - dosya içeriÄŸi +aynı olanlara bakılır +</target> +<source>File content</source> +<target>Dosya içeriÄŸi</target> +<source>Symbolic Link handling</source> +<target>Sembolik baÄŸlantı iÅŸleme</target> +<source>Synchronizing...</source> +<target>EÅŸleÅŸtiriliyor...</target> +<source>Elements processed:</source> +<target>Ä°ÅŸlenen bileÅŸenler:</target> +<source>&Pause</source> +<target>&Duraklat</target> +<source>Compare by "File size and date"</source> +<target>"Dosya boyutu ve tarihi"ne göre karşılaÅŸtırma</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Bu seçenek, aynı adlı iki dosyanın, aynı boyuta ve aynı son deÄŸiÅŸiklik tarihine sahip olması durumunda eÅŸit olması anlamına gelir.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Bu seçenekle karşılaÅŸtırma yapıldığında, ÅŸu karar aÄŸacı iÅŸlenir:</target> +<source>As a result the files are separated into the following categories:</source> +<target>Sonuç olarak dosyalar ÅŸu kategorilere göre ayrılır:</target> +<source>- equal</source> +<target>- eÅŸit</target> +<source>- left newer</source> +<target>- soldaki daha yeni</target> +<source>- right newer</source> +<target>- saÄŸdaki daha yeni</target> +<source>- exists left only</source> +<target>- yalnız solda olan</target> +<source>- exists right only</source> +<target>- yalnız saÄŸda olan</target> +<source>- conflict</source> +<target>- tutarsızlık</target> +<source>Compare by "File content"</source> +<target>"Dosya içeriÄŸi"ne göre karşılaÅŸtırma</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Bu seçenekte, yalnızca aynı ada sahip iki dosyanın içeriÄŸi aynıysa eÅŸit olarak kabul edilirler. Bu seçenek yedekleme iÅŸlemlerinden daha çok, uyuÅŸma denetimi için yararlıdır. Bu yüzden dosya tarihleri hiç bir zaman dikkate alınmaz. + Bu seçenekle karşılaÅŸtırma yapıldığında, ÅŸu karar aÄŸacı iÅŸlenir: -You can ignore conflicts and continue synchronization. -ÇeliÅŸkileri yoksayıp eÅŸleÅŸtirmeyi sürdürebilirsiniz. -You can ignore this error to consider the directory as empty. -Bu hatayı, klasörü boÅŸ sayacak ÅŸekilde yok sayabilirsiniz. -You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Kalan öğeleri yeniden eÅŸleÅŸtirmeyi deneyebilirsiniz (Tekrar kaşılaÅŸtırma yapmadan)! -different -farklı -file exists on both sides -Dosya her iki yanda da var -on one side only -yalnız tek yanda +</target> +<source>- different</source> +<target>- farklı</target> +<source>Source code written in C++ utilizing:</source> +<target>Kaynak kodu C++ kullanılarak yazılmıştır:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>FreeFileSync çevirisinden dolayı çok teÅŸekkürler:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Geri bildirim ve önerileriniz için:</target> +<source>FreeFileSync at Sourceforge</source> +<target>Sourceforge sitesinde FreeFileSync</target> +<source>Homepage</source> +<target>Ana sayfa</target> +<source>If you like FFS</source> +<target>FFS’i beÄŸendiyseniz</target> +<source>Donate with PayPal</source> +<target>PayPal ile bağış yapın</target> +<source>Email</source> +<target>E-posta</target> +<source>Report translation error</source> +<target>Çeviri hatasını bildir</target> +<source>Published under the GNU General Public License:</source> +<target>GNU Genel Kamu Lisansına ÅŸartları altında yayınlanmıştır:</target> +<source>Ignore subsequent errors</source> +<target>Sonraki hataları yoksay</target> +<source>Hide further error messages during the current process</source> +<target>Yürürlükteki iÅŸlem boyunca baÅŸka hata iletisi gösterme</target> +<source>&Ignore</source> +<target>&Yoksay</target> +<source>&Retry</source> +<target>&Yeniden dene</target> +<source>Do not show this dialog again</source> +<target>Bu iletiyi yeniden gösterme</target> +<source>&Switch</source> +<target>&DeÄŸiÅŸtir</target> +<source>&Yes</source> +<target>&Evet</target> +<source>&No</source> +<target>&Hayır</target> +<source>Delete on both sides</source> +<target>Her iki yandakini de sil</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Dosya yalnız bir tarafta seçili olsa bile her iki yandakini de sil</target> +<source>Use Recycle Bin</source> +<target>Geri Dönüşüm Kutusu'nu kullan</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Yalnızca tüm süzgeç koÅŸullarına uyan dosya ve klasörler eÅŸleÅŸtirilecek. +Not: Ad süzgeci kök eÅŸleÅŸtirme klasörüne göre bağıl(!) olarak belirtilmelidir. +</target> +<source>Hints:</source> +<target>Ä°puçları:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Bağıl dosya ya da klasör adlarını ';' ile ayırarak ya da ayrı satırlar ÅŸeklinde yazın.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. '*' ve '?' jokerleri kullanılabilsin.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Ana listedeki dosyaları saÄŸ fare tuÅŸu menüsüyle doÄŸrudan dışla.</target> +<source>Example</source> +<target>Örnek</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Kat: *.doc;*.zip;*.exe +Katma: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>"temp" alt klasöründeki herÅŸey hariç, tüm .doc, .zip ve .exe dosyalarını eÅŸleÅŸtir.</target> +<source>Include</source> +<target>Katılacaklar:</target> +<source>Exclude</source> +<target>Dışlanacaklar:</target> +<source>Select time span:</source> +<target>Zaman aralığını seçin:</target> +<source>Minimum file size:</source> +<target>En küçük dosya boyutu:</target> +<source>Maximum file size:</source> +<target>En büyük dosya sayısı:</target> +<source>&Default</source> +<target>&Varsayılan</target> +<source>Move column up</source> +<target>Sütunu yukarı taşı</target> +<source>Move column down</source> +<target>Sütunu aÅŸağı taşı</target> +<source>Copy locked files</source> +<target>Kilitli dosyaları da kopyala</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Paylaşılmış ya da kilitli dosyaları Birim Gölge Kopya Hizmetini + kullanarak kopyala (Yönetici izinlerine gerek duyar) +</target> +<source>Copy filesystem permissions</source> +<target>Dosya sistemi izinlerini de kopyala</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Dosya ve klasör izinlerini de aktar +(Yönetici izinlerine gerek duyar) +</target> +<source>Hidden dialogs:</source> +<target>GizlenmiÅŸ iletiler:</target> +<source>Reset</source> +<target>Sıfırla</target> +<source>Show hidden dialogs</source> +<target>GizlenmiÅŸ iletileri göster</target> +<source>External applications</source> +<target>Dış uygulamalar</target> +<source>Description</source> +<target>Açıklama</target> +<source>Variant</source> +<target>DeÄŸiÅŸken</target> +<source>Statistics</source> +<target>Ä°statistikler</target> +<source>Find what:</source> +<target>Aranacak:</target> +<source>Match case</source> +<target>Büyük/küçük harf uydur</target> +<source>&Find next</source> +<target>&Sonrakini bul</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Kalan öğeleri yeniden eÅŸleÅŸtirmeyi deneyebilirsiniz (Tekrar kaşılaÅŸtırma yapmadan)!</target> +<source>Batch file created successfully!</source> +<target>Toplu komut dosyası sorunsuz oluÅŸturuldu!</target> +<source>Main bar</source> +<target>Ana çubuk</target> +<source>Folder pairs</source> +<target>Klasör çiftleri</target> +<source>Select view</source> +<target>Görünümü seçin</target> +<source>Folder Comparison and Synchronization</source> +<target>Klasör KarşılaÅŸtırma ve EÅŸleÅŸtirme</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Geri Dönüşüm Kutusu bu sistemde desteklenmiyor!</target> +<source>Set direction:</source> +<target>Yönü seçin:</target> +<source>Exclude temporarily</source> +<target>Geçici olarak dışla</target> +<source>Include temporarily</source> +<target>Geçici olarak kat</target> +<source>Exclude via filter:</source> +<target>Süzerek dışarda bırak:</target> +<source><multiple selection></source> +<target><çoklu seçim></target> +<source>D-Click</source> +<target>D-TuÅŸu</target> +<source>Copy to clipboard CTRL+C</source> +<target>Panoya kopyala CTRL+C</target> +<source>Delete files DEL</source> +<target>Dosyaları sil DEL</target> +<source>Customize...</source> +<target>ÖzelleÅŸtir...</target> +<source>Auto-adjust columns</source> +<target>Sütunları kendiliÄŸinden hizala</target> +<source>Include all rows</source> +<target>Tüm satırları kat</target> +<source>Exclude all rows</source> +<target>Tüm satırları dışla</target> +<source>Reset view</source> +<target>Görünümü sıfırla</target> +<source>Show "%x"</source> +<target>"%x" panelini göster</target> +<source><Last session></source> +<target><Önceki oturum></target> +<source>Configuration saved!</source> +<target>Yapılandırma kaydedildi!</target> +<source>Save changes to current configuration?</source> +<target>DeÄŸiÅŸiklikleri ÅŸu anki yapılandırmaya kaydetmek ister misiniz?</target> +<source>Configuration loaded!</source> +<target>Yapılandırma yüklendi!</target> +<source>Hide files that exist on left side only</source> +<target>Yalnız sol yanda bulunan dosyaları gizle</target> +<source>Show files that exist on left side only</source> +<target>Yalnız sol tarafta bulunan dosyaları göster</target> +<source>Hide files that exist on right side only</source> +<target>Yalnız saÄŸ yanda bulunan dosyaları gizle</target> +<source>Show files that exist on right side only</source> +<target>Yalnız saÄŸ tarafta bulunan dosyaları göster</target> +<source>Hide files that are newer on left</source> +<target>Solda daha yeni olan dosyaları gizle</target> +<source>Show files that are newer on left</source> +<target>Solda daha yeni olan dosyaları göster</target> +<source>Hide files that are newer on right</source> +<target>SaÄŸda daha yeni olan dosyaları gizle</target> +<source>Show files that are newer on right</source> +<target>SaÄŸda daha yeni olan dosyaları göster</target> +<source>Hide files that are equal</source> +<target>EÅŸit olan dosyaları gizle</target> +<source>Show files that are equal</source> +<target>EÅŸit olan dosyaları göster</target> +<source>Hide files that are different</source> +<target>Farklı olan dosyaları gizle</target> +<source>Show files that are different</source> +<target>Farklı olan dosyaları göster</target> +<source>Hide conflicts</source> +<target>ÇeliÅŸkileri gizle</target> +<source>Show conflicts</source> +<target>ÇeliÅŸkileri göster</target> +<source>Hide files that will be created on the left side</source> +<target>Sol yanda oluÅŸturulacak dosyaları gizle</target> +<source>Show files that will be created on the left side</source> +<target>Yalnız sol tarafta oluÅŸturulacak dosyaları göster</target> +<source>Hide files that will be created on the right side</source> +<target>SaÄŸ yanda oluÅŸturulacak dosyaları gizle</target> +<source>Show files that will be created on the right side</source> +<target>Yalnız saÄŸ tarafta oluÅŸturulacak dosyaları göster</target> +<source>Hide files that will be deleted on the left side</source> +<target>Sol yanda silinecek dosyaları gizle</target> +<source>Show files that will be deleted on the left side</source> +<target>Yalnız sol tarafta silinecek dosyaları göster</target> +<source>Hide files that will be deleted on the right side</source> +<target>SaÄŸ yanda silinecek dosyaları gizle</target> +<source>Show files that will be deleted on the right side</source> +<target>Yalnız saÄŸ tarafta silinecek dosyaları göster</target> +<source>Hide files that will be overwritten on left side</source> +<target>Sol yanda üzerine yazılacak dosyaları gizle</target> +<source>Show files that will be overwritten on left side</source> +<target>Yalnız sol tarafta üzerine yazılacak dosyaları göster</target> +<source>Hide files that will be overwritten on right side</source> +<target>SaÄŸ yanda üzerine yazılacak dosyaları gizle</target> +<source>Show files that will be overwritten on right side</source> +<target>Yalnız saÄŸ tarafta üzerine yazılacak dosyaları göster</target> +<source>Hide files that won't be copied</source> +<target>Kopyalanmayacak dosyaları gizle</target> +<source>Show files that won't be copied</source> +<target>Kopyalanmayacak dosyaları göster</target> +<source>All directories in sync!</source> +<target>Tüm klasörler eÅŸ!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Lütfen eÅŸleÅŸtirmeden önce karşılaÅŸtırma yapın!</target> +<source>Comma separated list</source> +<target>Virgül ile ayrılmış liste</target> +<source>Legend</source> +<target>Gösterge</target> +<source>File list exported!</source> +<target>Dosya listesi verilmiÅŸ!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>1 klasör</pluralform> +<pluralform>%x klasör</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>1 dosya</pluralform> +<pluralform>%x dosya</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x / 1 satır gösteriliyor</pluralform> +<pluralform>%x / %y satır gösteriliyor</pluralform> +</target> +<source>Scanning...</source> +<target>Taranıyor...</target> +<source>Comparing content...</source> +<target>İçerik karşılaÅŸtırılıyor...</target> +<source>Paused</source> +<target>Duraklatıldı</target> +<source>Aborted</source> +<target>Vazgeçildi</target> +<source>Completed</source> +<target>Tamamlandı</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Vazgeçildi: Yürürlükteki iÅŸlemin bitmesi bekleniyor...</target> +<source>Continue</source> +<target>Devam et</target> +<source>Pause</source> +<target>Duraklat</target> +<source>Cannot find %x</source> +<target>%x bulunamadı</target> +<source>DECISION TREE</source> +<target>KARAR AÄžACI</target> +<source>file exists on both sides</source> +<target>Dosya her iki yanda da var</target> +<source>on one side only</source> +<target>yalnız tek yanda</target> +<source>- left</source> +<target>- sol</target> +<source>- right</source> +<target>- saÄŸ</target> +<source>different</source> +<target>farklı</target> +<source>- conflict (same date, different size)</source> +<target>- tutarsızlık (aynı tarih, farklı boyut)</target> +<source>Inactive</source> +<target>Devre dışı</target> +<source>Second</source> +<target>Saniye</target> +<source>Minute</source> +<target>Dakika</target> +<source>Hour</source> +<target>Saat</target> +<source>Day</source> +<target>Gün</target> +<source>Byte</source> +<target>Bayt</target> +<source>KB</source> +<target>KB</target> +<source>MB</source> +<target>MB</target> +<source>Filter: All pairs</source> +<target>Süzgeç: Tüm çiftler</target> +<source>Filter: Single pair</source> +<target>Süzgeç: Tek çift</target> +<source>Ignore</source> +<target>Yoksay</target> +<source>Direct</source> +<target>DoÄŸrudan</target> +<source>Follow</source> +<target>Ä°zle</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Dış uygulamaları saÄŸ tuÅŸ menüsüne ekler. Åžu makrolar kullanılabilir:</target> +<source>- full file or directory name</source> +<target>- tam dosya ya da klasör adı</target> +<source>- directory part only</source> +<target>- Yalnız klasör kısmı</target> +<source>- Other side's counterpart to %name</source> +<target>- %name diÄŸer taraftaki karşılığı</target> +<source>- Other side's counterpart to %dir</source> +<target>- %dir klasörünün diÄŸer taraftaki karşılığı</target> +<source>Restore all hidden dialogs?</source> +<target>Tüm gizlenmiÅŸ iletiler gösterilsin mi?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Åžu ögeyi geri dönüşüm kutusuna taşımak istediÄŸinizden emin misiniz?</pluralform> +<pluralform>Åžu %x ögeyi geri dönüşüm kutusuna taşımak istediÄŸinizden emin misiniz?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Åžu ögeyi silmek istiyor musunuz?</pluralform> +<pluralform>Åžu %x ögeyi silmek istiyor musunuz?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>ÇözülmemiÅŸ tutarsızlık olarak bırak</target> +<source>Delete permanently</source> +<target>Kalıcı olarak sil</target> +<source>Delete or overwrite files permanently</source> +<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target> +<source>Versioning</source> +<target>Sürümlendirme</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Dosyaları zaman damgasıyla bir alt klasöre taşır</target> +<source>Cannot determine sync-direction:</source> +<target>EÅŸleÅŸtirme yönü belirlenemedi:</target> +<source>Filter settings have changed!</source> +<target>Süzgeç ayarları deÄŸiÅŸtirildi!</target> +<source>Both sides have changed since last synchronization!</source> +<target>Son eÅŸleÅŸtirmeden bu yana iki yanın içeriÄŸi de deÄŸiÅŸmiÅŸ!</target> +<source>No change since last synchronization!</source> +<target>Son eÅŸleÅŸtirmeden bu yana deÄŸiÅŸik olmamış!</target> +<source>The file was not processed by last synchronization!</source> +<target>Dosya son eÅŸleÅŸtirmede iÅŸlenmemiÅŸ!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Planlanmış klasörün silinmesi alt klasör ve dosyalarıyla çeliÅŸiyor!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target>Varsayılan eÅŸleÅŸtirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak.</target> +<source>The file does not contain a valid configuration:</source> +<target>Dosya geçerli bir yapılandırma içermiyor:</target> +<source>Scanning:</source> +<target>Taranıyor:</target> +<source>Encoding extended time information: %x</source> +<target>Uzatılmış zaman bilgisi kodlanıyor: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Bu hatayı, klasörü boÅŸ sayacak ÅŸekilde yok sayabilirsiniz.</target> +<source>Directory does not exist:</source> +<target>Klasör bulunamadı:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Klasörler bağımlı! EÅŸleÅŸtirme kurallarını koyarken dikkatli olun:</target> +<source>Comparing content of files %x</source> +<target>%x dosyalarının içeriÄŸi karşılaÅŸtırılıyor</target> +<source>Memory allocation failed!</source> +<target>Bellek ayrılamadı!</target> +<source>File %x has an invalid date!</source> +<target>%x dosyasının tarihi geçersiz!</target> +<source>Conflict detected:</source> +<target>ÇeliÅŸki bulundu:</target> +<source>Files %x have the same date but a different size!</source> +<target>%x dosyalarının tarihleri aynı fakat boyutları farklı!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Sembolik baÄŸlantılar %x aynı tarihli fakat hedefleri farklı!</target> +<source>Comparing files by content failed.</source> +<target>Dosyaların içerikleri karşılaÅŸtırılamadı.</target> +<source>Generating file list...</source> +<target>Dosya listesi oluÅŸturuluyor...</target> +<source>Multiple...</source> +<target>Çoklu...</target> +<source>Files that are equal on both sides</source> +<target>Her iki yanda da eÅŸit olan dosyalar</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Yalnızca öznitelikleri farklı olan dosya ya da klasörleri eÅŸitle</target> +<source>Copy from right to left</source> +<target>SaÄŸdan sola kopyala</target> +<source>Copy from left to right</source> +<target>Soldan saÄŸa kopyala</target> +<source>Delete files/folders existing on left side only</source> +<target>Yalnız sol tarafta olan dosyaları/klasörleri sil</target> +<source>Delete files/folders existing on right side only</source> +<target>Yalnız saÄŸ tarafta olan dosyaları/klasörleri sil</target> +<source>Copy from right to left overwriting</source> +<target>SaÄŸdan sola üzerine yazarak kopyala</target> +<source>Copy from left to right overwriting</source> +<target>Soldan saÄŸa üzerine yazarak kopyala</target> +<source>Do nothing</source> +<target>Hiçbir ÅŸey yapma</target> +<source>Copy attributes only from right to left</source> +<target>Öznitelikleri yalnızca saÄŸdan sola kopyala</target> +<source>Copy attributes only from left to right</source> +<target>Öznitelikleri yalnızca soldan saÄŸa kopyala</target> +<source>Deleting file %x</source> +<target>%x dosyası siliniyor</target> +<source>Deleting Symbolic Link %x</source> +<target>%z sembolik baÄŸlantısı siliniyor</target> +<source>Deleting folder %x</source> +<target>%x klasörü siliniyor</target> +<source>Moving %x to Recycle Bin</source> +<target>%x Geri Dönüşüm Kutusu'na atılıyor</target> +<source>Moving file %x to user-defined directory %y</source> +<target>%x dosyası kullanıcının tanımladığı %y klasörüne taşınıyor</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>%x klasörü kullanıcının tanımladığı %y klasörüne taşınıyor</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>%x sembolik baÄŸlantısı kullanıcının belirttiÄŸi %y klasörüne taşınıyor</target> +<source>Copying new file %x to %y</source> +<target>Yeni dosya %x %y üzerine kopyalanıyor</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>Yeni sembolik baÄŸlantı %x %y üzerine kopyalanıyor</target> +<source>Overwriting file %x in %y</source> +<target>%y içindeki %x dosyasının üzerine yazılıyor</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>%y içindeki %x sembolik baÄŸlantısının üzerine yazılıyor</target> +<source>Creating folder %x</source> +<target>%x klasörü oluÅŸturuluyor</target> +<source>Verifying file %x</source> +<target>%x dosyası doÄŸrulanıyor</target> +<source>Updating attributes of %x</source> +<target>%x öznitelikleri güncelleniyor</target> +<source>Source directory does not exist anymore:</source> +<target>Kaynak klasör artık yok:</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Yapılandırmaya göre eÅŸleÅŸtirilecek bir ÅŸey yok!</target> +<source>Target directory name must not be empty!</source> +<target>Hedef klasör adı boÅŸ olamaz!</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Silme için kullanıcının belirttiÄŸi dizin belirtilmemiÅŸ!</target> +<source>Unresolved conflicts existing!</source> +<target>ÇözülmemiÅŸ tutarsızlıklar var!</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>ÇeliÅŸkileri yoksayıp eÅŸleÅŸtirmeyi sürdürebilirsiniz.</target> +<source>Significant difference detected:</source> +<target>Önemli fark saptandı:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Dosyaların yarıdan fazlası kopyalanacak ya da silinecek!</target> +<source>Not enough free disk space available in:</source> +<target>Åžurada yeterli disk alanı yok :</target> +<source>Free disk space required:</source> +<target>Gereken boÅŸ disk alanı:</target> +<source>Free disk space available:</source> +<target>Kullanılabilir disk alanı:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Çoklu klasör çiftlerinin bir parçası olduÄŸan bir klasör düzenlenecek! Lütfen eÅŸleÅŸtirme ayarlarınızı gözden geçirin!</target> +<source>Processing folder pair:</source> +<target>Ä°ÅŸlenen klasör çifti:</target> +<source>Generating database...</source> +<target>Veri tabanı oluÅŸturuluyor...</target> +<source>Error copying locked file %x!</source> +<target>Kilitli dosya %x kopyalanırken hata!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Veri doÄŸrulama hatası: Kaynak ve hedef dosyası içeriÄŸi farklı!</target> diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng new file mode 100644 index 00000000..33ca37c0 --- /dev/null +++ b/BUILD/Languages/ukrainian.lng @@ -0,0 +1,1062 @@ +<header> + <language name>УкраїнÑька</language name> + <translator>Roman Ardan</translator> + <locale>uk_UA</locale> + <flag file>ukraine.png</flag file> + <plural forms>3</plural forms> + <plural definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition> +</header> + +<source>Show in Explorer</source> +<target>Показати у Провіднику</target> +<source>Open with default application</source> +<target>Відкрити за допомогою програми за замовчуваннÑм</target> +<source>Browse directory</source> +<target>ПереглÑнути каталог</target> +<source>RealtimeSync - Automated Synchronization</source> +<target>RealtimeSync - Ðвтоматична ÑинхронізаціÑ</target> +<source>Browse</source> +<target>ПереглÑнути</target> +<source>Invalid commandline: "%x"</source> +<target></target> +<source>Error resolving symbolic link:</source> +<target>Помилка при вирішені Ñимволічного поÑиланнÑ:</target> +<source>Select alternate synchronization settings</source> +<target>Вибрати альтернативні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> +<source>No filter selected</source> +<target>Ðе вибрано жодного фільтра</target> +<source>Filter is active</source> +<target>Фільтр активний</target> +<source>Clear filter settings</source> +<target>ОчиÑтити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target> +<source>Remove alternate settings</source> +<target>Вилучити альтернативні налаштуваннÑ</target> +<source>Create a batch job</source> +<target>Створити пакетне завданнÑ</target> +<source>Synchronization settings</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> +<source>Comparison settings</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ</target> +<source>About</source> +<target>Про</target> +<source>Error</source> +<target>Помилка</target> +<source>Warning</source> +<target>Увага</target> +<source>Question</source> +<target>ПитаннÑ</target> +<source>Confirm</source> +<target>Підтвердити</target> +<source>Configure filter</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target> +<source>Customize columns</source> +<target>Вибір колонок</target> +<source>Global settings</source> +<target>Глобальні налаштуваннÑ</target> +<source>Synchronization Preview</source> +<target>Попередній оглÑд Ñинхронізації</target> +<source>Find</source> +<target>Знайти</target> +<source>%x MB</source> +<target>%x МБ</target> +<source>%x KB</source> +<target>%x КБ</target> +<source>%x GB</source> +<target>%x ГБ</target> +<source> +<pluralform>1 Byte</pluralform> +<pluralform>%x Bytes</pluralform> +</source> +<target> +<pluralform>%x байт</pluralform> +<pluralform>%x байти</pluralform> +<pluralform>%x байтів</pluralform> +</target> +<source><Symlink></source> +<target><Символьне поÑиланнÑ></target> +<source><Directory></source> +<target><Каталог></target> +<source>Size</source> +<target>Розмір</target> +<source>Date</source> +<target>Дата</target> +<source>Full path</source> +<target>Повний шлÑÑ…</target> +<source>Filename</source> +<target>Ð†Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ð°</target> +<source>Relative path</source> +<target>ВідноÑний шлÑÑ…</target> +<source>Directory</source> +<target>Каталог</target> +<source>Extension</source> +<target>РозширеннÑ</target> +<source>Comparison Result</source> +<target>Результати порівнюваннÑ</target> +<source>Incompatible synchronization database format:</source> +<target>ÐеÑуміÑний формат бази даних Ñинхронізації:</target> +<source>Initial synchronization:</source> +<target>Ð’Ñтупна ÑинхронізаціÑ:</target> +<source>One of the FreeFileSync database files is not yet existing:</source> +<target>Файла бази даних FreeFileSync ще не Ñ–Ñнує:</target> +<source>One of the FreeFileSync database entries within the following file is not yet existing:</source> +<target>ЗапиÑів, Ñкі ÑтоÑуютьÑÑ Ñ‚Ð°ÐºÐ¸Ñ… файлів, в базі даних FreeFileSync ще не Ñ–Ñнує:</target> +<source>Error reading from synchronization database:</source> +<target>Помилка при читанні з базы даних Ñинхронізації:</target> +<source>An exception occurred!</source> +<target>ВідбулоÑÑŒ виключеннÑ!</target> +<source>Error deleting file:</source> +<target>Помилка при вилученні файла:</target> +<source>Error reading file attributes:</source> +<target>Помилка при читанні параметрів файла:</target> +<source>Waiting while directory is locked (%x)...</source> +<target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½ÑÑ‚Ñ‚Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð· каталогу (%x)...</target> +<source>Error setting directory lock:</source> +<target>Помилка Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target> +<source> +<pluralform>1 sec</pluralform> +<pluralform>%x sec</pluralform> +</source> +<target> +<pluralform>%x Ñек</pluralform> +<pluralform>%x Ñек</pluralform> +<pluralform>%x Ñек</pluralform> +</target> +<source>Info</source> +<target>ІнформаціÑ</target> +<source>Fatal Error</source> +<target>Критична помилка</target> +<source>Invalid FreeFileSync config file!</source> +<target>Ðеправильний файл конфігурації FreeFileSync!</target> +<source>File does not exist:</source> +<target>Файл не Ñ–Ñнує:</target> +<source>Error parsing configuration file:</source> +<target>Помилка при анализі файла налаштувань Ñинхронізації:</target> +<source>Error writing file:</source> +<target>Помилка при запиÑÑ– файла:</target> +<source>/sec</source> +<target>/Ñек</target> +<source> +<pluralform>1 min</pluralform> +<pluralform>%x min</pluralform> +</source> +<target> +<pluralform>%x хв</pluralform> +<pluralform>%x хв</pluralform> +<pluralform>%x хв</pluralform> +</target> +<source> +<pluralform>1 hour</pluralform> +<pluralform>%x hours</pluralform> +</source> +<target> +<pluralform>%x година</pluralform> +<pluralform>%x години</pluralform> +<pluralform>%x годин</pluralform> +</target> +<source> +<pluralform>1 day</pluralform> +<pluralform>%x days</pluralform> +</source> +<target> +<pluralform>%x день</pluralform> +<pluralform>%x дні</pluralform> +<pluralform>%x днів</pluralform> +</target> +<source>S&ave configuration...</source> +<target>Зберегти налаштуваннÑ...</target> +<source>&Load configuration...</source> +<target>&Завантажити налаштуваннÑ...</target> +<source>&Quit</source> +<target>&Вихід</target> +<source>&File</source> +<target>&Файл</target> +<source>&Content</source> +<target>&ЗміÑÑ‚</target> +<source>&About...</source> +<target>&Про програму...</target> +<source>&Help</source> +<target>&Допомога</target> +<source>Usage:</source> +<target>ВикориÑтаннÑ:</target> +<source>1. Select directories to monitor.</source> +<target>1. Виберіть каталоги Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ;</target> +<source>2. Enter a command line.</source> +<target>2. Уведіть Ñ€Ñдок команди;</target> +<source>3. Press 'Start'.</source> +<target>3. ÐатиÑніть 'Старт'.</target> +<source> +The command line is executed each time: +- all directories become available (e.g. USB stick insert) +- files within these directories or subdirectories are modified +</source> +<target> +Командний Ñ€Ñдок виконуєтьÑÑ Ñ‰Ð¾Ñ€Ð°Ð·Ñƒ, коли: +- вÑÑ– каталоги Ñтають доÑтупні (наприклад, Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñного ноÑÑ–Ñ) +- файли в каталогах чи підкаталогах змінені +</target> +<source>Directories to watch</source> +<target>Каталоги Ð´Ð»Ñ ÑпоÑтереженнÑ</target> +<source>Add folder</source> +<target>Додати папку</target> +<source>Remove folder</source> +<target>Вилучити папку</target> +<source>Select a folder</source> +<target>Вибрати папку</target> +<source>Command line</source> +<target>Командний Ñ€Ñдок</target> +<source>Minimum Idle Time [seconds]</source> +<target>Мінімальний Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñтою [Ñекунд]</target> +<source>Idle time between detection of last change and execution of command line in seconds</source> +<target>Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою між виÑвленнÑм оÑтанньої зміни та виконаннÑм командного Ñ€Ñдка в Ñекундах</target> +<source>Start</source> +<target>Старт</target> +<source>(Build: %x)</source> +<target>(компілÑÑ†Ñ–Ñ %x)</target> +<source>RealtimeSync configuration</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ RealtimeSync</target> +<source>File already exists. Overwrite?</source> +<target>Файл уже Ñ–Ñнує. ПерезапиÑати?</target> +<source>&Restore</source> +<target>&Відновити</target> +<source>&Exit</source> +<target>&Вихід</target> +<source>Monitoring active...</source> +<target>Моніторинг включений...</target> +<source>Waiting for missing directories...</source> +<target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¸Ñ… каталогів...</target> +<source>Could not initialize directory monitoring:</source> +<target>Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ каталог Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ:</target> +<source>A directory input field is empty.</source> +<target>Поле Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÑˆÐ»Ñху каталога порожнє.</target> +<source>Error when monitoring directories.</source> +<target>Помилка моніторингу каталогу.</target> +<source>Drag && drop</source> +<target>Drag && drop</target> +<source>Conversion error:</source> +<target>Помилка перетвореннÑ:</target> +<source>Error moving file:</source> +<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> +<source>Operation aborted!</source> +<target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½ÐµÐ½Ð°!</target> +<source>Target file already existing!</source> +<target>Кінцевий файл уже Ñ–Ñнує!</target> +<source>Error moving directory:</source> +<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target> +<source>Target directory already existing!</source> +<target>Кінцевий каталог вже Ñ–Ñнує!</target> +<source>Error deleting directory:</source> +<target>Помилка при вилученні каталогу:</target> +<source>Error changing modification time:</source> +<target>Помилка при зміні чаÑу модификації файла:</target> +<source>Error loading library function:</source> +<target>Помилка при завантаженні функції бібліотеки:</target> +<source>Error reading security context:</source> +<target>Помилка при читанні контекÑту безпеки:</target> +<source>Error writing security context:</source> +<target>Помилка при запиÑÑ– контекÑту безпеки:</target> +<source>Error copying file permissions:</source> +<target>Помилка при копіюванні прав доÑтупу:</target> +<source>Error creating directory:</source> +<target>Помилка при Ñтворенні каталогу:</target> +<source>Error copying symbolic link:</source> +<target>Помилка при копіюванні Ñимвольного поÑиланнÑ:</target> +<source>Error copying file:</source> +<target>Помилка при копіюванні файла:</target> +<source>Error opening file:</source> +<target>Помилка при відкриванні файла:</target> +<source>Error reading file:</source> +<target>Помилка при читанні файла:</target> +<source>Endless loop when traversing directory:</source> +<target>Ð—Ð°Ñ†Ð¸ÐºÐ»ÑŽÐ²Ð°Ð½Ð½Ð½Ñ Ð¿Ñ€Ð¸ обході каталогу:</target> +<source>Error traversing directory:</source> +<target>Помилка обходу каталогу:</target> +<source>Error setting privilege:</source> +<target>Помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÑ—Ð²:</target> +<source>Error moving to Recycle Bin:</source> +<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² "Корзину":</target> +<source>Could not load a required DLL:</source> +<target>Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ необхідні DLL:</target> +<source>Error writing to synchronization database:</source> +<target>Помилка при запиÑÑ– у базу данних Ñинхронізації:</target> +<source>Error starting Volume Shadow Copy Service!</source> +<target>Помилка при запуÑку поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ!</target> +<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> +<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð½ÑŒÐ¾Ð²Ð¸Ñ… копій на WOW64 не підтримуєтьÑÑ. Будь лаÑка, викориÑтайте FreeFileSync 64-розрÑдної верÑÑ–Ñ—.</target> +<source>Could not determine volume name for file:</source> +<target>Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ назву тому Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> +<source>Volume name %x not part of filename %y!</source> +<target>Ð†Ð¼â€™Ñ Ñ‚Ð¾Ð¼Ñƒ %x не Ñ” чаÑтиною імені файла %y!</target> +<source>%x TB</source> +<target>%x ТБ</target> +<source>%x PB</source> +<target>%x ПБ</target> +<source>%x%</source> +<target>%x%</target> +<source>Could not read values for the following XML nodes:</source> +<target>Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°ÐºÐ¸Ñ… XML запиÑів:</target> +<source>Show popup</source> +<target>Показувати виринаючі вікна</target> +<source>Show popup on errors or warnings</source> +<target>Показувати виринаючі вікна при помилках та зауваженнÑÑ…</target> +<source>Ignore errors</source> +<target>Ігнорувати помилки</target> +<source>Hide all error and warning messages</source> +<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target> +<source>Exit instantly</source> +<target>Вийти негайно</target> +<source>Abort synchronization immediately</source> +<target>Перервати Ñинхронізацію негайно</target> +<source>Logging</source> +<target>Лог-файли</target> +<source>FreeFileSync batch file</source> +<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target> +<source>FreeFileSync configuration</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FreeFileSync</target> +<source>FreeFileSync Batch Job</source> +<target>Пакетне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target> +<source>Unable to create logfile!</source> +<target>Ðе можна Ñтворити лог-файл!</target> +<source>Batch execution</source> +<target>Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target> +<source>Log-messages:</source> +<target>Лог-повідомленнÑ:</target> +<source>Stop</source> +<target>Стоп</target> +<source>Total time:</source> +<target>Загальний чаÑ:</target> +<source>Synchronization aborted!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð°!</target> +<source>Synchronization completed with errors!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑ Ð· помилками!</target> +<source>Synchronization completed successfully!</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð° уÑпішно!</target> +<source>Press "Switch" to open FreeFileSync GUI mode.</source> +<target>ÐатиÑніть "Змінити" Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ інтерфейÑу FreeFileSync.</target> +<source>Switching to FreeFileSync GUI mode...</source> +<target>Перехід до графічного інтерфейÑу FreeFileSync...</target> +<source>Unable to connect to sourceforge.net!</source> +<target>Ðе можна з’єднатиÑÑ Ð· sourceforge.net!</target> +<source>A newer version of FreeFileSync is available:</source> +<target>ДоÑтупна нова верÑÑ–Ñ FreeFileSync:</target> +<source>Download now?</source> +<target>Завантажити зараз?</target> +<source>Information</source> +<target>ІнформаціÑ</target> +<source>FreeFileSync is up to date!</source> +<target>У Ð’Ð°Ñ Ð½Ð°Ð¹Ð½Ð¾Ð²Ñ–ÑˆÐ° верÑÑ–Ñ FreeFileSync!</target> +<source>Do you want FreeFileSync to automatically check for updates every week?</source> +<target>Ви хочете, щоб FreeFileSync автоматично перевірÑв наÑвніÑÑ‚ÑŒ оновлень щотижнÑ?</target> +<source>(Requires an Internet connection!)</source> +<target>(Ðеобхідне Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Інтернету!)</target> +<source>1. &Compare</source> +<target>1. &ПорівнÑти</target> +<source>2. &Synchronize...</source> +<target>2. &Синхронізувати</target> +<source>S&witch view</source> +<target>Змінити відображеннÑ</target> +<source>&New</source> +<target>&Ðова</target> +<source>&Program</source> +<target>&Програма</target> +<source>&Language</source> +<target>&Мова</target> +<source>&Global settings...</source> +<target>&Глобальні налаштуваннÑ...</target> +<source>&Create batch job...</source> +<target>&Створити завданнÑ...</target> +<source>&Export file list...</source> +<target>&ЕкÑпортувати ÑпиÑок файлів...</target> +<source>&Advanced</source> +<target>&Додатково</target> +<source>&Check for new version</source> +<target>&Провірити наÑвніÑÑ‚ÑŒ нової верÑÑ–Ñ—</target> +<source>Compare</source> +<target>ПорівнÑти</target> +<source>Compare both sides</source> +<target>ПорівнÑти обидві Ñторони</target> +<source>&Abort</source> +<target>&Припинити</target> +<source>Synchronize...</source> +<target>Синхронізувати</target> +<source>Start synchronization</source> +<target>Розпочати Ñинхронізацію</target> +<source>Swap sides</source> +<target>ПомінÑти міÑцÑми</target> +<source>Add folder pair</source> +<target>Додати пару папок</target> +<source>Remove folder pair</source> +<target>Вилучити пару папок</target> +<source>Save current configuration to file</source> +<target>Зберегти активні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файлі</target> +<source>Load configuration from file</source> +<target>Завантажити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації з файла</target> +<source>Last used configurations (press DEL to remove from list)</source> +<target> +ОÑтанні викориÑтовувані Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації +(тиÑніть DEL Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку) +</target> +<source>Hide excluded items</source> +<target>Приховати виключені пункти</target> +<source>Hide filtered or temporarily excluded files</source> +<target>Приховати відфільтровані чи тимчаÑово виключені файли</target> +<source>Number of files and directories that will be created</source> +<target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть Ñтворені</target> +<source>Number of files that will be overwritten</source> +<target>ЧиÑло файлів, Ñкі будуть перезапиÑані</target> +<source>Number of files and directories that will be deleted</source> +<target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть вилучені</target> +<source>Total amount of data that will be transferred</source> +<target>Загальний об’єм даних, Ñкі будуть передаватиÑÑ</target> +<source>Left</source> +<target>Ліворуч</target> +<source>Right</source> +<target>Праворуч</target> +<source>Batch job</source> +<target>Пакетне завданнÑ</target> +<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> +<target>Створіть файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð¾Ñ— Ñинхронізації. Щоб запуÑтити програму в цьому режимі проÑто передайте назву файла на Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ FreeFileSync: FreeFileSync.exe <файл завданнÑ>. Це також може бути заплановано у планувальнику завдань операційної ÑиÑтеми.</target> +<source>Help</source> +<target>Допомога</target> +<source>Configuration overview:</source> +<target>ОглÑд конфігурації:</target> +<source>Filter files</source> +<target>Фільтр файлів</target> +<source>Status feedback</source> +<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±ÐµÑ€Ð½ÐµÐ½Ð¾Ð³Ð¾ зв’Ñзку</target> +<source>Silent mode</source> +<target>Тихий режим роботи</target> +<source>Start minimized and write status information to a logfile</source> +<target>ЗапуÑкати згорнутим Ñ– запиÑувати інформацію про Ñтан в лог-файл</target> +<source>Error handling</source> +<target>Обробка помилок</target> +<source>Overview</source> +<target>Головна</target> +<source>Select logfile directory:</source> +<target>Виберіть каталог Ð´Ð»Ñ Ð»Ð¾Ð³-файлів:</target> +<source>Maximum number of logfiles:</source> +<target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target> +<source>&Save</source> +<target>&Зберегти</target> +<source>&Load</source> +<target>&Завантажити</target> +<source>&Cancel</source> +<target>&Відмінити</target> +<source>Elements found:</source> +<target>Елементів знайдено:</target> +<source>Elements remaining:</source> +<target>Елементів залишилоÑÑŒ:</target> +<source>Speed:</source> +<target>ШвидкіÑÑ‚ÑŒ:</target> +<source>Time remaining:</source> +<target>ЗалишилоÑÑŒ чаÑу:</target> +<source>Time elapsed:</source> +<target>Пройшло чаÑу:</target> +<source>Operation:</source> +<target>ОпераціÑ:</target> +<source>Select variant:</source> +<target>Виберіть варіант:</target> +<source><Automatic></source> +<target><Ðвтоматичний></target> +<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> +<target>ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñ– Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на обох Ñторінах з викориÑтаннÑм бази даних. Вилучені файли Ñ– конфлікти визначаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.</target> +<source>Mirror ->></source> +<target>Дзеркало ->></target> +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Дзеркальна (резервна) ÐºÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ð²Ð¾Ñ— чаÑтини. Ð’ результаті Ñинхронізації права папка змінюєтьÑÑ Ð´Ð¾ полної відповідноÑÑ‚Ñ– лівій.</target> +<source>Update -></source> +<target>Оновити -></target> +<source>Copy new or updated files to right folder.</source> +<target>Копіювати нові чи оновлювати файли з правої Ñторони.</target> +<source>Custom</source> +<target>Вибірково</target> +<source>Configure your own synchronization rules.</source> +<target>Ðалаштувати влаÑні правила Ñинхронізації.</target> +<source>Deletion handling</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ</target> +<source>&OK</source> +<target>&OK</target> +<source>Configuration</source> +<target>ÐалаштуваннÑ</target> +<source>Category</source> +<target>КатегоріÑ</target> +<source>Action</source> +<target>ДіÑ</target> +<source>Files/folders that exist on left side only</source> +<target>Файли/папки, Ñкі Ñ” тільки ліворуч</target> +<source>Files/folders that exist on right side only</source> +<target>Файли/папки, Ñкі Ñ” тільки праворуч</target> +<source>Files that exist on both sides, left one is newer</source> +<target>Файли Ñ” по обох Ñторонах, лівий новіший</target> +<source>Files that exist on both sides, right one is newer</source> +<target>Файли Ñ” по обох Ñторонах, правий новіший</target> +<source>Files that have different content</source> +<target>Файли, Ñкі мають різний вміÑÑ‚</target> +<source>Conflicts/files that cannot be categorized</source> +<target>Конфлікти/файли, Ñкі не можуть бути віднеÑені до ÑкоїÑÑŒ категорії</target> +<source>Compare by...</source> +<target>Критерії порівнюваннÑ</target> +<source> +Files are found equal if + - file size + - last write time and date +are the same +</source> +<target> +Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо + - розмір файла + - Ñ‡Ð°Ñ Ñ– дата оÑтаннього запиÑу +Ñпівпадають +</target> +<source>File size and date</source> +<target>Розмір Ñ– дата файла</target> +<source> +Files are found equal if + - file content +is the same +</source> +<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target> +<source>File content</source> +<target>ВміÑÑ‚ файла</target> +<source>Symbolic Link handling</source> +<target>Обробка Ñимвольного поÑиланнÑ</target> +<source>Synchronizing...</source> +<target>СинхронізаціÑ...</target> +<source>Elements processed:</source> +<target>Елементів оброблено:</target> +<source>&Pause</source> +<target>&Пауза</target> +<source>Compare by "File size and date"</source> +<target>Порівнювати по розміру Ñ– даті</target> +<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> +<target>Цей варіант порівнює два файли з однаковими іменами Ñ– вважає Ñ—Ñ… рівними, Ñкщо вони мають однаковий розмір файла Ñ– однакову дату Ñ– Ñ‡Ð°Ñ Ð¾Ñтанньої зміни.</target> +<source>When the comparison is started with this option set the following decision tree is processed:</source> +<target>Коли порівнÑÐ½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾ з цими критеріÑми, алгоритм наÑтупний:</target> +<source>As a result the files are separated into the following categories:</source> +<target>У результаті файли розділено на такі категорії:</target> +<source>- equal</source> +<target>- однакові</target> +<source>- left newer</source> +<target>- ліві новіші</target> +<source>- right newer</source> +<target>- праві новіші</target> +<source>- exists left only</source> +<target>- тільки ліві Ñ–Ñнують</target> +<source>- exists right only</source> +<target>- Ñ–Ñнують тільки праворуч</target> +<source>- conflict (same date, different size)</source> +<target>- конфлікт (дати однакові, розміри різні)</target> +<source>Compare by "File content"</source> +<target>Порівнювати за вміÑтом</target> +<source> +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. + +With this option enabled the decision tree is smaller: +</source> +<target> +Як випливає з назви, два файли, Ñкі мають однакове ім'Ñ Ð²Ð²Ð°Ð¶Ð°ÑŽÑ‚ÑŒÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо Ñ– тільки Ñкщо вони мають однаковий вміÑÑ‚. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñна Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ ідентичноÑÑ‚Ñ–, а не Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ резервного копіюваннÑ. Тому дата файла не буде прийнÑта до уваги. + При цій опції дерево рішень Ñ” меншим: +</target> +<source>- different</source> +<target>- різні</target> +<source>Source code written in C++ utilizing:</source> +<target>Код програми напиÑаний на C++ з викориÑтаннÑм:</target> +<source>Big thanks for localizing FreeFileSync goes out to:</source> +<target>Щира подÑка за переклад FreeFileSync:</target> +<source>Feedback and suggestions are welcome at:</source> +<target>Відгуки та пропозиції виÑилайте на адреÑу:</target> +<source>FreeFileSync at Sourceforge</source> +<target>FreeFileSync на Sourceforge</target> +<source>Homepage</source> +<target>Оф.Ñайт</target> +<source>If you like FFS</source> +<target>Якщо Вам ÑподобавÑÑ FFS</target> +<source>Donate with PayPal</source> +<target>Пожертвувати через PayPal</target> +<source>Email</source> +<target>Почта</target> +<source>Report translation error</source> +<target>Повідомити: помилка перекладу</target> +<source>Published under the GNU General Public License:</source> +<target>Видано за ліцензією GNU General Public License:</target> +<source>Ignore subsequent errors</source> +<target>Ігнорувати наÑтупні помилки</target> +<source>Hide further error messages during the current process</source> +<target>Приховати наÑтупні помилки Ð¿Ñ–Ð´Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу</target> +<source>&Ignore</source> +<target>&Ігнорувати</target> +<source>&Retry</source> +<target>&Повторити</target> +<source>Do not show this dialog again</source> +<target>Ðадалі не показувати це вікно</target> +<source>&Switch</source> +<target>&Змінити</target> +<source>&Yes</source> +<target>&Так</target> +<source>&No</source> +<target>&ÐÑ–</target> +<source>Delete on both sides</source> +<target>Вилучити з обох Ñторін</target> +<source>Delete on both sides even if the file is selected on one side only</source> +<target>Вилучити з обох Ñторін, навіть Ñкщо файл виділений тільки з однієї Ñторони</target> +<source>Use Recycle Bin</source> +<target>ВикориÑтовувати "Корзину"</target> +<source> +Only files/directories that match all filter settings will be selected for synchronization. +Note: The name filter must be specified relative(!) to main synchronization directories. +</source> +<target> +Тільки файли/каталоги, Ñкі пройдуть фільтрацію будуть відібрані Ð´Ð»Ñ Ñинхронізації. +Фільтр буде заÑтоÑовуватиÑÑ Ð´Ð¾ імен відноÑно(!) оÑновних Ñинхронізованих папок. +</target> +<source>Hints:</source> +<target>Підказка:</target> +<source>1. Enter relative file or directory names separated by ';' or a new line.</source> +<target>1. Уведіть імена файлів чи каталогів, розділÑючи знаком ';' чи з нового Ñ€Ñдка.</target> +<source>2. Use wildcard characters '*' and '?'.</source> +<target>2. ВикориÑтайте Ñимволи '*' Ñ– '?'.</target> +<source>3. Exclude files directly on main grid via context menu.</source> +<target>3. Виключіть файли безпоÑередньо у головному вікні через контекÑтне меню.</target> +<source>Example</source> +<target>Приклад</target> +<source> +Include: *.doc;*.zip;*.exe +Exclude: \stuff\temp\* +</source> +<target> +Включити: *.doc;*.zip;*.exe +Виключити: \stuff\temp\* +</target> +<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> +<target>Синхронізувати вÑÑ– .doc, .zip Ñ– .exe файли, за винÑтком вÑÑ–Ñ… файлів з подкаталогу "temp"</target> +<source>Include</source> +<target>Включити</target> +<source>Exclude</source> +<target>Виключити</target> +<source>Select time span:</source> +<target>Виберіть проміжок чаÑу</target> +<source>Minimum file size:</source> +<target>Мінімальний розмір файла</target> +<source>Maximum file size:</source> +<target>МакÑимальний розмір файла</target> +<source>&Default</source> +<target>&За замовчуваннÑм</target> +<source>Move column up</source> +<target>ПереміÑтити догори</target> +<source>Move column down</source> +<target>ПереміÑтити донизу</target> +<source>Copy locked files</source> +<target>Копіювати заблоковані файли</target> +<source> +Copy shared or locked files using Volume Shadow Copy Service +(Requires Administrator rights) +</source> +<target> +Копіювати Ñпільних чи заблокованих файлів +з викориÑтаннÑм поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ +(потрібні права ÐдмініÑтратора) +</target> +<source>Copy filesystem permissions</source> +<target>Копіювати права доÑтупу файлової ÑиÑтеми</target> +<source> +Transfer file and directory permissions +(Requires Administrator rights) +</source> +<target> +Передача прав доÑтупу файла/каталогу +(потрібні права ÐдмініÑтратора) +</target> +<source>Hidden dialogs:</source> +<target>Приховані діалоги</target> +<source>Reset</source> +<target>Скинути</target> +<source>Show hidden dialogs</source> +<target>Показати приховані діалоги</target> +<source>External applications</source> +<target>Зовнішні програми</target> +<source>Description</source> +<target>ОпиÑ</target> +<source>Variant</source> +<target>Варіант</target> +<source>Statistics</source> +<target>СтатиÑтика</target> +<source>Find what:</source> +<target>Знайти:</target> +<source>Match case</source> +<target>Враховувати регіÑÑ‚Ñ€</target> +<source>&Find next</source> +<target>&Знайти наÑтупний</target> +<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> +<target>Ви можете Ñпробувати Ñинхронізувати решту пунктів знову (без повторного порівнюваннÑ)!</target> +<source>Batch file created successfully!</source> +<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑƒÑпішно Ñтворений!</target> +<source>Main bar</source> +<target>Головна панель</target> +<source>Folder pairs</source> +<target>Пари папок</target> +<source>Select view</source> +<target>СпиÑок файлів</target> +<source>Folder Comparison and Synchronization</source> +<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð¿Ð¾Ðº</target> +<source>Recycle Bin not yet supported for this system!</source> +<target>Корзина не підтримуєтьÑÑ Ñƒ цій ÑиÑтемі!</target> +<source>Set direction:</source> +<target>Виберіть напрÑм:</target> +<source>Exclude temporarily</source> +<target>Виключити тимчаÑово</target> +<source>Include temporarily</source> +<target>Включити</target> +<source>Exclude via filter:</source> +<target>Виключити через фільтр:</target> +<source><multiple selection></source> +<target><груповий вибір></target> +<source>D-Click</source> +<target>Клацніть двічі</target> +<source>Delete files DEL</source> +<target>Вилучити файл(и) DEL</target> +<source>Customize...</source> +<target>Вибрати колонки...</target> +<source>Auto-adjust columns</source> +<target>ÐÐ²Ñ‚Ð¾Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð¸ колонок</target> +<source>Include all rows</source> +<target>Відмінити вÑÑ–</target> +<source>Exclude all rows</source> +<target>Виключити вÑÑ– Ñ€Ñдки</target> +<source>Reset view</source> +<target>Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ відображеннÑ</target> +<source>Show "%x"</source> +<target>Показати "%x"</target> +<source><Last session></source> +<target><ОÑÑ‚Ð°Ð½Ð½Ñ ÑеÑÑ–Ñ></target> +<source>Configuration saved!</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації збережено!</target> +<source>Save changes to current configuration?</source> +<target>Зберегти зміни в активних налаштуваннÑÑ…?</target> +<source>Configuration loaded!</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації загружено!</target> +<source>Hide files that exist on left side only</source> +<target>Приховати файли, Ñкі Ñ” тільки ліворуч</target> +<source>Show files that exist on left side only</source> +<target>Показати файли, Ñкі Ñ” тільки ліворуч</target> +<source>Hide files that exist on right side only</source> +<target>Приховати файли, Ñкі Ñ” тільки праворуч</target> +<source>Show files that exist on right side only</source> +<target>Показати файли, Ñкі Ñ” тільки праворуч</target> +<source>Hide files that are newer on left</source> +<target>Приховати файли, котрі новіші ліворуч</target> +<source>Show files that are newer on left</source> +<target>Показати файли, Ñкі новіші ліворуч</target> +<source>Hide files that are newer on right</source> +<target>Приховати файли, котрі новіші праворуч</target> +<source>Show files that are newer on right</source> +<target>Показати файли, Ñкі новіші праворуч</target> +<source>Hide files that are equal</source> +<target>Приховати однакові файли</target> +<source>Show files that are equal</source> +<target>Показати однакові файли</target> +<source>Hide files that are different</source> +<target>Приховати файли з відмінноÑÑ‚Ñми</target> +<source>Show files that are different</source> +<target>Показати різні файли</target> +<source>Hide conflicts</source> +<target>Приховати конфлікти</target> +<source>Show conflicts</source> +<target>Показати конфлікти</target> +<source>Hide files that will be created on the left side</source> +<target>Приховати файли, Ñкі будуть Ñтворені ліворуч</target> +<source>Show files that will be created on the left side</source> +<target>Показати файли, Ñкі будуть Ñтворені ліворуч</target> +<source>Hide files that will be created on the right side</source> +<target>Приховати файли, Ñкі будуть Ñтворені праворуч</target> +<source>Show files that will be created on the right side</source> +<target>Показати файли, Ñкі будуть Ñтворені праворуч</target> +<source>Hide files that will be deleted on the left side</source> +<target>Приховати файли, Ñкі будуть вилучені ліворуч</target> +<source>Show files that will be deleted on the left side</source> +<target>Показати файли, Ñкі будуть вилучені ліворуч</target> +<source>Hide files that will be deleted on the right side</source> +<target>Приховати файли, Ñкі будуть вилучені праворуч</target> +<source>Show files that will be deleted on the right side</source> +<target>Показати файли, Ñкі будуть вилучені праворуч</target> +<source>Hide files that will be overwritten on left side</source> +<target>Приховати файли, Ñкі будуть перезапиÑані ліворуч</target> +<source>Show files that will be overwritten on left side</source> +<target>Показати файли, Ñкі будуть перезапиÑані ліворуч</target> +<source>Hide files that will be overwritten on right side</source> +<target>Приховати файли, Ñкі будуть перезапиÑані праворуч</target> +<source>Show files that will be overwritten on right side</source> +<target>Показати файли, Ñкі будуть перезапиÑані праворуч</target> +<source>Hide files that won't be copied</source> +<target>Приховати файли, Ñкі не будуть зкопійовані</target> +<source>Show files that won't be copied</source> +<target>Показати файли, Ñкі не будуть зкопійовані</target> +<source>All directories in sync!</source> +<target>Ð’ÑÑ– каталоги Ñинхронізовані!</target> +<source>Please run a Compare first before synchronizing!</source> +<target>Будь лаÑка, запуÑÑ‚Ñ–Ñ‚ÑŒ порівнÑÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ Ñинхронізацією!</target> +<source>Comma separated list</source> +<target>Розділений комами ÑпиÑок</target> +<source>Legend</source> +<target>Легенда</target> +<source>File list exported!</source> +<target>СпиÑок файлів екÑпортовано!</target> +<source> +<pluralform>Object deleted successfully!</pluralform> +<pluralform>%x objects deleted successfully!</pluralform> +</source> +<target> +<pluralform>%x об'єкт уÑпішно вилучено!</pluralform> +<pluralform>%x об'єкти уÑпішно вилучено!</pluralform> +<pluralform>%x об'єктів уÑпішно вилучено!</pluralform> +</target> +<source> +<pluralform>1 directory</pluralform> +<pluralform>%x directories</pluralform> +</source> +<target> +<pluralform>%x каталог</pluralform> +<pluralform>%x каталоги</pluralform> +<pluralform>%x каталогів</pluralform> +</target> +<source> +<pluralform>1 file</pluralform> +<pluralform>%x files</pluralform> +</source> +<target> +<pluralform>%x файл</pluralform> +<pluralform>%x файли</pluralform> +<pluralform>%x файлів</pluralform> +</target> +<source> +<pluralform>%x of 1 row in view</pluralform> +<pluralform>%x of %y rows in view</pluralform> +</source> +<target> +<pluralform>%x з %y Ñ€Ñдка</pluralform> +<pluralform>%x з %y Ñ€Ñдків</pluralform> +<pluralform>%x з %y Ñ€Ñдків</pluralform> +</target> +<source>Scanning...</source> +<target>СкануваннÑ...</target> +<source>Comparing content...</source> +<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту...</target> +<source>Paused</source> +<target>Ппризупинено</target> +<source>Aborted</source> +<target>Перервано</target> +<source>Completed</source> +<target>Завершено</target> +<source>Abort requested: Waiting for current operation to finish...</source> +<target>Запит перериваннÑ: Ð’ очікуванні Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— операції...</target> +<source>Continue</source> +<target>Далі</target> +<source>Pause</source> +<target>Пауза</target> +<source>Cannot find %x</source> +<target>Ðе можна знайти %x</target> +<source>DECISION TREE</source> +<target>Дерево рішень</target> +<source>file exists on both sides</source> +<target>файли Ñ–Ñнують по обох Ñторонах</target> +<source>on one side only</source> +<target>файли Ñ–Ñнують тільки з однієї Ñторони</target> +<source>same date</source> +<target>така Ñама дата</target> +<source>different date</source> +<target>інша дата</target> +<source>Inactive</source> +<target>Ðеактивний</target> +<source>Second</source> +<target>Секунда</target> +<source>Minute</source> +<target>Хвилина</target> +<source>Hour</source> +<target>Година</target> +<source>Day</source> +<target>День</target> +<source>Byte</source> +<target>Байт</target> +<source>KB</source> +<target>КБ</target> +<source>MB</source> +<target>МБ</target> +<source>Filter: All pairs</source> +<target>Фільтр: Ð’ÑÑ– пари</target> +<source>Filter: Single pair</source> +<target>Фільтр: Одна пара</target> +<source>Ignore</source> +<target>Ігнорувати</target> +<source>Direct</source> +<target>ПрÑмо</target> +<source>Follow</source> +<target>ПоÑлідовно</target> +<source>Integrate external applications into context menu. The following macros are available:</source> +<target>Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… додатків в контекÑтному меню. ДоÑтупні макроÑи:</target> +<source>- full file or directory name</source> +<target>- повне Ñ–Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ð° чи каталога</target> +<source>- directory part only</source> +<target>- лише каталог</target> +<source>- Other side's counterpart to %name</source> +<target>- аналогічний файл з другої Ñторони</target> +<source>- Other side's counterpart to %dir</source> +<target>- аналогічна папка з другої Ñторони</target> +<source>Restore all hidden dialogs?</source> +<target>Відновити вÑÑ– приховані діалогові вікна?</target> +<source> +<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> +<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> +</source> +<target> +<pluralform>Ви Ñправді хочете переміÑтити у Корзину цей %x об'єкт?</pluralform> +<pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єкти?</pluralform> +<pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єктів?</pluralform> +</target> +<source> +<pluralform>Do you really want to delete the following object?</pluralform> +<pluralform>Do you really want to delete the following %x objects?</pluralform> +</source> +<target> +<pluralform>Ви Ñправді хочете вилучити цей %x об'єкт?</pluralform> +<pluralform>Ви Ñправді хочете вилучити ці %x об'єкти?</pluralform> +<pluralform>Ви Ñправді хочете вилучити ці %x об'єктів?</pluralform> +</target> +<source>Leave as unresolved conflict</source> +<target>Залишити Ñк невирішений конфлікт</target> +<source>Delete permanently</source> +<target>Вилучати назавжди</target> +<source>Delete or overwrite files permanently</source> +<target>Вилучати чи перезапиÑати файли назавжди</target> +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target> +<source>Versioning</source> +<target>Переміщати файли, Ñкі вилучаютьÑÑ, в задану папку</target> +<source>Move files into a time-stamped subdirectory</source> +<target>Переміщати файли в підкатлог з чаÑовою міткою</target> +<source>Cannot determine sync-direction:</source> +<target>Ðе можна визначити напрÑм Ñинхронізації:</target> +<source>Filter settings have changed!</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð° були змінені!</target> +<source>Both sides have changed since last synchronization!</source> +<target>З моменту оÑтанньої Ñинхронізації з обох Ñторін відбулиÑÑ Ð·Ð¼Ñ–Ð½Ð¸!</target> +<source>No change since last synchronization!</source> +<target>Жодних змін з оÑтанньої Ñинхронізації!</target> +<source>The file was not processed by last synchronization!</source> +<target>Файл не був оброблений при оÑтанній Ñинхронізації!</target> +<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> +<target>Плановане Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ конфліктує з вкладеними підкаталогами чи файлами!</target> +<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> +<target> +ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð¿Ñ€Ñму Ñинхронізації за замовчуваннÑм: +Старі файли будуть замінені новішими файлами. +</target> +<source>The file does not contain a valid configuration:</source> +<target>Файл не міÑтить правильних налаштувань Ñинхронізації:</target> +<source>Scanning:</source> +<target>Сканую:</target> +<source>Encoding extended time information: %x</source> +<target>ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— інформації про чаÑ: %x</target> +<source>You can ignore this error to consider the directory as empty.</source> +<target>Ви можете проігнорувати помилку, вважаючи каталог порожнім.</target> +<source>Directory does not exist:</source> +<target>Каталог не Ñ–Ñнує:</target> +<source>Directories are dependent! Be careful when setting up synchronization rules:</source> +<target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target> +<source>Comparing content of files %x</source> +<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту файлів %x</target> +<source>Memory allocation failed!</source> +<target>Помилка Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–! (Ðе хватает памÑти)</target> +<source>File %x has an invalid date!</source> +<target>Файл %x має неіÑнуючу дату!</target> +<source>Conflict detected:</source> +<target>ВиÑвлено конфлікт:</target> +<source>Files %x have the same date but a different size!</source> +<target>Файли %x мають однакову дату, але різні за розміром!</target> +<source>Symlinks %x have the same date but a different target!</source> +<target>Символьне поÑÐ¸Ð»Ð°Ð½Ð½Ð½Ñ %x має таку ж дату, але різний вміÑÑ‚!</target> +<source>Comparing files by content failed.</source> +<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² за вміÑтом не вдалоÑÑ.</target> +<source>Generating file list...</source> +<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку файлів...</target> +<source>Multiple...</source> +<target>Різні варіанти...</target> +<source>Files that are equal on both sides</source> +<target>Файли, однакові з обох Ñторін</target> +<source>Equal files/folders that differ in attributes only</source> +<target>Однакові файли/папки, що відрізнÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ атрибутами</target> +<source>Copy from right to left</source> +<target>Копіювати Ñправа наліво</target> +<source>Copy from left to right</source> +<target>Копіювати зліва направо</target> +<source>Delete files/folders existing on left side only</source> +<target>Вилучати файли/папки, Ñкі Ñ–Ñнують тільки ліворуч</target> +<source>Delete files/folders existing on right side only</source> +<target>Вилучати файли/папки, Ñкі Ñ–Ñнують тільки праворуч</target> +<source>Copy from right to left overwriting</source> +<target>Копіювати Ñправа наліво перезапиÑуючи</target> +<source>Copy from left to right overwriting</source> +<target>Копіювати зліва направо перезапиÑуючи</target> +<source>Do nothing</source> +<target>Ðічого не робити</target> +<source>Copy attributes only from right to left</source> +<target>Копіювати тільки атрибути Ñправа наліво</target> +<source>Copy attributes only from left to right</source> +<target>Копіювати тільки атрибути зліва направо</target> +<source>Deleting file %x</source> +<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x</target> +<source>Deleting Symbolic Link %x</source> +<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x</target> +<source>Deleting folder %x</source> +<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target> +<source>Moving %x to Recycle Bin</source> +<target>Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ %x в "Корзину"</target> +<source>Moving file %x to user-defined directory %y</source> +<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x у визначений кориÑтувачем каталог %y</target> +<source>Moving folder %x to user-defined directory %y</source> +<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x у визначений кориÑтувачем каталог %y</target> +<source>Moving Symbolic Link %x to user-defined directory %y</source> +<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x у визначений кориÑтувачем каталог %y</target> +<source>Copying new file %x to %y</source> +<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ файла %x в %y</target> +<source>Copying new Symbolic Link %x to %y</source> +<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target> +<source>Overwriting file %x in %y</source> +<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %x в %y</target> +<source>Overwriting Symbolic Link %x in %y</source> +<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target> +<source>Creating folder %x</source> +<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target> +<source>Verifying file %x</source> +<target>Перевірка файла %x</target> +<source>Updating attributes of %x</source> +<target>ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² %x</target> +<source>Source directory does not exist anymore:</source> +<target>Каталог-джерело вже не Ñ–Ñнує:</target> +<source>Generating database...</source> +<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних...</target> +<source>Nothing to synchronize according to configuration!</source> +<target>Ðічого Ñинхронізувати згідно з налаштуваннÑми Ñинхронізації!</target> +<source>Target directory name must not be empty!</source> +<target>Кінцевий каталог не повинен бути порожнім</target> +<source>User-defined directory for deletion was not specified!</source> +<target>Каталог Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачем вказана не була!</target> +<source>Unresolved conflicts existing!</source> +<target>Є невирішені конфлікти</target> +<source>You can ignore conflicts and continue synchronization.</source> +<target>Ви можете проігнорувати Ñ—Ñ… та продовжити Ñинхронізацію.</target> +<source>Significant difference detected:</source> +<target>ВиÑвлена Ñ–Ñтотна різницÑ:</target> +<source>More than 50% of the total number of files will be copied or deleted!</source> +<target>Понад 50% загальної кількоÑÑ‚Ñ– файлів буде зкопійовано чи вилучено!</target> +<source>Not enough free disk space available in:</source> +<target>Ðе доÑтатньо вільного міÑÑ†Ñ Ð²:</target> +<source>Free disk space required:</source> +<target>Потрібне вільне міÑце на диÑку:</target> +<source>Free disk space available:</source> +<target>ДоÑтупно вільного міÑÑ†Ñ Ð½Ð° диÑку:</target> +<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> +<target>Каталог, Ñкий Ñ” чаÑтиною декількох пар папок, буде змінений. Будь лаÑка, перевірте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації!</target> +<source>Processing folder pair:</source> +<target>Обробка пари папок:</target> +<source>Error copying locked file %x!</source> +<target>Помилка при копіюванні заблокованого файла %x!</target> +<source>Data verification error: Source and target file have different content!</source> +<target>Помилка перевірки даних: вхідний Ñ– вихідний файли мають різний вміÑÑ‚!</target> diff --git a/BUILD/Resources.dat b/BUILD/Resources.dat Binary files differindex 45661da2..23f84129 100644 --- a/BUILD/Resources.dat +++ b/BUILD/Resources.dat diff --git a/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj b/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj index 9bf322e1..50b8ec67 100644 --- a/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj +++ b/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj @@ -68,7 +68,7 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)_beta</TargetName> <GenerateManifest>false</GenerateManifest> @@ -76,21 +76,21 @@ </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)_beta</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>false</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> @@ -101,7 +101,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -117,12 +117,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw29ud_aui.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> </ResourceCompile> <Manifest> @@ -136,7 +136,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -152,12 +152,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> </ResourceCompile> <Manifest> @@ -173,7 +173,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -188,12 +188,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> <Culture> </Culture> @@ -207,7 +207,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -223,12 +223,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> <Culture> </Culture> @@ -251,7 +251,6 @@ <ClCompile Include="library\icon_buffer.cpp" /> <ClCompile Include="library\process_xml.cpp" /> <ClCompile Include="library\resources.cpp" /> - <ClCompile Include="library\soft_filter.cpp" /> <ClCompile Include="library\statistics.cpp" /> <ClCompile Include="library\status_handler.cpp" /> <ClCompile Include="shared\app_main.cpp" /> @@ -270,7 +269,7 @@ <ClCompile Include="shared\guid.cpp" /> <ClCompile Include="shared\help_provider.cpp" /> <ClCompile Include="shared\i18n.cpp" /> - <ClCompile Include="shared\long_path_prefix.cpp" /> + <ClCompile Include="shared\localization.cpp" /> <ClCompile Include="shared\mouse_move_dlg.cpp" /> <ClCompile Include="shared\privilege.cpp" /> <ClCompile Include="shared\recycler.cpp" /> @@ -278,7 +277,7 @@ <ClCompile Include="shared\serialize.cpp" /> <ClCompile Include="shared\shadow.cpp" /> <ClCompile Include="shared\standard_paths.cpp" /> - <ClCompile Include="shared\system_func.cpp" /> + <ClCompile Include="shared\last_error.cpp" /> <ClCompile Include="shared\taskbar.cpp" /> <ClCompile Include="shared\tinyxml\tinyxml.cpp" /> <ClCompile Include="shared\tinyxml\tinyxmlerror.cpp" /> diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index 11935a91..e087bd33 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -4,10 +4,11 @@ <Project> <Option title="FreeFileSync" /> <Option makefile="makefile" /> + <Option pch_mode="2" /> <Option compiler="gcc" /> <Build> <Target title="Release"> - <Option output="BUILD\FreeFileSync_Win32" prefix_auto="1" extension_auto="1" /> + <Option output="BUILD\Bin\FreeFileSync_Win32" prefix_auto="1" extension_auto="1" /> <Option working_dir="BUILD\" /> <Option object_output="OBJ\FFS_Release_32_MinGW\" /> <Option type="0" /> @@ -59,7 +60,7 @@ </Linker> </Target> <Target title="Debug-DLL"> - <Option output="BUILD\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" /> + <Option output="BUILD\Bin\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" /> <Option working_dir="BUILD" /> <Option object_output="OBJ\FFS_Debug_32_MinGW\" /> <Option type="0" /> @@ -167,10 +168,6 @@ <Option target="Release" /> <Option target="Debug-DLL" /> </Unit> - <Unit filename="library\filter.cpp" /> - <Unit filename="library\filter.h"> - <Option target="<{~None~}>" /> - </Unit> <Unit filename="library\gtest\main.cpp"> <Option target="Unit Test" /> </Unit> @@ -192,6 +189,8 @@ <Unit filename="library\gtest\unittest3.cpp"> <Option target="Unit Test" /> </Unit> + <Unit filename="library\hard_filter.cpp" /> + <Unit filename="library\hard_filter.h" /> <Unit filename="library\icon_buffer.cpp"> <Option target="Release" /> <Option target="Debug-DLL" /> @@ -200,6 +199,8 @@ <Option target="Release" /> <Option target="Debug-DLL" /> </Unit> + <Unit filename="library\lock_holder.h" /> + <Unit filename="library\norm_filter.h" /> <Unit filename="library\process_xml.cpp" /> <Unit filename="library\process_xml.h"> <Option target="<{~None~}>" /> @@ -208,7 +209,6 @@ <Unit filename="library\resources.h"> <Option target="<{~None~}>" /> </Unit> - <Unit filename="library\soft_filter.cpp" /> <Unit filename="library\soft_filter.h" /> <Unit filename="library\statistics.cpp"> <Option target="Release" /> @@ -265,6 +265,7 @@ <Unit filename="shared\dll_loader.h" /> <Unit filename="shared\dst_hack.cpp" /> <Unit filename="shared\dst_hack.h" /> + <Unit filename="shared\file_drop.h" /> <Unit filename="shared\file_error.h" /> <Unit filename="shared\file_handling.cpp" /> <Unit filename="shared\file_handling.h" /> @@ -288,12 +289,18 @@ </Unit> <Unit filename="shared\i18n.cpp" /> <Unit filename="shared\i18n.h" /> - <Unit filename="shared\long_path_prefix.cpp" /> + <Unit filename="shared\int64.h" /> + <Unit filename="shared\last_error.cpp" /> + <Unit filename="shared\last_error.h" /> + <Unit filename="shared\localization.cpp" /> + <Unit filename="shared\localization.h" /> <Unit filename="shared\long_path_prefix.h" /> <Unit filename="shared\mouse_move_dlg.cpp"> <Option target="Release" /> <Option target="Debug-DLL" /> </Unit> + <Unit filename="shared\parse_plural.h" /> + <Unit filename="shared\parse_txt.h" /> <Unit filename="shared\pch.h"> <Option compile="1" /> <Option weight="0" /> @@ -313,10 +320,9 @@ <Unit filename="shared\standard_paths.cpp" /> <Unit filename="shared\standard_paths.h" /> <Unit filename="shared\string_conv.h" /> + <Unit filename="shared\string_tools.h" /> <Unit filename="shared\symlink_target.h" /> <Unit filename="shared\system_constants.h" /> - <Unit filename="shared\system_func.cpp" /> - <Unit filename="shared\system_func.h" /> <Unit filename="shared\taskbar.cpp"> <Option target="Release" /> <Option target="Debug-DLL" /> diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj index 3524b5ee..93fe581e 100644 --- a/FreeFileSync.vcxproj +++ b/FreeFileSync.vcxproj @@ -68,7 +68,7 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> @@ -76,21 +76,21 @@ </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>false</LinkIncremental> - <OutDir>BUILD\</OutDir> + <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> @@ -101,7 +101,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -117,12 +117,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> </ResourceCompile> <Manifest> @@ -136,7 +136,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -152,12 +152,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> </ResourceCompile> <Manifest> @@ -173,7 +173,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -189,12 +189,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> <Culture> </Culture> @@ -208,7 +208,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -224,13 +224,13 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> <Culture> </Culture> @@ -249,11 +249,10 @@ <ClCompile Include="library\db_file.cpp" /> <ClCompile Include="library\dir_lock.cpp" /> <ClCompile Include="library\error_log.cpp" /> - <ClCompile Include="library\filter.cpp" /> + <ClCompile Include="library\hard_filter.cpp" /> <ClCompile Include="library\icon_buffer.cpp" /> <ClCompile Include="library\process_xml.cpp" /> <ClCompile Include="library\resources.cpp" /> - <ClCompile Include="library\soft_filter.cpp" /> <ClCompile Include="library\statistics.cpp" /> <ClCompile Include="library\status_handler.cpp" /> <ClCompile Include="shared\app_main.cpp" /> @@ -272,7 +271,7 @@ <ClCompile Include="shared\guid.cpp" /> <ClCompile Include="shared\help_provider.cpp" /> <ClCompile Include="shared\i18n.cpp" /> - <ClCompile Include="shared\long_path_prefix.cpp" /> + <ClCompile Include="shared\localization.cpp" /> <ClCompile Include="shared\mouse_move_dlg.cpp" /> <ClCompile Include="shared\privilege.cpp" /> <ClCompile Include="shared\recycler.cpp" /> @@ -280,7 +279,7 @@ <ClCompile Include="shared\serialize.cpp" /> <ClCompile Include="shared\shadow.cpp" /> <ClCompile Include="shared\standard_paths.cpp" /> - <ClCompile Include="shared\system_func.cpp" /> + <ClCompile Include="shared\last_error.cpp" /> <ClCompile Include="shared\taskbar.cpp" /> <ClCompile Include="shared\tinyxml\tinyxml.cpp" /> <ClCompile Include="shared\tinyxml\tinyxmlerror.cpp" /> @@ -58,11 +58,12 @@ FILE_LIST+=ui/small_dlgs.cpp FILE_LIST+=library/process_xml.cpp FILE_LIST+=library/icon_buffer.cpp FILE_LIST+=library/statistics.cpp -FILE_LIST+=library/filter.cpp +FILE_LIST+=library/hard_filter.cpp FILE_LIST+=library/binary.cpp FILE_LIST+=library/db_file.cpp FILE_LIST+=library/dir_lock.cpp -FILE_LIST+=shared/i18n_no_BOM.cpp +FILE_LIST+=shared/i18n.cpp +FILE_LIST+=shared/localization.cpp FILE_LIST+=shared/file_io.cpp FILE_LIST+=shared/dir_name.cpp FILE_LIST+=shared/guid.cpp @@ -71,7 +72,7 @@ FILE_LIST+=shared/tinyxml/tinyxml.cpp FILE_LIST+=shared/tinyxml/tinyxmlerror.cpp FILE_LIST+=shared/tinyxml/tinyxmlparser.cpp FILE_LIST+=shared/global_func.cpp -FILE_LIST+=shared/system_func.cpp +FILE_LIST+=shared/last_error.cpp FILE_LIST+=shared/custom_tooltip.cpp FILE_LIST+=shared/file_handling.cpp FILE_LIST+=shared/resolve_path.cpp @@ -98,11 +99,8 @@ DEP_LIST=$(foreach file, $(FILE_LIST), $(subst .cpp,.dep,$(file))) all: FreeFileSync init: - if [ ! -d OBJ ]; then mkdir OBJ; fi - if [ ! -d OBJ/FFS_Release_GCC_Make ]; then mkdir OBJ/FFS_Release_GCC_Make; fi -#remove byte ordering mark: needed by Visual C++ but an error with GCC - g++ -o OBJ/FFS_Release_GCC_Make/removeBOM tools/remove_BOM.cpp - ./OBJ/FFS_Release_GCC_Make/removeBOM shared/i18n.cpp shared/i18n_no_BOM.cpp + if [ ! -d ./OBJ ]; then mkdir OBJ; fi + if [ ! -d ./OBJ/FFS_Release_GCC_Make ]; then mkdir OBJ/FFS_Release_GCC_Make; fi %.dep : %.cpp #strip path information @@ -115,7 +113,6 @@ FreeFileSync: init $(DEP_LIST) clean: rm -rf OBJ/FFS_Release_GCC_Make rm -f BUILD/$(APPNAME) - rm -f shared/i18n_no_BOM.cpp install: if [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp index 66fc5452..a3341c94 100644 --- a/RealtimeSync/RealtimeSync.cbp +++ b/RealtimeSync/RealtimeSync.cbp @@ -4,10 +4,11 @@ <Project> <Option title="RealtimeSync" /> <Option makefile="makefile" /> + <Option pch_mode="2" /> <Option compiler="gcc" /> <Build> <Target title="Release"> - <Option output="..\BUILD\RealtimeSync_Win32" prefix_auto="1" extension_auto="1" /> + <Option output="..\BUILD\Bin\RealtimeSync_Win32" prefix_auto="1" extension_auto="1" /> <Option working_dir="..\BUILD" /> <Option object_output="..\OBJ\RTS_Release_32_MinGW" /> <Option type="0" /> @@ -31,7 +32,7 @@ </Linker> </Target> <Target title="Debug-DLL"> - <Option output="..\BUILD\RealtimeSync_Debug" prefix_auto="1" extension_auto="1" /> + <Option output="..\BUILD\Bin\RealtimeSync_Debug" prefix_auto="1" extension_auto="1" /> <Option working_dir="..\BUILD" /> <Option object_output="..\OBJ\RTS_Debug_32_MinGW" /> <Option type="0" /> @@ -136,7 +137,9 @@ <Unit filename="..\shared\help_provider.cpp" /> <Unit filename="..\shared\i18n.cpp" /> <Unit filename="..\shared\i18n.h" /> - <Unit filename="..\shared\long_path_prefix.cpp" /> + <Unit filename="..\shared\last_error.cpp" /> + <Unit filename="..\shared\last_error.h" /> + <Unit filename="..\shared\localization.cpp" /> <Unit filename="..\shared\long_path_prefix.h" /> <Unit filename="..\shared\mouse_move_dlg.cpp" /> <Unit filename="..\shared\pch.h"> @@ -149,8 +152,6 @@ <Unit filename="..\shared\resolve_path.h" /> <Unit filename="..\shared\standard_paths.cpp" /> <Unit filename="..\shared\standard_paths.h" /> - <Unit filename="..\shared\system_func.cpp" /> - <Unit filename="..\shared\system_func.h" /> <Unit filename="..\shared\tinyxml\tinystr.cpp" /> <Unit filename="..\shared\tinyxml\tinyxml.cpp" /> <Unit filename="..\shared\tinyxml\tinyxmlerror.cpp" /> diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj index fa69ffdf..b141e391 100644 --- a/RealtimeSync/RealtimeSync.vcxproj +++ b/RealtimeSync/RealtimeSync.vcxproj @@ -68,28 +68,28 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> - <OutDir>..\BUILD\</OutDir> + <OutDir>..\BUILD\Bin\</OutDir> <IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> - <OutDir>..\BUILD\</OutDir> + <OutDir>..\BUILD\Bin\</OutDir> <IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> - <OutDir>..\BUILD\</OutDir> + <OutDir>..\BUILD\Bin\</OutDir> <IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>false</LinkIncremental> - <OutDir>..\BUILD\</OutDir> + <OutDir>..\BUILD\Bin\</OutDir> <IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> @@ -100,7 +100,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)/../shared/pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -115,12 +115,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> </ResourceCompile> </ItemDefinitionGroup> @@ -130,7 +130,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)/../shared/pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <MultiProcessorCompilation>false</MultiProcessorCompilation> @@ -146,12 +146,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> </ResourceCompile> </ItemDefinitionGroup> @@ -163,7 +163,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -178,12 +178,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions> <Culture> </Culture> @@ -197,7 +197,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -213,12 +213,12 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions> <Culture> </Culture> @@ -237,12 +237,12 @@ <ClCompile Include="..\shared\global_func.cpp" /> <ClCompile Include="..\shared\help_provider.cpp" /> <ClCompile Include="..\shared\i18n.cpp" /> - <ClCompile Include="..\shared\long_path_prefix.cpp" /> + <ClCompile Include="..\shared\localization.cpp" /> <ClCompile Include="..\shared\mouse_move_dlg.cpp" /> <ClCompile Include="..\shared\privilege.cpp" /> <ClCompile Include="..\shared\resolve_path.cpp" /> <ClCompile Include="..\shared\standard_paths.cpp" /> - <ClCompile Include="..\shared\system_func.cpp" /> + <ClCompile Include="..\shared\last_error.cpp" /> <ClCompile Include="..\shared\tinyxml\tinyxml.cpp" /> <ClCompile Include="..\shared\tinyxml\tinyxmlerror.cpp" /> <ClCompile Include="..\shared\tinyxml\tinyxmlparser.cpp" /> diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index 37f5c192..88e5ab53 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -9,7 +9,7 @@ #include <wx/event.h> #include "resources.h" #include <wx/msgdlg.h> -#include "../shared/i18n.h" +#include "../shared/localization.h" #include "xml_ffs.h" #include "../shared/standard_paths.h" #include <wx/file.h> @@ -42,11 +42,11 @@ void Application::OnStartApplication(wxIdleEvent& event) SetAppName(wxT("FreeFileSync")); //use a different app name, to have "GetUserDataDir()" return the same directory as for FreeFileSync #ifdef FFS_LINUX - ::gtk_rc_parse(ffs3::wxToZ(ffs3::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons + ::gtk_rc_parse(zen::wxToZ(zen::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons #endif //set program language - ffs3::setLanguage(rts::getProgramLanguage()); + zen::setLanguage(rts::getProgramLanguage()); //try to set config/batch-filename set by %1 parameter wxString cfgFilename; @@ -90,7 +90,7 @@ int Application::OnRun() catch (const std::exception& e) //catch all STL exceptions { //unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works! - wxFile safeOutput(ffs3::getConfigDir() + wxT("LastError.txt"), wxFile::write); + wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what())); diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp index 05f0bc9b..b11ff848 100644 --- a/RealtimeSync/main_dlg.cpp +++ b/RealtimeSync/main_dlg.cpp @@ -24,7 +24,7 @@ #include "../shared/util.h" #include "../shared/mouse_move_dlg.h" -using namespace ffs3; +using namespace zen; MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) @@ -43,12 +43,11 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), NULL, this); //prepare drag & drop - dirNameFirst.reset(new ffs3::DirectoryName(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch)); + dirNameFirst.reset(new zen::DirectoryName(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch)); #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - m_panelMain); //ownership passed to "this" + new MouseMoveWindow(*this); //ownership passed to "this" #endif @@ -121,7 +120,7 @@ void MainDialog::OnQuit(wxCommandEvent& event) const wxString& MainDialog::lastConfigFileName() { - static wxString instance = ffs3::getConfigDir() + wxT("LastRun.ffs_real"); + static wxString instance = zen::getConfigDir() + wxT("LastRun.ffs_real"); return instance; } @@ -129,9 +128,9 @@ const wxString& MainDialog::lastConfigFileName() void MainDialog::OnShowHelp(wxCommandEvent& event) { #ifdef FFS_WIN - ffs3::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html")); + zen::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html")); #elif defined FFS_LINUX - ffs3::displayHelpEntry(wxT("html/advanced/RealtimeSync.html")); + zen::displayHelpEntry(wxT("html/advanced/RealtimeSync.html")); #endif } @@ -178,7 +177,7 @@ void MainDialog::OnStart(wxCommandEvent& event) Hide(); - switch (rts::startDirectoryMonitor(currentCfg, ffs3::extractJobName(currentConfigFileName))) + switch (rts::startDirectoryMonitor(currentCfg, zen::extractJobName(currentConfigFileName))) { case rts::QUIT: { @@ -222,7 +221,7 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) writeRealConfig(currentCfg, newFileName); setLastUsedConfig(newFileName); } - catch (const ffs3::FileError& error) + catch (const zen::FileError& error) { wxMessageBox(error.msg().c_str(), _("Error"), wxOK | wxICON_ERROR); } @@ -283,14 +282,14 @@ void MainDialog::OnLoadConfig(wxCommandEvent& event) void MainDialog::setConfiguration(const xmlAccess::XmlRealConfig& cfg) { //clear existing folders - dirNameFirst->setName(Zstring()); + dirNameFirst->setName(wxString()); clearAddFolders(); if (!cfg.directories.empty()) { //fill top folder - dirNameFirst->setName(wxToZ(*cfg.directories.begin())); + dirNameFirst->setName(*cfg.directories.begin()); //fill additional folders addFolder(std::vector<wxString>(cfg.directories.begin() + 1, cfg.directories.end())); @@ -308,9 +307,9 @@ xmlAccess::XmlRealConfig MainDialog::getConfiguration() { xmlAccess::XmlRealConfig output; - output.directories.push_back(zToWx(dirNameFirst->getName())); + output.directories.push_back(dirNameFirst->getName()); for (std::vector<DirectoryPanel*>::const_iterator i = dirNamesExtra.begin(); i != dirNamesExtra.end(); ++i) - output.directories.push_back(zToWx((*i)->getName())); + output.directories.push_back((*i)->getName()); output.commandline = m_textCtrlCommand->GetValue(); output.delay = m_spinCtrlDelay->GetValue();; @@ -321,10 +320,10 @@ xmlAccess::XmlRealConfig MainDialog::getConfiguration() void MainDialog::OnAddFolder(wxCommandEvent& event) { - const wxString topFolder = zToWx(dirNameFirst->getName()); + const wxString topFolder = dirNameFirst->getName(); //clear existing top folder first - dirNameFirst->setName(Zstring()); + dirNameFirst->setName(wxString()); std::vector<wxString> newFolders; newFolders.push_back(topFolder); @@ -352,9 +351,9 @@ void MainDialog::OnRemoveTopFolder(wxCommandEvent& event) { if (dirNamesExtra.size() > 0) { - const wxString topDir = zToWx((*dirNamesExtra.begin())->getName()); + const wxString topDir = (*dirNamesExtra.begin())->getName(); - dirNameFirst->setName(wxToZ(topDir)); + dirNameFirst->setName(topDir); removeAddFolder(0); //remove first of additional folders } @@ -400,7 +399,7 @@ void MainDialog::addFolder(const std::vector<wxString>& newFolders, bool addFron newFolder->m_bpButtonRemoveFolder->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolder), NULL, this ); //insert directory name - newFolder->setName(wxToZ(*i)); + newFolder->setName(*i); } //set size of scrolled window diff --git a/RealtimeSync/main_dlg.h b/RealtimeSync/main_dlg.h index 8b06bec4..2ce04557 100644 --- a/RealtimeSync/main_dlg.h +++ b/RealtimeSync/main_dlg.h @@ -26,18 +26,11 @@ public: FolderGenerated(parent), dirName(*this, *m_dirPicker, *m_txtCtrlDirectory) {} - void setName(const Zstring& dirname) - { - dirName.setName(dirname); - } - - Zstring getName() const - { - return dirName.getName(); - } + void setName(const wxString& dirname) { dirName.setName(dirname); } + wxString getName() const { return dirName.getName(); } private: - ffs3::DirectoryName dirName; + zen::DirectoryName dirName; }; @@ -76,7 +69,7 @@ private: static const wxString& lastConfigFileName(); - std::auto_ptr<ffs3::DirectoryName> dirNameFirst; + std::auto_ptr<zen::DirectoryName> dirNameFirst; std::vector<DirectoryPanel*> dirNamesExtra; //additional pairs to the standard pair wxString currentConfigFileName; diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 5f797cce..8f9e4863 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -28,13 +28,14 @@ FILE_LIST+=../library/process_xml.cpp FILE_LIST+=../structures.cpp FILE_LIST+=../shared/util.cpp FILE_LIST+=../shared/check_exist.cpp -FILE_LIST+=../shared/i18n_no_BOM.cpp +FILE_LIST+=../shared/i18n.cpp +FILE_LIST+=../shared/localization.cpp FILE_LIST+=../shared/inotify/inotify-cxx.cpp FILE_LIST+=../shared/tinyxml/tinyxml.cpp FILE_LIST+=../shared/tinyxml/tinyxmlerror.cpp FILE_LIST+=../shared/tinyxml/tinyxmlparser.cpp FILE_LIST+=../shared/global_func.cpp -FILE_LIST+=../shared/system_func.cpp +FILE_LIST+=../shared/last_error.cpp FILE_LIST+=../shared/dir_name.cpp FILE_LIST+=../shared/zstring.cpp FILE_LIST+=../shared/xml_base.cpp @@ -58,9 +59,6 @@ all: RealtimeSync init: if [ ! -d ../OBJ ]; then mkdir ../OBJ; fi if [ ! -d ../OBJ/RTS_Release_GCC_Make ]; then mkdir ../OBJ/RTS_Release_GCC_Make; fi -#remove byte ordering mark: needed by Visual C++ but an error with GCC - g++ -o ../OBJ/RTS_Release_GCC_Make/removeBOM ../tools/remove_BOM.cpp - ../OBJ/RTS_Release_GCC_Make/removeBOM ../shared/i18n.cpp ../shared/i18n_no_BOM.cpp %.dep : %.cpp #strip path information @@ -73,7 +71,6 @@ RealtimeSync: init $(DEP_LIST) clean: rm -rf ../OBJ/RTS_Release_GCC_Make rm -f ../BUILD/$(APPNAME) - rm -f ../shared/i18n_no_BOM.cpp install: if [ ! -d $(BINDIR) ] ; then mkdir -p $(BINDIR); fi diff --git a/RealtimeSync/notify.cpp b/RealtimeSync/notify.cpp index 62c80940..5969ee08 100644 --- a/RealtimeSync/notify.cpp +++ b/RealtimeSync/notify.cpp @@ -6,13 +6,13 @@ // #include "notify.h" #include <set> -#include "../shared/system_func.h" +#include "../shared/last_error.h" #include "../shared/Loki/ScopeGuard.h" #include <algorithm> #include <boost/bind.hpp> #include <dbt.h> -using namespace ffs3; +using namespace zen; /* @@ -99,8 +99,8 @@ MessageProvider::MessageProvider() : windowHandle(NULL) { if (process == NULL) - throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + - ffs3::getLastErrorFormatted() + wxT(" (GetModuleHandle)")); + throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + + zen::getLastErrorFormatted() + wxT(" (GetModuleHandle)")); //register the main window class WNDCLASS wc = {}; @@ -109,8 +109,8 @@ MessageProvider::MessageProvider() : wc.lpszClassName = WINDOW_NAME; if (::RegisterClass(&wc) == 0) - throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + - ffs3::getLastErrorFormatted() + wxT(" (RegisterClass)")); + throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + + zen::getLastErrorFormatted() + wxT(" (RegisterClass)")); Loki::ScopeGuard guardClass = Loki::MakeGuard(::UnregisterClass, WINDOW_NAME, process); @@ -128,8 +128,8 @@ MessageProvider::MessageProvider() : process, //HINSTANCE hInstance, NULL); //LPVOID lpParam if (windowHandle == NULL) - throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + - ffs3::getLastErrorFormatted() + wxT(" (CreateWindow)")); + throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") + + zen::getLastErrorFormatted() + wxT(" (CreateWindow)")); guardClass.Dismiss(); } @@ -201,7 +201,7 @@ public: if (lastError != ERROR_CALL_NOT_IMPLEMENTED && //fail on SAMBA share: this shouldn't be a showstopper! lastError != ERROR_SERVICE_SPECIFIC_ERROR && //neither should be fail for "Pogoplug" mapped network drives lastError != ERROR_INVALID_DATA) //this seems to happen for a NetDrive-mapped FTP server - throw ffs3::FileError(wxString(wxT("Could not register device removal notifications:")) + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError)); + throw zen::FileError(wxString(wxT("Could not register device removal notifications:")) + wxT("\n\n") + zen::getLastErrorFormatted(lastError)); } else notifications.insert(hNotfication); diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp index 64de4700..24356ff8 100644 --- a/RealtimeSync/resources.cpp +++ b/RealtimeSync/resources.cpp @@ -13,7 +13,7 @@ #include "../shared/standard_paths.h" #include "../shared/system_constants.h" -using namespace ffs3; +using namespace zen; const GlobalResources& GlobalResources::getInstance() @@ -42,7 +42,7 @@ GlobalResources::~GlobalResources() void GlobalResources::load() const { - wxFFileInputStream input(ffs3::getResourceDir() + wxT("Resources.dat")); + wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp index fbfc3167..d42aea0a 100644 --- a/RealtimeSync/tray_menu.cpp +++ b/RealtimeSync/tray_menu.cpp @@ -8,6 +8,7 @@ #include <algorithm> #include <iterator> #include <limits> +#include <set> #include <wx/msgdlg.h> #include <wx/taskbar.h> #include <wx/app.h> @@ -23,6 +24,7 @@ #include "../shared/i18n.h" #include "../shared/assert_static.h" #include "../shared/build_info.h" +#include "../shared/shell_execute.h" using namespace rts; @@ -225,7 +227,7 @@ std::vector<Zstring> convert(const std::vector<wxString>& dirList) { std::set<Zstring, LessFilename> output; std::transform(dirList.begin(), dirList.end(), - std::inserter(output, output.end()), static_cast<Zstring (*)(const wxString&)>(ffs3::wxToZ)); + std::inserter(output, output.end()), static_cast<Zstring (*)(const wxString&)>(zen::wxToZ)); return std::vector<Zstring>(output.begin(), output.end()); } } @@ -296,7 +298,11 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& WaitCallbackImpl callback(jobname); if (config.commandline.empty()) - throw ffs3::FileError(_("Command line is empty!")); + { + wxString errorMsg = _("Invalid commandline: \"%x\""); + errorMsg.Replace(L"%x", config.commandline); + throw zen::FileError(errorMsg); + } callback.notifyDirectoryMissing(); waitForMissingDirs(dirList, &callback); @@ -305,12 +311,7 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& while (true) { //execute command - { - //by default wxExecute uses a zero sized dummy window as a hack to keep focus which leaves a useless empty icon in ALT-TAB list - //=> use wxEXEC_NODISABLE and roll our own window disabler! (see comment in app.cpp: void *wxGUIAppTraits::BeforeChildWaitLoop()) - wxWindowDisabler dummy; //disables all top level windows - wxExecute(config.commandline, wxEXEC_SYNC | wxEXEC_NODISABLE); - } + zen::shellExecute(config.commandline, zen::EXEC_TYPE_SYNC); wxLog::FlushActive(); //show wxWidgets error messages (if any) @@ -343,7 +344,7 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& { return ab.getCommand(); } - catch (const ffs3::FileError& error) + catch (const zen::FileError& error) { wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR); return RESUME; diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index a8b703a6..7cd062b7 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -5,7 +5,7 @@ // ************************************************************************** // #include "watcher.h" -#include "../shared/system_func.h" +#include "../shared/last_error.h" #include "../shared/string_conv.h" #include "../shared/file_handling.h" #include "../shared/i18n.h" @@ -28,7 +28,7 @@ #include "../shared/file_traverser.h" #endif -using namespace ffs3; +using namespace zen; bool rts::updateUiIsAllowed() @@ -57,7 +57,7 @@ void cleanUpChangeNotifications(const std::vector<HANDLE>* handles) } #elif defined FFS_LINUX -class DirsOnlyTraverser : public ffs3::TraverseCallback +class DirsOnlyTraverser : public zen::TraverseCallback { public: DirsOnlyTraverser(std::vector<std::string>& dirs) : m_dirs(dirs) {} @@ -71,7 +71,7 @@ public: } virtual void onError(const wxString& errorText) { - throw ffs3::FileError(errorText); + throw zen::FileError(errorText); } private: @@ -99,7 +99,7 @@ public: if (current - lastCheck >= UPDATE_INTERVAL) { lastCheck = current; - allExisting_ = std::find_if(dirList.begin(), dirList.end(), std::not1(std::ptr_fun(&ffs3::dirExists))) == dirList.end(); + allExisting_ = std::find_if(dirList.begin(), dirList.end(), std::not1(std::ptr_fun(&zen::dirExists))) == dirList.end(); } return allExisting_; @@ -119,12 +119,12 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa /* #warning cleanup { - const Zstring formattedDir = ffs3::getFormattedDirectoryName(dirNames.front()); + const Zstring formattedDir = zen::getFormattedDirectoryName(dirNames.front()); //SE_BACKUP_NAME and SE_RESTORE_NAME <- required by FILE_FLAG_BACKUP_SEMANTICS??? //open the directory to watch.... - HANDLE hDir = ::CreateFile(ffs3::applyLongPathPrefix(formattedDir).c_str(), + HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(formattedDir).c_str(), FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //leaving out last flag may prevent files to be deleted WITHIN monitored dir (http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw_19.html) NULL, @@ -139,7 +139,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa return CHANGE_DIR_MISSING; const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\""); - throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir); @@ -166,7 +166,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa NULL)) //__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine { const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\""); - throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } return CHANGE_DETECTED; } @@ -181,7 +181,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa if (dirNames.empty()) //pathological case, but check is needed nevertheless - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); //detect when volumes are removed/are not available anymore WatchDirectories dirWatcher; @@ -192,15 +192,15 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i) { - const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i); + const Zstring formattedDir = zen::getFormattedDirectoryName(*i); if (formattedDir.empty()) - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); dirWatcher.addForMonitoring(formattedDir); const HANDLE rv = ::FindFirstChangeNotification( - ffs3::applyLongPathPrefix(formattedDir).c_str(), //__in LPCTSTR lpPathName, + zen::applyLongPathPrefix(formattedDir).c_str(), //__in LPCTSTR lpPathName, true, //__in BOOL bWatchSubtree, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | @@ -215,14 +215,14 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa return CHANGE_DIR_MISSING; const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\""); - throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } changeNotifications->push_back(rv); } if (changeNotifications->size() == 0) - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); //detect user request for device removal (e.g. usb stick) @@ -272,7 +272,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa if (WAIT_OBJECT_0 <= rv && rv < WAIT_OBJECT_0 + changeNotifications->size()) return CHANGE_DETECTED; //directory change detected else if (rv == WAIT_FAILED) - throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zen::getLastErrorFormatted()); //else if (rv == WAIT_TIMEOUT) if (!dirWatcher.allExisting()) //check for removed devices: @@ -299,10 +299,10 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa //add all subdirectories for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i) { - const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i); + const Zstring formattedDir = zen::getFormattedDirectoryName(*i); if (formattedDir.empty()) - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); dirWatcher.addForMonitoring(formattedDir); @@ -312,11 +312,11 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa try //get all subdirectories { DirsOnlyTraverser traverser(fullDirList); - ffs3::traverseFolder(formattedDir, false, traverser); //don't traverse into symlinks (analog to windows build) + zen::traverseFolder(formattedDir, false, traverser); //don't traverse into symlinks (analog to windows build) } - catch (const ffs3::FileError&) + catch (const zen::FileError&) { - if (!ffs3::dirExists(formattedDir)) //that's no good locking behavior, but better than nothing + if (!zen::dirExists(formattedDir)) //that's no good locking behavior, but better than nothing return CHANGE_DIR_MISSING; throw; @@ -347,17 +347,17 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa } catch (const InotifyException& e) { - if (!ffs3::dirExists(i->c_str())) //that's no good locking behavior, but better than nothing + if (!zen::dirExists(i->c_str())) //that's no good locking behavior, but better than nothing return CHANGE_DIR_MISSING; const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(i->c_str()) + wxT("\""); - throw ffs3::FileError(errorMessage + wxT("\n\n") + zToWx(e.GetMessage().c_str())); + throw zen::FileError(errorMessage + wxT("\n\n") + zToWx(e.GetMessage().c_str())); } } if (notifications.GetWatchCount() == 0) - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); while (true) { @@ -375,11 +375,11 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa } catch (const InotifyException& e) { - throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.GetMessage().c_str())); + throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.GetMessage().c_str())); } catch (const std::exception& e) { - throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.what())); + throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.what())); } #endif } @@ -403,12 +403,12 @@ void rts::waitForMissingDirs(const std::vector<Zstring>& dirNames, WaitCallback* for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i) { //support specifying volume by name => call getFormattedDirectoryName() repeatedly - const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i); + const Zstring formattedDir = zen::getFormattedDirectoryName(*i); if (formattedDir.empty()) - throw ffs3::FileError(_("A directory input field is empty.")); + throw zen::FileError(_("A directory input field is empty.")); - if (!ffs3::dirExists(formattedDir)) + if (!zen::dirExists(formattedDir)) { allExisting = false; break; diff --git a/RealtimeSync/xml_ffs.cpp b/RealtimeSync/xml_ffs.cpp index 1c98cc57..03d266df 100644 --- a/RealtimeSync/xml_ffs.cpp +++ b/RealtimeSync/xml_ffs.cpp @@ -15,7 +15,7 @@ //include FreeFileSync xml headers #include "../library/process_xml.h" -using namespace ffs3; +using namespace zen; #ifdef FFS_WIN @@ -44,7 +44,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat uniqueFolders.insert(zToWx(batchCfg.mainCfg.firstPair.rightDirectory)); //additional folders - for (std::vector<ffs3::FolderPairEnh>::const_iterator i = batchCfg.mainCfg.additionalPairs.begin(); + for (std::vector<zen::FolderPairEnh>::const_iterator i = batchCfg.mainCfg.additionalPairs.begin(); i != batchCfg.mainCfg.additionalPairs.end(); ++i) { uniqueFolders.insert(zToWx(i->leftDirectory)); @@ -55,13 +55,8 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat output.directories.insert(output.directories.end(), uniqueFolders.begin(), uniqueFolders.end()); - output.commandline = wxT("\"") + ffs3::getBinaryDir() + -#ifdef FFS_WIN - wxT("FreeFileSync.exe") + -#elif defined FFS_LINUX - wxT("FreeFileSync") + -#endif - wxT("\" \"") + filename + wxT("\""); + output.commandline = wxT("\"") + zen::getLauncher() + wxT("\"") + + wxT(" \"") + filename + wxT("\""); return output; } @@ -69,7 +64,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat void rts::readRealOrBatchConfig(const wxString& filename, xmlAccess::XmlRealConfig& config) //throw (xmlAccess::XmlError); { - if (xmlAccess::getXmlType(filename) != xmlAccess::XML_BATCH_CONFIG) + if (xmlAccess::getXmlType(filename) != xmlAccess::XML_TYPE_BATCH) { xmlAccess::readRealConfig(filename, config); return; diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp index 4d7f88e0..4eaf8769 100644 --- a/RealtimeSync/xml_proc.cpp +++ b/RealtimeSync/xml_proc.cpp @@ -9,83 +9,103 @@ #include "../shared/i18n.h" -class RtsXmlParser : public xmlAccess::XmlParser +using namespace xmlAccess; + +class RtsXmlErrorLogger : public xmlAccess::XmlErrorLogger { public: - RtsXmlParser(const TiXmlElement* rootElement) : xmlAccess::XmlParser(rootElement) {} - - void readXmlRealConfig(xmlAccess::XmlRealConfig& outputCfg); + void readConfig(const TiXmlElement* root, xmlAccess::XmlRealConfig& outputCfg); }; - -void readXmlRealConfig(const TiXmlDocument& doc, xmlAccess::XmlRealConfig& outputCfg); -bool writeXmRealSettings(const xmlAccess::XmlRealConfig& outputCfg, TiXmlDocument& doc); +//-------------------------------------------------------------------------------- -void xmlAccess::readRealConfig(const wxString& filename, XmlRealConfig& config) +void RtsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlRealConfig& outputCfg) { - //load XML - if (!wxFileExists(filename)) - throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); + //read directories for monitoring + const TiXmlElement* directoriesToWatch = TiXmlHandleConst(root).FirstChild("Directories").ToElement(); - TiXmlDocument doc; - loadXmlDocument(filename, XML_REAL_CONFIG, doc); //throw (XmlError) + readXmlElementLogging("Folder", directoriesToWatch, outputCfg.directories); - RtsXmlParser parser(doc.RootElement()); - parser.readXmlRealConfig(config); //read GUI layout configuration + //commandline to execute + readXmlElementLogging("Commandline", root, outputCfg.commandline); - if (parser.errorsOccurred()) - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + - parser.getErrorMessageFormatted(), XmlError::WARNING); + //delay + readXmlElementLogging("Delay", root, outputCfg.delay); } -void xmlAccess::writeRealConfig(const XmlRealConfig& outputCfg, const wxString& filename) +void writeConfig(const xmlAccess::XmlRealConfig& outputCfg, TiXmlElement& root) { - TiXmlDocument doc; - getDefaultXmlDocument(XML_REAL_CONFIG, doc); + //directories to monitor + TiXmlElement* directoriesToWatch = new TiXmlElement("Directories"); + root.LinkEndChild(directoriesToWatch); + xmlAccess::addXmlElement("Folder", outputCfg.directories, directoriesToWatch); - //populate and write XML tree - if (!writeXmRealSettings(outputCfg, doc)) //add GUI layout configuration settings - throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); + //commandline to execute + xmlAccess::addXmlElement("Commandline", outputCfg.commandline, &root); - saveXmlDocument(filename, doc); //throw (XmlError) + //delay + xmlAccess::addXmlElement("Delay", outputCfg.delay, &root); } -//-------------------------------------------------------------------------------- - -void RtsXmlParser::readXmlRealConfig(xmlAccess::XmlRealConfig& outputCfg) +bool isXmlTypeRTS(const TiXmlDocument& doc) //throw() { - //read directories for monitoring - const TiXmlElement* directoriesToWatch = TiXmlHandleConst(getRoot()).FirstChild("Directories").ToElement(); + const TiXmlElement* root = doc.RootElement(); + if (root && root->ValueStr() == std::string("RealtimeSync")) + { + const char* cfgType = root->Attribute("XmlType"); + if (cfgType) + return std::string(cfgType) == "REAL"; + } + return false; +} - readXmlElementLogging("Folder", directoriesToWatch, outputCfg.directories); - //commandline to execute - readXmlElementLogging("Commandline", getRoot(), outputCfg.commandline); +void initXmlDocument(TiXmlDocument& doc) //throw() +{ + TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument! + doc.LinkEndChild(decl); - //delay - readXmlElementLogging("Delay", getRoot(), outputCfg.delay); + TiXmlElement* root = new TiXmlElement("RealtimeSync"); + doc.LinkEndChild(root); + + addXmlAttribute("XmlType", "REAL", doc.RootElement()); } -bool writeXmRealSettings(const xmlAccess::XmlRealConfig& outputCfg, TiXmlDocument& doc) +void xmlAccess::readRealConfig(const wxString& filename, XmlRealConfig& config) { - TiXmlElement* root = doc.RootElement(); - if (!root) return false; + //load XML + if (!wxFileExists(filename)) + throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); - //directories to monitor - TiXmlElement* directoriesToWatch = new TiXmlElement("Directories"); - root->LinkEndChild(directoriesToWatch); - xmlAccess::addXmlElement("Folder", outputCfg.directories, directoriesToWatch); + TiXmlDocument doc; + loadXmlDocument(filename, doc); //throw (XmlError) - //commandline to execute - xmlAccess::addXmlElement("Commandline", outputCfg.commandline, root); + if (!isXmlTypeRTS(doc)) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); - //delay - xmlAccess::addXmlElement("Delay", outputCfg.delay, root); + RtsXmlErrorLogger parser; + parser.readConfig(doc.RootElement(), config); //read GUI layout configuration - return true; + if (parser.errorsOccurred()) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + + parser.getErrorMessageFormatted(), XmlError::WARNING); +} + + +void xmlAccess::writeRealConfig(const XmlRealConfig& outputCfg, const wxString& filename) +{ + TiXmlDocument doc; + initXmlDocument(doc); //throw() + + if (!doc.RootElement()) + throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); + + writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings + + saveXmlDocument(filename, doc); //throw (XmlError) } diff --git a/algorithm.cpp b/algorithm.cpp index e705e075..3b210d49 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -12,7 +12,7 @@ #include "shared/file_handling.h" #include "shared/recycler.h" #include <wx/msgdlg.h> -#include "library/filter.h" +#include "library/norm_filter.h" #include <boost/bind.hpp> #include "shared/string_conv.h" #include "shared/global_func.h" @@ -20,11 +20,12 @@ #include "shared/loki/TypeManip.h" #include "library/db_file.h" #include "library/cmp_filetime.h" +#include "library/norm_filter.h" -using namespace ffs3; +using namespace zen; -void ffs3::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp) +void zen::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp) { std::for_each(folderCmp.begin(), folderCmp.end(), boost::bind(&BaseDirMapping::swap, _1)); redetermineSyncDirection(config, folderCmp, NULL); @@ -35,7 +36,7 @@ void ffs3::swapGrids(const MainConfiguration& config, FolderComparison& folderCm class Redetermine { public: - Redetermine(const SyncConfiguration& configIn) : config(configIn) {} + Redetermine(const DirectionSet& dirCfgIn) : dirCfg(dirCfgIn) {} void execute(HierarchyObject& hierObj) const { @@ -85,34 +86,34 @@ private: switch (fileObj.getCategory()) { case FILE_LEFT_SIDE_ONLY: - if (fileObj.getFullName<LEFT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING)) + if (fileObj.getFullName<LEFT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING)) fileObj.setSyncDir(SYNC_DIR_LEFT); //schedule potentially existing temporary files for deletion else - fileObj.setSyncDir(config.exLeftSideOnly); + fileObj.setSyncDir(dirCfg.exLeftSideOnly); break; case FILE_RIGHT_SIDE_ONLY: - if (fileObj.getFullName<RIGHT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING)) + if (fileObj.getFullName<RIGHT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING)) fileObj.setSyncDir(SYNC_DIR_RIGHT); //schedule potentially existing temporary files for deletion else - fileObj.setSyncDir(config.exRightSideOnly); + fileObj.setSyncDir(dirCfg.exRightSideOnly); break; case FILE_RIGHT_NEWER: - fileObj.setSyncDir(config.rightNewer); + fileObj.setSyncDir(dirCfg.rightNewer); break; case FILE_LEFT_NEWER: - fileObj.setSyncDir(config.leftNewer); + fileObj.setSyncDir(dirCfg.leftNewer); break; case FILE_DIFFERENT: - fileObj.setSyncDir(config.different); + fileObj.setSyncDir(dirCfg.different); break; case FILE_CONFLICT: - fileObj.setSyncDir(config.conflict); + fileObj.setSyncDir(dirCfg.conflict); break; case FILE_EQUAL: fileObj.setSyncDir(SYNC_DIR_NONE); break; case FILE_DIFFERENT_METADATA: - fileObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize" + fileObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize" break; } } @@ -122,28 +123,28 @@ private: switch (linkObj.getLinkCategory()) { case SYMLINK_LEFT_SIDE_ONLY: - linkObj.setSyncDir(config.exLeftSideOnly); + linkObj.setSyncDir(dirCfg.exLeftSideOnly); break; case SYMLINK_RIGHT_SIDE_ONLY: - linkObj.setSyncDir(config.exRightSideOnly); + linkObj.setSyncDir(dirCfg.exRightSideOnly); break; case SYMLINK_LEFT_NEWER: - linkObj.setSyncDir(config.leftNewer); + linkObj.setSyncDir(dirCfg.leftNewer); break; case SYMLINK_RIGHT_NEWER: - linkObj.setSyncDir(config.rightNewer); + linkObj.setSyncDir(dirCfg.rightNewer); break; case SYMLINK_CONFLICT: - linkObj.setSyncDir(config.conflict); + linkObj.setSyncDir(dirCfg.conflict); break; case SYMLINK_DIFFERENT: - linkObj.setSyncDir(config.different); + linkObj.setSyncDir(dirCfg.different); break; case SYMLINK_EQUAL: linkObj.setSyncDir(SYNC_DIR_NONE); break; case SYMLINK_DIFFERENT_METADATA: - linkObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize" + linkObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize" break; } @@ -154,16 +155,16 @@ private: switch (dirObj.getDirCategory()) { case DIR_LEFT_SIDE_ONLY: - dirObj.setSyncDir(config.exLeftSideOnly); + dirObj.setSyncDir(dirCfg.exLeftSideOnly); break; case DIR_RIGHT_SIDE_ONLY: - dirObj.setSyncDir(config.exRightSideOnly); + dirObj.setSyncDir(dirCfg.exRightSideOnly); break; case DIR_EQUAL: dirObj.setSyncDir(SYNC_DIR_NONE); break; case DIR_DIFFERENT_METADATA: - dirObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize" + dirObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize" break; } @@ -171,7 +172,7 @@ private: execute(dirObj); } - const SyncConfiguration& config; + const DirectionSet dirCfg; }; @@ -216,7 +217,7 @@ struct AllElementsEqual : public std::unary_function<BaseDirMapping, bool> }; -bool ffs3::allElementsEqual(const FolderComparison& folderCmp) +bool zen::allElementsEqual(const FolderComparison& folderCmp) { return std::find_if(folderCmp.begin(), folderCmp.end(), std::not1(AllElementsEqual())) == folderCmp.end(); } @@ -280,9 +281,9 @@ private: } } - Zstring shortName; //empty if object not existing - wxLongLong lastWriteTime; - wxULongLong fileSize; + Zstring shortName; //empty if object not existing + zen::Int64 lastWriteTime; + zen::UInt64 fileSize; }; @@ -363,7 +364,7 @@ private: } Zstring shortName; //empty if object not existing - wxLongLong lastWriteTime; + zen::Int64 lastWriteTime; Zstring targetPath; #ifdef FFS_WIN LinkDescriptor::LinkType type; @@ -559,8 +560,8 @@ public: txtFilterChanged(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("Filter settings have changed!")), txtLastSyncFail(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("The file was not processed by last synchronization!")), txtDirDeleteConflict(_("Planned directory deletion is in conflict with its subdirectories and -files!")), - dbFilterLeft(NULL), - dbFilterRight(NULL), + // dbFilterLeft(NULL), + // dbFilterRight(NULL), handler_(handler) { if (AllElementsEqual()(baseDirectory)) //nothing to do: abort and don't show any nag-screens @@ -571,23 +572,26 @@ public: if (dirInfo.first.get() == NULL || dirInfo.second.get() == NULL) { - //use standard settings: - SyncConfiguration defaultSync; - ffs3::setTwoWay(defaultSync); - Redetermine(defaultSync).execute(baseDirectory); + //set conservative "two-way" directions + DirectionSet twoWayCfg = getTwoWaySet(); + + Redetermine(twoWayCfg).execute(baseDirectory); return; } const DirInformation& dirInfoLeft = *dirInfo.first; const DirInformation& dirInfoRight = *dirInfo.second; - //save db filter (if it needs to be considered only): - if (respectFiltering(baseDirectory, dirInfoLeft)) - dbFilterLeft = dirInfoLeft.filter.get(); - - if (respectFiltering(baseDirectory, dirInfoRight)) - dbFilterRight = dirInfoRight.filter.get(); + //-> considering filter not relevant: + //if narrowing filter: all ok; if widening filter (if file ex on both sides -> conflict, fine; if file ex. on one side: copy to other side: fine) + /* + //save db filter (if it needs to be considered only): + if (respectFiltering(baseDirectory, dirInfoLeft)) + dbFilterLeft = dirInfoLeft.filter.get(); + if (respectFiltering(baseDirectory, dirInfoRight)) + dbFilterRight = dirInfoRight.filter.get(); + */ execute(baseDirectory, &dirInfoLeft.baseDirContainer, &dirInfoRight.baseDirContainer); @@ -595,6 +599,7 @@ public: private: + /* static bool respectFiltering(const BaseDirMapping& baseDirectory, const DirInformation& dirInfo) { //respect filtering if sync-DB filter is active && different from baseDir's filter: @@ -602,7 +607,7 @@ private: // => dirInfo can be queried as if it were a scan without filters return !dirInfo.filter->isNull() && *dirInfo.filter != *baseDirectory.getFilter(); } - + */ std::pair<DirInfoPtr, DirInfoPtr> loadDBFile(const BaseDirMapping& baseDirectory) //return NULL on failure { @@ -666,12 +671,12 @@ private: //##################### schedule potentially existing temporary files for deletion #################### - if (cat == FILE_LEFT_SIDE_ONLY && fileObj.getFullName<LEFT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING)) + if (cat == FILE_LEFT_SIDE_ONLY && fileObj.getFullName<LEFT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING)) { fileObj.setSyncDir(SYNC_DIR_LEFT); return; } - else if (cat == FILE_RIGHT_SIDE_ONLY && fileObj.getFullName<RIGHT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING)) + else if (cat == FILE_RIGHT_SIDE_ONLY && fileObj.getFullName<RIGHT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING)) { fileObj.setSyncDir(SYNC_DIR_RIGHT); return; @@ -895,40 +900,43 @@ private: const wxString txtLastSyncFail; const wxString txtDirDeleteConflict; - const BaseFilter* dbFilterLeft; //optional - const BaseFilter* dbFilterRight; //optional + //const HardFilter* dbFilterLeft; //optional + //const HardFilter* dbFilterRight; //optional DeterminationProblem* const handler_; }; //--------------------------------------------------------------------------------------------------------------- -void ffs3::redetermineSyncDirection(const SyncConfiguration& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler) +void zen::redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler) { - if (config.automatic) + if (config.var == SyncConfig::AUTOMATIC) RedetermineAuto(baseDirectory, handler); else - Redetermine(config).execute(baseDirectory); + { + DirectionSet dirCfg = extractDirections(config); + Redetermine(dirCfg).execute(baseDirectory); + } } -void ffs3::redetermineSyncDirection(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp, DeterminationProblem* handler) +void zen::redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, DeterminationProblem* handler) { if (folderCmp.size() == 0) return; - else if (folderCmp.size() != currentMainCfg.additionalPairs.size() + 1) + else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1) throw std::logic_error("Programming Error: Contract violation!"); //merge first and additional pairs std::vector<FolderPairEnh> allPairs; - allPairs.push_back(currentMainCfg.firstPair); + allPairs.push_back(mainCfg.firstPair); allPairs.insert(allPairs.end(), - currentMainCfg.additionalPairs.begin(), //add additional pairs - currentMainCfg.additionalPairs.end()); + mainCfg.additionalPairs.begin(), //add additional pairs + mainCfg.additionalPairs.end()); for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) { - redetermineSyncDirection(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : currentMainCfg.syncConfiguration, + redetermineSyncDirection(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : mainCfg.syncConfiguration, folderCmp[i - allPairs.begin()], handler); } } @@ -975,7 +983,7 @@ private: }; -void ffs3::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj) +void zen::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj) { SetNewDirection dirSetter(newDirection); @@ -1008,12 +1016,12 @@ template <bool include> class InOrExcludeAllRows { public: - void operator()(ffs3::BaseDirMapping& baseDirectory) const //be careful with operator() to no get called by std::for_each! + void operator()(zen::BaseDirMapping& baseDirectory) const //be careful with operator() to no get called by std::for_each! { execute(baseDirectory); } - void execute(ffs3::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator() + void execute(zen::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator() { util::ProxyForEach<const InOrExcludeAllRows<include> > prx(*this); //grant std::for_each access to private parts of this class @@ -1025,17 +1033,17 @@ public: private: friend class util::ProxyForEach<const InOrExcludeAllRows<include> >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(ffs3::FileMapping& fileObj) const + void operator()(zen::FileMapping& fileObj) const { fileObj.setActive(include); } - void operator()(ffs3::SymLinkMapping& linkObj) const + void operator()(zen::SymLinkMapping& linkObj) const { linkObj.setActive(include); } - void operator()(ffs3::DirMapping& dirObj) const + void operator()(zen::DirMapping& dirObj) const { dirObj.setActive(include); execute(dirObj); //recursion @@ -1043,7 +1051,7 @@ private: }; -void ffs3::setActiveStatus(bool newStatus, ffs3::FolderComparison& folderCmp) +void zen::setActiveStatus(bool newStatus, zen::FolderComparison& folderCmp) { if (newStatus) std::for_each(folderCmp.begin(), folderCmp.end(), InOrExcludeAllRows<true>()); //include all rows @@ -1052,7 +1060,7 @@ void ffs3::setActiveStatus(bool newStatus, ffs3::FolderComparison& folderCmp) } -void ffs3::setActiveStatus(bool newStatus, ffs3::FileSystemObject& fsObj) +void zen::setActiveStatus(bool newStatus, zen::FileSystemObject& fsObj) { fsObj.setActive(newStatus); @@ -1079,21 +1087,44 @@ namespace { enum FilterStrategy { - STRATEGY_ALL, - STRATEGY_ACTIVE_ONLY - //STRATEGY_INACTIVE_ONLY -> logical conflict with InOrExcludeAllRows<false> + STRATEGY_SET, + STRATEGY_AND, + STRATEGY_OR +}; + +template <FilterStrategy strategy> struct Eval; + +template <> +struct Eval<STRATEGY_SET> //process all elements +{ + template <class T> + bool process(const T& obj) const { return true; } +}; + +template <> +struct Eval<STRATEGY_AND> +{ + template <class T> + bool process(const T& obj) const { return obj.isActive(); } +}; + +template <> +struct Eval<STRATEGY_OR> +{ + template <class T> + bool process(const T& obj) const { return !obj.isActive(); } }; template <FilterStrategy strategy> -class FilterData +class ApplyHardFilter { public: - FilterData(const BaseFilter& filterProcIn) : filterProc(filterProcIn) {} + ApplyHardFilter(const HardFilter& filterProcIn) : filterProc(filterProcIn) {} - void execute(ffs3::HierarchyObject& hierObj) const + void execute(zen::HierarchyObject& hierObj) const { - util::ProxyForEach<const FilterData> prx(*this); //grant std::for_each access to private parts of this class + util::ProxyForEach<const ApplyHardFilter> prx(*this); //grant std::for_each access to private parts of this class std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //files std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //symlinks @@ -1101,28 +1132,26 @@ public: }; private: - friend class util::ProxyForEach<const FilterData>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - - bool processObject(ffs3::FileSystemObject& fsObj) const; + friend class util::ProxyForEach<const ApplyHardFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(ffs3::FileMapping& fileObj) const + void operator()(zen::FileMapping& fileObj) const { - if (processObject(fileObj)) + if (Eval<strategy>().process(fileObj)) fileObj.setActive(filterProc.passFileFilter(fileObj.getObjRelativeName())); } - void operator()(ffs3::SymLinkMapping& linkObj) const + void operator()(zen::SymLinkMapping& linkObj) const { - if (processObject(linkObj)) + if (Eval<strategy>().process(linkObj)) linkObj.setActive(filterProc.passFileFilter(linkObj.getObjRelativeName())); } - void operator()(ffs3::DirMapping& dirObj) const + void operator()(zen::DirMapping& dirObj) const { bool subObjMightMatch = true; const bool filterPassed = filterProc.passDirFilter(dirObj.getObjRelativeName(), &subObjMightMatch); - if (processObject(dirObj)) + if (Eval<strategy>().process(dirObj)) dirObj.setActive(filterPassed); if (!subObjMightMatch) //use same logic like directory traversing here: evaluate filter in subdirs only if objects could match @@ -1134,65 +1163,150 @@ private: execute(dirObj); //recursion } - const BaseFilter& filterProc; + const HardFilter& filterProc; }; +template <> +class ApplyHardFilter<STRATEGY_OR>; //usage of InOrExcludeAllRows doesn't allow for strategy "or" + + -template <> //process all elements -inline -bool FilterData<STRATEGY_ALL>::processObject(ffs3::FileSystemObject& fsObj) const +template <FilterStrategy strategy> +class ApplySoftFilter //falsify only! -> can run directly after "hard/base filter" { - return true; +public: + ApplySoftFilter(const SoftFilter& timeSizeFilter) : timeSizeFilter_(timeSizeFilter) {} + + void execute(zen::HierarchyObject& hierObj) const + { + util::ProxyForEach<const ApplySoftFilter> prx(*this); //grant std::for_each access to private parts of this class + + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //files + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //symlinks + std::for_each(hierObj.useSubDirs ().begin(), hierObj.useSubDirs(). end(), prx); //directories + }; + +private: + friend class util::ProxyForEach<const ApplySoftFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! + + void operator()(zen::FileMapping& fileObj) const + { + if (Eval<strategy>().process(fileObj)) + { + if (fileObj.isEmpty<LEFT_SIDE>()) + fileObj.setActive(matchSize<RIGHT_SIDE>(fileObj) && + matchTime<RIGHT_SIDE>(fileObj)); + else if (fileObj.isEmpty<RIGHT_SIDE>()) + fileObj.setActive(matchSize<LEFT_SIDE>(fileObj) && + matchTime<LEFT_SIDE>(fileObj)); + else + { + //the only case with partially unclear semantics: + //file and time filters may match on one side, leaving a total of 16 combinations for both sides! + /* + ST S T - ST := match size and time + --------- S := match size only + ST |X|X|X|X| T := match time only + ------------ - := no match + S |X|O|?|O| + ------------ X := include row + T |X|?|O|O| O := exclude row + ------------ ? := unclear + - |X|O|O|O| + ------------ + */ + //let's set ? := O + fileObj.setActive((matchSize<RIGHT_SIDE>(fileObj) && + matchTime<RIGHT_SIDE>(fileObj)) || + (matchSize<LEFT_SIDE>(fileObj) && + matchTime<LEFT_SIDE>(fileObj))); + } + } + } + + void operator()(zen::SymLinkMapping& linkObj) const + { + if (Eval<strategy>().process(linkObj)) + { + if (linkObj.isEmpty<LEFT_SIDE>()) + linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj)); + else if (linkObj.isEmpty<RIGHT_SIDE>()) + linkObj.setActive(matchTime<LEFT_SIDE>(linkObj)); + else + linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj) || + matchTime<LEFT_SIDE> (linkObj)); + } + } + + void operator()(zen::DirMapping& dirObj) const + { + execute(dirObj); //recursion + } + + template <SelectedSide side, class T> + bool matchTime(const T& obj) const + { + return timeSizeFilter_.matchTime(obj.template getLastWriteTime<side>()); + } + + template <SelectedSide side, class T> + bool matchSize(const T& obj) const + { + return timeSizeFilter_.matchSize(obj.template getFileSize<side>()); + } + + const SoftFilter timeSizeFilter_; +}; } -template <> -inline -bool FilterData<STRATEGY_ACTIVE_ONLY>::processObject(ffs3::FileSystemObject& fsObj) const + +void zen::addExcludeFiltering(FolderComparison& folderCmp, const Zstring& excludeFilter) { - return fsObj.isActive(); -} + for (std::vector<BaseDirMapping>::iterator i = folderCmp.begin(); i != folderCmp.end(); ++i) + ApplyHardFilter<STRATEGY_AND>(*HardFilter::FilterRef( + new NameFilter(FilterConfig().includeFilter, excludeFilter))).execute(*i); } -void ffs3::addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp) +void zen::addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter) { - for (std::vector<BaseDirMapping>::iterator i = folderCmp.begin(); i != folderCmp.end(); ++i) - FilterData<STRATEGY_ACTIVE_ONLY>(*BaseFilter::FilterRef(new NameFilter(Zstr("*"), excludeFilter))).execute(*i); + if (!timeSizeFilter.isNull()) //since we use STRATEGY_AND, we may skip a "null" filter + ApplySoftFilter<STRATEGY_AND>(timeSizeFilter).execute(baseMap); } -void ffs3::applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp) +void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& mainCfg) { if (folderCmp.size() == 0) return; - else if (folderCmp.size() != currentMainCfg.additionalPairs.size() + 1) + else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1) throw std::logic_error("Programming Error: Contract violation!"); - //merge first and additional pairs std::vector<FolderPairEnh> allPairs; - allPairs.push_back(currentMainCfg.firstPair); + allPairs.push_back(mainCfg.firstPair); allPairs.insert(allPairs.end(), - currentMainCfg.additionalPairs.begin(), //add additional pairs - currentMainCfg.additionalPairs.end()); - + mainCfg.additionalPairs.begin(), //add additional pairs + mainCfg.additionalPairs.end()); - const BaseFilter::FilterRef globalFilter(new NameFilter(currentMainCfg.globalFilter.includeFilter, currentMainCfg.globalFilter.excludeFilter)); for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) { BaseDirMapping& baseDirectory = folderCmp[i - allPairs.begin()]; - FilterData<STRATEGY_ALL>(*combineFilters(globalFilter, - BaseFilter::FilterRef(new NameFilter( - i->localFilter.includeFilter, - i->localFilter.excludeFilter)))).execute(baseDirectory); + const NormalizedFilter normFilter = normalizeFilters(mainCfg.globalFilter, i->localFilter); + + //"set" hard filter + ApplyHardFilter<STRATEGY_SET>(*normFilter.nameFilter).execute(baseDirectory); + + //"and" soft filter + addSoftFiltering(baseDirectory, normFilter.timeSizeFilter); } } //############################################################################################################ -std::pair<wxString, int> ffs3::deleteFromGridAndHDPreview( //assemble message containing all files to be deleted +std::pair<wxString, int> zen::deleteFromGridAndHDPreview( //assemble message containing all files to be deleted const std::vector<FileSystemObject*>& rowsToDeleteOnLeft, const std::vector<FileSystemObject*>& rowsToDeleteOnRight, const bool deleteOnBothSides) @@ -1256,7 +1370,7 @@ std::pair<wxString, int> ffs3::deleteFromGridAndHDPreview( //assemble message co namespace { -struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir +struct RemoveCallbackImpl : public zen::CallbackRemoveDir { RemoveCallbackImpl(DeleteFilesHandler& deleteCallback) : deleteCallback_(deleteCallback) {} @@ -1287,7 +1401,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, { if (useRecycleBin) { - if (ffs3::moveToRecycleBin(fsObj->getFullName<side>())) //throw (FileError) + if (zen::moveToRecycleBin(fsObj->getFullName<side>())) //throw (FileError) statusHandler.notifyDeletion(fsObj->getFullName<side>()); } else @@ -1301,7 +1415,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, virtual void visit(const FileMapping& fileObj) { - if (ffs3::removeFile(fileObj.getFullName<side>())) + if (zen::removeFile(fileObj.getFullName<side>())) remCallback_.notifyDeletion(fileObj.getFullName<side>()); } @@ -1310,10 +1424,10 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, switch (linkObj.getLinkType<side>()) { case LinkDescriptor::TYPE_DIR: - ffs3::removeDirectory(linkObj.getFullName<side>(), &remCallback_); + zen::removeDirectory(linkObj.getFullName<side>(), &remCallback_); break; case LinkDescriptor::TYPE_FILE: - if (ffs3::removeFile(linkObj.getFullName<side>())) + if (zen::removeFile(linkObj.getFullName<side>())) remCallback_.notifyDeletion(linkObj.getFullName<side>()); break; } @@ -1321,7 +1435,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, virtual void visit(const DirMapping& dirObj) { - ffs3::removeDirectory(dirObj.getFullName<side>(), &remCallback_); + zen::removeDirectory(dirObj.getFullName<side>(), &remCallback_); } private: @@ -1374,12 +1488,12 @@ private: }; -void ffs3::deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted! - std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows - std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! - const bool deleteOnBothSides, - const bool useRecycleBin, - DeleteFilesHandler& statusHandler) +void zen::deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted! + std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows + std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! + const bool deleteOnBothSides, + const bool useRecycleBin, + DeleteFilesHandler& statusHandler) { FinalizeDeletion dummy(folderCmp); //ensure cleanup: redetermination of sync-directions and removal of invalid rows @@ -1472,7 +1586,7 @@ unsigned int getThreshold(const unsigned filesWithSameSizeTotal) } -void ffs3::checkForDSTChange(const FileCompareResult& gridData, +void zen::checkForDSTChange(const FileCompareResult& gridData, const std::vector<FolderPair>& directoryPairsFormatted, int& timeShift, wxString& driveName) { diff --git a/algorithm.h b/algorithm.h index 1d01f2b5..389170ab 100644 --- a/algorithm.h +++ b/algorithm.h @@ -10,9 +10,9 @@ #include "file_hierarchy.h" -namespace ffs3 +namespace zen { -class BaseFilter; +class SoftFilter; void swapGrids(const MainConfiguration& config, FolderComparison& folderCmp); @@ -21,16 +21,17 @@ struct DeterminationProblem //callback virtual ~DeterminationProblem() {} virtual void reportWarning(const wxString& text) = 0; }; -void redetermineSyncDirection(const SyncConfiguration& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL -void redetermineSyncDirection(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp, DeterminationProblem* handler); +void redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL +void redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, DeterminationProblem* handler); void setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj); //set new direction (recursively) bool allElementsEqual(const FolderComparison& folderCmp); //filtering -void applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp); //full filter apply -void addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp); //exclude additional entries only +void applyFiltering (FolderComparison& folderCmp, const MainConfiguration& mainCfg); //full filter apply +void addExcludeFiltering(FolderComparison& folderCmp, const Zstring& excludeFilter); //exclude additional entries only +void addSoftFiltering (BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter); //exclude additional entries only void setActiveStatus(bool newStatus, FolderComparison& folderCmp); //activate or deactivate all rows void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or deactivate row: (not recursively anymore) diff --git a/comparison.cpp b/comparison.cpp index b1e60eae..dea32feb 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -5,37 +5,34 @@ // ************************************************************************** // #include "comparison.h" +#include <map> #include <stdexcept> +#include <memory> #include "shared/global_func.h" #include "shared/i18n.h" #include <wx/msgdlg.h> #include <wx/log.h> +#include <boost/bind.hpp> #include "algorithm.h" #include "shared/util.h" -#include <memory> #include "shared/string_conv.h" #include "shared/file_handling.h" #include "shared/resolve_path.h" -#include "shared/system_func.h" +#include "shared/last_error.h" #include "shared/file_traverser.h" -#include "library/filter.h" -#include <map> #include "file_hierarchy.h" -#include <boost/bind.hpp> #include "library/binary.h" -#include "library/dir_lock.h" #include "library/cmp_filetime.h" +#include "library/lock_holder.h" #ifdef FFS_WIN #include "shared/perf.h" #endif -using namespace ffs3; +using namespace zen; -const Zstring LOCK_FILE_ENDING = Zstr("ffs_lock"); - -std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration& mainCfg) +std::vector<zen::FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainCfg) { //merge first and additional pairs std::vector<FolderPairEnh> allPairs; @@ -44,22 +41,13 @@ std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration mainCfg.additionalPairs.begin(), //add additional pairs mainCfg.additionalPairs.end()); - const BaseFilter::FilterRef globalFilter(new NameFilter(mainCfg.globalFilter.includeFilter, mainCfg.globalFilter.excludeFilter)); - std::vector<FolderPairCfg> output; for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) output.push_back( - FolderPairCfg(i->leftDirectory, - i->rightDirectory, - - combineFilters(globalFilter, - BaseFilter::FilterRef( - new NameFilter( - i->localFilter.includeFilter, - i->localFilter.excludeFilter))), - + FolderPairCfg(getFormattedDirectoryName(i->leftDirectory), //ensure they end with common::FILE_NAME_SEPARATOR and replace macros + getFormattedDirectoryName(i->rightDirectory), + normalizeFilters(mainCfg.globalFilter, i->localFilter), i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : mainCfg.syncConfiguration)); - return output; } @@ -67,13 +55,13 @@ std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration class BaseDirCallback; -class DirCallback : public ffs3::TraverseCallback +class DirCallback : public zen::TraverseCallback { public: DirCallback(BaseDirCallback* baseCallback, const Zstring& relNameParentPf, //postfixed with FILE_NAME_SEPARATOR! DirContainer& output, - StatusHandler* handler) : + ProcessCallback* handler) : baseCallback_(baseCallback), relNameParentPf_(relNameParentPf), output_(output), @@ -90,7 +78,7 @@ private: BaseDirCallback* const baseCallback_; const Zstring relNameParentPf_; DirContainer& output_; - StatusHandler* const statusHandler; + ProcessCallback* const statusHandler; }; @@ -101,8 +89,8 @@ class BaseDirCallback : public DirCallback public: BaseDirCallback(DirContainer& output, SymLinkHandling handleSymlinks, - const BaseFilter::FilterRef& filter, - StatusHandler* handler) : + const HardFilter::FilterRef& filter, + ProcessCallback* handler) : DirCallback(this, Zstring(), output, handler), handleSymlinks_(handleSymlinks), textScanning(wxToZ(wxString(_("Scanning:")) + wxT(" \n"))), @@ -117,7 +105,7 @@ private: const Zstring textScanning; std::vector<CallbackPointer> callBackBox; //collection of callback pointers to handle ownership - const BaseFilter::FilterRef filterInstance; //always bound! + const HardFilter::FilterRef filterInstance; //always bound! }; @@ -128,7 +116,7 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const const size_t pos = fileNameShort.rfind(Zchar('.')); if (pos != Zstring::npos) { - const Zchar* ending = shortName + pos + 1; //(returns the whole string if ch not found) + const Zchar* ending = shortName + pos + 1; // if (EqualFilename()(ending, SYNC_DB_FILE_ENDING) || // EqualFilename()(ending, LOCK_FILE_ENDING)) //let's hope this premature performance optimization doesn't bite back! if (ending == SYNC_DB_FILE_ENDING || // @@ -136,7 +124,6 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const return; } - //assemble status message (performance optimized) = textScanning + wxT("\"") + fullName + wxT("\"") Zstring statusText = baseCallback_->textScanning; statusText.reserve(statusText.length() + fullName.length() + 2); @@ -274,14 +261,14 @@ void BaseDirCallback::onFile(const Zchar* shortName, const Zstring& fullName, co struct DirBufferKey { DirBufferKey(const Zstring& dirname, - const BaseFilter::FilterRef& filterIn) : //filter interface: always bound by design! + const HardFilter::FilterRef& filterIn) : //filter interface: always bound by design! directoryName(dirname), filter(filterIn->isNull() ? //some optimization for "Null" filter - BaseFilter::FilterRef(new NullFilter) : + HardFilter::FilterRef(new NullFilter) : filterIn) {} const Zstring directoryName; - const BaseFilter::FilterRef filter; //buffering has to consider filtering! + const HardFilter::FilterRef filter; //buffering has to consider filtering! bool operator<(const DirBufferKey& b) const { @@ -298,11 +285,11 @@ class CompareProcess::DirectoryBuffer //buffer multiple scans of the same direc { public: DirectoryBuffer(SymLinkHandling handleSymlinks, - StatusHandler* statusUpdater) : + ProcessCallback& procCallback) : handleSymlinks_(handleSymlinks), - statusUpdater_(statusUpdater) {} + procCallback_(procCallback) {} - const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const BaseFilter::FilterRef& filter); + const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const HardFilter::FilterRef& filter); private: typedef boost::shared_ptr<DirContainer> DirBufferValue; //exception safety: avoid memory leak @@ -313,7 +300,7 @@ private: BufferType buffer; const SymLinkHandling handleSymlinks_; - StatusHandler* statusUpdater_; + ProcessCallback& procCallback_; }; //------------------------------------------------------------------------------------------ @@ -322,21 +309,21 @@ private: class DstHackCallbackImpl : public DstHackCallback { public: - DstHackCallbackImpl(StatusHandler& statusUpdater) : + DstHackCallbackImpl(ProcessCallback& procCallback) : textApplyingDstHack(wxToZ(_("Encoding extended time information: %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""))), - statusUpdater_(statusUpdater) {} + procCallback_(procCallback) {} private: virtual void requestUiRefresh(const Zstring& filename) //applying DST hack imposes significant one-time performance drawback => callback to inform user { Zstring statusText = textApplyingDstHack; statusText.Replace(Zstr("%x"), filename); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); } const Zstring textApplyingDstHack; - StatusHandler& statusUpdater_; + ProcessCallback& procCallback_; }; #endif @@ -346,12 +333,13 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK DirBufferValue baseContainer(new DirContainer); buffer.insert(std::make_pair(newKey, baseContainer)); - if (ffs3::dirExists(newKey.directoryName)) //folder existence already checked in startCompareProcess(): do not treat as error when arriving here! + if (!newKey.directoryName.empty() && + zen::dirExists(newKey.directoryName)) //folder existence already checked in startCompareProcess(): do not treat as error when arriving here! { BaseDirCallback traverser(*baseContainer, handleSymlinks_, newKey.filter, - statusUpdater_); + &procCallback_); bool followSymlinks = false; switch (handleSymlinks_) @@ -367,9 +355,9 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK break; } - std::auto_ptr<ffs3::DstHackCallback> dstCallback; + std::auto_ptr<zen::DstHackCallback> dstCallback; #ifdef FFS_WIN - dstCallback.reset(new DstHackCallbackImpl(*statusUpdater_)); + dstCallback.reset(new DstHackCallbackImpl(procCallback_)); #endif //get all files and folders from directoryPostfixed (and subdirectories) @@ -381,7 +369,7 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK const DirContainer& CompareProcess::DirectoryBuffer::getDirectoryDescription( const Zstring& directoryPostfixed, - const BaseFilter::FilterRef& filter) + const HardFilter::FilterRef& filter) { const DirBufferKey searchKey(directoryPostfixed, filter); @@ -396,7 +384,7 @@ const DirContainer& CompareProcess::DirectoryBuffer::getDirectoryDescription( //------------------------------------------------------------------------------------------ namespace { -void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsForm, StatusHandler* statusUpdater) +void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& procCallback) { bool nonEmptyPairFound = false; //check if user entered at least one folder pair bool partiallyFilledPairFound = false; @@ -405,20 +393,20 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF for (std::vector<FolderPairCfg>::const_iterator i = folderPairsForm.begin(); i != folderPairsForm.end(); ++i) { - if (!i->leftDirectory.empty() || !i->rightDirectory.empty()) //may be partially filled though + if (!i->leftDirectoryFmt.empty() || !i->rightDirectoryFmt.empty()) //may be partially filled though nonEmptyPairFound = true; - if ((i->leftDirectory.empty() && !i->rightDirectory.empty()) || - (!i->leftDirectory.empty() && i->rightDirectory.empty())) + if ((i->leftDirectoryFmt.empty() && !i->rightDirectoryFmt.empty()) || + (!i->leftDirectoryFmt.empty() && i->rightDirectoryFmt.empty())) partiallyFilledPairFound = true; //check if folders exist - if (!i->leftDirectory.empty()) - while (!ffs3::dirExists(i->leftDirectory)) + if (!i->leftDirectoryFmt.empty()) + while (!zen::dirExists(i->leftDirectoryFmt)) { - ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("Directory does not exist:")) + wxT(" \n") + - wxT("\"") + zToWx(i->leftDirectory) + wxT("\"") + wxT("\n\n") + - additionalInfo + wxT(" ") + ffs3::getLastErrorFormatted()); + wxString errorMessage = wxString(_("Directory does not exist:")) + wxT("\n") + wxT("\"") + zToWx(i->leftDirectoryFmt) + wxT("\""); + ErrorHandler::Response rv = procCallback.reportError(errorMessage + wxT("\n\n") + additionalInfo + wxT(" ") + zen::getLastErrorFormatted()); + if (rv == ErrorHandler::IGNORE_ERROR) break; else if (rv == ErrorHandler::RETRY) @@ -427,12 +415,11 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF throw std::logic_error("Programming Error: Unknown return value! (2)"); } - if (!i->rightDirectory.empty()) - while (!ffs3::dirExists(i->rightDirectory)) + if (!i->rightDirectoryFmt.empty()) + while (!zen::dirExists(i->rightDirectoryFmt)) { - ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("Directory does not exist:")) + wxT("\n") + - wxT("\"") + zToWx(i->rightDirectory) + wxT("\"") + wxT("\n\n") + - additionalInfo + wxT(" ") + ffs3::getLastErrorFormatted()); + wxString errorMessage = wxString(_("Directory does not exist:")) + wxT("\n") + wxT("\"") + zToWx(i->rightDirectoryFmt) + wxT("\""); + ErrorHandler::Response rv = procCallback.reportError(errorMessage + wxT("\n\n") + additionalInfo + wxT(" ") + zen::getLastErrorFormatted()); if (rv == ErrorHandler::IGNORE_ERROR) break; else if (rv == ErrorHandler::RETRY) @@ -447,8 +434,8 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF { while (true) { - const ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("A directory input field is empty.")) + wxT(" \n\n") + - + wxT("(") + additionalInfo + wxT(")")); + const ErrorHandler::Response rv = procCallback.reportError(wxString(_("A directory input field is empty.")) + wxT(" \n\n") + + + wxT("(") + additionalInfo + wxT(")")); if (rv == ErrorHandler::IGNORE_ERROR) break; else if (rv == ErrorHandler::RETRY) @@ -480,10 +467,10 @@ wxString checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsForm DirDirList dependentDirs; for (std::vector<FolderPairCfg>::const_iterator i = folderPairsForm.begin(); i != folderPairsForm.end(); ++i) - if (!i->leftDirectory.empty() && !i->rightDirectory.empty()) //empty folders names may be accepted by user + if (!i->leftDirectoryFmt.empty() && !i->rightDirectoryFmt.empty()) //empty folders names may be accepted by user { - if (EqualDependentDirectory()(i->leftDirectory, i->rightDirectory)) //test wheter leftDirectory begins with rightDirectory or the other way round - dependentDirs.push_back(std::make_pair(zToWx(i->leftDirectory), zToWx(i->rightDirectory))); + if (EqualDependentDirectory()(i->leftDirectoryFmt, i->rightDirectoryFmt)) //test wheter leftDirectory begins with rightDirectory or the other way round + dependentDirs.push_back(std::make_pair(zToWx(i->leftDirectoryFmt), zToWx(i->rightDirectoryFmt))); } wxString warnignMsg; @@ -504,32 +491,32 @@ wxString checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsForm class CmpCallbackImpl : public CompareCallback { public: - CmpCallbackImpl(StatusHandler* handler, wxLongLong& bytesComparedLast) : - m_handler(handler), + CmpCallbackImpl(ProcessCallback& pc, zen::UInt64& bytesComparedLast) : + pc_(pc), m_bytesComparedLast(bytesComparedLast) {} - virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred) + virtual void updateCompareStatus(zen::UInt64 totalBytesTransferred) { //called every 512 kB //inform about the (differential) processed amount of data - m_handler->updateProcessedData(0, totalBytesTransferred - m_bytesComparedLast); + pc_.updateProcessedData(0, to<zen::Int64>(totalBytesTransferred) - to<zen::Int64>(m_bytesComparedLast)); m_bytesComparedLast = totalBytesTransferred; - m_handler->requestUiRefresh(); //exceptions may be thrown here! + pc_.requestUiRefresh(); //exceptions may be thrown here! } private: - StatusHandler* m_handler; - wxLongLong& m_bytesComparedLast; + ProcessCallback& pc_; + zen::UInt64& m_bytesComparedLast; }; -bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, const wxULongLong& totalBytesToCmp, StatusHandler* handler) +bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, zen::UInt64 totalBytesToCmp, ProcessCallback& pc) { - wxLongLong bytesComparedLast; //amount of bytes that have been compared and communicated to status handler + zen::UInt64 bytesComparedLast; //amount of bytes that have been compared and communicated to status handler - CmpCallbackImpl callback(handler, bytesComparedLast); + CmpCallbackImpl callback(pc, bytesComparedLast); bool sameContent = true; try @@ -539,12 +526,12 @@ bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filen catch (...) { //error situation: undo communication of processed amount of data - handler->updateProcessedData(0, bytesComparedLast * -1); + pc.updateProcessedData(0, -1 * to<zen::Int64>(bytesComparedLast)); throw; } //inform about the (remaining) processed amount of data - handler->updateProcessedData(0, common::convertToSigned(totalBytesToCmp) - bytesComparedLast); + pc.updateProcessedData(0, to<zen::Int64>(totalBytesToCmp) - to<zen::Int64>(bytesComparedLast)); return sameContent; } @@ -555,30 +542,17 @@ struct ToBeRemoved bool operator()(const DirMapping& dirObj) const { return !dirObj.isActive() && - dirObj.useSubDirs(). size() == 0 && - dirObj.useSubLinks().size() == 0 && - dirObj.useSubFiles().size() == 0; + dirObj.useSubDirs ().empty() && + dirObj.useSubLinks().empty() && + dirObj.useSubFiles().empty(); } }; -std::set<Zstring> getFolders(const std::vector<FolderPairCfg>& directoryPairsFormatted) -{ - std::set<Zstring> output; - for (std::vector<FolderPairCfg>::const_iterator i = directoryPairsFormatted.begin(); i != directoryPairsFormatted.end(); ++i) - { - output.insert(i->leftDirectory); - output.insert(i->rightDirectory); - } - output.erase(Zstring()); //remove empty directory strings - return output; -} - - class RemoveFilteredDirs { public: - RemoveFilteredDirs(const BaseFilter& filterProc) : + RemoveFilteredDirs(const HardFilter& filterProc) : filterProc_(filterProc) {} void execute(HierarchyObject& hierObj) @@ -604,16 +578,8 @@ private: execute(dirObj); } - const BaseFilter& filterProc_; + const HardFilter& filterProc_; }; - - -void formatPair(FolderPairCfg& input) -{ - //ensure they end with common::FILE_NAME_SEPARATOR and replace macros - input.leftDirectory = ffs3::getFormattedDirectoryName(input.leftDirectory); - input.rightDirectory = ffs3::getFormattedDirectoryName(input.rightDirectory); -} } //############################################################################################################################# @@ -621,10 +587,10 @@ void formatPair(FolderPairCfg& input) CompareProcess::CompareProcess(SymLinkHandling handleSymlinks, size_t fileTimeTol, xmlAccess::OptionalDialogs& warnings, - StatusHandler* handler) : + ProcessCallback& handler) : fileTimeTolerance(fileTimeTol), m_warnings(warnings), - statusUpdater(handler), + procCallback(handler), txtComparingContentOfFiles(wxToZ(_("Comparing content of files %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false)) { directoryBuffer.reset(new DirectoryBuffer(handleSymlinks, handler)); @@ -643,22 +609,18 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc //init process: keep at beginning so that all gui elements are initialized properly - statusUpdater->initNewProcess(-1, 0, StatusHandler::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects - - //format directory pairs: ensure they end with common::FILE_NAME_SEPARATOR and replace macros! - std::vector<FolderPairCfg> directoryPairsFormatted = directoryPairs; - std::for_each(directoryPairsFormatted.begin(), directoryPairsFormatted.end(), formatPair); + procCallback.initNewProcess(-1, 0, ProcessCallback::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects //-------------------some basic checks:------------------------------------------ //ensure that folders are valid - foldersAreValidForComparison(directoryPairsFormatted, statusUpdater); + foldersAreValidForComparison(directoryPairs, procCallback); { //check if folders have dependencies - wxString warningMessage = checkFolderDependency(directoryPairsFormatted); + wxString warningMessage = checkFolderDependency(directoryPairs); if (!warningMessage.empty()) - statusUpdater->reportWarning(warningMessage.c_str(), m_warnings.warningDependentFolders); + procCallback.reportWarning(warningMessage.c_str(), m_warnings.warningDependentFolders); } //-------------------end of basic checks------------------------------------------ @@ -668,90 +630,52 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc { //prevent shutdown while (binary) comparison is in progress util::DisableStandby dummy2; - - //place a lock on all directories before traversing (sync.ffs_lock) - std::map<Zstring, DirLock> lockHolder; - { - const std::set<Zstring> folderList = getFolders(directoryPairsFormatted); - for (std::set<Zstring>::const_iterator i = folderList.begin(); i != folderList.end(); ++i) - { - class WaitOnLockHandler : public DirLockCallback - { - public: - WaitOnLockHandler(StatusHandler& statusUpdater) : waitHandler(statusUpdater) {} - - virtual void requestUiRefresh() //allowed to throw exceptions - { - waitHandler.requestUiRefresh(); - } - virtual void reportInfo(const Zstring& text) - { - waitHandler.reportInfo(text); - } - private: - StatusHandler& waitHandler; - } callback(*statusUpdater); - - try - { - lockHolder.insert(std::make_pair(*i, DirLock(*i + Zstr("sync.") + LOCK_FILE_ENDING, &callback))); - } - catch (const FileError& e) - { - bool dummy = false; //this warning shall not be shown but logged only - statusUpdater->reportWarning(e.msg(), dummy); - } - } - } + (void)dummy2; //traverse/process folders FolderComparison output_tmp; //write to output not before END of process! switch (cmpVar) { case CMP_BY_TIME_SIZE: - compareByTimeSize(directoryPairsFormatted, output_tmp); + compareByTimeSize(directoryPairs, output_tmp); break; case CMP_BY_CONTENT: - compareByContent(directoryPairsFormatted, output_tmp); + compareByContent(directoryPairs, output_tmp); break; } - assert (output_tmp.size() == directoryPairsFormatted.size()); + assert (output_tmp.size() == directoryPairs.size()); for (FolderComparison::iterator j = output_tmp.begin(); j != output_tmp.end(); ++j) { - const FolderPairCfg& fpCfg = directoryPairsFormatted[j - output_tmp.begin()]; + const FolderPairCfg& fpCfg = directoryPairs[j - output_tmp.begin()]; //attention: some filtered directories are still in the comparison result! (see include filter handling!) - if (!fpCfg.filter->isNull()) - RemoveFilteredDirs(*fpCfg.filter).execute(*j); //remove all excluded directories (but keeps those serving as parent folders for not excl. elements) + if (!fpCfg.filter.nameFilter->isNull()) + RemoveFilteredDirs(*fpCfg.filter.nameFilter).execute(*j); //remove all excluded directories (but keeps those serving as parent folders for not excl. elements) + + //apply soft filtering / hard filter already applied + addSoftFiltering(*j, fpCfg.filter.timeSizeFilter); //set initial sync-direction class RedetermineCallback : public DeterminationProblem { public: - RedetermineCallback(bool& warningSyncDatabase, StatusHandler& statusUpdater) : + RedetermineCallback(bool& warningSyncDatabase, ProcessCallback& procCallback) : warningSyncDatabase_(warningSyncDatabase), - statusUpdater_(statusUpdater) {} + procCallback_(procCallback) {} virtual void reportWarning(const wxString& text) { - statusUpdater_.reportWarning(text, warningSyncDatabase_); + procCallback_.reportWarning(text, warningSyncDatabase_); } private: bool& warningSyncDatabase_; - StatusHandler& statusUpdater_; - } redetCallback(m_warnings.warningSyncDatabase, *statusUpdater); - - ffs3::redetermineSyncDirection(fpCfg.syncConfiguration, *j, &redetCallback); - + ProcessCallback& procCallback_; + } redetCallback(m_warnings.warningSyncDatabase, procCallback); - //pass locks to directory structure - std::map<Zstring, DirLock>::const_iterator iter = lockHolder.find(j->getBaseDir<LEFT_SIDE>()); - if (iter != lockHolder.end()) j->holdLock<LEFT_SIDE>(iter->second); - iter = lockHolder.find(j->getBaseDir<RIGHT_SIDE>()); - if (iter != lockHolder.end()) j->holdLock<RIGHT_SIDE>(iter->second); + zen::redetermineSyncDirection(fpCfg.syncConfiguration, *j, &redetCallback); } //only if everything was processed correctly output is written to! @@ -760,18 +684,18 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc } catch (const std::bad_alloc& e) { - statusUpdater->reportFatalError(wxString(_("Memory allocation failed!")) + wxT(" ") + wxString::FromAscii(e.what())); + procCallback.reportFatalError(wxString(_("Memory allocation failed!")) + wxT(" ") + wxString::FromAscii(e.what())); } catch (const std::exception& e) { - statusUpdater->reportFatalError(wxString::FromAscii(e.what())); + procCallback.reportFatalError(wxString::FromAscii(e.what())); } } //--------------------assemble conflict descriptions--------------------------- //check for very old dates or dates in the future -wxString getConflictInvalidDate(const Zstring& fileNameFull, const wxLongLong& utcTime) +wxString getConflictInvalidDate(const Zstring& fileNameFull, zen::Int64 utcTime) { wxString msg = _("File %x has an invalid date!"); msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileNameFull) + wxT("\"")); @@ -807,9 +731,9 @@ wxString getConflictSameDateDiffSize(const FileMapping& fileObj) msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileObj.getRelativeName<LEFT_SIDE>()) + wxT("\"")); msg += wxT("\n\n"); msg += left + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime<LEFT_SIDE>()) + - wxT(" \t") + _("Size") + wxT(": ") + fileObj.getFileSize<LEFT_SIDE>().ToString() + wxT("\n"); + wxT(" \t") + _("Size") + wxT(": ") + toStringSep(fileObj.getFileSize<LEFT_SIDE>()) + wxT("\n"); msg += right + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + - wxT(" \t") + _("Size") + wxT(": ") + fileObj.getFileSize<RIGHT_SIDE>().ToString(); + wxT(" \t") + _("Size") + wxT(": ") + toStringSep(fileObj.getFileSize<RIGHT_SIDE>()); return wxString(_("Conflict detected:")) + wxT("\n") + msg; } @@ -879,16 +803,16 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping* linkObj) const } -void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output) const +void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) const { - output.reserve(output.size() + directoryPairsFormatted.size()); + output.reserve(output.size() + directoryPairs.size()); //process one folder pair after each other - for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) + for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair) { - BaseDirMapping newEntry(pair->leftDirectory, - pair->rightDirectory, - pair->filter); + BaseDirMapping newEntry(pair->leftDirectoryFmt, + pair->rightDirectoryFmt, + pair->filter.nameFilter); output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp! //do basis scan and retrieve files existing on both sides as "compareCandidates" @@ -942,14 +866,14 @@ void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directo } -wxULongLong getBytesToCompare(const std::vector<FileMapping*>& rowsToCompare) +zen::UInt64 getBytesToCompare(const std::vector<FileMapping*>& rowsToCompare) { - wxULongLong dataTotal; + zen::UInt64 dataTotal; for (std::vector<FileMapping*>::const_iterator j = rowsToCompare.begin(); j != rowsToCompare.end(); ++j) dataTotal += (*j)->getFileSize<LEFT_SIDE>(); //left and right filesizes should be the same - return dataTotal * 2; + return dataTotal * 2U; } @@ -977,20 +901,20 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping* linkObj) const } -void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output) const +void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) const { //PERF_START; std::vector<FileMapping*> compareCandidates; //attention: make sure pointers in "compareCandidates" remain valid!!! - output.reserve(output.size() + directoryPairsFormatted.size()); + output.reserve(output.size() + directoryPairs.size()); //process one folder pair after each other - for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) + for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair) { - BaseDirMapping newEntry(pair->leftDirectory, - pair->rightDirectory, - pair->filter); + BaseDirMapping newEntry(pair->leftDirectoryFmt, + pair->rightDirectoryFmt, + pair->filter.nameFilter); output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp! std::vector<SymLinkMapping*> uncategorizedLinks; @@ -1019,11 +943,11 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director const size_t objectsTotal = filesToCompareBytewise.size() * 2; - const wxULongLong bytesTotal = getBytesToCompare(filesToCompareBytewise); + const zen::UInt64 bytesTotal = getBytesToCompare(filesToCompareBytewise); - statusUpdater->initNewProcess(static_cast<int>(objectsTotal), - common::convertToSigned(bytesTotal), - StatusHandler::PROCESS_COMPARING_CONTENT); + procCallback.initNewProcess(static_cast<int>(objectsTotal), + to<zen::Int64>(bytesTotal), + ProcessCallback::PROCESS_COMPARING_CONTENT); const CmpFileTime timeCmp(fileTimeTolerance); @@ -1034,20 +958,20 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director Zstring statusText = txtComparingContentOfFiles; statusText.Replace(Zstr("%x"), line->getRelativeName<LEFT_SIDE>(), false); - statusUpdater->reportInfo(statusText); + procCallback.reportInfo(statusText); //check files that exist in left and right model but have different content while (true) { //trigger display refresh - statusUpdater->requestUiRefresh(); + procCallback.requestUiRefresh(); try { if (filesHaveSameContentUpdating(line->getFullName<LEFT_SIDE>(), line->getFullName<RIGHT_SIDE>(), - line->getFileSize<LEFT_SIDE>() * 2, - statusUpdater)) + line->getFileSize<LEFT_SIDE>() * 2U, + procCallback)) { if (line->getShortName<LEFT_SIDE>() == line->getShortName<RIGHT_SIDE>() && timeCmp.getResult(line->getLastWriteTime<LEFT_SIDE>(), @@ -1059,12 +983,12 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director else line->setCategory<FILE_DIFFERENT>(); - statusUpdater->updateProcessedData(2, 0); //processed data is communicated in subfunctions! + procCallback.updateProcessedData(2, 0); //processed data is communicated in subfunctions! break; } catch (FileError& error) { - ErrorHandler::Response rv = statusUpdater->reportError(error.msg()); + ErrorHandler::Response rv = procCallback.reportError(error.msg()); if (rv == ErrorHandler::IGNORE_ERROR) { line->setCategoryConflict(wxString(_("Conflict detected:")) + wxT("\n") + _("Comparing files by content failed.")); @@ -1265,8 +1189,8 @@ void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector<F output.getFilter()); - statusUpdater->reportInfo(wxToZ(_("Generating file list..."))); - statusUpdater->forceUiRefresh(); //keep total number of scanned files up to date + procCallback.reportInfo(wxToZ(_("Generating file list..."))); + procCallback.forceUiRefresh(); //keep total number of scanned files up to date //PERF_STOP; diff --git a/comparison.h b/comparison.h index 792f813c..02d3944d 100644 --- a/comparison.h +++ b/comparison.h @@ -12,30 +12,29 @@ #include "library/status_handler.h" #include "structures.h" #include "shared/disable_standby.h" +#include "library/norm_filter.h" -namespace ffs3 +namespace zen { - struct FolderPairCfg { - FolderPairCfg(const Zstring& leftDir, + FolderPairCfg(const Zstring& leftDir, //must be formatted folder pairs! const Zstring& rightDir, - const BaseFilter::FilterRef& filterIn, - const SyncConfiguration& syncCfg) : - leftDirectory(leftDir), - rightDirectory(rightDir), + const NormalizedFilter& filterIn, + const SyncConfig& syncCfg) : + leftDirectoryFmt(leftDir), + rightDirectoryFmt(rightDir), filter(filterIn), syncConfiguration(syncCfg) {} - Zstring leftDirectory; - Zstring rightDirectory; - - BaseFilter::FilterRef filter; //filter interface: always bound by design! - SyncConfiguration syncConfiguration; + Zstring leftDirectoryFmt; //resolved folder pairs!!! + Zstring rightDirectoryFmt; // + NormalizedFilter filter; + SyncConfig syncConfiguration; }; -std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); +std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); //fill FolderPairCfg and resolve folder pairs //class handling comparison process @@ -45,7 +44,7 @@ public: CompareProcess(SymLinkHandling handleSymlinks, size_t fileTimeTol, xmlAccess::OptionalDialogs& warnings, - StatusHandler* handler); + ProcessCallback& handler); void startCompareProcess(const std::vector<FolderPairCfg>& directoryPairs, const CompareVariant cmpVar, @@ -69,7 +68,7 @@ private: xmlAccess::OptionalDialogs& m_warnings; - StatusHandler* const statusUpdater; + ProcessCallback& procCallback; const Zstring txtComparingContentOfFiles; }; } diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp index 1681da22..672fd1b1 100644 --- a/file_hierarchy.cpp +++ b/file_hierarchy.cpp @@ -7,7 +7,7 @@ #include "file_hierarchy.h" #include "shared/build_info.h" -using namespace ffs3; +using namespace zen; namespace { @@ -202,7 +202,7 @@ SyncOperation FileSystemObject::getSyncOperation( } -const Zstring& ffs3::getSyncDBFilename() +const Zstring& zen::getSyncDBFilename() { //Linux and Windows builds are binary incompatible: char/wchar_t case, sensitive/insensitive //32 and 64 bit db files ARE designed to be binary compatible! diff --git a/file_hierarchy.h b/file_hierarchy.h index 5b630c9f..d521cb33 100644 --- a/file_hierarchy.h +++ b/file_hierarchy.h @@ -9,16 +9,15 @@ #include "shared/zstring.h" #include "shared/system_constants.h" -#include <wx/longlong.h> #include <map> #include <set> #include <vector> #include "structures.h" #include <boost/shared_ptr.hpp> #include "shared/guid.h" -#include "library/filter.h" +#include "library/hard_filter.h" #include "shared/file_id.h" -#include "library/dir_lock.h" +#include "shared/int64.h" class DirectoryBuffer; @@ -41,18 +40,18 @@ private: } -namespace ffs3 +namespace zen { struct FileDescriptor { FileDescriptor() {} - FileDescriptor(const wxLongLong& lastWriteTimeRawIn, - const wxULongLong& fileSizeIn) : + FileDescriptor(zen::Int64 lastWriteTimeRawIn, + zen::UInt64 fileSizeIn) : lastWriteTimeRaw(lastWriteTimeRawIn), fileSize(fileSizeIn) {} - wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) - wxULongLong fileSize; + zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) + zen::UInt64 fileSize; //#warning: what about memory consumption?? (assume large comparisons!!?) //util::FileID fileIdentifier; //unique file identifier, optional: may be NULL! @@ -68,14 +67,14 @@ struct LinkDescriptor }; LinkDescriptor() : type(TYPE_FILE) {} - LinkDescriptor(const wxLongLong& lastWriteTimeRawIn, + LinkDescriptor(zen::Int64 lastWriteTimeRawIn, const Zstring& targetPathIn, LinkType lt) : lastWriteTimeRaw(lastWriteTimeRawIn), targetPath(targetPathIn), type(lt) {} - wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) + zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) Zstring targetPath; //symlink "content", may be empty if determination failed LinkType type; //type is required for Windows only! On Linux there is no such thing => consider this when comparing Symbolic Links! }; @@ -242,22 +241,16 @@ class BaseDirMapping : public HierarchyObject //synchronization base directory public: BaseDirMapping(const Zstring& dirPostfixedLeft, const Zstring& dirPostfixedRight, - const BaseFilter::FilterRef& filterIn) : + const HardFilter::FilterRef& filterIn) : HierarchyObject(dirPostfixedLeft, dirPostfixedRight), filter(filterIn) {} - const BaseFilter::FilterRef& getFilter() const; + const HardFilter::FilterRef& getFilter() const; template <SelectedSide side> Zstring getDBFilename() const; virtual void swap(); - //BaseDirMapping is created incrementally and not once via constructor => same for locks - template <SelectedSide side> void holdLock(const DirLock& lock); - private: - boost::shared_ptr<DirLock> leftDirLock; - boost::shared_ptr<DirLock> rightDirLock; - - BaseFilter::FilterRef filter; + HardFilter::FilterRef filter; }; @@ -308,10 +301,10 @@ public: //comparison result virtual CompareFilesResult getCategory() const = 0; - virtual const wxString& getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT + virtual wxString getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT //sync operation SyncOperation getSyncOperation() const; - const wxString& getSyncOpConflict() const; //only filled if getSyncOperation() == SYNC_DIR_INT_CONFLICT + wxString getSyncOpConflict() const; //only filled if getSyncOperation() == SYNC_DIR_INT_CONFLICT SyncOperation testSyncOperation(bool selected, SyncDirection syncDir) const; //get syncOp with provided settings //sync settings @@ -380,7 +373,7 @@ public: virtual CompareFilesResult getCategory() const; CompareDirResult getDirCategory() const; //returns actually used subset of CompareFilesResult - virtual const wxString& getCatConflict() const; + virtual wxString getCatConflict() const; private: friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult @@ -423,12 +416,12 @@ class FileMapping : public FileSystemObject public: virtual void accept(FSObjectVisitor& visitor) const; - template <SelectedSide side> const wxLongLong& getLastWriteTime() const; - template <SelectedSide side> const wxULongLong& getFileSize() const; + template <SelectedSide side> zen::Int64 getLastWriteTime() const; + template <SelectedSide side> zen::UInt64 getFileSize() const; template <SelectedSide side> const Zstring getExtension() const; virtual CompareFilesResult getCategory() const; - virtual const wxString& getCatConflict() const; + virtual wxString getCatConflict() const; private: friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult @@ -470,13 +463,13 @@ class SymLinkMapping : public FileSystemObject //this class models a TRUE symbol public: virtual void accept(FSObjectVisitor& visitor) const; - template <SelectedSide side> const wxLongLong& getLastWriteTime() const; //write time of the link, NOT target! + template <SelectedSide side> zen::Int64 getLastWriteTime() const; //write time of the link, NOT target! template <SelectedSide side> LinkDescriptor::LinkType getLinkType() const; template <SelectedSide side> const Zstring& getTargetPath() const; virtual CompareFilesResult getCategory() const; CompareSymlinkResult getLinkCategory() const; //returns actually used subset of CompareFilesResult - virtual const wxString& getCatConflict() const; + virtual wxString getCatConflict() const; private: friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult @@ -598,7 +591,7 @@ CompareFilesResult FileMapping::getCategory() const inline -const wxString& FileMapping::getCatConflict() const +wxString FileMapping::getCatConflict() const { return cmpConflictDescr; } @@ -619,10 +612,9 @@ CompareDirResult DirMapping::getDirCategory() const inline -const wxString& DirMapping::getCatConflict() const +wxString DirMapping::getCatConflict() const { - static wxString empty; - return empty; + return wxEmptyString; } @@ -634,7 +626,7 @@ void FileSystemObject::setSyncDir(SyncDirection newDir) inline -const wxString& FileSystemObject::getSyncOpConflict() const +wxString FileSystemObject::getSyncOpConflict() const { //a sync operation conflict can occur when: //1. category-conflict and syncDir == NONE -> problem finding category @@ -1016,7 +1008,7 @@ void DirMapping::copyToR() inline -const BaseFilter::FilterRef& BaseDirMapping::getFilter() const +const HardFilter::FilterRef& BaseDirMapping::getFilter() const { return filter; } @@ -1030,22 +1022,6 @@ Zstring BaseDirMapping::getDBFilename() const } -template <> -inline -void BaseDirMapping::holdLock<LEFT_SIDE>(const DirLock& lock) -{ - leftDirLock.reset(new DirLock(lock)); -} - - -template <> -inline -void BaseDirMapping::holdLock<RIGHT_SIDE>(const DirLock& lock) -{ - rightDirLock.reset(new DirLock(lock)); -} - - inline void FileMapping::swap() { @@ -1102,7 +1078,7 @@ inline void FileMapping::removeObjectL() { cmpResult = FILE_RIGHT_SIDE_ONLY; - dataLeft = FileDescriptor(0, 0); + dataLeft = FileDescriptor(); } @@ -1110,7 +1086,7 @@ inline void FileMapping::removeObjectR() { cmpResult = FILE_LEFT_SIDE_ONLY; - dataRight = FileDescriptor(0, 0); + dataRight = FileDescriptor(); } @@ -1134,7 +1110,7 @@ void FileMapping::copyToR() template <> inline -const wxLongLong& FileMapping::getLastWriteTime<LEFT_SIDE>() const +zen::Int64 FileMapping::getLastWriteTime<LEFT_SIDE>() const { return dataLeft.lastWriteTimeRaw; } @@ -1142,7 +1118,7 @@ const wxLongLong& FileMapping::getLastWriteTime<LEFT_SIDE>() const template <> inline -const wxLongLong& FileMapping::getLastWriteTime<RIGHT_SIDE>() const +zen::Int64 FileMapping::getLastWriteTime<RIGHT_SIDE>() const { return dataRight.lastWriteTimeRaw; } @@ -1150,7 +1126,7 @@ const wxLongLong& FileMapping::getLastWriteTime<RIGHT_SIDE>() const template <> inline -const wxULongLong& FileMapping::getFileSize<LEFT_SIDE>() const +zen::UInt64 FileMapping::getFileSize<LEFT_SIDE>() const { return dataLeft.fileSize; } @@ -1158,7 +1134,7 @@ const wxULongLong& FileMapping::getFileSize<LEFT_SIDE>() const template <> inline -const wxULongLong& FileMapping::getFileSize<RIGHT_SIDE>() const +zen::UInt64 FileMapping::getFileSize<RIGHT_SIDE>() const { return dataRight.fileSize; } @@ -1180,7 +1156,7 @@ const Zstring FileMapping::getExtension() const template <> inline -const wxLongLong& SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const +zen::Int64 SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const { return dataLeft.lastWriteTimeRaw; } @@ -1188,7 +1164,7 @@ const wxLongLong& SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const template <> inline -const wxLongLong& SymLinkMapping::getLastWriteTime<RIGHT_SIDE>() const +zen::Int64 SymLinkMapping::getLastWriteTime<RIGHT_SIDE>() const { return dataRight.lastWriteTimeRaw; } @@ -1242,7 +1218,7 @@ CompareSymlinkResult SymLinkMapping::getLinkCategory() const inline -const wxString& SymLinkMapping::getCatConflict() const +wxString SymLinkMapping::getCatConflict() const { return cmpConflictDescr; } diff --git a/library/binary.cpp b/library/binary.cpp index 72fc220a..3a202711 100644 --- a/library/binary.cpp +++ b/library/binary.cpp @@ -8,7 +8,7 @@ #include "../shared/file_io.h" #include <vector> #include <wx/stopwatch.h> - +#include "../shared/int64.h" inline void setMinSize(std::vector<char>& buffer, size_t minSize) @@ -66,7 +66,7 @@ private: } -bool ffs3::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback) +bool zen::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback) { FileInput file1(filename1); //throw (FileError) FileInput file2(filename2); //throw (FileError) @@ -76,7 +76,7 @@ bool ffs3::filesHaveSameContent(const Zstring& filename1, const Zstring& filenam static std::vector<char> memory1; static std::vector<char> memory2; - wxLongLong bytesCompared; + zen::UInt64 bytesCompared; wxLongLong lastDelayViolation = wxGetLocalTimeMillis(); diff --git a/library/binary.h b/library/binary.h index 847c7169..b796ddbb 100644 --- a/library/binary.h +++ b/library/binary.h @@ -8,10 +8,10 @@ #define BINARY_H_INCLUDED #include "../shared/zstring.h" -#include <wx/longlong.h> #include "../shared/file_error.h" +#include "../shared/int64.h" -namespace ffs3 +namespace zen { //callback functionality for status updates while comparing @@ -19,7 +19,7 @@ class CompareCallback { public: virtual ~CompareCallback() {} - virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred) = 0; + virtual void updateCompareStatus(zen::UInt64 totalBytesTransferred) = 0; }; bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback); //throw FileError diff --git a/library/cmp_filetime.h b/library/cmp_filetime.h index b95eae5f..24b331c6 100644 --- a/library/cmp_filetime.h +++ b/library/cmp_filetime.h @@ -1,28 +1,26 @@ #ifndef CMP_FILETIME_H_INCLUDED #define CMP_FILETIME_H_INCLUDED -#include <wx/longlong.h> #include <wx/stopwatch.h> +#include "../shared/int64.h" - -namespace ffs3 +namespace zen { //--------------------------------------------------------------------------------------------------------------- inline -bool sameFileTime(const wxLongLong& a, const wxLongLong& b, size_t tolerance) +bool sameFileTime(const Int64& a, const Int64& b, size_t tolerance) { if (a < b) - return b <= a + tolerance; + return b <= a + static_cast<int>(tolerance); else - return a <= b + tolerance; + return a <= b + static_cast<int>(tolerance); } //--------------------------------------------------------------------------------------------------------------- class CmpFileTime { public: - CmpFileTime(size_t tolerance) : - tolerance_(tolerance) {} + CmpFileTime(size_t tolerance) : tolerance_(tolerance) {} enum Result { @@ -33,7 +31,7 @@ public: TIME_RIGHT_INVALID }; - Result getResult(const wxLongLong& lhs, const wxLongLong& rhs) const + Result getResult(const Int64& lhs, const Int64& rhs) const { if (lhs == rhs) return TIME_EQUAL; diff --git a/library/custom_grid.cpp b/library/custom_grid.cpp index d8ced2a3..172ad2e1 100644 --- a/library/custom_grid.cpp +++ b/library/custom_grid.cpp @@ -21,6 +21,7 @@ #include <wx/icon.h> #include <wx/tooltip.h> #include <wx/settings.h> +#include "../shared/i18n.h" #ifdef FFS_WIN #include <wx/timer.h> @@ -31,7 +32,7 @@ #include <gtk/gtk.h> #endif -using namespace ffs3; +using namespace zen; const size_t MIN_ROW_COUNT = 15; @@ -294,10 +295,10 @@ protected: value = zToWx(fileObj.getBaseDirPf<side>()); break; case xmlAccess::SIZE: //file size - value = ffs3::numberToStringSep(fileObj.getFileSize<side>()); + value = zen::toStringSep(fileObj.getFileSize<side>()); break; case xmlAccess::DATE: //date - value = ffs3::utcTimeToLocalString(fileObj.getLastWriteTime<side>()); + value = zen::utcTimeToLocalString(fileObj.getLastWriteTime<side>()); break; case xmlAccess::EXTENSION: //file extension value = zToWx(fileObj.getExtension<side>()); @@ -325,7 +326,7 @@ protected: value = _("<Symlink>"); break; case xmlAccess::DATE: //date - value = ffs3::utcTimeToLocalString(linkObj.getLastWriteTime<side>()); + value = zen::utcTimeToLocalString(linkObj.getLastWriteTime<side>()); break; case xmlAccess::EXTENSION: //file extension value = wxEmptyString; @@ -675,7 +676,7 @@ void CustomGrid::initSettings(CustomGridLeft* gridLeft, } -void CustomGrid::release() //release connection to ffs3::GridView +void CustomGrid::release() //release connection to zen::GridView { assert(getGridDataTable()); getGridDataTable()->setGridDataTable(NULL); //kind of "disable" griddatatable; don't delete it with SetTable(NULL)! May be used by wxGridCellStringRenderer @@ -1352,14 +1353,14 @@ void CustomGridRim::setTooltip(const wxMouseEvent& event) virtual void visit(const FileMapping& fileObj) { tipMsg_ = zToWx(fileObj.getRelativeName<side>()) + wxT("\n") + - _("Size") + wxT(": ") + ffs3::formatFilesizeToShortString(fileObj.getFileSize<side>()) + wxT("\n") + - _("Date") + wxT(": ") + ffs3::utcTimeToLocalString(fileObj.getLastWriteTime<side>()); + _("Size") + wxT(": ") + zen::formatFilesizeToShortString(fileObj.getFileSize<side>()) + wxT("\n") + + _("Date") + wxT(": ") + zen::utcTimeToLocalString(fileObj.getLastWriteTime<side>()); } virtual void visit(const SymLinkMapping& linkObj) { tipMsg_ = zToWx(linkObj.getRelativeName<side>()) + wxT("\n") + - _("Date") + wxT(": ") + ffs3::utcTimeToLocalString(linkObj.getLastWriteTime<side>()); + _("Date") + wxT(": ") + zen::utcTimeToLocalString(linkObj.getLastWriteTime<side>()); } virtual void visit(const DirMapping& dirObj) @@ -1698,7 +1699,7 @@ void CustomGridRim::getIconsToBeLoaded(std::vector<Zstring>& newLoad) //loads al if (!fileName.empty()) { //test if they are already loaded in buffer: - if (ffs3::IconBuffer::getInstance().requestFileIcon(fileName)) + if (zen::IconBuffer::getInstance().requestFileIcon(fileName)) { //exists in buffer: refresh Row for (int k = 0; k < totalCols; ++k) @@ -1746,7 +1747,7 @@ void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet) //merge vectors newLoad.insert(newLoad.end(), iconsLeft.begin(), iconsLeft.end()); - ffs3::IconBuffer::getInstance().setWorkload(newLoad); + zen::IconBuffer::getInstance().setWorkload(newLoad); //event.Skip(); } @@ -1775,10 +1776,10 @@ bool CustomGridLeft::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectio } -void CustomGridLeft::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView +void CustomGridLeft::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView) + const zen::GridView* gridDataView) { //set underlying grid data assert(getGridDataTable()); @@ -1823,10 +1824,10 @@ bool CustomGridRight::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelecti } -void CustomGridRight::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView +void CustomGridRight::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView) + const zen::GridView* gridDataView) { //set underlying grid data assert(getGridDataTable()); @@ -1921,10 +1922,10 @@ bool CustomGridMiddle::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelect } -void CustomGridMiddle::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView +void CustomGridMiddle::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView) + const zen::GridView* gridDataView) { //set underlying grid data assert(getGridDataTable()); @@ -2345,7 +2346,7 @@ void CustomGridMiddle::DrawColLabel(wxDC& dc, int col) } -const wxBitmap& ffs3::getSyncOpImage(SyncOperation syncOp) +const wxBitmap& zen::getSyncOpImage(SyncOperation syncOp) { switch (syncOp) //evaluate comparison result and sync direction { diff --git a/library/custom_grid.h b/library/custom_grid.h index e8138bfc..1301486f 100644 --- a/library/custom_grid.h +++ b/library/custom_grid.h @@ -30,7 +30,7 @@ class CustomGridMiddle; class CustomGridRight; -namespace ffs3 +namespace zen { class GridView; @@ -63,12 +63,12 @@ public: virtual ~CustomGrid() {} - virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView + virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView); + const zen::GridView* gridDataView); - void release(); //release connection to ffs3::GridView + void release(); //release connection to zen::GridView std::set<size_t> getAllSelectedRows() const; @@ -165,7 +165,7 @@ public: void enableFileIcons(const bool value); protected: - template <ffs3::SelectedSide side> + template <zen::SelectedSide side> void setTooltip(const wxMouseEvent& event); void setOtherGrid(CustomGridRim* other); //call during initialization! @@ -211,10 +211,10 @@ public: virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); - virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView + virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView); + const zen::GridView* gridDataView); private: void OnMouseMovement(wxMouseEvent& event); @@ -234,10 +234,10 @@ public: virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); - virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView + virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView); + const zen::GridView* gridDataView); private: void OnMouseMovement(wxMouseEvent& event); @@ -261,10 +261,10 @@ public: virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); - virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView + virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView CustomGridMiddle* gridMiddle, CustomGridRight* gridRight, - const ffs3::GridView* gridDataView); + const zen::GridView* gridDataView); void enableSyncPreview(bool value); @@ -346,7 +346,7 @@ extern const wxEventType FFS_SYNC_DIRECTION_EVENT; //define new event type class FFSSyncDirectionEvent : public wxCommandEvent { public: - FFSSyncDirectionEvent(const int from, const int to, const ffs3::SyncDirection dir) : + FFSSyncDirectionEvent(const int from, const int to, const zen::SyncDirection dir) : wxCommandEvent(FFS_SYNC_DIRECTION_EVENT), rowFrom(from), rowTo(to), @@ -359,7 +359,7 @@ public: const int rowFrom; const int rowTo; - const ffs3::SyncDirection direction; + const zen::SyncDirection direction; }; typedef void (wxEvtHandler::*FFSSyncDirectionEventFunction)(FFSSyncDirectionEvent&); diff --git a/library/db_file.cpp b/library/db_file.cpp index 43ebf283..47e03b66 100644 --- a/library/db_file.cpp +++ b/library/db_file.cpp @@ -7,29 +7,30 @@ #include "db_file.h" #include <wx/wfstream.h> #include <wx/zstream.h> +#include <wx/mstream.h> #include "../shared/global_func.h" #include "../shared/file_error.h" #include "../shared/string_conv.h" #include "../shared/file_handling.h" -#include <wx/mstream.h> #include "../shared/serialize.h" #include "../shared/file_io.h" #include "../shared/loki/ScopeGuard.h" #include "../shared/i18n.h" +#include <boost/bind.hpp> #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" #include "../shared/long_path_prefix.h" #endif -using namespace ffs3; +using namespace zen; namespace { //------------------------------------------------------------------------------------------------------------------------------- const char FILE_FORMAT_DESCR[] = "FreeFileSync"; -const int FILE_FORMAT_VER = 5; +const int FILE_FORMAT_VER = 6; //------------------------------------------------------------------------------------------------------------------------------- @@ -67,19 +68,17 @@ private: //####################################################################################################################################### - - -class ReadDirInfo : public util::ReadInputStream +class ReadDirInfo : public zen::ReadInputStream { public: ReadDirInfo(wxInputStream& stream, const wxString& errorObjName, DirInformation& dirInfo) : ReadInputStream(stream, errorObjName) { //|------------------------------------------------------------------------------------- - //| ensure 32/64 bit portability: used fixed size data types only e.g. boost::uint32_t | + //| ensure 32/64 bit portability: use fixed size data types only e.g. boost::uint32_t | //|------------------------------------------------------------------------------------- - //read filter settings - dirInfo.filter = BaseFilter::loadFilter(getStream()); + //read filter settings -> currently not required, but persisting it doesn't hurt + dirInfo.filter = HardFilter::loadFilter(getStream()); check(); //start recursion @@ -89,56 +88,48 @@ public: private: void execute(DirContainer& dirCont) const { - boost::uint32_t fileCount = readNumberC<boost::uint32_t>(); - while (fileCount-- != 0) + while (readNumberC<bool>()) readSubFile(dirCont); - boost::uint32_t symlinkCount = readNumberC<boost::uint32_t>(); - while (symlinkCount-- != 0) + while (readNumberC<bool>()) readSubLink(dirCont); - boost::uint32_t dirCount = readNumberC<boost::uint32_t>(); - while (dirCount-- != 0) + while (readNumberC<bool>()) readSubDirectory(dirCont); } void readSubFile(DirContainer& dirCont) const { //attention: order of function argument evaluation is undefined! So do it one after the other... - const Zstring shortName = readStringC(); //file name - - const boost::int32_t modHigh = readNumberC<boost::int32_t>(); - const boost::uint32_t modLow = readNumberC<boost::uint32_t>(); + const Zstring shortName = readStringC<Zstring>(); //file name - const boost::uint32_t sizeHigh = readNumberC<boost::uint32_t>(); - const boost::uint32_t sizeLow = readNumberC<boost::uint32_t>(); + const boost::int64_t modTime = readNumberC<boost::int64_t>(); + const boost::uint64_t fileSize = readNumberC<boost::uint64_t>(); //const util::FileID fileIdentifier(stream_); //check(); dirCont.addSubFile(shortName, - FileDescriptor(wxLongLong(modHigh, modLow), - wxULongLong(sizeHigh, sizeLow))); + FileDescriptor(modTime, fileSize)); } void readSubLink(DirContainer& dirCont) const { //attention: order of function argument evaluation is undefined! So do it one after the other... - const Zstring shortName = readStringC(); //file name - const boost::int32_t modHigh = readNumberC<boost::int32_t>(); - const boost::uint32_t modLow = readNumberC<boost::uint32_t>(); - const Zstring targetPath = readStringC(); //file name + const Zstring shortName = readStringC<Zstring>(); //file name + const boost::int64_t modTime = readNumberC<boost::int64_t>(); + const Zstring targetPath = readStringC<Zstring>(); //file name const LinkDescriptor::LinkType linkType = static_cast<LinkDescriptor::LinkType>(readNumberC<boost::int32_t>()); dirCont.addSubLink(shortName, - LinkDescriptor(wxLongLong(modHigh, modLow), targetPath, linkType)); + LinkDescriptor(modTime, targetPath, linkType)); } void readSubDirectory(DirContainer& dirCont) const { - const Zstring shortName = readStringC(); //directory name + const Zstring shortName = readStringC<Zstring>(); //directory name DirContainer& subDir = dirCont.addSubDir(shortName); execute(subDir); //recurse } @@ -161,17 +152,19 @@ Partner-ID 567 _/ \_ Partner-ID 123 ... ... */ -class ReadFileStream : public util::ReadInputStream +class ReadFileStream : public zen::ReadInputStream { public: - ReadFileStream(wxInputStream& stream, const wxString& filename, DbStreamData& output) : ReadInputStream(stream, filename) + ReadFileStream(wxInputStream& stream, const wxString& filename, DbStreamData& output, int& versionId) : ReadInputStream(stream, filename) { //|------------------------------------------------------------------------------------- //| ensure 32/64 bit portability: used fixed size data types only e.g. boost::uint32_t | //|------------------------------------------------------------------------------------- - if (readNumberC<boost::int32_t>() != FILE_FORMAT_VER) //read file format version + boost::int32_t version = readNumberC<boost::int32_t>(); + if (version != FILE_FORMAT_VER) //read file format version throw FileError(wxString(_("Incompatible synchronization database format:")) + wxT(" \n") + wxT("\"") + filename + wxT("\"")); + versionId = version; //read DB id const CharArray tmp = readArrayC(); @@ -197,7 +190,7 @@ public: DbStreamData loadFile(const Zstring& filename) //throw (FileError) { - if (!ffs3::fileExists(filename)) + if (!zen::fileExists(filename)) throw FileErrorDatabaseNotExisting(wxString(_("Initial synchronization:")) + wxT(" \n\n") + _("One of the FreeFileSync database files is not yet existing:") + wxT(" \n") + wxT("\"") + zToWx(filename) + wxT("\"")); @@ -208,12 +201,13 @@ DbStreamData loadFile(const Zstring& filename) //throw (FileError) wxZlibInputStream input(uncompressed, wxZLIB_ZLIB); DbStreamData output; - ReadFileStream(input, zToWx(filename), output); + int versionId = 0; + ReadFileStream (input, zToWx(filename), output, versionId); return output; } -std::pair<DirInfoPtr, DirInfoPtr> ffs3::loadFromDisk(const BaseDirMapping& baseMapping) //throw (FileError) +std::pair<DirInfoPtr, DirInfoPtr> zen::loadFromDisk(const BaseDirMapping& baseMapping) //throw (FileError) { const Zstring fileNameLeft = baseMapping.getDBFilename<LEFT_SIDE>(); const Zstring fileNameRight = baseMapping.getDBFilename<RIGHT_SIDE>(); @@ -257,87 +251,128 @@ std::pair<DirInfoPtr, DirInfoPtr> ffs3::loadFromDisk(const BaseDirMapping& baseM //------------------------------------------------------------------------------------------------------------------------- - template <SelectedSide side> -struct IsNonEmpty -{ - bool operator()(const FileSystemObject& fsObj) const - { - return !fsObj.isEmpty<side>(); - } -}; - - -template <SelectedSide side> -class SaveDirInfo : public util::WriteOutputStream +class SaveDirInfo : public WriteOutputStream { public: - SaveDirInfo(const BaseDirMapping& baseMapping, const wxString& errorObjName, wxOutputStream& stream) : WriteOutputStream(errorObjName, stream) + SaveDirInfo(const BaseDirMapping& baseMapping, const DirContainer* oldDirInfo, const wxString& errorObjName, wxOutputStream& stream) : WriteOutputStream(errorObjName, stream) { //save filter settings baseMapping.getFilter()->saveFilter(getStream()); check(); //start recursion - execute(baseMapping); + execute(baseMapping, oldDirInfo); } private: - friend class util::ProxyForEach<SaveDirInfo<side> >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - - void execute(const HierarchyObject& hierObj) + void execute(const HierarchyObject& hierObj, const DirContainer* oldDirInfo) { - util::ProxyForEach<SaveDirInfo<side> > prx(*this); //grant std::for_each access to private parts of this class - - writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsNonEmpty<side>())); //number of (existing) files - std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); - - writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), IsNonEmpty<side>())); //number of (existing) files - std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); - - writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), IsNonEmpty<side>())); //number of (existing) directories - std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx); + std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), boost::bind(&SaveDirInfo::processFile, this, _1, oldDirInfo)); + writeNumberC<bool>(false); //mark last entry + std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), boost::bind(&SaveDirInfo::processLink, this, _1, oldDirInfo)); + writeNumberC<bool>(false); //mark last entry + std::for_each(hierObj.useSubDirs ().begin(), hierObj.useSubDirs ().end(), boost::bind(&SaveDirInfo::processDir, this, _1, oldDirInfo)); + writeNumberC<bool>(false); //mark last entry } - void operator()(const FileMapping& fileMap) + void processFile(const FileMapping& fileMap, const DirContainer* oldDirInfo) { - if (!fileMap.isEmpty<side>()) + const Zstring shortName = fileMap.getObjShortName(); + + if (fileMap.getCategory() == FILE_EQUAL) //data in sync: write current state + { + if (!fileMap.isEmpty<side>()) + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + writeNumberC<boost::int64_t >(to<boost::int64_t>(fileMap.getLastWriteTime<side>())); //last modification time + writeNumberC<boost::uint64_t>(to<boost::uint64_t>(fileMap.getFileSize<side>())); //filesize + } + } + else //not in sync: reuse last synchronous state { - writeStringC(fileMap.getShortName<side>()); //file name - writeNumberC<boost::int32_t> (fileMap.getLastWriteTime<side>().GetHi()); //last modification time - writeNumberC<boost::uint32_t>(fileMap.getLastWriteTime<side>().GetLo()); // - writeNumberC<boost::uint32_t>(fileMap.getFileSize<side>().GetHi()); //filesize - writeNumberC<boost::uint32_t>(fileMap.getFileSize<side>().GetLo()); // - - //fileMap.getFileID<side>().toStream(stream_); //unique file identifier - //check(); + if (oldDirInfo) //no data is also a "synchronous state"! + { + DirContainer::FileList::const_iterator iter = oldDirInfo->files.find(shortName); + if (iter != oldDirInfo->files.end()) + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + writeNumberC<boost::int64_t >(to<boost::int64_t>(iter->second.lastWriteTimeRaw)); //last modification time + writeNumberC<boost::uint64_t>(to<boost::uint64_t>(iter->second.fileSize)); //filesize + } + } } } - void operator()(const SymLinkMapping& linkObj) + void processLink(const SymLinkMapping& linkObj, const DirContainer* oldDirInfo) { - if (!linkObj.isEmpty<side>()) + const Zstring shortName = linkObj.getObjShortName(); + + if (linkObj.getCategory() == FILE_EQUAL) //data in sync: write current state + { + if (!linkObj.isEmpty<side>()) + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + writeNumberC<boost::int64_t>(to<boost::int64_t>(linkObj.getLastWriteTime<side>())); //last modification time + writeStringC(linkObj.getTargetPath<side>()); + writeNumberC<boost::int32_t>(linkObj.getLinkType<side>()); + } + } + else //not in sync: reuse last synchronous state { - writeStringC(linkObj.getShortName<side>()); - writeNumberC<boost::int32_t> (linkObj.getLastWriteTime<side>().GetHi()); //last modification time - writeNumberC<boost::uint32_t>(linkObj.getLastWriteTime<side>().GetLo()); // - writeStringC(linkObj.getTargetPath<side>()); - writeNumberC<boost::int32_t>(linkObj.getLinkType<side>()); + if (oldDirInfo) //no data is also a "synchronous state"! + { + DirContainer::LinkList::const_iterator iter = oldDirInfo->links.find(shortName); + if (iter != oldDirInfo->links.end()) + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + writeNumberC<boost::int64_t>(to<boost::int64_t>(iter->second.lastWriteTimeRaw)); //last modification time + writeStringC(iter->second.targetPath); + writeNumberC<boost::int32_t>(iter->second.type); + } + } } } - void operator()(const DirMapping& dirMap) + void processDir(const DirMapping& dirMap, const DirContainer* oldDirInfo) { - if (!dirMap.isEmpty<side>()) + const Zstring shortName = dirMap.getObjShortName(); + + const DirContainer* subDirInfo = NULL; + if (oldDirInfo) //no data is also a "synchronous state"! + { + DirContainer::DirList::const_iterator iter = oldDirInfo->dirs.find(shortName); + if (iter != oldDirInfo->dirs.end()) + subDirInfo = &iter->second; + } + + if (dirMap.getCategory() == FILE_EQUAL) //data in sync: write current state { - writeStringC(dirMap.getShortName<side>()); //directory name - execute(dirMap); //recurse + if (!dirMap.isEmpty<side>()) + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + execute(dirMap, subDirInfo); //recurse + } + } + else //not in sync: reuse last synchronous state + { + if (subDirInfo) //no data is also a "synchronous state"! + { + writeNumberC<bool>(true); //mark beginning of entry + writeStringC(shortName); + } + execute(dirMap, subDirInfo); //recurse } } }; -class WriteFileStream : public util::WriteOutputStream +class WriteFileStream : public WriteOutputStream { public: WriteFileStream(const DbStreamData& input, const wxString& filename, wxOutputStream& stream) : WriteOutputStream(filename, stream) @@ -383,7 +418,7 @@ void saveFile(const DbStreamData& dbStream, const Zstring& filename) //throw (Fi } //(try to) hide database file #ifdef FFS_WIN - ::SetFileAttributes(ffs3::applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_HIDDEN); + ::SetFileAttributes(zen::applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_HIDDEN); #endif } @@ -395,13 +430,13 @@ bool entryExisting(const DirectoryTOC& table, const UniqueId& newKey, const Memo return false; if (!newValue.get() || !iter->second.get()) - return !newValue.get() && !iter->second.get(); + return newValue.get() == iter->second.get(); return *newValue == *iter->second; } -void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) +void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) { //transactional behaviour! write to tmp files first const Zstring fileNameLeftTmp = baseMapping.getDBFilename<LEFT_SIDE>() + Zstr(".tmp"); @@ -437,11 +472,47 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) dbEntriesRight.first = util::generateGUID(); } + + //(try to) read old DirInfo + std::auto_ptr<DirInformation> oldDirInfoLeft; + try + { + DirectoryTOC::const_iterator iter = dbEntriesLeft.second.find(dbEntriesRight.first); + if (iter != dbEntriesLeft.second.end()) + if (iter->second.get()) + { + const std::vector<char>& memStream = *iter->second; + wxMemoryInputStream buffer(&memStream[0], memStream.size()); //convert char-array to inputstream: no copying, ownership not transferred + std::auto_ptr<DirInformation> dirInfoTmp(new DirInformation); + ReadDirInfo(buffer, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), *dirInfoTmp); //read file/dir information + oldDirInfoLeft = dirInfoTmp; + } + } + catch(FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! + + std::auto_ptr<DirInformation> oldDirInfoRight; + try + { + DirectoryTOC::const_iterator iter = dbEntriesRight.second.find(dbEntriesLeft.first); + if (iter != dbEntriesRight.second.end()) + if (iter->second.get()) + { + const std::vector<char>& memStream = *iter->second; + wxMemoryInputStream buffer(&memStream[0], memStream.size()); //convert char-array to inputstream: no copying, ownership not transferred + std::auto_ptr<DirInformation> dirInfoTmp(new DirInformation); + ReadDirInfo(buffer, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), *dirInfoTmp); //read file/dir information + oldDirInfoRight = dirInfoTmp; + } + } + catch(FileError&) {} + + //create new database entries MemoryStreamPtr dbEntryLeft(new std::vector<char>); { wxMemoryOutputStream buffer; - SaveDirInfo<LEFT_SIDE>(baseMapping, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), buffer); + DirContainer* oldDir = oldDirInfoLeft.get() ? &oldDirInfoLeft->baseDirContainer : NULL; + SaveDirInfo<LEFT_SIDE>(baseMapping, oldDir, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), buffer); dbEntryLeft->resize(buffer.GetSize()); //convert output stream to char-array buffer.CopyTo(&(*dbEntryLeft)[0], buffer.GetSize()); // } @@ -449,7 +520,8 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) MemoryStreamPtr dbEntryRight(new std::vector<char>); { wxMemoryOutputStream buffer; - SaveDirInfo<RIGHT_SIDE>(baseMapping, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), buffer); + DirContainer* oldDir = oldDirInfoRight.get() ? &oldDirInfoRight->baseDirContainer : NULL; + SaveDirInfo<RIGHT_SIDE>(baseMapping, oldDir, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), buffer); dbEntryRight->resize(buffer.GetSize()); //convert output stream to char-array buffer.CopyTo(&(*dbEntryRight)[0], buffer.GetSize()); // } @@ -462,15 +534,14 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) if (!updateRequiredLeft && !updateRequiredRight) return; } - - dbEntriesLeft.second[dbEntriesRight.first] = dbEntryLeft; - dbEntriesRight.second[dbEntriesLeft.first] = dbEntryRight; + dbEntriesLeft .second[dbEntriesRight.first] = dbEntryLeft; + dbEntriesRight.second[dbEntriesLeft .first] = dbEntryRight; //write (temp-) files... - Loki::ScopeGuard guardTempFileLeft = Loki::MakeGuard(&ffs3::removeFile, fileNameLeftTmp); + Loki::ScopeGuard guardTempFileLeft = Loki::MakeGuard(&zen::removeFile, fileNameLeftTmp); saveFile(dbEntriesLeft, fileNameLeftTmp); //throw (FileError) - Loki::ScopeGuard guardTempFileRight = Loki::MakeGuard(&ffs3::removeFile, fileNameRightTmp); + Loki::ScopeGuard guardTempFileRight = Loki::MakeGuard(&zen::removeFile, fileNameRightTmp); saveFile(dbEntriesRight, fileNameRightTmp); //throw (FileError) //operation finished: rename temp files -> this should work transactionally: diff --git a/library/db_file.h b/library/db_file.h index 8b88473d..179ebd57 100644 --- a/library/db_file.h +++ b/library/db_file.h @@ -7,24 +7,21 @@ #ifndef DBFILE_H_INCLUDED #define DBFILE_H_INCLUDED +#include "../shared/file_error.h" #include "../file_hierarchy.h" -namespace ffs3 +namespace zen { void saveToDisk(const BaseDirMapping& baseMapping); //throw (FileError) struct DirInformation { - BaseFilter::FilterRef filter; //filter settings (used when retrieving directory data) + HardFilter::FilterRef filter; //filter settings (used when retrieving directory data) DirContainer baseDirContainer; //hierarchical directory information }; typedef boost::shared_ptr<const DirInformation> DirInfoPtr; -class FileErrorDatabaseNotExisting : public FileError -{ -public: - FileErrorDatabaseNotExisting(const wxString& message) : FileError(message) {} -}; +DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting); std::pair<DirInfoPtr, DirInfoPtr> loadFromDisk(const BaseDirMapping& baseMapping); //throw (FileError, FileErrorDatabaseNotExisting) -> return value always bound! } diff --git a/library/detect_renaming.h b/library/detect_renaming.h index ab974cf9..9f360f8e 100644 --- a/library/detect_renaming.h +++ b/library/detect_renaming.h @@ -12,13 +12,13 @@ //identify a file "create and delete"-operation as a file renaming! -namespace ffs3 +namespace zen { typedef FileMapping* CreateOnLeft; typedef FileMapping* DeleteOnLeft; typedef FileMapping* CreateOnRight; typedef FileMapping* DeleteOnRight; -void getRenameCandidates(ffs3::BaseDirMapping& baseMapping, //in +void getRenameCandidates(zen::BaseDirMapping& baseMapping, //in std::vector<std::pair<CreateOnLeft, DeleteOnLeft> >& renameOnLeft, //out std::vector<std::pair<CreateOnRight, DeleteOnRight> >& renameOnRight); //out throw()! } diff --git a/library/dir_lock.cpp b/library/dir_lock.cpp index 521f1c6f..8b9032b4 100644 --- a/library/dir_lock.cpp +++ b/library/dir_lock.cpp @@ -4,12 +4,11 @@ #include <wx/timer.h> #include <wx/log.h> #include <wx/msgdlg.h> -#include <boost/cstdint.hpp> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include "../shared/string_conv.h" #include "../shared/i18n.h" -#include "../shared/system_func.h" +#include "../shared/last_error.h" #include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp> #include "../shared/loki/ScopeGuard.h" #include "../shared/system_constants.h" @@ -18,6 +17,7 @@ #include "../shared/assert_static.h" #include "../shared/serialize.h" #include "../shared/build_info.h" +#include "../shared/int64.h" #ifdef FFS_WIN #include <tlhelp32.h> @@ -31,7 +31,7 @@ #include <unistd.h> #endif -using namespace ffs3; +using namespace zen; using namespace std::rel_ops; @@ -153,16 +153,18 @@ void deleteLockFile(const Zstring& filename) //throw (FileError) } -wxULongLong getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNotExisting) +zen::UInt64 getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNotExisting) { #ifdef FFS_WIN - WIN32_FIND_DATA fileMetaData; - const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileMetaData); + WIN32_FIND_DATA fileInfo = {}; + const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); if (searchHandle == INVALID_HANDLE_VALUE) { const DWORD lastError = ::GetLastError(); - const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") + - wxT("\n\n") + getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); + errorMessage += wxT("\n\n") + getLastErrorFormatted(lastError); + if (lastError == ERROR_FILE_NOT_FOUND || lastError == ERROR_PATH_NOT_FOUND) throw ErrorNotExisting(errorMessage); @@ -172,22 +174,24 @@ wxULongLong getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNo ::FindClose(searchHandle); - return wxULongLong(fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow); + return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); #elif defined FFS_LINUX - struct stat fileInfo; + struct stat fileInfo = {}; if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links { const int lastError = errno; - const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") + - wxT("\n\n") + getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); + errorMessage += wxT("\n\n") + getLastErrorFormatted(lastError); + if (lastError == ENOENT) throw ErrorNotExisting(errorMessage); else throw FileError(errorMessage); } - return fileInfo.st_size; + return zen::UInt64(fileInfo.st_size); #endif } @@ -208,7 +212,7 @@ namespace inline std::string readString(wxInputStream& stream) //throw (std::exception) { - const boost::uint32_t strLength = util::readNumber<boost::uint32_t>(stream); + const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream); std::string output; if (strLength > 0) { @@ -223,7 +227,7 @@ inline void writeString(wxOutputStream& stream, const std::string& str) //write string to filestream { const boost::uint32_t strLength = static_cast<boost::uint32_t>(str.length()); - util::writeNumber<boost::uint32_t>(stream, strLength); + writePOD<boost::uint32_t>(stream, strLength); stream.Write(str.c_str(), strLength); } @@ -257,13 +261,13 @@ struct LockInformation { char formatDescr[sizeof(LOCK_FORMAT_DESCR)] = {}; stream.Read(formatDescr, sizeof(LOCK_FORMAT_DESCR)); //file format header - const int lockFileVersion = util::readNumber<boost::int32_t>(stream); // + const int lockFileVersion = readPOD<boost::int32_t>(stream); // (void)lockFileVersion; //some format checking here? lockId = readString(stream); - procDescr.processId = static_cast<ProcessId>(util::readNumber<boost::uint64_t>(stream)); //possible loss of precision (32/64 bit process) covered by buildId + procDescr.processId = static_cast<ProcessId>(readPOD<boost::uint64_t>(stream)); //possible loss of precision (32/64 bit process) covered by buildId procDescr.computerId = readString(stream); } @@ -272,10 +276,10 @@ struct LockInformation assert_static(sizeof(ProcessId) <= sizeof(boost::uint64_t)); //ensure portability stream.Write(LOCK_FORMAT_DESCR, sizeof(LOCK_FORMAT_DESCR)); - util::writeNumber<boost::int32_t>(stream, LOCK_FORMAT_VER); + writePOD<boost::int32_t>(stream, LOCK_FORMAT_VER); writeString(stream, lockId); - util::writeNumber<boost::uint64_t>(stream, procDescr.processId); + writePOD<boost::uint64_t>(stream, procDescr.processId); writeString(stream, procDescr.computerId); } @@ -337,7 +341,7 @@ ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDe if (procDescr.processId <= 0 || procDescr.processId >= 65536) return PROC_STATUS_NO_IDEA; //invalid process id - return ffs3::dirExists(Zstr("/proc/") + Zstring::fromNumber(procDescr.processId)) ? PROC_STATUS_RUNNING : PROC_STATUS_NOT_RUNNING; + return zen::dirExists(Zstr("/proc/") + Zstring::fromNumber(procDescr.processId)) ? PROC_STATUS_RUNNING : PROC_STATUS_NOT_RUNNING; #endif } @@ -377,13 +381,13 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr const LockInformation lockInfo = retrieveLockInfo(lockfilename); //throw (FileError, ErrorNotExisting) const bool lockOwnderDead = getProcessStatus(lockInfo.procDescr) == PROC_STATUS_NOT_RUNNING; //convenience optimization: if we know the owning process crashed, we needn't wait DETECT_EXITUS_INTERVAL sec - wxULongLong fileSizeOld; + zen::UInt64 fileSizeOld; wxLongLong lockSilentStart = wxGetLocalTimeMillis(); while (true) { - const wxULongLong fileSizeNew = ::getLockFileSize(lockfilename); //throw (FileError, ErrorNotExisting) - const wxLongLong currentTime = wxGetLocalTimeMillis(); + const zen::UInt64 fileSizeNew = ::getLockFileSize(lockfilename); //throw (FileError, ErrorNotExisting) + wxLongLong currentTime = wxGetLocalTimeMillis(); if (fileSizeNew != fileSizeOld) { @@ -421,10 +425,10 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr { if (currentTime - lockSilentStart > EMIT_LIFE_SIGN_INTERVAL) //one signal missed: it's likely this is an abandoned lock: { - long remainingSeconds = ((DETECT_EXITUS_INTERVAL - (wxGetLocalTimeMillis() - lockSilentStart)) / 1000).GetLo(); - remainingSeconds = std::max(0L, remainingSeconds); + long remainingSeconds = ((DETECT_EXITUS_INTERVAL - (wxGetLocalTimeMillis() - lockSilentStart)) / 1000).ToLong(); + remainingSeconds = std::max(0L, remainingSeconds); - Zstring remSecMsg = wxToZ(_("%x sec")); + Zstring remSecMsg = wxToZ(_P("1 sec", "%x sec", remainingSeconds)); remSecMsg.Replace(Zstr("%x"), Zstring::fromNumber(remainingSeconds)); callback->reportInfo(infoMsg + Zstr(" ") + remSecMsg); } @@ -467,8 +471,10 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError) if (::GetLastError() == ERROR_FILE_EXISTS) return false; else - throw FileError(wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"") + - wxT("\n\n") + getLastErrorFormatted()); + { + wxString errorMessage = wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + getLastErrorFormatted()); + } } ::CloseHandle(fileHandle); @@ -481,8 +487,11 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError) if (errno == EEXIST) return false; else - throw FileError(wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"") + - wxT("\n\n") + getLastErrorFormatted()); + { + wxString errorMessage = wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + getLastErrorFormatted()); + } + } ::close(fileHandle); #endif diff --git a/library/dir_lock.h b/library/dir_lock.h index 9ae4da08..91b61990 100644 --- a/library/dir_lock.h +++ b/library/dir_lock.h @@ -19,12 +19,13 @@ RAII structure to place a directory lock against other FFS processes: - ownership shared between all object instances refering to a specific lock location(= UUID) - can be copied safely and efficiently! (ref-counting) - detects and resolves abandoned locks (instantly if lock is associated with local pc, else after 30 seconds) + - temporary locks created during abandoned lock resolution keep "lockfilename"'s extension - race-free (Windows, almost on Linux(NFS)) */ class DirLock { public: - DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw (FileError) + DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw (FileError), callback only used during construction private: class LockAdmin; diff --git a/library/error_log.cpp b/library/error_log.cpp index 483d670b..a78b1c9a 100644 --- a/library/error_log.cpp +++ b/library/error_log.cpp @@ -9,10 +9,10 @@ #include "../shared/i18n.h" -using ffs3::ErrorLogging; +using zen::ErrorLogging; -void ErrorLogging::logMsg(const wxString& message, ffs3::MessageType type) +void ErrorLogging::logMsg(const wxString& message, zen::MessageType type) { Entry newEntry; newEntry.type = type; diff --git a/library/error_log.h b/library/error_log.h index ff4d3aee..1acc0f8c 100644 --- a/library/error_log.h +++ b/library/error_log.h @@ -13,7 +13,7 @@ #include "../shared/zstring.h" -namespace ffs3 +namespace zen { enum MessageType { diff --git a/library/filter.cpp b/library/hard_filter.cpp index 70933b13..46ccc9ca 100644 --- a/library/filter.cpp +++ b/library/hard_filter.cpp @@ -4,7 +4,7 @@ // * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * // ************************************************************************** // -#include "filter.h" +#include "hard_filter.h" #include "../shared/zstring.h" #include <wx/string.h> #include <set> @@ -16,47 +16,34 @@ #include "../shared/loki/LokiTypeInfo.h" #include "../shared/serialize.h" -using ffs3::BaseFilter; -using ffs3::NameFilter; +using namespace zen; //-------------------------------------------------------------------------------------------------- -bool BaseFilter::operator==(const BaseFilter& other) const +bool zen::operator<(const HardFilter& lhs, const HardFilter& rhs) { - return !(*this < other) && !(other < *this); -} - - -bool BaseFilter::operator!=(const BaseFilter& other) const -{ - return !(*this == other); -} - - -bool BaseFilter::operator<(const BaseFilter& other) const -{ - if (Loki::TypeInfo(typeid(*this)) != typeid(other)) - return Loki::TypeInfo(typeid(*this)) < typeid(other); + if (Loki::TypeInfo(typeid(lhs)) != typeid(rhs)) + return Loki::TypeInfo(typeid(lhs)) < typeid(rhs); //this and other are same type: - return cmpLessSameType(other); + return lhs.cmpLessSameType(rhs); } -void BaseFilter::saveFilter(wxOutputStream& stream) const //serialize derived object +void HardFilter::saveFilter(wxOutputStream& stream) const //serialize derived object { //save type information - util::writeString(stream, uniqueClassIdentifier()); + writeString(stream, uniqueClassIdentifier()); //save actual object save(stream); } -BaseFilter::FilterRef BaseFilter::loadFilter(wxInputStream& stream) +HardFilter::FilterRef HardFilter::loadFilter(wxInputStream& stream) { //read type information - const Zstring uniqueClassId = util::readString(stream); + const Zstring uniqueClassId = readString<Zstring>(stream); //read actual object if (uniqueClassId == Zstr("NullFilter")) @@ -83,10 +70,10 @@ void addFilterEntry(const Zstring& filtername, std::set<Zstring>& fileFilter, st //Linux DOES distinguish between upper/lower-case: nothing to do here #endif - static const Zstring sepAsterisk = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('*'); - static const Zstring sepQuestionMark = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('?'); - static const Zstring asteriskSep = Zstring(Zchar('*')) + common::FILE_NAME_SEPARATOR; - static const Zstring questionMarkSep = Zstring(Zchar('?')) + common::FILE_NAME_SEPARATOR; + const Zstring sepAsterisk = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('*'); + const Zstring sepQuestionMark = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('?'); + const Zstring asteriskSep = Zstring(Zstr('*')) + common::FILE_NAME_SEPARATOR; + const Zstring questionMarkSep = Zstring(Zstr('?')) + common::FILE_NAME_SEPARATOR; //-------------------------------------------------------------------------------------------------- //add some syntactic sugar: handle beginning of filtername @@ -143,14 +130,14 @@ const T* cStringFind(const T* str1, T ch) //strchr() } -bool matchesMask(const Zchar* string, const Zchar* mask) +bool matchesMask(const Zchar* str, const Zchar* mask) { - for (Zchar ch; (ch = *mask) != 0; ++mask, ++string) + for (Zchar ch; (ch = *mask) != 0; ++mask, ++str) { switch (ch) { case Zchar('?'): - if (*string == 0) + if (*str == 0) return false; break; @@ -162,34 +149,34 @@ bool matchesMask(const Zchar* string, const Zchar* mask) ch = *mask; } while (ch == Zchar('*') || ch == Zchar('?')); - //if match ends with '*': + //if mask ends with '*': if (ch == 0) return true; ++mask; - while ((string = cStringFind(string, ch)) != NULL) + while ((str = cStringFind(str, ch)) != NULL) { - ++string; - if (matchesMask(string, mask)) + ++str; + if (matchesMask(str, mask)) return true; } return false; default: - if (*string != ch) + if (*str != ch) return false; } } - return *string == 0; + return *str == 0; } //returns true if string matches at least the beginning of mask inline -bool matchesMaskBegin(const Zchar* string, const Zchar* mask) +bool matchesMaskBegin(const Zchar* str, const Zchar* mask) { - for (Zchar ch; (ch = *mask) != 0; ++mask, ++string) + for (Zchar ch; (ch = *mask) != 0; ++mask, ++str) { - if (*string == 0) + if (*str == 0) return true; switch (ch) @@ -201,11 +188,11 @@ bool matchesMaskBegin(const Zchar* string, const Zchar* mask) return true; default: - if (*string != ch) + if (*str != ch) return false; } } - return *string == 0; + return *str == 0; } } @@ -244,11 +231,18 @@ std::vector<Zstring> compoundStringToFilter(const Zstring& filterString) //delimiters may be ';' or '\n' std::vector<Zstring> output; - const std::vector<Zstring> filterPreProcessing = filterString.Split(Zchar(';')); - for (std::vector<Zstring>::const_iterator i = filterPreProcessing.begin(); i != filterPreProcessing.end(); ++i) + const std::vector<Zstring> blocks = filterString.Split(Zchar(';')); + for (std::vector<Zstring>::const_iterator i = blocks.begin(); i != blocks.end(); ++i) { - const std::vector<Zstring> newEntries = i->Split(Zchar('\n')); - output.insert(output.end(), newEntries.begin(), newEntries.end()); + const std::vector<Zstring> blocks2 = i->Split(Zchar('\n')); + + for (std::vector<Zstring>::const_iterator j = blocks2.begin(); j != blocks2.end(); ++j) + { + Zstring entry = *j; + entry.Trim(); + if (!entry.empty()) + output.push_back(entry); + } } return output; @@ -327,7 +321,7 @@ bool NameFilter::isNull() const } -bool NameFilter::cmpLessSameType(const BaseFilter& other) const +bool NameFilter::cmpLessSameType(const HardFilter& other) const { assert(typeid(*this) == typeid(other)); //always given in this context! @@ -357,15 +351,15 @@ Zstring NameFilter::uniqueClassIdentifier() const void NameFilter::save(wxOutputStream& stream) const { - util::writeString(stream, includeFilterTmp); - util::writeString(stream, excludeFilterTmp); + writeString(stream, includeFilterTmp); + writeString(stream, excludeFilterTmp); } -BaseFilter::FilterRef NameFilter::load(wxInputStream& stream) //"constructor" +HardFilter::FilterRef NameFilter::load(wxInputStream& stream) //"constructor" { - const Zstring include = util::readString(stream); - const Zstring exclude = util::readString(stream); + const Zstring include = readString<Zstring>(stream); + const Zstring exclude = readString<Zstring>(stream); return FilterRef(new NameFilter(include, exclude)); } diff --git a/library/filter.h b/library/hard_filter.h index c1be61eb..4290e07a 100644 --- a/library/filter.h +++ b/library/hard_filter.h @@ -12,56 +12,60 @@ #include <boost/shared_ptr.hpp> #include <wx/stream.h> -namespace ffs3 +namespace zen { //------------------------------------------------------------------ -/* class hierarchy: +/* +Semantics of HardFilter: +1. using it creates a NEW folder hierarchy! -> must be considered by <Automatic>-mode! (fortunately it turns out, doing nothing already has perfect semantics :) +2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder! - BaseFilter (interface) + class hierarchy: + + HardFilter (interface) /|\ _________|_____________ | | | NullFilter NameFilter CombinedFilter */ -/* -Semantics of BaseFilter: -1. using it creates a NEW folder hierarchy! -> must be respected by <Automatic>-mode! -2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder! -*/ - -class BaseFilter //interface for filtering +class HardFilter //interface for filtering { public: - virtual ~BaseFilter() {} + virtual ~HardFilter() {} //filtering virtual bool passFileFilter(const Zstring& relFilename) const = 0; - virtual bool passDirFilter(const Zstring& relDirname, bool* subObjMightMatch) const = 0; + virtual bool passDirFilter (const Zstring& relDirname, bool* subObjMightMatch) const = 0; //subObjMightMatch: file/dir in subdirectories could(!) match //note: variable is only set if passDirFilter returns false! virtual bool isNull() const = 0; //filter is equivalent to NullFilter, but may be technically slower - //comparison - bool operator<(const BaseFilter& other) const; - bool operator==(const BaseFilter& other) const; - bool operator!=(const BaseFilter& other) const; - - typedef boost::shared_ptr<const BaseFilter> FilterRef; //always bound by design! + typedef boost::shared_ptr<const HardFilter> FilterRef; //always bound by design! //serialization void saveFilter(wxOutputStream& stream) const; //serialize derived object static FilterRef loadFilter(wxInputStream& stream); //CAVEAT!!! adapt this method for each new derivation!!! private: + friend bool operator< (const HardFilter& lhs, const HardFilter& rhs); + virtual void save(wxOutputStream& stream) const = 0; //serialization virtual Zstring uniqueClassIdentifier() const = 0; //get identifier, used for serialization - virtual bool cmpLessSameType(const BaseFilter& other) const = 0; //typeid(*this) == typeid(other) in this context! + virtual bool cmpLessSameType(const HardFilter& other) const = 0; //typeid(*this) == typeid(other) in this context! }; +inline bool operator==(const HardFilter& lhs, const HardFilter& rhs) { return !(lhs < rhs) && !(rhs < lhs); } +inline bool operator!=(const HardFilter& lhs, const HardFilter& rhs) { return !(lhs == rhs); } + + +//small helper method: merge two hard filters (thereby remove Null-filters) +HardFilter::FilterRef combineFilters(const HardFilter::FilterRef& first, + const HardFilter::FilterRef& second); -class NullFilter : public BaseFilter //no filtering at all + +class NullFilter : public HardFilter //no filtering at all { public: virtual bool passFileFilter(const Zstring& relFilename) const; @@ -69,15 +73,15 @@ public: virtual bool isNull() const; private: - friend class BaseFilter; + friend class HardFilter; virtual void save(wxOutputStream& stream) const {} virtual Zstring uniqueClassIdentifier() const; static FilterRef load(wxInputStream& stream); //"serial constructor" - virtual bool cmpLessSameType(const BaseFilter& other) const; + virtual bool cmpLessSameType(const HardFilter& other) const; }; -class NameFilter : public BaseFilter //standard filter by filename +class NameFilter : public HardFilter //standard filter by filename { public: NameFilter(const Zstring& includeFilter, const Zstring& excludeFilter); @@ -87,11 +91,11 @@ public: virtual bool isNull() const; private: - friend class BaseFilter; + friend class HardFilter; virtual void save(wxOutputStream& stream) const; virtual Zstring uniqueClassIdentifier() const; static FilterRef load(wxInputStream& stream); //"serial constructor" - virtual bool cmpLessSameType(const BaseFilter& other) const; + virtual bool cmpLessSameType(const HardFilter& other) const; std::set<Zstring> filterFileIn; //upper case (windows) std::set<Zstring> filterFolderIn; // @@ -103,7 +107,7 @@ private: }; -class CombinedFilter : public BaseFilter //combine two filters to match if and only if both match +class CombinedFilter : public HardFilter //combine two filters to match if and only if both match { public: CombinedFilter(const FilterRef& first, const FilterRef& second) : first_(first), second_(second) {} @@ -113,22 +117,17 @@ public: virtual bool isNull() const; private: - friend class BaseFilter; + friend class HardFilter; virtual void save(wxOutputStream& stream) const; virtual Zstring uniqueClassIdentifier() const; static FilterRef load(wxInputStream& stream); //"serial constructor" - virtual bool cmpLessSameType(const BaseFilter& other) const; + virtual bool cmpLessSameType(const HardFilter& other) const; const FilterRef first_; const FilterRef second_; }; -//small helper method: remove Null-filters -BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first, - const BaseFilter::FilterRef& second); - - @@ -147,7 +146,7 @@ BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first, //---------------Inline Implementation--------------------------------------------------- inline -BaseFilter::FilterRef NullFilter::load(wxInputStream& stream) //"serial constructor" +HardFilter::FilterRef NullFilter::load(wxInputStream& stream) //"serial constructor" { return FilterRef(new NullFilter); } @@ -176,7 +175,7 @@ bool NullFilter::isNull() const inline -bool NullFilter::cmpLessSameType(const BaseFilter& other) const +bool NullFilter::cmpLessSameType(const HardFilter& other) const { assert(typeid(*this) == typeid(other)); //always given in this context! return false; @@ -214,7 +213,7 @@ bool CombinedFilter::isNull() const inline -bool CombinedFilter::cmpLessSameType(const BaseFilter& other) const +bool CombinedFilter::cmpLessSameType(const HardFilter& other) const { assert(typeid(*this) == typeid(other)); //always given in this context! @@ -243,7 +242,7 @@ void CombinedFilter::save(wxOutputStream& stream) const inline -BaseFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor" +HardFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor" { FilterRef first = loadFilter(stream); FilterRef second = loadFilter(stream); @@ -253,13 +252,13 @@ BaseFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor inline -BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first, - const BaseFilter::FilterRef& second) +HardFilter::FilterRef combineFilters(const HardFilter::FilterRef& first, + const HardFilter::FilterRef& second) { if (first->isNull()) { if (second->isNull()) - return BaseFilter::FilterRef(new NullFilter); + return HardFilter::FilterRef(new NullFilter); else return second; } @@ -268,7 +267,7 @@ BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first, if (second->isNull()) return first; else - return BaseFilter::FilterRef(new CombinedFilter(first, second)); + return HardFilter::FilterRef(new CombinedFilter(first, second)); } } diff --git a/library/icon_buffer.cpp b/library/icon_buffer.cpp index 14883deb..1b1706d2 100644 --- a/library/icon_buffer.cpp +++ b/library/icon_buffer.cpp @@ -7,10 +7,12 @@ #include "icon_buffer.h" #include <wx/msgdlg.h> #include <map> +#include <vector> #include <queue> #include <set> #include <wx/log.h> #include "../shared/i18n.h" +#include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp> #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" @@ -22,11 +24,20 @@ #endif -using ffs3::IconBuffer; +using namespace zen; + + + +const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer + +//--------------------------------------------------------------------------------------------------- +typedef Zbase<Zchar, StorageDeepCopy> BasicString; //thread safe string class +//avoid reference-counted objects for shared data: NOT THREADSAFE!!! (implicitly shared variable: ref-count) +//--------------------------------------------------------------------------------------------------- #ifdef FFS_WIN -IconBuffer::BasicString IconBuffer::getFileExtension(const BasicString& filename) +BasicString getFileExtension(const BasicString& filename) { const BasicString shortName = filename.AfterLast(Zchar('\\')); //warning: using windows file name separator! @@ -37,7 +48,7 @@ IconBuffer::BasicString IconBuffer::getFileExtension(const BasicString& filename //test for extension for icons that physically have to be retrieved from disc -bool IconBuffer::isPriceyExtension(const IconBuffer::BasicString& extension) +bool isPriceyExtension(const BasicString& extension) { static std::set<BasicString, LessFilename> exceptions; //not thread-safe, but called from worker thread only! if (exceptions.empty()) @@ -57,7 +68,7 @@ bool IconBuffer::isPriceyExtension(const IconBuffer::BasicString& extension) //################################################################################################################################################ -class IconBuffer::IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon) +class IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon) { public: #ifdef FFS_WIN @@ -121,7 +132,88 @@ private: }; -const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be sufficient... +IconHolder getAssociatedIcon(const BasicString& filename) +{ +#ifdef FFS_WIN + //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName" + //but no problem, directory formatting takes care that filenames are always absolute! + + SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080 + + //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread! + ::SHGetFileInfo(filename.c_str(), //zen::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! + 0, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON); + + return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) + +#elif defined FFS_LINUX + //call Gtk::Main::init_gtkmm_internals() on application startup!! + try + { + Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails + Glib::RefPtr<Gio::FileInfo> fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON); + if (fileInfo) + { + Glib::RefPtr<Gio::Icon> gicon = fileInfo->get_icon(); + if (gicon) + { + Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); + if (iconTheme) + { + Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system + if (iconInfo) + { + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf + if (iconPixbuf) + return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) + } + } + } + } + } + catch (const Glib::Error&) {} + + try //fallback: icon lookup may fail because some icons are currently not present on system + { + Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); + if (iconTheme) + { + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + if (!iconPixbuf) + iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + if (iconPixbuf) + return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) + } + } + catch (const Glib::Error&) {} + + //fallback fallback + return IconHolder(); +#endif +} + +#ifdef FFS_WIN +IconHolder getAssociatedIconByExt(const BasicString& extension) +{ + SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + + //no read-access to disk! determine icon by extension + ::SHGetFileInfo((Zstr("dummy.") + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name + FILE_ATTRIBUTE_NORMAL, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); + + return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) +} +#endif + + +const wxIcon& getDirectoryIcon() //one folder icon should be sufficient... { static wxIcon folderIcon; @@ -147,14 +239,14 @@ const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be suffici } #elif defined FFS_LINUX - folderIcon = getAssociatedIcon(Zstr("/usr/")).toWxIcon(); //all directories will look like "/usr/" + folderIcon = ::getAssociatedIcon(Zstr("/usr/")).toWxIcon(); //all directories will look like "/usr/" #endif } return folderIcon; } -const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is sufficient... +const wxIcon& getFileIcon() //in case one folder icon is sufficient... { static wxIcon fileIcon; @@ -185,9 +277,9 @@ const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is suffic Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); if (iconTheme) { - Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); if (!iconPixbuf) - iconPixbuf = iconTheme->load_icon("text-x-generic", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); if (iconPixbuf) fileIcon.SetPixbuf(iconPixbuf->gobj_copy()); // transfer ownership!! } @@ -199,114 +291,89 @@ const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is suffic } -IconBuffer::IconHolder IconBuffer::getAssociatedIcon(const BasicString& filename) +//################################################################################################################################################ +class Buffer { -#ifdef FFS_WIN - //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName" - //but no problem, directory formatting takes care that filenames are always absolute! +public: + //methods used by gui and worker thread + bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); - SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080 + //methods used by worker thread + void insertIntoBuffer(const BasicString& entryName, const IconHolder& icon); - //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread! - ::SHGetFileInfo(filename.c_str(), //ffs3::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! - 0, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON); +private: + //--------------------------------------------------------------------------------------------------- + typedef std::map<BasicString, IconHolder, LessFilename> IconDB; //entryName/icon -> ATTENTION: avoid ref-counting for this shared data structure! + typedef std::queue<BasicString> IconDbSequence; //entryName + //--------------------------------------------------------------------------------------------------- - return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) + //---------------------- Shared Data ------------------------- + boost::mutex lockIconDB; + IconDB iconBuffer; //use synchronisation when accessing this! + IconDbSequence iconSequence; //save sequence of buffer entry to delete oldest elements + //------------------------------------------------------------ +}; -#elif defined FFS_LINUX - //call Gtk::Main::init_gtkmm_internals() on application startup!! - try - { - Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails - Glib::RefPtr<Gio::FileInfo> fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON); - if (fileInfo) - { - Glib::RefPtr<Gio::Icon> gicon = fileInfo->get_icon(); - if (gicon) - { - Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); - if (iconTheme) - { - Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system - if (iconInfo) - { - Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf - if (iconPixbuf) - return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) - } - } - } - } - } - catch (const Glib::Error&) {} - try //fallback: icon lookup may fail because some icons are currently not present on system - { - Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); - if (iconTheme) - { - Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); - if (!iconPixbuf) - iconPixbuf = iconTheme->load_icon("text-x-generic", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); - if (iconPixbuf) - return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) - } - } - catch (const Glib::Error&) {} +bool Buffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) +{ + boost::lock_guard<boost::mutex> dummy(lockIconDB); - //fallback fallback - return IconHolder(); +#ifdef FFS_WIN + //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension + const BasicString extension = getFileExtension(fileName.c_str()); + const BasicString searchString = isPriceyExtension(extension) ? fileName.c_str() : extension.c_str(); + IconDB::const_iterator i = iconBuffer.find(searchString); +#elif defined FFS_LINUX + IconDB::const_iterator i = iconBuffer.find(fileName.c_str()); #endif -} -#ifdef FFS_WIN -IconBuffer::IconHolder IconBuffer::getAssociatedIconByExt(const BasicString& extension) -{ - SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! + if (i == iconBuffer.end()) + return false; - //no read-access to disk! determine icon by extension - ::SHGetFileInfo((Zstr("dummy.") + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name - FILE_ATTRIBUTE_NORMAL, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); + if (icon != NULL) + *icon = i->second.toWxIcon(); - return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) + return true; } -#endif -namespace -{ -//failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080 -struct ThreadInitializer +void Buffer::insertIntoBuffer(const BasicString& entryName, const IconHolder& icon) //called by worker thread { - ThreadInitializer() - { -#ifdef FFS_WIN - ::CoInitializeEx(NULL, COINIT_MULTITHREADED); -#endif - } + boost::lock_guard<boost::mutex> dummy(lockIconDB); + + //thread saftey: icon uses ref-counting! But is NOT shared with main thread! + const std::pair<IconDB::iterator, bool> rc = iconBuffer.insert(std::make_pair(entryName, icon)); + if (rc.second) //if insertion took place + iconSequence.push(entryName); //note: sharing Zstring with IconDB!!! + + assert(iconBuffer.size() == iconSequence.size()); - ~ThreadInitializer() + //remove elements if buffer becomes too big: + if (iconBuffer.size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) { -#ifdef FFS_WIN - ::CoUninitialize(); -#endif + //remove oldest element + iconBuffer.erase(iconSequence.front()); + iconSequence.pop(); } -}; } -class IconBuffer::WorkerThread +//################################################################################################################################################ +class WorkerThread { public: - WorkerThread(IconBuffer& iconBuff); - ~WorkerThread(); + WorkerThread(Buffer& iconBuff) : iconBuffer(iconBuff) + { + threadObj = boost::thread(boost::ref(*this)); //localize all thread logic to this class! + } + + ~WorkerThread() + { + setWorkload(std::vector<Zstring>()); //make sure interruption point is always reached! + threadObj.interrupt(); + threadObj.join(); + } void setWorkload(const std::vector<Zstring>& load); //(re-)set new workload of icons to be retrieved @@ -326,28 +393,13 @@ private: } shared; //------------------------------------------------------------ - IconBuffer& iconBuffer; + Buffer& iconBuffer; boost::thread threadObj; }; -IconBuffer::WorkerThread::WorkerThread(IconBuffer& iconBuff) : - iconBuffer(iconBuff) -{ - threadObj = boost::thread(boost::ref(*this)); //localize all thread logic to this class! -} - - -IconBuffer::WorkerThread::~WorkerThread() -{ - setWorkload(std::vector<Zstring>()); //make sure interruption point is always reached! - threadObj.interrupt(); - threadObj.join(); -} - - -void IconBuffer::WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved +void WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved { { boost::lock_guard<boost::mutex> dummy(shared.mutex); @@ -362,9 +414,16 @@ void IconBuffer::WorkerThread::setWorkload(const std::vector<Zstring>& load) //( } -void IconBuffer::WorkerThread::operator()() //thread entry +void WorkerThread::operator()() //thread entry { - ThreadInitializer dummy1; + //failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080 +#ifdef FFS_WIN + struct ThreadInitializer + { + ThreadInitializer () { ::CoInitializeEx(NULL, COINIT_MULTITHREADED); } + ~ThreadInitializer() { ::CoUninitialize(); } + } dummy1; +#endif try { @@ -395,7 +454,7 @@ void IconBuffer::WorkerThread::operator()() //thread entry } -void IconBuffer::WorkerThread::doWork() +void WorkerThread::doWork() { //do work: get the file icon. while (true) @@ -416,90 +475,47 @@ void IconBuffer::WorkerThread::doWork() const BasicString extension = getFileExtension(fileName); //thread-safe: no sharing! if (isPriceyExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension { - const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName); + const IconHolder newIcon = getAssociatedIcon(fileName); iconBuffer.insertIntoBuffer(fileName, newIcon); } else //no read-access to disk! determine icon by extension { - const IconHolder newIcon = IconBuffer::getAssociatedIconByExt(extension); + const IconHolder newIcon = getAssociatedIconByExt(extension); iconBuffer.insertIntoBuffer(extension, newIcon); } #elif defined FFS_LINUX - const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName); + const IconHolder newIcon = getAssociatedIcon(fileName); iconBuffer.insertIntoBuffer(fileName, newIcon); #endif } } -//--------------------------------------------------------------------------------------------------- -class IconBuffer::IconDB : public std::map<BasicString, IconBuffer::IconHolder, LessFilename> {}; //entryName/icon -> ATTENTION: avoid ref-counting for this shared data structure! -class IconBuffer::IconDbSequence : public std::queue<BasicString> {}; //entryName -//--------------------------------------------------------------------------------------------------- +//######################### redirect to impl ##################################################### - -IconBuffer& IconBuffer::getInstance() +struct IconBuffer::Pimpl { - static IconBuffer instance; - return instance; -} + Pimpl() : buffer(), worker(buffer) {} //might throw exceptions! + Buffer buffer; + WorkerThread worker; +}; -IconBuffer::IconBuffer() : - buffer( new IconDB), - bufSequence(new IconDbSequence), - worker( new WorkerThread(*this)) //might throw exceptions! -{} +IconBuffer::IconBuffer() : pimpl(new Pimpl) {} IconBuffer::~IconBuffer() {} //auto_ptr<>: keep destructor non-inline +const wxIcon& IconBuffer::getDirectoryIcon() { return ::getDirectoryIcon(); } -bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) -{ - boost::lock_guard<boost::mutex> dummy(lockIconDB); +const wxIcon& IconBuffer::getFileIcon() { return ::getFileIcon(); } -#ifdef FFS_WIN - //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension - const BasicString extension = getFileExtension(fileName.c_str()); - const BasicString searchString = isPriceyExtension(extension) ? fileName.c_str() : extension.c_str(); - IconDB::const_iterator i = buffer->find(searchString); -#elif defined FFS_LINUX - IconDB::const_iterator i = buffer->find(fileName.c_str()); -#endif - - if (i == buffer->end()) - return false; - - if (icon != NULL) - *icon = i->second.toWxIcon(); - - return true; -} - - -void IconBuffer::setWorkload(const std::vector<Zstring>& load) +IconBuffer& IconBuffer::getInstance() { - worker->setWorkload(load); + static IconBuffer instance; + return instance; } +bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) { return pimpl->buffer.requestFileIcon(fileName, icon); } -void IconBuffer::insertIntoBuffer(const BasicString& entryName, const IconHolder& icon) //called by worker thread -{ - boost::lock_guard<boost::mutex> dummy(lockIconDB); - - //thread saftey: icon uses ref-counting! But is NOT shared with main thread! - const std::pair<IconDB::iterator, bool> rc = buffer->insert(std::make_pair(entryName, icon)); - if (rc.second) //if insertion took place - bufSequence->push(entryName); //note: sharing Zstring with IconDB!!! - - assert(buffer->size() == bufSequence->size()); - - //remove elements if buffer becomes too big: - if (buffer->size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) - { - //remove oldest element - buffer->erase(bufSequence->front()); - bufSequence->pop(); - } -} +void IconBuffer::setWorkload(const std::vector<Zstring>& load) { return pimpl->worker.setWorkload(load); } diff --git a/library/icon_buffer.h b/library/icon_buffer.h index b00a566d..5ab2740c 100644 --- a/library/icon_buffer.h +++ b/library/icon_buffer.h @@ -7,21 +7,18 @@ #ifndef ICONBUFFER_H_INCLUDED #define ICONBUFFER_H_INCLUDED -#include <vector> #include "../shared/zstring.h" #include <memory> #include <wx/icon.h> -#include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp> -namespace ffs3 +namespace zen { - class IconBuffer { public: - static const wxIcon& getDirectoryIcon(); //one folder icon should be sufficient... - static const wxIcon& getFileIcon(); //in case one folder icon is sufficient... + static const wxIcon& getDirectoryIcon(); //one icon should be sufficient... + static const wxIcon& getFileIcon(); // static IconBuffer& getInstance(); bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); //returns false if icon is not in buffer @@ -37,36 +34,8 @@ private: IconBuffer(); ~IconBuffer(); - static const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer - - class IconDB; - class IconHolder; - class IconDbSequence; - - //--------------------------------------------------------------------------------------------------- - typedef Zbase<Zchar, StorageDeepCopy> BasicString; //thread safe string class - //avoid reference-counted objects for shared data: NOT THREADSAFE!!! (implicitly shared variable: ref-count) - //--------------------------------------------------------------------------------------------------- - - //methods used by worker thread - void insertIntoBuffer(const BasicString& entryName, const IconHolder& icon); - - static IconHolder getAssociatedIcon(const BasicString& filename); - static IconHolder getAssociatedIconByExt(const BasicString& extension); - -#ifdef FFS_WIN - static BasicString getFileExtension(const BasicString& filename); - static bool isPriceyExtension(const BasicString& extension); -#endif - - //---------------------- Shared Data ------------------------- - boost::mutex lockIconDB; - std::auto_ptr<IconDB> buffer; //use synchronisation when accessing this! - std::auto_ptr<IconDbSequence> bufSequence; //save sequence of buffer entry to delete oldest elements - //------------------------------------------------------------ - - class WorkerThread; - std::auto_ptr<WorkerThread> worker; + struct Pimpl; + std::auto_ptr<Pimpl> pimpl; }; } diff --git a/library/lock_holder.h b/library/lock_holder.h new file mode 100644 index 00000000..b20646c3 --- /dev/null +++ b/library/lock_holder.h @@ -0,0 +1,52 @@ +#ifndef LOCK_HOLDER_H_INCLUDED +#define LOCK_HOLDER_H_INCLUDED + +#include <map> +#include "../shared/Zstring.h" +#include "dir_lock.h" +#include "status_handler.h" + +namespace zen +{ +const Zstring LOCK_FILE_ENDING = Zstr("ffs_lock"); //intermediate locks created by DirLock use this extension, too! + +//convenience class for creating and holding locks for a number of directories +class LockHolder +{ +public: + void addDir(const Zstring& dirnameFmt, ProcessCallback& procCallback) //resolved dirname ending with path separator + { + if (dirnameFmt.empty()) return; + if (lockHolder.find(dirnameFmt) != lockHolder.end()) return; + assert(dirnameFmt.EndsWith(common::FILE_NAME_SEPARATOR)); //this is really the contract, formatting does other things as well, e.g. macro substitution + + class WaitOnLockHandler : public DirLockCallback + { + public: + WaitOnLockHandler(ProcessCallback& pc) : pc_(pc) {} + virtual void requestUiRefresh() { pc_.requestUiRefresh(); } //allowed to throw exceptions + virtual void reportInfo(const Zstring& text) { pc_.reportInfo(text); } + private: + ProcessCallback& pc_; + } callback(procCallback); + + try + { + lockHolder.insert(std::make_pair(dirnameFmt, DirLock(dirnameFmt + Zstr("sync.") + LOCK_FILE_ENDING, &callback))); + } + catch (const FileError& e) + { + bool dummy = false; //this warning shall not be shown but logged only + procCallback.reportWarning(e.msg(), dummy); + } + } + +private: + typedef std::map<Zstring, DirLock, LessFilename> DirnameLockMap; + DirnameLockMap lockHolder; +}; + +} + + +#endif // LOCK_HOLDER_H_INCLUDED diff --git a/library/norm_filter.h b/library/norm_filter.h new file mode 100644 index 00000000..2e55b43f --- /dev/null +++ b/library/norm_filter.h @@ -0,0 +1,98 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef NORM_FILTER_H_INCLUDED +#define NORM_FILTER_H_INCLUDED + +#include "hard_filter.h" +#include "soft_filter.h" + +namespace zen +{ + +struct NormalizedFilter //grade-a filter: global/local filter settings combined, units resolved, ready for use +{ + NormalizedFilter(const HardFilter::FilterRef& hf, const SoftFilter& sf) : nameFilter(hf), timeSizeFilter(sf) {} + + //"hard" filter: relevant during comparison, physically skips files + HardFilter::FilterRef nameFilter; + //"soft" filter: relevant after comparison; equivalent to user selection + SoftFilter timeSizeFilter; +}; +namespace +{ +//combine global and local filters via "logical and" +NormalizedFilter normalizeFilters(const FilterConfig& global, const FilterConfig& local); + +inline +bool isNullFilter(const FilterConfig& filterCfg) +{ + return NameFilter(filterCfg.includeFilter, filterCfg.excludeFilter).isNull() && + SoftFilter(filterCfg.timeSpan, filterCfg.unitTimeSpan, + filterCfg.sizeMin, filterCfg.unitSizeMin, + filterCfg.sizeMax, filterCfg.unitSizeMax).isNull(); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// ----------------------- implementation ----------------------- +NormalizedFilter normalizeFilters(const FilterConfig& global, const FilterConfig& local) +{ + HardFilter::FilterRef globalName(new NameFilter(global.includeFilter, global.excludeFilter)); + HardFilter::FilterRef localName (new NameFilter(local .includeFilter, local .excludeFilter)); + + SoftFilter globalTimeSize(global.timeSpan, global.unitTimeSpan, + global.sizeMin, global.unitSizeMin, + global.sizeMax, global.unitSizeMax); + + SoftFilter localTimeSize(local.timeSpan, local.unitTimeSpan, + local.sizeMin, local.unitSizeMin, + local.sizeMax, local.unitSizeMax); + + return NormalizedFilter(combineFilters(globalName, localName), + combineFilters(globalTimeSize, localTimeSize)); +} +} +} + +#endif //NORM_FILTER_H_INCLUDED diff --git a/library/process_xml.cpp b/library/process_xml.cpp index 9f95f5a3..0e591116 100644 --- a/library/process_xml.cpp +++ b/library/process_xml.cpp @@ -5,141 +5,96 @@ // ************************************************************************** // #include "process_xml.h" -#include "../shared/xml_base.h" #include "../shared/i18n.h" #include "../shared/global_func.h" #include "../shared/standard_paths.h" #include "../shared/string_conv.h" #include "../shared/file_handling.h" -using namespace ffs3; +using namespace zen; using namespace xmlAccess; //functionally needed!!! -class FfsXmlParser : public xmlAccess::XmlParser +XmlType xmlAccess::getXmlType(const wxString& filename) //throw() { -public: - FfsXmlParser(const TiXmlElement* rootElement) : xmlAccess::XmlParser(rootElement) {} - - //read gui settings, all values retrieved are optional, so check for initial values! (== -1) - void readXmlGuiConfig(xmlAccess::XmlGuiConfig& outputCfg); - //read batch settings, all values retrieved are optional - void readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg); - //read global settings, valid for both GUI and batch mode, independent from configuration - void readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg); - -private: - //read alternate configuration (optional) => might point to NULL - void readXmlLocalConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair); - - //read basic FreefileSync settings (used by commandline and GUI), return true if ALL values have been retrieved successfully - void readXmlMainConfig(MainConfiguration& mainCfg); -}; - - -//write gui settings -bool writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg, TiXmlDocument& doc); -//write batch settings -bool writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outputCfg, TiXmlDocument& doc); -//write global settings -bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& outputCfg, TiXmlDocument& doc); -//write alternate configuration (optional) => might point to NULL -void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent); -//write basic FreefileSync settings (used by commandline and GUI), return true if everything was written successfully -bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc); - - -void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlGuiConfig& config) -{ - //load XML - if (!fileExists(wxToZ(filename))) - throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); - - TiXmlDocument doc; - loadXmlDocument(filename, XML_GUI_CONFIG, doc); //throw (XmlError) - - FfsXmlParser parser(doc.RootElement()); - parser.readXmlGuiConfig(config); //read GUI layout configuration - - if (parser.errorsOccurred()) - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + - parser.getErrorMessageFormatted(), XmlError::WARNING); -} - - -void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlBatchConfig& config) -{ - //load XML - if (!fileExists(wxToZ(filename))) - throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); - - TiXmlDocument doc; - loadXmlDocument(filename, XML_BATCH_CONFIG, doc); //throw (XmlError) - - FfsXmlParser parser(doc.RootElement()); - parser.readXmlBatchConfig(config); //read GUI layout configuration + try + { + TiXmlDocument doc; + loadXmlDocument(filename, doc); //throw (XmlError) + return getXmlType(doc); + } + catch (const XmlError&) {} - if (parser.errorsOccurred()) - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + - parser.getErrorMessageFormatted(), XmlError::WARNING); + return XML_TYPE_OTHER; } -void xmlAccess::readConfig(xmlAccess::XmlGlobalSettings& config) +XmlType xmlAccess::getXmlType(const TiXmlDocument& doc) //throw() { - //load XML - if (!fileExists(wxToZ(getGlobalConfigFile()))) - throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"")); - - TiXmlDocument doc; - loadXmlDocument(getGlobalConfigFile(), XML_GLOBAL_SETTINGS, doc); //throw (XmlError) - - FfsXmlParser parser(doc.RootElement()); - parser.readXmlGlobalSettings(config); //read GUI layout configuration - - if (parser.errorsOccurred()) - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"\n\n") + - parser.getErrorMessageFormatted(), XmlError::WARNING); + const TiXmlElement* root = doc.RootElement(); + if (root && root->ValueStr() == std::string("FreeFileSync")) + { + const char* cfgType = root->Attribute("XmlType"); + if (cfgType) + { + const std::string type(cfgType); + + if (type == "GUI") + return XML_TYPE_GUI; + else if (type == "BATCH") + return XML_TYPE_BATCH; + else if (type == "GLOBAL") + return XML_TYPE_GLOBAL; + } + } + return XML_TYPE_OTHER; } -void xmlAccess::writeConfig(const XmlGuiConfig& outputCfg, const wxString& filename) +void xmlAccess::initXmlDocument(TiXmlDocument& doc, XmlType type) //throw() { - TiXmlDocument doc; - getDefaultXmlDocument(XML_GUI_CONFIG, doc); + TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument! + doc.LinkEndChild(decl); - //populate and write XML tree - if (!writeXmlGuiConfig(outputCfg, doc)) //add GUI layout configuration settings - throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); + TiXmlElement* root = new TiXmlElement("FreeFileSync"); + doc.LinkEndChild(root); - saveXmlDocument(filename, doc); //throw (XmlError) + switch (type) + { + case XML_TYPE_GUI: + addXmlAttribute("XmlType", "GUI", doc.RootElement()); + break; + case XML_TYPE_BATCH: + addXmlAttribute("XmlType", "BATCH", doc.RootElement()); + break; + case XML_TYPE_GLOBAL: + addXmlAttribute("XmlType", "GLOBAL", doc.RootElement()); + break; + case XML_TYPE_OTHER: + break; + } } -void xmlAccess::writeConfig(const XmlBatchConfig& outputCfg, const wxString& filename) +class FfsXmlErrorLogger : public xmlAccess::XmlErrorLogger { - TiXmlDocument doc; - getDefaultXmlDocument(XML_BATCH_CONFIG, doc); - - //populate and write XML tree - if (!writeXmlBatchConfig(outputCfg, doc)) //add batch configuration settings - throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); - - saveXmlDocument(filename, doc); //throw (XmlError) -} - +public: + //read gui settings, all values retrieved are optional, so check for initial values! (== -1) + void readConfig(const TiXmlElement* root, xmlAccess::XmlGuiConfig& outputCfg); + //read batch settings, all values retrieved are optional + void readConfig(const TiXmlElement* root, xmlAccess::XmlBatchConfig& outputCfg); + //read global settings, valid for both GUI and batch mode, independent from configuration + void readConfig(const TiXmlElement* root, xmlAccess::XmlGlobalSettings& outputCfg); -void xmlAccess::writeConfig(const XmlGlobalSettings& outputCfg) -{ - TiXmlDocument doc; - getDefaultXmlDocument(XML_GLOBAL_SETTINGS, doc); +private: + //read alternate configuration (optional) => might point to NULL + void readConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair); + void readFilter(const TiXmlElement& parent, FilterConfig& output); - //populate and write XML tree - if (!writeXmlGlobalSettings(outputCfg, doc)) //add GUI layout configuration settings - throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"")); + //read basic FreefileSync settings (used by commandline and GUI) + void readConfig(const TiXmlElement* root, MainConfiguration& mainCfg); +}; - saveXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError) -} bool readXmlElement(const std::string& name, const TiXmlElement* parent, CompareVariant& output) @@ -148,9 +103,9 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, Compare if (xmlAccess::readXmlElement(name, parent, dummy)) { if (dummy == "ByTimeAndSize") - output = ffs3::CMP_BY_TIME_SIZE; + output = zen::CMP_BY_TIME_SIZE; else if (dummy == "ByContent") - output = ffs3::CMP_BY_CONTENT; + output = zen::CMP_BY_CONTENT; else return false; @@ -199,17 +154,35 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, xmlAcce } -bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::DeletionPolicy& output) +bool readXmlElement(const std::string& name, const TiXmlElement* parent , OnGuiError& output) +{ + std::string dummy; + if (xmlAccess::readXmlElement(name, parent, dummy)) + { + if (dummy == "Popup") + output = ON_GUIERROR_POPUP; + else if (dummy == "Ignore") + output = ON_GUIERROR_IGNORE; + else + return false; + + return true; + } + return false; +} + + +bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::DeletionPolicy& output) { std::string dummy; if (xmlAccess::readXmlElement(name, parent, dummy)) { if (dummy == "DeletePermanently") - output = ffs3::DELETE_PERMANENTLY; + output = zen::DELETE_PERMANENTLY; else if (dummy == "MoveToRecycleBin") - output = ffs3::MOVE_TO_RECYCLE_BIN; + output = zen::MOVE_TO_RECYCLE_BIN; else if (dummy == "MoveToCustomDirectory") - output = ffs3::MOVE_TO_CUSTOM_DIRECTORY; + output = zen::MOVE_TO_CUSTOM_DIRECTORY; else return false; @@ -219,17 +192,63 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3:: } -bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::SymLinkHandling& output) +bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::SymLinkHandling& output) { std::string dummy; if (xmlAccess::readXmlElement(name, parent, dummy)) { if (dummy == "Ignore") - output = ffs3::SYMLINK_IGNORE; + output = zen::SYMLINK_IGNORE; else if (dummy == "UseDirectly") - output = ffs3::SYMLINK_USE_DIRECTLY; + output = zen::SYMLINK_USE_DIRECTLY; else if (dummy == "FollowLink") - output = ffs3::SYMLINK_FOLLOW_LINK; + output = zen::SYMLINK_FOLLOW_LINK; + else + return false; + + return true; + } + return false; +} + + +bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::UnitTime& output) +{ + std::string dummy; + if (xmlAccess::readXmlElement(name, parent, dummy)) + { + if (dummy == "Inactive") + output = zen::UTIME_NONE; + else if (dummy == "Second") + output = zen::UTIME_SEC; + else if (dummy == "Minute") + output = zen::UTIME_MIN; + else if (dummy == "Hour") + output = zen::UTIME_HOUR; + else if (dummy == "Day") + output = zen::UTIME_DAY; + else + return false; + + return true; + } + return false; +} + + +bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::UnitSize& output) +{ + std::string dummy; + if (xmlAccess::readXmlElement(name, parent, dummy)) + { + if (dummy == "Inactive") + output = zen::USIZE_NONE; + else if (dummy == "Byte") + output = zen::USIZE_BYTE; + else if (dummy == "KB") + output = zen::USIZE_KB; + else if (dummy == "MB") + output = zen::USIZE_MB; else return false; @@ -239,6 +258,27 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3:: } +bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::SyncConfig::Variant& output) +{ + std::string dummy; + if (!xmlAccess::readXmlElement(name, parent, dummy)) + return false; + + if (dummy == "Automatic") + output = SyncConfig::AUTOMATIC; + else if (dummy == "Mirror") + output = SyncConfig::MIRROR; + else if (dummy == "Update") + output = SyncConfig::UPDATE; + else if (dummy == "Custom") + output = SyncConfig::CUSTOM; + else + return false; + + return true; +} + + bool readXmlElement(const std::string& name, const TiXmlElement* parent, Zstring& output) { wxString dummy; @@ -263,8 +303,27 @@ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, xmlAcce } +void FfsXmlErrorLogger::readFilter(const TiXmlElement& parent, FilterConfig& output) +{ + //read filter settings + readXmlElementLogging("Include", &parent, output.includeFilter); + readXmlElementLogging("Exclude", &parent, output.excludeFilter); + + //migration "strategy": no error checking on these... :P + + readXmlElementLogging("TimeSpan", &parent, output.timeSpan); + readXmlElementLogging("UnitTimeSpan", &parent, output.unitTimeSpan); + + readXmlElementLogging("SizeMin", &parent, output.sizeMin); + readXmlElementLogging("UnitSizeMin", &parent, output.unitSizeMin); + + readXmlElementLogging("SizeMax", &parent, output.sizeMax); + readXmlElementLogging("UnitSizeMax", &parent, output.unitSizeMax); +} + + //################################################################################################################ -void FfsXmlParser::readXmlLocalConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair) +void FfsXmlErrorLogger::readConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair) { //read folder pairs readXmlElementLogging("Left", &folderPair, enhPair.leftDirectory); @@ -273,46 +332,43 @@ void FfsXmlParser::readXmlLocalConfig(const TiXmlElement& folderPair, FolderPair //########################################################### //alternate sync configuration - const TiXmlElement* altSyncConfig = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").ToElement(); - if (altSyncConfig) + const TiXmlElement* xmlAltSyncCfg = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").ToElement(); + if (xmlAltSyncCfg) { AlternateSyncConfig* altSyncCfg = new AlternateSyncConfig; enhPair.altSyncConfig.reset(altSyncCfg); - const TiXmlElement* syncCfg = TiXmlHandleConst(altSyncConfig).FirstChild("Synchronization").ToElement(); - const TiXmlElement* syncDirections = TiXmlHandleConst(syncCfg).FirstChild("Directions").ToElement(); + const TiXmlElement* xmlSyncDirections = TiXmlHandleConst(xmlAltSyncCfg).FirstChild("CustomDirections").ToElement(); //read sync configuration - readXmlElementLogging("Automatic", syncCfg, altSyncCfg->syncConfiguration.automatic); - readXmlElementLogging("LeftOnly", syncDirections, altSyncCfg->syncConfiguration.exLeftSideOnly); - readXmlElementLogging("RightOnly", syncDirections, altSyncCfg->syncConfiguration.exRightSideOnly); - readXmlElementLogging("LeftNewer", syncDirections, altSyncCfg->syncConfiguration.leftNewer); - readXmlElementLogging("RightNewer", syncDirections, altSyncCfg->syncConfiguration.rightNewer); - readXmlElementLogging("Different", syncDirections, altSyncCfg->syncConfiguration.different); - readXmlElementLogging("Conflict", syncDirections, altSyncCfg->syncConfiguration.conflict); - - const TiXmlElement* miscSettings = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").FirstChild("Miscellaneous").ToElement(); - readXmlElementLogging("DeletionPolicy", miscSettings, altSyncCfg->handleDeletion); - readXmlElementLogging("CustomDeletionFolder", miscSettings, altSyncCfg->customDeletionDirectory); + readXmlElementLogging("Variant", xmlAltSyncCfg, altSyncCfg->syncConfiguration.var); + + readXmlElementLogging("LeftOnly", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.exLeftSideOnly); + readXmlElementLogging("RightOnly", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.exRightSideOnly); + readXmlElementLogging("LeftNewer", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.leftNewer); + readXmlElementLogging("RightNewer", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.rightNewer); + readXmlElementLogging("Different", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.different); + readXmlElementLogging("Conflict", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.conflict); + + readXmlElementLogging("DeletionPolicy", xmlAltSyncCfg, altSyncCfg->handleDeletion); + readXmlElementLogging("CustomDeletionFolder", xmlAltSyncCfg, altSyncCfg->customDeletionDirectory); } //########################################################### //alternate filter configuration const TiXmlElement* filterCfg = TiXmlHandleConst(&folderPair).FirstChild("LocalFilter").ToElement(); if (filterCfg) - { - //read filter settings - readXmlElementLogging("Include", filterCfg, enhPair.localFilter.includeFilter); - readXmlElementLogging("Exclude", filterCfg, enhPair.localFilter.excludeFilter); - } + readFilter(*filterCfg, enhPair.localFilter); } -void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) +void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, MainConfiguration& mainCfg) { - TiXmlHandleConst hRoot(getRoot()); //custom const handle: TiXml API seems broken in this regard + TiXmlHandleConst hRoot(root); //custom const handle: TiXml API seems broken in this regard //########################################################### + const TiXmlElement* xmlMainConfig = hRoot.FirstChild("MainConfig").ToElement(); + const TiXmlElement* cmpSettings = hRoot.FirstChild("MainConfig").FirstChild("Comparison").ToElement(); //read compare variant @@ -322,34 +378,31 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) readXmlElementLogging("HandleSymlinks", cmpSettings, mainCfg.handleSymlinks); //########################################################### - const TiXmlElement* syncCfg = hRoot.FirstChild("MainConfig").FirstChild("Synchronization").ToElement(); - const TiXmlElement* syncDirections = TiXmlHandleConst(syncCfg).FirstChild("Directions").ToElement(); + const TiXmlElement* xmlSyncCfg = hRoot.FirstChild("MainConfig").FirstChild("SyncConfig").ToElement(); + const TiXmlElement* syncDirections = TiXmlHandleConst(xmlSyncCfg).FirstChild("CustomDirections").ToElement(); //read sync configuration - readXmlElementLogging("Automatic", syncCfg, mainCfg.syncConfiguration.automatic); - readXmlElementLogging("LeftOnly", syncDirections, mainCfg.syncConfiguration.exLeftSideOnly); - readXmlElementLogging("RightOnly", syncDirections, mainCfg.syncConfiguration.exRightSideOnly); - readXmlElementLogging("LeftNewer", syncDirections, mainCfg.syncConfiguration.leftNewer); - readXmlElementLogging("RightNewer", syncDirections, mainCfg.syncConfiguration.rightNewer); - readXmlElementLogging("Different", syncDirections, mainCfg.syncConfiguration.different); - readXmlElementLogging("Conflict", syncDirections, mainCfg.syncConfiguration.conflict); + readXmlElementLogging("Variant", xmlSyncCfg, mainCfg.syncConfiguration.var); - //########################################################### - const TiXmlElement* miscSettings = hRoot.FirstChild("MainConfig").FirstChild("Miscellaneous").ToElement(); + readXmlElementLogging("LeftOnly", syncDirections, mainCfg.syncConfiguration.custom.exLeftSideOnly); + readXmlElementLogging("RightOnly", syncDirections, mainCfg.syncConfiguration.custom.exRightSideOnly); + readXmlElementLogging("LeftNewer", syncDirections, mainCfg.syncConfiguration.custom.leftNewer); + readXmlElementLogging("RightNewer", syncDirections, mainCfg.syncConfiguration.custom.rightNewer); + readXmlElementLogging("Different", syncDirections, mainCfg.syncConfiguration.custom.different); + readXmlElementLogging("Conflict", syncDirections, mainCfg.syncConfiguration.custom.conflict); + //########################################################### //misc - readXmlElementLogging("DeletionPolicy", miscSettings, mainCfg.handleDeletion); - readXmlElementLogging("CustomDeletionFolder", miscSettings, mainCfg.customDeletionDirectory); + readXmlElementLogging("DeletionPolicy", xmlSyncCfg, mainCfg.handleDeletion); + readXmlElementLogging("CustomDeletionFolder", xmlSyncCfg, mainCfg.customDeletionDirectory); //########################################################### - const TiXmlElement* filter = TiXmlHandleConst(miscSettings).FirstChild("Filter").ToElement(); + const TiXmlElement* filter = TiXmlHandleConst(xmlMainConfig).FirstChild("GlobalFilter").ToElement(); //read filter settings - Zstring includeFilter; - Zstring excludeFilter; - readXmlElementLogging("Include", filter, includeFilter); - readXmlElementLogging("Exclude", filter, excludeFilter); - - mainCfg.globalFilter = FilterConfig(includeFilter, excludeFilter); + if (filter) + readFilter(*filter, mainCfg.globalFilter); + else + logError("GlobalFilter"); //########################################################### const TiXmlElement* pairs = hRoot.FirstChild("MainConfig").FirstChild("FolderPairs").FirstChild("Pair").ToElement(); @@ -360,7 +413,7 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) while (pairs) { FolderPairEnh newPair; - readXmlLocalConfig(*pairs, newPair); + readConfig(*pairs, newPair); if (firstLoop) //read first folder pair { @@ -375,31 +428,27 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg) } -void FfsXmlParser::readXmlGuiConfig(xmlAccess::XmlGuiConfig& outputCfg) +void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlGuiConfig& outputCfg) { //read main config - readXmlMainConfig(outputCfg.mainCfg); + readConfig(root, outputCfg.mainCfg); //read GUI specific config data - const TiXmlElement* guiConfig = TiXmlHandleConst(getRoot()).FirstChild("GuiConfig").ToElement(); - - readXmlElementLogging("HideFiltered", guiConfig, outputCfg.hideFilteredElements); - - xmlAccess::OnError errorHand = ON_ERROR_POPUP; - readXmlElementLogging("HandleError", guiConfig, errorHand); - outputCfg.ignoreErrors = errorHand == xmlAccess::ON_ERROR_IGNORE; + const TiXmlElement* guiConfig = TiXmlHandleConst(root).FirstChild("GuiConfig").ToElement(); + readXmlElementLogging("HideFiltered", guiConfig, outputCfg.hideFilteredElements); + readXmlElementLogging("HandleError", guiConfig, outputCfg.handleError); readXmlElementLogging("SyncPreviewActive", guiConfig, outputCfg.syncPreviewEnabled); } -void FfsXmlParser::readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg) +void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlBatchConfig& outputCfg) { //read main config - readXmlMainConfig(outputCfg.mainCfg); + readConfig(root, outputCfg.mainCfg); //read batch specific config - const TiXmlElement* batchConfig = TiXmlHandleConst(getRoot()).FirstChild("BatchConfig").ToElement(); + const TiXmlElement* batchConfig = TiXmlHandleConst(root).FirstChild("BatchConfig").ToElement(); readXmlElementLogging("Silent", batchConfig, outputCfg.silent); readXmlElementLogging("LogfileDirectory", batchConfig, outputCfg.logFileDirectory); @@ -408,10 +457,10 @@ void FfsXmlParser::readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg) } -void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg) +void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlGlobalSettings& outputCfg) { //read global settings - const TiXmlElement* global = TiXmlHandleConst(getRoot()).FirstChild("Shared").ToElement(); + const TiXmlElement* global = TiXmlHandleConst(root).FirstChild("Shared").ToElement(); //try to read program language setting readXmlElementLogging("Language", global, outputCfg.programLanguage); @@ -429,7 +478,7 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg readXmlElementLogging("FileTimeTolerance", global, outputCfg.fileTimeTolerance); - const TiXmlElement* optionalDialogs = TiXmlHandleConst(getRoot()).FirstChild("Shared").FirstChild("ShowOptionalDialogs").ToElement(); + const TiXmlElement* optionalDialogs = TiXmlHandleConst(root).FirstChild("Shared").FirstChild("ShowOptionalDialogs").ToElement(); //folder dependency check readXmlElementLogging("CheckForDependentFolders", optionalDialogs, outputCfg.optDialogs.warningDependentFolders); @@ -452,7 +501,7 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg //gui specific global settings (optional) - const TiXmlElement* gui = TiXmlHandleConst(getRoot()).FirstChild("Gui").ToElement(); + const TiXmlElement* gui = TiXmlHandleConst(root).FirstChild("Gui").ToElement(); const TiXmlElement* mainWindow = TiXmlHandleConst(gui).FirstChild("Windows").FirstChild("Main").ToElement(); //read application window size and position @@ -508,19 +557,9 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg rightColumn = rightColumn->NextSiblingElement(); } - //load folder history elements - const TiXmlElement* historyLeft = TiXmlHandleConst(mainWindow).FirstChild("FolderHistoryLeft").ToElement(); - //load max. history size - readXmlAttributeLogging("MaximumSize", historyLeft, outputCfg.gui.folderHistLeftMax); - //load config history elements - readXmlElementLogging("Folder", historyLeft, outputCfg.gui.folderHistoryLeft); - - - const TiXmlElement* historyRight = TiXmlHandleConst(mainWindow).FirstChild("FolderHistoryRight").ToElement(); - //load max. history size - readXmlAttributeLogging("MaximumSize", historyRight, outputCfg.gui.folderHistRightMax); - //load config history elements - readXmlElementLogging("Folder", historyRight, outputCfg.gui.folderHistoryRight); + readXmlElementLogging("FolderHistoryLeft", mainWindow, outputCfg.gui.folderHistoryLeft); + readXmlElementLogging("FolderHistoryRight", mainWindow, outputCfg.gui.folderHistoryRight); + readXmlElementLogging("MaximumHistorySize", mainWindow, outputCfg.gui.folderHistMax); readXmlElementLogging("Perspective", mainWindow, outputCfg.gui.guiPerspectiveLast); @@ -562,10 +601,10 @@ void addXmlElement(const std::string& name, const CompareVariant variant, TiXmlE { switch (variant) { - case ffs3::CMP_BY_TIME_SIZE: + case zen::CMP_BY_TIME_SIZE: xmlAccess::addXmlElement(name, std::string("ByTimeAndSize"), parent); break; - case ffs3::CMP_BY_CONTENT: + case zen::CMP_BY_CONTENT: xmlAccess::addXmlElement(name, std::string("ByContent"), parent); break; } @@ -606,40 +645,117 @@ void addXmlElement(const std::string& name, const xmlAccess::OnError value, TiXm } -void addXmlElement(const std::string& name, const ffs3::DeletionPolicy value, TiXmlElement* parent) +void addXmlElement(const std::string& name, const OnGuiError value, TiXmlElement* parent) { switch (value) { - case ffs3::DELETE_PERMANENTLY: + case ON_GUIERROR_IGNORE: + xmlAccess::addXmlElement(name, std::string("Ignore"), parent); + break; + case ON_GUIERROR_POPUP: + xmlAccess::addXmlElement(name, std::string("Popup"), parent); + break; + } +} + + +void addXmlElement(const std::string& name, const zen::DeletionPolicy value, TiXmlElement* parent) +{ + switch (value) + { + case zen::DELETE_PERMANENTLY: xmlAccess::addXmlElement(name, std::string("DeletePermanently"), parent); break; - case ffs3::MOVE_TO_RECYCLE_BIN: + case zen::MOVE_TO_RECYCLE_BIN: xmlAccess::addXmlElement(name, std::string("MoveToRecycleBin"), parent); break; - case ffs3::MOVE_TO_CUSTOM_DIRECTORY: + case zen::MOVE_TO_CUSTOM_DIRECTORY: xmlAccess::addXmlElement(name, std::string("MoveToCustomDirectory"), parent); break; } } -void addXmlElement(const std::string& name, const ffs3::SymLinkHandling value, TiXmlElement* parent) +void addXmlElement(const std::string& name, const zen::SymLinkHandling value, TiXmlElement* parent) { switch (value) { - case ffs3::SYMLINK_IGNORE: + case zen::SYMLINK_IGNORE: xmlAccess::addXmlElement(name, std::string("Ignore"), parent); break; - case ffs3::SYMLINK_USE_DIRECTLY: + case zen::SYMLINK_USE_DIRECTLY: xmlAccess::addXmlElement(name, std::string("UseDirectly"), parent); break; - case ffs3::SYMLINK_FOLLOW_LINK: + case zen::SYMLINK_FOLLOW_LINK: xmlAccess::addXmlElement(name, std::string("FollowLink"), parent); break; } } +void addXmlElement(const std::string& name, const zen::UnitTime value, TiXmlElement* parent) +{ + switch (value) + { + case zen::UTIME_NONE: + xmlAccess::addXmlElement(name, std::string("Inactive"), parent); + break; + case zen::UTIME_SEC: + xmlAccess::addXmlElement(name, std::string("Second"), parent); + break; + case zen::UTIME_MIN: + xmlAccess::addXmlElement(name, std::string("Minute"), parent); + break; + case zen::UTIME_HOUR: + xmlAccess::addXmlElement(name, std::string("Hour"), parent); + break; + case zen::UTIME_DAY: + xmlAccess::addXmlElement(name, std::string("Day"), parent); + break; + } +} + + +void addXmlElement(const std::string& name, zen::UnitSize value, TiXmlElement* parent) +{ + switch (value) + { + case zen::USIZE_NONE: + xmlAccess::addXmlElement(name, std::string("Inactive"), parent); + break; + case zen::USIZE_BYTE: + xmlAccess::addXmlElement(name, std::string("Byte"), parent); + break; + case zen::USIZE_KB: + xmlAccess::addXmlElement(name, std::string("KB"), parent); + break; + case zen::USIZE_MB: + xmlAccess::addXmlElement(name, std::string("MB"), parent); + break; + } +} + + +void addXmlElement(const std::string& name, SyncConfig::Variant value, TiXmlElement* parent) +{ + switch (value) + { + case SyncConfig::AUTOMATIC: + xmlAccess::addXmlElement(name, std::string("Automatic"), parent); + break; + case SyncConfig::MIRROR: + xmlAccess::addXmlElement(name, std::string("Mirror"), parent); + break; + case SyncConfig::UPDATE: + xmlAccess::addXmlElement(name, std::string("Update"), parent); + break; + case SyncConfig::CUSTOM: + xmlAccess::addXmlElement(name, std::string("Custom"), parent); + break; + } +} + + void addXmlElement(const std::string& name, const Zstring& value, TiXmlElement* parent) { xmlAccess::addXmlElement(name, wxString(zToWx(value)), parent); @@ -652,6 +768,22 @@ void addXmlAttribute(const std::string& name, const xmlAccess::ColumnTypes value } +void writeFilter(const FilterConfig& input, TiXmlElement& parent) +{ + addXmlElement("Include", input.includeFilter, &parent); + addXmlElement("Exclude", input.excludeFilter, &parent); + + addXmlElement("TimeSpan", input.timeSpan, &parent); + addXmlElement("UnitTimeSpan", input.unitTimeSpan, &parent); + + addXmlElement("SizeMin", input.sizeMin, &parent); + addXmlElement("UnitSizeMin", input.unitSizeMin, &parent); + + addXmlElement("SizeMax", input.sizeMax, &parent); + addXmlElement("UnitSizeMax", input.unitSizeMax, &parent); +} + + void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent) { //write folder pairs @@ -666,32 +798,25 @@ void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent) const AlternateSyncConfig* altSyncConfig = enhPair.altSyncConfig.get(); if (altSyncConfig) { - TiXmlElement* syncCfg = new TiXmlElement("AlternateSyncConfig"); - newfolderPair->LinkEndChild(syncCfg); - - TiXmlElement* syncSettings = new TiXmlElement("Synchronization"); - syncCfg->LinkEndChild(syncSettings); + TiXmlElement* xmlAltSyncCfg = new TiXmlElement("AlternateSyncConfig"); + newfolderPair->LinkEndChild(xmlAltSyncCfg); //write sync configuration - addXmlElement("Automatic", altSyncConfig->syncConfiguration.automatic, syncSettings); - - TiXmlElement* syncDirections = new TiXmlElement("Directions"); - syncSettings->LinkEndChild(syncDirections); + addXmlElement("Variant", altSyncConfig->syncConfiguration.var, xmlAltSyncCfg); - addXmlElement("LeftOnly", altSyncConfig->syncConfiguration.exLeftSideOnly, syncDirections); - addXmlElement("RightOnly", altSyncConfig->syncConfiguration.exRightSideOnly, syncDirections); - addXmlElement("LeftNewer", altSyncConfig->syncConfiguration.leftNewer, syncDirections); - addXmlElement("RightNewer", altSyncConfig->syncConfiguration.rightNewer, syncDirections); - addXmlElement("Different", altSyncConfig->syncConfiguration.different, syncDirections); - addXmlElement("Conflict", altSyncConfig->syncConfiguration.conflict, syncDirections); + TiXmlElement* syncDirections = new TiXmlElement("CustomDirections"); + xmlAltSyncCfg->LinkEndChild(syncDirections); - - TiXmlElement* miscSettings = new TiXmlElement("Miscellaneous"); - syncCfg->LinkEndChild(miscSettings); + addXmlElement("LeftOnly", altSyncConfig->syncConfiguration.custom.exLeftSideOnly, syncDirections); + addXmlElement("RightOnly", altSyncConfig->syncConfiguration.custom.exRightSideOnly, syncDirections); + addXmlElement("LeftNewer", altSyncConfig->syncConfiguration.custom.leftNewer, syncDirections); + addXmlElement("RightNewer", altSyncConfig->syncConfiguration.custom.rightNewer, syncDirections); + addXmlElement("Different", altSyncConfig->syncConfiguration.custom.different, syncDirections); + addXmlElement("Conflict", altSyncConfig->syncConfiguration.custom.conflict, syncDirections); //misc - addXmlElement("DeletionPolicy", altSyncConfig->handleDeletion, miscSettings); - addXmlElement("CustomDeletionFolder", altSyncConfig->customDeletionDirectory, miscSettings); + addXmlElement("DeletionPolicy", altSyncConfig->handleDeletion, xmlAltSyncCfg); + addXmlElement("CustomDeletionFolder", altSyncConfig->customDeletionDirectory, xmlAltSyncCfg); } //########################################################### @@ -700,22 +825,18 @@ void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent) newfolderPair->LinkEndChild(filterCfg); //write filter settings - addXmlElement("Include", enhPair.localFilter.includeFilter, filterCfg); - addXmlElement("Exclude", enhPair.localFilter.excludeFilter, filterCfg); + writeFilter(enhPair.localFilter, *filterCfg); } -bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc) +void writeConfig(const MainConfiguration& mainCfg, TiXmlElement& root) { - TiXmlElement* root = doc.RootElement(); - if (!root) return false; - - TiXmlElement* settings = new TiXmlElement("MainConfig"); - root->LinkEndChild(settings); + TiXmlElement* xmlMainCfg = new TiXmlElement("MainConfig"); + root.LinkEndChild(xmlMainCfg); //########################################################### TiXmlElement* cmpSettings = new TiXmlElement("Comparison"); - settings->LinkEndChild(cmpSettings); + xmlMainCfg->LinkEndChild(cmpSettings); //write compare algorithm addXmlElement("Variant", mainCfg.compareVar, cmpSettings); @@ -724,40 +845,36 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc) addXmlElement("HandleSymlinks", mainCfg.handleSymlinks, cmpSettings); //########################################################### - TiXmlElement* syncSettings = new TiXmlElement("Synchronization"); - settings->LinkEndChild(syncSettings); + TiXmlElement* xmlSyncCfg = new TiXmlElement("SyncConfig"); + xmlMainCfg->LinkEndChild(xmlSyncCfg); //write sync configuration - addXmlElement("Automatic", mainCfg.syncConfiguration.automatic, syncSettings); + addXmlElement("Variant", mainCfg.syncConfiguration.var, xmlSyncCfg); - TiXmlElement* syncDirections = new TiXmlElement("Directions"); - syncSettings->LinkEndChild(syncDirections); + TiXmlElement* syncDirections = new TiXmlElement("CustomDirections"); + xmlSyncCfg->LinkEndChild(syncDirections); - addXmlElement("LeftOnly", mainCfg.syncConfiguration.exLeftSideOnly, syncDirections); - addXmlElement("RightOnly", mainCfg.syncConfiguration.exRightSideOnly, syncDirections); - addXmlElement("LeftNewer", mainCfg.syncConfiguration.leftNewer, syncDirections); - addXmlElement("RightNewer", mainCfg.syncConfiguration.rightNewer, syncDirections); - addXmlElement("Different", mainCfg.syncConfiguration.different, syncDirections); - addXmlElement("Conflict", mainCfg.syncConfiguration.conflict, syncDirections); + addXmlElement("LeftOnly", mainCfg.syncConfiguration.custom.exLeftSideOnly, syncDirections); + addXmlElement("RightOnly", mainCfg.syncConfiguration.custom.exRightSideOnly, syncDirections); + addXmlElement("LeftNewer", mainCfg.syncConfiguration.custom.leftNewer, syncDirections); + addXmlElement("RightNewer", mainCfg.syncConfiguration.custom.rightNewer, syncDirections); + addXmlElement("Different", mainCfg.syncConfiguration.custom.different, syncDirections); + addXmlElement("Conflict", mainCfg.syncConfiguration.custom.conflict, syncDirections); //########################################################### - TiXmlElement* miscSettings = new TiXmlElement("Miscellaneous"); - settings->LinkEndChild(miscSettings); - //write filter settings - TiXmlElement* filter = new TiXmlElement("Filter"); - miscSettings->LinkEndChild(filter); + TiXmlElement* filter = new TiXmlElement("GlobalFilter"); + xmlMainCfg->LinkEndChild(filter); - addXmlElement("Include", mainCfg.globalFilter.includeFilter, filter); - addXmlElement("Exclude", mainCfg.globalFilter.excludeFilter, filter); + writeFilter(mainCfg.globalFilter, *filter); //other - addXmlElement("DeletionPolicy", mainCfg.handleDeletion, miscSettings); - addXmlElement("CustomDeletionFolder", mainCfg.customDeletionDirectory, miscSettings); + addXmlElement("DeletionPolicy", mainCfg.handleDeletion, xmlSyncCfg); + addXmlElement("CustomDeletionFolder", mainCfg.customDeletionDirectory, xmlSyncCfg); //########################################################### TiXmlElement* pairs = new TiXmlElement("FolderPairs"); - settings->LinkEndChild(pairs); + xmlMainCfg->LinkEndChild(pairs); //write first folder pair writeXmlLocalConfig(mainCfg.firstPair, *pairs); @@ -765,65 +882,45 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc) //write additional folder pairs for (std::vector<FolderPairEnh>::const_iterator i = mainCfg.additionalPairs.begin(); i != mainCfg.additionalPairs.end(); ++i) writeXmlLocalConfig(*i, *pairs); - - return true; } -bool writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& inputCfg, TiXmlDocument& doc) +void writeConfig(const xmlAccess::XmlGuiConfig& inputCfg, TiXmlElement& root) { //write main config - if (!writeXmlMainConfig(inputCfg.mainCfg, doc)) - return false; + writeConfig(inputCfg.mainCfg, root); //write GUI specific config - TiXmlElement* root = doc.RootElement(); - if (!root) return false; - TiXmlElement* guiConfig = new TiXmlElement("GuiConfig"); - root->LinkEndChild(guiConfig); + root.LinkEndChild(guiConfig); addXmlElement("HideFiltered", inputCfg.hideFilteredElements, guiConfig); - - addXmlElement("HandleError", inputCfg.ignoreErrors ? xmlAccess::ON_ERROR_IGNORE : xmlAccess::ON_ERROR_POPUP, guiConfig); - + addXmlElement("HandleError", inputCfg.handleError, guiConfig); addXmlElement("SyncPreviewActive", inputCfg.syncPreviewEnabled, guiConfig); - - return true; } -bool writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& inputCfg, TiXmlDocument& doc) +void writeConfig(const xmlAccess::XmlBatchConfig& inputCfg, TiXmlElement& root) { //write main config - if (!writeXmlMainConfig(inputCfg.mainCfg, doc)) - return false; + writeConfig(inputCfg.mainCfg, root); //write GUI specific config - TiXmlElement* root = doc.RootElement(); - if (!root) return false; - TiXmlElement* batchConfig = new TiXmlElement("BatchConfig"); - root->LinkEndChild(batchConfig); + root.LinkEndChild(batchConfig); addXmlElement("Silent", inputCfg.silent, batchConfig); addXmlElement("LogfileDirectory", inputCfg.logFileDirectory, batchConfig); addXmlElement("LogfileCountMax", inputCfg.logFileCountMax, batchConfig); addXmlElement("HandleError", inputCfg.handleError, batchConfig); - - return true; } -bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlDocument& doc) +void writeConfig(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlElement& root) { - TiXmlElement* root = doc.RootElement(); - if (!root) return false; - - //################################################################### //write global settings TiXmlElement* global = new TiXmlElement("Shared"); - root->LinkEndChild(global); + root.LinkEndChild(global); //program language addXmlElement("Language", inputCfg.programLanguage, global); @@ -870,7 +967,7 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD //################################################################### //write global gui settings TiXmlElement* gui = new TiXmlElement("Gui"); - root->LinkEndChild(gui); + root.LinkEndChild(gui); TiXmlElement* windows = new TiXmlElement("Windows"); gui->LinkEndChild(windows); @@ -934,17 +1031,9 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD addXmlAttribute("Width", colAttrib.width, subElement); } - //write folder history elements - TiXmlElement* historyLeft = new TiXmlElement("FolderHistoryLeft"); - mainWindow->LinkEndChild(historyLeft); - TiXmlElement* historyRight = new TiXmlElement("FolderHistoryRight"); - mainWindow->LinkEndChild(historyRight); - - addXmlAttribute("MaximumSize", inputCfg.gui.folderHistLeftMax, historyLeft); - addXmlAttribute("MaximumSize", inputCfg.gui.folderHistRightMax, historyRight); - - addXmlElement("Folder", inputCfg.gui.folderHistoryLeft, historyLeft); - addXmlElement("Folder", inputCfg.gui.folderHistoryRight, historyRight); + addXmlElement("FolderHistoryLeft", inputCfg.gui.folderHistoryLeft , mainWindow); + addXmlElement("FolderHistoryRight", inputCfg.gui.folderHistoryRight, mainWindow); + addXmlElement("MaximumHistorySize", inputCfg.gui.folderHistMax , mainWindow); addXmlElement("Perspective", inputCfg.gui.guiPerspectiveLast, mainWindow); @@ -975,15 +1064,13 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD //write global batch settings TiXmlElement* batch = new TiXmlElement("Batch"); - root->LinkEndChild(batch); - - return true; + root.LinkEndChild(batch); } wxString xmlAccess::getGlobalConfigFile() { - return ffs3::getConfigDir() + wxT("GlobalSettings.xml"); + return zen::getConfigDir() + wxT("GlobalSettings.xml"); } @@ -1013,10 +1100,15 @@ xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiCo XmlBatchConfig output; output.mainCfg = guiCfg.mainCfg; - if (guiCfg.ignoreErrors) - output.handleError = xmlAccess::ON_ERROR_IGNORE; - else - output.handleError = xmlAccess::ON_ERROR_POPUP; + switch (guiCfg.handleError) + { + case ON_GUIERROR_POPUP: + output.handleError = xmlAccess::ON_ERROR_POPUP; + break; + case ON_GUIERROR_IGNORE: + output.handleError = xmlAccess::ON_ERROR_IGNORE; + break; + } return output; } @@ -1031,17 +1123,16 @@ xmlAccess::MergeType xmlAccess::getMergeType(const std::vector<wxString>& filena { switch (xmlAccess::getXmlType(*i)) //throw() { - case XML_GUI_CONFIG: + case XML_TYPE_GUI: guiCfgExists = true; break; - case XML_BATCH_CONFIG: + case XML_TYPE_BATCH: batchCfgExists = true; break; - case XML_GLOBAL_SETTINGS: - case XML_REAL_CONFIG: - case XML_OTHER: + case XML_TYPE_GLOBAL: + case XML_TYPE_OTHER: return MERGE_OTHER; } } @@ -1087,24 +1178,23 @@ void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config if (filenames.empty()) return; - std::vector<ffs3::MainConfiguration> mainCfgs; + std::vector<zen::MainConfiguration> mainCfgs; std::auto_ptr<XmlError> savedException; for (std::vector<wxString>::const_iterator i = filenames.begin(); i != filenames.end(); ++i) { switch (getXmlType(*i)) { - case XML_GUI_CONFIG: + case XML_TYPE_GUI: mainCfgs.push_back(loadCfgImpl<XmlGuiConfig>(*i, savedException).mainCfg); //throw (xmlAccess::XmlError) break; - case XML_BATCH_CONFIG: + case XML_TYPE_BATCH: mainCfgs.push_back(loadCfgImpl<XmlBatchConfig>(*i, savedException).mainCfg); //throw (xmlAccess::XmlError) break; - case XML_GLOBAL_SETTINGS: - case XML_REAL_CONFIG: - case XML_OTHER: + case XML_TYPE_GLOBAL: + case XML_TYPE_OTHER: break; } } @@ -1136,3 +1226,113 @@ void xmlAccess::convertConfig(const std::vector<wxString>& filenames, XmlBatchCo { mergeConfigFilesImpl(filenames, config); //throw (xmlAccess::XmlError) } + + + + + + + +void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlGuiConfig& config) +{ + //load XML + if (!fileExists(wxToZ(filename))) + throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); + + TiXmlDocument doc; + loadXmlDocument(filename, doc); //throw (XmlError) + + if (getXmlType(doc) != XML_TYPE_GUI) //throw() + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); + + FfsXmlErrorLogger logger; + logger.readConfig(doc.RootElement(), config); //read GUI layout configuration + + if (logger.errorsOccurred()) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + + logger.getErrorMessageFormatted(), XmlError::WARNING); +} + + +void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlBatchConfig& config) +{ + //load XML + if (!fileExists(wxToZ(filename))) + throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\"")); + + TiXmlDocument doc; + loadXmlDocument(filename, doc); //throw (XmlError) + + if (getXmlType(doc) != XML_TYPE_BATCH) //throw() + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); + + FfsXmlErrorLogger logger; + logger.readConfig(doc.RootElement(), config); //read GUI layout configuration + + if (logger.errorsOccurred()) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") + + logger.getErrorMessageFormatted(), XmlError::WARNING); +} + + +void xmlAccess::readConfig(xmlAccess::XmlGlobalSettings& config) +{ + //load XML + if (!fileExists(wxToZ(getGlobalConfigFile()))) + throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"")); + + TiXmlDocument doc; + loadXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError) + + if (getXmlType(doc) != XML_TYPE_GLOBAL) //throw() + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"")); + + FfsXmlErrorLogger logger; + logger.readConfig(doc.RootElement(), config); //read GUI layout configuration + + if (logger.errorsOccurred()) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"\n\n") + + logger.getErrorMessageFormatted(), XmlError::WARNING); +} + + +void xmlAccess::writeConfig(const XmlGuiConfig& outputCfg, const wxString& filename) +{ + TiXmlDocument doc; + initXmlDocument(doc, XML_TYPE_GUI); //throw() + + if (!doc.RootElement()) + throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); + + writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings + + saveXmlDocument(filename, doc); //throw (XmlError) +} + + +void xmlAccess::writeConfig(const XmlBatchConfig& outputCfg, const wxString& filename) +{ + TiXmlDocument doc; + initXmlDocument(doc, XML_TYPE_BATCH); //throw() + + if (!doc.RootElement()) + throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\"")); + + writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings + + saveXmlDocument(filename, doc); //throw (XmlError) +} + + +void xmlAccess::writeConfig(const XmlGlobalSettings& outputCfg) +{ + TiXmlDocument doc; + initXmlDocument(doc, XML_TYPE_GLOBAL); //throw() + + if (!doc.RootElement()) + throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"")); + + writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings + + saveXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError) +} diff --git a/library/process_xml.h b/library/process_xml.h index d627fc18..de566d15 100644 --- a/library/process_xml.h +++ b/library/process_xml.h @@ -7,13 +7,27 @@ #ifndef PROCESSXML_H_INCLUDED #define PROCESSXML_H_INCLUDED +#include "../shared/xml_base.h" #include "../structures.h" #include "../shared/xml_error.h" -#include "../shared/i18n.h" +#include "../shared/localization.h" namespace xmlAccess { +enum XmlType +{ + XML_TYPE_GUI, + XML_TYPE_BATCH, + XML_TYPE_GLOBAL, + XML_TYPE_OTHER +}; + +XmlType getXmlType(const TiXmlDocument& doc); //throw() +XmlType getXmlType(const wxString& filename); //throw() +void initXmlDocument(TiXmlDocument& doc, XmlType type); //throw() + + enum OnError { ON_ERROR_POPUP, @@ -21,6 +35,12 @@ enum OnError ON_ERROR_EXIT }; +enum OnGuiError +{ + ON_GUIERROR_POPUP, + ON_GUIERROR_IGNORE +}; + enum ColumnTypes { DIRECTORY, //this needs to begin with 0 and be continuous (some code relies on it) @@ -52,20 +72,21 @@ struct XmlGuiConfig { XmlGuiConfig() : hideFilteredElements(false), - ignoreErrors(false), + handleError(ON_GUIERROR_POPUP), syncPreviewEnabled(true) {} //initialize values - ffs3::MainConfiguration mainCfg; + zen::MainConfiguration mainCfg; bool hideFilteredElements; - bool ignoreErrors; //reaction on error situation during synchronization + + OnGuiError handleError; //reaction on error situation during synchronization bool syncPreviewEnabled; bool operator==(const XmlGuiConfig& other) const { return mainCfg == other.mainCfg && hideFilteredElements == other.hideFilteredElements && - ignoreErrors == other.ignoreErrors && + handleError == other.handleError && syncPreviewEnabled == other.syncPreviewEnabled; } @@ -83,7 +104,7 @@ struct XmlBatchConfig logFileCountMax(200), handleError(ON_ERROR_POPUP) {} - ffs3::MainConfiguration mainCfg; + zen::MainConfiguration mainCfg; bool silent; wxString logFileDirectory; @@ -119,7 +140,7 @@ struct XmlGlobalSettings //--------------------------------------------------------------------- //Shared (GUI/BATCH) settings XmlGlobalSettings() : - programLanguage(ffs3::retrieveSystemLanguage()), + programLanguage(zen::retrieveSystemLanguage()), copyLockedFiles(true), copyFilePermissions(false), fileTimeTolerance(2), //default 2s: FAT vs NTFS @@ -145,8 +166,7 @@ struct XmlGlobalSettings isMaximized(false), autoAdjustColumnsLeft(false), autoAdjustColumnsRight(false), - folderHistLeftMax(12), - folderHistRightMax(12), + folderHistMax(12), deleteOnBothSides(false), useRecyclerForManualDeletion(true), //enable if OS supports it; else user will have to activate first and then get an error message #ifdef FFS_WIN @@ -164,7 +184,7 @@ struct XmlGlobalSettings externelApplications.push_back(std::make_pair(wxT("Show in Explorer"), //mark for extraction: _("Show in Explorer") wxT("explorer /select, \"%name\""))); externelApplications.push_back(std::make_pair(wxT("Open with default application"), //mark for extraction: _("Open with default application") - wxT("cmd /c start \"\" \"%name\""))); + wxT("\"%name\""))); #elif defined FFS_LINUX externelApplications.push_back(std::make_pair(wxT("Browse directory"), //mark for extraction: _("Browse directory") wxT("xdg-open \"%dir\""))); @@ -191,10 +211,8 @@ struct XmlGlobalSettings wxString lastUsedConfigFile; std::vector<wxString> folderHistoryLeft; - unsigned int folderHistLeftMax; - std::vector<wxString> folderHistoryRight; - unsigned int folderHistRightMax; + unsigned int folderHistMax; bool deleteOnBothSides; bool useRecyclerForManualDeletion; diff --git a/library/resources.cpp b/library/resources.cpp index d07e66a8..abdfdf51 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -15,7 +15,7 @@ #include <memory> #include "../shared/standard_paths.h" -using namespace ffs3; +using namespace zen; const GlobalResources& GlobalResources::instance() @@ -69,7 +69,7 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation* animation) void GlobalResources::load() { - wxFFileInputStream input(ffs3::getResourceDir() + wxT("Resources.dat")); + wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files diff --git a/library/soft_filter.cpp b/library/soft_filter.cpp deleted file mode 100644 index 1c191b98..00000000 --- a/library/soft_filter.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#include "soft_filter.h" - - - diff --git a/library/soft_filter.h b/library/soft_filter.h index 4e6732a3..82ba0ba2 100644 --- a/library/soft_filter.h +++ b/library/soft_filter.h @@ -4,47 +4,53 @@ // * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * // ************************************************************************** // -#ifndef SOFTFILTER_H_INCLUDED -#define SOFTFILTER_H_INCLUDED +#ifndef SOFT_FILTER_H_INCLUDED +#define SOFT_FILTER_H_INCLUDED -#include "../file_hierarchy.h" -#include <wx/timer.h> +#include <algorithm> +#include <limits> +#include "../structures.h" +#include <wx/stopwatch.h> + +namespace zen +{ /* Semantics of SoftFilter: 1. It potentially may match only one side => it MUST NOT be applied while traversing a single folder to avoid mismatches 2. => it is applied after traversing and just marks rows, (NO deletions after comparison are allowed) -3. => not relevant for <Automatic>-mode! ;) - --> SoftFilter is equivalent to a user temporarily (de-)selecting rows +3. => equivalent to a user temporarily (de-)selecting rows -> not relevant for <Automatic>-mode! ;) */ -namespace ffs3 -{ - class SoftFilter { public: - SoftFilter(size_t timeWindow) : - timeWindow_(timeWindow), - currentTime(wxGetUTCTime()) {} + SoftFilter(size_t timeSpan, UnitTime unitTimeSpan, + size_t sizeMin, UnitSize unitSizeMin, + size_t sizeMax, UnitSize unitSizeMax); - // typedef boost::shared_ptr<const SoftFilter> FilterRef; //always bound by design! + bool matchTime(zen::Int64 writeTime) const { return currentTime - writeTime <= timeSpan_; } + bool matchSize(zen::UInt64 fileSize) const { return sizeMin_ <= fileSize && fileSize <= sizeMax_; } + bool isNull() const; //filter is equivalent to NullFilter, but may be technically slower - bool passFilter(const FileMapping& fileMap) const; - bool passFilter(const DirMapping& dirMap) const; + //small helper method: merge two soft filters + friend SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second); private: - const size_t timeWindow_; //point in time from "now" (in seconds) for oldest modification date to be allowed - const long currentTime; //number of seconds since GMT 00:00:00 Jan 1st 1970. + SoftFilter(zen::Int64 timeSpan, + zen::UInt64 sizeMin, + zen::UInt64 sizeMax); + + zen::Int64 timeSpan_; //unit: seconds + zen::UInt64 sizeMin_; //unit: bytes + zen::UInt64 sizeMax_; //unit: bytes + zen::Int64 currentTime; }; +} + + + -//SoftFilter::FilterRef combineFilters(const SoftFilter& first, -// const SoftFilter& second); -// -// -// -// @@ -62,22 +68,54 @@ private: -//---------------Inline Implementation--------------------------------------------------- + + + + + + + +// ----------------------- implementation ----------------------- +namespace zen +{ inline -bool SoftFilter::passFilter(const FileMapping& fileMap) const +SoftFilter::SoftFilter(size_t timeSpan, UnitTime unitTimeSpan, + size_t sizeMin, UnitSize unitSizeMin, + size_t sizeMax, UnitSize unitSizeMax) : + currentTime(wxGetUTCTime()) { - return (!fileMap.isEmpty<LEFT_SIDE>() && - currentTime <= fileMap.getLastWriteTime<LEFT_SIDE>() + timeWindow_) || - (!fileMap.isEmpty<RIGHT_SIDE>() && - currentTime <= fileMap.getLastWriteTime<RIGHT_SIDE>() + timeWindow_); + zen::resolveUnits(timeSpan, unitTimeSpan, + sizeMin, unitSizeMin, + sizeMax, unitSizeMax, + timeSpan_, //unit: seconds + sizeMin_, //unit: bytes + sizeMax_); //unit: bytes } +inline +SoftFilter::SoftFilter(zen::Int64 timeSpan, + zen::UInt64 sizeMin, + zen::UInt64 sizeMax) : + timeSpan_(timeSpan), + sizeMin_ (sizeMin), + sizeMax_ (sizeMax), + currentTime(wxGetUTCTime()) {} + +inline +SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second) +{ + return SoftFilter(std::min(first.timeSpan_, second.timeSpan_), + std::max(first.sizeMin_, second.sizeMin_), + std::min(first.sizeMax_, second.sizeMax_)); +} inline -bool SoftFilter::passFilter(const DirMapping& dirMap) const +bool SoftFilter::isNull() const //filter is equivalent to NullFilter, but may be technically slower { - return false; + return timeSpan_ == std::numeric_limits<zen::Int64>::max() && + sizeMin_ == 0U && + sizeMax_ == std::numeric_limits<zen::UInt64>::max(); } } -#endif // SOFTFILTER_H_INCLUDED +#endif // SOFT_FILTER_H_INCLUDED diff --git a/library/statistics.cpp b/library/statistics.cpp index d5cce670..c2ba8c0c 100644 --- a/library/statistics.cpp +++ b/library/statistics.cpp @@ -16,6 +16,8 @@ #include "../shared/assert_static.h" +using namespace zen; + RetrieveStatistics::RetrieveStatistics() : timer(new wxStopWatch) {} @@ -31,12 +33,11 @@ RetrieveStatistics::~RetrieveStatistics() for (std::vector<StatEntry>::const_iterator i = data.begin(); i != data.end(); ++i) { - using common::numberToString; - outputFile.Write(numberToString(i->time)); + outputFile.Write(toString<wxString>(i->time)); outputFile.Write(wxT(";")); - outputFile.Write(numberToString(i->objects)); + outputFile.Write(toString<wxString>(i->objects)); outputFile.Write(wxT(";")); - outputFile.Write(numberToString(i->value)); + outputFile.Write(toString<wxString>(i->value)); outputFile.Write(wxT("\n")); } } @@ -64,26 +65,34 @@ bool isNull(T number) } +enum UnitRemTime +{ + URT_SEC, + URT_MIN, + URT_HOUR, + URT_DAY +}; + + inline wxString Statistics::formatRemainingTime(double timeInMs) const { - bool unitSec = true; double remainingTime = timeInMs / 1000; - wxString output = _("%x sec"); + //determine preferred unit + UnitRemTime unit = URT_SEC; if (remainingTime > 55) { - unitSec = false; + unit = URT_MIN; remainingTime /= 60; - output = _("%x min"); if (remainingTime > 59) { + unit = URT_HOUR; remainingTime /= 60; - output = _("%x hour(s)"); if (remainingTime > 23) { + unit = URT_DAY; remainingTime /= 24; - output = _("%x day(s)"); } } } @@ -91,14 +100,14 @@ wxString Statistics::formatRemainingTime(double timeInMs) const int formattedTime = common::round(remainingTime); //reduce precision to 5 seconds - if (unitSec && formattedTime % 5 != 0) + if (unit == URT_SEC && formattedTime % 5 != 0) formattedTime += 5 - formattedTime % 5; //"ceiling" //avoid "jumping back and forth" when fluctuating around .5 if (remainingTimeLast < formattedTime) { - if (unitSec) + if (unit == URT_SEC) { formattedTime = common::round(remainingTime); formattedTime -= formattedTime % 5; //"floor" @@ -108,8 +117,24 @@ wxString Statistics::formatRemainingTime(double timeInMs) const } remainingTimeLast = formattedTime; - output.Replace(wxT("%x"), common::numberToString(formattedTime)); - + //generate output message + wxString output; + switch (unit) + { + case URT_SEC: + output = _P("1 sec", "%x sec", formattedTime); + break; + case URT_MIN: + output = _P("1 min", "%x min", formattedTime); + break; + case URT_HOUR: + output = _P("1 hour", "%x hours", formattedTime); + break; + case URT_DAY: + output = _P("1 day", "%x days", formattedTime); + break; + } + output.Replace(wxT("%x"), zen::toStringSep(formattedTime)); return output; //+ wxT("(") + common::numberToWxString(common::round(timeInMs / 1000)) + wxT(")"); } @@ -144,10 +169,10 @@ void Statistics::addMeasurement(int objectsCurrent, double dataCurrent) //insert new record if (!measurements.empty()) - { - //assert(dataCurrent >= (--measurements.end())->second.data); - measurements.insert(--measurements.end(), newEntry); //use fact that time is monotonously ascending - } + { + //assert(dataCurrent >= (--measurements.end())->second.data); + measurements.insert(--measurements.end(), newEntry); //use fact that time is monotonously ascending + } else measurements.insert(newEntry); @@ -202,7 +227,7 @@ wxString Statistics::getBytesPerSecond() const const double dataDelta = backRecord.second.data - frontRecord.second.data; if (!isNull(timeDelta)) - return ffs3::formatFilesizeToShortString(dataDelta * 1000 / timeDelta) + _("/sec"); + return zen::formatFilesizeToShortString(zen::UInt64(dataDelta * 1000 / timeDelta)) + _("/sec"); } return wxT("-"); //fallback @@ -273,7 +298,7 @@ wxString Statistics::getRemainingTime(const int objectsCurrent, const double dat const double X = dataCurrent - dataLast; dataLast = dataCurrent; - const wxLongLong timeCurrent = wxGetLocalTimeMillis(); + const zen::Int64 timeCurrent = wxGetLocalTimeMillis(); const double F = (timeCurrent - timeLast).ToDouble(); timeLast = timeCurrent; @@ -298,7 +323,7 @@ wxString Statistics::getRemainingTime(const int objectsCurrent, const double dat const double X = dataCurrent - dataLast; //do not set dataLast, timeLast variables here, but write dummy record instead if (!isNull(X)) { - const wxLongLong timeCurrent = wxGetLocalTimeMillis(); + const zen::Int64 timeCurrent = wxGetLocalTimeMillis(); const double F = (timeCurrent - timeLast).ToDouble(); record modifyEntry; diff --git a/library/status_handler.cpp b/library/status_handler.cpp index e81746a4..0a131899 100644 --- a/library/status_handler.cpp +++ b/library/status_handler.cpp @@ -21,8 +21,8 @@ void updateUiNow() bool updateUiIsAllowed() { - static wxLongLong lastExec = 0; - const wxLongLong newExec = wxGetLocalTimeMillis(); + static wxMilliClock_t lastExec = 0; + const wxMilliClock_t newExec = wxGetLocalTimeMillis(); if (newExec - lastExec >= UI_UPDATE_INTERVAL) //perform ui updates not more often than necessary { diff --git a/library/status_handler.h b/library/status_handler.h index 2dde4fd9..c3a016d5 100644 --- a/library/status_handler.h +++ b/library/status_handler.h @@ -7,9 +7,9 @@ #ifndef STATUSHANDLER_H_INCLUDED #define STATUSHANDLER_H_INCLUDED -#include <wx/longlong.h> +#include <wx/string.h> #include "../shared/zstring.h" - +#include "../shared/int64.h" const int UI_UPDATE_INTERVAL = 100; //perform ui updates not more often than necessary, 100 seems to be a good value with only a minimal performance loss @@ -35,11 +35,10 @@ public: }; -class StatusHandler +//report status during comparison and synchronization +struct ProcessCallback { -public: - StatusHandler() : abortRequested(false) {} - virtual ~StatusHandler() {} + virtual ~ProcessCallback() {} //identifiers of different phases enum Process @@ -51,54 +50,56 @@ public: }; //these methods have to be implemented in the derived classes to handle error and status information - virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on - virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) = 0; //called periodically after data was processed + virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on + virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) = 0; //called periodically after data was processed virtual void reportInfo(const Zstring& text) = 0; //this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events virtual void forceUiRefresh() = 0; - void requestUiRefresh(bool allowAbort = true); //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh() - void requestAbortion(); //this does NOT call abortThisProcess immediately, but when appropriate (e.g. async. processes finished) - bool abortIsRequested(); + virtual void requestUiRefresh(bool allowExceptions = true) = 0; //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh() + + virtual bool abortIsRequested() = 0; //thanks to Windows C-Api not supporting exceptions we need this one... //error handling: virtual ErrorHandler::Response reportError(const wxString& errorMessage) = 0; //recoverable error situation virtual void reportFatalError(const wxString& errorMessage) = 0; //non-recoverable error situation, implement abort! - virtual void reportWarning(const wxString& warningMessage, bool& warningActive) = 0; + virtual void reportWarning (const wxString& warningMessage, bool& warningActive) = 0; +}; -private: - virtual void abortThisProcess() = 0; - bool abortRequested; +//gui may want to abort process +struct AbortCallback +{ + virtual ~AbortCallback() {} + virtual void requestAbortion() = 0; }; - -//############################################################################## -inline -void StatusHandler::requestUiRefresh(bool allowAbort) +//actual callback implementation will have to satisfy "process" and "gui" +class StatusHandler : public ProcessCallback, public AbortCallback { - if (updateUiIsAllowed()) //test if specific time span between ui updates is over - forceUiRefresh(); +public: + StatusHandler() : abortRequested(false) {} - if (abortRequested && allowAbort) - abortThisProcess(); //abort can be triggered by requestAbortion() -} + virtual void requestUiRefresh(bool allowExceptions) + { + if (updateUiIsAllowed()) //test if specific time span between ui updates is over + forceUiRefresh(); + if (abortRequested && allowExceptions) + abortThisProcess(); //abort can be triggered by requestAbortion() + } -inline -void StatusHandler::requestAbortion() -{ - abortRequested = true; -} + virtual void requestAbortion() { abortRequested = true; } //this does NOT call abortThisProcess immediately, but when appropriate (e.g. async. processes finished) + virtual bool abortIsRequested() { return abortRequested; } + virtual void abortThisProcess() = 0; + +private: + bool abortRequested; +}; -inline -bool StatusHandler::abortIsRequested() -{ - return abortRequested; -} #endif // STATUSHANDLER_H_INCLUDED diff --git a/shared/IFileOperation/file_op.h b/shared/IFileOperation/file_op.h index a7b0434f..25098e45 100644 --- a/shared/IFileOperation/file_op.h +++ b/shared/IFileOperation/file_op.h @@ -45,9 +45,9 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen); |symbol names| --------------*/ //(use const pointers to ensure internal linkage) -const char* const moveToRecycleBinFctName = "moveToRecycleBin"; -const char* const copyFileFctName = "copyFile"; -const char* const getLastErrorFctName = "getLastError"; +const char moveToRecycleBinFctName[] = "moveToRecycleBin"; +const char copyFileFctName[] = "copyFile"; +const char getLastErrorFctName[] = "getLastError"; } diff --git a/shared/ShadowCopy/shadow.h b/shared/ShadowCopy/shadow.h index 5495633d..a96d8578 100644 --- a/shared/ShadowCopy/shadow.h +++ b/shared/ShadowCopy/shadow.h @@ -58,8 +58,8 @@ typedef void (*ReleaseShadowCopyFct)(ShadowHandle handle); |symbol names| --------------*/ //(use const pointers to ensure internal linkage) -const char* const createShadowCopyFctName = "createShadowCopy"; -const char* const releaseShadowCopyFctName = "releaseShadowCopy"; +const char createShadowCopyFctName[] = "createShadowCopy"; +const char releaseShadowCopyFctName[] = "releaseShadowCopy"; } diff --git a/shared/Taskbar_Seven/taskbar.h b/shared/Taskbar_Seven/taskbar.h index 7b6efbb5..d52420ab 100644 --- a/shared/Taskbar_Seven/taskbar.h +++ b/shared/Taskbar_Seven/taskbar.h @@ -57,9 +57,9 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen); |symbol names| --------------*/ //(use const pointers to ensure internal linkage) -const char* const setStatusFctName = "setStatus"; -const char* const setProgressFctName = "setProgress"; -const char* const getLastErrorFctName = "getLastError"; +const char setStatusFctName[] = "setStatus"; +const char setProgressFctName[] = "setProgress"; +const char getLastErrorFctName[] = "getLastError"; } #endif //TASKBAR_SEVEN_DLL_H diff --git a/shared/app_main.cpp b/shared/app_main.cpp index 6b87cf45..b727724f 100644 --- a/shared/app_main.cpp +++ b/shared/app_main.cpp @@ -8,13 +8,13 @@ #include <wx/window.h> #include <wx/app.h> -using namespace ffs3; +using namespace zen; bool AppMainWindow::mainWndActive = false; -void ffs3::AppMainWindow::setMainWindow(wxWindow* window) +void zen::AppMainWindow::setMainWindow(wxWindow* window) { wxTheApp->SetTopWindow(window); wxTheApp->SetExitOnFrameDelete(true); diff --git a/shared/app_main.h b/shared/app_main.h index bdfb9b08..33ddcfb6 100644 --- a/shared/app_main.h +++ b/shared/app_main.h @@ -9,7 +9,7 @@ class wxWindow; -namespace ffs3 +namespace zen { //just some wrapper around a global variable representing the (logical) main application window class AppMainWindow diff --git a/shared/assert_static.h b/shared/assert_static.h index 198943cf..37705ded 100644 --- a/shared/assert_static.h +++ b/shared/assert_static.h @@ -11,7 +11,7 @@ #ifdef NDEBUG -#define assert_static(x) ((void)0) +#define assert_static(x) //((void)0) -> leads to error when seen in namespace scope! #else /* debugging enabled */ namespace StaticCheckImpl diff --git a/shared/check_exist.cpp b/shared/check_exist.cpp index 97a25ec8..218b1a0c 100644 --- a/shared/check_exist.cpp +++ b/shared/check_exist.cpp @@ -81,11 +81,13 @@ util::ResultExist checkExistence(const Zstring& objName, size_t timeout) //timeo util::ResultExist util::fileExists(const Zstring& filename, size_t timeout) //timeout in ms { - return ::checkExistence<ffs3::fileExists>(filename, timeout); + assert(!filename.empty()); + return ::checkExistence<zen::fileExists>(filename, timeout); } util::ResultExist util::dirExists(const Zstring& dirname, size_t timeout) //timeout in ms { - return ::checkExistence<ffs3::dirExists>(dirname, timeout); + assert(!dirname.empty()); + return ::checkExistence<zen::dirExists>(dirname, timeout); } diff --git a/shared/dir_name.cpp b/shared/dir_name.cpp index 977751f5..dda9407e 100644 --- a/shared/dir_name.cpp +++ b/shared/dir_name.cpp @@ -17,39 +17,13 @@ #include "i18n.h" #include "system_constants.h" +using namespace zen; -//define new event type -const wxEventType FFS_DROP_FILE_EVENT = wxNewEventType(); -typedef void (wxEvtHandler::*FFSFileDropEventFunction)(FFSFileDropEvent&); - -#define FFSFileDropEventHandler(func) \ - (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(FFSFileDropEventFunction, &func) - -struct FFSFileDropEvent : public wxCommandEvent -{ - FFSFileDropEvent(const std::vector<wxString>& filesDropped, const wxWindow& dropWindow) : - wxCommandEvent(FFS_DROP_FILE_EVENT), - filesDropped_(filesDropped), - dropWindow_(dropWindow) {} - - virtual wxEvent* Clone() const - { - return new FFSFileDropEvent(filesDropped_, dropWindow_); - } - - const std::vector<wxString> filesDropped_; - const wxWindow& dropWindow_; -}; - - -//############################################################################################################## namespace { void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, wxStaticBoxSizer* staticBox, size_t timeout) { - using namespace ffs3; - const wxString dirFormatted = zToWx(getFormattedDirectoryName(wxToZ(dirname))); tooltipWnd.SetToolTip(dirFormatted); //wxComboBox bug: the edit control is not updated... hope this will be fixed: http://trac.wxwidgets.org/ticket/12659 @@ -68,7 +42,7 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w if (dirPicker) { - if (util::dirExists(wxToZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most + if (!dirFormatted.empty() && util::dirExists(wxToZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most dirPicker->SetPath(dirFormatted); } } @@ -105,33 +79,7 @@ void setDirectoryName(const wxString& dirname, //############################################################################################################## -class WindowDropTarget : public wxFileDropTarget -{ -public: - WindowDropTarget(wxWindow& dropWindow) : dropWindow_(dropWindow) {} - - virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray) - { - std::vector<wxString> filenames; - for (size_t i = 0; i < fileArray.GetCount(); ++i) - filenames.push_back(fileArray[i]); - - if (!filenames.empty()) - { - //create a custom event on drop window: execute event after file dropping is completed! (e.g. after mouse is released) - FFSFileDropEvent evt(filenames, dropWindow_); - dropWindow_.GetEventHandler()->AddPendingEvent(evt); - } - return false; - } - -private: - wxWindow& dropWindow_; -}; - - -//############################################################################################################## -using ffs3::DirectoryNameMainDlg; +using zen::DirectoryNameMainDlg; DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1, wxWindow& dropWindow2, @@ -145,8 +93,8 @@ DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1, staticBox_(staticBox) { //prepare drag & drop - dropWindow1.SetDropTarget(new WindowDropTarget(dropWindow1)); //takes ownership - dropWindow2.SetDropTarget(new WindowDropTarget(dropWindow2)); //takes ownership + setupFileDrop(dropWindow1); + setupFileDrop(dropWindow2); //redirect drag & drop event back to this class dropWindow1.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryNameMainDlg::OnFilesDropped), NULL, this); @@ -160,23 +108,19 @@ DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1, void DirectoryNameMainDlg::OnFilesDropped(FFSFileDropEvent& event) { - if (event.filesDropped_.empty()) + if (event.getFiles().empty()) return; - if (&dropWindow1_ == &event.dropWindow_ || //file may be dropped on window 1 or 2 - &dropWindow2_ == &event.dropWindow_) + if (AcceptDrop(event.getFiles())) { - if (AcceptDrop(event.filesDropped_)) + Zstring fileName = wxToZ(event.getFiles()[0]); + if (dirExists(fileName)) + setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); + else { - Zstring fileName = wxToZ(event.filesDropped_[0]); + fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR); if (dirExists(fileName)) setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); - else - { - fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR); - if (dirExists(fileName)) - setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); - } } } } @@ -198,20 +142,20 @@ void DirectoryNameMainDlg::OnDirSelected(wxFileDirPickerEvent& event) } -Zstring DirectoryNameMainDlg::getName() const +wxString DirectoryNameMainDlg::getName() const { - return wxToZ(dirName_.GetValue()); + return dirName_.GetValue(); } -void DirectoryNameMainDlg::setName(const Zstring& dirname) +void DirectoryNameMainDlg::setName(const wxString& dirname) { - setDirectoryName(zToWx(dirname), &dirName_, &dirPicker_, dirName_, staticBox_); + setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_); } //############################################################################################################## -using ffs3::DirectoryName; +using zen::DirectoryName; DirectoryName::DirectoryName(wxWindow& dropWindow, wxDirPickerCtrl& dirPicker, @@ -223,7 +167,7 @@ DirectoryName::DirectoryName(wxWindow& dropWindow, staticBox_(staticBox) { //prepare drag & drop - dropWindow.SetDropTarget(new WindowDropTarget(dropWindow)); //takes ownership + setupFileDrop(dropWindow); //redirect drag & drop event back to this class dropWindow.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryName::OnFilesDropped), NULL, this); @@ -236,20 +180,17 @@ DirectoryName::DirectoryName(wxWindow& dropWindow, void DirectoryName::OnFilesDropped(FFSFileDropEvent& event) { - if (event.filesDropped_.empty()) + if (event.getFiles().empty()) return; - if (&dropWindow_ == &event.dropWindow_) + Zstring fileName = wxToZ(event.getFiles()[0]); + if (dirExists(fileName)) + setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); + else { - Zstring fileName = wxToZ(event.filesDropped_[0]); + fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR); if (dirExists(fileName)) setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); - else - { - fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR); - if (dirExists(fileName)) - setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_); - } } } @@ -270,13 +211,13 @@ void DirectoryName::OnDirSelected(wxFileDirPickerEvent& event) } -Zstring DirectoryName::getName() const +wxString DirectoryName::getName() const { - return wxToZ(dirName_.GetValue()); + return dirName_.GetValue(); } -void DirectoryName::setName(const Zstring& dirname) +void DirectoryName::setName(const wxString& dirname) { - setDirectoryName(zToWx(dirname), &dirName_, &dirPicker_, dirName_, staticBox_); + setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_); } diff --git a/shared/dir_name.h b/shared/dir_name.h index 387f5668..4bf07231 100644 --- a/shared/dir_name.h +++ b/shared/dir_name.h @@ -7,19 +7,17 @@ #ifndef DRAGANDDROP_H_INCLUDED #define DRAGANDDROP_H_INCLUDED -#include <wx/event.h> #include <vector> +#include <wx/event.h> #include <wx/sizer.h> #include <wx/filepicker.h> #include <wx/combobox.h> -#include "zstring.h" +#include "file_drop.h" -struct FFSFileDropEvent; -class wxCommandEvent; class wxFileDirPickerEvent; -namespace ffs3 +namespace zen { //handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxDirPickerCtrl, and wxComboBox/wxTextCtrl @@ -34,8 +32,8 @@ public: virtual ~DirectoryNameMainDlg() {} - Zstring getName() const; - void setName(const Zstring& dirname); + wxString getName() const; + void setName(const wxString& dirname); virtual bool AcceptDrop(const std::vector<wxString>& droppedFiles) = 0; //return true if drop should be processed @@ -60,8 +58,8 @@ public: wxTextCtrl& dirName, wxStaticBoxSizer* staticBox = NULL); //optional - Zstring getName() const; - void setName(const Zstring& dirname); + wxString getName() const; + void setName(const wxString& dirname); private: void OnFilesDropped(FFSFileDropEvent& event); diff --git a/shared/disable_standby.h b/shared/disable_standby.h index 399d0b9c..1a2a2b8a 100644 --- a/shared/disable_standby.h +++ b/shared/disable_standby.h @@ -10,20 +10,17 @@ namespace util class DisableStandby { public: +#ifdef FFS_WIN DisableStandby() { -#ifdef FFS_WIN ::SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED /* | ES_AWAYMODE_REQUIRED*/ ); -#endif } ~DisableStandby() { -#ifdef FFS_WIN ::SetThreadExecutionState(ES_CONTINUOUS); -#endif } - +#endif }; } diff --git a/shared/dll_loader.cpp b/shared/dll_loader.cpp index 03b9bf6e..e942a168 100644 --- a/shared/dll_loader.cpp +++ b/shared/dll_loader.cpp @@ -5,9 +5,7 @@ // ************************************************************************** // #include "dll_loader.h" -#include <wx/msw/wrapwin.h> //includes "windows.h" #include <map> -#include <cassert> namespace { diff --git a/shared/dll_loader.h b/shared/dll_loader.h index 24dd4f14..6dedc06e 100644 --- a/shared/dll_loader.h +++ b/shared/dll_loader.h @@ -8,7 +8,14 @@ #define DLLLOADER_H_INCLUDED #include <string> + +#ifdef __WXMSW__ //we have wxWidgets #include <wx/msw/wrapwin.h> //includes "windows.h" +#else +#include <windows.h> +#undef max +#undef min +#endif namespace util diff --git a/shared/dst_hack.cpp b/shared/dst_hack.cpp index 5ec58e06..72267e54 100644 --- a/shared/dst_hack.cpp +++ b/shared/dst_hack.cpp @@ -3,14 +3,14 @@ #include "i18n.h" #include "long_path_prefix.h" #include "string_conv.h" -#include "system_func.h" -#include <wx/longlong.h> +#include "last_error.h" #include "assert_static.h" #include <bitset> #include "global_func.h" #include <limits> +#include "int64.h" -using namespace ffs3; +using namespace zen; namespace @@ -58,7 +58,7 @@ Zstring getVolumeName(const Zstring& filename) bool dst::isFatDrive(const Zstring& fileName) //throw() { - using namespace ffs3; + using namespace zen; const size_t BUFFER_SIZE = MAX_PATH + 1; wchar_t fsName[BUFFER_SIZE]; @@ -90,6 +90,40 @@ bool dst::isFatDrive(const Zstring& fileName) //throw() namespace { +//convert zen::UInt64 and zen::Int64 to FILETIME +inline +FILETIME toFiletime(zen::Int64 number) +{ + const zen::UInt64 unsig = to<zen::UInt64>(number); + + FILETIME output = {}; + output.dwLowDateTime = unsig.getLo(); + output.dwHighDateTime = unsig.getHi(); + return output; +} + +FILETIME toFiletime(zen::UInt64 number) +{ + FILETIME output = {}; + output.dwLowDateTime = number.getLo(); + output.dwHighDateTime = number.getHi(); + return output; +} + +inline +zen::UInt64 toUInt64(const FILETIME& fileTime) +{ + return zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime); +} + + +inline +zen::Int64 toInt64(const FILETIME& fileTime) +{ + return to<zen::Int64>(zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime)); +} + + FILETIME utcToLocal(const FILETIME& utcTime) //throw (std::runtime_error) { //treat binary local time representation (which is invariant under DST time zone shift) as logical UTC: @@ -98,8 +132,9 @@ FILETIME utcToLocal(const FILETIME& utcTime) //throw (std::runtime_error) &utcTime, //__in const FILETIME *lpFileTime, &localTime)) //__out LPFILETIME lpLocalFileTime { - const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") + - wxT("(") + wxULongLong(utcTime.dwHighDateTime, utcTime.dwLowDateTime).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted(); + const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") + wxT("(") + + wxT("High: ") + Zstring::fromNumber(utcTime.dwHighDateTime) + wxT(" ") + + wxT("Low: ") + Zstring::fromNumber(utcTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted(); throw std::runtime_error(std::string((errorMessage).ToUTF8())); } return localTime; @@ -114,58 +149,15 @@ FILETIME localToUtc(const FILETIME& localTime) //throw (std::runtime_error) &localTime, //__in const FILETIME *lpLocalFileTime, &utcTime)) //__out LPFILETIME lpFileTime { - const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" local FILETIME -> FILETIME: ") + - wxT("(") + wxULongLong(localTime.dwHighDateTime, localTime.dwLowDateTime).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted(); + const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" local FILETIME -> FILETIME: ") + wxT("(") + + wxT("High: ") + Zstring::fromNumber(localTime.dwHighDateTime) + wxT(" ") + + wxT("Low: ") + Zstring::fromNumber(localTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted(); throw std::runtime_error(std::string((errorMessage).ToUTF8())); } return utcTime; } -int cmpFileTime(const FILETIME& a, const FILETIME& b) -{ - if (a.dwHighDateTime != b.dwHighDateTime) - return a.dwHighDateTime - b.dwHighDateTime; - return a.dwLowDateTime - b.dwLowDateTime; -} - - -template <class T> //convert wxULongLong and wxLongLong to FILETIME -inline -FILETIME toFiletime(const T& number) -{ - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); - assert(number.GetHi() >= 0); //for wxLongLong - - FILETIME output = {}; - output.dwHighDateTime = number.GetHi(); - output.dwLowDateTime = number.GetLo(); - return output; -} - - -inline -wxULongLong toULonglong(const FILETIME& fileTime) -{ - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); - - return wxULongLong(fileTime.dwHighDateTime, fileTime.dwLowDateTime); -} - - -inline -wxLongLong toLonglong(const FILETIME& fileTime) -{ - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); - assert(fileTime.dwHighDateTime <= static_cast<unsigned long>(std::numeric_limits<long>::max())); - - return wxLongLong(fileTime.dwHighDateTime, fileTime.dwLowDateTime); -} - - //struct FILETIME {DWORD dwLowDateTime; DWORD dwHighDateTime;}; const FILETIME FAT_MIN_TIME = {13374976, 27846544}; //1980 \ both are valid max/min FAT dates for 2 second precision const FILETIME FAT_MAX_TIME = {14487552, 37251238}; //2107 / @@ -189,40 +181,38 @@ const size_t WRITE_TIME_HASH_BITS = CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_B template <size_t precision> -FILETIME encodeRawInformation(wxULongLong rawInfo) +FILETIME encodeRawInformation(zen::UInt64 rawInfo) { rawInfo *= precision; - rawInfo += toULonglong(FAT_MIN_TIME); + rawInfo += toUInt64(FAT_MIN_TIME); - assert(rawInfo <= toULonglong(FAT_MAX_TIME)); + assert(rawInfo <= toUInt64(FAT_MAX_TIME)); return toFiletime(rawInfo); } template <size_t precision> -wxULongLong extractRawInformation(const FILETIME& createTime) +zen::UInt64 extractRawInformation(const FILETIME& createTime) { - assert(cmpFileTime(FAT_MIN_TIME, createTime) <= 0); - assert(cmpFileTime(createTime, FAT_MAX_TIME) <= 0); + assert(toUInt64(FAT_MIN_TIME) <= toUInt64(createTime)); + assert(toUInt64(createTime) <= toUInt64(FAT_MAX_TIME)); //FAT create time ranges from 1980 - 2107 (2^7 years) with 1/100 seconds precision - wxULongLong rawInfo = toULonglong(createTime); - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); + zen::UInt64 rawInfo = toUInt64(createTime); - rawInfo -= toULonglong(FAT_MIN_TIME); + rawInfo -= toUInt64(FAT_MIN_TIME); rawInfo /= precision; //reduce precision (FILETIME has unit 10^-7 s) - assert(cmpFileTime(encodeRawInformation<precision>(rawInfo), createTime) == 0); //must be reversible + assert(toUInt64(encodeRawInformation<precision>(rawInfo)) == toUInt64(createTime)); //must be reversible return rawInfo; } //convert write time to it's minimal representation (no restriction to FAT range "1980 - 2107") -wxULongLong extractRawWriteTime(const FILETIME& writeTime) +zen::UInt64 extractRawWriteTime(const FILETIME& writeTime) { - wxULongLong rawInfo = toULonglong(writeTime); - assert(rawInfo % PRECISION_WRITE_TIME == 0); + zen::UInt64 rawInfo = toUInt64(writeTime); + assert(rawInfo % PRECISION_WRITE_TIME == 0U); rawInfo /= PRECISION_WRITE_TIME; //reduce precision (FILETIME has unit 10^-7 s) return rawInfo; } @@ -231,9 +221,9 @@ wxULongLong extractRawWriteTime(const FILETIME& writeTime) //files with different resolution than 2 seconds are rounded up when written to FAT FILETIME roundToFatWriteTime(const FILETIME& writeTime) { - wxULongLong rawData = toULonglong(writeTime); + zen::UInt64 rawData = toUInt64(writeTime); - if (rawData % PRECISION_WRITE_TIME != 0) + if (rawData % PRECISION_WRITE_TIME != 0U) rawData += PRECISION_WRITE_TIME; rawData /= PRECISION_WRITE_TIME; @@ -250,7 +240,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift() const FILETIME localTime = utcToLocal(utcTime); - const int timeShiftSec = ((toLonglong(localTime) - toLonglong(utcTime)) / 10000000).ToLong(); //time shift in seconds + const int timeShiftSec = to<int>((toInt64(localTime) - toInt64(utcTime)) / 10000000); //time shift in seconds const int timeShiftQuarter = timeShiftSec / (60 * 15); //time shift in quarter-hours @@ -260,7 +250,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift() timeShiftSec % (60 * 15) != 0) //all known time shift have at least 15 minute granularity! { const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" Unexpected UTC <-> local time shift: ") + - wxT("(") + wxLongLong(timeShiftSec).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted(); + wxT("(") + Zstring::fromNumber(timeShiftSec) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted(); throw std::runtime_error(std::string((errorMessage).ToUTF8())); } @@ -279,26 +269,26 @@ int convertUtcLocalShift(std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift) assert_static(UTC_LOCAL_OFFSET_BITS <= sizeof(unsigned long) * 8); return hasSign ? - rawShift.to_ulong() * 15 * 60 * -1 : - rawShift.to_ulong() * 15 * 60; + static_cast<int>(rawShift.to_ulong()) * 15 * 60 * -1 : + static_cast<int>(rawShift.to_ulong()) * 15 * 60; } } bool dst::fatHasUtcEncoded(const RawTime& rawTime) //"createTimeRaw" as retrieved by ::FindFirstFile() and ::GetFileAttributesEx(); throw (std::runtime_error) { - if (cmpFileTime(rawTime.createTimeRaw, FAT_MIN_TIME) < 0 || - cmpFileTime(FAT_MAX_TIME, rawTime.createTimeRaw) < 0) + if (toUInt64(rawTime.createTimeRaw) < toUInt64(FAT_MIN_TIME) || + toUInt64(FAT_MAX_TIME) < toUInt64(rawTime.createTimeRaw)) { assert(false); //shouldn't be possible according to FAT specification return false; } - const wxULongLong rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw)); + const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw)); assert_static(WRITE_TIME_HASH_BITS == 30); - return (extractRawWriteTime(utcToLocal(rawTime.writeTimeRaw)) & 0x3FFFFFFF) == (rawInfo & 0x3FFFFFFF) && //ensure write time wasn't changed externally - rawInfo >> (CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_BITS) == 1; //extended data available + return (extractRawWriteTime(utcToLocal(rawTime.writeTimeRaw)) & 0x3FFFFFFFU) == (rawInfo & 0x3FFFFFFFU) && //ensure write time wasn't changed externally + rawInfo >> (CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_BITS) == 1U; //extended data available } @@ -309,19 +299,19 @@ dst::RawTime dst::fatEncodeUtcTime(const FILETIME& writeTimeRealUtc) //throw (st //create time lets us store 40 bit of information //indicator that utc time is encoded -> hopefully results in a date long way in the future; but even if this bit is accidentally set, we still have the hash! - wxULongLong data = 1; + zen::UInt64 data = 1U; const std::bitset<UTC_LOCAL_OFFSET_BITS> utcShift = getUtcLocalShift(); data <<= UTC_LOCAL_OFFSET_BITS; data |= utcShift.to_ulong(); data <<= WRITE_TIME_HASH_BITS; - data |= extractRawWriteTime(utcToLocal(fatWriteTimeUtc)) & 0x3FFFFFFF; //trim to last 30 bit of information + data |= extractRawWriteTime(utcToLocal(fatWriteTimeUtc)) & 0x3FFFFFFFU; //trim to last 30 bit of information assert_static(WRITE_TIME_HASH_BITS == 30); const FILETIME encodedData = localToUtc(encodeRawInformation<PRECISION_CREATE_TIME>(data)); //localToUtc: make sure data is physically saved as FAT local time - assert(cmpFileTime(FAT_MIN_TIME, encodedData) <= 0); - assert(cmpFileTime(encodedData, FAT_MAX_TIME) <= 0); + assert(toUInt64(FAT_MIN_TIME) <= toUInt64(encodedData)); + assert(toUInt64(encodedData) <= toUInt64(FAT_MAX_TIME)); return RawTime(encodedData, fatWriteTimeUtc); //keep compatible with other applications, at least until DST shift actually occurs } @@ -332,14 +322,14 @@ FILETIME dst::fatDecodeUtcTime(const RawTime& rawTime) //return real UTC time; t if (!fatHasUtcEncoded(rawTime)) return rawTime.writeTimeRaw; - const wxULongLong rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw)); + const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw)); - const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(static_cast<int>(((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7F).ToULong())); //static_cast<int>: a shame MSC... + const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(zen::to<int>((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7FU)); //static_cast<int>: a shame MSC... "unsigned long" should be supported instead! assert_static(UTC_LOCAL_OFFSET_BITS == 7); const int timeShiftSec = convertUtcLocalShift(rawShift); const FILETIME writeTimeLocal = utcToLocal(rawTime.writeTimeRaw); - const wxLongLong realUTC = toLonglong(writeTimeLocal) - wxLongLong(timeShiftSec) * 10000000; + const zen::Int64 realUTC = toInt64(writeTimeLocal) - zen::Int64(timeShiftSec) * 10000000; return toFiletime(realUTC); } diff --git a/shared/file_drop.h b/shared/file_drop.h new file mode 100644 index 00000000..c85d4cbb --- /dev/null +++ b/shared/file_drop.h @@ -0,0 +1,113 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef FILE_DROP_H_INCLUDED +#define FILE_DROP_H_INCLUDED + +#include <wx/event.h> +#include <wx/dnd.h> + +namespace zen +{ +//register simple file drop event (without issue of freezing dialogs and without wxFileDropTarget overdesign) + +//1. have a window emit FFS_DROP_FILE_EVENT +void setupFileDrop(wxWindow& wnd); + +//2. register events: +//wnd.Connect (FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(MyDlg::OnFilesDropped), NULL, this); +//wnd.Disconnect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(MyDlg::OnFilesDropped), NULL, this); + +//3. do something: +//void MyDlg::OnFilesDropped(FFSFileDropEvent& event); + + + + + + + + + + + + + + + + + +inline +wxEventType createNewEventType() +{ + //inline functions have external linkage by default => this static is also extern, i.e. program wide unique! but defined in a header... ;) + static wxEventType dummy = wxNewEventType(); + return dummy; +} + +//define new event type +const wxEventType FFS_DROP_FILE_EVENT = createNewEventType(); + +class FFSFileDropEvent : public wxCommandEvent +{ +public: + FFSFileDropEvent(const std::vector<wxString>& filesDropped, const wxWindow& dropWindow, wxPoint dropPos) : + wxCommandEvent(FFS_DROP_FILE_EVENT), + filesDropped_(filesDropped), + dropWindow_(dropWindow), + dropPos_(dropPos) {} + + virtual wxEvent* Clone() const + { + return new FFSFileDropEvent(filesDropped_, dropWindow_, dropPos_); + } + + const std::vector<wxString>& getFiles() const { return filesDropped_; } + const wxWindow& getDropWindow() const { return dropWindow_; } + wxPoint getDropPosition() const { return dropPos_; } //position relative to drop window + +private: + const std::vector<wxString> filesDropped_; + const wxWindow& dropWindow_; + wxPoint dropPos_; +}; + +typedef void (wxEvtHandler::*FFSFileDropEventFunction)(FFSFileDropEvent&); + +#define FFSFileDropEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(FFSFileDropEventFunction, &func) + + +class WindowDropTarget : public wxFileDropTarget +{ +public: + WindowDropTarget(wxWindow& dropWindow) : dropWindow_(dropWindow) {} + + virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray) + { + std::vector<wxString> filenames(fileArray.begin(), fileArray.end()); + if (!filenames.empty()) + { + //create a custom event on drop window: execute event after file dropping is completed! (after mouse is released) + FFSFileDropEvent evt(filenames, dropWindow_, wxPoint(x, y)); + dropWindow_.GetEventHandler()->AddPendingEvent(evt); + } + return true; + } + +private: + wxWindow& dropWindow_; +}; + + +inline +void setupFileDrop(wxWindow& wnd) +{ + wnd.SetDropTarget(new WindowDropTarget(wnd)); //takes ownership +} +} + +#endif // FILE_DROP_H_INCLUDED diff --git a/shared/file_error.h b/shared/file_error.h index e8497a92..7325e14b 100644 --- a/shared/file_error.h +++ b/shared/file_error.h @@ -10,7 +10,7 @@ #include <wx/string.h> -namespace ffs3 +namespace zen { class FileError //Exception base class used to notify file/directory copy/delete errors { diff --git a/shared/file_handling.cpp b/shared/file_handling.cpp index 178fe26f..5dc1757c 100644 --- a/shared/file_handling.cpp +++ b/shared/file_handling.cpp @@ -7,19 +7,17 @@ #include "file_handling.h" #include <map> #include <algorithm> -#include <boost/scoped_array.hpp> #include <boost/bind.hpp> #include <stdexcept> -#include "system_func.h" -#include "global_func.h" +#include "last_error.h" #include "system_constants.h" #include "file_traverser.h" #include "string_conv.h" -#include "loki/TypeManip.h" #include "loki/ScopeGuard.h" #include "symlink_target.h" #include "file_io.h" #include "i18n.h" +#include "assert_static.h" #ifdef FFS_WIN #include "privilege.h" @@ -41,11 +39,10 @@ #endif #endif -using ffs3::FileError; -using namespace ffs3; +using namespace zen; -bool ffs3::fileExists(const Zstring& filename) +bool zen::fileExists(const Zstring& filename) { //symbolic links (broken or not) are also treated as existing files! #ifdef FFS_WIN @@ -62,7 +59,7 @@ bool ffs3::fileExists(const Zstring& filename) } -bool ffs3::dirExists(const Zstring& dirname) +bool zen::dirExists(const Zstring& dirname) { //symbolic links (broken or not) are also treated as existing directories! #ifdef FFS_WIN @@ -79,7 +76,7 @@ bool ffs3::dirExists(const Zstring& dirname) } -bool ffs3::symlinkExists(const Zstring& objname) +bool zen::symlinkExists(const Zstring& objname) { #ifdef FFS_WIN const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(objname).c_str()); @@ -93,7 +90,7 @@ bool ffs3::symlinkExists(const Zstring& objname) } -bool ffs3::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists +bool zen::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists { #ifdef FFS_WIN return ::GetFileAttributes(applyLongPathPrefix(objname).c_str()) != INVALID_FILE_ATTRIBUTES; @@ -108,10 +105,10 @@ bool ffs3::somethingExists(const Zstring& objname) //throw() check whether #ifdef FFS_WIN namespace { -wxULongLong getFileSizeSymlink(const Zstring& linkName) //throw (FileError) +zen::UInt64 getFileSizeSymlink(const Zstring& linkName) //throw (FileError) { //open handle to target of symbolic link - const HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(linkName).c_str(), + const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -120,52 +117,52 @@ wxULongLong getFileSizeSymlink(const Zstring& linkName) //throw (FileError) NULL); if (hFile == INVALID_HANDLE_VALUE) { - const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + ffs3::zToWx(linkName) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile); (void)dummy; //silence warning "unused variable" - BY_HANDLE_FILE_INFORMATION fileInfoByHandle = {}; - if (!::GetFileInformationByHandle(hFile, &fileInfoByHandle)) + BY_HANDLE_FILE_INFORMATION fileInfo = {}; + if (!::GetFileInformationByHandle(hFile, &fileInfo)) { - const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + ffs3::zToWx(linkName) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } - return wxULongLong(fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow); + return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); } } #endif -wxULongLong ffs3::getFilesize(const Zstring& filename) //throw (FileError) +zen::UInt64 zen::getFilesize(const Zstring& filename) //throw (FileError) { #ifdef FFS_WIN - WIN32_FIND_DATA fileMetaData; - const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileMetaData); + WIN32_FIND_DATA fileInfo = {}; + const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); if (searchHandle == INVALID_HANDLE_VALUE) { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } ::FindClose(searchHandle); - const bool isSymbolicLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; + const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; if (isSymbolicLink) return getFileSizeSymlink(filename); //throw (FileError) - return wxULongLong(fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow); + return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); #elif defined FFS_LINUX - struct stat fileInfo; + struct stat fileInfo = {}; if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } - return fileInfo.st_size; + return zen::UInt64(fileInfo.st_size); #endif } @@ -175,16 +172,15 @@ namespace #ifdef FFS_WIN DWORD retrieveVolumeSerial(const Zstring& pathName) //return 0 on error! { - const size_t bufferSize = std::max(pathName.size(), static_cast<size_t>(10000)); - boost::scoped_array<wchar_t> buffer(new wchar_t[bufferSize]); + std::vector<wchar_t> buffer(std::max(pathName.size(), static_cast<size_t>(10000))); //full pathName need not yet exist! if (!::GetVolumePathName(pathName.c_str(), //__in LPCTSTR lpszFileName, - buffer.get(), //__out LPTSTR lpszVolumePathName, - static_cast<DWORD>(bufferSize))) //__in DWORD cchBufferLength + &buffer[0], //__out LPTSTR lpszVolumePathName, + static_cast<DWORD>(buffer.size()))) //__in DWORD cchBufferLength return 0; - Zstring volumePath = buffer.get(); + Zstring volumePath = &buffer[0]; if (!volumePath.EndsWith(common::FILE_NAME_SEPARATOR)) volumePath += common::FILE_NAME_SEPARATOR; @@ -225,7 +221,7 @@ dev_t retrieveVolumeSerial(const Zstring& pathName) //return 0 on error! } -ffs3::ResponseSameVol ffs3::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw() +zen::ResponseSameVol zen::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw() { #ifdef FFS_WIN typedef DWORD VolSerial; @@ -241,7 +237,7 @@ ffs3::ResponseSameVol ffs3::onSameVolume(const Zstring& folderLeft, const Zstrin } -bool ffs3::removeFile(const Zstring& filename) //throw (FileError); +bool zen::removeFile(const Zstring& filename) //throw (FileError); { #ifdef FFS_WIN //remove file, support for \\?\-prefix @@ -264,7 +260,8 @@ bool ffs3::removeFile(const Zstring& filename) //throw (FileError); } #endif //eval error code before next call - const wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(); + wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(); //no error situation if file is not existing! manual deletion relies on it! //perf: place check in error handling block @@ -293,7 +290,7 @@ DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume); //throw (FileError); ErrorDifferentVolume if it is due to moving file to another volume void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting) { - using namespace ffs3; //for zToWx() + using namespace zen; //for zToWx() #ifdef FFS_WIN const Zstring oldNameFmt = applyLongPathPrefix(oldName); @@ -333,8 +330,10 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw } const DWORD lastError = ::GetLastError(); - const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); + if (lastError == ERROR_NOT_SAME_DEVICE) throw ErrorDifferentVolume(errorMessage); else if (lastError == ERROR_FILE_EXISTS) @@ -347,8 +346,10 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw if (::rename(oldName.c_str(), newName.c_str()) != 0) { const int lastError = errno; - const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); + if (lastError == EXDEV) throw ErrorDifferentVolume(errorMessage); else if (lastError == EEXIST) @@ -367,21 +368,21 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw template <typename Function> Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns empty string on error { - const Zstring filenameFmt = ffs3::applyLongPathPrefix(filename); + const Zstring filenameFmt = zen::applyLongPathPrefix(filename); const DWORD bufferSize = fun(filenameFmt.c_str(), NULL, 0); if (bufferSize == 0) return Zstring(); - boost::scoped_array<wchar_t> buffer(new wchar_t[bufferSize]); + std::vector<wchar_t> buffer(bufferSize); const DWORD rv = fun(filenameFmt.c_str(), //__in LPCTSTR lpszShortPath, - buffer.get(), //__out LPTSTR lpszLongPath, - bufferSize); //__in DWORD cchBuffer - if (rv == 0 || rv >= bufferSize) + &buffer[0], //__out LPTSTR lpszLongPath, + static_cast<DWORD>(buffer.size())); //__in DWORD cchBuffer + if (rv == 0 || rv >= buffer.size()) return Zstring(); - return buffer.get(); + return &buffer[0]; } @@ -398,7 +399,7 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n for (int index = 0; index < 100000000; ++index) //filename must be representable by <= 8 characters { const Zstring output = pathPrefix + Zstring::fromNumber(index) + Zchar('.') + extension; - if (!ffs3::somethingExists(output)) //ensure uniqueness + if (!zen::somethingExists(output)) //ensure uniqueness return output; } @@ -409,12 +410,12 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n //try to handle issues with already existing short 8.3 file names on Windows 7 bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw (FileError); return "true" if rename operation succeeded { - using namespace ffs3; + using namespace zen; if (newName.find(common::FILE_NAME_SEPARATOR) == Zstring::npos) return false; - if (ffs3::somethingExists(newName)) //name OR directory! + if (zen::somethingExists(newName)) //name OR directory! { const Zstring fileNameOrig = newName.AfterLast(common::FILE_NAME_SEPARATOR); //returns the whole string if ch not found const Zstring fileNameShort = getFilenameFmt(newName, ::GetShortPathName).AfterLast(common::FILE_NAME_SEPARATOR); //throw() returns empty string on error @@ -436,7 +437,7 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw //move already existing short name out of the way for now renameFileInternal(unrelatedPathLong, parkedTarget); //throw (FileError: ErrorDifferentVolume); - //DON'T call ffs3::renameFile() to avoid reentrance! + //DON'T call zen::renameFile() to avoid reentrance! //schedule cleanup; the file system should assign this unrelated file a new (unique) short name Loki::ScopeGuard guard = Loki::MakeGuard(renameFileInternal, parkedTarget, unrelatedPathLong);//equivalent to Boost.ScopeExit in this case @@ -453,7 +454,7 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw //rename file: no copying!!! -void ffs3::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting); +void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting); { try { @@ -470,16 +471,16 @@ void ffs3::renameFile(const Zstring& oldName, const Zstring& newName) //throw (F } -using ffs3::CallbackMoveFile; +using zen::CallbackMoveFile; -class CopyCallbackImpl : public ffs3::CallbackCopyFile //callback functionality +class CopyCallbackImpl : public zen::CallbackCopyFile //callback functionality { public: CopyCallbackImpl(const Zstring& sourceFile, CallbackMoveFile& callback) : sourceFile_(sourceFile), moveCallback(callback) {} virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); } - virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred) + virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred) { switch (moveCallback.requestUiRefresh(sourceFile_)) { @@ -498,7 +499,7 @@ private: }; -void ffs3::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); +void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); { //call back once per file (moveFile() is called by moveDirectory()) if (callback) @@ -545,7 +546,7 @@ void ffs3::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool i namespace { -class TraverseOneLevel : public ffs3::TraverseCallback +class TraverseOneLevel : public zen::TraverseCallback { public: typedef std::pair<Zstring, Zstring> NamePair; @@ -585,7 +586,7 @@ private: }; -struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir +struct RemoveCallbackImpl : public zen::CallbackRemoveDir { RemoveCallbackImpl(const Zstring& sourceDir, const Zstring& targetDir, @@ -601,8 +602,8 @@ struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir case CallbackMoveFile::CONTINUE: break; case CallbackMoveFile::CANCEL: //a user aborted operation IS an error condition! - throw ffs3::FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + ffs3::zToWx(sourceDir_) + wxT("\" ->\n\"") + - ffs3::zToWx(targetDir_) + wxT("\"") + wxT("\n\n") + _("Operation aborted!")); + throw zen::FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + zen::zToWx(sourceDir_) + wxT("\" ->\n\"") + + zen::zToWx(targetDir_) + wxT("\"") + wxT("\n\n") + _("Operation aborted!")); } } @@ -616,7 +617,7 @@ private: void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); { - using namespace ffs3; + using namespace zen; //call back once per folder if (callback) @@ -671,7 +672,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //move files for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - ffs3::moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw (FileError: ErrorTargetExisting); + zen::moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw (FileError: ErrorTargetExisting); //move directories for (TraverseOneLevel::NameList::const_iterator i = dirList.begin(); i != dirList.end(); ++i) @@ -686,7 +687,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool } -void ffs3::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); +void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); { #ifdef FFS_WIN const Zstring& sourceDirFormatted = sourceDir; @@ -707,7 +708,7 @@ void ffs3::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, boo } -class FilesDirsOnlyTraverser : public ffs3::TraverseCallback +class FilesDirsOnlyTraverser : public zen::TraverseCallback { public: FilesDirsOnlyTraverser(std::vector<Zstring>& files, std::vector<Zstring>& dirs) : @@ -741,7 +742,7 @@ private: }; -void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) +void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) { //no error situation if directory is not existing! manual deletion relies on it! if (!somethingExists(directory)) @@ -764,7 +765,7 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback #endif { wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } if (callback) callback->notifyDeletion(directory); //once per symlink return; @@ -775,7 +776,7 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback //get all files and directories from current directory (WITHOUT subdirectories!) FilesDirsOnlyTraverser traverser(fileList, dirList); - ffs3::traverseFolder(directory, false, traverser); //don't follow symlinks + zen::traverseFolder(directory, false, traverser); //don't follow symlinks //delete files for (std::vector<Zstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) @@ -796,13 +797,13 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback #endif { wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } if (callback) callback->notifyDeletion(directory); //and once per folder } -void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool deRefSymlinks) //throw (FileError) +void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool deRefSymlinks) //throw (FileError) { #ifdef FFS_WIN FILETIME creationTime = {}; @@ -815,7 +816,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo &sourceAttr)) //__out LPVOID lpFileInformation { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } const bool isReparsePoint = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; @@ -833,7 +834,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (hSource == INVALID_HANDLE_VALUE) { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource); @@ -845,7 +846,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo &lastWriteTime)) //__out_opt LPFILETIME lpLastWriteTime { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } } else @@ -892,7 +893,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (hTarget == INVALID_HANDLE_VALUE) { wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hTarget); (void)dummy; //silence warning "unused variable" @@ -903,11 +904,11 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo &lastWriteTime)) { wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } #ifndef NDEBUG //dst hack: verify data written - if (dst::isFatDrive(targetObj) && !ffs3::dirExists(targetObj)) //throw() + if (dst::isFatDrive(targetObj) && !zen::dirExists(targetObj)) //throw() { WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {}; assert(::GetFileAttributesEx(applyLongPathPrefix(targetObj).c_str(), //__in LPCTSTR lpFileName, @@ -926,7 +927,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (::stat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } struct utimbuf newTimes = {}; @@ -937,7 +938,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (::utime(targetObj.c_str(), &newTimes) != 0) //return value not evaluated! { wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } } else @@ -946,7 +947,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (::lstat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } struct timeval newTimes[2] = {}; @@ -959,7 +960,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo if (::lutimes(targetObj.c_str(), newTimes) != 0) //return value not evaluated! { wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } } #endif @@ -974,7 +975,7 @@ struct TryCleanUp { try { - ffs3::removeDirectory(dirname, NULL); + zen::removeDirectory(dirname, NULL); } catch (...) {} } @@ -983,7 +984,7 @@ struct TryCleanUp { try { - ffs3::removeFile(filename); + zen::removeFile(filename); } catch (...) {} } @@ -994,7 +995,7 @@ struct TryCleanUp Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target path of symbolic link to a directory; throw (FileError) { //open handle to target of symbolic link - const HANDLE hDir = ::CreateFile(ffs3::applyLongPathPrefix(dirLinkName).c_str(), + const HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(dirLinkName).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -1003,8 +1004,8 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa NULL); if (hDir == INVALID_HANDLE_VALUE) { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(dirLinkName) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir); @@ -1032,8 +1033,8 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa 0); //__in DWORD dwFlags if (rv >= BUFFER_SIZE || rv == 0) { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(dirLinkName) + wxT("\""); - if (rv == 0) errorMessage += wxT("\n\n") + ffs3::getLastErrorFormatted(); + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\""); + if (rv == 0) errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(); throw FileError(errorMessage); } @@ -1046,7 +1047,7 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa //copy SELinux security context void copySecurityContext(const Zstring& source, const Zstring& target, bool derefSymlinks) //throw (FileError) { - using ffs3::zToWx; + using zen::zToWx; security_context_t contextSource = NULL; const int rv = derefSymlinks ? @@ -1059,7 +1060,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere return; wxString errorMessage = wxString(_("Error reading security context:")) + wxT("\n\"") + zToWx(source) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy1 = Loki::MakeGuard(::freecon, contextSource); (void)dummy1; //silence warning "unused variable" @@ -1091,7 +1092,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere if (rv3 < 0) { wxString errorMessage = wxString(_("Error writing security context:")) + wxT("\n\"") + zToWx(target) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } } #endif //HAVE_SELINUX @@ -1119,7 +1120,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de PACL sacl = NULL; //http://msdn.microsoft.com/en-us/library/aa364399(v=VS.85).aspx - const HANDLE hSource = ::CreateFile(ffs3::applyLongPathPrefix(source).c_str(), + const HANDLE hSource = ::CreateFile(zen::applyLongPathPrefix(source).c_str(), READ_CONTROL | ACCESS_SYSTEM_SECURITY, //ACCESS_SYSTEM_SECURITY required for SACL access FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -1128,8 +1129,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de NULL); if (hSource == INVALID_HANDLE_VALUE) { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (OR)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OR)")); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource); (void)dummy; //silence warning "unused variable" @@ -1146,15 +1147,15 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de &buffer); //__out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor if (rc != ERROR_SUCCESS) { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted(rc) + wxT(" (R)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (R)")); } Loki::ScopeGuard dummy4 = Loki::MakeGuard(::LocalFree, buffer); (void)dummy4; //silence warning "unused variable" - const Zstring targetFmt = ffs3::applyLongPathPrefix(target); + const Zstring targetFmt = zen::applyLongPathPrefix(target); //read-only file attribute may cause trouble: temporarily reset it const DWORD targetAttr = ::GetFileAttributes(targetFmt.c_str()); @@ -1175,8 +1176,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de NULL); // hTemplateFile if (hTarget == INVALID_HANDLE_VALUE) { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (OW)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OW)")); } Loki::ScopeGuard dummy2 = Loki::MakeGuard(::CloseHandle, hTarget); (void)dummy2; //silence warning "unused variable" @@ -1193,8 +1194,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de if (rc != ERROR_SUCCESS) { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted(rc) + wxT(" (W)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (W)")); } #elif defined FFS_LINUX @@ -1210,8 +1211,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de ::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! ::chmod(target.c_str(), fileInfo.st_mode) != 0) { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (R)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (R)")); } } else @@ -1221,8 +1222,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de ::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! (!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0)) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod() { - const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (W)")); + const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (W)")); } } #endif @@ -1231,9 +1232,9 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level) { - using namespace ffs3; + using namespace zen; - if (ffs3::dirExists(directory)) + if (zen::dirExists(directory)) return; if (level == 100) //catch endless recursion @@ -1241,7 +1242,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat //try to create parent folders first const Zstring dirParent = directory.BeforeLast(common::FILE_NAME_SEPARATOR); - if (!dirParent.empty() && !ffs3::dirExists(dirParent)) + if (!dirParent.empty() && !zen::dirExists(dirParent)) { //call function recursively const Zstring templateParent = templateDir.BeforeLast(common::FILE_NAME_SEPARATOR); @@ -1263,7 +1264,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat { if (level != 0) return; wxString errorMessage = wxString(_("Error creating directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } if (!templateDir.empty()) @@ -1348,7 +1349,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat } -void ffs3::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions) +void zen::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions) { //remove trailing separator const Zstring dirFormatted = directory.EndsWith(common::FILE_NAME_SEPARATOR) ? @@ -1363,13 +1364,13 @@ void ffs3::createDirectory(const Zstring& directory, const Zstring& templateDir, } -void ffs3::createDirectory(const Zstring& directory) +void zen::createDirectory(const Zstring& directory) { - ffs3::createDirectory(directory, Zstring(), false); + zen::createDirectory(directory, Zstring(), false); } -void ffs3::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, ffs3::SymlinkType type, bool copyFilePermissions) //throw (FileError) +void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, zen::SymlinkType type, bool copyFilePermissions) //throw (FileError) { const Zstring linkPath = getSymlinkRawTargetString(sourceLink); //accept broken symlinks; throw (FileError) @@ -1386,14 +1387,14 @@ void ffs3::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, ffs (type == SYMLINK_TYPE_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags { const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } #elif defined FFS_LINUX if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0) { const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } #endif @@ -1416,11 +1417,11 @@ namespace { Zstring createTempName(const Zstring& filename) { - Zstring output = filename + ffs3::TEMP_FILE_ENDING; + Zstring output = filename + zen::TEMP_FILE_ENDING; //ensure uniqueness - for (int i = 1; ffs3::somethingExists(output); ++i) - output = filename + Zchar('_') + Zstring::fromNumber(i) + ffs3::TEMP_FILE_ENDING; + for (int i = 1; zen::somethingExists(output); ++i) + output = filename + Zchar('_') + Zstring::fromNumber(i) + zen::TEMP_FILE_ENDING; return output; } @@ -1437,7 +1438,7 @@ DWORD CALLBACK copyCallbackInternal( HANDLE hDestinationFile, LPVOID lpData) { - using ffs3::CallbackCopyFile; + using zen::CallbackCopyFile; //small performance optimization: it seems this callback function is called for every 64 kB (depending on cluster size). static size_t callNr = 0; @@ -1446,7 +1447,7 @@ DWORD CALLBACK copyCallbackInternal( if (lpData != NULL) { //some odd check for some possible(?) error condition - if (totalBytesTransferred.HighPart < 0) //let's see if someone answers the call... + if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call... ::MessageBox(NULL, wxT("You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\ Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\ \"totalBytesTransferred.HighPart can be below zero\"!\n\n\ @@ -1456,7 +1457,7 @@ DWORD CALLBACK copyCallbackInternal( CallbackCopyFile* callback = static_cast<CallbackCopyFile*>(lpData); try { - switch (callback->updateCopyStatus(wxULongLong(totalBytesTransferred.HighPart, totalBytesTransferred.LowPart))) + switch (callback->updateCopyStatus(zen::UInt64(totalBytesTransferred.QuadPart))) { case CallbackCopyFile::CONTINUE: break; @@ -1466,7 +1467,7 @@ DWORD CALLBACK copyCallbackInternal( } catch (...) { - ::MessageBox(NULL, wxT("Exception in callback ffs3::copyFile! Please contact the author of FFS."), NULL, 0); + ::MessageBox(NULL, wxT("Exception in callback zen::copyFile! Please contact the author of FFS."), NULL, 0); } } } @@ -1541,7 +1542,7 @@ void rawCopyWinApi(const Zstring& sourceFile, //assemble error message... wxString errorMessage = wxString(_("Error copying file:")) + wxT("\n\"") + sourceFile.c_str() + wxT("\" ->\n\"") + targetFile.c_str() + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + wxT("\n\n") + zen::getLastErrorFormatted(lastError); //if file is locked (try to) use Windows Volume Shadow Copy Service if (lastError == ERROR_SHARING_VIOLATION || @@ -1565,8 +1566,8 @@ void rawCopyWinApi(const Zstring& sourceFile, //trying to copy > 4GB file to FAT/FAT32 volume gives obscure ERROR_INVALID_PARAMETER (FAT can indeed handle files up to 4 Gig, tested!) if (lastError == ERROR_INVALID_PARAMETER && dst::isFatDrive(targetFile) && - getFilesize(sourceFile) >= wxULongLong(1024 * 1024 * 1024) * 4) //throw (FileError) - errorMessage += wxT("\nFAT volume cannot store file larger than 4 gigabyte!"); + getFilesize(sourceFile) >= 4U * zen::UInt64(1024U * 1024 * 1024)) //throw (FileError) + errorMessage += wxT("\nFAT volume cannot store files larger than 4 gigabyte!"); } catch(...) {} @@ -1600,7 +1601,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // */ // // //open sourceFile for reading -// HANDLE hFileIn = ::CreateFile(ffs3::applyLongPathPrefix(sourceFile).c_str(), +// HANDLE hFileIn = ::CreateFile(zen::applyLongPathPrefix(sourceFile).c_str(), // GENERIC_READ, // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications // NULL, @@ -1610,7 +1611,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // if (hFileIn == INVALID_HANDLE_VALUE) // { // const DWORD lastError = ::GetLastError(); -// const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); +// const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + wxT("\n\n") + zen::getLastErrorFormatted(lastError); // // //if file is locked (try to) use Windows Volume Shadow Copy Service // if (lastError == ERROR_SHARING_VIOLATION || @@ -1627,7 +1628,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // if (!::GetFileInformationByHandle(hFileIn, &infoFileIn)) // { // const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\""); -// throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); +// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); // } // // //####################################### DST hack ########################################### @@ -1657,7 +1658,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // FILE_ATTRIBUTE_ENCRYPTED; // // //create targetFile and open it for writing -// HANDLE hFileOut = ::CreateFile(ffs3::applyLongPathPrefix(targetFile).c_str(), +// HANDLE hFileOut = ::CreateFile(zen::applyLongPathPrefix(targetFile).c_str(), // GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // NULL, @@ -1668,7 +1669,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // { // const DWORD lastError = ::GetLastError(); // const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); +// wxT("\n\n") + zen::getLastErrorFormatted(lastError); // // if (lastError == ERROR_FILE_EXISTS) // throw ErrorTargetExisting(errorMessage); @@ -1698,7 +1699,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // 0)) //__in DWORD nFileSystemNameSize // { // const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\""); -// throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); +// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); // } // // const bool sourceIsEncrypted = (infoFileIn.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != 0; @@ -1726,7 +1727,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // &bytesReturned, //number of bytes returned // NULL)) //OVERLAPPED structure // throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted() + +// wxT("\n\n") + zen::getLastErrorFormatted() + // wxT("\nFailed to write NTFS compressed attribute!")); // } // @@ -1745,7 +1746,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // &bytesReturned, //number of bytes returned // NULL)) //OVERLAPPED structure // throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted() + +// wxT("\n\n") + zen::getLastErrorFormatted() + // wxT("\nFailed to write NTFS sparse attribute!")); // } // } @@ -1770,7 +1771,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // } context; // // //copy contents of sourceFile to targetFile -// wxULongLong totalBytesTransferred; +// zen::UInt64 totalBytesTransferred; // // bool eof = false; // do @@ -1787,7 +1788,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // false, //__in BOOL bProcessSecurity, // &context.read)) //__out LPVOID *lpContext // throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted()); +// wxT("\n\n") + zen::getLastErrorFormatted()); // } // else if (!::ReadFile(hFileIn, //__in HANDLE hFile, // memory.get(), //__out LPVOID lpBuffer, @@ -1795,7 +1796,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead, // NULL)) //__inout_opt LPOVERLAPPED lpOverlapped // throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted()); +// wxT("\n\n") + zen::getLastErrorFormatted()); // // if (bytesRead > BUFFER_SIZE) // throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + @@ -1816,7 +1817,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // false, //__in BOOL bProcessSecurity, // &context.write)) //__out LPVOID *lpContext // throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! +// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! // } // else if (!::WriteFile(hFileOut, //__in HANDLE hFile, // memory.get(), //__out LPVOID lpBuffer, @@ -1824,7 +1825,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // &bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten, // NULL)) //__inout_opt LPOVERLAPPED lpOverlapped // throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! +// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! // // if (bytesWritten != bytesRead) // throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + @@ -1856,7 +1857,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // LARGE_INTEGER inputSize = {}; // if (!::GetFileSizeEx(hFileIn, &inputSize)) // throw FileError(wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted()); +// wxT("\n\n") + zen::getLastErrorFormatted()); // // if (inputSize.QuadPart != 0) // throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + @@ -1869,7 +1870,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // NULL, // &infoFileIn.ftLastWriteTime)) // throw FileError(wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") + -// wxT("\n\n") + ffs3::getLastErrorFormatted()); +// wxT("\n\n") + zen::getLastErrorFormatted()); // // //#ifndef NDEBUG //dst hack: verify data written @@ -1889,7 +1890,6 @@ void rawCopyWinApi(const Zstring& sourceFile, // // /* // //create test sparse file -// size_t sparseSize = 50 * 1024 * 1024; // HANDLE hSparse = ::CreateFile(L"C:\\sparse.file", // GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, @@ -1902,7 +1902,8 @@ void rawCopyWinApi(const Zstring& sourceFile, // throw 1; // // LARGE_INTEGER liDistanceToMove = {}; -// liDistanceToMove.QuadPart = sparseSize; +// liDistanceToMove.QuadPart = 1024 * 1024 * 1024; //create 5 TB sparse file +// liDistanceToMove.QuadPart *= 5 * 1024; // // if (!::SetFilePointerEx(hSparse, liDistanceToMove, NULL, FILE_BEGIN)) // throw 1; // @@ -1910,7 +1911,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // throw 1; // // FILE_ZERO_DATA_INFORMATION zeroInfo = {}; -// zeroInfo.BeyondFinalZero.QuadPart = sparseSize; +// zeroInfo.BeyondFinalZero.QuadPart = liDistanceToMove.QuadPart; // if (!::DeviceIoControl(hSparse, FSCTL_SET_ZERO_DATA, &zeroInfo, sizeof(zeroInfo), NULL, 0, &br, NULL)) // throw 1; // @@ -1933,16 +1934,15 @@ void rawCopyStream(const Zstring& sourceFile, //create targetFile and open it for writing FileOutput fileOut(targetFile, FileOutput::ACC_CREATE_NEW); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting) - const size_t BUFFER_SIZE = 512 * 1024; //512 kb seems to be a reasonable buffer size - static const boost::scoped_array<char> memory(new char[BUFFER_SIZE]); + static std::vector<wchar_t> buffer(512 * 1024); //512 kb seems to be a reasonable buffer size //copy contents of sourceFile to targetFile - wxULongLong totalBytesTransferred; + zen::UInt64 totalBytesTransferred; do { - const size_t bytesRead = fileIn.read(memory.get(), BUFFER_SIZE); //throw (FileError) + const size_t bytesRead = fileIn.read(&buffer[0], buffer.size()); //throw (FileError) - fileOut.write(memory.get(), bytesRead); //throw (FileError) + fileOut.write(&buffer[0], bytesRead); //throw (FileError) totalBytesTransferred += bytesRead; @@ -1989,7 +1989,7 @@ void copyFileImpl(const Zstring& sourceFile, Compressed NO YES Sparse NO YES PERF - 6% faster - SAMBA, ect. YES UNKNOWN! + SAMBA, ect. YES UNKNOWN! -> issues writing ADS to Samba, issues reading from NAS, error copying files having "blocked" state... ect. damn! */ rawCopyWinApi(sourceFile, targetFile, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) @@ -2002,12 +2002,12 @@ void copyFileImpl(const Zstring& sourceFile, } -void ffs3::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked); - const Zstring& targetFile, - bool copyFilePermissions, - CallbackCopyFile* callback) +void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked); + const Zstring& targetFile, + bool copyFilePermissions, + CallbackCopyFile* callback) { - Zstring temporary = targetFile + ffs3::TEMP_FILE_ENDING; //use temporary file until a correct date has been set + Zstring temporary = targetFile + zen::TEMP_FILE_ENDING; //use temporary file until a correct date has been set Loki::ScopeGuard guardTempFile = Loki::MakeGuard(&removeFile, boost::cref(temporary)); //transactional behavior: ensure cleanup (e.g. network drop) -> cref [!] //raw file copy diff --git a/shared/file_handling.h b/shared/file_handling.h index 8867bb04..67540de5 100644 --- a/shared/file_handling.h +++ b/shared/file_handling.h @@ -7,12 +7,11 @@ #ifndef FILE_HANDLING_H_INCLUDED #define FILE_HANDLING_H_INCLUDED -#include <wx/longlong.h> #include "zstring.h" #include "file_error.h" +#include "int64.h" - -namespace ffs3 +namespace zen { struct CallbackRemoveDir; struct CallbackMoveFile; @@ -38,7 +37,7 @@ ResponseSameVol onSameVolume(const Zstring& folderLeft, const Zstring& folderRig void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool derefSymlinks); //throw (FileError) //symlink handling: always evaluate target -wxULongLong getFilesize(const Zstring& filename); //throw (FileError) +zen::UInt64 getFilesize(const Zstring& filename); //throw (FileError) //file handling @@ -115,7 +114,7 @@ struct CallbackCopyFile //callback functionality CONTINUE, CANCEL }; - virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred) = 0; //DON'T throw exceptions here, at least in Windows build! + virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred) = 0; //DON'T throw exceptions here, at least in Windows build! }; } diff --git a/shared/file_id.cpp b/shared/file_id.cpp index eb3be8d6..b111b9a2 100644 --- a/shared/file_id.cpp +++ b/shared/file_id.cpp @@ -20,7 +20,7 @@ namespace { template <class T> inline -std::string numberToString(T number) +std::string numberToBytes(T number) { const char* rawBegin = reinterpret_cast<const char*>(&number); return std::string(rawBegin, rawBegin + sizeof(number)); @@ -38,9 +38,8 @@ std::string util::retrieveFileID(const Zstring& filename) //privilege SE_BACKUP_NAME doesn't seem to be required here at all - //note: setting privileges requires admin rights! - const HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(), + const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -55,9 +54,9 @@ std::string util::retrieveFileID(const Zstring& filename) BY_HANDLE_FILE_INFORMATION fileInfo = {}; if (::GetFileInformationByHandle(hFile, &fileInfo)) { - fileID += numberToString(fileInfo.dwVolumeSerialNumber); - fileID += numberToString(fileInfo.nFileIndexHigh); - fileID += numberToString(fileInfo.nFileIndexLow); + fileID += numberToBytes(fileInfo.dwVolumeSerialNumber); + fileID += numberToBytes(fileInfo.nFileIndexHigh); + fileID += numberToBytes(fileInfo.nFileIndexLow); } } @@ -65,8 +64,8 @@ std::string util::retrieveFileID(const Zstring& filename) struct stat fileInfo = {}; if (::lstat(filename.c_str(), &fileInfo) == 0) //lstat() does not follow symlinks { - fileID += numberToString(fileInfo.st_dev); - fileID += numberToString(fileInfo.st_ino); + fileID += numberToBytes(fileInfo.st_dev); + fileID += numberToBytes(fileInfo.st_ino); } #endif diff --git a/shared/file_io.cpp b/shared/file_io.cpp index 0afe17dd..51f81da9 100644 --- a/shared/file_io.cpp +++ b/shared/file_io.cpp @@ -6,7 +6,7 @@ // #include "file_io.h" #include "string_conv.h" -#include "system_func.h" +#include "last_error.h" #include "i18n.h" #ifdef FFS_WIN @@ -15,25 +15,21 @@ #include <cerrno> #endif -using namespace ffs3; +using namespace zen; FileInput::FileInput(FileHandle handle, const Zstring& filename) : -#ifdef FFS_WIN eofReached(false), -#endif fileHandle(handle), filename_(filename) {} FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExisting) -#ifdef FFS_WIN eofReached(false), -#endif filename_(filename) { #ifdef FFS_WIN - fileHandle = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(), + fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications NULL, @@ -67,7 +63,10 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi if (fileHandle == INVALID_HANDLE_VALUE) { const DWORD lastError = ::GetLastError(); - const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); + if (lastError == ERROR_FILE_NOT_FOUND || lastError == ERROR_PATH_NOT_FOUND) throw ErrorNotExisting(errorMessage); @@ -79,7 +78,10 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi if (fileHandle == NULL) { const int lastError = errno; - const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + + wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); + if (lastError == ENOENT) throw ErrorNotExisting(errorMessage); @@ -103,41 +105,40 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number { #ifdef FFS_WIN DWORD bytesRead = 0; - if (!::ReadFile(fileHandle, //__in HANDLE hFile, buffer, //__out LPVOID lpBuffer, static_cast<DWORD>(bytesToRead), //__in DWORD nNumberOfBytesToRead, &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead, - NULL)) //__inout_opt LPOVERLAPPED lpOverlapped - throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted()); - - if (bytesRead > bytesToRead) - throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + wxT("buffer overflow")); - - if (bytesRead < bytesToRead) - eofReached = bytesRead < bytesToRead; - - return bytesRead; - + NULL)) //__inout_opt LPOVERLAPPED lpOverlapped #elif defined FFS_LINUX const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle); if (::ferror(fileHandle) != 0) - throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted()); - return bytesRead; #endif + { + wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); + } + +#ifdef FFS_WIN + if (bytesRead < bytesToRead) //falsify only! +#elif defined FFS_LINUX + if (::feof(fileHandle) != 0) +#endif + eofReached = true; + + if (bytesRead > bytesToRead) + { + wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + wxT("buffer overflow")); + } + + return bytesRead; } bool FileInput::eof() //end of file reached { -#ifdef FFS_WIN return eofReached; -#elif defined FFS_LINUX - return ::feof(fileHandle) != 0; -#endif } @@ -148,7 +149,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi filename_(filename) { #ifdef FFS_WIN - fileHandle = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(), + fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open! NULL, @@ -158,8 +159,8 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi if (fileHandle == INVALID_HANDLE_VALUE) { const DWORD lastError = ::GetLastError(); - const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); if (lastError == ERROR_FILE_EXISTS) throw ErrorTargetExisting(errorMessage); @@ -177,8 +178,8 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi if (fileHandle == NULL) { const int lastError = errno; - const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted(lastError); + wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError); if (lastError == EEXIST) throw ErrorTargetExisting(errorMessage); @@ -205,23 +206,23 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw (FileErr { #ifdef FFS_WIN DWORD bytesWritten = 0; - if (!::WriteFile(fileHandle, //__in HANDLE hFile, buffer, //__out LPVOID lpBuffer, static_cast<DWORD>(bytesToWrite), //__in DWORD nNumberOfBytesToWrite, &bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten, NULL)) //__inout_opt LPOVERLAPPED lpOverlapped - throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! - - if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes! - throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + wxT("incomplete write")); - #elif defined FFS_LINUX const size_t bytesWritten = ::fwrite(buffer, 1, bytesToWrite, fileHandle); - if (::ferror(fileHandle) != 0 || bytesWritten != bytesToWrite) - throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + - wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! + if (::ferror(fileHandle) != 0) #endif + { + wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message! + } + + if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes! + { + wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + wxT("incomplete write")); + } } diff --git a/shared/file_io.h b/shared/file_io.h index a1460f53..d311346a 100644 --- a/shared/file_io.h +++ b/shared/file_io.h @@ -7,8 +7,6 @@ #ifndef FILEIO_H_INCLUDED #define FILEIO_H_INCLUDED -#include <wx/stream.h> - #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" #elif defined FFS_LINUX @@ -18,7 +16,7 @@ #include "zstring.h" #include "file_error.h" -namespace ffs3 +namespace zen { //file IO optimized for sequential read/write accesses + better error reporting + long path support (following symlinks) @@ -39,9 +37,7 @@ public: bool eof(); //end of file reached private: -#ifdef FFS_WIN bool eofReached; -#endif FileHandle fileHandle; const Zstring filename_; }; @@ -66,40 +62,6 @@ private: const Zstring filename_; }; - -//############# wxWidgets stream adapter ############# -// can be used as base classes (have virtual destructors) -class FileInputStream : public wxInputStream -{ -public: - FileInputStream(const Zstring& filename) : //throw (FileError) - fileObj(filename) {} - -private: - virtual size_t OnSysRead(void* buffer, size_t bufsize) //throw (FileError) - { - return fileObj.read(buffer, bufsize); - } - - FileInput fileObj; -}; - - -class FileOutputStream : public wxOutputStream -{ -public: - FileOutputStream(const Zstring& filename) : //throw (FileError) - fileObj(filename, FileOutput::ACC_OVERWRITE) {} - -private: - virtual size_t OnSysWrite(const void* buffer, size_t bufsize) //throw (FileError) - { - fileObj.write(buffer, bufsize); - return bufsize; - } - - FileOutput fileObj; -}; } #endif // FILEIO_H_INCLUDED diff --git a/shared/file_traverser.cpp b/shared/file_traverser.cpp index 2af0f4af..90a5bd79 100644 --- a/shared/file_traverser.cpp +++ b/shared/file_traverser.cpp @@ -7,7 +7,7 @@ #include "file_traverser.h" #include <limits> #include "system_constants.h" -#include "system_func.h" +#include "last_error.h" #include "string_conv.h" #include "assert_static.h" #include "symlink_target.h" @@ -26,36 +26,20 @@ #ifdef FFS_WIN inline -wxLongLong getWin32TimeInformation(const FILETIME& lastWriteTime) +zen::Int64 filetimeToTimeT(const FILETIME& lastWriteTime) { //convert UTC FILETIME to ANSI C format (number of seconds since Jan. 1st 1970 UTC) - wxLongLong writeTimeLong(lastWriteTime.dwHighDateTime, lastWriteTime.dwLowDateTime); - writeTimeLong /= 10000000; //reduce precision to 1 second (FILETIME has unit 10^-7 s) - writeTimeLong -= wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - - assert(lastWriteTime.dwHighDateTime <= static_cast<unsigned long>(std::numeric_limits<long>::max())); - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); + zen::Int64 writeTimeLong = zen::to<zen::Int64>(zen::UInt64(lastWriteTime.dwLowDateTime, lastWriteTime.dwHighDateTime) / 10000000U); //reduce precision to 1 second (FILETIME has unit 10^-7 s) + writeTimeLong -= zen::Int64(3054539008UL, 2); //timeshift between ansi C time and FILETIME in seconds == 11644473600s return writeTimeLong; } inline -void setWin32FileInformation(const FILETIME& lastWriteTime, - const DWORD fileSizeHigh, - const DWORD fileSizeLow, - ffs3::TraverseCallback::FileInfo& output) -{ - output.lastWriteTimeRaw = getWin32TimeInformation(lastWriteTime); - output.fileSize = wxULongLong(fileSizeHigh, fileSizeLow); -} - - -inline -bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseCallback::FileInfo& output) +bool setWin32FileInformationFromSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output) { //open handle to target of symbolic link - HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(linkName).c_str(), + HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -68,12 +52,13 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseC Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile); (void)dummy; //silence warning "unused variable" - BY_HANDLE_FILE_INFORMATION fileInfoByHandle; + BY_HANDLE_FILE_INFORMATION fileInfoByHandle = {}; if (!::GetFileInformationByHandle(hFile, &fileInfoByHandle)) return false; //write output - setWin32FileInformation(fileInfoByHandle.ftLastWriteTime, fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow, output); + output.lastWriteTimeRaw = filetimeToTimeT(fileInfoByHandle.ftLastWriteTime); + output.fileSize = zen::UInt64(fileInfoByHandle.nFileSizeLow, fileInfoByHandle.nFileSizeHigh); return true; } #endif @@ -82,7 +67,7 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseC class DirTraverser { public: - DirTraverser(const Zstring& baseDirectory, bool followSymlinks, ffs3::TraverseCallback& sink, ffs3::DstHackCallback* dstCallback) + DirTraverser(const Zstring& baseDirectory, bool followSymlinks, zen::TraverseCallback& sink, zen::DstHackCallback* dstCallback) #ifdef FFS_WIN : isFatFileSystem(dst::isFatDrive(baseDirectory)) #endif @@ -113,9 +98,9 @@ public: private: template <bool followSymlinks> - void traverse(const Zstring& directory, ffs3::TraverseCallback& sink, int level) + void traverse(const Zstring& directory, zen::TraverseCallback& sink, int level) { - using namespace ffs3; + using namespace zen; if (level == 100) //catch endless recursion { @@ -129,9 +114,9 @@ private: directory : directory + common::FILE_NAME_SEPARATOR; - WIN32_FIND_DATA fileMetaData = {}; + WIN32_FIND_DATA fileInfo = {}; HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryFormatted + Zchar('*')).c_str(), //__in LPCTSTR lpFileName - &fileMetaData); //__out LPWIN32_FIND_DATA lpFindFileData + &fileInfo); //__out LPWIN32_FIND_DATA lpFindFileData //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH if (searchHandle == INVALID_HANDLE_VALUE) @@ -141,10 +126,9 @@ private: return; //else: we have a problem... report it: - const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") + wxT("\n\n") + - ffs3::getLastErrorFormatted(lastError); + const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""); - sink.onError(errorMessage); + sink.onError(errorMessage + wxT("\n\n") +zen::getLastErrorFormatted(lastError)); return; } @@ -154,7 +138,7 @@ private: do { //don't return "." and ".." - const Zchar* const shortName = fileMetaData.cFileName; + const Zchar* const shortName = fileInfo.cFileName; if ( shortName[0] == Zstr('.') && ((shortName[1] == Zstr('.') && shortName[2] == Zstr('\0')) || shortName[1] == Zstr('\0'))) @@ -162,7 +146,7 @@ private: const Zstring& fullName = directoryFormatted + shortName; - const bool isSymbolicLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; + const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; if (isSymbolicLink && !followSymlinks) //evaluate symlink directly { @@ -179,11 +163,11 @@ private: #endif } - details.lastWriteTimeRaw = getWin32TimeInformation(fileMetaData.ftLastWriteTime); - details.dirLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows + details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime); + details.dirLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows sink.onSymlink(shortName, fullName, details); } - else if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) + else if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) { const TraverseCallback::ReturnValDir rv = sink.onDir(shortName, fullName); switch (rv.returnCode) @@ -206,7 +190,7 @@ private: { //broken symlink... details.lastWriteTimeRaw = 0; //we are not interested in the modification time of the link - details.fileSize = 0; + details.fileSize = 0U; } } else @@ -214,29 +198,30 @@ private: //####################################### DST hack ########################################### if (isFatFileSystem) { - const dst::RawTime rawTime(fileMetaData.ftCreationTime, fileMetaData.ftLastWriteTime); + const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime); if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error) - fileMetaData.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error) + fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error) else - markForDstHack.push_back(std::make_pair(fullName, fileMetaData.ftLastWriteTime)); + markForDstHack.push_back(std::make_pair(fullName, fileInfo.ftLastWriteTime)); } //####################################### DST hack ########################################### - setWin32FileInformation(fileMetaData.ftLastWriteTime, fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow, details); + details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime); + details.fileSize = zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); } sink.onFile(shortName, fullName, details); } } while (::FindNextFile(searchHandle, // handle to search - &fileMetaData)); // pointer to structure for data on found file + &fileInfo)); // pointer to structure for data on found file const DWORD lastError = ::GetLastError(); if (lastError != ERROR_NO_MORE_FILES) //this is fine { //else we have a problem... report it: const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError)); + sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(lastError)); } #elif defined FFS_LINUX @@ -244,7 +229,7 @@ private: if (dirObj == NULL) { const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); return; } @@ -262,7 +247,7 @@ private: //else: we have a problem... report it: const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ; - sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); return; } @@ -281,7 +266,7 @@ private: if (::lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks { const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(fullName) + wxT("\""); - sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); continue; } @@ -296,7 +281,7 @@ private: //a broken symbolic link TraverseCallback::FileInfo details; details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link - details.fileSize = 0; + details.fileSize = 0U; sink.onFile(shortName, fullName, details); //report broken symlink as file! continue; } @@ -341,7 +326,7 @@ private: { TraverseCallback::FileInfo details; details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second - details.fileSize = fileInfo.st_size; + details.fileSize = zen::UInt64(fileInfo.st_size); sink.onFile(shortName, fullName, details); } @@ -352,7 +337,7 @@ private: #ifdef FFS_WIN //####################################### DST hack ########################################### - void applyDstHack(ffs3::DstHackCallback& dstCallback) + void applyDstHack(zen::DstHackCallback& dstCallback) { int failedAttempts = 0; int filesToValidate = 50; //don't let data verification become a performance issue @@ -366,7 +351,7 @@ private: const dst::RawTime encodedTime = dst::fatEncodeUtcTime(i->second); //throw (std::runtime_error) { - HANDLE hTarget = ::CreateFile(ffs3::applyLongPathPrefix(i->first).c_str(), + HANDLE hTarget = ::CreateFile(zen::applyLongPathPrefix(i->first).c_str(), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -400,7 +385,7 @@ private: //dst hack: verify data written; attention: this check may fail for "sync.ffs_lock" WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {}; - ::GetFileAttributesEx(ffs3::applyLongPathPrefix(i->first).c_str(), //__in LPCTSTR lpFileName, + ::GetFileAttributesEx(zen::applyLongPathPrefix(i->first).c_str(), //__in LPCTSTR lpFileName, GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, &debugeAttr); //__out LPVOID lpFileInformation @@ -423,7 +408,7 @@ private: }; -void ffs3::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback) +void zen::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback) { DirTraverser(directory, followSymlinks, sink, dstCallback); } diff --git a/shared/file_traverser.h b/shared/file_traverser.h index 0e25886b..db77f7cd 100644 --- a/shared/file_traverser.h +++ b/shared/file_traverser.h @@ -7,13 +7,14 @@ #ifndef FILETRAVERSER_H_INCLUDED #define FILETRAVERSER_H_INCLUDED +#include <wx/string.h> #include "zstring.h" -#include <wx/longlong.h> #include "loki/TypeManip.h" +#include "int64.h" //advanced file traverser returning metadata and hierarchical information on files and directories -namespace ffs3 +namespace zen { class TraverseCallback { @@ -22,13 +23,13 @@ public: struct FileInfo { - wxULongLong fileSize; //unit: bytes! - wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC + zen::UInt64 fileSize; //unit: bytes! + zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC }; struct SymlinkInfo { - wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC + zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC Zstring targetPath; //may be empty if something goes wrong bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux) }; diff --git a/shared/global_func.cpp b/shared/global_func.cpp index 07a68187..d25f30d2 100644 --- a/shared/global_func.cpp +++ b/shared/global_func.cpp @@ -5,11 +5,15 @@ // ************************************************************************** // #include "global_func.h" +#include "string_tools.h" #include <wx/msgdlg.h> #include <wx/file.h> #include <wx/stopwatch.h> #include "system_constants.h" +using namespace common; +using namespace zen; + size_t common::getDigitCount(size_t number) //count number of digits { @@ -55,13 +59,13 @@ void DebugLog::write(const wxString& logText) } logFile->Write(wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ")); - logFile->Write(logText + common::LINE_BREAK); + logFile->Write(logText + LINE_BREAK); } //DebugLog logDebugInfo; -wxString getCodeLocation(const wxString file, const int line) +wxString getCodeLocation(const wxString& file, int line) { - return wxString(file).AfterLast(common::FILE_NAME_SEPARATOR) + wxT(", LINE ") + wxLongLong(line).ToString() + wxT(" | "); + return wxString(file).AfterLast(FILE_NAME_SEPARATOR) + wxT(", LINE ") + toString<wxString>(line) + wxT(" | "); } diff --git a/shared/global_func.h b/shared/global_func.h index e0f5434a..9dd1faf7 100644 --- a/shared/global_func.h +++ b/shared/global_func.h @@ -12,57 +12,20 @@ #include <vector> #include <set> #include <wx/string.h> -#include <wx/longlong.h> -#include <memory> -#include <sstream> - -class wxStopWatch; +//#include <memory> +//#include <sstream> namespace common { -//------------------------------------------------ -// FUNCTIONS -//------------------------------------------------ -inline -int round(double d) //little rounding function -{ - return static_cast<int>(d < 0 ? d - .5 : d + .5); -} - -template <class T> -inline -T abs(const T& d) //absolute value -{ - return d < 0 ? -d : d; -} - - -//formatted number conversion C++ ANSI/wide char versions -template <class CharType, class T> -std::basic_string<CharType> numberToString(const T& number); //convert number to string the C++ way - -template <class T, class CharType> -T stringToNumber(const std::basic_string<CharType>& input); //convert number to string the C++ way - -//formatted number conversion wxWidgets -template <class T> wxString numberToString(const T& number); -template <class T> T stringToNumber(const wxString& input); +//little rounding function +inline int round(double d) { return static_cast<int>(d < 0 ? d - .5 : d + .5); } +//absolute value +template <class T> inline T abs(const T& d) { return d < 0 ? -d : d; } size_t getDigitCount(size_t number); //count number of digits -//serialization: read/write numbers: int, long, unsigned int ... ect -template <class T> T readNumber(std::istream& stream); -template <class T> void writeNumber(std::ostream& stream, T number); - -inline -wxLongLong convertToSigned(const wxULongLong number) -{ - return wxLongLong(number.GetHi(), number.GetLo()); -} - - //Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most! template <class T> void removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid); @@ -118,43 +81,6 @@ wxString getCodeLocation(const wxString file, const int line); //---------------Inline Implementation--------------------------------------------------- -template <class CharType, class T> -inline -std::basic_string<CharType> common::numberToString(const T& number) //convert number to string the C++ way -{ - std::basic_ostringstream<CharType> ss; - ss << number; - return ss.str(); -} - - -template <class T, class CharType> -inline -T common::stringToNumber(const std::basic_string<CharType>& input) //convert number to string the C++ way -{ - T number = 0; - std::basic_istringstream<CharType>(input) >> number; - return number; -} - - -template <class T> -inline -wxString common::numberToString(const T& number) -{ - return numberToString<wxChar, T>(number).c_str(); -} - - -template <class T> -inline -T common::stringToNumber(const wxString& input) -{ - const std::basic_string<wxChar> inputConv(input.c_str()); - return stringToNumber<T, wxChar>(inputConv); -} - - //Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most! template <class T> void common::removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid) @@ -200,23 +126,4 @@ ForwardIterator common::custom_binary_search(ForwardIterator first, ForwardItera return last; } - -template <class T> -inline -T common::readNumber(std::istream& stream) -{ - T result = 0; - stream.read(reinterpret_cast<char*>(&result), sizeof(T)); - return result; -} - - -template <class T> -inline -void common::writeNumber(std::ostream& stream, T number) -{ - stream.write(reinterpret_cast<const char*>(&number), sizeof(T)); -} - - -#endif // GLOBALFUNCTIONS_H_INCLUDED +#endif // GLOBALFUNCTIONS_H_INCLUDED
\ No newline at end of file diff --git a/shared/guid.cpp b/shared/guid.cpp index dcf63e60..5e6a64a7 100644 --- a/shared/guid.cpp +++ b/shared/guid.cpp @@ -9,16 +9,11 @@ //boost really should clean a bit up... #ifdef __MINGW32__ -#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wshadow" #endif #include <boost/uuid/uuid_generators.hpp> -#ifdef __MINGW32__ -#pragma GCC diagnostic pop -#endif - std::string util::generateGUID() //creates a 16 byte GUID { diff --git a/shared/help_provider.cpp b/shared/help_provider.cpp index 9b9e1bc6..2c5d5aa9 100644 --- a/shared/help_provider.cpp +++ b/shared/help_provider.cpp @@ -16,7 +16,7 @@ class HelpProvider public: HelpProvider() { - controller.Initialize(ffs3::getResourceDir() + + controller.Initialize(zen::getResourceDir() + #ifdef FFS_WIN wxT("FreeFileSync.chm")); #elif defined FFS_LINUX @@ -37,7 +37,7 @@ private: }; } -void ffs3::displayHelpEntry(const wxString& section) +void zen::displayHelpEntry(const wxString& section) { static HelpProvider provider; provider.showHelp(section); diff --git a/shared/help_provider.h b/shared/help_provider.h index 0fd9ab2f..01ac3054 100644 --- a/shared/help_provider.h +++ b/shared/help_provider.h @@ -9,7 +9,7 @@ #include <wx/string.h> -namespace ffs3 +namespace zen { void displayHelpEntry(const wxString& section = wxEmptyString); } diff --git a/shared/i18n.cpp b/shared/i18n.cpp index 8e0bc22c..8c0e900c 100644 --- a/shared/i18n.cpp +++ b/shared/i18n.cpp @@ -1,1076 +1,20 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// #include "i18n.h" -#include <fstream> -#include <map> -#include <wx/ffile.h> -#include <wx/intl.h> -#include <wx/msgdlg.h> -#include "../shared/standard_paths.h" -#include "../shared/string_conv.h" -#include "system_constants.h" -#include <boost/any.hpp> -#include <boost/shared_ptr.hpp> -#include <list> -#include <iterator> - -using ffs3::LocalizationInfo; - - -namespace -{ -//will receive their proper value in CustomLocale::CustomLocale() -wxString THOUSANDS_SEPARATOR = wxT(","); -wxString DECIMAL_POINT = wxT("."); - -typedef std::map<wxString, wxString> Translation; -Translation activeTranslation; //map original text |-> translation - -int activeLanguage = wxLANGUAGE_ENGLISH; -} - - -wxString ffs3::getThousandsSeparator() -{ - return THOUSANDS_SEPARATOR; -} - - -wxString ffs3::getDecimalPoint() -{ - return DECIMAL_POINT; -} - - -const std::vector<ffs3::LocInfoLine>& LocalizationInfo::get() -{ - static LocalizationInfo instance; - return instance.locMapping; -} - - -LocalizationInfo::LocalizationInfo() -{ - ffs3::LocInfoLine newEntry; - - newEntry.languageID = wxLANGUAGE_CZECH; - newEntry.languageName = wxT("ÄŒeÅ¡tina"); - newEntry.languageFile = wxT("czech.lng"); - newEntry.translatorName = wxT("ViCi"); - newEntry.languageFlag = wxT("czechRep.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_GERMAN; - newEntry.languageName = wxT("Deutsch"); - newEntry.languageFile = wxT("german.lng"); - newEntry.translatorName = wxT("ZenJu"); - newEntry.languageFlag = wxT("germany.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ENGLISH_UK; - newEntry.languageName = wxT("English (UK)"); - newEntry.languageFile = wxT("english_uk.lng"); - newEntry.translatorName = wxT("Robert Readman"); - newEntry.languageFlag = wxT("england.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ENGLISH; - newEntry.languageName = wxT("English (US)"); - newEntry.languageFile = wxT(""); - newEntry.translatorName = wxT("ZenJu"); - newEntry.languageFlag = wxT("usa.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SPANISH; - newEntry.languageName = wxT("Español"); - newEntry.languageFile = wxT("spanish.lng"); - newEntry.translatorName = wxT("Alexis MartÃnez"); - newEntry.languageFlag = wxT("spain.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_GREEK; - newEntry.languageName = wxT("Ελληνικά"); - newEntry.languageFile = wxT("greek.lng"); - newEntry.translatorName = wxT("ΓιώÏγος Γιαγλής"); - newEntry.languageFlag = wxT("greece.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_FRENCH; - newEntry.languageName = wxT("Français"); - newEntry.languageFile = wxT("french.lng"); - newEntry.translatorName = wxT("Jean-François Hartmann"); - newEntry.languageFlag = wxT("france.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ITALIAN; - newEntry.languageName = wxT("Italiano"); - newEntry.languageFile = wxT("italian.lng"); - newEntry.translatorName = wxT("Emmo"); - newEntry.languageFlag = wxT("italy.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_HUNGARIAN; - newEntry.languageName = wxT("Magyar"); - newEntry.languageFile = wxT("hungarian.lng"); - newEntry.translatorName = wxT("Demon"); - newEntry.languageFlag = wxT("hungary.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_DUTCH; - newEntry.languageName = wxT("Nederlands"); - newEntry.languageFile = wxT("dutch.lng"); - newEntry.translatorName = wxT("Dion van Lieshout"); - newEntry.languageFlag = wxT("holland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_POLISH; - newEntry.languageName = wxT("Polski"); - newEntry.languageFile = wxT("polish.lng"); - newEntry.translatorName = wxT("Wojtek Pietruszewski"); - newEntry.languageFlag = wxT("poland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_PORTUGUESE; - newEntry.languageName = wxT("Português"); - newEntry.languageFile = wxT("portuguese.lng"); - newEntry.translatorName = wxT("QuestMark"); - newEntry.languageFlag = wxT("portugal.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_PORTUGUESE_BRAZILIAN; - newEntry.languageName = wxT("Português do Brasil"); - newEntry.languageFile = wxT("portuguese_br.lng"); - newEntry.translatorName = wxT("Edison Aranha"); - newEntry.languageFlag = wxT("brazil.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_RUSSIAN; - newEntry.languageName = wxT("PуÑÑкий"); - newEntry.languageFile = wxT("russian.lng"); - newEntry.translatorName = wxT("Fayzullin T.N. aka Svobodniy"); - newEntry.languageFlag = wxT("russia.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ROMANIAN; - newEntry.languageName = wxT("Română"); - newEntry.languageFile = wxT("romanian.lng"); - newEntry.translatorName = wxT("Alexandru Bogdan Munteanu"); - newEntry.languageFlag = wxT("romania.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SLOVENIAN; - newEntry.languageName = wxT("SlovenÅ¡Äina"); - newEntry.languageFile = wxT("slovenian.lng"); - newEntry.translatorName = wxT("Matej Badalic"); - newEntry.languageFlag = wxT("slovakia.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_FINNISH; - newEntry.languageName = wxT("Suomi"); - newEntry.languageFile = wxT("finnish.lng"); - newEntry.translatorName = wxT("Nalle Juslén"); - newEntry.languageFlag = wxT("finland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SWEDISH; - newEntry.languageName = wxT("Svenska"); - newEntry.languageFile = wxT("swedish.lng"); - newEntry.translatorName = wxT("Ã…ke Engelbrektson"); - newEntry.languageFlag = wxT("sweden.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_TURKISH; - newEntry.languageName = wxT("Türkçe"); - newEntry.languageFile = wxT("turkish.lng"); - newEntry.translatorName = wxT("Kaya Zeren"); - newEntry.languageFlag = wxT("turkey.png"); - locMapping.push_back(newEntry); - - // newEntry.languageID = wxLANGUAGE_HEBREW; - // newEntry.languageName = wxT("עִבְרִית"); - // newEntry.languageFile = wxT("hebrew.lng"); - // newEntry.translatorName = wxT("Moshe Olshevsky"); - // newEntry.languageFlag = wxT("isreal.png"); - // locMapping.push_back(newEntry); - - // newEntry.languageID = wxLANGUAGE_ARABIC; - // newEntry.languageName = wxT("العربية"); - // newEntry.languageFile = wxT("arabic.lng"); - // newEntry.translatorName = wxT("Yousef Shamshoum"); - // newEntry.languageFlag = wxT("arabic-language.png"); - // locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_JAPANESE; - newEntry.languageName = wxT("日本語"); - newEntry.languageFile = wxT("japanese.lng"); - newEntry.translatorName = wxT("Tilt"); - newEntry.languageFlag = wxT("japan.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL; - newEntry.languageName = wxT("æ£é«”ä¸æ–‡"); - newEntry.languageFile = wxT("chinese_traditional.lng"); - newEntry.translatorName = wxT("Carlos"); - newEntry.languageFlag = wxT("taiwan.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_CHINESE_SIMPLIFIED; - newEntry.languageName = wxT("简体ä¸æ–‡"); - newEntry.languageFile = wxT("chinese_simple.lng"); - newEntry.translatorName = wxT("CyberCowBoy"); - newEntry.languageFlag = wxT("china.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_KOREAN; - newEntry.languageName = wxT("í•œêµì–´"); - newEntry.languageFile = wxT("korean.lng"); - newEntry.translatorName = wxT("Simon Park"); - newEntry.languageFlag = wxT("south_korea.png"); - locMapping.push_back(newEntry); -} +#include <memory> +using namespace zen; namespace { -int mapLanguageDialect(int language) -{ - switch (language) //map language dialects - { - //variants of wxLANGUAGE_GERMAN - case wxLANGUAGE_GERMAN_AUSTRIAN: - case wxLANGUAGE_GERMAN_BELGIUM: - case wxLANGUAGE_GERMAN_LIECHTENSTEIN: - case wxLANGUAGE_GERMAN_LUXEMBOURG: - case wxLANGUAGE_GERMAN_SWISS: - return wxLANGUAGE_GERMAN; - - //variants of wxLANGUAGE_FRENCH - case wxLANGUAGE_FRENCH_BELGIAN: - case wxLANGUAGE_FRENCH_CANADIAN: - case wxLANGUAGE_FRENCH_LUXEMBOURG: - case wxLANGUAGE_FRENCH_MONACO: - case wxLANGUAGE_FRENCH_SWISS: - return wxLANGUAGE_FRENCH; - - //variants of wxLANGUAGE_DUTCH - case wxLANGUAGE_DUTCH_BELGIAN: - return wxLANGUAGE_DUTCH; - - //variants of wxLANGUAGE_ITALIAN - case wxLANGUAGE_ITALIAN_SWISS: - return wxLANGUAGE_ITALIAN; - - //variants of wxLANGUAGE_CHINESE_SIMPLIFIED - case wxLANGUAGE_CHINESE: - case wxLANGUAGE_CHINESE_SINGAPORE: - return wxLANGUAGE_CHINESE_SIMPLIFIED; - - //variants of wxLANGUAGE_CHINESE_TRADITIONAL - case wxLANGUAGE_CHINESE_TAIWAN: - case wxLANGUAGE_CHINESE_HONGKONG: - case wxLANGUAGE_CHINESE_MACAU: - return wxLANGUAGE_CHINESE_TRADITIONAL; - - //variants of wxLANGUAGE_RUSSIAN - case wxLANGUAGE_RUSSIAN_UKRAINE: - return wxLANGUAGE_RUSSIAN; - - //variants of wxLANGUAGE_SPANISH - case wxLANGUAGE_SPANISH_ARGENTINA: - case wxLANGUAGE_SPANISH_BOLIVIA: - case wxLANGUAGE_SPANISH_CHILE: - case wxLANGUAGE_SPANISH_COLOMBIA: - case wxLANGUAGE_SPANISH_COSTA_RICA: - case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC: - case wxLANGUAGE_SPANISH_ECUADOR: - case wxLANGUAGE_SPANISH_EL_SALVADOR: - case wxLANGUAGE_SPANISH_GUATEMALA: - case wxLANGUAGE_SPANISH_HONDURAS: - case wxLANGUAGE_SPANISH_MEXICAN: - case wxLANGUAGE_SPANISH_MODERN: - case wxLANGUAGE_SPANISH_NICARAGUA: - case wxLANGUAGE_SPANISH_PANAMA: - case wxLANGUAGE_SPANISH_PARAGUAY: - case wxLANGUAGE_SPANISH_PERU: - case wxLANGUAGE_SPANISH_PUERTO_RICO: - case wxLANGUAGE_SPANISH_URUGUAY: - case wxLANGUAGE_SPANISH_US: - case wxLANGUAGE_SPANISH_VENEZUELA: - return wxLANGUAGE_SPANISH; - - //variants of wxLANGUAGE_SWEDISH - case wxLANGUAGE_SWEDISH_FINLAND: - return wxLANGUAGE_SWEDISH; - - //case wxLANGUAGE_CZECH: - //case wxLANGUAGE_FINNISH: - //case wxLANGUAGE_GREEK: - //case wxLANGUAGE_JAPANESE: - //case wxLANGUAGE_POLISH: - //case wxLANGUAGE_SLOVENIAN: - //case wxLANGUAGE_HUNGARIAN: - //case wxLANGUAGE_PORTUGUESE: - //case wxLANGUAGE_PORTUGUESE_BRAZILIAN: - //case wxLANGUAGE_KOREAN: - - //variants of wxLANGUAGE_ARABIC - case wxLANGUAGE_ARABIC_ALGERIA: - case wxLANGUAGE_ARABIC_BAHRAIN: - case wxLANGUAGE_ARABIC_EGYPT: - case wxLANGUAGE_ARABIC_IRAQ: - case wxLANGUAGE_ARABIC_JORDAN: - case wxLANGUAGE_ARABIC_KUWAIT: - case wxLANGUAGE_ARABIC_LEBANON: - case wxLANGUAGE_ARABIC_LIBYA: - case wxLANGUAGE_ARABIC_MOROCCO: - case wxLANGUAGE_ARABIC_OMAN: - case wxLANGUAGE_ARABIC_QATAR: - case wxLANGUAGE_ARABIC_SAUDI_ARABIA: - case wxLANGUAGE_ARABIC_SUDAN: - case wxLANGUAGE_ARABIC_SYRIA: - case wxLANGUAGE_ARABIC_TUNISIA: - case wxLANGUAGE_ARABIC_UAE: - case wxLANGUAGE_ARABIC_YEMEN: - return wxLANGUAGE_ARABIC; - - //variants of wxLANGUAGE_ENGLISH_UK - case wxLANGUAGE_ENGLISH_AUSTRALIA: - case wxLANGUAGE_ENGLISH_NEW_ZEALAND: - case wxLANGUAGE_ENGLISH_TRINIDAD: - case wxLANGUAGE_ENGLISH_CARIBBEAN: - case wxLANGUAGE_ENGLISH_JAMAICA: - case wxLANGUAGE_ENGLISH_BELIZE: - case wxLANGUAGE_ENGLISH_EIRE: - case wxLANGUAGE_ENGLISH_SOUTH_AFRICA: - case wxLANGUAGE_ENGLISH_ZIMBABWE: - case wxLANGUAGE_ENGLISH_BOTSWANA: - case wxLANGUAGE_ENGLISH_DENMARK: - return wxLANGUAGE_ENGLISH_UK; - - default: - return language; - } -} - - -inline -void exchangeEscapeChars(wxString& data) -{ - wxString output; - - const wxChar* input = data.c_str(); - - wxChar value; - while ((value = *input) != wxChar(0)) - { - //read backslash - if (value == wxChar('\\')) - { - //read next character - ++input; - if ((value = *input) == wxChar(0)) - break; - - switch (value) - { - case wxChar('\\'): - output += wxChar('\\'); - break; - case wxChar('n'): - output += wxChar('\n'); - break; - case wxChar('t'): - output += wxChar('\t'); - break; - case wxChar('\"'): - output += wxChar('\"'); - break; - default: - output += value; - } - } - else - output += value; - - ++input; - } - data = output; -} - - -//workaround to get a FILE* from a unicode filename in a portable way -class UnicodeFileReader -{ -public: - UnicodeFileReader(const wxString& filename) : - inputFile(NULL) - { - wxFFile dummyFile(filename, wxT("rb")); - if (dummyFile.IsOpened()) - { - inputFile = dummyFile.fp(); - dummyFile.Detach(); - } - } - - ~UnicodeFileReader() - { - if (inputFile != NULL) - fclose(inputFile); - } - - bool isOkay() - { - return inputFile != NULL; - } - - bool getNextLine(wxString& line) - { - std::string output; - - while (true) - { - const int c = fgetc(inputFile); - if (c == EOF) - return false; - else if (c == 0xD) - { - //Delimiter: - //---------- - //Linux: 0xA \n - //Mac: 0xD \r - //Win: 0xD 0xA \r\n <- language files are in Windows format - - fgetc(inputFile); //discard the 0xA character - - line = wxString::FromUTF8(output.c_str(), output.length()); - return true; - } - output += static_cast<char>(c); - } - } - -private: - FILE* inputFile; -}; - - -void loadTranslation(const wxString& filename, Translation& trans) //empty translation on error -{ - trans.clear(); - - UnicodeFileReader langFile(ffs3::getResourceDir() + wxT("Languages") + ffs3::zToWx(common::FILE_NAME_SEPARATOR) + filename); - if (langFile.isOkay()) - { - int rowNumber = 0; - wxString original; - wxString tmpString; - while (langFile.getNextLine(tmpString)) - { - exchangeEscapeChars(tmpString); - - if (rowNumber++ % 2 == 0) - original = tmpString; - else - { - const wxString& translation = tmpString; - - if (!original.empty() && !translation.empty()) - trans.insert(std::make_pair(original, translation)); - } - } - } -} -} - - -void ffs3::setLanguage(int language) -{ - static class StaticInit - { - public: - StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh... - { - //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale - const lconv* localInfo = ::localeconv(); - - //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations - THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep); - DECIMAL_POINT = wxString::FromUTF8(localInfo->decimal_point); - - // why not working? - // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); - // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point(); - } - private: - wxLocale loc; //required for RTL language support (and nothing else) - } dummy; - - activeLanguage = language; - - //default: english - wxString languageFile; - - //(try to) retrieve language filename - const int mappedLanguage = mapLanguageDialect(language); - for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i) - if (i->languageID == mappedLanguage) - { - languageFile = i->languageFile; - break; - } - - //load language file into buffer - activeTranslation.clear(); - if (!languageFile.empty()) - { - loadTranslation(languageFile, activeTranslation); //empty translation on error - if (activeTranslation.empty()) - { - wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\""), _("Error"), wxOK | wxICON_ERROR); - activeLanguage = wxLANGUAGE_ENGLISH; //reset to english language to show this error just once - } - } - else - ; //if languageFile is empty texts will be english per default +std::auto_ptr<TranslationHandler> globalHandler; } - -int ffs3::getLanguage() +void zen::setTranslator(TranslationHandler* newHandler) { - return activeLanguage; + globalHandler.reset(newHandler); } -int ffs3::retrieveSystemLanguage() +TranslationHandler* zen::getTranslator() { - return wxLocale::GetSystemLanguage(); -} - - - -//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html -//http://translate.sourceforge.net/wiki/l10n/pluralforms -/* -Plural forms parser: Grammar ----------------------------- -expression: - conditional-expression - -conditional-expression: - logical-or-expression - logical-or-expression ? expression : expression - -logical-or-expression: - logical-and-expression - logical-or-expression || logical-and-expression - -logical-and-expression: - equality-expression - logical-and-expression && equality-expression - -equality-expression: - relational-expression - relational-expression == relational-expression - relational-expression != relational-expression - -relational-expression: - multiplicative-expression - multiplicative-expression > multiplicative-expression - multiplicative-expression < multiplicative-expression - multiplicative-expression >= multiplicative-expression - multiplicative-expression <= multiplicative-expression - -multiplicative-expression: - pm-expression - multiplicative-expression % pm-expression - -pm-expression: - N - Number - ( Expression ) -*/ - - - -//expression interface -struct Expression { virtual ~Expression() {} }; - -template <class T> -struct Expr : public Expression -{ - typedef T ValueType; - virtual ValueType eval() const = 0; -}; - -//specific binary expression based on STL function objects -template <class StlOp> -struct BinaryExp : public Expr<typename StlOp::result_type> -{ - typedef const Expr<typename StlOp::first_argument_type> SourceExp; - - BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {} - virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); } - const SourceExp& lhs_; - const SourceExp& rhs_; - StlOp biop_; -}; - -template <class StlOp> -inline -BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast) -{ - return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs), - dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop); -} - -template <class Out> -struct TernaryExp : public Out -{ - TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {} - virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); } - const Expr<bool>& ifExp_; - const Out& thenExp_; - const Out& elseExp_; -}; - -struct LiteralNumberEx : public Expr<int> -{ - LiteralNumberEx(int n) : n_(n) {} - virtual int eval() const { return n_; } - int n_; -}; - -struct NumberN : public Expr<int> -{ - NumberN(int& n) : n_(n) {} - virtual int eval() const { return n_; } - int& n_; -}; - - -typedef Zbase<wchar_t> Wstring; - - -class PluralForm -{ -public: - struct ParsingError {}; - - PluralForm(const Wstring& phrase) : n_(0) //.po format,e.g.: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) - { - Parser(phrase, //in - expr, //out - n_, // - count, // - dump); // - } - - int formCount() const { return count; } - - int getForm(int n) const { n_ = n ; return expr->eval(); } - -private: - typedef std::list<boost::shared_ptr<Expression> > DumpList; - - struct Token - { - enum Type - { - TK_FORM_COUNT, - TK_PHRASE_BEGIN, - TK_ASSIGN, - TK_SEMICOLON, - TK_TERNARY_QUEST, - TK_TERNARY_COLON, - TK_OR, - TK_AND, - TK_EQUAL, - TK_NOT_EQUAL, - TK_LESS, - TK_LESS_EQUAL, - TK_GREATER, - TK_GREATER_EQUAL, - TK_MODULUS, - TK_N, - TK_NUMBER, - TK_BRACKET_LEFT, - TK_BRACKET_RIGHT, - TK_END - }; - - Token(Type t) : type(t), number(0) {} - - Type type; - int number; //if type == TK_NUMBER - }; - - class Scanner - { - public: - Scanner(const Wstring& phrase) : phrase_(phrase) - { - tokens.push_back(std::make_pair(L"nplurals", Token::TK_FORM_COUNT)); - tokens.push_back(std::make_pair(L"plural" , Token::TK_PHRASE_BEGIN)); - tokens.push_back(std::make_pair(L";" , Token::TK_SEMICOLON )); - tokens.push_back(std::make_pair(L"?" , Token::TK_TERNARY_QUEST)); - tokens.push_back(std::make_pair(L":" , Token::TK_TERNARY_COLON)); - tokens.push_back(std::make_pair(L"||", Token::TK_OR )); - tokens.push_back(std::make_pair(L"&&", Token::TK_AND )); - tokens.push_back(std::make_pair(L"==", Token::TK_EQUAL )); - tokens.push_back(std::make_pair(L"=" , Token::TK_ASSIGN )); - tokens.push_back(std::make_pair(L"!=", Token::TK_NOT_EQUAL )); - tokens.push_back(std::make_pair(L"<=", Token::TK_LESS_EQUAL )); - tokens.push_back(std::make_pair(L"<" , Token::TK_LESS )); - tokens.push_back(std::make_pair(L">=", Token::TK_GREATER_EQUAL)); - tokens.push_back(std::make_pair(L">" , Token::TK_GREATER )); - tokens.push_back(std::make_pair(L"%" , Token::TK_MODULUS )); - tokens.push_back(std::make_pair(L"n" , Token::TK_N )); - tokens.push_back(std::make_pair(L"N" , Token::TK_N )); - tokens.push_back(std::make_pair(L"(" , Token::TK_BRACKET_LEFT )); - tokens.push_back(std::make_pair(L")" , Token::TK_BRACKET_RIGHT)); - } - - Token nextToken() - { - phrase_.Trim(true, false); //remove whitespace - - if (phrase_.empty()) return Token(Token::TK_END); - - for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i) - if (phrase_.StartsWith(i->first)) - { - phrase_ = phrase_.substr(i->first.size()); - return Token(i->second); - } - - Wstring::iterator digitEnd = std::find_if(phrase_.begin(), phrase_.end(), std::not1(std::ptr_fun(std::iswdigit))); - int digitCount = digitEnd - phrase_.begin(); - if (digitCount != 0) - { - Token out(Token::TK_NUMBER); - out.number = Wstring(phrase_.c_str(), digitCount).toNumber<int>(); - phrase_ = phrase_.substr(digitCount); - return out; - } - - throw ParsingError(); //unknown token - } - - private: - typedef std::vector<std::pair<Wstring, Token::Type> > TokenList; - TokenList tokens; - Wstring phrase_; - }; - - - class Parser - { - public: - Parser(const Wstring& phrase, //in - const Expr<int>*& expr, int& n, int& count, PluralForm::DumpList& dump) ://out - scn(phrase), - tk(scn.nextToken()), - n_(n), - dump_(dump) - { - consumeToken(Token::TK_FORM_COUNT); - consumeToken(Token::TK_ASSIGN); - - count = token().number; - consumeToken(Token::TK_NUMBER); - - consumeToken(Token::TK_SEMICOLON); - consumeToken(Token::TK_PHRASE_BEGIN); - consumeToken(Token::TK_ASSIGN); - - try - { - const Expression& e = parse(); - expr = &dynamic_cast<const Expr<int>&>(e); - } - catch(std::bad_cast&) { throw ParsingError(); } - - consumeToken(Token::TK_END); - } - - private: - void nextToken() { tk = scn.nextToken(); } - const Token& token() const { return tk; } - - void consumeToken(Token::Type t) - { - if (token().type != t) - throw ParsingError(); - nextToken(); - } - - const Expression& parse() { return parseConditional(); }; - - const Expression& parseConditional() - { - const Expression& e = parseLogicalOr(); - - if (token().type == Token::TK_TERNARY_QUEST) - { - nextToken(); - const Expression& thenEx = parse(); //associativity: <- - consumeToken(Token::TK_TERNARY_COLON); - const Expression& elseEx = parse(); // - - return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e), - dynamic_cast<const Expr<int>&>(thenEx), - dynamic_cast<const Expr<int>&>(elseEx))); - } - return e; - } - - const Expression& parseLogicalOr() - { - const Expression* e = &parseLogicalAnd(); - for (;;) //associativity: -> - if (token().type == Token::TK_OR) - { - nextToken(); - const Expression& rhs = parseLogicalAnd(); - e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>())); - } - else break; - return *e; - } - - const Expression& parseLogicalAnd() - { - const Expression* e = &parseEquality(); - for (;;) //associativity: -> - if (token().type == Token::TK_AND) - { - nextToken(); - const Expression& rhs = parseEquality(); - - e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>())); - } - else break; - return *e; - } - - const Expression& parseEquality() - { - const Expression& e = parseRelational(); - - Token::Type t = token().type; - if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a - { - nextToken(); - const Expression& rhs = parseRelational(); - - if (t == Token::TK_EQUAL) - return manageObj(makeBiExp(e, rhs, std::equal_to<int>())); - else - return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>())); - } - return e; - } - - const Expression& parseRelational() - { - const Expression& e = parseMultiplicative(); - - Token::Type t = token().type; - if (t == Token::TK_LESS || //associativity: n/a - t == Token::TK_LESS_EQUAL|| - t == Token::TK_GREATER || - t == Token::TK_GREATER_EQUAL) - { - nextToken(); - const Expression& rhs = parseMultiplicative(); - - if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>())); - if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>())); - if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>())); - if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>())); - } - return e; - } - - const Expression& parseMultiplicative() - { - const Expression* e = &parsePrimary(); - - for (;;) //associativity: -> - if (token().type == Token::TK_MODULUS) - { - nextToken(); - const Expression& rhs = parsePrimary(); - - //"compile-time" check: n % 0 - const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs); - if (literal && literal->eval() == 0) - throw ParsingError(); - - e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>())); - } - else break; - return *e; - } - - const Expression& parsePrimary() - { - if (token().type == Token::TK_N) - { - nextToken(); - return manageObj(NumberN(n_)); - } - else if (token().type == Token::TK_NUMBER) - { - const int number = token().number; - nextToken(); - return manageObj(LiteralNumberEx(number)); - } - else if (token().type == Token::TK_BRACKET_LEFT) - { - nextToken(); - const Expression& e = parse(); - - consumeToken(Token::TK_BRACKET_RIGHT); - return e; - } - else - throw ParsingError(); - } - - template <class T> - const T& manageObj(const T& obj) - { - boost::shared_ptr<Expression> newEntry(new T(obj)); - dump_.push_back(newEntry); - return static_cast<T&>(*dump_.back()); - } - - Scanner scn; - Token tk; - - int& n_; - DumpList& dump_; //manage polymorphc object lifetimes - }; - - const Expr<int>* expr; - mutable int n_; - int count; - - PluralForm::DumpList dump; //manage polymorphc object lifetimes -}; - - -const wchar_t formPol[] = L"nplurals=3; plural=n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2"; -int tstPol(int n) -{ - return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2; -} - -const wchar_t formRu[] = L"nplurals= 3; plural=n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2"; -int tstRu(int n) -{ - return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2 ; -} - -const wchar_t formLit[] = L"nplurals =3; plural=n% 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0"; -int tstLit(int n) -{ - return n % 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0; -} - -const wchar_t formArab[] = L"nplurals = 6; plural = n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5"; -int tstArab(int n) -{ - return n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5; -} - -const wchar_t formGerm[] = L"nplurals=2; plural= n == 1 ? 0 : 1"; -int tstGerm(int n) -{ - return n == 1 ? 0 : 1; -} - -const wchar_t formFren[] = L"nplurals=2; plural= n <= 1 ? 0 : 1"; -int tstFren(int n) -{ - return n <= 1 ? 0 : 1; -} - -const wchar_t formJap[] = L"nplurals=1; plural=0"; -int tstJap(int n) -{ - return 0; -} - -const wchar_t formRom[] = L"nplurals=3; plural= n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 "; -int tstRom(int n) -{ - return n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ; -} - -const wchar_t formCze[] = L" nplurals=3; plural= n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2"; -int tstCze(int n) -{ - return n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2; -} - -const wchar_t formSlov[] = L" nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 "; -int tstSlov(int n) -{ - return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3; -} - -void unitTest() -{ - typedef int (*TestFun)(int); - typedef std::vector<std::pair<const wchar_t*, TestFun> > PhraseFunList; - PhraseFunList phrases; - phrases.push_back(std::make_pair(formPol, &tstPol)); - phrases.push_back(std::make_pair(formRu, &tstRu)); - phrases.push_back(std::make_pair(formLit, &tstLit)); - phrases.push_back(std::make_pair(formArab, &tstArab)); - phrases.push_back(std::make_pair(formGerm, &tstGerm)); - phrases.push_back(std::make_pair(formFren, &tstFren)); - phrases.push_back(std::make_pair(formJap, &tstJap)); - phrases.push_back(std::make_pair(formRom, &tstRom)); - phrases.push_back(std::make_pair(formCze, &tstCze)); - phrases.push_back(std::make_pair(formSlov, &tstSlov)); - - for (PhraseFunList::const_iterator i = phrases.begin(); i != phrases.end(); ++i) - { - PluralForm pf(i->first); - for (int j = 0; j < 10000000; ++j) - assert((i->second)(j) == pf.getForm(j)); - } -} - - -wxString ffs3::translate(const wxString& original) //translate into currently selected language -{ - /* - int ba = 3; - - unitTest(); - -#ifndef _MSC_VER -#warning 3434 -#endif - - */ - - - - //look for translation in buffer table - const Translation::const_iterator i = activeTranslation.find(original); - if (i != activeTranslation.end()) - return i->second.c_str(); - - //fallback - return original; + return globalHandler.get(); } diff --git a/shared/i18n.h b/shared/i18n.h index 0026cdd5..03456ede 100644 --- a/shared/i18n.h +++ b/shared/i18n.h @@ -4,55 +4,49 @@ // * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * // ************************************************************************** // -#ifndef MISC_H_INCLUDED -#define MISC_H_INCLUDED +#ifndef I18_N_HEADER_3843489325045 +#define I18_N_HEADER_3843489325045 #include <wx/string.h> #include <vector> -namespace ffs3 +namespace zen { -struct LocInfoLine +//implement handler to enable program wide localizations +struct TranslationHandler { - int languageID; - wxString languageName; - wxString languageFile; - wxString translatorName; - wxString languageFlag; -}; - -class LocalizationInfo -{ -public: - static const std::vector<LocInfoLine>& get(); - -private: - LocalizationInfo(); - LocalizationInfo(const LocalizationInfo&); - LocalizationInfo& operator=(const LocalizationInfo&); + virtual ~TranslationHandler() {} - std::vector<LocInfoLine> locMapping; + virtual wxString thousandsSeparator() = 0; + virtual wxString translate(const wxString& text) = 0; //simple translation + virtual wxString translate(const wxString& singular, const wxString& plural, int n) = 0; }; +void setTranslator(TranslationHandler* newHandler = NULL); //takes ownership +TranslationHandler* getTranslator(); -//language independent global variables: just use operating system's default setting! -wxString getThousandsSeparator(); -wxString getDecimalPoint(); -void setLanguage(int language); -int getLanguage(); -int retrieveSystemLanguage(); +inline wxString getThousandsSeparator() { return getTranslator() ? getTranslator()->thousandsSeparator() : wxT(","); }; -wxString translate(const wxString& original); //translate into currently selected language +inline wxString translate(const wxString& text) { return getTranslator() ? getTranslator()->translate(text) : text; } -//translate plural forms: "%x day|%x days" +//translate plural forms: "%x day" "%x days" //returns "%x day" if n == 1; "%x days" else for english language -wxString translate(const wxString& original, int n); +inline wxString translate(const wxString& singular, const wxString& plural, int n) { return getTranslator() ? getTranslator()->translate(singular, plural, n) : n == 1 ? singular : plural; } + +template <class T> inline +wxString translate(const wxString& singular, const wxString& plural, T n) +{ + return translate(singular, plural, static_cast<int>(n % 1000000)); } +} + +#ifndef WXINTL_NO_GETTEXT_MACRO +#error WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro +#endif -//WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro -#define _(s) ffs3::translate(wxT(s)) -#define _P(s, n) ffs3::translate(wxT(s), n) +#define _(s) zen::translate(wxT(s)) +#define _P(s, p, n) zen::translate(wxT(s), wxT(p), n) -#endif // MISC_H_INCLUDED +#endif //I18_N_HEADER_3843489325045 diff --git a/shared/i18n_no_BOM.cpp b/shared/i18n_no_BOM.cpp deleted file mode 100644 index b89d3221..00000000 --- a/shared/i18n_no_BOM.cpp +++ /dev/null @@ -1,1076 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#include "i18n.h" -#include <fstream> -#include <map> -#include <wx/ffile.h> -#include <wx/intl.h> -#include <wx/msgdlg.h> -#include "../shared/standard_paths.h" -#include "../shared/string_conv.h" -#include "system_constants.h" -#include <boost/any.hpp> -#include <boost/shared_ptr.hpp> -#include <list> -#include <iterator> - -using ffs3::LocalizationInfo; - - -namespace -{ -//will receive their proper value in CustomLocale::CustomLocale() -wxString THOUSANDS_SEPARATOR = wxT(","); -wxString DECIMAL_POINT = wxT("."); - -typedef std::map<wxString, wxString> Translation; -Translation activeTranslation; //map original text |-> translation - -int activeLanguage = wxLANGUAGE_ENGLISH; -} - - -wxString ffs3::getThousandsSeparator() -{ - return THOUSANDS_SEPARATOR; -} - - -wxString ffs3::getDecimalPoint() -{ - return DECIMAL_POINT; -} - - -const std::vector<ffs3::LocInfoLine>& LocalizationInfo::get() -{ - static LocalizationInfo instance; - return instance.locMapping; -} - - -LocalizationInfo::LocalizationInfo() -{ - ffs3::LocInfoLine newEntry; - - newEntry.languageID = wxLANGUAGE_CZECH; - newEntry.languageName = wxT("ÄŒeÅ¡tina"); - newEntry.languageFile = wxT("czech.lng"); - newEntry.translatorName = wxT("ViCi"); - newEntry.languageFlag = wxT("czechRep.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_GERMAN; - newEntry.languageName = wxT("Deutsch"); - newEntry.languageFile = wxT("german.lng"); - newEntry.translatorName = wxT("ZenJu"); - newEntry.languageFlag = wxT("germany.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ENGLISH_UK; - newEntry.languageName = wxT("English (UK)"); - newEntry.languageFile = wxT("english_uk.lng"); - newEntry.translatorName = wxT("Robert Readman"); - newEntry.languageFlag = wxT("england.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ENGLISH; - newEntry.languageName = wxT("English (US)"); - newEntry.languageFile = wxT(""); - newEntry.translatorName = wxT("ZenJu"); - newEntry.languageFlag = wxT("usa.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SPANISH; - newEntry.languageName = wxT("Español"); - newEntry.languageFile = wxT("spanish.lng"); - newEntry.translatorName = wxT("Alexis MartÃnez"); - newEntry.languageFlag = wxT("spain.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_GREEK; - newEntry.languageName = wxT("Ελληνικά"); - newEntry.languageFile = wxT("greek.lng"); - newEntry.translatorName = wxT("ΓιώÏγος Γιαγλής"); - newEntry.languageFlag = wxT("greece.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_FRENCH; - newEntry.languageName = wxT("Français"); - newEntry.languageFile = wxT("french.lng"); - newEntry.translatorName = wxT("Jean-François Hartmann"); - newEntry.languageFlag = wxT("france.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ITALIAN; - newEntry.languageName = wxT("Italiano"); - newEntry.languageFile = wxT("italian.lng"); - newEntry.translatorName = wxT("Emmo"); - newEntry.languageFlag = wxT("italy.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_HUNGARIAN; - newEntry.languageName = wxT("Magyar"); - newEntry.languageFile = wxT("hungarian.lng"); - newEntry.translatorName = wxT("Demon"); - newEntry.languageFlag = wxT("hungary.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_DUTCH; - newEntry.languageName = wxT("Nederlands"); - newEntry.languageFile = wxT("dutch.lng"); - newEntry.translatorName = wxT("Dion van Lieshout"); - newEntry.languageFlag = wxT("holland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_POLISH; - newEntry.languageName = wxT("Polski"); - newEntry.languageFile = wxT("polish.lng"); - newEntry.translatorName = wxT("Wojtek Pietruszewski"); - newEntry.languageFlag = wxT("poland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_PORTUGUESE; - newEntry.languageName = wxT("Português"); - newEntry.languageFile = wxT("portuguese.lng"); - newEntry.translatorName = wxT("QuestMark"); - newEntry.languageFlag = wxT("portugal.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_PORTUGUESE_BRAZILIAN; - newEntry.languageName = wxT("Português do Brasil"); - newEntry.languageFile = wxT("portuguese_br.lng"); - newEntry.translatorName = wxT("Edison Aranha"); - newEntry.languageFlag = wxT("brazil.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_RUSSIAN; - newEntry.languageName = wxT("PуÑÑкий"); - newEntry.languageFile = wxT("russian.lng"); - newEntry.translatorName = wxT("Fayzullin T.N. aka Svobodniy"); - newEntry.languageFlag = wxT("russia.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_ROMANIAN; - newEntry.languageName = wxT("Română"); - newEntry.languageFile = wxT("romanian.lng"); - newEntry.translatorName = wxT("Alexandru Bogdan Munteanu"); - newEntry.languageFlag = wxT("romania.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SLOVENIAN; - newEntry.languageName = wxT("SlovenÅ¡Äina"); - newEntry.languageFile = wxT("slovenian.lng"); - newEntry.translatorName = wxT("Matej Badalic"); - newEntry.languageFlag = wxT("slovakia.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_FINNISH; - newEntry.languageName = wxT("Suomi"); - newEntry.languageFile = wxT("finnish.lng"); - newEntry.translatorName = wxT("Nalle Juslén"); - newEntry.languageFlag = wxT("finland.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_SWEDISH; - newEntry.languageName = wxT("Svenska"); - newEntry.languageFile = wxT("swedish.lng"); - newEntry.translatorName = wxT("Ã…ke Engelbrektson"); - newEntry.languageFlag = wxT("sweden.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_TURKISH; - newEntry.languageName = wxT("Türkçe"); - newEntry.languageFile = wxT("turkish.lng"); - newEntry.translatorName = wxT("Kaya Zeren"); - newEntry.languageFlag = wxT("turkey.png"); - locMapping.push_back(newEntry); - - // newEntry.languageID = wxLANGUAGE_HEBREW; - // newEntry.languageName = wxT("עִבְרִית"); - // newEntry.languageFile = wxT("hebrew.lng"); - // newEntry.translatorName = wxT("Moshe Olshevsky"); - // newEntry.languageFlag = wxT("isreal.png"); - // locMapping.push_back(newEntry); - - // newEntry.languageID = wxLANGUAGE_ARABIC; - // newEntry.languageName = wxT("العربية"); - // newEntry.languageFile = wxT("arabic.lng"); - // newEntry.translatorName = wxT("Yousef Shamshoum"); - // newEntry.languageFlag = wxT("arabic-language.png"); - // locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_JAPANESE; - newEntry.languageName = wxT("日本語"); - newEntry.languageFile = wxT("japanese.lng"); - newEntry.translatorName = wxT("Tilt"); - newEntry.languageFlag = wxT("japan.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL; - newEntry.languageName = wxT("æ£é«”ä¸æ–‡"); - newEntry.languageFile = wxT("chinese_traditional.lng"); - newEntry.translatorName = wxT("Carlos"); - newEntry.languageFlag = wxT("taiwan.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_CHINESE_SIMPLIFIED; - newEntry.languageName = wxT("简体ä¸æ–‡"); - newEntry.languageFile = wxT("chinese_simple.lng"); - newEntry.translatorName = wxT("CyberCowBoy"); - newEntry.languageFlag = wxT("china.png"); - locMapping.push_back(newEntry); - - newEntry.languageID = wxLANGUAGE_KOREAN; - newEntry.languageName = wxT("í•œêµì–´"); - newEntry.languageFile = wxT("korean.lng"); - newEntry.translatorName = wxT("Simon Park"); - newEntry.languageFlag = wxT("south_korea.png"); - locMapping.push_back(newEntry); -} - - -namespace -{ -int mapLanguageDialect(int language) -{ - switch (language) //map language dialects - { - //variants of wxLANGUAGE_GERMAN - case wxLANGUAGE_GERMAN_AUSTRIAN: - case wxLANGUAGE_GERMAN_BELGIUM: - case wxLANGUAGE_GERMAN_LIECHTENSTEIN: - case wxLANGUAGE_GERMAN_LUXEMBOURG: - case wxLANGUAGE_GERMAN_SWISS: - return wxLANGUAGE_GERMAN; - - //variants of wxLANGUAGE_FRENCH - case wxLANGUAGE_FRENCH_BELGIAN: - case wxLANGUAGE_FRENCH_CANADIAN: - case wxLANGUAGE_FRENCH_LUXEMBOURG: - case wxLANGUAGE_FRENCH_MONACO: - case wxLANGUAGE_FRENCH_SWISS: - return wxLANGUAGE_FRENCH; - - //variants of wxLANGUAGE_DUTCH - case wxLANGUAGE_DUTCH_BELGIAN: - return wxLANGUAGE_DUTCH; - - //variants of wxLANGUAGE_ITALIAN - case wxLANGUAGE_ITALIAN_SWISS: - return wxLANGUAGE_ITALIAN; - - //variants of wxLANGUAGE_CHINESE_SIMPLIFIED - case wxLANGUAGE_CHINESE: - case wxLANGUAGE_CHINESE_SINGAPORE: - return wxLANGUAGE_CHINESE_SIMPLIFIED; - - //variants of wxLANGUAGE_CHINESE_TRADITIONAL - case wxLANGUAGE_CHINESE_TAIWAN: - case wxLANGUAGE_CHINESE_HONGKONG: - case wxLANGUAGE_CHINESE_MACAU: - return wxLANGUAGE_CHINESE_TRADITIONAL; - - //variants of wxLANGUAGE_RUSSIAN - case wxLANGUAGE_RUSSIAN_UKRAINE: - return wxLANGUAGE_RUSSIAN; - - //variants of wxLANGUAGE_SPANISH - case wxLANGUAGE_SPANISH_ARGENTINA: - case wxLANGUAGE_SPANISH_BOLIVIA: - case wxLANGUAGE_SPANISH_CHILE: - case wxLANGUAGE_SPANISH_COLOMBIA: - case wxLANGUAGE_SPANISH_COSTA_RICA: - case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC: - case wxLANGUAGE_SPANISH_ECUADOR: - case wxLANGUAGE_SPANISH_EL_SALVADOR: - case wxLANGUAGE_SPANISH_GUATEMALA: - case wxLANGUAGE_SPANISH_HONDURAS: - case wxLANGUAGE_SPANISH_MEXICAN: - case wxLANGUAGE_SPANISH_MODERN: - case wxLANGUAGE_SPANISH_NICARAGUA: - case wxLANGUAGE_SPANISH_PANAMA: - case wxLANGUAGE_SPANISH_PARAGUAY: - case wxLANGUAGE_SPANISH_PERU: - case wxLANGUAGE_SPANISH_PUERTO_RICO: - case wxLANGUAGE_SPANISH_URUGUAY: - case wxLANGUAGE_SPANISH_US: - case wxLANGUAGE_SPANISH_VENEZUELA: - return wxLANGUAGE_SPANISH; - - //variants of wxLANGUAGE_SWEDISH - case wxLANGUAGE_SWEDISH_FINLAND: - return wxLANGUAGE_SWEDISH; - - //case wxLANGUAGE_CZECH: - //case wxLANGUAGE_FINNISH: - //case wxLANGUAGE_GREEK: - //case wxLANGUAGE_JAPANESE: - //case wxLANGUAGE_POLISH: - //case wxLANGUAGE_SLOVENIAN: - //case wxLANGUAGE_HUNGARIAN: - //case wxLANGUAGE_PORTUGUESE: - //case wxLANGUAGE_PORTUGUESE_BRAZILIAN: - //case wxLANGUAGE_KOREAN: - - //variants of wxLANGUAGE_ARABIC - case wxLANGUAGE_ARABIC_ALGERIA: - case wxLANGUAGE_ARABIC_BAHRAIN: - case wxLANGUAGE_ARABIC_EGYPT: - case wxLANGUAGE_ARABIC_IRAQ: - case wxLANGUAGE_ARABIC_JORDAN: - case wxLANGUAGE_ARABIC_KUWAIT: - case wxLANGUAGE_ARABIC_LEBANON: - case wxLANGUAGE_ARABIC_LIBYA: - case wxLANGUAGE_ARABIC_MOROCCO: - case wxLANGUAGE_ARABIC_OMAN: - case wxLANGUAGE_ARABIC_QATAR: - case wxLANGUAGE_ARABIC_SAUDI_ARABIA: - case wxLANGUAGE_ARABIC_SUDAN: - case wxLANGUAGE_ARABIC_SYRIA: - case wxLANGUAGE_ARABIC_TUNISIA: - case wxLANGUAGE_ARABIC_UAE: - case wxLANGUAGE_ARABIC_YEMEN: - return wxLANGUAGE_ARABIC; - - //variants of wxLANGUAGE_ENGLISH_UK - case wxLANGUAGE_ENGLISH_AUSTRALIA: - case wxLANGUAGE_ENGLISH_NEW_ZEALAND: - case wxLANGUAGE_ENGLISH_TRINIDAD: - case wxLANGUAGE_ENGLISH_CARIBBEAN: - case wxLANGUAGE_ENGLISH_JAMAICA: - case wxLANGUAGE_ENGLISH_BELIZE: - case wxLANGUAGE_ENGLISH_EIRE: - case wxLANGUAGE_ENGLISH_SOUTH_AFRICA: - case wxLANGUAGE_ENGLISH_ZIMBABWE: - case wxLANGUAGE_ENGLISH_BOTSWANA: - case wxLANGUAGE_ENGLISH_DENMARK: - return wxLANGUAGE_ENGLISH_UK; - - default: - return language; - } -} - - -inline -void exchangeEscapeChars(wxString& data) -{ - wxString output; - - const wxChar* input = data.c_str(); - - wxChar value; - while ((value = *input) != wxChar(0)) - { - //read backslash - if (value == wxChar('\\')) - { - //read next character - ++input; - if ((value = *input) == wxChar(0)) - break; - - switch (value) - { - case wxChar('\\'): - output += wxChar('\\'); - break; - case wxChar('n'): - output += wxChar('\n'); - break; - case wxChar('t'): - output += wxChar('\t'); - break; - case wxChar('\"'): - output += wxChar('\"'); - break; - default: - output += value; - } - } - else - output += value; - - ++input; - } - data = output; -} - - -//workaround to get a FILE* from a unicode filename in a portable way -class UnicodeFileReader -{ -public: - UnicodeFileReader(const wxString& filename) : - inputFile(NULL) - { - wxFFile dummyFile(filename, wxT("rb")); - if (dummyFile.IsOpened()) - { - inputFile = dummyFile.fp(); - dummyFile.Detach(); - } - } - - ~UnicodeFileReader() - { - if (inputFile != NULL) - fclose(inputFile); - } - - bool isOkay() - { - return inputFile != NULL; - } - - bool getNextLine(wxString& line) - { - std::string output; - - while (true) - { - const int c = fgetc(inputFile); - if (c == EOF) - return false; - else if (c == 0xD) - { - //Delimiter: - //---------- - //Linux: 0xA \n - //Mac: 0xD \r - //Win: 0xD 0xA \r\n <- language files are in Windows format - - fgetc(inputFile); //discard the 0xA character - - line = wxString::FromUTF8(output.c_str(), output.length()); - return true; - } - output += static_cast<char>(c); - } - } - -private: - FILE* inputFile; -}; - - -void loadTranslation(const wxString& filename, Translation& trans) //empty translation on error -{ - trans.clear(); - - UnicodeFileReader langFile(ffs3::getResourceDir() + wxT("Languages") + ffs3::zToWx(common::FILE_NAME_SEPARATOR) + filename); - if (langFile.isOkay()) - { - int rowNumber = 0; - wxString original; - wxString tmpString; - while (langFile.getNextLine(tmpString)) - { - exchangeEscapeChars(tmpString); - - if (rowNumber++ % 2 == 0) - original = tmpString; - else - { - const wxString& translation = tmpString; - - if (!original.empty() && !translation.empty()) - trans.insert(std::make_pair(original, translation)); - } - } - } -} -} - - -void ffs3::setLanguage(int language) -{ - static class StaticInit - { - public: - StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh... - { - //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale - const lconv* localInfo = ::localeconv(); - - //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations - THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep); - DECIMAL_POINT = wxString::FromUTF8(localInfo->decimal_point); - - // why not working? - // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); - // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point(); - } - private: - wxLocale loc; //required for RTL language support (and nothing else) - } dummy; - - activeLanguage = language; - - //default: english - wxString languageFile; - - //(try to) retrieve language filename - const int mappedLanguage = mapLanguageDialect(language); - for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i) - if (i->languageID == mappedLanguage) - { - languageFile = i->languageFile; - break; - } - - //load language file into buffer - activeTranslation.clear(); - if (!languageFile.empty()) - { - loadTranslation(languageFile, activeTranslation); //empty translation on error - if (activeTranslation.empty()) - { - wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\""), _("Error"), wxOK | wxICON_ERROR); - activeLanguage = wxLANGUAGE_ENGLISH; //reset to english language to show this error just once - } - } - else - ; //if languageFile is empty texts will be english per default -} - - -int ffs3::getLanguage() -{ - return activeLanguage; -} - - -int ffs3::retrieveSystemLanguage() -{ - return wxLocale::GetSystemLanguage(); -} - - - -//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html -//http://translate.sourceforge.net/wiki/l10n/pluralforms -/* -Plural forms parser: Grammar ----------------------------- -expression: - conditional-expression - -conditional-expression: - logical-or-expression - logical-or-expression ? expression : expression - -logical-or-expression: - logical-and-expression - logical-or-expression || logical-and-expression - -logical-and-expression: - equality-expression - logical-and-expression && equality-expression - -equality-expression: - relational-expression - relational-expression == relational-expression - relational-expression != relational-expression - -relational-expression: - multiplicative-expression - multiplicative-expression > multiplicative-expression - multiplicative-expression < multiplicative-expression - multiplicative-expression >= multiplicative-expression - multiplicative-expression <= multiplicative-expression - -multiplicative-expression: - pm-expression - multiplicative-expression % pm-expression - -pm-expression: - N - Number - ( Expression ) -*/ - - - -//expression interface -struct Expression { virtual ~Expression() {} }; - -template <class T> -struct Expr : public Expression -{ - typedef T ValueType; - virtual ValueType eval() const = 0; -}; - -//specific binary expression based on STL function objects -template <class StlOp> -struct BinaryExp : public Expr<typename StlOp::result_type> -{ - typedef const Expr<typename StlOp::first_argument_type> SourceExp; - - BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {} - virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); } - const SourceExp& lhs_; - const SourceExp& rhs_; - StlOp biop_; -}; - -template <class StlOp> -inline -BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast) -{ - return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs), - dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop); -} - -template <class Out> -struct TernaryExp : public Out -{ - TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {} - virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); } - const Expr<bool>& ifExp_; - const Out& thenExp_; - const Out& elseExp_; -}; - -struct LiteralNumberEx : public Expr<int> -{ - LiteralNumberEx(int n) : n_(n) {} - virtual int eval() const { return n_; } - int n_; -}; - -struct NumberN : public Expr<int> -{ - NumberN(int& n) : n_(n) {} - virtual int eval() const { return n_; } - int& n_; -}; - - -typedef Zbase<wchar_t> Wstring; - - -class PluralForm -{ -public: - struct ParsingError {}; - - PluralForm(const Wstring& phrase) : n_(0) //.po format,e.g.: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) - { - Parser(phrase, //in - expr, //out - n_, // - count, // - dump); // - } - - int formCount() const { return count; } - - int getForm(int n) const { n_ = n ; return expr->eval(); } - -private: - typedef std::list<boost::shared_ptr<Expression> > DumpList; - - struct Token - { - enum Type - { - TK_FORM_COUNT, - TK_PHRASE_BEGIN, - TK_ASSIGN, - TK_SEMICOLON, - TK_TERNARY_QUEST, - TK_TERNARY_COLON, - TK_OR, - TK_AND, - TK_EQUAL, - TK_NOT_EQUAL, - TK_LESS, - TK_LESS_EQUAL, - TK_GREATER, - TK_GREATER_EQUAL, - TK_MODULUS, - TK_N, - TK_NUMBER, - TK_BRACKET_LEFT, - TK_BRACKET_RIGHT, - TK_END - }; - - Token(Type t) : type(t), number(0) {} - - Type type; - int number; //if type == TK_NUMBER - }; - - class Scanner - { - public: - Scanner(const Wstring& phrase) : phrase_(phrase) - { - tokens.push_back(std::make_pair(L"nplurals", Token::TK_FORM_COUNT)); - tokens.push_back(std::make_pair(L"plural" , Token::TK_PHRASE_BEGIN)); - tokens.push_back(std::make_pair(L";" , Token::TK_SEMICOLON )); - tokens.push_back(std::make_pair(L"?" , Token::TK_TERNARY_QUEST)); - tokens.push_back(std::make_pair(L":" , Token::TK_TERNARY_COLON)); - tokens.push_back(std::make_pair(L"||", Token::TK_OR )); - tokens.push_back(std::make_pair(L"&&", Token::TK_AND )); - tokens.push_back(std::make_pair(L"==", Token::TK_EQUAL )); - tokens.push_back(std::make_pair(L"=" , Token::TK_ASSIGN )); - tokens.push_back(std::make_pair(L"!=", Token::TK_NOT_EQUAL )); - tokens.push_back(std::make_pair(L"<=", Token::TK_LESS_EQUAL )); - tokens.push_back(std::make_pair(L"<" , Token::TK_LESS )); - tokens.push_back(std::make_pair(L">=", Token::TK_GREATER_EQUAL)); - tokens.push_back(std::make_pair(L">" , Token::TK_GREATER )); - tokens.push_back(std::make_pair(L"%" , Token::TK_MODULUS )); - tokens.push_back(std::make_pair(L"n" , Token::TK_N )); - tokens.push_back(std::make_pair(L"N" , Token::TK_N )); - tokens.push_back(std::make_pair(L"(" , Token::TK_BRACKET_LEFT )); - tokens.push_back(std::make_pair(L")" , Token::TK_BRACKET_RIGHT)); - } - - Token nextToken() - { - phrase_.Trim(true, false); //remove whitespace - - if (phrase_.empty()) return Token(Token::TK_END); - - for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i) - if (phrase_.StartsWith(i->first)) - { - phrase_ = phrase_.substr(i->first.size()); - return Token(i->second); - } - - Wstring::iterator digitEnd = std::find_if(phrase_.begin(), phrase_.end(), std::not1(std::ptr_fun(std::iswdigit))); - int digitCount = digitEnd - phrase_.begin(); - if (digitCount != 0) - { - Token out(Token::TK_NUMBER); - out.number = Wstring(phrase_.c_str(), digitCount).toNumber<int>(); - phrase_ = phrase_.substr(digitCount); - return out; - } - - throw ParsingError(); //unknown token - } - - private: - typedef std::vector<std::pair<Wstring, Token::Type> > TokenList; - TokenList tokens; - Wstring phrase_; - }; - - - class Parser - { - public: - Parser(const Wstring& phrase, //in - const Expr<int>*& expr, int& n, int& count, PluralForm::DumpList& dump) ://out - scn(phrase), - tk(scn.nextToken()), - n_(n), - dump_(dump) - { - consumeToken(Token::TK_FORM_COUNT); - consumeToken(Token::TK_ASSIGN); - - count = token().number; - consumeToken(Token::TK_NUMBER); - - consumeToken(Token::TK_SEMICOLON); - consumeToken(Token::TK_PHRASE_BEGIN); - consumeToken(Token::TK_ASSIGN); - - try - { - const Expression& e = parse(); - expr = &dynamic_cast<const Expr<int>&>(e); - } - catch(std::bad_cast&) { throw ParsingError(); } - - consumeToken(Token::TK_END); - } - - private: - void nextToken() { tk = scn.nextToken(); } - const Token& token() const { return tk; } - - void consumeToken(Token::Type t) - { - if (token().type != t) - throw ParsingError(); - nextToken(); - } - - const Expression& parse() { return parseConditional(); }; - - const Expression& parseConditional() - { - const Expression& e = parseLogicalOr(); - - if (token().type == Token::TK_TERNARY_QUEST) - { - nextToken(); - const Expression& thenEx = parse(); //associativity: <- - consumeToken(Token::TK_TERNARY_COLON); - const Expression& elseEx = parse(); // - - return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e), - dynamic_cast<const Expr<int>&>(thenEx), - dynamic_cast<const Expr<int>&>(elseEx))); - } - return e; - } - - const Expression& parseLogicalOr() - { - const Expression* e = &parseLogicalAnd(); - for (;;) //associativity: -> - if (token().type == Token::TK_OR) - { - nextToken(); - const Expression& rhs = parseLogicalAnd(); - e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>())); - } - else break; - return *e; - } - - const Expression& parseLogicalAnd() - { - const Expression* e = &parseEquality(); - for (;;) //associativity: -> - if (token().type == Token::TK_AND) - { - nextToken(); - const Expression& rhs = parseEquality(); - - e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>())); - } - else break; - return *e; - } - - const Expression& parseEquality() - { - const Expression& e = parseRelational(); - - Token::Type t = token().type; - if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a - { - nextToken(); - const Expression& rhs = parseRelational(); - - if (t == Token::TK_EQUAL) - return manageObj(makeBiExp(e, rhs, std::equal_to<int>())); - else - return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>())); - } - return e; - } - - const Expression& parseRelational() - { - const Expression& e = parseMultiplicative(); - - Token::Type t = token().type; - if (t == Token::TK_LESS || //associativity: n/a - t == Token::TK_LESS_EQUAL|| - t == Token::TK_GREATER || - t == Token::TK_GREATER_EQUAL) - { - nextToken(); - const Expression& rhs = parseMultiplicative(); - - if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>())); - if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>())); - if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>())); - if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>())); - } - return e; - } - - const Expression& parseMultiplicative() - { - const Expression* e = &parsePrimary(); - - for (;;) //associativity: -> - if (token().type == Token::TK_MODULUS) - { - nextToken(); - const Expression& rhs = parsePrimary(); - - //"compile-time" check: n % 0 - const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs); - if (literal && literal->eval() == 0) - throw ParsingError(); - - e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>())); - } - else break; - return *e; - } - - const Expression& parsePrimary() - { - if (token().type == Token::TK_N) - { - nextToken(); - return manageObj(NumberN(n_)); - } - else if (token().type == Token::TK_NUMBER) - { - const int number = token().number; - nextToken(); - return manageObj(LiteralNumberEx(number)); - } - else if (token().type == Token::TK_BRACKET_LEFT) - { - nextToken(); - const Expression& e = parse(); - - consumeToken(Token::TK_BRACKET_RIGHT); - return e; - } - else - throw ParsingError(); - } - - template <class T> - const T& manageObj(const T& obj) - { - boost::shared_ptr<Expression> newEntry(new T(obj)); - dump_.push_back(newEntry); - return static_cast<T&>(*dump_.back()); - } - - Scanner scn; - Token tk; - - int& n_; - DumpList& dump_; //manage polymorphc object lifetimes - }; - - const Expr<int>* expr; - mutable int n_; - int count; - - PluralForm::DumpList dump; //manage polymorphc object lifetimes -}; - - -const wchar_t formPol[] = L"nplurals=3; plural=n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2"; -int tstPol(int n) -{ - return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2; -} - -const wchar_t formRu[] = L"nplurals= 3; plural=n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2"; -int tstRu(int n) -{ - return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2 ; -} - -const wchar_t formLit[] = L"nplurals =3; plural=n% 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0"; -int tstLit(int n) -{ - return n % 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0; -} - -const wchar_t formArab[] = L"nplurals = 6; plural = n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5"; -int tstArab(int n) -{ - return n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5; -} - -const wchar_t formGerm[] = L"nplurals=2; plural= n == 1 ? 0 : 1"; -int tstGerm(int n) -{ - return n == 1 ? 0 : 1; -} - -const wchar_t formFren[] = L"nplurals=2; plural= n <= 1 ? 0 : 1"; -int tstFren(int n) -{ - return n <= 1 ? 0 : 1; -} - -const wchar_t formJap[] = L"nplurals=1; plural=0"; -int tstJap(int n) -{ - return 0; -} - -const wchar_t formRom[] = L"nplurals=3; plural= n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 "; -int tstRom(int n) -{ - return n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ; -} - -const wchar_t formCze[] = L" nplurals=3; plural= n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2"; -int tstCze(int n) -{ - return n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2; -} - -const wchar_t formSlov[] = L" nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 "; -int tstSlov(int n) -{ - return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3; -} - -void unitTest() -{ - typedef int (*TestFun)(int); - typedef std::vector<std::pair<const wchar_t*, TestFun> > PhraseFunList; - PhraseFunList phrases; - phrases.push_back(std::make_pair(formPol, &tstPol)); - phrases.push_back(std::make_pair(formRu, &tstRu)); - phrases.push_back(std::make_pair(formLit, &tstLit)); - phrases.push_back(std::make_pair(formArab, &tstArab)); - phrases.push_back(std::make_pair(formGerm, &tstGerm)); - phrases.push_back(std::make_pair(formFren, &tstFren)); - phrases.push_back(std::make_pair(formJap, &tstJap)); - phrases.push_back(std::make_pair(formRom, &tstRom)); - phrases.push_back(std::make_pair(formCze, &tstCze)); - phrases.push_back(std::make_pair(formSlov, &tstSlov)); - - for (PhraseFunList::const_iterator i = phrases.begin(); i != phrases.end(); ++i) - { - PluralForm pf(i->first); - for (int j = 0; j < 10000000; ++j) - assert((i->second)(j) == pf.getForm(j)); - } -} - - -wxString ffs3::translate(const wxString& original) //translate into currently selected language -{ - /* - int ba = 3; - - unitTest(); - -#ifndef _MSC_VER -#warning 3434 -#endif - - */ - - - - //look for translation in buffer table - const Translation::const_iterator i = activeTranslation.find(original); - if (i != activeTranslation.end()) - return i->second.c_str(); - - //fallback - return original; -} diff --git a/shared/int64.h b/shared/int64.h new file mode 100644 index 00000000..15900fde --- /dev/null +++ b/shared/int64.h @@ -0,0 +1,227 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef FFS_LARGE_64_BIT_INTEGER_H_INCLUDED +#define FFS_LARGE_64_BIT_INTEGER_H_INCLUDED + +#include <cassert> +#include <ostream> +#include <limits> +#include <boost/cstdint.hpp> +#include <boost/numeric/conversion/bounds.hpp> +#include "assert_static.h" +#include "loki/TypeManip.h" + +#ifdef FFS_WIN +#include <wx/msw/wrapwin.h> +#endif + + +/* +zen::Int64/zen::UInt64: wrapper classes around boost::int64_t/boost::uint64_t + + - default initialization with 0 + - debug runtime overflow/underflow checks + - safe and explicit semantics: no unsafe type conversions + - safe conversion to and from Windows 64-bit integers + - specializes std::numeric_limits + - support stream operator<< and operator>> +*/ + +namespace zen +{ +template <class T, class U> inline void checkRange(U value) +{ + //caveat: std::numeric_limits<T>::min returns minimum positive(!) number for T = double, while behaving correctly for integer types... sigh + //std::numeric_limits<T>::lowest() not available before C++11 + assert(double(boost::numeric::bounds<T>::lowest ()) <= double(value) && + double(boost::numeric::bounds<T>::highest()) >= double(value)); +} + +class Int64 +{ + struct DummyClass { operator int() { return 0; } }; +public: + //safe implicit conversions + Int64() : value(0) {} + Int64(const Int64& rhs) : value(rhs.value) {} + Int64(int rhs) : value(rhs) {} //ambiguity intentional for types other than these + Int64(long rhs) : value(rhs) {} + Int64(Loki::Select<Loki::IsSameType<boost::int64_t, long>::value, DummyClass, boost::int64_t>::Result rhs) : + value(rhs) {} //-> boost::int64_t equals long int on x64 Linux! Still we want implicit behavior for all other systems! + + //unsafe explicit but checked conversion from arbitrary integer type + template <class T> explicit Int64(T rhs) : value(rhs) { checkRange<boost::int64_t>(rhs); } + + Int64& operator=(const Int64& rhs) { value = rhs.value; return *this; } + +#ifdef FFS_WIN + Int64(DWORD low, LONG high) + { + assert_static(sizeof(low) + sizeof(high) == sizeof(value)); + + LARGE_INTEGER cvt = {}; + cvt.LowPart = low; + cvt.HighPart = high; + value = cvt.QuadPart; + } + LONG getHi() const + { + LARGE_INTEGER cvt = {}; + cvt.QuadPart = value; + return cvt.HighPart; + } + DWORD getLo() const + { + LARGE_INTEGER cvt = {}; + cvt.QuadPart = value; + return cvt.LowPart; + } +#endif + + Int64& operator+=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) + rhs.value); value += rhs.value; return *this; } + Int64& operator-=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) - rhs.value); value -= rhs.value; return *this; } + Int64& operator*=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) * rhs.value); value *= rhs.value; return *this; } + Int64& operator/=(const Int64& rhs) { assert(rhs.value != 0); value /= rhs.value; return *this; } + Int64& operator%=(const Int64& rhs) { assert(rhs.value != 0); value %= rhs.value; return *this; } + Int64& operator&=(const Int64& rhs) { value &= rhs.value; return *this;} + Int64& operator|=(const Int64& rhs) { value |= rhs.value; return *this;} + Int64& operator<<=(int rhs) { assert(rhs < 0 || (value << rhs) >> rhs == value); value <<= rhs; return *this; } + Int64& operator>>=(int rhs) { assert(rhs > 0 || (value >> rhs) << rhs == value); value >>= rhs; return *this; } + + inline friend bool operator==(const Int64& lhs, const Int64& rhs) { return lhs.value == rhs.value; } + inline friend bool operator!=(const Int64& lhs, const Int64& rhs) { return lhs.value != rhs.value; } + inline friend bool operator< (const Int64& lhs, const Int64& rhs) { return lhs.value < rhs.value; } + inline friend bool operator> (const Int64& lhs, const Int64& rhs) { return lhs.value > rhs.value; } + inline friend bool operator<=(const Int64& lhs, const Int64& rhs) { return lhs.value <= rhs.value; } + inline friend bool operator>=(const Int64& lhs, const Int64& rhs) { return lhs.value >= rhs.value; } + + //checked conversion to arbitrary target integer type + template <class T> inline friend T to(Int64 number) { checkRange<T>(number.value); return static_cast<T>(number.value); } + + template <class T> inline friend std::basic_istream<T>& operator>>(std::basic_istream<T>& lhs, Int64& rhs) { lhs >> rhs.value; return lhs; } + template <class T> inline friend std::basic_ostream<T>& operator<<(std::basic_ostream<T>& lhs, const Int64& rhs) { lhs << rhs.value; return lhs; } + +private: + boost::int64_t value; +}; + +inline Int64 operator+(const Int64& lhs, const Int64& rhs) { return Int64(lhs) += rhs; } +inline Int64 operator-(const Int64& lhs, const Int64& rhs) { return Int64(lhs) -= rhs; } +inline Int64 operator*(const Int64& lhs, const Int64& rhs) { return Int64(lhs) *= rhs; } +inline Int64 operator/(const Int64& lhs, const Int64& rhs) { return Int64(lhs) /= rhs; } +inline Int64 operator%(const Int64& lhs, const Int64& rhs) { return Int64(lhs) %= rhs; } +inline Int64 operator&(const Int64& lhs, const Int64& rhs) { return Int64(lhs) &= rhs; } +inline Int64 operator|(const Int64& lhs, const Int64& rhs) { return Int64(lhs) |= rhs; } +inline Int64 operator<<(const Int64& lhs, int rhs) { return Int64(lhs) <<= rhs; } +inline Int64 operator>>(const Int64& lhs, int rhs) { return Int64(lhs) >>= rhs; } + + + +class UInt64 +{ + struct DummyClass { operator size_t() { return 0U; } }; +public: + //safe implicit conversions + UInt64() : value(0) {} + UInt64(const UInt64& rhs) : value(rhs.value) {} + UInt64(unsigned int rhs) : value(rhs) {} //ambiguity intentional for types other than these + UInt64(unsigned long rhs) : value(rhs) {} + UInt64(Loki::Select<Loki::IsSameType<boost::uint64_t, unsigned long>::value, DummyClass, boost::uint64_t>::Result rhs) : + value(rhs) {} //-> boost::uint64_t equals unsigned long int on x64 Linux! Still we want implicit behavior for all other systems! + + //unsafe explicit but checked conversion from arbitrary integer type + template <class T> explicit UInt64(T rhs) : value(rhs) { checkRange<boost::uint64_t>(rhs); } + + UInt64& operator=(const UInt64& rhs) { value = rhs.value; return *this; } + +#ifdef FFS_WIN + UInt64(DWORD low, DWORD high) + { + assert_static(sizeof(low) + sizeof(high) == sizeof(value)); + + ULARGE_INTEGER cvt = {}; + cvt.LowPart = low; + cvt.HighPart = high; + value = cvt.QuadPart; + } + DWORD getHi() const + { + ULARGE_INTEGER cvt = {}; + cvt.QuadPart = value; + return cvt.HighPart; + } + DWORD getLo() const + { + ULARGE_INTEGER cvt = {}; + cvt.QuadPart = value; + return cvt.LowPart; + } +#endif + + UInt64& operator+=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) + rhs.value); value += rhs.value; return *this; } + UInt64& operator-=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) - rhs.value); value -= rhs.value; return *this; } + UInt64& operator*=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) * rhs.value); value *= rhs.value; return *this; } + UInt64& operator/=(const UInt64& rhs) { assert(rhs.value != 0); value /= rhs.value; return *this; } + UInt64& operator%=(const UInt64& rhs) { assert(rhs.value != 0); value %= rhs.value; return *this; } + UInt64& operator&=(const UInt64& rhs) { value &= rhs.value; return *this;} + UInt64& operator|=(const UInt64& rhs) { value |= rhs.value; return *this;} + UInt64& operator<<=(int rhs) { assert(rhs < 0 || (value << rhs) >> rhs == value); value <<= rhs; return *this; } + UInt64& operator>>=(int rhs) { assert(rhs > 0 || (value >> rhs) << rhs == value); value >>= rhs; return *this; } + + inline friend bool operator==(const UInt64& lhs, const UInt64& rhs) { return lhs.value == rhs.value; } + inline friend bool operator!=(const UInt64& lhs, const UInt64& rhs) { return lhs.value != rhs.value; } + inline friend bool operator< (const UInt64& lhs, const UInt64& rhs) { return lhs.value < rhs.value; } + inline friend bool operator> (const UInt64& lhs, const UInt64& rhs) { return lhs.value > rhs.value; } + inline friend bool operator<=(const UInt64& lhs, const UInt64& rhs) { return lhs.value <= rhs.value; } + inline friend bool operator>=(const UInt64& lhs, const UInt64& rhs) { return lhs.value >= rhs.value; } + + //checked conversion to arbitrary target integer type + template <class T> inline friend T to(UInt64 number) { checkRange<T>(number.value); return static_cast<T>(number.value); } + + template <class T> inline friend std::basic_istream<T>& operator>>(std::basic_istream<T>& lhs, UInt64& rhs) { lhs >> rhs.value; return lhs; } + template <class T> inline friend std::basic_ostream<T>& operator<<(std::basic_ostream<T>& lhs, const UInt64& rhs) { lhs << rhs.value; return lhs; } + +private: + boost::uint64_t value; +}; + +inline UInt64 operator+(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) += rhs; } +inline UInt64 operator-(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) -= rhs; } +inline UInt64 operator*(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) *= rhs; } +inline UInt64 operator/(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) /= rhs; } +inline UInt64 operator%(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) %= rhs; } +inline UInt64 operator&(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) &= rhs; } +inline UInt64 operator|(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) |= rhs; } +inline UInt64 operator<<(const UInt64& lhs, int rhs) { return UInt64(lhs) <<= rhs; } +inline UInt64 operator>>(const UInt64& lhs, int rhs) { return UInt64(lhs) >>= rhs; } + +template <> inline UInt64 to(Int64 number) { checkRange<boost::uint64_t>(number.value); return UInt64(number.value); } +template <> inline Int64 to(UInt64 number) { checkRange<boost:: int64_t>(number.value); return Int64(number.value); } +} + + +namespace std +{ +assert_static(std::numeric_limits<boost:: int64_t>::is_specialized); +assert_static(std::numeric_limits<boost::uint64_t>::is_specialized); + +template <> class numeric_limits<zen::Int64> : public numeric_limits<boost::int64_t> +{ +public: + static zen::Int64 min() throw() { return numeric_limits<boost::int64_t>::min(); } + static zen::Int64 max() throw() { return numeric_limits<boost::int64_t>::max(); } +}; + +template <> class numeric_limits<zen::UInt64> : public numeric_limits<boost::uint64_t> +{ +public: + static zen::UInt64 min() throw() { return numeric_limits<boost::uint64_t>::min(); } + static zen::UInt64 max() throw() { return numeric_limits<boost::uint64_t>::max(); } +}; +} + +#endif //FFS_LARGE_64_BIT_INTEGER_H_INCLUDED diff --git a/shared/system_func.cpp b/shared/last_error.cpp index 430451e5..8109b669 100644 --- a/shared/system_func.cpp +++ b/shared/last_error.cpp @@ -4,7 +4,9 @@ // * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * // ************************************************************************** // -#include "system_func.h" +#include "last_error.h" +#include "string_tools.h" +#include "i18n.h" #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" @@ -17,13 +19,14 @@ #ifdef FFS_WIN -wxString ffs3::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information +wxString zen::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information { //determine error code if none was specified if (lastError == 0) lastError = ::GetLastError(); - wxString output = wxString(wxT("Windows Error Code ")) + wxString::Format(wxT("%u"), lastError); + wxString output = _("Windows Error Code %x:"); + output.Replace(wxT("%x"), zen::toString<wxString>(lastError)); LPWSTR buffer = NULL; if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | @@ -33,24 +36,26 @@ wxString ffs3::getLastErrorFormatted(unsigned long lastError) //try to get addit { if (buffer) //just to be sure { - output += wxString(wxT(": ")) + buffer; + output += wxT(" "); + output += buffer; ::LocalFree(buffer); } } ::SetLastError(lastError); //restore last error - return output; } #elif defined FFS_LINUX -wxString ffs3::getLastErrorFormatted(int lastError) //try to get additional Linux error information +wxString zen::getLastErrorFormatted(int lastError) //try to get additional Linux error information { //determine error code if none was specified if (lastError == 0) lastError = errno; //don't use "::", errno is a macro! - wxString output = wxString(wxT("Linux Error Code ")) + wxString::Format(wxT("%i"), lastError); - output += wxString(wxT(": ")) + wxString::FromUTF8(::strerror(lastError)); + wxString output = _("Linux Error Code %x:"); + output.Replace(wxT("%x"), zen::toString<wxString>(lastError)); + + output += wxT(" ") + wxString::FromUTF8(::strerror(lastError)); errno = lastError; //restore errno return output; diff --git a/shared/system_func.h b/shared/last_error.h index 0bbd25d0..9db41222 100644 --- a/shared/system_func.h +++ b/shared/last_error.h @@ -10,7 +10,7 @@ #include <wx/string.h> -namespace ffs3 +namespace zen { //evaluate GetLastError()/errno and assemble specific error message #ifdef FFS_WIN diff --git a/shared/localization.cpp b/shared/localization.cpp new file mode 100644 index 00000000..825773d9 --- /dev/null +++ b/shared/localization.cpp @@ -0,0 +1,431 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#include "localization.h" +#include <fstream> +#include <map> +#include <list> +#include <iterator> +#include <wx/ffile.h> +#include <wx/intl.h> +#include <wx/msgdlg.h> +#include "system_constants.h" +#include "parse_plural.h" +#include "parse_lng.h" +#include "util.h" +#include "string_tools.h" +#include "file_traverser.h" +#include "../shared/standard_paths.h" +#include "../shared/string_conv.h" +#include "i18n.h" + +using namespace zen; + + +namespace +{ +//global objects +wxString THOUSANDS_SEPARATOR = wxT(","); + + +class FFSLocale : public TranslationHandler +{ +public: + FFSLocale(const wxString& filename, wxLanguage languageId); //throw (lngfile::ParsingError, PluralForm::ParsingError) + + wxLanguage langId() const { return langId_; } + + virtual wxString thousandsSeparator() { return THOUSANDS_SEPARATOR; }; + + virtual wxString translate(const wxString& text) + { + //look for translation in buffer table + const Translation::const_iterator iter = transMapping.find(text); + if (iter != transMapping.end()) + return iter->second; + + return text; //fallback + } + + virtual wxString translate(const wxString& singular, const wxString& plural, int n) + { + TranslationPlural::const_iterator iter = transMappingPl.find(std::make_pair(singular, plural)); + if (iter != transMappingPl.end()) + { + const int formNo = pluralParser->getForm(n); + if (0 <= formNo && formNo < static_cast<int>(iter->second.size())) + return iter->second[formNo]; + } + + return n == 1 ? singular : plural; //fallback + } + +private: + typedef std::map<wxString, wxString> Translation; + typedef std::map<std::pair<wxString, wxString>, std::vector<wxString> > TranslationPlural; + + Translation transMapping; //map original text |-> translation + TranslationPlural transMappingPl; + std::auto_ptr<PluralForm> pluralParser; + wxLanguage langId_; +}; + + + +std::string getFileStream(const wxString& filename) //return empty string on error throw() +{ + std::string inputStream; + + //workaround to get a FILE* from a unicode filename in a portable way + wxFFile langFile(filename, wxT("rb")); + if (langFile.IsOpened()) + { + FILE* fpInput = langFile.fp(); + + std::vector<char> buffer(50 * 1024); + size_t bytesRead = 0; + do + { + bytesRead = ::fread(&buffer[0], 1, buffer.size(), fpInput); + inputStream.append(&buffer[0], bytesRead); + } + while (bytesRead == buffer.size()); + } + return inputStream; +} + + +FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(languageId) //throw (lngfile::ParsingError, PluralForm::ParsingError) +{ + static class StaticInit + { + public: + StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh... + { + //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale + const lconv* localInfo = ::localeconv(); + + //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations + THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep); + + // why not working? + // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); + // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point(); + } + private: + wxLocale loc; //required for RTL language support (and nothing else) + } dummy; + + + const std::string inputStream = getFileStream(filename); + if (inputStream.empty()) + throw lngfile::ParsingError(0, 0); + + lngfile::TransHeader header; + lngfile::TranslationMap transInput; + lngfile::TranslationPluralMap transPluralInput; + lngfile::parseLng(inputStream, header, transInput, transPluralInput); //throw ParsingError + + for (lngfile::TranslationMap::const_iterator i = transInput.begin(); i != transInput.end(); ++i) + { + const wxString original = wxString::FromUTF8(i->first.c_str()); + const wxString translation = wxString::FromUTF8(i->second.c_str()); + assert(!translation.empty()); + transMapping.insert(std::make_pair(original , translation)); + } + + for (lngfile::TranslationPluralMap::const_iterator i = transPluralInput.begin(); i != transPluralInput.end(); ++i) + { + const wxString singular = wxString::FromUTF8(i->first.first.c_str()); + const wxString plural = wxString::FromUTF8(i->first.second.c_str()); + const lngfile::PluralForms& plForms = i->second; + + std::vector<wxString> plFormsWide; + for (lngfile::PluralForms::const_iterator j = plForms.begin(); j != plForms.end(); ++j) + plFormsWide.push_back(wxString::FromUTF8(j->c_str())); + + assert(!plFormsWide.empty()); + + transMappingPl.insert(std::make_pair(std::make_pair(singular, plural), plFormsWide)); + } + + pluralParser.reset(new PluralForm(header.pluralDefinition.c_str())); //throw PluralForm::ParsingError +} +} + + +class FindLngfiles : public zen::TraverseCallback +{ +public: + FindLngfiles(std::vector<Zstring>& lngFiles) : lngFiles_(lngFiles) {} + + virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) + { + if (Zstring(shortName).EndsWith(Zstr(".lng"))) + lngFiles_.push_back(fullName); + } + + virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {} + virtual ReturnValDir onDir(const Zchar* shortName, const Zstring& fullName) { return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); } + virtual void onError(const wxString& errorText) {} //errors are not really critical in this context + +private: + std::vector<Zstring>& lngFiles_; +}; + + +struct LessTranslation : public std::binary_function<ExistingTranslations::Entry, ExistingTranslations::Entry, bool> +{ + bool operator()(const ExistingTranslations::Entry& lhs, const ExistingTranslations::Entry& rhs) const + { +#ifdef FFS_WIN + //use a more "natural" sort, that is ignore case and diacritics + const int rv = ::CompareString(LOCALE_USER_DEFAULT, //__in LCID Locale, + NORM_IGNORECASE, //__in DWORD dwCmpFlags, + lhs.languageName.c_str(), //__in LPCTSTR lpString1, + static_cast<int>(lhs.languageName.size()), //__in int cchCount1, + rhs.languageName.c_str(), //__in LPCTSTR lpString2, + static_cast<int>(rhs.languageName.size())); //__in int cchCount2 + if (rv == 0) + throw std::runtime_error("Error comparing strings!"); + else + return rv == CSTR_LESS_THAN; //convert to C-style string compare result +#else + return lhs.languageName < rhs.languageName; +#endif + } +}; + + +ExistingTranslations::ExistingTranslations() +{ + { + //default entry: + ExistingTranslations::Entry newEntry; + newEntry.languageID = wxLANGUAGE_ENGLISH_US; + newEntry.languageName = wxT("English (US)"); + newEntry.languageFile = wxT(""); + newEntry.translatorName = wxT("ZenJu"); + newEntry.languageFlag = wxT("usa.png"); + locMapping.push_back(newEntry); + } + + //search language files available + std::vector<Zstring> lngFiles; + FindLngfiles traverseCallback(lngFiles); + + traverseFolder(wxToZ(zen::getResourceDir() + wxT("Languages")), //throw(); + false, //don't follow symlinks + traverseCallback); + + for (std::vector<Zstring>::const_iterator i = lngFiles.begin(); i != lngFiles.end(); ++i) + { + const std::string stream = getFileStream(zToWx(*i)); + if (!stream.empty()) + try + { + lngfile::TransHeader lngHeader; + lngfile::parseHeader(stream, lngHeader); //throw ParsingError + + const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(wxString::FromUTF8(lngHeader.localeName.c_str())); + if (locInfo) + { + ExistingTranslations::Entry newEntry; + newEntry.languageID = locInfo->Language; + newEntry.languageName = wxString::FromUTF8(lngHeader.languageName.c_str()); + newEntry.languageFile = zToWx(*i); + newEntry.translatorName = wxString::FromUTF8(lngHeader.translatorName.c_str()); + newEntry.languageFlag = wxString::FromUTF8(lngHeader.flagFile.c_str()); + locMapping.push_back(newEntry); + } + } + catch (lngfile::ParsingError&) {} + } + + std::sort(locMapping.begin(), locMapping.end(), LessTranslation()); +} + + +namespace +{ +wxLanguage mapLanguageDialect(wxLanguage language) +{ + switch (static_cast<int>(language)) //map language dialects + { + //variants of wxLANGUAGE_GERMAN + case wxLANGUAGE_GERMAN_AUSTRIAN: + case wxLANGUAGE_GERMAN_BELGIUM: + case wxLANGUAGE_GERMAN_LIECHTENSTEIN: + case wxLANGUAGE_GERMAN_LUXEMBOURG: + case wxLANGUAGE_GERMAN_SWISS: + return wxLANGUAGE_GERMAN; + + //variants of wxLANGUAGE_FRENCH + case wxLANGUAGE_FRENCH_BELGIAN: + case wxLANGUAGE_FRENCH_CANADIAN: + case wxLANGUAGE_FRENCH_LUXEMBOURG: + case wxLANGUAGE_FRENCH_MONACO: + case wxLANGUAGE_FRENCH_SWISS: + return wxLANGUAGE_FRENCH; + + //variants of wxLANGUAGE_DUTCH + case wxLANGUAGE_DUTCH_BELGIAN: + return wxLANGUAGE_DUTCH; + + //variants of wxLANGUAGE_ITALIAN + case wxLANGUAGE_ITALIAN_SWISS: + return wxLANGUAGE_ITALIAN; + + //variants of wxLANGUAGE_CHINESE_SIMPLIFIED + case wxLANGUAGE_CHINESE: + case wxLANGUAGE_CHINESE_SINGAPORE: + return wxLANGUAGE_CHINESE_SIMPLIFIED; + + //variants of wxLANGUAGE_CHINESE_TRADITIONAL + case wxLANGUAGE_CHINESE_TAIWAN: + case wxLANGUAGE_CHINESE_HONGKONG: + case wxLANGUAGE_CHINESE_MACAU: + return wxLANGUAGE_CHINESE_TRADITIONAL; + + //variants of wxLANGUAGE_RUSSIAN + case wxLANGUAGE_RUSSIAN_UKRAINE: + return wxLANGUAGE_RUSSIAN; + + //variants of wxLANGUAGE_SPANISH + case wxLANGUAGE_SPANISH_ARGENTINA: + case wxLANGUAGE_SPANISH_BOLIVIA: + case wxLANGUAGE_SPANISH_CHILE: + case wxLANGUAGE_SPANISH_COLOMBIA: + case wxLANGUAGE_SPANISH_COSTA_RICA: + case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC: + case wxLANGUAGE_SPANISH_ECUADOR: + case wxLANGUAGE_SPANISH_EL_SALVADOR: + case wxLANGUAGE_SPANISH_GUATEMALA: + case wxLANGUAGE_SPANISH_HONDURAS: + case wxLANGUAGE_SPANISH_MEXICAN: + case wxLANGUAGE_SPANISH_MODERN: + case wxLANGUAGE_SPANISH_NICARAGUA: + case wxLANGUAGE_SPANISH_PANAMA: + case wxLANGUAGE_SPANISH_PARAGUAY: + case wxLANGUAGE_SPANISH_PERU: + case wxLANGUAGE_SPANISH_PUERTO_RICO: + case wxLANGUAGE_SPANISH_URUGUAY: + case wxLANGUAGE_SPANISH_US: + case wxLANGUAGE_SPANISH_VENEZUELA: + return wxLANGUAGE_SPANISH; + + //variants of wxLANGUAGE_SWEDISH + case wxLANGUAGE_SWEDISH_FINLAND: + return wxLANGUAGE_SWEDISH; + + //case wxLANGUAGE_CZECH: + //case wxLANGUAGE_FINNISH: + //case wxLANGUAGE_GREEK: + //case wxLANGUAGE_JAPANESE: + //case wxLANGUAGE_POLISH: + //case wxLANGUAGE_SLOVENIAN: + //case wxLANGUAGE_HUNGARIAN: + //case wxLANGUAGE_PORTUGUESE: + //case wxLANGUAGE_PORTUGUESE_BRAZILIAN: + //case wxLANGUAGE_KOREAN: + //case wxLANGUAGE_UKRAINIAN: + + //variants of wxLANGUAGE_ARABIC + case wxLANGUAGE_ARABIC_ALGERIA: + case wxLANGUAGE_ARABIC_BAHRAIN: + case wxLANGUAGE_ARABIC_EGYPT: + case wxLANGUAGE_ARABIC_IRAQ: + case wxLANGUAGE_ARABIC_JORDAN: + case wxLANGUAGE_ARABIC_KUWAIT: + case wxLANGUAGE_ARABIC_LEBANON: + case wxLANGUAGE_ARABIC_LIBYA: + case wxLANGUAGE_ARABIC_MOROCCO: + case wxLANGUAGE_ARABIC_OMAN: + case wxLANGUAGE_ARABIC_QATAR: + case wxLANGUAGE_ARABIC_SAUDI_ARABIA: + case wxLANGUAGE_ARABIC_SUDAN: + case wxLANGUAGE_ARABIC_SYRIA: + case wxLANGUAGE_ARABIC_TUNISIA: + case wxLANGUAGE_ARABIC_UAE: + case wxLANGUAGE_ARABIC_YEMEN: + return wxLANGUAGE_ARABIC; + + //variants of wxLANGUAGE_ENGLISH_UK + case wxLANGUAGE_ENGLISH_AUSTRALIA: + case wxLANGUAGE_ENGLISH_NEW_ZEALAND: + case wxLANGUAGE_ENGLISH_TRINIDAD: + case wxLANGUAGE_ENGLISH_CARIBBEAN: + case wxLANGUAGE_ENGLISH_JAMAICA: + case wxLANGUAGE_ENGLISH_BELIZE: + case wxLANGUAGE_ENGLISH_EIRE: + case wxLANGUAGE_ENGLISH_SOUTH_AFRICA: + case wxLANGUAGE_ENGLISH_ZIMBABWE: + case wxLANGUAGE_ENGLISH_BOTSWANA: + case wxLANGUAGE_ENGLISH_DENMARK: + return wxLANGUAGE_ENGLISH_UK; + + default: + return language; + } +} +} + + +void zen::setLanguage(int language) +{ + //(try to) retrieve language file + wxString languageFile; + for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i) + if (i->languageID == language) + { + languageFile = i->languageFile; + break; + } + + + //reset to english language; in case of error show error message just once + zen::setTranslator(); + + //load language file into buffer + if (!languageFile.empty()) //if languageFile is empty texts will be english per default + { + try + { + zen::setTranslator(new FFSLocale(languageFile, static_cast<wxLanguage>(language))); //throw (lngfile::ParsingError, PluralForm::ParsingError) + } + catch (lngfile::ParsingError& e) + { + wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\"") + wxT("\n\n") + + wxT("Row: ") + zen::toStringSep(e.row) + wxT("\n") + + wxT("Column: ") + zen::toStringSep(e.col) + wxT("\n"), _("Error"), wxOK | wxICON_ERROR); + } + catch (PluralForm::ParsingError&) + { + wxMessageBox(wxT("Invalid Plural Form"), _("Error"), wxOK | wxICON_ERROR); + } + } +} + + + +int zen::getLanguage() +{ + FFSLocale* loc = dynamic_cast<FFSLocale*>(zen::getTranslator()); + return loc ? loc->langId() : wxLANGUAGE_ENGLISH_US; +} + + +int zen::retrieveSystemLanguage() +{ + return mapLanguageDialect(static_cast<wxLanguage>(wxLocale::GetSystemLanguage())); +} + + +const std::vector<ExistingTranslations::Entry>& ExistingTranslations::get() +{ + static ExistingTranslations instance; + return instance.locMapping; +} diff --git a/shared/localization.h b/shared/localization.h new file mode 100644 index 00000000..07ac2a69 --- /dev/null +++ b/shared/localization.h @@ -0,0 +1,41 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef MISC_H_INCLUDED +#define MISC_H_INCLUDED + +#include <wx/string.h> +#include <vector> + +namespace zen +{ +class ExistingTranslations +{ +public: + struct Entry + { + int languageID; + wxString languageName; + wxString languageFile; + wxString translatorName; + wxString languageFlag; + }; + static const std::vector<Entry>& get(); + +private: + ExistingTranslations(); + ExistingTranslations(const ExistingTranslations&); + ExistingTranslations& operator=(const ExistingTranslations&); + + std::vector<Entry> locMapping; +}; + +void setLanguage(int language); +int getLanguage(); +int retrieveSystemLanguage(); +} + +#endif // MISC_H_INCLUDED diff --git a/shared/loki/Factory.h b/shared/loki/Factory.h index 6a1ac6b7..abf4ab3b 100644 --- a/shared/loki/Factory.h +++ b/shared/loki/Factory.h @@ -210,7 +210,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6> > virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6 ) - = 0; + = 0; }; template<typename AP, typename Id, @@ -229,7 +229,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7> > virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7 ) - = 0; + = 0; }; template<typename AP, typename Id, @@ -249,7 +249,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8> > virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8) - = 0; + = 0; }; template<typename AP, typename Id, @@ -270,7 +270,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9> > virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9) - = 0; + = 0; }; template<typename AP, typename Id, @@ -292,7 +292,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> > virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10) - = 0; + = 0; }; template<typename AP, typename Id, @@ -317,7 +317,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11> > virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11) - = 0; + = 0; }; template<typename AP, typename Id, @@ -343,7 +343,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12) - = 0; + = 0; }; template<typename AP, typename Id, @@ -370,7 +370,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12,Parm13) - = 0; + = 0; }; template<typename AP, typename Id, @@ -398,7 +398,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm8,Parm10, Parm11,Parm12,Parm13,Parm14) - = 0; + = 0; }; template<typename AP, typename Id, @@ -427,7 +427,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12,Parm13,Parm14,Parm15 ) - = 0; + = 0; }; #ifndef LOKI_DISABLE_TYPELIST_MACROS @@ -503,7 +503,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_6( P1, P2, P3, P4, P5, P6 )> virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6 ) -= 0; + = 0; }; template<typename AP, typename Id, @@ -522,7 +522,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_7( P1, P2, P3, P4, P5, P6, P7 )> virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7 ) -= 0; + = 0; }; template<typename AP, typename Id, @@ -542,7 +542,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_8( P1, P2, P3, P4, P5, P6, P7, P8 )> virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8) -= 0; + = 0; }; template<typename AP, typename Id, @@ -563,7 +563,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_9( P1, P2, P3, P4, P5, P6, P7, P8, P9 ) virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9) -= 0; + = 0; }; template<typename AP, typename Id, @@ -585,7 +585,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_10( P1, P2, P3, P4, P5, P6, P7, P8, P9, virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10) -= 0; + = 0; }; template<typename AP, typename Id, @@ -610,7 +610,7 @@ virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11) -= 0; + = 0; }; template<typename AP, typename Id, @@ -636,7 +636,7 @@ virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12) -= 0; + = 0; }; template<typename AP, typename Id, @@ -663,7 +663,7 @@ virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12,Parm13) -= 0; + = 0; }; template<typename AP, typename Id, @@ -691,7 +691,7 @@ virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm8,Parm10, Parm11,Parm12,Parm13,Parm14) -= 0; + = 0; }; template<typename AP, typename Id, @@ -720,7 +720,7 @@ virtual ~FactoryImpl() {} virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9,Parm10, Parm11,Parm12,Parm13,Parm14,Parm15 ) -= 0; + = 0; }; #endif //LOKI_DISABLE_TYPELIST_MACROS diff --git a/shared/loki/Register.h b/shared/loki/Register.h index 0edf4a37..32409f4b 100644 --- a/shared/loki/Register.h +++ b/shared/loki/Register.h @@ -81,7 +81,7 @@ struct UnRegisterOnDeleteElement template<typename ElementList> struct RegisterOnCreateSet : GenScatterHierarchy<ElementList, Private::RegisterOnCreateElement> - {}; +{}; //////////////////////////////////////////////////////////////////////////////// /// \class UnRegisterOnDeleteSet @@ -95,7 +95,7 @@ struct RegisterOnCreateSet template<typename ElementList> struct UnRegisterOnDeleteSet : GenScatterHierarchy<ElementList, Private::UnRegisterOnDeleteElement> - {}; +{}; //////////////////////////////////////////////////////////////////////////////// diff --git a/shared/loki/ScopeGuard.h b/shared/loki/ScopeGuard.h index 0b5445f5..46e4d892 100644 --- a/shared/loki/ScopeGuard.h +++ b/shared/loki/ScopeGuard.h @@ -66,7 +66,7 @@ protected: j.Execute(); } catch(...) - {} + {} } mutable bool dismissed_; diff --git a/shared/loki/Singleton.h b/shared/loki/Singleton.h index 40cc7550..c5f1f567 100644 --- a/shared/loki/Singleton.h +++ b/shared/loki/Singleton.h @@ -567,21 +567,21 @@ public: /// \brief Longest possible SingletonWithLongevity lifetime: 0xFFFFFFFF template <class T> struct DieLast : SingletonFixedLongevity<0xFFFFFFFF ,T> - {}; +{}; /// \struct DieDirectlyBeforeLast /// \ingroup LongevityLifetimeGroup /// \brief Lifetime is a one less than DieLast: 0xFFFFFFFF-1 template <class T> struct DieDirectlyBeforeLast : SingletonFixedLongevity<0xFFFFFFFF-1 ,T> - {}; +{}; /// \struct DieFirst /// \ingroup LongevityLifetimeGroup /// \brief Shortest possible SingletonWithLongevity lifetime: 0 template <class T> struct DieFirst : SingletonFixedLongevity<0,T> - {}; +{}; }//namespace LongevityLifetime diff --git a/shared/loki/TypeTraits.h b/shared/loki/TypeTraits.h index 00ef069e..2d5af757 100644 --- a/shared/loki/TypeTraits.h +++ b/shared/loki/TypeTraits.h @@ -154,7 +154,7 @@ template <> struct AddParameterType<void> template <typename T> struct IsFunctionPointerRaw - {enum {result = 0};}; +{enum {result = 0};}; template <typename T> struct IsFunctionPointerRaw<T(*)()> @@ -531,7 +531,7 @@ struct IsFunctionPointerRaw<T(*)( template <typename T> struct IsMemberFunctionPointerRaw - {enum {result = 0};}; +{enum {result = 0};}; template <typename T, typename S> struct IsMemberFunctionPointerRaw<T (S::*)()> diff --git a/shared/long_path_prefix.cpp b/shared/long_path_prefix.cpp deleted file mode 100644 index dc249283..00000000 --- a/shared/long_path_prefix.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#include "long_path_prefix.h" -#include <wx/msw/wrapwin.h> //includes "windows.h" - - -//there are two flavors of long path prefix: one for UNC paths, one for regular paths -const Zstring LONG_PATH_PREFIX = Zstr("\\\\?\\"); -const Zstring LONG_PATH_PREFIX_UNC = Zstr("\\\\?\\UNC"); - -template <size_t max_path> -inline -Zstring applyLongPathPrefixImpl(const Zstring& path) -{ - if (path.length() >= max_path && //maximum allowed path length without prefix is (MAX_PATH - 1) - !path.StartsWith(LONG_PATH_PREFIX)) - { - if (path.StartsWith(Zstr("\\\\"))) //UNC-name, e.g. \\zenju-pc\Users - return LONG_PATH_PREFIX_UNC + path.AfterFirst(Zchar('\\')); //convert to \\?\UNC\zenju-pc\Users - else - return LONG_PATH_PREFIX + path; //prepend \\?\ prefix - } - - //fallback - return path; -} - - -Zstring ffs3::applyLongPathPrefix(const Zstring& path) -{ - return applyLongPathPrefixImpl<MAX_PATH>(path); -} - - -Zstring ffs3::applyLongPathPrefixCreateDir(const Zstring& path) //throw() -{ - //special rule for ::CreateDirectoryEx(): MAX_PATH - 12(=^ 8.3 filename) is threshold - return applyLongPathPrefixImpl<MAX_PATH - 12>(path); -} - - -Zstring ffs3::removeLongPathPrefix(const Zstring& path) //throw() -{ - if (path.StartsWith(LONG_PATH_PREFIX)) - { - if (path.StartsWith(LONG_PATH_PREFIX_UNC)) //UNC-name - return Zstring(path).Replace(LONG_PATH_PREFIX_UNC, Zstr("\\"), false); - else - return Zstring(path).Replace(LONG_PATH_PREFIX, Zstr(""), false); - } - - //fallback - return path; -} - diff --git a/shared/long_path_prefix.h b/shared/long_path_prefix.h index df4c31ab..b6da9168 100644 --- a/shared/long_path_prefix.h +++ b/shared/long_path_prefix.h @@ -7,13 +7,13 @@ #ifndef LONGPATHPREFIX_H_INCLUDED #define LONGPATHPREFIX_H_INCLUDED +#include "zstring.h" + #ifndef FFS_WIN -use in windows build only! +#error use in windows build only! #endif -#include "zstring.h" - -namespace ffs3 +namespace zen { //handle filenames longer-equal 260 (== MAX_PATH) characters by applying \\?\-prefix (Reference: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath) /* @@ -27,4 +27,78 @@ Zstring applyLongPathPrefixCreateDir(const Zstring& path); //throw() -> special Zstring removeLongPathPrefix(const Zstring& path); //throw() } -#endif // LONGPATHPREFIX_H_INCLUDED + + + + + + + + + + + + + + + + + + + + + +//################## implementation ################## + +//there are two flavors of long path prefix: one for UNC paths, one for regular paths +const Zstring LONG_PATH_PREFIX = Zstr("\\\\?\\"); +const Zstring LONG_PATH_PREFIX_UNC = Zstr("\\\\?\\UNC"); + +template <size_t max_path> +inline +Zstring applyLongPathPrefixImpl(const Zstring& path) +{ + assert(!path.empty()); //nicely check almost all WinAPI accesses! + if (path.length() >= max_path && //maximum allowed path length without prefix is (MAX_PATH - 1) + !path.StartsWith(LONG_PATH_PREFIX)) + { + if (path.StartsWith(Zstr("\\\\"))) //UNC-name, e.g. \\zenju-pc\Users + return LONG_PATH_PREFIX_UNC + path.AfterFirst(Zchar('\\')); //convert to \\?\UNC\zenju-pc\Users + else + return LONG_PATH_PREFIX + path; //prepend \\?\ prefix + } + + return path; //fallback +} + + +inline +Zstring zen::applyLongPathPrefix(const Zstring& path) +{ + return applyLongPathPrefixImpl<MAX_PATH>(path); +} + + +inline +Zstring zen::applyLongPathPrefixCreateDir(const Zstring& path) //throw() +{ + //special rule for ::CreateDirectoryEx(): MAX_PATH - 12(=^ 8.3 filename) is threshold + return applyLongPathPrefixImpl<MAX_PATH - 12>(path); +} + + +inline +Zstring zen::removeLongPathPrefix(const Zstring& path) //throw() +{ + if (path.StartsWith(LONG_PATH_PREFIX)) + { + if (path.StartsWith(LONG_PATH_PREFIX_UNC)) //UNC-name + return Zstring(path).Replace(LONG_PATH_PREFIX_UNC, Zstr("\\"), false); + else + return Zstring(path).Replace(LONG_PATH_PREFIX, Zstr(""), false); + } + + return path; //fallback +} + +#endif //LONGPATHPREFIX_H_INCLUDED diff --git a/shared/mouse_move_dlg.cpp b/shared/mouse_move_dlg.cpp index abaa7ead..95074b55 100644 --- a/shared/mouse_move_dlg.cpp +++ b/shared/mouse_move_dlg.cpp @@ -7,26 +7,42 @@ #include "mouse_move_dlg.h" #include <vector> #include <wx/msw/wrapwin.h> //includes "windows.h" +#include <wx/stattext.h> +#include <wx/statbmp.h> +#include <wx/statline.h> +#include <wx/animate.h> +#include <wx/panel.h> +#include <wx/gauge.h> +#include <wx/statusbr.h> -using namespace ffs3; +using namespace zen; +namespace +{ +void getAllChildren(wxWindow& parent, std::vector<wxWindow*>& out) +{ + wxWindowList& wl = parent.GetChildren(); + for (wxWindowList::iterator i = wl.begin(); i != wl.end(); ++i) + { + if (dynamic_cast<wxStaticText*> (*i) || //redirect clicks on these "dead" controls to move dialog instead + dynamic_cast<wxStaticBitmap*> (*i) || + dynamic_cast<wxAnimationCtrl*>(*i) || + dynamic_cast<wxGauge*> (*i) || + dynamic_cast<wxStaticLine*> (*i) || + dynamic_cast<wxStatusBar*> (*i) || + dynamic_cast<wxPanel*> (*i)) + out.push_back(*i); + getAllChildren(**i, out); + } +} +} -MouseMoveWindow::MouseMoveWindow(wxWindow& parent, - wxWindow* child1, - wxWindow* child2, - wxWindow* child3, - wxWindow* child4, - wxWindow* child5, - wxWindow* child6) : wxWindow(&parent, wxID_ANY) +MouseMoveWindow::MouseMoveWindow(wxWindow& parent, bool includeParent) : wxWindow(&parent, wxID_ANY) { std::vector<wxWindow*> windList; - - if (child1) windList.push_back(child1); - if (child2) windList.push_back(child2); - if (child3) windList.push_back(child3); - if (child4) windList.push_back(child4); - if (child5) windList.push_back(child5); - if (child6) windList.push_back(child6); + if (includeParent) + windList.push_back(&parent); + getAllChildren(parent, windList); for (std::vector<wxWindow*>::const_iterator i = windList.begin(); i != windList.end(); ++i) (*i)->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(MouseMoveWindow::LeftButtonDown), NULL, this); @@ -36,9 +52,6 @@ MouseMoveWindow::MouseMoveWindow(wxWindow& parent, } -MouseMoveWindow::~MouseMoveWindow() {} - - void MouseMoveWindow::LeftButtonDown(wxMouseEvent& event) { if (GetParent() && allowMove(event)) diff --git a/shared/mouse_move_dlg.h b/shared/mouse_move_dlg.h index ccdf6c01..2e23c089 100644 --- a/shared/mouse_move_dlg.h +++ b/shared/mouse_move_dlg.h @@ -9,32 +9,23 @@ #include <wx/window.h> -namespace ffs3 +namespace zen { -//move main dialog by mouse-dragging contained sub-windows: just attach to parent via new in constructor: ownership passed! +/* +move dialog by mouse-dragging contained sub-windows: just attach to parent via new in constructor: + new MouseMoveWindow(parent); //ownership passed to parent +*/ class MouseMoveWindow : public wxWindow //private wxEvtHandler { public: - MouseMoveWindow(wxWindow& parent, - wxWindow* child1, - wxWindow* child2 = NULL, - wxWindow* child3 = NULL, - wxWindow* child4 = NULL, - wxWindow* child5 = NULL, - wxWindow* child6 = NULL); + MouseMoveWindow(wxWindow& parent, bool includeParent = true); //parent including all relevant child elements - virtual ~MouseMoveWindow(); - - virtual bool allowMove(const wxMouseEvent& event) - { - return true; - } + virtual bool allowMove(const wxMouseEvent& event) { return true; } private: void LeftButtonDown(wxMouseEvent& event); }; } - #endif // MOUSEMOVEWINDOW_H_INCLUDED diff --git a/shared/parse_lng.h b/shared/parse_lng.h new file mode 100644 index 00000000..fcf20d28 --- /dev/null +++ b/shared/parse_lng.h @@ -0,0 +1,618 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef PARSE_LNG_HEADER_INCLUDED +#define PARSE_LNG_HEADER_INCLUDED + +#include <string> +#include <sstream> +#include <map> +#include <set> +#include <vector> +#include <algorithm> +#include <functional> +#include <cctype> +#include <list> +#include <stdexcept> + + +namespace lngfile +{ +//singular forms +typedef std::map <std::string, std::string> +TranslationMap; //orig |-> translation + +//plural forms +typedef std::pair<std::string, std::string> +SingularPluralPair; //1 house| n houses + +typedef std::vector<std::string> +PluralForms; //1 dom | 2 domy | 5 domów + +typedef std::map <SingularPluralPair, PluralForms> +TranslationPluralMap; //(sing/plu) |-> pluralforms + +struct TransHeader +{ + std::string languageName; //display name: "English (UK)" + std::string translatorName; //"ZenJu" + std::string localeName; //ISO 639 language code + ISO 3166 country code, e.g. "en_GB", or "en_US" + std::string flagFile; //"england.png" + int pluralCount; + std::string pluralDefinition; //"nplurals=2; plural= n == 1 ? 0 : 1" +}; + + +struct ParsingError +{ + ParsingError(size_t rowNo, size_t colNo) : row(rowNo), col(colNo) {} + size_t row; + size_t col; +}; +void parseLng(const std::string& fileStream, TransHeader& header, TranslationMap& out, TranslationPluralMap& pluralOut); //throw ParsingError +void parseHeader(const std::string& fileStream, TransHeader& header); //throw ParsingError + +class TranslationList; //unordered list of unique translation items +void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//--------------------------- implementation --------------------------- +class TranslationList //unordered list of unique translation items +{ +public: + void addItem(const std::string& orig, const std::string& trans) + { + if (!transUnique.insert(orig).second) return; + + dump.push_back(RegularItem(std::make_pair(orig, trans))); + sequence.push_back(&dump.back()); + } + void addPluralItem(const SingularPluralPair& orig, const PluralForms& trans) + { + if (!pluralUnique.insert(orig).second) return; + + dumpPlural.push_back(PluralItem(std::make_pair(orig, trans))); + sequence.push_back(&dumpPlural.back()); + } + + bool untranslatedTextExists() const + { + for (std::list<RegularItem>::const_iterator i = dump.begin(); i != dump.end(); ++i) + if (i->value.second.empty()) + return true; + for (std::list<PluralItem>::const_iterator i = dumpPlural.begin(); i != dumpPlural.end(); ++i) + if (i->value.second.empty()) + return true; + return false; + } + +private: + friend void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream); + + struct Item {virtual ~Item() {} }; + struct RegularItem : public Item { RegularItem(const TranslationMap ::value_type& val) : value(val) {} TranslationMap ::value_type value; }; + struct PluralItem : public Item { PluralItem (const TranslationPluralMap::value_type& val) : value(val) {} TranslationPluralMap::value_type value; }; + + std::vector<Item*> sequence; //dynamic list of translation elements + std::list<RegularItem> dump; //manage memory + std::list<PluralItem> dumpPlural; //manage memory + + std::set<TranslationMap ::key_type> transUnique; //check uniqueness + std::set<TranslationPluralMap::key_type> pluralUnique; // +}; + + +struct Token +{ + enum Type + { + //header information + TK_HEADER_BEGIN, + TK_HEADER_END, + TK_LANG_NAME_BEGIN, + TK_LANG_NAME_END, + TK_TRANS_NAME_BEGIN, + TK_TRANS_NAME_END, + TK_LOCALE_NAME_BEGIN, + TK_LOCALE_NAME_END, + TK_FLAG_FILE_BEGIN, + TK_FLAG_FILE_END, + TK_PLURAL_COUNT_BEGIN, + TK_PLURAL_COUNT_END, + TK_PLURAL_DEF_BEGIN, + TK_PLURAL_DEF_END, + + //item level + TK_SRC_BEGIN, + TK_SRC_END, + TK_TRG_BEGIN, + TK_TRG_END, + TK_TEXT, + TK_PLURAL_BEGIN, + TK_PLURAL_END, + TK_END + }; + + Token(Type t) : type(t) {} + Type type; + + std::string text; +}; + + +class KnownTokens +{ +public: + typedef std::map<Token::Type, std::string> TokenMap; + + static const TokenMap& asList() + { + static KnownTokens inst; + return inst.tokens; + } + + static std::string text(Token::Type t) + { + TokenMap::const_iterator iter = asList().find(t); + return iter != asList().end() ? iter->second : std::string(); + } + +private: + KnownTokens() + { + //header information + tokens.insert(std::make_pair(Token::TK_HEADER_BEGIN, "<header>")); + tokens.insert(std::make_pair(Token::TK_HEADER_END, "</header>")); + tokens.insert(std::make_pair(Token::TK_LANG_NAME_BEGIN, "<language name>")); + tokens.insert(std::make_pair(Token::TK_LANG_NAME_END, "</language name>")); + tokens.insert(std::make_pair(Token::TK_TRANS_NAME_BEGIN, "<translator>")); + tokens.insert(std::make_pair(Token::TK_TRANS_NAME_END, "</translator>")); + tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_BEGIN, "<locale>")); + tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_END, "</locale>")); + tokens.insert(std::make_pair(Token::TK_FLAG_FILE_BEGIN, "<flag file>")); + tokens.insert(std::make_pair(Token::TK_FLAG_FILE_END, "</flag file>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_BEGIN, "<plural forms>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_END, "</plural forms>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_BEGIN, "<plural definition>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_END, "</plural definition>")); + + //item level + tokens.insert(std::make_pair(Token::TK_SRC_BEGIN, "<source>")); + tokens.insert(std::make_pair(Token::TK_SRC_END, "</source>")); + tokens.insert(std::make_pair(Token::TK_TRG_BEGIN, "<target>")); + tokens.insert(std::make_pair(Token::TK_TRG_END, "</target>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_BEGIN, "<pluralform>")); + tokens.insert(std::make_pair(Token::TK_PLURAL_END, "</pluralform>")); + } + TokenMap tokens; +}; + +struct IsWhiteSpace : public std::unary_function<char, bool> +{ + bool operator()(char c) const + { + const unsigned char usc = c; //caveat 1: std::isspace() takes an int, but expects an unsigned char + return usc < 128 && //caveat 2: some parts of UTF-8 chars are erroneously seen as whitespace, e.g. the a0 from "\xec\x8b\a0" (MSVC) + std::isspace(usc) != 0; //[!] + } +}; + +class Scanner +{ +public: + Scanner(const std::string& fileStream) : stream(fileStream), pos(stream.begin()) {} + + Token nextToken() + { + //skip whitespace + pos = std::find_if(pos, stream.end(), std::not1(IsWhiteSpace())); + + if (pos == stream.end()) + return Token(Token::TK_END); + + for (KnownTokens::TokenMap::const_iterator i = KnownTokens::asList().begin(); i != KnownTokens::asList().end(); ++i) + if (startsWith(i->second)) + { + pos += i->second.size(); + return Token(i->first); + } + + //rest must be "text" + std::string::const_iterator textBegin = pos; + while (pos != stream.end() && !startsWithKnownTag()) + pos = std::find(pos + 1, stream.end(), '<'); + + std::string text(textBegin, pos); + + normalize(text); //remove whitespace from end ect. + + if (text.empty() && pos == stream.end()) + return Token(Token::TK_END); + + Token out(Token::TK_TEXT); + out.text = text; + return out; + } + + std::pair<size_t, size_t> position() const //current (row/col) beginning with 1 + { + //seek last line break + std::string::const_iterator iter = pos; + while (iter != stream.begin() && *iter != '\n') + --iter; + + return std::make_pair(std::count(stream.begin(), pos, '\n') + 1, pos - iter); + } + +private: + bool startsWithKnownTag() const + { + for (KnownTokens::TokenMap::const_iterator i = KnownTokens::asList().begin(); i != KnownTokens::asList().end(); ++i) + if (startsWith(i->second)) + return true; + return false; + } + + bool startsWith(const std::string& prefix) const + { + if (stream.end() - pos < static_cast<int>(prefix.size())) + return false; + return std::equal(prefix.begin(), prefix.end(), pos); + } + + static void normalize(std::string& text) + { + //remmove whitespace from end + while (!text.empty() && IsWhiteSpace()(*text.rbegin())) + text.resize(text.size() - 1); + + //ensure c-style line breaks + + //Delimiter: + //---------- + //Linux: 0xA \n + //Mac: 0xD \r + //Win: 0xD 0xA \r\n <- language files are in Windows format + if (text.find('\r') != std::string::npos) + { + std::string tmp; + for (std::string::const_iterator i = text.begin(); i != text.end(); ++i) + if(*i == '\r') + { + std::string::const_iterator next = i + 1; + if (next != text.end() && *next == '\n') + ++i; + tmp += '\n'; + } + else + tmp += *i; + text = tmp; + } + } + + const std::string stream; + std::string::const_iterator pos; +}; + +template <class C, class T> +inline +std::basic_string<C> numberToString(const T& number) //convert number to string the C++ way +{ + std::basic_ostringstream<C> ss; + ss << number; + return ss.str(); +} + +template <class T, class C> +inline +T stringToNumber(const std::basic_string<C>& str) //convert string to number the C++ way +{ + T number = 0; + std::basic_istringstream<C>(str) >> number; + return number; +} + + +class LngParser +{ +public: + LngParser(const std::string& fileStream) : scn(fileStream), tk(scn.nextToken()) {} + + void parse(TranslationMap& out, TranslationPluralMap& pluralOut, TransHeader& header) + { + //header + parseHeader(header); + + //items + while (token().type != Token::TK_END) + parseRegular(out, pluralOut, header.pluralCount); + } + + void parseHeader(TransHeader& header) + { + consumeToken(Token::TK_HEADER_BEGIN); + + consumeToken(Token::TK_LANG_NAME_BEGIN); + header.languageName = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_LANG_NAME_END); + + consumeToken(Token::TK_TRANS_NAME_BEGIN); + header.translatorName = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_TRANS_NAME_END); + + consumeToken(Token::TK_LOCALE_NAME_BEGIN); + header.localeName = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_LOCALE_NAME_END); + + consumeToken(Token::TK_FLAG_FILE_BEGIN); + header.flagFile = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_FLAG_FILE_END); + + consumeToken(Token::TK_PLURAL_COUNT_BEGIN); + header.pluralCount = stringToNumber<int>(tk.text); + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_PLURAL_COUNT_END); + + consumeToken(Token::TK_PLURAL_DEF_BEGIN); + header.pluralDefinition = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_PLURAL_DEF_END); + + consumeToken(Token::TK_HEADER_END); + } + +private: + void parseRegular(TranslationMap& out, TranslationPluralMap& pluralOut, int formCount) + { + consumeToken(Token::TK_SRC_BEGIN); + + if (token().type == Token::TK_PLURAL_BEGIN) + return parsePlural(pluralOut, formCount); + + std::string original = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_SRC_END); + + consumeToken(Token::TK_TRG_BEGIN); + std::string translation; + if (token().type == Token::TK_TEXT) + { + translation = token().text; + nextToken(); + } + consumeToken(Token::TK_TRG_END); + + if (!translation.empty()) //only add if translation is existing + out.insert(std::make_pair(original, translation)); + } + + void parsePlural(TranslationPluralMap& pluralOut, int formCount) + { + //Token::TK_SRC_BEGIN already consumed + + consumeToken(Token::TK_PLURAL_BEGIN); + std::string engSingular = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_PLURAL_END); + + consumeToken(Token::TK_PLURAL_BEGIN); + std::string engPlural = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_PLURAL_END); + + consumeToken(Token::TK_SRC_END); + + consumeToken(Token::TK_TRG_BEGIN); + + PluralForms pluralList; + while (token().type == Token::TK_PLURAL_BEGIN) + { + consumeToken(Token::TK_PLURAL_BEGIN); + std::string pluralForm = tk.text; + consumeToken(Token::TK_TEXT); + consumeToken(Token::TK_PLURAL_END); + pluralList.push_back(pluralForm); + + } + + if (!pluralList.empty()&& static_cast<int>(pluralList.size()) != formCount) //invalid number of plural forms + throw ParsingError(scn.position().first, scn.position().second); + + consumeToken(Token::TK_TRG_END); + + if (!pluralList.empty()) //only add if translation is existing + pluralOut.insert(std::make_pair(SingularPluralPair(engSingular, engPlural), pluralList)); + } + + + void nextToken() { tk = scn.nextToken(); } + const Token& token() const { return tk; } + + void consumeToken(Token::Type t) + { + if (token().type != t) + throw ParsingError(scn.position().first, scn.position().second); + nextToken(); + } + + Scanner scn; + Token tk; +}; + + +inline +void parseLng(const std::string& fileStream, TransHeader& header, TranslationMap& out, TranslationPluralMap& pluralOut) //throw ParsingError +{ + out.clear(); + pluralOut.clear(); + + //skip UTF-8 Byte Ordering Mark + const bool hasBOM = fileStream.size() >= 3 && fileStream.substr(0, 3) == "\xef\xbb\xbf"; + + LngParser prs(hasBOM ? fileStream.substr(3) : fileStream); + prs.parse(out, pluralOut, header); +} + + +inline +void parseHeader(const std::string& fileStream, TransHeader& header) //throw ParsingError +{ + //skip UTF-8 Byte Ordering Mark + const bool hasBOM = fileStream.size() >= 3 && fileStream.substr(0, 3) == "\xef\xbb\xbf"; + + LngParser prs(hasBOM ? fileStream.substr(3) : fileStream); + prs.parseHeader(header); +} + + +inline +void formatMultiLineText(std::string& text) +{ + if (text.find('\n') != std::string::npos) //multiple lines + { + if (*text.begin() != '\n') + text = '\n' + text; + if (*text.rbegin() != '\n') + text += '\n'; + } +} + + +const std::string LB = "\n"; +const std::string TAB = "\t"; + + +void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream) +{ + //header + fileStream += KnownTokens::text(Token::TK_HEADER_BEGIN) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_LANG_NAME_BEGIN); + fileStream += header.languageName; + fileStream += KnownTokens::text(Token::TK_LANG_NAME_END) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_TRANS_NAME_BEGIN); + fileStream += header.translatorName; + fileStream += KnownTokens::text(Token::TK_TRANS_NAME_END) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_LOCALE_NAME_BEGIN); + fileStream += header.localeName; + fileStream += KnownTokens::text(Token::TK_LOCALE_NAME_END) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_FLAG_FILE_BEGIN); + fileStream += header.flagFile; + fileStream += KnownTokens::text(Token::TK_FLAG_FILE_END) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_COUNT_BEGIN); + fileStream += numberToString<char>(header.pluralCount); + fileStream += KnownTokens::text(Token::TK_PLURAL_COUNT_END) + LB; + + fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_DEF_BEGIN); + fileStream += header.pluralDefinition; + fileStream += KnownTokens::text(Token::TK_PLURAL_DEF_END) + LB; + + fileStream += KnownTokens::text(Token::TK_HEADER_END) + LB; + + fileStream += LB; + + + //items + for (std::vector<TranslationList::Item*>::const_iterator i = in.sequence.begin(); i != in.sequence.end(); ++i) + { + const TranslationList::RegularItem* regular = dynamic_cast<const TranslationList::RegularItem*>(*i); + const TranslationList::PluralItem* plural = dynamic_cast<const TranslationList::PluralItem*>(*i); + + if (regular) + { + std::string original = regular->value.first; + std::string translation = regular->value.second; + + formatMultiLineText(original); + formatMultiLineText(translation); + + fileStream += KnownTokens::text(Token::TK_SRC_BEGIN); + fileStream += original; + fileStream += KnownTokens::text(Token::TK_SRC_END) + LB; + + fileStream += KnownTokens::text(Token::TK_TRG_BEGIN); + fileStream += translation; + fileStream += KnownTokens::text(Token::TK_TRG_END) + LB; + + } + else if (plural) + { + std::string engSingular = plural->value.first.first; + std::string engPlural = plural->value.first.second; + const PluralForms& forms = plural->value.second; + + formatMultiLineText(engSingular); + formatMultiLineText(engPlural); + + fileStream += KnownTokens::text(Token::TK_SRC_BEGIN) + LB; + fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN); + fileStream += engSingular; + fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB; + fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN); + fileStream += engPlural; + fileStream += KnownTokens::text(Token::TK_PLURAL_END)+ LB; + fileStream += KnownTokens::text(Token::TK_SRC_END) + LB; + + fileStream += KnownTokens::text(Token::TK_TRG_BEGIN); + if (!forms.empty()) fileStream += LB; + + for (PluralForms::const_iterator j = forms.begin(); j != forms.end(); ++j) + { + std::string plForm = *j; + formatMultiLineText(plForm); + + fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN); + fileStream += plForm; + fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB; + } + fileStream += KnownTokens::text(Token::TK_TRG_END) + LB; + } + else + { + throw std::logic_error("that's what you get for brittle design ;)"); + } + } +} +} + +#endif //PARSE_LNG_HEADER_INCLUDED diff --git a/shared/parse_plural.h b/shared/parse_plural.h new file mode 100644 index 00000000..0a0e7545 --- /dev/null +++ b/shared/parse_plural.h @@ -0,0 +1,412 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef PARSE_PLURAL_H_INCLUDED +#define PARSE_PLURAL_H_INCLUDED + +#include <list> +#include <boost/shared_ptr.hpp> +#include "zbase.h" + + +//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html +//http://translate.sourceforge.net/wiki/l10n/pluralforms +/* +Grammar for Plural forms parser +------------------------------- +expression: + conditional-expression + +conditional-expression: + logical-or-expression + logical-or-expression ? expression : expression + +logical-or-expression: + logical-and-expression + logical-or-expression || logical-and-expression + +logical-and-expression: + equality-expression + logical-and-expression && equality-expression + +equality-expression: + relational-expression + relational-expression == relational-expression + relational-expression != relational-expression + +relational-expression: + multiplicative-expression + multiplicative-expression > multiplicative-expression + multiplicative-expression < multiplicative-expression + multiplicative-expression >= multiplicative-expression + multiplicative-expression <= multiplicative-expression + +multiplicative-expression: + pm-expression + multiplicative-expression % pm-expression + +pm-expression: + N + Number + ( Expression ) +*/ + + + +//expression interface +struct Expression { virtual ~Expression() {} }; + +template <class T> +struct Expr : public Expression +{ + typedef T ValueType; + virtual ValueType eval() const = 0; +}; + +//specific binary expression based on STL function objects +template <class StlOp> +struct BinaryExp : public Expr<typename StlOp::result_type> +{ + typedef const Expr<typename StlOp::first_argument_type> SourceExp; + + BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {} + virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); } + const SourceExp& lhs_; + const SourceExp& rhs_; + StlOp biop_; +}; + +template <class StlOp> +inline +BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast) +{ + return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs), + dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop); +} + +template <class Out> +struct TernaryExp : public Out +{ + TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {} + virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); } + const Expr<bool>& ifExp_; + const Out& thenExp_; + const Out& elseExp_; +}; + +struct LiteralNumberEx : public Expr<int> +{ + LiteralNumberEx(int n) : n_(n) {} + virtual int eval() const { return n_; } + int n_; +}; + +struct NumberN : public Expr<int> +{ + NumberN(int& n) : n_(n) {} + virtual int eval() const { return n_; } + int& n_; +}; + + +typedef Zbase<char> Wstring; + + +class PluralForm +{ +public: + struct ParsingError {}; + + //.po format,e.g.: (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) + PluralForm(const Wstring& phrase) : n_(0) + { + Parser(phrase, //in + expr, n_, dump); //out + } + + int getForm(int n) const { n_ = n ; return expr->eval(); } + +private: + typedef std::list<boost::shared_ptr<Expression> > DumpList; + + struct Token + { + enum Type + { + TK_TERNARY_QUEST, + TK_TERNARY_COLON, + TK_OR, + TK_AND, + TK_EQUAL, + TK_NOT_EQUAL, + TK_LESS, + TK_LESS_EQUAL, + TK_GREATER, + TK_GREATER_EQUAL, + TK_MODULUS, + TK_N, + TK_NUMBER, + TK_BRACKET_LEFT, + TK_BRACKET_RIGHT, + TK_END + }; + + Token(Type t) : type(t), number(0) {} + + Type type; + int number; //if type == TK_NUMBER + }; + + class Scanner + { + public: + Scanner(const Wstring& phrase) : stream(phrase), pos(stream.begin()) + { + tokens.push_back(std::make_pair("?" , Token::TK_TERNARY_QUEST)); + tokens.push_back(std::make_pair(":" , Token::TK_TERNARY_COLON)); + tokens.push_back(std::make_pair("||", Token::TK_OR )); + tokens.push_back(std::make_pair("&&", Token::TK_AND )); + tokens.push_back(std::make_pair("==", Token::TK_EQUAL )); + tokens.push_back(std::make_pair("!=", Token::TK_NOT_EQUAL )); + tokens.push_back(std::make_pair("<=", Token::TK_LESS_EQUAL )); + tokens.push_back(std::make_pair("<" , Token::TK_LESS )); + tokens.push_back(std::make_pair(">=", Token::TK_GREATER_EQUAL)); + tokens.push_back(std::make_pair(">" , Token::TK_GREATER )); + tokens.push_back(std::make_pair("%" , Token::TK_MODULUS )); + tokens.push_back(std::make_pair("n" , Token::TK_N )); + tokens.push_back(std::make_pair("N" , Token::TK_N )); + tokens.push_back(std::make_pair("(" , Token::TK_BRACKET_LEFT )); + tokens.push_back(std::make_pair(")" , Token::TK_BRACKET_RIGHT)); + } + + Token nextToken() + { + //skip whitespace + pos = std::find_if(pos, stream.end(), std::not1(std::ptr_fun(std::iswspace))); + + if (pos == stream.end()) return Token(Token::TK_END); + + for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i) + if (startsWith(i->first)) + { + pos += i->first.size(); + return Token(i->second); + } + + Wstring::const_iterator digitEnd = std::find_if(pos, stream.end(), std::not1(std::ptr_fun(std::iswdigit))); + int digitCount = digitEnd - pos; + if (digitCount != 0) + { + Token out(Token::TK_NUMBER); + out.number = Wstring(&*pos, digitCount).toNumber<int>(); + pos += digitCount; + return out; + } + + throw ParsingError(); //unknown token + } + + private: + bool startsWith(const Wstring& prefix) const + { + if (stream.end() - pos < static_cast<int>(prefix.size())) + return false; + return std::equal(prefix.begin(), prefix.end(), pos); + } + + typedef std::vector<std::pair<Wstring, Token::Type> > TokenList; + TokenList tokens; + + const Wstring stream; + Wstring::const_iterator pos; + }; + + + class Parser + { + public: + Parser(const Wstring& phrase, //in + const Expr<int>*& expr, int& n, PluralForm::DumpList& dump) ://out + scn(phrase), + tk(scn.nextToken()), + n_(n), + dump_(dump) + { + try + { + const Expression& e = parse(); + expr = &dynamic_cast<const Expr<int>&>(e); + } + catch(std::bad_cast&) { throw ParsingError(); } + + consumeToken(Token::TK_END); + } + + private: + void nextToken() { tk = scn.nextToken(); } + const Token& token() const { return tk; } + + void consumeToken(Token::Type t) + { + if (token().type != t) + throw ParsingError(); + nextToken(); + } + + const Expression& parse() { return parseConditional(); }; + + const Expression& parseConditional() + { + const Expression& e = parseLogicalOr(); + + if (token().type == Token::TK_TERNARY_QUEST) + { + nextToken(); + const Expression& thenEx = parse(); //associativity: <- + consumeToken(Token::TK_TERNARY_COLON); + const Expression& elseEx = parse(); // + + return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e), + dynamic_cast<const Expr<int>&>(thenEx), + dynamic_cast<const Expr<int>&>(elseEx))); + } + return e; + } + + const Expression& parseLogicalOr() + { + const Expression* e = &parseLogicalAnd(); + for (;;) //associativity: -> + if (token().type == Token::TK_OR) + { + nextToken(); + const Expression& rhs = parseLogicalAnd(); + e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>())); + } + else break; + return *e; + } + + const Expression& parseLogicalAnd() + { + const Expression* e = &parseEquality(); + for (;;) //associativity: -> + if (token().type == Token::TK_AND) + { + nextToken(); + const Expression& rhs = parseEquality(); + + e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>())); + } + else break; + return *e; + } + + const Expression& parseEquality() + { + const Expression& e = parseRelational(); + + Token::Type t = token().type; + if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a + { + nextToken(); + const Expression& rhs = parseRelational(); + + if (t == Token::TK_EQUAL) return manageObj(makeBiExp(e, rhs, std::equal_to <int>())); + if (t == Token::TK_NOT_EQUAL) return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>())); + } + return e; + } + + const Expression& parseRelational() + { + const Expression& e = parseMultiplicative(); + + Token::Type t = token().type; + if (t == Token::TK_LESS || //associativity: n/a + t == Token::TK_LESS_EQUAL|| + t == Token::TK_GREATER || + t == Token::TK_GREATER_EQUAL) + { + nextToken(); + const Expression& rhs = parseMultiplicative(); + + if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>())); + if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>())); + if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>())); + if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>())); + } + return e; + } + + const Expression& parseMultiplicative() + { + const Expression* e = &parsePrimary(); + + for (;;) //associativity: -> + if (token().type == Token::TK_MODULUS) + { + nextToken(); + const Expression& rhs = parsePrimary(); + + //"compile-time" check: n % 0 + const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs); + if (literal && literal->eval() == 0) + throw ParsingError(); + + e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>())); + } + else break; + return *e; + } + + const Expression& parsePrimary() + { + if (token().type == Token::TK_N) + { + nextToken(); + return manageObj(NumberN(n_)); + } + else if (token().type == Token::TK_NUMBER) + { + const int number = token().number; + nextToken(); + return manageObj(LiteralNumberEx(number)); + } + else if (token().type == Token::TK_BRACKET_LEFT) + { + nextToken(); + const Expression& e = parse(); + + consumeToken(Token::TK_BRACKET_RIGHT); + return e; + } + else + throw ParsingError(); + } + + template <class T> + const T& manageObj(const T& obj) + { + boost::shared_ptr<Expression> newEntry(new T(obj)); + dump_.push_back(newEntry); + return static_cast<T&>(*dump_.back()); + } + + Scanner scn; + Token tk; + + int& n_; + DumpList& dump_; //manage polymorphc object lifetimes + }; + + const Expr<int>* expr; + mutable int n_; + + PluralForm::DumpList dump; //manage polymorphc object lifetimes +}; + +#endif // PARSE_PLURAL_H_INCLUDED diff --git a/shared/parse_txt.cpp b/shared/parse_txt.cpp new file mode 100644 index 00000000..56da3bdd --- /dev/null +++ b/shared/parse_txt.cpp @@ -0,0 +1,93 @@ +#include "parse_txt.h" + +using namespace zen; + + +namespace +{ +std::string detectLineBreak(const Zstring& filename) //throw (FileError) +{ + //read a (hopefully) significant portion of data + zen::FileInput input(filename); + + std::vector<char> buffer(64 * 1024); + size_t bytesRead = input.read(&buffer[0], buffer.size()); //throw (FileError); + buffer.resize(bytesRead); + + //detect line break + std::string linebreakChars = "\r\n"; + std::vector<char>::iterator iter = std::find_first_of(buffer.begin(), buffer.end(), + linebreakChars.begin(), linebreakChars.end()); + if (iter != buffer.end()) + { + wxString firstRow = wxString::FromUTF8(&buffer[0], iter - buffer.begin()); + + if (*iter == '\r') + { + ++iter; + if (iter != buffer.end()) + { + + if (*iter == '\n') + return "\r\n"; //Windows + else + return "\r"; //Mac + } + } + else if (*iter == '\n') + return "\n"; //Linux + } + //fallback + return "\n"; +} +} + + +ExtractLines::ExtractLines(const Zstring& filename, const std::string& lineBreak) : //throw (FileError) + inputStream(filename), bufferLogBegin(buffer.begin()), lineBreak_(lineBreak) +{ + if (lineBreak.empty()) + lineBreak_ = detectLineBreak(filename); //throw (FileError) +} + + +bool ExtractLines::getLine(std::string& output) //throw (FileError) +{ + for (;;) + { + //check if full line is in buffer + std::vector<char>::iterator iter = std::search(bufferLogBegin, buffer.end(), lineBreak_.begin(), lineBreak_.end()); + if (iter != buffer.end()) + { + output.assign(bufferLogBegin, iter); + bufferLogBegin = iter + lineBreak_.size(); + return true; + } + + buffer.erase(buffer.begin(), bufferLogBegin); + bufferLogBegin = buffer.begin(); + + //if done: cleanup + if (inputStream.eof()) + { + if (buffer.empty()) + return false; + + output.assign(buffer.begin(), buffer.end()); + buffer.clear(); + return true; + } + + //read next block + const size_t BLOCK_SIZE = 512 * 1024; + buffer.resize(buffer.size() + BLOCK_SIZE); + + size_t bytesRead = inputStream.read(&buffer[0] + buffer.size() - BLOCK_SIZE, BLOCK_SIZE); //throw (FileError); + assert(bytesRead <= BLOCK_SIZE); //promised by FileInput() + + if (bytesRead < BLOCK_SIZE) + buffer.resize(buffer.size() - (BLOCK_SIZE - bytesRead)); + + bufferLogBegin = buffer.begin(); + } +} diff --git a/shared/parse_txt.h b/shared/parse_txt.h new file mode 100644 index 00000000..56147425 --- /dev/null +++ b/shared/parse_txt.h @@ -0,0 +1,32 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef PARSE_TXT_H_INCLUDED +#define PARSE_TXT_H_INCLUDED + +#include "file_io.h" +#include <vector> +#include <string> + +namespace zen +{ +class ExtractLines +{ +public: + ExtractLines(const Zstring& filename, const std::string& lineBreak = std::string()); //throw (FileError) + bool getLine(std::string& output); //throw (FileError) + +private: + zen::FileInput inputStream; + std::vector<char> buffer; + std::vector<char>::iterator bufferLogBegin; + std::string lineBreak_; +}; + +} + + +#endif // PARSE_TXT_H_INCLUDED diff --git a/shared/pch.h b/shared/pch.h index eb95fd50..71a09899 100644 --- a/shared/pch.h +++ b/shared/pch.h @@ -23,30 +23,7 @@ #endif #include <wx/wxprec.h> - -//##################################################### -// #include other rarely changing headers here - -//STL headers -#include <string> -#include <vector> -#include <set> -#include <map> -#include <queue> -#include <deque> -#include <stack> -#include <list> -#include <algorithm> -#include <functional> -#include <iterator> -#include <numeric> -#include <memory> -#include <utility> -#include <fstream> -#include <iostream> -#include <sstream> -#include <new> -#include <stdexcept> +//#include <wx/msw/wrapwin.h> -> already included via wxprec.h //other wxWidgets headers #include <wx/log.h> @@ -104,16 +81,32 @@ #include <wx/help.h> #include <wx/event.h> -//other -#include "../shared/tinyxml/tinyxml.h" -#include <sys/stat.h> +//##################################################### +// #include other rarely changing headers here + +//STL headers +#include <string> +#include <vector> +#include <set> +#include <map> +#include <queue> +#include <deque> +#include <stack> +#include <list> +#include <algorithm> +#include <functional> +#include <iterator> +#include <numeric> +#include <memory> +#include <utility> +#include <fstream> +#include <iostream> +#include <sstream> +#include <new> +#include <stdexcept> //Boost #include <boost/shared_ptr.hpp> #include <boost/scoped_array.hpp> -#ifdef __WXMSW__ -#include <wx/msw/wrapwin.h> //includes "windows.h" -#endif //__WXMSW__ - #endif //FFS_PRECOMPILED_HEADER diff --git a/shared/perf.h b/shared/perf.h index 641eee2b..8bd89643 100644 --- a/shared/perf.h +++ b/shared/perf.h @@ -9,7 +9,7 @@ #include <sstream> -#ifdef __WXWINDOWS__ +#ifdef __WXMSW__ //we have wxWidgets #include <wx/msw/wrapwin.h> //includes "windows.h" #else //#define WIN32_LEAN_AND_MEAN -> not in a header diff --git a/shared/privilege.cpp b/shared/privilege.cpp index 5cb664e1..c854ad4e 100644 --- a/shared/privilege.cpp +++ b/shared/privilege.cpp @@ -1,9 +1,9 @@ #include "privilege.h" -#include "system_func.h" +#include "last_error.h" #include "i18n.h" #include "loki/ScopeGuard.h" -using namespace ffs3; +using namespace zen; Privileges& Privileges::getInstance() @@ -20,8 +20,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError) TOKEN_QUERY, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken); (void)dummy; //silence warning "unused variable" @@ -33,8 +33,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError) privilege, //__in LPCTSTR lpName, &luid )) //__out PLUID lpLuid { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } PRIVILEGE_SET priv = {}; @@ -49,8 +49,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError) &priv, //__inout PPRIVILEGE_SET RequiredPrivileges, &alreadyGranted)) //__out LPBOOL pfResult { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } return alreadyGranted == TRUE; @@ -64,8 +64,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError TOKEN_ADJUST_PRIVILEGES, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken); (void)dummy; //silence warning "unused variable" @@ -76,8 +76,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError privilege, //__in LPCTSTR lpName, &luid )) //__out PLUID lpLuid { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } TOKEN_PRIVILEGES tp = {}; @@ -93,13 +93,13 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError NULL, //__out_opt PTOKEN_PRIVILEGES PreviousState, NULL)) //__out_opt PDWORD ReturnLength { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } if (::GetLastError() == ERROR_NOT_ALL_ASSIGNED) //check although previous function returned with success! { - const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n"); - throw FileError(errorMessage + ffs3::getLastErrorFormatted()); + const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } } diff --git a/shared/privilege.h b/shared/privilege.h index 0c5d5f0c..4775fcef 100644 --- a/shared/privilege.h +++ b/shared/privilege.h @@ -7,7 +7,7 @@ #include <wx/msw/wrapwin.h> //includes "windows.h" -namespace ffs3 +namespace zen { #ifdef FFS_WIN class Privileges diff --git a/shared/recycler.cpp b/shared/recycler.cpp index 4fedf01f..32de3f33 100644 --- a/shared/recycler.cpp +++ b/shared/recycler.cpp @@ -73,7 +73,7 @@ Nevertheless, let's use IFileOperation for better error reporting! void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (FileError) { - using ffs3::FileError; + using zen::FileError; if (filesToDelete.empty()) return; @@ -97,21 +97,21 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw ( getLastError = util::getDllFun<GetLastErrorFct>(getRecyclerDllName().c_str(), getLastErrorFctName); if (moveToRecycler == NULL || getLastError == NULL) - throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"\n\n") + //report first file only... better than nothing - wxString(_("Could not load a required DLL:")) + wxT(" \"") + getRecyclerDllName().c_str() + wxT("\"")); + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing + wxT("\n\n") + wxString(_("Could not load a required DLL:")) + wxT(" \"") + getRecyclerDllName().c_str() + wxT("\"")); //#warning moving long file paths to recycler does not work! clarify! // std::vector<Zstring> temp; // std::transform(filesToDelete.begin(), filesToDelete.end(), - // std::back_inserter(temp), std::ptr_fun(ffs3::removeLongPathPrefix)); //::IFileOperation() can't handle \\?\-prefix! + // std::back_inserter(temp), std::ptr_fun(zen::removeLongPathPrefix)); //::IFileOperation() can't handle \\?\-prefix! if (!moveToRecycler(&fileNames[0], //array must not be empty fileNames.size())) { wchar_t errorMessage[2000]; getLastError(errorMessage, 2000); - throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"\n\n") + //report first file only... better than nothing - wxT("(") + errorMessage + wxT(")")); + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing + wxT("\n\n") + wxT("(") + errorMessage + wxT(")")); } } else //regular recycle bin usage: available since XP @@ -146,19 +146,24 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw ( } -bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError) +bool zen::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError) { #ifdef FFS_WIN const Zstring filenameFmt = applyLongPathPrefix(fileToDelete); - if (::GetFileAttributes(filenameFmt.c_str()) == INVALID_FILE_ATTRIBUTES) + + const DWORD attr = ::GetFileAttributes(filenameFmt.c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! + //::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL); + + //both SHFileOperation and useIFileOperation are not able to delete a folder named "System Volume Information" with normal attributes but shamelessly report success std::vector<Zstring> fileNames; fileNames.push_back(fileToDelete); ::moveToWindowsRecycler(fileNames); //throw (FileError) #elif defined FFS_LINUX - struct stat fileInfo; + struct stat fileInfo = {}; if (::lstat(fileToDelete.c_str(), &fileInfo) != 0) return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! @@ -168,8 +173,8 @@ bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError) try { if (!fileObj->trash()) - throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"\n\n") + - wxT("(") + wxT("unknown error") + wxT(")")); + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") + + wxT("\n\n") + wxT("(") + wxT("unknown error") + wxT(")")); } catch (const Glib::Error& errorObj) { @@ -177,15 +182,15 @@ bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError) const wxString errorMessage = wxString(wxT("Glib Error Code ")) + wxString::Format(wxT("%i"), errorObj.code()) + wxT(", ") + wxString::FromUTF8(g_quark_to_string(errorObj.domain())) + wxT(": ") + wxString::FromUTF8(errorObj.what().c_str()); - throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"\n\n") + - wxT("(") + errorMessage + wxT(")")); + throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") + + wxT("\n\n") + wxT("(") + errorMessage + wxT(")")); } #endif -return true; + return true; } -bool ffs3::recycleBinExists() +bool zen::recycleBinExists() { #ifdef FFS_WIN return true; diff --git a/shared/recycler.h b/shared/recycler.h index 404d6f06..85df6f41 100644 --- a/shared/recycler.h +++ b/shared/recycler.h @@ -10,7 +10,7 @@ #include "file_error.h" #include "zstring.h" -namespace ffs3 +namespace zen { /* -------------------- @@ -19,7 +19,7 @@ namespace ffs3 Windows ------- -Recycler always available: during runtime dynamically either SHFileOperation or (since Vista) IFileOperation will be selected +Recycler always available: during runtime either SHFileOperation or (since Vista) IFileOperation will be dynamically selected Linux ----- diff --git a/shared/resolve_path.cpp b/shared/resolve_path.cpp index b17c3fb5..1fdc2430 100644 --- a/shared/resolve_path.cpp +++ b/shared/resolve_path.cpp @@ -1,5 +1,4 @@ #include "resolve_path.h" -#include <boost/scoped_array.hpp> #include <wx/utils.h> #include <wx/datetime.h> #include "string_conv.h" @@ -17,7 +16,7 @@ #include "stdlib.h" #endif -using namespace ffs3; +using namespace zen; using namespace common; @@ -26,11 +25,12 @@ namespace #ifdef FFS_WIN Zstring resolveRelativePath(const Zstring& relativeName, DWORD proposedBufferSize = 1000) { - boost::scoped_array<Zchar> fullPath(new Zchar[proposedBufferSize]); + std::vector<Zchar> fullPath(proposedBufferSize); + const DWORD rv = ::GetFullPathName( applyLongPathPrefix(relativeName).c_str(), //__in LPCTSTR lpFileName, proposedBufferSize, //__in DWORD nBufferLength, - fullPath.get(), //__out LPTSTR lpBuffer, + &fullPath[0], //__out LPTSTR lpBuffer, NULL); //__out LPTSTR *lpFilePart if (rv == 0 || rv == proposedBufferSize) //ERROR! Don't do anything @@ -38,7 +38,7 @@ Zstring resolveRelativePath(const Zstring& relativeName, DWORD proposedBufferSiz if (rv > proposedBufferSize) return resolveRelativePath(relativeName, rv); - return fullPath.get(); + return &fullPath[0]; } #elif defined FFS_LINUX @@ -149,7 +149,7 @@ void expandMacros(wxString& text) #ifdef FFS_LINUX -class TraverseMedia : public ffs3::TraverseCallback +class TraverseMedia : public zen::TraverseCallback { public: typedef std::map<Zstring, Zstring> DeviceList; //device name -> device path mapping @@ -174,10 +174,9 @@ private: Zstring getVolumePath(const Zstring& volumeName) //empty string on error { #ifdef FFS_WIN - const size_t volGuidSize = 10000; - boost::scoped_array<wchar_t> volGuid(new wchar_t[volGuidSize]); + std::vector<wchar_t> volGuid(10000); - HANDLE hVol = ::FindFirstVolume(volGuid.get(), volGuidSize); + HANDLE hVol = ::FindFirstVolume(&volGuid[0], static_cast<DWORD>(volGuid.size())); if (hVol != INVALID_HANDLE_VALUE) { Loki::ScopeGuard dummy = Loki::MakeGuard(::FindVolumeClose, hVol); @@ -185,19 +184,18 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error do { - const size_t volNameSize = MAX_PATH + 1; - boost::scoped_array<wchar_t> volName(new wchar_t[volNameSize]); - - if (::GetVolumeInformation(volGuid.get(), //__in_opt LPCTSTR lpRootPathName, - volName.get(), //__out LPTSTR lpVolumeNameBuffer, - volNameSize, //__in DWORD nVolumeNameSize, - NULL, //__out_opt LPDWORD lpVolumeSerialNumber, - NULL, //__out_opt LPDWORD lpMaximumComponentLength, - NULL, //__out_opt LPDWORD lpFileSystemFlags, - NULL, //__out LPTSTR lpFileSystemNameBuffer, - 0)) //__in DWORD nFileSystemNameSize + std::vector<wchar_t> volName(MAX_PATH + 1); + + if (::GetVolumeInformation(&volGuid[0], //__in_opt LPCTSTR lpRootPathName, + &volName[0], //__out LPTSTR lpVolumeNameBuffer, + static_cast<DWORD>(volName.size()), //__in DWORD nVolumeNameSize, + NULL, //__out_opt LPDWORD lpVolumeSerialNumber, + NULL, //__out_opt LPDWORD lpMaximumComponentLength, + NULL, //__out_opt LPDWORD lpFileSystemFlags, + NULL, //__out LPTSTR lpFileSystemNameBuffer, + 0)) //__in DWORD nFileSystemNameSize { - if (EqualFilename()(volumeName, Zstring(volName.get()))) + if (EqualFilename()(volumeName, Zstring(&volName[0]))) { //GetVolumePathNamesForVolumeName is not available for Windows 2000! typedef BOOL (WINAPI *GetVolumePathNamesForVolumeNameWFunc)(LPCWSTR lpszVolumeName, @@ -210,23 +208,22 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error if (getVolumePathNamesForVolumeName != NULL) { - const DWORD volPathSize = 10000; - boost::scoped_array<wchar_t> volPath(new wchar_t[volPathSize]); + std::vector<wchar_t> volPath(10000); DWORD returnedLen = 0; - if (getVolumePathNamesForVolumeName(volGuid.get(), //__in LPCTSTR lpszVolumeName, - volPath.get(), //__out LPTSTR lpszVolumePathNames, - volPathSize, //__in DWORD cchBufferLength, - &returnedLen)) //__out PDWORD lpcchReturnLength + if (getVolumePathNamesForVolumeName(&volGuid[0], //__in LPCTSTR lpszVolumeName, + &volPath[0], //__out LPTSTR lpszVolumePathNames, + static_cast<DWORD>(volPath.size()), //__in DWORD cchBufferLength, + &returnedLen)) //__out PDWORD lpcchReturnLength { - return volPath.get(); //return first path name in double-null terminated list! + return &volPath[0]; //return first path name in double-null terminated list! } } - return volGuid.get(); //GUID looks ugly, but should be working correctly + return &volGuid[0]; //GUID looks ugly, but should be working correctly } } } - while (::FindNextVolume(hVol, volGuid.get(), volGuidSize)); + while (::FindNextVolume(hVol, &volGuid[0], static_cast<DWORD>(volGuid.size()))); } #elif defined FFS_LINUX @@ -283,7 +280,7 @@ void expandVolumeName(Zstring& text) // [volname]:\folder [volname]\folde } -Zstring ffs3::getFormattedDirectoryName(const Zstring& dirname) +Zstring zen::getFormattedDirectoryName(const Zstring& dirname) { //Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names. //note: don't combine directory formatting with wxFileName, as it doesn't respect //?/ - prefix! @@ -295,7 +292,10 @@ Zstring ffs3::getFormattedDirectoryName(const Zstring& dirname) expandVolumeName(output); - output.Trim(); + //remove leading/trailing whitespace + trim(output, true, false); + while (endsWith(output, Zstr(" "))) //don't remove all whitespace from right, e.g. 0xa0 may be used as part of dir name + output.resize(output.size() - 1); if (output.empty()) //an empty string will later be returned as "\"; this is not desired return Zstring(); diff --git a/shared/resolve_path.h b/shared/resolve_path.h index 0bd4b0d2..4ee1a90f 100644 --- a/shared/resolve_path.h +++ b/shared/resolve_path.h @@ -10,7 +10,7 @@ #include "zstring.h" -namespace ffs3 +namespace zen { Zstring getFormattedDirectoryName(const Zstring& dirname); } diff --git a/shared/serialize.cpp b/shared/serialize.cpp index 719d0861..634b830b 100644 --- a/shared/serialize.cpp +++ b/shared/serialize.cpp @@ -7,13 +7,13 @@ #include "serialize.h" #include "i18n.h" -using namespace util; +using namespace zen; void ReadInputStream::throwReadError() const //throw (FileError) { - throw ffs3::FileError(wxString(_("Error reading from synchronization database:")) + wxT(" \n") + - wxT("\"") + errorObjName_ + wxT("\"")); + throw zen::FileError(wxString(_("Error reading from synchronization database:")) + wxT(" \n") + + wxT("\"") + errorObjName_ + wxT("\"")); } @@ -35,8 +35,8 @@ ReadInputStream::CharArray ReadInputStream::readArrayC() const //-------------------------------------------------------------------------------------------------------- void WriteOutputStream::throwWriteError() const //throw (FileError) { - throw ffs3::FileError(wxString(_("Error writing to synchronization database:")) + wxT(" \n") + - wxT("\"") + errorObjName_ + wxT("\"")); + throw zen::FileError(wxString(_("Error writing to synchronization database:")) + wxT(" \n") + + wxT("\"") + errorObjName_ + wxT("\"")); } diff --git a/shared/serialize.h b/shared/serialize.h index db1848d5..0f2f398f 100644 --- a/shared/serialize.h +++ b/shared/serialize.h @@ -7,24 +7,58 @@ #ifndef SERIALIZE_H_INCLUDED #define SERIALIZE_H_INCLUDED -#include "zstring.h" -#include <wx/stream.h> +#include <vector> #include "file_error.h" -#include <boost/scoped_array.hpp> +#include <wx/stream.h> #include <boost/shared_ptr.hpp> #include <boost/cstdint.hpp> +#include "file_io.h" -namespace util + +namespace zen { -template <class T> -T readNumber(wxInputStream& stream); +//unchecked, unformatted serialization +template <class T> T readPOD (wxInputStream& stream); +template <class T> void writePOD(wxOutputStream& stream, const T& pod); + +template <class S> S readString (wxInputStream& stream); +template <class S> void writeString(wxOutputStream& stream, const S& str); + + +//############# wxWidgets stream adapter ############# +// can be used as base classes (have virtual destructors) +class FileInputStream : public wxInputStream +{ +public: + FileInputStream(const Zstring& filename) : //throw (FileError) + fileObj(filename) {} + +private: + virtual size_t OnSysRead(void* buffer, size_t bufsize) + { + return fileObj.read(buffer, bufsize); //throw (FileError) + } + + zen::FileInput fileObj; +}; -template <class T> -void writeNumber(wxOutputStream& stream, T number); +class FileOutputStream : public wxOutputStream +{ +public: + FileOutputStream(const Zstring& filename) : //throw (FileError) + fileObj(filename, zen::FileOutput::ACC_OVERWRITE) {} + +private: + virtual size_t OnSysWrite(const void* buffer, size_t bufsize) + { + fileObj.write(buffer, bufsize); //throw (FileError) + return bufsize; + } + + zen::FileOutput fileObj; +}; -Zstring readString(wxInputStream& stream); -void writeString(wxOutputStream& stream, const Zstring& str); class ReadInputStream //throw (FileError) @@ -35,7 +69,8 @@ protected: template <class T> T readNumberC() const; //throw (FileError), checked read operation - Zstring readStringC() const; //throw (FileError), checked read operation + template <class S> + S readStringC() const; //throw (FileError), checked read operation typedef boost::shared_ptr<std::vector<char> > CharArray; //there's no guarantee std::string has a ref-counted implementation... so use this "thing" CharArray readArrayC() const; //throw (FileError) @@ -62,7 +97,8 @@ protected: template <class T> void writeNumberC(T number) const; //throw (FileError), checked write operation - void writeStringC(const Zstring& str) const; //throw (FileError), checked write operation + template <class S> + void writeStringC(const S& str) const; //throw (FileError), checked write operation void writeArrayC(const std::vector<char>& buffer) const; //throw (FileError) @@ -110,46 +146,50 @@ private: //---------------Inline Implementation--------------------------------------------------- template <class T> inline -T readNumber(wxInputStream& stream) +T readPOD(wxInputStream& stream) { - T result = 0; - stream.Read(&result, sizeof(T)); - return result; + T pod = 0; + stream.Read(reinterpret_cast<char*>(&pod), sizeof(T)); + return pod; } template <class T> inline -void writeNumber(wxOutputStream& stream, T number) +void writePOD(wxOutputStream& stream, const T& pod) { - stream.Write(&number, sizeof(T)); + stream.Write(reinterpret_cast<const char*>(&pod), sizeof(T)); } +template <class S> inline -Zstring readString(wxInputStream& stream) +S readString(wxInputStream& stream) { - const boost::uint32_t strLength = readNumber<boost::uint32_t>(stream); + typedef typename S::value_type CharType; + + const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream); if (strLength <= 1000) { - Zchar buffer[1000]; - stream.Read(buffer, sizeof(Zchar) * strLength); - return Zstring(buffer, strLength); + CharType buffer[1000]; + stream.Read(buffer, sizeof(CharType) * strLength); + return S(buffer, strLength); } else { - boost::scoped_array<Zchar> buffer(new Zchar[strLength]); - stream.Read(buffer.get(), sizeof(Zchar) * strLength); - return Zstring(buffer.get(), strLength); + std::vector<CharType> buffer(strLength); //throw (std::bad_alloc) + stream.Read(&buffer[0], sizeof(CharType) * strLength); + return S(&buffer[0], strLength); } } +template <class S> inline -void writeString(wxOutputStream& stream, const Zstring& str) +void writeString(wxOutputStream& stream, const S& str) { - writeNumber<boost::uint32_t>(stream, static_cast<boost::uint32_t>(str.length())); - stream.Write(str.c_str(), sizeof(Zchar) * str.length()); + writePOD(stream, static_cast<boost::uint32_t>(str.length())); + stream.Write(str.c_str(), sizeof(typename S::value_type) * str.length()); } @@ -165,17 +205,26 @@ template <class T> inline T ReadInputStream::readNumberC() const //checked read operation { - T output = readNumber<T>(stream_); + T output = readPOD<T>(stream_); check(); return output; } +template <class S> inline -Zstring ReadInputStream::readStringC() const //checked read operation +S ReadInputStream::readStringC() const //checked read operation { - Zstring output = readString(stream_); - check(); + S output; + try + { + output = readString<S>(stream_); //throw (std::bad_alloc) + check(); + } + catch (std::exception&) + { + throwReadError(); + } return output; } @@ -184,13 +233,14 @@ template <class T> inline void WriteOutputStream::writeNumberC(T number) const //checked write operation { - writeNumber<T>(stream_, number); + writePOD<T>(stream_, number); check(); } +template <class S> inline -void WriteOutputStream::writeStringC(const Zstring& str) const //checked write operation +void WriteOutputStream::writeStringC(const S& str) const //checked write operation { writeString(stream_, str); check(); @@ -205,7 +255,6 @@ void WriteOutputStream::check() const throwWriteError(); } - } -#endif // SERIALIZE_H_INCLUDED +#endif //SERIALIZE_H_INCLUDED diff --git a/shared/shadow.cpp b/shared/shadow.cpp index 150a8bbf..52ffefc7 100644 --- a/shared/shadow.cpp +++ b/shared/shadow.cpp @@ -18,7 +18,7 @@ using shadow::ShadowCopy; using shadow::WaitingForShadow; -using ffs3::FileError; +using zen::FileError; namespace @@ -165,7 +165,7 @@ shadow::ReleaseShadowCopyFct ShadowCopy::ShadowVolume::releaseShadowCopy; Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile) { - using namespace ffs3; + using namespace zen; wchar_t volumeNameRaw[1000]; diff --git a/shared/shell_execute.h b/shared/shell_execute.h new file mode 100644 index 00000000..d3605a09 --- /dev/null +++ b/shared/shell_execute.h @@ -0,0 +1,97 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef EXECUTE_HEADER_23482134578134134 +#define EXECUTE_HEADER_23482134578134134 + +#include <wx/string.h> +#include <wx/msgdlg.h> + +#ifdef FFS_WIN +#include "string_tools.h" +#include "last_error.h" +#include "i18n.h" +#include <wx/msw/wrapwin.h> //includes "windows.h" + +#elif defined FFS_LINUX +#include <wx/utils.h> +#endif + + +namespace zen +{ +//launch commandline and report errors via popup dialog +//windows: COM needs to be initialized before calling this function! +namespace +{ +enum ExecutionType +{ + EXEC_TYPE_SYNC, + EXEC_TYPE_ASYNC +}; + +void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC) +{ +#ifdef FFS_WIN + //parse commandline + std::vector<std::wstring> argv; + { + int argc = 0; + LPWSTR* tmp = ::CommandLineToArgvW(command.c_str(), &argc); + for (int i = 0; i < argc; ++i) + argv.push_back(tmp[i]); + ::LocalFree(tmp); + } + + wxString filename; + wxString arguments; + if (!argv.empty()) + { + filename = argv[0]; + for (std::vector<std::wstring>::const_iterator i = argv.begin() + 1; i != argv.end(); ++i) + arguments += (i != argv.begin() ? L" " : L"") + + (i->empty() || std::find_if(i->begin(), i->end(), &cStringIsWhiteSpace<wchar_t>) != i->end() ? L"\"" + *i + L"\"" : *i); + } + + SHELLEXECUTEINFO execInfo = {}; + execInfo.cbSize = sizeof(execInfo); + + //SEE_MASK_NOASYNC is equal to SEE_MASK_FLAG_DDEWAIT, but former is defined not before Win SDK 6.0 + execInfo.fMask = type == EXEC_TYPE_SYNC ? (SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT) : 0; //don't use SEE_MASK_ASYNCOK -> returns successful despite errors! + execInfo.fMask |= SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI; //::ShellExecuteEx() shows a non-blocking pop-up dialog on errors -> we want a blocking one + execInfo.lpVerb = L"open"; + execInfo.lpFile = filename.c_str(); + execInfo.lpParameters = arguments.c_str(); + execInfo.nShow = SW_SHOWNORMAL; + + if (!::ShellExecuteEx(&execInfo)) //__inout LPSHELLEXECUTEINFO lpExecInfo + { + wxString errorMsg = _("Invalid commandline: \"%x\""); + errorMsg.Replace(L"%x", filename + L" " + arguments); + wxMessageBox(errorMsg + L"\n\n" + getLastErrorFormatted()); + return; + } + + if (type == EXEC_TYPE_SYNC) + { + if (execInfo.hProcess != 0) + { + ::WaitForSingleObject(execInfo.hProcess, INFINITE); + ::CloseHandle(execInfo.hProcess); + } + } + +#elif defined FFS_LINUX + //by default wxExecute uses a zero sized dummy window as a hack to keep focus which leaves a useless empty icon in ALT-TAB list + //=> use wxEXEC_NODISABLE and roll our own window disabler! (see comment in app.cpp: void *wxGUIAppTraits::BeforeChildWaitLoop()) + wxWindowDisabler dummy; //disables all top level windows + wxExecute(command, (type == EXEC_TYPE_ASYNC ? wxEXEC_ASYNC : wxEXEC_SYNC) | wxEXEC_NODISABLE); +#endif +} +} +} + +#endif //EXECUTE_HEADER_23482134578134134 diff --git a/shared/standard_paths.cpp b/shared/standard_paths.cpp index e4f87dd6..44deafff 100644 --- a/shared/standard_paths.cpp +++ b/shared/standard_paths.cpp @@ -9,78 +9,87 @@ #include "system_constants.h" #include "string_conv.h" -using namespace ffs3; +using namespace zen; -bool ffs3::isPortableVersion() +namespace { +const wxString& getBinaryDir() //directory containing executable WITH path separator at end +{ + static wxString instance = zToWx(wxToZ(wxStandardPaths::Get().GetExecutablePath()).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR); + return instance; +} + #ifdef FFS_WIN - static const bool isPortable = !wxFileExists(ffs3::getBinaryDir() + wxT("uninstall.exe")); //this check is a bit lame... -#elif defined FFS_LINUX - static const bool isPortable = !ffs3::getBinaryDir().EndsWith(wxT("/bin/")); //this check is a bit lame... +wxString getInstallDir() //root install directory WITH path separator at end +{ + return getBinaryDir().BeforeLast(common::FILE_NAME_SEPARATOR).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR; +} #endif - return isPortable; } -const wxString& ffs3::getBinaryDir() +bool zen::isPortableVersion() { - static wxString instance = zToWx(wxToZ(wxStandardPaths::Get().GetExecutablePath()).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR); - return instance; +#ifdef FFS_WIN + static const bool isPortable = !wxFileExists(getInstallDir() + wxT("uninstall.exe")); //this check is a bit lame... +#elif defined FFS_LINUX + static const bool isPortable = !::getBinaryDir().EndsWith(wxT("/bin/")); //this check is a bit lame... +#endif + return isPortable; } -const wxString& ffs3::getResourceDir() +wxString zen::getResourceDir() { #ifdef FFS_WIN - return getBinaryDir(); + return getInstallDir(); #elif defined FFS_LINUX - static wxString resourceDir; - - static bool isInitalized = false; //poor man's singleton... - if (!isInitalized) + if (isPortableVersion()) + return getBinaryDir(); + else //use OS' standard paths { - isInitalized = true; + wxString resourceDir = wxStandardPathsBase::Get().GetResourcesDir(); - if (isPortableVersion()) - resourceDir = getBinaryDir(); - else //use OS' standard paths - { - resourceDir = wxStandardPathsBase::Get().GetResourcesDir(); + if (!resourceDir.EndsWith(zToWx(common::FILE_NAME_SEPARATOR))) + resourceDir += zToWx(common::FILE_NAME_SEPARATOR); - if (!resourceDir.EndsWith(zToWx(common::FILE_NAME_SEPARATOR))) - resourceDir += zToWx(common::FILE_NAME_SEPARATOR); - } + return resourceDir; } - - return resourceDir; #endif } -const wxString& ffs3::getConfigDir() +wxString zen::getConfigDir() { - static wxString userDirectory; - - static bool isInitalized = false; //poor man's singleton... - if (!isInitalized) + if (isPortableVersion()) +#ifdef FFS_WIN + return getInstallDir(); +#elif defined FFS_LINUX + //wxString(wxT(".")) + zToWx(common::FILE_NAME_SEPARATOR) -> don't use current working directory + //avoid surprises with GlobalSettings.xml being newly created in each working directory + return getBinaryDir(); +#endif + else //use OS' standard paths { - isInitalized = true; + wxString userDirectory = wxStandardPathsBase::Get().GetUserDataDir(); - if (isPortableVersion()) - //userDirectory = wxString(wxT(".")) + zToWx(common::FILE_NAME_SEPARATOR); //use current working directory - userDirectory = getBinaryDir(); //avoid surprises with GlobalSettings.xml being newly created in each working directory - else //use OS' standard paths - { - userDirectory = wxStandardPathsBase::Get().GetUserDataDir(); + if (!wxDirExists(userDirectory)) + ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary - if (!wxDirExists(userDirectory)) - ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary + if (!userDirectory.EndsWith(zToWx(common::FILE_NAME_SEPARATOR))) + userDirectory += zToWx(common::FILE_NAME_SEPARATOR); - if (!userDirectory.EndsWith(zToWx(common::FILE_NAME_SEPARATOR))) - userDirectory += zToWx(common::FILE_NAME_SEPARATOR); - } + return userDirectory; } +} + - return userDirectory; +wxString zen::getLauncher() +{ +#ifdef FFS_WIN + return getInstallDir() + wxT("FreeFileSync.exe"); +#elif defined FFS_LINUX + return getBinaryDir() + wxT("FreeFileSync"); +#endif } diff --git a/shared/standard_paths.h b/shared/standard_paths.h index 5ecae9a7..faafe263 100644 --- a/shared/standard_paths.h +++ b/shared/standard_paths.h @@ -10,16 +10,16 @@ #include <wx/string.h> -namespace ffs3 +namespace zen { //------------------------------------------------------------------------------ //global program directories //------------------------------------------------------------------------------ -const wxString& getBinaryDir(); //directory containing executable WITH path separator at end -const wxString& getResourceDir(); //resource directory WITH path separator at end -const wxString& getConfigDir(); //config directory WITH path separator at end +wxString getResourceDir(); //resource directory WITH path separator at end +wxString getConfigDir(); //config directory WITH path separator at end //------------------------------------------------------------------------------ +wxString getLauncher(); //full path to application launcher C:\...\FreeFileSync.exe bool isPortableVersion(); } diff --git a/shared/string_conv.h b/shared/string_conv.h index 24cb521e..248605f6 100644 --- a/shared/string_conv.h +++ b/shared/string_conv.h @@ -10,7 +10,7 @@ #include <wx/string.h> #include "zstring.h" -namespace ffs3 +namespace zen { //conversion from Zstring to wxString wxString zToWx(const Zstring& str); @@ -74,7 +74,7 @@ wxString zToWx(const Zchar* str) inline wxString zToWx(Zchar ch) { - return zToWx(Zstring(ch)); + return zToWx(Zstring() + ch); } //----------------------------------------------------------------- diff --git a/shared/string_tools.h b/shared/string_tools.h new file mode 100644 index 00000000..53365f71 --- /dev/null +++ b/shared/string_tools.h @@ -0,0 +1,444 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef STRING_TOOLS_HEADER_213458973046 +#define STRING_TOOLS_HEADER_213458973046 + +#include <cstddef> //size_t +#include <cctype> //isspace +#include <cwctype> //iswspace +#include <algorithm> +#include <cassert> +#include <sstream> +#include <functional> +#include <vector> +#include "loki/TypeTraits.h" + + +//enhance arbitray string class with useful non-member functions: +namespace zen +{ +template <class C> size_t cStringLength(const C* input); //strlen() +template <class C> bool cStringIsWhiteSpace(C ch); +template <class C> bool cStringIsDigit(C ch); + +template <class S> bool startsWith(const S& str, typename S::value_type prefix); +template <class S> bool startsWith(const S& str, const typename S::value_type* prefix); +template <class S, class T> bool startsWith(const S& str, const T& prefix, typename T::value_type dummy = 0); //SFINAE: T must be a "string" +template <class S> bool endsWith(const S& str, typename S::value_type postfix); +template <class S> bool endsWith(const S& str, const typename S::value_type* postfix); +template <class S, class T> bool endsWith(const S& str, const T& postfix, typename T::value_type dummy = 0); //SFINAE: T must be a "string" + +template <class S> S afterLast (const S& str, typename S::value_type ch); //returns the whole string if ch not found +template <class S> S beforeLast (const S& str, typename S::value_type ch); //returns empty string if ch not found +template <class S> S afterFirst (const S& str, typename S::value_type ch); //returns empty string if ch not found +template <class S> S beforeFirst(const S& str, typename S::value_type ch); //returns the whole string if ch not found + +template <class S, class T> std::vector<S> split(const S& str, const T& delimiter); +template <class S> void truncate(S& str, size_t newLen); +template <class S> void replace(S& str, const typename S::value_type* old, const typename S::value_type* replacement, bool replaceAll); +template <class S> void trim(S& str, bool fromLeft = true, bool fromRight = true); + +//formatted number conversion the C++ way +template <class S, class Num> S toString(const Num& number); +template <class Num, class S> Num toNumber(const S& str); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//---------------------- implementation ---------------------- + +template <class C> +inline +size_t cStringLength(const C* input) //strlen() +{ + const C* iter = input; + while (*iter != 0) + ++iter; + return iter - input; +} + + +template <> +inline +bool cStringIsWhiteSpace(char ch) +{ + const unsigned char usc = ch; //caveat 1: std::isspace() takes an int, but expects an unsigned char + return usc < 128 && //caveat 2: some parts of UTF-8 chars are erroneously seen as whitespace, e.g. the a0 from "\xec\x8b\xa0" (MSVC) + std::isspace(usc) != 0; +} + +template <> +inline +bool cStringIsWhiteSpace(wchar_t ch) +{ + return std::iswspace(ch) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC +} + + +template <> +inline +bool cStringIsDigit(char ch) +{ + return std::isdigit(static_cast<unsigned char>(ch)) != 0; //caveat: takes an int, but expects an unsigned char +} + + +template <> +inline +bool cStringIsDigit(wchar_t ch) +{ + return std::iswdigit(ch) != 0; +} + + +template <class S> +inline +bool startsWith(const S& str, typename S::value_type prefix) +{ + return str.length() != 0 && str.operator[](0) == prefix; +} + + +template <class S> +inline +bool startsWith(const S& str, const typename S::value_type* prefix) +{ + const size_t pfLength = cStringLength(prefix); + if (str.length() < pfLength) + return false; + + return std::equal(str.c_str(), str.c_str() + pfLength, + prefix); +} + + +template <class S, class T> +inline +bool startsWith(const S& str, const T& prefix, typename T::value_type) +{ + if (str.length() < prefix.length()) + return false; + + return std::equal(str.c_str(), str.c_str() + prefix.length(), + prefix.c_str()); +} + + +template <class S> +inline +bool endsWith(const S& str, typename S::value_type postfix) +{ + const size_t len = str.length(); + return len != 0 && str.operator[](len - 1) == postfix; +} + + +template <class S> +inline +bool endsWith(const S& str, const typename S::value_type* postfix) +{ + const size_t pfLength = cStringLength(postfix); + if (str.length() < pfLength) + return false; + + const typename S::value_type* cmpBegin = str.c_str() + str.length() - pfLength; + return std::equal(cmpBegin, cmpBegin + pfLength, + postfix); +} + + +template <class S, class T> +inline +bool endsWith(const S& str, const T& postfix, typename T::value_type) +{ + if (str.length() < postfix.length()) + return false; + + const typename S::value_type* cmpBegin = str.c_str() + str.length() - postfix.length(); + return std::equal(cmpBegin, cmpBegin + postfix.length(), + postfix.c_str()); +} + + +// get all characters after the last occurence of ch +// (returns the whole string if ch not found) +template <class S> +inline +S afterLast(const S& str, typename S::value_type ch) +{ + const size_t pos = str.rfind(ch); + if (pos != S::npos) + return S(str.c_str() + pos + 1, str.length() - pos - 1); + else + return str; +} + + +// get all characters before the last occurence of ch +// (returns empty string if ch not found) +template <class S> +inline +S beforeLast(const S& str, typename S::value_type ch) +{ + const size_t pos = str.rfind(ch); + if (pos != S::npos) + return S(str.c_str(), pos); //data is non-empty string in this context: else ch would not have been found! + else + return S(); +} + + +//returns empty string if ch not found +template <class S> +inline +S afterFirst(const S& str, typename S::value_type ch) +{ + const size_t pos = str.find(ch); + if (pos != S::npos) + return S(str.c_str() + pos + 1, str.length() - pos - 1); + else + return S(); + +} + + +//returns the whole string if ch not found +template <class S> +inline +S beforeFirst(const S& str, typename S::value_type ch) +{ + const size_t pos = str.find(ch, 0); + if (pos != S::npos) + return S(str.c_str(), pos); //data is non-empty string in this context: else ch would not have been found! + else + return str; +} + + +template <class S, class T> +inline +std::vector<S> split(const S& str, const T& delimiter) +{ + const S delim = S() + delimiter; //handle char, char* and string + std::vector<S> output; + size_t bockStart = 0; + if (!delim.empty()) + { + for (size_t blockEnd = str.find(delim, bockStart); + blockEnd != S::npos; + bockStart = blockEnd + delim.size(), blockEnd = str.find(delim, bockStart)) + { + output.push_back(S(str.c_str() + bockStart, blockEnd - bockStart)); + } + } + output.push_back(S(str.c_str() + bockStart, str.length() - bockStart)); + return output; +} + + +template <class S> +inline +void truncate(S& str, size_t newLen) +{ + if (newLen < str.length()) + str.resize(newLen); +} + + +template <class S> +inline +void replace(S& str, const typename S::value_type* old, const typename S::value_type* replacement, bool replaceAll) +{ + const size_t oldLen = cStringLength(old); + const size_t replacementLen = cStringLength(replacement); + + size_t pos = 0; + while ((pos = str.find(old, pos)) != S::npos) + { + str.replace(pos, oldLen, replacement, replacementLen); + pos += replacementLen; //move past the string that was replaced + + if (!replaceAll) + break; + } +} + + +template <class S> +inline +void trim(S& str, bool fromLeft, bool fromRight) +{ + assert(fromLeft || fromRight); + + typedef typename S::value_type CharType; + + const CharType* newBegin = str.c_str(); + const CharType* newEnd = str.c_str() + str.length(); + + if (fromRight) + while (newBegin != newEnd && cStringIsWhiteSpace(newEnd[-1])) + --newEnd; + + if (fromLeft) + while (newBegin != newEnd && cStringIsWhiteSpace(*newBegin)) + ++newBegin; + + const size_t newLength = newEnd - newBegin; + if (newLength != str.length()) + { + if (newBegin != str.c_str()) + str = S(newBegin, newLength); //minor inefficiency: in case "str" is not shared, we could save an allocation and do a memory move only + else + str.resize(newLength); + } +} + + +namespace +{ +template <class S, class T> +struct CnvtStringToString +{ + T convert(const S& src) const { return T(src.c_str(), src.size()); } +}; + +template <class S> +struct CnvtStringToString<S, S> //optimization: for "basic_string -> basic_string" we don't need a deep copy +{ + S convert(const S& src) const { return src; } +}; + + +template <class S, class Num> +struct CvrtNumberToString +{ + S convert(const Num& number) const //convert string to number using streams: convenient, but SLOW + { + typedef typename S::value_type CharType; + + std::basic_ostringstream<CharType> ss; + ss << number; + return CnvtStringToString<std::basic_string<CharType>, S>().convert(ss.str()); + } +}; + + +template <class S, class Num, bool isIntegral> +struct CvrtStringToNumber +{ + Num convert(const S& str) const //convert number to string using streams: convenient, but SLOW + { + typedef typename S::value_type CharType; + + Num number = 0; + std::basic_istringstream<CharType>(CnvtStringToString<S, std::basic_string<CharType> >().convert(str)) >> number; + return number; + } +}; + + +template <class S, class Num> +struct CvrtStringToNumber<S, Num, true> +{ + Num convert(const S& str) const //very fast conversion to integers: slightly faster than std::atoi, but more importantly: generic + { + typedef typename S::value_type CharType; + + const CharType* first = str.c_str(); + const CharType* last = first + str.size(); + + while (first != last && cStringIsWhiteSpace(*first)) //skip leading whitespace + ++first; + + bool hasMinusSign = false; //handle minus sign + if (first != last) + { + if (*first == '-') + { + hasMinusSign = true; + ++first; + } + else if (*first == '+') + ++first; + } + + Num number = 0; + for (const CharType* iter = first; iter != last; ++iter) + { + const CharType c = *iter; + if ('0' <= c && c <= '9') + { + number *= 10; + number += c - '0'; + } + else + { + assert(std::find_if(iter, last, std::not1(std::ptr_fun(&cStringIsWhiteSpace<CharType>))) == last); //rest of string should contain whitespace only + break; + } + } + + return hasMinusSign ? -number : number; + } +}; +} + + +template <class S, class Num> +inline +S toString(const Num& number) //convert number to string the C++ way +{ + return CvrtNumberToString<S, Num>().convert(number); +} + + +template <class Num, class S> +inline +Num toNumber(const S& str) //convert number to string the C++ way +{ + return CvrtStringToNumber<S, Num, Loki::TypeTraits<Num>::isIntegral>().convert(str); +} + +} + +#endif //STRING_TOOLS_HEADER_213458973046 diff --git a/shared/symlink_target.h b/shared/symlink_target.h index 200c76d8..0e98b951 100644 --- a/shared/symlink_target.h +++ b/shared/symlink_target.h @@ -8,8 +8,7 @@ #define SYMLINK_WIN_H_INCLUDED #include "loki/ScopeGuard.h" -#include <boost/scoped_array.hpp> -#include "system_func.h" +#include "last_error.h" #include "string_conv.h" #include "file_error.h" #include "i18n.h" @@ -64,19 +63,19 @@ namespace //retrieve raw target data of symlink or junction Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) { - using ffs3::zToWx; - using ffs3::FileError; + using zen::zToWx; + using zen::FileError; #ifdef FFS_WIN //FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx try //reading certain symlinks requires admin rights! This shall not cause an error in user mode! { //allow access to certain symbolic links/junctions - ffs3::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError) + zen::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError) } catch (...) {} - const HANDLE hLink = ::CreateFile(ffs3::applyLongPathPrefix(linkPath).c_str(), + const HANDLE hLink = ::CreateFile(zen::applyLongPathPrefix(linkPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -85,31 +84,30 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) NULL); if (hLink == INVALID_HANDLE_VALUE) { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hLink); (void)dummy; //silence warning "unused variable" //respect alignment issues... - const size_t bufferSize = REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE; - boost::scoped_array<char> buffer(new char[bufferSize]); + std::vector<char> buffer(REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE); DWORD bytesReturned; //dummy value required by FSCTL_GET_REPARSE_POINT! if (!::DeviceIoControl(hLink, //__in HANDLE hDevice, FSCTL_GET_REPARSE_POINT, //__in DWORD dwIoControlCode, NULL, //__in_opt LPVOID lpInBuffer, 0, //__in DWORD nInBufferSize, - buffer.get(), //__out_opt LPVOID lpOutBuffer, - bufferSize, //__in DWORD nOutBufferSize, + &buffer[0], //__out_opt LPVOID lpOutBuffer, + static_cast<DWORD>(buffer.size()), //__in DWORD nOutBufferSize, &bytesReturned, //__out_opt LPDWORD lpBytesReturned, NULL)) //__inout_opt LPOVERLAPPED lpOverlapped { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted()); + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted()); } - REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer.get()); //REPARSE_DATA_BUFFER needs to be artificially enlarged! + REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(&buffer[0]); //REPARSE_DATA_BUFFER needs to be artificially enlarged! Zstring output; if (reparseData.ReparseTag == IO_REPARSE_TAG_SYMLINK) @@ -124,7 +122,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) } else { - wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\""); + wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + wxT("Not a symbolic link or junction!")); } @@ -142,7 +140,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE) { wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(linkPath) + wxT("\""); - if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + ffs3::getLastErrorFormatted(); + if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + zen::getLastErrorFormatted(); throw FileError(errorMessage); } buffer[bytesWritten] = 0; //set null-terminating char diff --git a/shared/tinyxml/changes.txt b/shared/tinyxml/changes.txt index 1ea21ad0..15b51bd9 100644 --- a/shared/tinyxml/changes.txt +++ b/shared/tinyxml/changes.txt @@ -286,5 +286,14 @@ Changes in version 2.1.5 - tibur found a bug in end tag parsing - +2.6.2 +- Switched over to VC 2010 +- Fixed up all the build issues arising from that. (Lots of latent build problems.) +- Removed the old, now unmaintained and likely not working, build files. +- Fixed some static analysis issues reported by orbitcowboy from cppcheck. +- Bayard 95 sent in analysis from a different analyzer - fixes applied from that as well. +- Tim Kosse sent a patch fixing an infinite loop. +- Ma Anguo identified a doc issue. +- Eddie Cohen identified a missing qualifier resulting in a compilation error on some systems. +- Fixed a line ending bug. (What year is this? Can we all agree on a format for text files? Please? ...oh well.) diff --git a/shared/tinyxml/docs/classTiXmlDocument.html b/shared/tinyxml/docs/classTiXmlDocument.html index 107101cb..b46bb27c 100644 --- a/shared/tinyxml/docs/classTiXmlDocument.html +++ b/shared/tinyxml/docs/classTiXmlDocument.html @@ -309,7 +309,7 @@ virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" hr <p>Load a file using the current document value. </p> <p>Returns true if successful. Will delete any existing document data before loading. </p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01425">LoadFile()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01432">LoadFile()</a>.</p> </div> </div> @@ -368,9 +368,9 @@ virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" hr <p>Write the document to standard out using formatted printing ("pretty print"). </p> -<p>References <a class="el" href="tinyxml_8h_source.html#l01512">Print()</a>.</p> +<p>References <a class="el" href="tinyxml_8h_source.html#l01519">Print()</a>.</p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01512">Print()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01519">Print()</a>.</p> </div> </div> diff --git a/shared/tinyxml/docs/classTiXmlElement-members.html b/shared/tinyxml/docs/classTiXmlElement-members.html index dff303a8..dc8a33be 100644 --- a/shared/tinyxml/docs/classTiXmlElement-members.html +++ b/shared/tinyxml/docs/classTiXmlElement-members.html @@ -82,10 +82,12 @@ <tr class="memlist"><td><a class="el" href="classTiXmlNode.html#a658276f57d35d5d4256d1dc1a2c398ab">PreviousSibling</a>(const std::string &_value) const </td><td><a class="el" href="classTiXmlNode.html">TiXmlNode</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlNode.html#acc8a0434c7f401d4a3b6dee77c1a5912">PreviousSibling</a>(const std::string &_value)</td><td><a class="el" href="classTiXmlNode.html">TiXmlNode</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#afbf52736e70fc91ec9d760721d6f4fd2">Print</a>(FILE *cfile, int depth) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [virtual]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">QueryBoolAttribute</a>(const char *name, bool *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">QueryDoubleAttribute</a>(const char *name, double *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">QueryFloatAttribute</a>(const char *name, float *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9">QueryIntAttribute</a>(const char *name, int *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">QueryStringAttribute</a>(const char *name, std::string *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr> + <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">QueryUnsignedAttribute</a>(const char *name, unsigned *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">QueryValueAttribute</a>(const std::string &name, T *outValue) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a56979767deca794376b1dfa69a525b2a">RemoveAttribute</a>(const char *name)</td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr> <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">RemoveAttribute</a>(const std::string &name)</td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr> diff --git a/shared/tinyxml/docs/classTiXmlElement.html b/shared/tinyxml/docs/classTiXmlElement.html index ac1b3d7a..4d6a5e93 100644 --- a/shared/tinyxml/docs/classTiXmlElement.html +++ b/shared/tinyxml/docs/classTiXmlElement.html @@ -61,6 +61,11 @@ const char * </td><td class="memItemRight" valign="bottom"><a class="el" hr <tr><td class="mdescLeft"> </td><td class="mdescRight">Given an attribute name, <a class="el" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute()</a> returns the value for the attribute of that name, or null if none exists. <a href="#aeaff99d4f0ea5b34f7aee202aad457ba"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9">QueryIntAttribute</a> (const char *name, int *_value) const </td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">QueryIntAttribute examines the attribute - it is an alternative to the <a class="el" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute()</a> method with richer error checking. <a href="#aea0bfe471380f281c5945770ddbf52b9"></a><br/></td></tr> +<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae48df644f890ab86fa19839ac401f00d"></a><!-- doxytag: member="TiXmlElement::QueryUnsignedAttribute" ref="ae48df644f890ab86fa19839ac401f00d" args="(const char *name, unsigned *_value) const " --> +int </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">QueryUnsignedAttribute</a> (const char *name, unsigned *_value) const </td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">QueryUnsignedAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <br/></td></tr> +<tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">QueryBoolAttribute</a> (const char *name, bool *_value) const </td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">QueryBoolAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <a href="#af4a1d3f88c28eb0f3115dc39ebd83fff"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a898d7730ecc341f0bffc7a9dadbf1ce7"></a><!-- doxytag: member="TiXmlElement::QueryDoubleAttribute" ref="a898d7730ecc341f0bffc7a9dadbf1ce7" args="(const char *name, double *_value) const " --> int </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">QueryDoubleAttribute</a> (const char *name, double *_value) const </td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">QueryDoubleAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <br/></td></tr> @@ -244,6 +249,36 @@ virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" hr </div> </div> +<a class="anchor" id="af4a1d3f88c28eb0f3115dc39ebd83fff"></a><!-- doxytag: member="TiXmlElement::QueryBoolAttribute" ref="af4a1d3f88c28eb0f3115dc39ebd83fff" args="(const char *name, bool *_value) const " --> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int TiXmlElement::QueryBoolAttribute </td> + <td>(</td> + <td class="paramtype">const char * </td> + <td class="paramname"> <em>name</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool * </td> + <td class="paramname"> <em>_value</em></td><td> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td><td> const</td> + </tr> + </table> +</div> +<div class="memdoc"> + +<p>QueryBoolAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. </p> +<p>Note that '1', 'true', or 'yes' are considered true, while '0', 'false' and 'no' are considered false. </p> + +</div> +</div> <a class="anchor" id="aea0bfe471380f281c5945770ddbf52b9"></a><!-- doxytag: member="TiXmlElement::QueryIntAttribute" ref="aea0bfe471380f281c5945770ddbf52b9" args="(const char *name, int *_value) const " --> <div class="memitem"> <div class="memproto"> diff --git a/shared/tinyxml/docs/classTiXmlHandle.html b/shared/tinyxml/docs/classTiXmlHandle.html index 0e0d45e3..59ee217c 100644 --- a/shared/tinyxml/docs/classTiXmlHandle.html +++ b/shared/tinyxml/docs/classTiXmlHandle.html @@ -249,7 +249,7 @@ <div class="memdoc"> <dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>use ToElement. Return the handle as a <a class="el" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>. This may return null. </dd></dl> -<p>References <a class="el" href="tinyxml_8h_source.html#l01681">ToElement()</a>.</p> +<p>References <a class="el" href="tinyxml_8h_source.html#l01688">ToElement()</a>.</p> </div> </div> @@ -269,7 +269,7 @@ <div class="memdoc"> <dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>use ToNode. Return the handle as a <a class="el" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>. This may return null. </dd></dl> -<p>References <a class="el" href="tinyxml_8h_source.html#l01678">ToNode()</a>.</p> +<p>References <a class="el" href="tinyxml_8h_source.html#l01685">ToNode()</a>.</p> </div> </div> @@ -289,7 +289,7 @@ <div class="memdoc"> <dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>use <a class="el" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText()</a> Return the handle as a <a class="el" href="classTiXmlText.html" title="XML text.">TiXmlText</a>. This may return null. </dd></dl> -<p>References <a class="el" href="tinyxml_8h_source.html#l01684">ToText()</a>.</p> +<p>References <a class="el" href="tinyxml_8h_source.html#l01691">ToText()</a>.</p> </div> </div> @@ -311,7 +311,7 @@ <p>Return the handle as a <a class="el" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>. </p> <p>This may return null. </p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01696">Element()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01703">Element()</a>.</p> </div> </div> @@ -333,7 +333,7 @@ <p>Return the handle as a <a class="el" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>. </p> <p>This may return null. </p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01692">Node()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01699">Node()</a>.</p> </div> </div> @@ -355,7 +355,7 @@ <p>Return the handle as a <a class="el" href="classTiXmlText.html" title="XML text.">TiXmlText</a>. </p> <p>This may return null. </p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01700">Text()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01707">Text()</a>.</p> </div> </div> @@ -377,7 +377,7 @@ <p>Return the handle as a <a class="el" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn't recognize is saved as an unknown.">TiXmlUnknown</a>. </p> <p>This may return null. </p> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01704">Unknown()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01711">Unknown()</a>.</p> </div> </div> @@ -397,7 +397,7 @@ <div class="memdoc"> <dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd>use <a class="el" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown()</a> Return the handle as a <a class="el" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn't recognize is saved as an unknown.">TiXmlUnknown</a>. This may return null. </dd></dl> -<p>References <a class="el" href="tinyxml_8h_source.html#l01687">ToUnknown()</a>.</p> +<p>References <a class="el" href="tinyxml_8h_source.html#l01694">ToUnknown()</a>.</p> </div> </div> diff --git a/shared/tinyxml/docs/classTiXmlNode.html b/shared/tinyxml/docs/classTiXmlNode.html index 50b3464a..5ba4bcf3 100644 --- a/shared/tinyxml/docs/classTiXmlNode.html +++ b/shared/tinyxml/docs/classTiXmlNode.html @@ -573,7 +573,7 @@ std::string & </td><td class="memItemRight" valign="bottom"><a class="e Unknown: the tag contents Text: the text string </pre></div> -<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01161">TiXmlComment::TiXmlComment()</a>, and <a class="el" href="tinyxml_8h_source.html#l01213">TiXmlText::TiXmlText()</a>.</p> +<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01168">TiXmlComment::TiXmlComment()</a>, and <a class="el" href="tinyxml_8h_source.html#l01220">TiXmlText::TiXmlText()</a>.</p> </div> </div> @@ -593,7 +593,7 @@ std::string & </td><td class="memItemRight" valign="bottom"><a class="e <div class="memdoc"> <p>Query the type (as an enumerated value, above) of this node. </p> -<p>The possible types are: DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION. </p> +<p>The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. </p> </div> </div> diff --git a/shared/tinyxml/docs/classTiXmlPrinter.html b/shared/tinyxml/docs/classTiXmlPrinter.html index bfbf4187..28be1e88 100644 --- a/shared/tinyxml/docs/classTiXmlPrinter.html +++ b/shared/tinyxml/docs/classTiXmlPrinter.html @@ -68,7 +68,7 @@ virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" hr <tr><td class="mdescLeft"> </td><td class="mdescRight">Visit a comment node. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad2dca6dd106e8982fd3c7db1f3330970"></a><!-- doxytag: member="TiXmlPrinter::Visit" ref="ad2dca6dd106e8982fd3c7db1f3330970" args="(const TiXmlUnknown &unknown)" --> virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlPrinter.html#ad2dca6dd106e8982fd3c7db1f3330970">Visit</a> (const <a class="el" href="classTiXmlUnknown.html">TiXmlUnknown</a> &unknown)</td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Visit an unknow node. <br/></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Visit an unknown node. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">SetIndent</a> (const char *_indent)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Set the indent characters for printing. <a href="#a213377a4070c7e625bae59716b089e5e"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abb33ec7d4bad6aaeb57f4304394b133d"></a><!-- doxytag: member="TiXmlPrinter::Indent" ref="abb33ec7d4bad6aaeb57f4304394b133d" args="()" --> diff --git a/shared/tinyxml/docs/classTiXmlVisitor.html b/shared/tinyxml/docs/classTiXmlVisitor.html index 404ae0dc..60c6a27d 100644 --- a/shared/tinyxml/docs/classTiXmlVisitor.html +++ b/shared/tinyxml/docs/classTiXmlVisitor.html @@ -68,7 +68,7 @@ virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" hr <tr><td class="mdescLeft"> </td><td class="mdescRight">Visit a comment node. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e284d607d275c51dac1adb58159ce28"></a><!-- doxytag: member="TiXmlVisitor::Visit" ref="a7e284d607d275c51dac1adb58159ce28" args="(const TiXmlUnknown &)" --> virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">Visit</a> (const <a class="el" href="classTiXmlUnknown.html">TiXmlUnknown</a> &)</td></tr> -<tr><td class="mdescLeft"> </td><td class="mdescRight">Visit an unknow node. <br/></td></tr> +<tr><td class="mdescLeft"> </td><td class="mdescRight">Visit an unknown node. <br/></td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <p>Implements the interface to the "Visitor pattern" (see the Accept() method. </p> diff --git a/shared/tinyxml/docs/functions_0x71.html b/shared/tinyxml/docs/functions_0x71.html index c7882b83..d2fd5c60 100644 --- a/shared/tinyxml/docs/functions_0x71.html +++ b/shared/tinyxml/docs/functions_0x71.html @@ -59,6 +59,9 @@ Here is a list of all documented class members with links to the class documentation for each member: <h3><a class="anchor" id="index_q">- q -</a></h3><ul> +<li>QueryBoolAttribute() +: <a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">TiXmlElement</a> +</li> <li>QueryDoubleAttribute() : <a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">TiXmlElement</a> </li> @@ -77,6 +80,9 @@ Here is a list of all documented class members with links to the class documenta <li>QueryStringAttribute() : <a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">TiXmlElement</a> </li> +<li>QueryUnsignedAttribute() +: <a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">TiXmlElement</a> +</li> <li>QueryValueAttribute() : <a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">TiXmlElement</a> </li> diff --git a/shared/tinyxml/docs/functions_func_0x71.html b/shared/tinyxml/docs/functions_func_0x71.html index 27402292..4d236d2a 100644 --- a/shared/tinyxml/docs/functions_func_0x71.html +++ b/shared/tinyxml/docs/functions_func_0x71.html @@ -58,6 +58,9 @@ <h3><a class="anchor" id="index_q">- q -</a></h3><ul> +<li>QueryBoolAttribute() +: <a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">TiXmlElement</a> +</li> <li>QueryDoubleAttribute() : <a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">TiXmlElement</a> </li> @@ -76,6 +79,9 @@ <li>QueryStringAttribute() : <a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">TiXmlElement</a> </li> +<li>QueryUnsignedAttribute() +: <a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">TiXmlElement</a> +</li> <li>QueryValueAttribute() : <a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">TiXmlElement</a> </li> diff --git a/shared/tinyxml/docs/index.html b/shared/tinyxml/docs/index.html index 1cb925ba..d89b21a7 100644 --- a/shared/tinyxml/docs/index.html +++ b/shared/tinyxml/docs/index.html @@ -19,7 +19,7 @@ </div> </div> <div class="contents"> -<h1>TinyXml Documentation</h1><h3 class="version">2.6.1 </h3><h1>TinyXML </h1> +<h1>TinyXml Documentation</h1><h3 class="version">2.6.2 </h3><h1>TinyXML </h1> <p>TinyXML is a simple, small, C++ XML parser that can be easily integrated into other programs.</p> <h2>What it does. </h2> <p>In brief, TinyXML parses an XML document, and builds from that a Document Object Model (DOM) that can be read, modified, and saved.</p> diff --git a/shared/tinyxml/docs/tinystr_8h_source.html b/shared/tinyxml/docs/tinystr_8h_source.html index eddeda87..579a90e0 100644 --- a/shared/tinyxml/docs/tinystr_8h_source.html +++ b/shared/tinyxml/docs/tinystr_8h_source.html @@ -24,323 +24,309 @@ </div> <h1>tinystr.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> <a name="l00002"></a>00002 <span class="comment">www.sourceforge.net/projects/tinyxml</span> -<a name="l00003"></a>00003 <span class="comment">Original file by Yves Berquin.</span> -<a name="l00004"></a>00004 <span class="comment"></span> -<a name="l00005"></a>00005 <span class="comment">This software is provided 'as-is', without any express or implied</span> -<a name="l00006"></a>00006 <span class="comment">warranty. In no event will the authors be held liable for any</span> -<a name="l00007"></a>00007 <span class="comment">damages arising from the use of this software.</span> -<a name="l00008"></a>00008 <span class="comment"></span> -<a name="l00009"></a>00009 <span class="comment">Permission is granted to anyone to use this software for any</span> -<a name="l00010"></a>00010 <span class="comment">purpose, including commercial applications, and to alter it and</span> -<a name="l00011"></a>00011 <span class="comment">redistribute it freely, subject to the following restrictions:</span> -<a name="l00012"></a>00012 <span class="comment"></span> -<a name="l00013"></a>00013 <span class="comment">1. The origin of this software must not be misrepresented; you must</span> -<a name="l00014"></a>00014 <span class="comment">not claim that you wrote the original software. If you use this</span> -<a name="l00015"></a>00015 <span class="comment">software in a product, an acknowledgment in the product documentation</span> -<a name="l00016"></a>00016 <span class="comment">would be appreciated but is not required.</span> -<a name="l00017"></a>00017 <span class="comment"></span> -<a name="l00018"></a>00018 <span class="comment">2. Altered source versions must be plainly marked as such, and</span> -<a name="l00019"></a>00019 <span class="comment">must not be misrepresented as being the original software.</span> -<a name="l00020"></a>00020 <span class="comment"></span> -<a name="l00021"></a>00021 <span class="comment">3. This notice may not be removed or altered from any source</span> -<a name="l00022"></a>00022 <span class="comment">distribution.</span> -<a name="l00023"></a>00023 <span class="comment">*/</span> +<a name="l00003"></a>00003 <span class="comment"></span> +<a name="l00004"></a>00004 <span class="comment">This software is provided 'as-is', without any express or implied</span> +<a name="l00005"></a>00005 <span class="comment">warranty. In no event will the authors be held liable for any</span> +<a name="l00006"></a>00006 <span class="comment">damages arising from the use of this software.</span> +<a name="l00007"></a>00007 <span class="comment"></span> +<a name="l00008"></a>00008 <span class="comment">Permission is granted to anyone to use this software for any</span> +<a name="l00009"></a>00009 <span class="comment">purpose, including commercial applications, and to alter it and</span> +<a name="l00010"></a>00010 <span class="comment">redistribute it freely, subject to the following restrictions:</span> +<a name="l00011"></a>00011 <span class="comment"></span> +<a name="l00012"></a>00012 <span class="comment">1. The origin of this software must not be misrepresented; you must</span> +<a name="l00013"></a>00013 <span class="comment">not claim that you wrote the original software. If you use this</span> +<a name="l00014"></a>00014 <span class="comment">software in a product, an acknowledgment in the product documentation</span> +<a name="l00015"></a>00015 <span class="comment">would be appreciated but is not required.</span> +<a name="l00016"></a>00016 <span class="comment"></span> +<a name="l00017"></a>00017 <span class="comment">2. Altered source versions must be plainly marked as such, and</span> +<a name="l00018"></a>00018 <span class="comment">must not be misrepresented as being the original software.</span> +<a name="l00019"></a>00019 <span class="comment"></span> +<a name="l00020"></a>00020 <span class="comment">3. This notice may not be removed or altered from any source</span> +<a name="l00021"></a>00021 <span class="comment">distribution.</span> +<a name="l00022"></a>00022 <span class="comment">*/</span> +<a name="l00023"></a>00023 <a name="l00024"></a>00024 -<a name="l00025"></a>00025 <span class="comment">/*</span> -<a name="l00026"></a>00026 <span class="comment"> * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.</span> -<a name="l00027"></a>00027 <span class="comment"> *</span> -<a name="l00028"></a>00028 <span class="comment"> * - completely rewritten. compact, clean, and fast implementation.</span> -<a name="l00029"></a>00029 <span class="comment"> * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)</span> -<a name="l00030"></a>00030 <span class="comment"> * - fixed reserve() to work as per specification.</span> -<a name="l00031"></a>00031 <span class="comment"> * - fixed buggy compares operator==(), operator<(), and operator>()</span> -<a name="l00032"></a>00032 <span class="comment"> * - fixed operator+=() to take a const ref argument, following spec.</span> -<a name="l00033"></a>00033 <span class="comment"> * - added "copy" constructor with length, and most compare operators.</span> -<a name="l00034"></a>00034 <span class="comment"> * - added swap(), clear(), size(), capacity(), operator+().</span> -<a name="l00035"></a>00035 <span class="comment"> */</span> -<a name="l00036"></a>00036 -<a name="l00037"></a>00037 <span class="preprocessor">#ifndef TIXML_USE_STL</span> -<a name="l00038"></a>00038 <span class="preprocessor"></span> -<a name="l00039"></a>00039 <span class="preprocessor">#ifndef TIXML_STRING_INCLUDED</span> -<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TIXML_STRING_INCLUDED</span> -<a name="l00041"></a>00041 <span class="preprocessor"></span> -<a name="l00042"></a>00042 <span class="preprocessor">#include <assert.h></span> -<a name="l00043"></a>00043 <span class="preprocessor">#include <string.h></span> -<a name="l00044"></a>00044 -<a name="l00045"></a>00045 <span class="comment">/* The support for explicit isn't that universal, and it isn't really</span> -<a name="l00046"></a>00046 <span class="comment"> required - it is used to check that the TiXmlString class isn't incorrectly</span> -<a name="l00047"></a>00047 <span class="comment"> used. Be nice to old compilers and macro it here:</span> -<a name="l00048"></a>00048 <span class="comment">*/</span> -<a name="l00049"></a>00049 <span class="preprocessor">#if defined(_MSC_VER) && (_MSC_VER >= 1200 )</span> -<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="comment">// Microsoft visual studio, version 6 and higher.</span> -<a name="l00051"></a>00051 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span> -<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__GNUC__) && (__GNUC__ >= 3 )</span> -<a name="l00053"></a>00053 <span class="preprocessor"></span> <span class="comment">// GCC version 3 and higher.s</span> -<a name="l00054"></a>00054 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span> -<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#else</span> -<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor"> #define TIXML_EXPLICIT</span> -<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#endif</span> -<a name="l00058"></a>00058 <span class="preprocessor"></span> -<a name="l00059"></a>00059 -<a name="l00060"></a>00060 <span class="comment">/*</span> -<a name="l00061"></a>00061 <span class="comment"> TiXmlString is an emulation of a subset of the std::string template.</span> -<a name="l00062"></a>00062 <span class="comment"> Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.</span> -<a name="l00063"></a>00063 <span class="comment"> Only the member functions relevant to the TinyXML project have been implemented.</span> -<a name="l00064"></a>00064 <span class="comment"> The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase</span> -<a name="l00065"></a>00065 <span class="comment"> a string and there's no more room, we allocate a buffer twice as big as we need.</span> -<a name="l00066"></a>00066 <span class="comment">*/</span> -<a name="l00067"></a>00067 <span class="keyword">class </span>TiXmlString -<a name="l00068"></a>00068 { -<a name="l00069"></a>00069 <span class="keyword">public</span> : -<a name="l00070"></a>00070 <span class="comment">// The size type used</span> -<a name="l00071"></a>00071 <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> size_type; -<a name="l00072"></a>00072 -<a name="l00073"></a>00073 <span class="comment">// Error value for find primitive</span> -<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keyword">const</span> size_type npos; <span class="comment">// = -1;</span> -<a name="l00075"></a>00075 +<a name="l00025"></a>00025 <span class="preprocessor">#ifndef TIXML_USE_STL</span> +<a name="l00026"></a>00026 <span class="preprocessor"></span> +<a name="l00027"></a>00027 <span class="preprocessor">#ifndef TIXML_STRING_INCLUDED</span> +<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define TIXML_STRING_INCLUDED</span> +<a name="l00029"></a>00029 <span class="preprocessor"></span> +<a name="l00030"></a>00030 <span class="preprocessor">#include <assert.h></span> +<a name="l00031"></a>00031 <span class="preprocessor">#include <string.h></span> +<a name="l00032"></a>00032 +<a name="l00033"></a>00033 <span class="comment">/* The support for explicit isn't that universal, and it isn't really</span> +<a name="l00034"></a>00034 <span class="comment"> required - it is used to check that the TiXmlString class isn't incorrectly</span> +<a name="l00035"></a>00035 <span class="comment"> used. Be nice to old compilers and macro it here:</span> +<a name="l00036"></a>00036 <span class="comment">*/</span> +<a name="l00037"></a>00037 <span class="preprocessor">#if defined(_MSC_VER) && (_MSC_VER >= 1200 )</span> +<a name="l00038"></a>00038 <span class="preprocessor"></span> <span class="comment">// Microsoft visual studio, version 6 and higher.</span> +<a name="l00039"></a>00039 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span> +<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__GNUC__) && (__GNUC__ >= 3 )</span> +<a name="l00041"></a>00041 <span class="preprocessor"></span> <span class="comment">// GCC version 3 and higher.s</span> +<a name="l00042"></a>00042 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span> +<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#else</span> +<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor"> #define TIXML_EXPLICIT</span> +<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#endif</span> +<a name="l00046"></a>00046 <span class="preprocessor"></span> +<a name="l00047"></a>00047 +<a name="l00048"></a>00048 <span class="comment">/*</span> +<a name="l00049"></a>00049 <span class="comment"> TiXmlString is an emulation of a subset of the std::string template.</span> +<a name="l00050"></a>00050 <span class="comment"> Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.</span> +<a name="l00051"></a>00051 <span class="comment"> Only the member functions relevant to the TinyXML project have been implemented.</span> +<a name="l00052"></a>00052 <span class="comment"> The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase</span> +<a name="l00053"></a>00053 <span class="comment"> a string and there's no more room, we allocate a buffer twice as big as we need.</span> +<a name="l00054"></a>00054 <span class="comment">*/</span> +<a name="l00055"></a>00055 <span class="keyword">class </span>TiXmlString +<a name="l00056"></a>00056 { +<a name="l00057"></a>00057 <span class="keyword">public</span> : +<a name="l00058"></a>00058 <span class="comment">// The size type used</span> +<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> size_type; +<a name="l00060"></a>00060 +<a name="l00061"></a>00061 <span class="comment">// Error value for find primitive</span> +<a name="l00062"></a>00062 <span class="keyword">static</span> <span class="keyword">const</span> size_type npos; <span class="comment">// = -1;</span> +<a name="l00063"></a>00063 +<a name="l00064"></a>00064 +<a name="l00065"></a>00065 <span class="comment">// TiXmlString empty constructor</span> +<a name="l00066"></a>00066 TiXmlString () : rep_(&nullrep_) +<a name="l00067"></a>00067 { +<a name="l00068"></a>00068 } +<a name="l00069"></a>00069 +<a name="l00070"></a>00070 <span class="comment">// TiXmlString copy constructor</span> +<a name="l00071"></a>00071 TiXmlString ( <span class="keyword">const</span> TiXmlString & copy) : rep_(0) +<a name="l00072"></a>00072 { +<a name="l00073"></a>00073 init(copy.length()); +<a name="l00074"></a>00074 memcpy(start(), copy.data(), length()); +<a name="l00075"></a>00075 } <a name="l00076"></a>00076 -<a name="l00077"></a>00077 <span class="comment">// TiXmlString empty constructor</span> -<a name="l00078"></a>00078 TiXmlString () : rep_(&nullrep_) +<a name="l00077"></a>00077 <span class="comment">// TiXmlString constructor, based on a string</span> +<a name="l00078"></a>00078 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * copy) : rep_(0) <a name="l00079"></a>00079 { -<a name="l00080"></a>00080 } -<a name="l00081"></a>00081 -<a name="l00082"></a>00082 <span class="comment">// TiXmlString copy constructor</span> -<a name="l00083"></a>00083 TiXmlString ( <span class="keyword">const</span> TiXmlString & copy) : rep_(0) -<a name="l00084"></a>00084 { -<a name="l00085"></a>00085 init(copy.length()); -<a name="l00086"></a>00086 memcpy(start(), copy.data(), length()); -<a name="l00087"></a>00087 } -<a name="l00088"></a>00088 -<a name="l00089"></a>00089 <span class="comment">// TiXmlString constructor, based on a string</span> -<a name="l00090"></a>00090 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * copy) : rep_(0) -<a name="l00091"></a>00091 { -<a name="l00092"></a>00092 init( static_cast<size_type>( strlen(copy) )); -<a name="l00093"></a>00093 memcpy(start(), copy, length()); -<a name="l00094"></a>00094 } -<a name="l00095"></a>00095 -<a name="l00096"></a>00096 <span class="comment">// TiXmlString constructor, based on a string</span> -<a name="l00097"></a>00097 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_type len) : rep_(0) +<a name="l00080"></a>00080 init( static_cast<size_type>( strlen(copy) )); +<a name="l00081"></a>00081 memcpy(start(), copy, length()); +<a name="l00082"></a>00082 } +<a name="l00083"></a>00083 +<a name="l00084"></a>00084 <span class="comment">// TiXmlString constructor, based on a string</span> +<a name="l00085"></a>00085 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_type len) : rep_(0) +<a name="l00086"></a>00086 { +<a name="l00087"></a>00087 init(len); +<a name="l00088"></a>00088 memcpy(start(), str, len); +<a name="l00089"></a>00089 } +<a name="l00090"></a>00090 +<a name="l00091"></a>00091 <span class="comment">// TiXmlString destructor</span> +<a name="l00092"></a>00092 ~TiXmlString () +<a name="l00093"></a>00093 { +<a name="l00094"></a>00094 quit(); +<a name="l00095"></a>00095 } +<a name="l00096"></a>00096 +<a name="l00097"></a>00097 TiXmlString& operator = (<span class="keyword">const</span> <span class="keywordtype">char</span> * copy) <a name="l00098"></a>00098 { -<a name="l00099"></a>00099 init(len); -<a name="l00100"></a>00100 memcpy(start(), str, len); -<a name="l00101"></a>00101 } -<a name="l00102"></a>00102 -<a name="l00103"></a>00103 <span class="comment">// TiXmlString destructor</span> -<a name="l00104"></a>00104 ~TiXmlString () -<a name="l00105"></a>00105 { -<a name="l00106"></a>00106 quit(); -<a name="l00107"></a>00107 } -<a name="l00108"></a>00108 -<a name="l00109"></a>00109 <span class="comment">// = operator</span> -<a name="l00110"></a>00110 TiXmlString& operator = (<span class="keyword">const</span> <span class="keywordtype">char</span> * copy) -<a name="l00111"></a>00111 { -<a name="l00112"></a>00112 <span class="keywordflow">return</span> assign( copy, (size_type)strlen(copy)); -<a name="l00113"></a>00113 } -<a name="l00114"></a>00114 -<a name="l00115"></a>00115 <span class="comment">// = operator</span> -<a name="l00116"></a>00116 TiXmlString& operator = (<span class="keyword">const</span> TiXmlString & copy) -<a name="l00117"></a>00117 { -<a name="l00118"></a>00118 <span class="keywordflow">return</span> assign(copy.start(), copy.length()); -<a name="l00119"></a>00119 } -<a name="l00120"></a>00120 -<a name="l00121"></a>00121 -<a name="l00122"></a>00122 <span class="comment">// += operator. Maps to append</span> -<a name="l00123"></a>00123 TiXmlString& operator += (<span class="keyword">const</span> <span class="keywordtype">char</span> * suffix) -<a name="l00124"></a>00124 { -<a name="l00125"></a>00125 <span class="keywordflow">return</span> append(suffix, static_cast<size_type>( strlen(suffix) )); -<a name="l00126"></a>00126 } -<a name="l00127"></a>00127 -<a name="l00128"></a>00128 <span class="comment">// += operator. Maps to append</span> -<a name="l00129"></a>00129 TiXmlString& operator += (<span class="keywordtype">char</span> single) -<a name="l00130"></a>00130 { -<a name="l00131"></a>00131 <span class="keywordflow">return</span> append(&single, 1); -<a name="l00132"></a>00132 } -<a name="l00133"></a>00133 -<a name="l00134"></a>00134 <span class="comment">// += operator. Maps to append</span> -<a name="l00135"></a>00135 TiXmlString& operator += (<span class="keyword">const</span> TiXmlString & suffix) -<a name="l00136"></a>00136 { -<a name="l00137"></a>00137 <span class="keywordflow">return</span> append(suffix.data(), suffix.length()); -<a name="l00138"></a>00138 } -<a name="l00139"></a>00139 -<a name="l00140"></a>00140 -<a name="l00141"></a>00141 <span class="comment">// Convert a TiXmlString into a null-terminated char *</span> -<a name="l00142"></a>00142 <span class="keyword">const</span> <span class="keywordtype">char</span> * c_str ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } -<a name="l00143"></a>00143 -<a name="l00144"></a>00144 <span class="comment">// Convert a TiXmlString into a char * (need not be null terminated).</span> -<a name="l00145"></a>00145 <span class="keyword">const</span> <span class="keywordtype">char</span> * data ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } -<a name="l00146"></a>00146 -<a name="l00147"></a>00147 <span class="comment">// Return the length of a TiXmlString</span> -<a name="l00148"></a>00148 size_type length ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size; } -<a name="l00149"></a>00149 -<a name="l00150"></a>00150 <span class="comment">// Alias for length()</span> -<a name="l00151"></a>00151 size_type size ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size; } +<a name="l00099"></a>00099 <span class="keywordflow">return</span> assign( copy, (size_type)strlen(copy)); +<a name="l00100"></a>00100 } +<a name="l00101"></a>00101 +<a name="l00102"></a>00102 TiXmlString& operator = (<span class="keyword">const</span> TiXmlString & copy) +<a name="l00103"></a>00103 { +<a name="l00104"></a>00104 <span class="keywordflow">return</span> assign(copy.start(), copy.length()); +<a name="l00105"></a>00105 } +<a name="l00106"></a>00106 +<a name="l00107"></a>00107 +<a name="l00108"></a>00108 <span class="comment">// += operator. Maps to append</span> +<a name="l00109"></a>00109 TiXmlString& operator += (<span class="keyword">const</span> <span class="keywordtype">char</span> * suffix) +<a name="l00110"></a>00110 { +<a name="l00111"></a>00111 <span class="keywordflow">return</span> append(suffix, static_cast<size_type>( strlen(suffix) )); +<a name="l00112"></a>00112 } +<a name="l00113"></a>00113 +<a name="l00114"></a>00114 <span class="comment">// += operator. Maps to append</span> +<a name="l00115"></a>00115 TiXmlString& operator += (<span class="keywordtype">char</span> single) +<a name="l00116"></a>00116 { +<a name="l00117"></a>00117 <span class="keywordflow">return</span> append(&single, 1); +<a name="l00118"></a>00118 } +<a name="l00119"></a>00119 +<a name="l00120"></a>00120 <span class="comment">// += operator. Maps to append</span> +<a name="l00121"></a>00121 TiXmlString& operator += (<span class="keyword">const</span> TiXmlString & suffix) +<a name="l00122"></a>00122 { +<a name="l00123"></a>00123 <span class="keywordflow">return</span> append(suffix.data(), suffix.length()); +<a name="l00124"></a>00124 } +<a name="l00125"></a>00125 +<a name="l00126"></a>00126 +<a name="l00127"></a>00127 <span class="comment">// Convert a TiXmlString into a null-terminated char *</span> +<a name="l00128"></a>00128 <span class="keyword">const</span> <span class="keywordtype">char</span> * c_str ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } +<a name="l00129"></a>00129 +<a name="l00130"></a>00130 <span class="comment">// Convert a TiXmlString into a char * (need not be null terminated).</span> +<a name="l00131"></a>00131 <span class="keyword">const</span> <span class="keywordtype">char</span> * data ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } +<a name="l00132"></a>00132 +<a name="l00133"></a>00133 <span class="comment">// Return the length of a TiXmlString</span> +<a name="l00134"></a>00134 size_type length ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size; } +<a name="l00135"></a>00135 +<a name="l00136"></a>00136 <span class="comment">// Alias for length()</span> +<a name="l00137"></a>00137 size_type size ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size; } +<a name="l00138"></a>00138 +<a name="l00139"></a>00139 <span class="comment">// Checks if a TiXmlString is empty</span> +<a name="l00140"></a>00140 <span class="keywordtype">bool</span> empty ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size == 0; } +<a name="l00141"></a>00141 +<a name="l00142"></a>00142 <span class="comment">// Return capacity of string</span> +<a name="l00143"></a>00143 size_type capacity ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->capacity; } +<a name="l00144"></a>00144 +<a name="l00145"></a>00145 +<a name="l00146"></a>00146 <span class="comment">// single char extraction</span> +<a name="l00147"></a>00147 <span class="keyword">const</span> <span class="keywordtype">char</span>& at (size_type index)<span class="keyword"> const</span> +<a name="l00148"></a>00148 <span class="keyword"> </span>{ +<a name="l00149"></a>00149 assert( index < length() ); +<a name="l00150"></a>00150 <span class="keywordflow">return</span> rep_->str[ index ]; +<a name="l00151"></a>00151 } <a name="l00152"></a>00152 -<a name="l00153"></a>00153 <span class="comment">// Checks if a TiXmlString is empty</span> -<a name="l00154"></a>00154 <span class="keywordtype">bool</span> empty ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->size == 0; } -<a name="l00155"></a>00155 -<a name="l00156"></a>00156 <span class="comment">// Return capacity of string</span> -<a name="l00157"></a>00157 size_type capacity ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->capacity; } -<a name="l00158"></a>00158 +<a name="l00153"></a>00153 <span class="comment">// [] operator</span> +<a name="l00154"></a>00154 <span class="keywordtype">char</span>& operator [] (size_type index)<span class="keyword"> const</span> +<a name="l00155"></a>00155 <span class="keyword"> </span>{ +<a name="l00156"></a>00156 assert( index < length() ); +<a name="l00157"></a>00157 <span class="keywordflow">return</span> rep_->str[ index ]; +<a name="l00158"></a>00158 } <a name="l00159"></a>00159 -<a name="l00160"></a>00160 <span class="comment">// single char extraction</span> -<a name="l00161"></a>00161 <span class="keyword">const</span> <span class="keywordtype">char</span>& at (size_type index)<span class="keyword"> const</span> +<a name="l00160"></a>00160 <span class="comment">// find a char in a string. Return TiXmlString::npos if not found</span> +<a name="l00161"></a>00161 size_type find (<span class="keywordtype">char</span> lookup)<span class="keyword"> const</span> <a name="l00162"></a>00162 <span class="keyword"> </span>{ -<a name="l00163"></a>00163 assert( index < length() ); -<a name="l00164"></a>00164 <span class="keywordflow">return</span> rep_->str[ index ]; -<a name="l00165"></a>00165 } -<a name="l00166"></a>00166 -<a name="l00167"></a>00167 <span class="comment">// [] operator</span> -<a name="l00168"></a>00168 <span class="keywordtype">char</span>& operator [] (size_type index)<span class="keyword"> const</span> -<a name="l00169"></a>00169 <span class="keyword"> </span>{ -<a name="l00170"></a>00170 assert( index < length() ); -<a name="l00171"></a>00171 <span class="keywordflow">return</span> rep_->str[ index ]; -<a name="l00172"></a>00172 } -<a name="l00173"></a>00173 -<a name="l00174"></a>00174 <span class="comment">// find a char in a string. Return TiXmlString::npos if not found</span> -<a name="l00175"></a>00175 size_type find (<span class="keywordtype">char</span> lookup)<span class="keyword"> const</span> -<a name="l00176"></a>00176 <span class="keyword"> </span>{ -<a name="l00177"></a>00177 <span class="keywordflow">return</span> find(lookup, 0); -<a name="l00178"></a>00178 } -<a name="l00179"></a>00179 -<a name="l00180"></a>00180 <span class="comment">// find a char in a string from an offset. Return TiXmlString::npos if not found</span> -<a name="l00181"></a>00181 size_type find (<span class="keywordtype">char</span> tofind, size_type offset)<span class="keyword"> const</span> -<a name="l00182"></a>00182 <span class="keyword"> </span>{ -<a name="l00183"></a>00183 <span class="keywordflow">if</span> (offset >= length()) <span class="keywordflow">return</span> npos; -<a name="l00184"></a>00184 -<a name="l00185"></a>00185 <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span>* p = c_str() + offset; *p != <span class="charliteral">'\0'</span>; ++p) -<a name="l00186"></a>00186 { -<a name="l00187"></a>00187 <span class="keywordflow">if</span> (*p == tofind) <span class="keywordflow">return</span> <span class="keyword">static_cast<</span> size_type <span class="keyword">></span>( p - c_str() ); -<a name="l00188"></a>00188 } -<a name="l00189"></a>00189 <span class="keywordflow">return</span> npos; -<a name="l00190"></a>00190 } -<a name="l00191"></a>00191 -<a name="l00192"></a>00192 <span class="keywordtype">void</span> clear () -<a name="l00193"></a>00193 { -<a name="l00194"></a>00194 <span class="comment">//Lee:</span> -<a name="l00195"></a>00195 <span class="comment">//The original was just too strange, though correct:</span> -<a name="l00196"></a>00196 <span class="comment">// TiXmlString().swap(*this);</span> -<a name="l00197"></a>00197 <span class="comment">//Instead use the quit & re-init:</span> -<a name="l00198"></a>00198 quit(); -<a name="l00199"></a>00199 init(0,0); -<a name="l00200"></a>00200 } -<a name="l00201"></a>00201 -<a name="l00202"></a>00202 <span class="comment">/* Function to reserve a big amount of data when we know we'll need it. Be aware that this</span> -<a name="l00203"></a>00203 <span class="comment"> function DOES NOT clear the content of the TiXmlString if any exists.</span> -<a name="l00204"></a>00204 <span class="comment"> */</span> -<a name="l00205"></a>00205 <span class="keywordtype">void</span> reserve (size_type cap); -<a name="l00206"></a>00206 -<a name="l00207"></a>00207 TiXmlString& assign (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len); -<a name="l00208"></a>00208 -<a name="l00209"></a>00209 TiXmlString& append (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len); +<a name="l00163"></a>00163 <span class="keywordflow">return</span> find(lookup, 0); +<a name="l00164"></a>00164 } +<a name="l00165"></a>00165 +<a name="l00166"></a>00166 <span class="comment">// find a char in a string from an offset. Return TiXmlString::npos if not found</span> +<a name="l00167"></a>00167 size_type find (<span class="keywordtype">char</span> tofind, size_type offset)<span class="keyword"> const</span> +<a name="l00168"></a>00168 <span class="keyword"> </span>{ +<a name="l00169"></a>00169 <span class="keywordflow">if</span> (offset >= length()) <span class="keywordflow">return</span> npos; +<a name="l00170"></a>00170 +<a name="l00171"></a>00171 <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span>* p = c_str() + offset; *p != <span class="charliteral">'\0'</span>; ++p) +<a name="l00172"></a>00172 { +<a name="l00173"></a>00173 <span class="keywordflow">if</span> (*p == tofind) <span class="keywordflow">return</span> <span class="keyword">static_cast<</span> size_type <span class="keyword">></span>( p - c_str() ); +<a name="l00174"></a>00174 } +<a name="l00175"></a>00175 <span class="keywordflow">return</span> npos; +<a name="l00176"></a>00176 } +<a name="l00177"></a>00177 +<a name="l00178"></a>00178 <span class="keywordtype">void</span> clear () +<a name="l00179"></a>00179 { +<a name="l00180"></a>00180 <span class="comment">//Lee:</span> +<a name="l00181"></a>00181 <span class="comment">//The original was just too strange, though correct:</span> +<a name="l00182"></a>00182 <span class="comment">// TiXmlString().swap(*this);</span> +<a name="l00183"></a>00183 <span class="comment">//Instead use the quit & re-init:</span> +<a name="l00184"></a>00184 quit(); +<a name="l00185"></a>00185 init(0,0); +<a name="l00186"></a>00186 } +<a name="l00187"></a>00187 +<a name="l00188"></a>00188 <span class="comment">/* Function to reserve a big amount of data when we know we'll need it. Be aware that this</span> +<a name="l00189"></a>00189 <span class="comment"> function DOES NOT clear the content of the TiXmlString if any exists.</span> +<a name="l00190"></a>00190 <span class="comment"> */</span> +<a name="l00191"></a>00191 <span class="keywordtype">void</span> reserve (size_type cap); +<a name="l00192"></a>00192 +<a name="l00193"></a>00193 TiXmlString& assign (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len); +<a name="l00194"></a>00194 +<a name="l00195"></a>00195 TiXmlString& append (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len); +<a name="l00196"></a>00196 +<a name="l00197"></a>00197 <span class="keywordtype">void</span> swap (TiXmlString& other) +<a name="l00198"></a>00198 { +<a name="l00199"></a>00199 Rep* r = rep_; +<a name="l00200"></a>00200 rep_ = other.rep_; +<a name="l00201"></a>00201 other.rep_ = r; +<a name="l00202"></a>00202 } +<a name="l00203"></a>00203 +<a name="l00204"></a>00204 <span class="keyword">private</span>: +<a name="l00205"></a>00205 +<a name="l00206"></a>00206 <span class="keywordtype">void</span> init(size_type sz) { init(sz, sz); } +<a name="l00207"></a>00207 <span class="keywordtype">void</span> set_size(size_type sz) { rep_->str[ rep_->size = sz ] = <span class="charliteral">'\0'</span>; } +<a name="l00208"></a>00208 <span class="keywordtype">char</span>* start()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } +<a name="l00209"></a>00209 <span class="keywordtype">char</span>* finish()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str + rep_->size; } <a name="l00210"></a>00210 -<a name="l00211"></a>00211 <span class="keywordtype">void</span> swap (TiXmlString& other) +<a name="l00211"></a>00211 <span class="keyword">struct </span>Rep <a name="l00212"></a>00212 { -<a name="l00213"></a>00213 Rep* r = rep_; -<a name="l00214"></a>00214 rep_ = other.rep_; -<a name="l00215"></a>00215 other.rep_ = r; -<a name="l00216"></a>00216 } -<a name="l00217"></a>00217 -<a name="l00218"></a>00218 <span class="keyword">private</span>: -<a name="l00219"></a>00219 -<a name="l00220"></a>00220 <span class="keywordtype">void</span> init(size_type sz) { init(sz, sz); } -<a name="l00221"></a>00221 <span class="keywordtype">void</span> set_size(size_type sz) { rep_->str[ rep_->size = sz ] = <span class="charliteral">'\0'</span>; } -<a name="l00222"></a>00222 <span class="keywordtype">char</span>* start()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str; } -<a name="l00223"></a>00223 <span class="keywordtype">char</span>* finish()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_->str + rep_->size; } -<a name="l00224"></a>00224 -<a name="l00225"></a>00225 <span class="keyword">struct </span>Rep -<a name="l00226"></a>00226 { -<a name="l00227"></a>00227 size_type size, capacity; -<a name="l00228"></a>00228 <span class="keywordtype">char</span> str[1]; -<a name="l00229"></a>00229 }; -<a name="l00230"></a>00230 -<a name="l00231"></a>00231 <span class="keywordtype">void</span> init(size_type sz, size_type cap) -<a name="l00232"></a>00232 { -<a name="l00233"></a>00233 <span class="keywordflow">if</span> (cap) +<a name="l00213"></a>00213 size_type size, capacity; +<a name="l00214"></a>00214 <span class="keywordtype">char</span> str[1]; +<a name="l00215"></a>00215 }; +<a name="l00216"></a>00216 +<a name="l00217"></a>00217 <span class="keywordtype">void</span> init(size_type sz, size_type cap) +<a name="l00218"></a>00218 { +<a name="l00219"></a>00219 <span class="keywordflow">if</span> (cap) +<a name="l00220"></a>00220 { +<a name="l00221"></a>00221 <span class="comment">// Lee: the original form:</span> +<a name="l00222"></a>00222 <span class="comment">// rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));</span> +<a name="l00223"></a>00223 <span class="comment">// doesn't work in some cases of new being overloaded. Switching</span> +<a name="l00224"></a>00224 <span class="comment">// to the normal allocation, although use an 'int' for systems</span> +<a name="l00225"></a>00225 <span class="comment">// that are overly picky about structure alignment.</span> +<a name="l00226"></a>00226 <span class="keyword">const</span> size_type bytesNeeded = <span class="keyword">sizeof</span>(Rep) + cap; +<a name="l00227"></a>00227 <span class="keyword">const</span> size_type intsNeeded = ( bytesNeeded + <span class="keyword">sizeof</span>(int) - 1 ) / <span class="keyword">sizeof</span>( int ); +<a name="l00228"></a>00228 rep_ = <span class="keyword">reinterpret_cast<</span>Rep*<span class="keyword">></span>( <span class="keyword">new</span> <span class="keywordtype">int</span>[ intsNeeded ] ); +<a name="l00229"></a>00229 +<a name="l00230"></a>00230 rep_->str[ rep_->size = sz ] = <span class="charliteral">'\0'</span>; +<a name="l00231"></a>00231 rep_->capacity = cap; +<a name="l00232"></a>00232 } +<a name="l00233"></a>00233 <span class="keywordflow">else</span> <a name="l00234"></a>00234 { -<a name="l00235"></a>00235 <span class="comment">// Lee: the original form:</span> -<a name="l00236"></a>00236 <span class="comment">// rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));</span> -<a name="l00237"></a>00237 <span class="comment">// doesn't work in some cases of new being overloaded. Switching</span> -<a name="l00238"></a>00238 <span class="comment">// to the normal allocation, although use an 'int' for systems</span> -<a name="l00239"></a>00239 <span class="comment">// that are overly picky about structure alignment.</span> -<a name="l00240"></a>00240 <span class="keyword">const</span> size_type bytesNeeded = <span class="keyword">sizeof</span>(Rep) + cap; -<a name="l00241"></a>00241 <span class="keyword">const</span> size_type intsNeeded = ( bytesNeeded + <span class="keyword">sizeof</span>(int) - 1 ) / <span class="keyword">sizeof</span>( int ); -<a name="l00242"></a>00242 rep_ = <span class="keyword">reinterpret_cast<</span>Rep*<span class="keyword">></span>( <span class="keyword">new</span> <span class="keywordtype">int</span>[ intsNeeded ] ); -<a name="l00243"></a>00243 -<a name="l00244"></a>00244 rep_->str[ rep_->size = sz ] = <span class="charliteral">'\0'</span>; -<a name="l00245"></a>00245 rep_->capacity = cap; +<a name="l00235"></a>00235 rep_ = &nullrep_; +<a name="l00236"></a>00236 } +<a name="l00237"></a>00237 } +<a name="l00238"></a>00238 +<a name="l00239"></a>00239 <span class="keywordtype">void</span> quit() +<a name="l00240"></a>00240 { +<a name="l00241"></a>00241 <span class="keywordflow">if</span> (rep_ != &nullrep_) +<a name="l00242"></a>00242 { +<a name="l00243"></a>00243 <span class="comment">// The rep_ is really an array of ints. (see the allocator, above).</span> +<a name="l00244"></a>00244 <span class="comment">// Cast it back before delete, so the compiler won't incorrectly call destructors.</span> +<a name="l00245"></a>00245 <span class="keyword">delete</span> [] ( <span class="keyword">reinterpret_cast<</span><span class="keywordtype">int</span>*<span class="keyword">></span>( rep_ ) ); <a name="l00246"></a>00246 } -<a name="l00247"></a>00247 <span class="keywordflow">else</span> -<a name="l00248"></a>00248 { -<a name="l00249"></a>00249 rep_ = &nullrep_; -<a name="l00250"></a>00250 } -<a name="l00251"></a>00251 } -<a name="l00252"></a>00252 -<a name="l00253"></a>00253 <span class="keywordtype">void</span> quit() -<a name="l00254"></a>00254 { -<a name="l00255"></a>00255 <span class="keywordflow">if</span> (rep_ != &nullrep_) -<a name="l00256"></a>00256 { -<a name="l00257"></a>00257 <span class="comment">// The rep_ is really an array of ints. (see the allocator, above).</span> -<a name="l00258"></a>00258 <span class="comment">// Cast it back before delete, so the compiler won't incorrectly call destructors.</span> -<a name="l00259"></a>00259 <span class="keyword">delete</span> [] ( <span class="keyword">reinterpret_cast<</span><span class="keywordtype">int</span>*<span class="keyword">></span>( rep_ ) ); -<a name="l00260"></a>00260 } -<a name="l00261"></a>00261 } -<a name="l00262"></a>00262 -<a name="l00263"></a>00263 Rep * rep_; -<a name="l00264"></a>00264 <span class="keyword">static</span> Rep nullrep_; -<a name="l00265"></a>00265 -<a name="l00266"></a>00266 } ; -<a name="l00267"></a>00267 -<a name="l00268"></a>00268 -<a name="l00269"></a>00269 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) -<a name="l00270"></a>00270 { -<a name="l00271"></a>00271 <span class="keywordflow">return</span> ( a.length() == b.length() ) <span class="comment">// optimization on some platforms</span> -<a name="l00272"></a>00272 && ( strcmp(a.c_str(), b.c_str()) == 0 ); <span class="comment">// actual compare</span> -<a name="l00273"></a>00273 } -<a name="l00274"></a>00274 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator < (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) -<a name="l00275"></a>00275 { -<a name="l00276"></a>00276 <span class="keywordflow">return</span> strcmp(a.c_str(), b.c_str()) < 0; -<a name="l00277"></a>00277 } +<a name="l00247"></a>00247 } +<a name="l00248"></a>00248 +<a name="l00249"></a>00249 Rep * rep_; +<a name="l00250"></a>00250 <span class="keyword">static</span> Rep nullrep_; +<a name="l00251"></a>00251 +<a name="l00252"></a>00252 } ; +<a name="l00253"></a>00253 +<a name="l00254"></a>00254 +<a name="l00255"></a>00255 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) +<a name="l00256"></a>00256 { +<a name="l00257"></a>00257 <span class="keywordflow">return</span> ( a.length() == b.length() ) <span class="comment">// optimization on some platforms</span> +<a name="l00258"></a>00258 && ( strcmp(a.c_str(), b.c_str()) == 0 ); <span class="comment">// actual compare</span> +<a name="l00259"></a>00259 } +<a name="l00260"></a>00260 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator < (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) +<a name="l00261"></a>00261 { +<a name="l00262"></a>00262 <span class="keywordflow">return</span> strcmp(a.c_str(), b.c_str()) < 0; +<a name="l00263"></a>00263 } +<a name="l00264"></a>00264 +<a name="l00265"></a>00265 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(a == b); } +<a name="l00266"></a>00266 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator > (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> b < a; } +<a name="l00267"></a>00267 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator <= (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(b < a); } +<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator >= (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(a < b); } +<a name="l00269"></a>00269 +<a name="l00270"></a>00270 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> strcmp(a.c_str(), b) == 0; } +<a name="l00271"></a>00271 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> b == a; } +<a name="l00272"></a>00272 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> !(a == b); } +<a name="l00273"></a>00273 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(b == a); } +<a name="l00274"></a>00274 +<a name="l00275"></a>00275 TiXmlString operator + (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b); +<a name="l00276"></a>00276 TiXmlString operator + (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b); +<a name="l00277"></a>00277 TiXmlString operator + (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b); <a name="l00278"></a>00278 -<a name="l00279"></a>00279 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(a == b); } -<a name="l00280"></a>00280 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator > (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> b < a; } -<a name="l00281"></a>00281 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator <= (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(b < a); } -<a name="l00282"></a>00282 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator >= (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(a < b); } -<a name="l00283"></a>00283 -<a name="l00284"></a>00284 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> strcmp(a.c_str(), b) == 0; } -<a name="l00285"></a>00285 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> b == a; } -<a name="l00286"></a>00286 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> !(a == b); } -<a name="l00287"></a>00287 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b) { <span class="keywordflow">return</span> !(b == a); } -<a name="l00288"></a>00288 -<a name="l00289"></a>00289 TiXmlString operator + (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> TiXmlString & b); -<a name="l00290"></a>00290 TiXmlString operator + (<span class="keyword">const</span> TiXmlString & a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b); -<a name="l00291"></a>00291 TiXmlString operator + (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString & b); -<a name="l00292"></a>00292 -<a name="l00293"></a>00293 -<a name="l00294"></a>00294 <span class="comment">/*</span> -<a name="l00295"></a>00295 <span class="comment"> TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.</span> -<a name="l00296"></a>00296 <span class="comment"> Only the operators that we need for TinyXML have been developped.</span> -<a name="l00297"></a>00297 <span class="comment">*/</span> -<a name="l00298"></a>00298 <span class="keyword">class </span>TiXmlOutStream : <span class="keyword">public</span> TiXmlString -<a name="l00299"></a>00299 { -<a name="l00300"></a>00300 <span class="keyword">public</span> : +<a name="l00279"></a>00279 +<a name="l00280"></a>00280 <span class="comment">/*</span> +<a name="l00281"></a>00281 <span class="comment"> TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.</span> +<a name="l00282"></a>00282 <span class="comment"> Only the operators that we need for TinyXML have been developped.</span> +<a name="l00283"></a>00283 <span class="comment">*/</span> +<a name="l00284"></a>00284 <span class="keyword">class </span>TiXmlOutStream : <span class="keyword">public</span> TiXmlString +<a name="l00285"></a>00285 { +<a name="l00286"></a>00286 <span class="keyword">public</span> : +<a name="l00287"></a>00287 +<a name="l00288"></a>00288 <span class="comment">// TiXmlOutStream << operator.</span> +<a name="l00289"></a>00289 TiXmlOutStream & operator << (<span class="keyword">const</span> TiXmlString & in) +<a name="l00290"></a>00290 { +<a name="l00291"></a>00291 *<span class="keyword">this</span> += in; +<a name="l00292"></a>00292 <span class="keywordflow">return</span> *<span class="keyword">this</span>; +<a name="l00293"></a>00293 } +<a name="l00294"></a>00294 +<a name="l00295"></a>00295 <span class="comment">// TiXmlOutStream << operator.</span> +<a name="l00296"></a>00296 TiXmlOutStream & operator << (<span class="keyword">const</span> <span class="keywordtype">char</span> * in) +<a name="l00297"></a>00297 { +<a name="l00298"></a>00298 *<span class="keyword">this</span> += in; +<a name="l00299"></a>00299 <span class="keywordflow">return</span> *<span class="keyword">this</span>; +<a name="l00300"></a>00300 } <a name="l00301"></a>00301 -<a name="l00302"></a>00302 <span class="comment">// TiXmlOutStream << operator.</span> -<a name="l00303"></a>00303 TiXmlOutStream & operator << (<span class="keyword">const</span> TiXmlString & in) -<a name="l00304"></a>00304 { -<a name="l00305"></a>00305 *<span class="keyword">this</span> += in; -<a name="l00306"></a>00306 <span class="keywordflow">return</span> *<span class="keyword">this</span>; -<a name="l00307"></a>00307 } -<a name="l00308"></a>00308 -<a name="l00309"></a>00309 <span class="comment">// TiXmlOutStream << operator.</span> -<a name="l00310"></a>00310 TiXmlOutStream & operator << (<span class="keyword">const</span> <span class="keywordtype">char</span> * in) -<a name="l00311"></a>00311 { -<a name="l00312"></a>00312 *<span class="keyword">this</span> += in; -<a name="l00313"></a>00313 <span class="keywordflow">return</span> *<span class="keyword">this</span>; -<a name="l00314"></a>00314 } -<a name="l00315"></a>00315 -<a name="l00316"></a>00316 } ; -<a name="l00317"></a>00317 -<a name="l00318"></a>00318 <span class="preprocessor">#endif // TIXML_STRING_INCLUDED</span> -<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="preprocessor">#endif // TIXML_USE_STL</span> +<a name="l00302"></a>00302 } ; +<a name="l00303"></a>00303 +<a name="l00304"></a>00304 <span class="preprocessor">#endif // TIXML_STRING_INCLUDED</span> +<a name="l00305"></a>00305 <span class="preprocessor"></span><span class="preprocessor">#endif // TIXML_USE_STL</span> </pre></div></div> <hr size="1"/><address style="text-align: right;"><small>Generated by <a href="http://www.doxygen.org/index.html"> diff --git a/shared/tinyxml/docs/tinyxml_8h_source.html b/shared/tinyxml/docs/tinyxml_8h_source.html index e991e035..566e3960 100644 --- a/shared/tinyxml/docs/tinyxml_8h_source.html +++ b/shared/tinyxml/docs/tinyxml_8h_source.html @@ -24,7 +24,7 @@ </div> <h1>tinyxml.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> <a name="l00002"></a>00002 <span class="comment">www.sourceforge.net/projects/tinyxml</span> -<a name="l00003"></a>00003 <span class="comment">Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)</span> +<a name="l00003"></a>00003 <span class="comment">Original code by Lee Thomason (www.grinninglizard.com)</span> <a name="l00004"></a>00004 <span class="comment"></span> <a name="l00005"></a>00005 <span class="comment">This software is provided 'as-is', without any express or implied</span> <a name="l00006"></a>00006 <span class="comment">warranty. In no event will the authors be held liable for any</span> @@ -115,7 +115,7 @@ <a name="l00091"></a>00091 <a name="l00092"></a>00092 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_MAJOR_VERSION = 2; <a name="l00093"></a>00093 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_MINOR_VERSION = 6; -<a name="l00094"></a>00094 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_PATCH_VERSION = 1; +<a name="l00094"></a>00094 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_PATCH_VERSION = 2; <a name="l00095"></a>00095 <a name="l00096"></a>00096 <span class="comment">/* Internal structure for tracking location of items </span> <a name="l00097"></a>00097 <span class="comment"> in the XML file.</span> @@ -144,7 +144,7 @@ <a name="l00144"></a><a class="code" href="classTiXmlVisitor.html#afad71c71ce6473fb9b4b64cd92de4a19">00144</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#afad71c71ce6473fb9b4b64cd92de4a19" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& <span class="comment">/*declaration*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; } <a name="l00146"></a><a class="code" href="classTiXmlVisitor.html#a399b8ebca5cd14664974a32d2ce029e5">00146</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a399b8ebca5cd14664974a32d2ce029e5" title="Visit a text node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& <span class="comment">/*text*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; } <a name="l00148"></a><a class="code" href="classTiXmlVisitor.html#a53a60e7a528627b31af3161972cc7fa2">00148</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a53a60e7a528627b31af3161972cc7fa2" title="Visit a comment node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& <span class="comment">/*comment*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; } -<a name="l00150"></a><a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">00150</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28" title="Visit an unknow node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& <span class="comment">/*unknown*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; } +<a name="l00150"></a><a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">00150</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28" title="Visit an unknown node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& <span class="comment">/*unknown*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; } <a name="l00151"></a>00151 }; <a name="l00152"></a>00152 <a name="l00153"></a>00153 <span class="comment">// Only used by Attribute::Query functions</span> @@ -715,7 +715,7 @@ <a name="l00950"></a>00950 <span class="preprocessor"></span> <a name="l00951"></a>00951 <a class="code" href="classTiXmlElement.html#a01bc3ab372d35da08efcbbe65ad90c60" title="Construct an element.">TiXmlElement</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& ); <a name="l00952"></a>00952 -<a name="l00953"></a>00953 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& base ); +<a name="l00953"></a>00953 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& base ); <a name="l00954"></a>00954 <a name="l00955"></a>00955 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>(); <a name="l00956"></a>00956 @@ -726,477 +726,478 @@ <a name="l00976"></a>00976 <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>; <a name="l00977"></a>00977 <a name="l00985"></a>00985 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>; -<a name="l00987"></a>00987 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>; -<a name="l00989"></a><a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">00989</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be" title="QueryFloatAttribute examines the attribute - see QueryIntAttribute().">QueryFloatAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">float</span>* _value )<span class="keyword"> const </span>{ -<a name="l00990"></a>00990 <span class="keywordtype">double</span> d; -<a name="l00991"></a>00991 <span class="keywordtype">int</span> result = <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( name, &d ); -<a name="l00992"></a>00992 <span class="keywordflow">if</span> ( result == TIXML_SUCCESS ) { -<a name="l00993"></a>00993 *_value = (float)d; -<a name="l00994"></a>00994 } -<a name="l00995"></a>00995 <span class="keywordflow">return</span> result; -<a name="l00996"></a>00996 } -<a name="l00997"></a>00997 -<a name="l00998"></a>00998 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01000"></a><a class="code" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">01000</a> <span class="preprocessor"> int QueryStringAttribute( const char* name, std::string* _value ) const {</span> -<a name="l01001"></a>01001 <span class="preprocessor"></span> <span class="keyword">const</span> <span class="keywordtype">char</span>* cstr = <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( name ); -<a name="l01002"></a>01002 <span class="keywordflow">if</span> ( cstr ) { -<a name="l01003"></a>01003 *_value = std::string( cstr ); -<a name="l01004"></a>01004 <span class="keywordflow">return</span> TIXML_SUCCESS; -<a name="l01005"></a>01005 } -<a name="l01006"></a>01006 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; -<a name="l01007"></a>01007 } -<a name="l01008"></a>01008 -<a name="l01017"></a><a class="code" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">01017</a> <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string& name, T* outValue )<span class="keyword"> const</span> -<a name="l01018"></a>01018 <span class="keyword"> </span>{ -<a name="l01019"></a>01019 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name ); -<a name="l01020"></a>01020 <span class="keywordflow">if</span> ( !node ) -<a name="l01021"></a>01021 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; -<a name="l01022"></a>01022 -<a name="l01023"></a>01023 std::stringstream sstream( node-><a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>() ); -<a name="l01024"></a>01024 sstream >> *outValue; -<a name="l01025"></a>01025 <span class="keywordflow">if</span> ( !sstream.fail() ) -<a name="l01026"></a>01026 <span class="keywordflow">return</span> TIXML_SUCCESS; -<a name="l01027"></a>01027 <span class="keywordflow">return</span> TIXML_WRONG_TYPE; -<a name="l01028"></a>01028 } +<a name="l00987"></a>00987 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d" title="QueryUnsignedAttribute examines the attribute - see QueryIntAttribute().">QueryUnsignedAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">unsigned</span>* _value ) <span class="keyword">const</span>; +<a name="l00992"></a>00992 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff" title="QueryBoolAttribute examines the attribute - see QueryIntAttribute().">QueryBoolAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">bool</span>* _value ) <span class="keyword">const</span>; +<a name="l00994"></a>00994 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>; +<a name="l00996"></a><a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">00996</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be" title="QueryFloatAttribute examines the attribute - see QueryIntAttribute().">QueryFloatAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">float</span>* _value )<span class="keyword"> const </span>{ +<a name="l00997"></a>00997 <span class="keywordtype">double</span> d; +<a name="l00998"></a>00998 <span class="keywordtype">int</span> result = <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( name, &d ); +<a name="l00999"></a>00999 <span class="keywordflow">if</span> ( result == TIXML_SUCCESS ) { +<a name="l01000"></a>01000 *_value = (float)d; +<a name="l01001"></a>01001 } +<a name="l01002"></a>01002 <span class="keywordflow">return</span> result; +<a name="l01003"></a>01003 } +<a name="l01004"></a>01004 +<a name="l01005"></a>01005 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01007"></a><a class="code" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">01007</a> <span class="preprocessor"> int QueryStringAttribute( const char* name, std::string* _value ) const {</span> +<a name="l01008"></a>01008 <span class="preprocessor"></span> <span class="keyword">const</span> <span class="keywordtype">char</span>* cstr = <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( name ); +<a name="l01009"></a>01009 <span class="keywordflow">if</span> ( cstr ) { +<a name="l01010"></a>01010 *_value = std::string( cstr ); +<a name="l01011"></a>01011 <span class="keywordflow">return</span> TIXML_SUCCESS; +<a name="l01012"></a>01012 } +<a name="l01013"></a>01013 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; +<a name="l01014"></a>01014 } +<a name="l01015"></a>01015 +<a name="l01024"></a><a class="code" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">01024</a> <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string& name, T* outValue )<span class="keyword"> const</span> +<a name="l01025"></a>01025 <span class="keyword"> </span>{ +<a name="l01026"></a>01026 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name ); +<a name="l01027"></a>01027 <span class="keywordflow">if</span> ( !node ) +<a name="l01028"></a>01028 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; <a name="l01029"></a>01029 -<a name="l01030"></a>01030 <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string& name, std::string* outValue )<span class="keyword"> const</span> -<a name="l01031"></a>01031 <span class="keyword"> </span>{ -<a name="l01032"></a>01032 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name ); -<a name="l01033"></a>01033 <span class="keywordflow">if</span> ( !node ) -<a name="l01034"></a>01034 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; -<a name="l01035"></a>01035 *outValue = node-><a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>(); -<a name="l01036"></a>01036 <span class="keywordflow">return</span> TIXML_SUCCESS; -<a name="l01037"></a>01037 } -<a name="l01038"></a>01038 <span class="preprocessor"> #endif</span> -<a name="l01039"></a>01039 <span class="preprocessor"></span> -<a name="l01043"></a>01043 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span> * _value ); -<a name="l01044"></a>01044 -<a name="l01045"></a>01045 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01046"></a>01046 <span class="preprocessor"></span> <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name ) <span class="keyword">const</span>; -<a name="l01047"></a>01047 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span>* i ) <span class="keyword">const</span>; -<a name="l01048"></a>01048 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>; -<a name="l01049"></a>01049 <span class="keywordtype">int</span> QueryIntAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>; -<a name="l01050"></a>01050 <span class="keywordtype">int</span> QueryDoubleAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>; +<a name="l01030"></a>01030 std::stringstream sstream( node-><a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>() ); +<a name="l01031"></a>01031 sstream >> *outValue; +<a name="l01032"></a>01032 <span class="keywordflow">if</span> ( !sstream.fail() ) +<a name="l01033"></a>01033 <span class="keywordflow">return</span> TIXML_SUCCESS; +<a name="l01034"></a>01034 <span class="keywordflow">return</span> TIXML_WRONG_TYPE; +<a name="l01035"></a>01035 } +<a name="l01036"></a>01036 +<a name="l01037"></a>01037 <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string& name, std::string* outValue )<span class="keyword"> const</span> +<a name="l01038"></a>01038 <span class="keyword"> </span>{ +<a name="l01039"></a>01039 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name ); +<a name="l01040"></a>01040 <span class="keywordflow">if</span> ( !node ) +<a name="l01041"></a>01041 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE; +<a name="l01042"></a>01042 *outValue = node-><a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>(); +<a name="l01043"></a>01043 <span class="keywordflow">return</span> TIXML_SUCCESS; +<a name="l01044"></a>01044 } +<a name="l01045"></a>01045 <span class="preprocessor"> #endif</span> +<a name="l01046"></a>01046 <span class="preprocessor"></span> +<a name="l01050"></a>01050 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span> * _value ); <a name="l01051"></a>01051 -<a name="l01053"></a>01053 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string& name, <span class="keyword">const</span> std::string& _value ); -<a name="l01055"></a>01055 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span> _value ); -<a name="l01057"></a>01057 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span> value ); -<a name="l01058"></a>01058 <span class="preprocessor"> #endif</span> -<a name="l01059"></a>01059 <span class="preprocessor"></span> -<a name="l01063"></a>01063 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">int</span> value ); -<a name="l01064"></a>01064 -<a name="l01068"></a>01068 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">double</span> value ); -<a name="l01069"></a>01069 -<a name="l01072"></a>01072 <span class="keywordtype">void</span> RemoveAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name ); -<a name="l01073"></a>01073 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01074"></a><a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">01074</a> <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a>( <span class="keyword">const</span> std::string& name ) { <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a> (name.c_str ()); } -<a name="l01075"></a>01075 <span class="preprocessor"> #endif</span> -<a name="l01076"></a>01076 <span class="preprocessor"></span> -<a name="l01077"></a><a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592">01077</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592" title="Access the first attribute in this element.">FirstAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.First(); } -<a name="l01078"></a>01078 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* FirstAttribute() { <span class="keywordflow">return</span> attributeSet.First(); } -<a name="l01079"></a><a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381">01079</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381" title="Access the last attribute in this element.">LastAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.Last(); } -<a name="l01080"></a>01080 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* LastAttribute() { <span class="keywordflow">return</span> attributeSet.Last(); } -<a name="l01081"></a>01081 -<a name="l01114"></a>01114 <span class="keyword">const</span> <span class="keywordtype">char</span>* GetText() <span class="keyword">const</span>; -<a name="l01115"></a>01115 -<a name="l01117"></a>01117 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* Clone() <span class="keyword">const</span>; -<a name="l01118"></a>01118 <span class="comment">// Print the Element to a FILE stream.</span> -<a name="l01119"></a>01119 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; -<a name="l01120"></a>01120 -<a name="l01121"></a>01121 <span class="comment">/* Attribtue parsing starts: next char past '<'</span> -<a name="l01122"></a>01122 <span class="comment"> returns: next char past '>'</span> -<a name="l01123"></a>01123 <span class="comment"> */</span> -<a name="l01124"></a>01124 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); -<a name="l01125"></a>01125 -<a name="l01126"></a><a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c">01126</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01127"></a><a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a">01127</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01128"></a>01128 -<a name="l01131"></a>01131 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Accept( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01052"></a>01052 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01053"></a>01053 <span class="preprocessor"></span> <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name ) <span class="keyword">const</span>; +<a name="l01054"></a>01054 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span>* i ) <span class="keyword">const</span>; +<a name="l01055"></a>01055 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>; +<a name="l01056"></a>01056 <span class="keywordtype">int</span> QueryIntAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>; +<a name="l01057"></a>01057 <span class="keywordtype">int</span> QueryDoubleAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>; +<a name="l01058"></a>01058 +<a name="l01060"></a>01060 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string& name, <span class="keyword">const</span> std::string& _value ); +<a name="l01062"></a>01062 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">int</span> _value ); +<a name="l01064"></a>01064 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> std::string& name, <span class="keywordtype">double</span> value ); +<a name="l01065"></a>01065 <span class="preprocessor"> #endif</span> +<a name="l01066"></a>01066 <span class="preprocessor"></span> +<a name="l01070"></a>01070 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">int</span> value ); +<a name="l01071"></a>01071 +<a name="l01075"></a>01075 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">double</span> value ); +<a name="l01076"></a>01076 +<a name="l01079"></a>01079 <span class="keywordtype">void</span> RemoveAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name ); +<a name="l01080"></a>01080 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01081"></a><a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">01081</a> <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a>( <span class="keyword">const</span> std::string& name ) { <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a> (name.c_str ()); } +<a name="l01082"></a>01082 <span class="preprocessor"> #endif</span> +<a name="l01083"></a>01083 <span class="preprocessor"></span> +<a name="l01084"></a><a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592">01084</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592" title="Access the first attribute in this element.">FirstAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.First(); } +<a name="l01085"></a>01085 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* FirstAttribute() { <span class="keywordflow">return</span> attributeSet.First(); } +<a name="l01086"></a><a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381">01086</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381" title="Access the last attribute in this element.">LastAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.Last(); } +<a name="l01087"></a>01087 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* LastAttribute() { <span class="keywordflow">return</span> attributeSet.Last(); } +<a name="l01088"></a>01088 +<a name="l01121"></a>01121 <span class="keyword">const</span> <span class="keywordtype">char</span>* GetText() <span class="keyword">const</span>; +<a name="l01122"></a>01122 +<a name="l01124"></a>01124 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* Clone() <span class="keyword">const</span>; +<a name="l01125"></a>01125 <span class="comment">// Print the Element to a FILE stream.</span> +<a name="l01126"></a>01126 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; +<a name="l01127"></a>01127 +<a name="l01128"></a>01128 <span class="comment">/* Attribtue parsing starts: next char past '<'</span> +<a name="l01129"></a>01129 <span class="comment"> returns: next char past '>'</span> +<a name="l01130"></a>01130 <span class="comment"> */</span> +<a name="l01131"></a>01131 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); <a name="l01132"></a>01132 -<a name="l01133"></a>01133 <span class="keyword">protected</span>: -<a name="l01134"></a>01134 -<a name="l01135"></a>01135 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* target ) <span class="keyword">const</span>; -<a name="l01136"></a>01136 <span class="keywordtype">void</span> ClearThis(); <span class="comment">// like clear, but initializes 'this' object as well</span> -<a name="l01137"></a>01137 -<a name="l01138"></a>01138 <span class="comment">// Used to be public [internal use]</span> -<a name="l01139"></a>01139 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01140"></a>01140 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01141"></a>01141 <span class="preprocessor"> #endif</span> -<a name="l01142"></a>01142 <span class="preprocessor"></span> <span class="comment">/* [internal use]</span> -<a name="l01143"></a>01143 <span class="comment"> Reads the "value" of the element -- another element, or text.</span> -<a name="l01144"></a>01144 <span class="comment"> This should terminate with the current end tag.</span> -<a name="l01145"></a>01145 <span class="comment"> */</span> -<a name="l01146"></a>01146 <span class="keyword">const</span> <span class="keywordtype">char</span>* ReadValue( <span class="keyword">const</span> <span class="keywordtype">char</span>* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); -<a name="l01147"></a>01147 -<a name="l01148"></a>01148 <span class="keyword">private</span>: -<a name="l01149"></a>01149 TiXmlAttributeSet attributeSet; -<a name="l01150"></a>01150 }; -<a name="l01151"></a>01151 -<a name="l01152"></a>01152 -<a name="l01155"></a><a class="code" href="classTiXmlComment.html">01155</a> <span class="keyword">class </span><a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> -<a name="l01156"></a>01156 { -<a name="l01157"></a>01157 <span class="keyword">public</span>: -<a name="l01159"></a><a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7">01159</a> <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {} -<a name="l01161"></a><a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47">01161</a> <a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47" title="Construct a comment from text.">TiXmlComment</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _value ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) { -<a name="l01162"></a>01162 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( _value ); -<a name="l01163"></a>01163 } -<a name="l01164"></a>01164 <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& ); -<a name="l01165"></a>01165 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& base ); -<a name="l01166"></a>01166 -<a name="l01167"></a>01167 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>() {} -<a name="l01168"></a>01168 -<a name="l01170"></a>01170 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlComment.html#a0d6662bdc52488b9e12b3c7a0453d028" title="Returns a copy of this Comment.">Clone</a>() <span class="keyword">const</span>; -<a name="l01171"></a>01171 <span class="comment">// Write this Comment to a FILE stream.</span> -<a name="l01172"></a>01172 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlComment.html#a6b316527aaa8da0370cd68c22a5a0f5f" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; +<a name="l01133"></a><a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c">01133</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01134"></a><a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a">01134</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01135"></a>01135 +<a name="l01138"></a>01138 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Accept( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01139"></a>01139 +<a name="l01140"></a>01140 <span class="keyword">protected</span>: +<a name="l01141"></a>01141 +<a name="l01142"></a>01142 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* target ) <span class="keyword">const</span>; +<a name="l01143"></a>01143 <span class="keywordtype">void</span> ClearThis(); <span class="comment">// like clear, but initializes 'this' object as well</span> +<a name="l01144"></a>01144 +<a name="l01145"></a>01145 <span class="comment">// Used to be public [internal use]</span> +<a name="l01146"></a>01146 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01147"></a>01147 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01148"></a>01148 <span class="preprocessor"> #endif</span> +<a name="l01149"></a>01149 <span class="preprocessor"></span> <span class="comment">/* [internal use]</span> +<a name="l01150"></a>01150 <span class="comment"> Reads the "value" of the element -- another element, or text.</span> +<a name="l01151"></a>01151 <span class="comment"> This should terminate with the current end tag.</span> +<a name="l01152"></a>01152 <span class="comment"> */</span> +<a name="l01153"></a>01153 <span class="keyword">const</span> <span class="keywordtype">char</span>* ReadValue( <span class="keyword">const</span> <span class="keywordtype">char</span>* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); +<a name="l01154"></a>01154 +<a name="l01155"></a>01155 <span class="keyword">private</span>: +<a name="l01156"></a>01156 TiXmlAttributeSet attributeSet; +<a name="l01157"></a>01157 }; +<a name="l01158"></a>01158 +<a name="l01159"></a>01159 +<a name="l01162"></a><a class="code" href="classTiXmlComment.html">01162</a> <span class="keyword">class </span><a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> +<a name="l01163"></a>01163 { +<a name="l01164"></a>01164 <span class="keyword">public</span>: +<a name="l01166"></a><a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7">01166</a> <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {} +<a name="l01168"></a><a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47">01168</a> <a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47" title="Construct a comment from text.">TiXmlComment</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _value ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) { +<a name="l01169"></a>01169 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( _value ); +<a name="l01170"></a>01170 } +<a name="l01171"></a>01171 <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& ); +<a name="l01172"></a>01172 <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& base ); <a name="l01173"></a>01173 -<a name="l01174"></a>01174 <span class="comment">/* Attribtue parsing starts: at the ! of the !--</span> -<a name="l01175"></a>01175 <span class="comment"> returns: next char past '>'</span> -<a name="l01176"></a>01176 <span class="comment"> */</span> -<a name="l01177"></a>01177 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); -<a name="l01178"></a>01178 -<a name="l01179"></a><a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0">01179</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01180"></a><a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df">01180</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01181"></a>01181 -<a name="l01184"></a>01184 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlComment.html#af3ac1b99fbbe9ea4fb6e14146156e43e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01174"></a>01174 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>() {} +<a name="l01175"></a>01175 +<a name="l01177"></a>01177 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlComment.html#a0d6662bdc52488b9e12b3c7a0453d028" title="Returns a copy of this Comment.">Clone</a>() <span class="keyword">const</span>; +<a name="l01178"></a>01178 <span class="comment">// Write this Comment to a FILE stream.</span> +<a name="l01179"></a>01179 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlComment.html#a6b316527aaa8da0370cd68c22a5a0f5f" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; +<a name="l01180"></a>01180 +<a name="l01181"></a>01181 <span class="comment">/* Attribtue parsing starts: at the ! of the !--</span> +<a name="l01182"></a>01182 <span class="comment"> returns: next char past '>'</span> +<a name="l01183"></a>01183 <span class="comment"> */</span> +<a name="l01184"></a>01184 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); <a name="l01185"></a>01185 -<a name="l01186"></a>01186 <span class="keyword">protected</span>: -<a name="l01187"></a>01187 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* target ) <span class="keyword">const</span>; +<a name="l01186"></a><a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0">01186</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01187"></a><a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df">01187</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } <a name="l01188"></a>01188 -<a name="l01189"></a>01189 <span class="comment">// used to be public</span> -<a name="l01190"></a>01190 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01191"></a>01191 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01192"></a>01192 <span class="preprocessor"> #endif</span> -<a name="l01193"></a>01193 <span class="preprocessor"></span><span class="comment">// virtual void StreamOut( TIXML_OSTREAM * out ) const;</span> -<a name="l01194"></a>01194 -<a name="l01195"></a>01195 <span class="keyword">private</span>: -<a name="l01196"></a>01196 -<a name="l01197"></a>01197 }; -<a name="l01198"></a>01198 -<a name="l01199"></a>01199 -<a name="l01205"></a><a class="code" href="classTiXmlText.html">01205</a> <span class="keyword">class </span><a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> -<a name="l01206"></a>01206 { -<a name="l01207"></a>01207 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>; -<a name="l01208"></a>01208 <span class="keyword">public</span>: -<a name="l01213"></a><a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960">01213</a> <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * initValue ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> (<a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT) -<a name="l01214"></a>01214 { -<a name="l01215"></a>01215 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue ); -<a name="l01216"></a>01216 cdata = <span class="keyword">false</span>; -<a name="l01217"></a>01217 } -<a name="l01218"></a>01218 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>() {} -<a name="l01219"></a>01219 -<a name="l01220"></a>01220 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01222"></a><a class="code" href="classTiXmlText.html#a439792f6183a3d3fb6f2bc2b16fa5691">01222</a> <span class="preprocessor"> TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)</span> -<a name="l01223"></a>01223 <span class="preprocessor"></span> { -<a name="l01224"></a>01224 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue ); -<a name="l01225"></a>01225 cdata = <span class="keyword">false</span>; -<a name="l01226"></a>01226 } -<a name="l01227"></a>01227 <span class="preprocessor"> #endif</span> -<a name="l01228"></a>01228 <span class="preprocessor"></span> -<a name="l01229"></a>01229 <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT ) { copy.CopyTo( <span class="keyword">this</span> ); } -<a name="l01230"></a>01230 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& base ) { base.CopyTo( <span class="keyword">this</span> ); } -<a name="l01231"></a>01231 -<a name="l01232"></a>01232 <span class="comment">// Write this text object to a FILE stream.</span> -<a name="l01233"></a>01233 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#a0cafbf6f236c7f02d12b2bffc2b7976b" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; -<a name="l01234"></a>01234 -<a name="l01236"></a><a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586">01236</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586" title="Queries whether this represents text using a CDATA section.">CDATA</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cdata; } -<a name="l01238"></a><a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9">01238</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9" title="Turns on or off a CDATA representation of text.">SetCDATA</a>( <span class="keywordtype">bool</span> _cdata ) { cdata = _cdata; } -<a name="l01239"></a>01239 -<a name="l01240"></a>01240 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); +<a name="l01191"></a>01191 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlComment.html#af3ac1b99fbbe9ea4fb6e14146156e43e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01192"></a>01192 +<a name="l01193"></a>01193 <span class="keyword">protected</span>: +<a name="l01194"></a>01194 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* target ) <span class="keyword">const</span>; +<a name="l01195"></a>01195 +<a name="l01196"></a>01196 <span class="comment">// used to be public</span> +<a name="l01197"></a>01197 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01198"></a>01198 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01199"></a>01199 <span class="preprocessor"> #endif</span> +<a name="l01200"></a>01200 <span class="preprocessor"></span><span class="comment">// virtual void StreamOut( TIXML_OSTREAM * out ) const;</span> +<a name="l01201"></a>01201 +<a name="l01202"></a>01202 <span class="keyword">private</span>: +<a name="l01203"></a>01203 +<a name="l01204"></a>01204 }; +<a name="l01205"></a>01205 +<a name="l01206"></a>01206 +<a name="l01212"></a><a class="code" href="classTiXmlText.html">01212</a> <span class="keyword">class </span><a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> +<a name="l01213"></a>01213 { +<a name="l01214"></a>01214 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>; +<a name="l01215"></a>01215 <span class="keyword">public</span>: +<a name="l01220"></a><a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960">01220</a> <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * initValue ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> (<a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT) +<a name="l01221"></a>01221 { +<a name="l01222"></a>01222 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue ); +<a name="l01223"></a>01223 cdata = <span class="keyword">false</span>; +<a name="l01224"></a>01224 } +<a name="l01225"></a>01225 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>() {} +<a name="l01226"></a>01226 +<a name="l01227"></a>01227 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01229"></a><a class="code" href="classTiXmlText.html#a439792f6183a3d3fb6f2bc2b16fa5691">01229</a> <span class="preprocessor"> TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)</span> +<a name="l01230"></a>01230 <span class="preprocessor"></span> { +<a name="l01231"></a>01231 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue ); +<a name="l01232"></a>01232 cdata = <span class="keyword">false</span>; +<a name="l01233"></a>01233 } +<a name="l01234"></a>01234 <span class="preprocessor"> #endif</span> +<a name="l01235"></a>01235 <span class="preprocessor"></span> +<a name="l01236"></a>01236 <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT ) { copy.CopyTo( <span class="keyword">this</span> ); } +<a name="l01237"></a>01237 <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& base ) { base.CopyTo( <span class="keyword">this</span> ); <span class="keywordflow">return</span> *<span class="keyword">this</span>; } +<a name="l01238"></a>01238 +<a name="l01239"></a>01239 <span class="comment">// Write this text object to a FILE stream.</span> +<a name="l01240"></a>01240 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#a0cafbf6f236c7f02d12b2bffc2b7976b" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; <a name="l01241"></a>01241 -<a name="l01242"></a><a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648">01242</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01243"></a><a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b">01243</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01244"></a>01244 -<a name="l01247"></a>01247 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#a8483d4415ce9de6c4fa8f63d067d5de6" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01243"></a><a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586">01243</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586" title="Queries whether this represents text using a CDATA section.">CDATA</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cdata; } +<a name="l01245"></a><a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9">01245</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9" title="Turns on or off a CDATA representation of text.">SetCDATA</a>( <span class="keywordtype">bool</span> _cdata ) { cdata = _cdata; } +<a name="l01246"></a>01246 +<a name="l01247"></a>01247 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); <a name="l01248"></a>01248 -<a name="l01249"></a>01249 <span class="keyword">protected</span> : -<a name="l01251"></a>01251 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlText.html#a0c411e93a27537369479d034cc82da3b" title="[internal use] Creates a new Element and returns it.">Clone</a>() <span class="keyword">const</span>; -<a name="l01252"></a>01252 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* target ) <span class="keyword">const</span>; -<a name="l01253"></a>01253 -<a name="l01254"></a>01254 <span class="keywordtype">bool</span> Blank() <span class="keyword">const</span>; <span class="comment">// returns true if all white space and new lines</span> -<a name="l01255"></a>01255 <span class="comment">// [internal use]</span> -<a name="l01256"></a>01256 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01257"></a>01257 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01258"></a>01258 <span class="preprocessor"> #endif</span> -<a name="l01259"></a>01259 <span class="preprocessor"></span> -<a name="l01260"></a>01260 <span class="keyword">private</span>: -<a name="l01261"></a>01261 <span class="keywordtype">bool</span> cdata; <span class="comment">// true if this should be input and output as a CDATA style text element</span> -<a name="l01262"></a>01262 }; -<a name="l01263"></a>01263 -<a name="l01264"></a>01264 -<a name="l01278"></a><a class="code" href="classTiXmlDeclaration.html">01278</a> <span class="keyword">class </span><a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> -<a name="l01279"></a>01279 { -<a name="l01280"></a>01280 <span class="keyword">public</span>: -<a name="l01282"></a><a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79">01282</a> <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_DECLARATION ) {} -<a name="l01283"></a>01283 -<a name="l01284"></a>01284 <span class="preprocessor">#ifdef TIXML_USE_STL</span> -<a name="l01286"></a>01286 <span class="preprocessor"> TiXmlDeclaration( const std::string& _version,</span> -<a name="l01287"></a>01287 <span class="preprocessor"></span> <span class="keyword">const</span> std::string& _encoding, -<a name="l01288"></a>01288 <span class="keyword">const</span> std::string& _standalone ); -<a name="l01289"></a>01289 <span class="preprocessor">#endif</span> -<a name="l01290"></a>01290 <span class="preprocessor"></span> -<a name="l01292"></a>01292 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _version, -<a name="l01293"></a>01293 <span class="keyword">const</span> <span class="keywordtype">char</span>* _encoding, -<a name="l01294"></a>01294 <span class="keyword">const</span> <span class="keywordtype">char</span>* _standalone ); -<a name="l01295"></a>01295 -<a name="l01296"></a>01296 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& copy ); -<a name="l01297"></a>01297 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& copy ); -<a name="l01298"></a>01298 -<a name="l01299"></a>01299 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>() {} -<a name="l01300"></a>01300 -<a name="l01302"></a><a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76">01302</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76" title="Version. Will return an empty string if none was found.">Version</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> version.c_str (); } -<a name="l01304"></a><a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76">01304</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76" title="Encoding. Will return an empty string if none was found.">Encoding</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> encoding.c_str (); } -<a name="l01306"></a><a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9">01306</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9" title="Is this a standalone document?">Standalone</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> standalone.c_str (); } +<a name="l01249"></a><a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648">01249</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01250"></a><a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b">01250</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01251"></a>01251 +<a name="l01254"></a>01254 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#a8483d4415ce9de6c4fa8f63d067d5de6" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01255"></a>01255 +<a name="l01256"></a>01256 <span class="keyword">protected</span> : +<a name="l01258"></a>01258 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlText.html#a0c411e93a27537369479d034cc82da3b" title="[internal use] Creates a new Element and returns it.">Clone</a>() <span class="keyword">const</span>; +<a name="l01259"></a>01259 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* target ) <span class="keyword">const</span>; +<a name="l01260"></a>01260 +<a name="l01261"></a>01261 <span class="keywordtype">bool</span> Blank() <span class="keyword">const</span>; <span class="comment">// returns true if all white space and new lines</span> +<a name="l01262"></a>01262 <span class="comment">// [internal use]</span> +<a name="l01263"></a>01263 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01264"></a>01264 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01265"></a>01265 <span class="preprocessor"> #endif</span> +<a name="l01266"></a>01266 <span class="preprocessor"></span> +<a name="l01267"></a>01267 <span class="keyword">private</span>: +<a name="l01268"></a>01268 <span class="keywordtype">bool</span> cdata; <span class="comment">// true if this should be input and output as a CDATA style text element</span> +<a name="l01269"></a>01269 }; +<a name="l01270"></a>01270 +<a name="l01271"></a>01271 +<a name="l01285"></a><a class="code" href="classTiXmlDeclaration.html">01285</a> <span class="keyword">class </span><a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> +<a name="l01286"></a>01286 { +<a name="l01287"></a>01287 <span class="keyword">public</span>: +<a name="l01289"></a><a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79">01289</a> <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_DECLARATION ) {} +<a name="l01290"></a>01290 +<a name="l01291"></a>01291 <span class="preprocessor">#ifdef TIXML_USE_STL</span> +<a name="l01293"></a>01293 <span class="preprocessor"> TiXmlDeclaration( const std::string& _version,</span> +<a name="l01294"></a>01294 <span class="preprocessor"></span> <span class="keyword">const</span> std::string& _encoding, +<a name="l01295"></a>01295 <span class="keyword">const</span> std::string& _standalone ); +<a name="l01296"></a>01296 <span class="preprocessor">#endif</span> +<a name="l01297"></a>01297 <span class="preprocessor"></span> +<a name="l01299"></a>01299 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _version, +<a name="l01300"></a>01300 <span class="keyword">const</span> <span class="keywordtype">char</span>* _encoding, +<a name="l01301"></a>01301 <span class="keyword">const</span> <span class="keywordtype">char</span>* _standalone ); +<a name="l01302"></a>01302 +<a name="l01303"></a>01303 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& copy ); +<a name="l01304"></a>01304 <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& copy ); +<a name="l01305"></a>01305 +<a name="l01306"></a>01306 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>() {} <a name="l01307"></a>01307 -<a name="l01309"></a>01309 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDeclaration.html#a7cf459186040141cda7a180a6585ce2e" title="Creates a copy of this Declaration and returns it.">Clone</a>() <span class="keyword">const</span>; -<a name="l01310"></a>01310 <span class="comment">// Print this declaration to a FILE stream.</span> -<a name="l01311"></a>01311 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth, TIXML_STRING* str ) <span class="keyword">const</span>; -<a name="l01312"></a><a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4">01312</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth )<span class="keyword"> const </span>{ -<a name="l01313"></a>01313 Print( cfile, depth, 0 ); -<a name="l01314"></a>01314 } -<a name="l01315"></a>01315 -<a name="l01316"></a>01316 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); -<a name="l01317"></a>01317 -<a name="l01318"></a><a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967">01318</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01319"></a><a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce">01319</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01320"></a>01320 -<a name="l01323"></a>01323 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDeclaration.html#a22315a535983b86535cdba3458669e3e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01309"></a><a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76">01309</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76" title="Version. Will return an empty string if none was found.">Version</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> version.c_str (); } +<a name="l01311"></a><a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76">01311</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76" title="Encoding. Will return an empty string if none was found.">Encoding</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> encoding.c_str (); } +<a name="l01313"></a><a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9">01313</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9" title="Is this a standalone document?">Standalone</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> standalone.c_str (); } +<a name="l01314"></a>01314 +<a name="l01316"></a>01316 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDeclaration.html#a7cf459186040141cda7a180a6585ce2e" title="Creates a copy of this Declaration and returns it.">Clone</a>() <span class="keyword">const</span>; +<a name="l01317"></a>01317 <span class="comment">// Print this declaration to a FILE stream.</span> +<a name="l01318"></a>01318 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth, TIXML_STRING* str ) <span class="keyword">const</span>; +<a name="l01319"></a><a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4">01319</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth )<span class="keyword"> const </span>{ +<a name="l01320"></a>01320 Print( cfile, depth, 0 ); +<a name="l01321"></a>01321 } +<a name="l01322"></a>01322 +<a name="l01323"></a>01323 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); <a name="l01324"></a>01324 -<a name="l01325"></a>01325 <span class="keyword">protected</span>: -<a name="l01326"></a>01326 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* target ) <span class="keyword">const</span>; -<a name="l01327"></a>01327 <span class="comment">// used to be public</span> -<a name="l01328"></a>01328 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01329"></a>01329 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01330"></a>01330 <span class="preprocessor"> #endif</span> -<a name="l01331"></a>01331 <span class="preprocessor"></span> -<a name="l01332"></a>01332 <span class="keyword">private</span>: -<a name="l01333"></a>01333 -<a name="l01334"></a>01334 TIXML_STRING version; -<a name="l01335"></a>01335 TIXML_STRING encoding; -<a name="l01336"></a>01336 TIXML_STRING standalone; -<a name="l01337"></a>01337 }; -<a name="l01338"></a>01338 -<a name="l01339"></a>01339 -<a name="l01347"></a><a class="code" href="classTiXmlUnknown.html">01347</a> <span class="keyword">class </span><a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> -<a name="l01348"></a>01348 { -<a name="l01349"></a>01349 <span class="keyword">public</span>: -<a name="l01350"></a>01350 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) {} -<a name="l01351"></a>01351 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() {} -<a name="l01352"></a>01352 -<a name="l01353"></a>01353 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( <span class="keyword">this</span> ); } -<a name="l01354"></a>01354 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& copy ) { copy.CopyTo( <span class="keyword">this</span> ); } -<a name="l01355"></a>01355 -<a name="l01357"></a>01357 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlUnknown.html#a0960bb7428b3f341da46244229604d73" title="Creates a copy of this Unknown and returns it.">Clone</a>() <span class="keyword">const</span>; -<a name="l01358"></a>01358 <span class="comment">// Print this Unknown to a FILE stream.</span> -<a name="l01359"></a>01359 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlUnknown.html#a31ba089a40fb5a1869750fce09b0bacb" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; -<a name="l01360"></a>01360 -<a name="l01361"></a>01361 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); +<a name="l01325"></a><a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967">01325</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01326"></a><a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce">01326</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01327"></a>01327 +<a name="l01330"></a>01330 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDeclaration.html#a22315a535983b86535cdba3458669e3e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>; +<a name="l01331"></a>01331 +<a name="l01332"></a>01332 <span class="keyword">protected</span>: +<a name="l01333"></a>01333 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* target ) <span class="keyword">const</span>; +<a name="l01334"></a>01334 <span class="comment">// used to be public</span> +<a name="l01335"></a>01335 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01336"></a>01336 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01337"></a>01337 <span class="preprocessor"> #endif</span> +<a name="l01338"></a>01338 <span class="preprocessor"></span> +<a name="l01339"></a>01339 <span class="keyword">private</span>: +<a name="l01340"></a>01340 +<a name="l01341"></a>01341 TIXML_STRING version; +<a name="l01342"></a>01342 TIXML_STRING encoding; +<a name="l01343"></a>01343 TIXML_STRING standalone; +<a name="l01344"></a>01344 }; +<a name="l01345"></a>01345 +<a name="l01346"></a>01346 +<a name="l01354"></a><a class="code" href="classTiXmlUnknown.html">01354</a> <span class="keyword">class </span><a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> +<a name="l01355"></a>01355 { +<a name="l01356"></a>01356 <span class="keyword">public</span>: +<a name="l01357"></a>01357 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) {} +<a name="l01358"></a>01358 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() {} +<a name="l01359"></a>01359 +<a name="l01360"></a>01360 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( <span class="keyword">this</span> ); } +<a name="l01361"></a>01361 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& copy ) { copy.CopyTo( <span class="keyword">this</span> ); <span class="keywordflow">return</span> *<span class="keyword">this</span>; } <a name="l01362"></a>01362 -<a name="l01363"></a><a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d">01363</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01364"></a><a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c">01364</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01365"></a>01365 -<a name="l01368"></a>01368 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlUnknown.html#ad7122e5135581b3c832a1a3217760a93" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01364"></a>01364 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlUnknown.html#a0960bb7428b3f341da46244229604d73" title="Creates a copy of this Unknown and returns it.">Clone</a>() <span class="keyword">const</span>; +<a name="l01365"></a>01365 <span class="comment">// Print this Unknown to a FILE stream.</span> +<a name="l01366"></a>01366 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlUnknown.html#a31ba089a40fb5a1869750fce09b0bacb" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>; +<a name="l01367"></a>01367 +<a name="l01368"></a>01368 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding ); <a name="l01369"></a>01369 -<a name="l01370"></a>01370 <span class="keyword">protected</span>: -<a name="l01371"></a>01371 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* target ) <span class="keyword">const</span>; +<a name="l01370"></a><a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d">01370</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01371"></a><a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c">01371</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } <a name="l01372"></a>01372 -<a name="l01373"></a>01373 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01374"></a>01374 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01375"></a>01375 <span class="preprocessor"> #endif</span> -<a name="l01376"></a>01376 <span class="preprocessor"></span> -<a name="l01377"></a>01377 <span class="keyword">private</span>: -<a name="l01378"></a>01378 -<a name="l01379"></a>01379 }; -<a name="l01380"></a>01380 -<a name="l01381"></a>01381 -<a name="l01386"></a><a class="code" href="classTiXmlDocument.html">01386</a> <span class="keyword">class </span><a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> -<a name="l01387"></a>01387 { -<a name="l01388"></a>01388 <span class="keyword">public</span>: -<a name="l01390"></a>01390 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>(); -<a name="l01392"></a>01392 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * documentName ); -<a name="l01393"></a>01393 -<a name="l01394"></a>01394 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01396"></a>01396 <span class="preprocessor"> TiXmlDocument( const std::string& documentName );</span> -<a name="l01397"></a>01397 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> -<a name="l01398"></a>01398 <span class="preprocessor"></span> -<a name="l01399"></a>01399 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& copy ); -<a name="l01400"></a>01400 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& copy ); -<a name="l01401"></a>01401 -<a name="l01402"></a>01402 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>() {} -<a name="l01403"></a>01403 -<a name="l01408"></a>01408 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); -<a name="l01410"></a>01410 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>() <span class="keyword">const</span>; -<a name="l01412"></a>01412 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); -<a name="l01414"></a>01414 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename ) <span class="keyword">const</span>; -<a name="l01420"></a>01420 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); -<a name="l01422"></a>01422 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( FILE* ) <span class="keyword">const</span>; -<a name="l01423"></a>01423 -<a name="l01424"></a>01424 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01425"></a><a class="code" href="classTiXmlDocument.html#a18ae6ed34fed7991ebc220862dfac884">01425</a> <span class="preprocessor"></span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) -<a name="l01426"></a>01426 { -<a name="l01427"></a>01427 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( filename.c_str(), encoding ); -<a name="l01428"></a>01428 } -<a name="l01429"></a><a class="code" href="classTiXmlDocument.html#a3d4fae0463f3f03679ba0b7cf6f2df52">01429</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> std::string& filename ) <span class="keyword">const</span> -<a name="l01430"></a>01430 { -<a name="l01431"></a>01431 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( filename.c_str() ); -<a name="l01432"></a>01432 } -<a name="l01433"></a>01433 <span class="preprocessor"> #endif</span> -<a name="l01434"></a>01434 <span class="preprocessor"></span> -<a name="l01439"></a>01439 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlDocument.html#a17ebabe36926ef398e78dec0d0ad0378" title="Parse the given null terminated block of xml data.">Parse</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); -<a name="l01440"></a>01440 -<a name="l01445"></a><a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be">01445</a> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); } -<a name="l01446"></a>01446 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>() { <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); } +<a name="l01375"></a>01375 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlUnknown.html#ad7122e5135581b3c832a1a3217760a93" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01376"></a>01376 +<a name="l01377"></a>01377 <span class="keyword">protected</span>: +<a name="l01378"></a>01378 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* target ) <span class="keyword">const</span>; +<a name="l01379"></a>01379 +<a name="l01380"></a>01380 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01381"></a>01381 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01382"></a>01382 <span class="preprocessor"> #endif</span> +<a name="l01383"></a>01383 <span class="preprocessor"></span> +<a name="l01384"></a>01384 <span class="keyword">private</span>: +<a name="l01385"></a>01385 +<a name="l01386"></a>01386 }; +<a name="l01387"></a>01387 +<a name="l01388"></a>01388 +<a name="l01393"></a><a class="code" href="classTiXmlDocument.html">01393</a> <span class="keyword">class </span><a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> +<a name="l01394"></a>01394 { +<a name="l01395"></a>01395 <span class="keyword">public</span>: +<a name="l01397"></a>01397 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>(); +<a name="l01399"></a>01399 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * documentName ); +<a name="l01400"></a>01400 +<a name="l01401"></a>01401 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01403"></a>01403 <span class="preprocessor"> TiXmlDocument( const std::string& documentName );</span> +<a name="l01404"></a>01404 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> +<a name="l01405"></a>01405 <span class="preprocessor"></span> +<a name="l01406"></a>01406 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& copy ); +<a name="l01407"></a>01407 <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& copy ); +<a name="l01408"></a>01408 +<a name="l01409"></a>01409 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>() {} +<a name="l01410"></a>01410 +<a name="l01415"></a>01415 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); +<a name="l01417"></a>01417 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>() <span class="keyword">const</span>; +<a name="l01419"></a>01419 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); +<a name="l01421"></a>01421 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename ) <span class="keyword">const</span>; +<a name="l01427"></a>01427 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); +<a name="l01429"></a>01429 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( FILE* ) <span class="keyword">const</span>; +<a name="l01430"></a>01430 +<a name="l01431"></a>01431 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01432"></a><a class="code" href="classTiXmlDocument.html#a18ae6ed34fed7991ebc220862dfac884">01432</a> <span class="preprocessor"></span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) +<a name="l01433"></a>01433 { +<a name="l01434"></a>01434 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( filename.c_str(), encoding ); +<a name="l01435"></a>01435 } +<a name="l01436"></a><a class="code" href="classTiXmlDocument.html#a3d4fae0463f3f03679ba0b7cf6f2df52">01436</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> std::string& filename ) <span class="keyword">const</span> +<a name="l01437"></a>01437 { +<a name="l01438"></a>01438 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( filename.c_str() ); +<a name="l01439"></a>01439 } +<a name="l01440"></a>01440 <span class="preprocessor"> #endif</span> +<a name="l01441"></a>01441 <span class="preprocessor"></span> +<a name="l01446"></a>01446 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlDocument.html#a17ebabe36926ef398e78dec0d0ad0378" title="Parse the given null terminated block of xml data.">Parse</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); <a name="l01447"></a>01447 -<a name="l01453"></a><a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29">01453</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29" title="If an error occurs, Error will be set to true.">Error</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error; } +<a name="l01452"></a><a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be">01452</a> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); } +<a name="l01453"></a>01453 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>() { <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); } <a name="l01454"></a>01454 -<a name="l01456"></a><a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e">01456</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e" title="Contains a textual (english) description of the error if one occurs.">ErrorDesc</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorDesc.c_str (); } -<a name="l01457"></a>01457 -<a name="l01461"></a><a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f">01461</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f" title="Generally, you probably want the error string ( ErrorDesc() ).">ErrorId</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorId; } -<a name="l01462"></a>01462 -<a name="l01470"></a><a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e">01470</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e" title="Returns the location (if known) of the error.">ErrorRow</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.row+1; } -<a name="l01471"></a><a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649">01471</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649" title="The column where the error occured. See ErrorRow().">ErrorCol</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.col+1; } -<a name="l01472"></a>01472 -<a name="l01497"></a><a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e">01497</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e" title="SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to...">SetTabSize</a>( <span class="keywordtype">int</span> _tabsize ) { tabsize = _tabsize; } -<a name="l01498"></a>01498 -<a name="l01499"></a>01499 <span class="keywordtype">int</span> TabSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> tabsize; } -<a name="l01500"></a>01500 -<a name="l01504"></a><a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35">01504</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35" title="If you have handled the error, it can be reset with this call.">ClearError</a>() { error = <span class="keyword">false</span>; -<a name="l01505"></a>01505 errorId = 0; -<a name="l01506"></a>01506 errorDesc = <span class="stringliteral">""</span>; -<a name="l01507"></a>01507 errorLocation.row = errorLocation.col = 0; -<a name="l01508"></a>01508 <span class="comment">//errorLocation.last = 0; </span> -<a name="l01509"></a>01509 } -<a name="l01510"></a>01510 -<a name="l01512"></a><a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510">01512</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>()<span class="keyword"> const </span>{ <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>( stdout, 0 ); } -<a name="l01513"></a>01513 -<a name="l01514"></a>01514 <span class="comment">/* Write the document to a string using formatted printing ("pretty print"). This</span> -<a name="l01515"></a>01515 <span class="comment"> will allocate a character array (new char[]) and return it as a pointer. The</span> -<a name="l01516"></a>01516 <span class="comment"> calling code pust call delete[] on the return char* to avoid a memory leak.</span> -<a name="l01517"></a>01517 <span class="comment"> */</span> -<a name="l01518"></a>01518 <span class="comment">//char* PrintToMemory() const; </span> -<a name="l01519"></a>01519 -<a name="l01521"></a>01521 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth = 0 ) <span class="keyword">const</span>; -<a name="l01522"></a>01522 <span class="comment">// [internal use]</span> -<a name="l01523"></a>01523 <span class="keywordtype">void</span> SetError( <span class="keywordtype">int</span> err, <span class="keyword">const</span> <span class="keywordtype">char</span>* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); -<a name="l01524"></a>01524 -<a name="l01525"></a><a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4">01525</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01526"></a><a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42">01526</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } -<a name="l01527"></a>01527 -<a name="l01530"></a>01530 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#aa545aae325d9752ad64120bc4ecf939a" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01460"></a><a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29">01460</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29" title="If an error occurs, Error will be set to true.">Error</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error; } +<a name="l01461"></a>01461 +<a name="l01463"></a><a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e">01463</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e" title="Contains a textual (english) description of the error if one occurs.">ErrorDesc</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorDesc.c_str (); } +<a name="l01464"></a>01464 +<a name="l01468"></a><a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f">01468</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f" title="Generally, you probably want the error string ( ErrorDesc() ).">ErrorId</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorId; } +<a name="l01469"></a>01469 +<a name="l01477"></a><a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e">01477</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e" title="Returns the location (if known) of the error.">ErrorRow</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.row+1; } +<a name="l01478"></a><a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649">01478</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649" title="The column where the error occured. See ErrorRow().">ErrorCol</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.col+1; } +<a name="l01479"></a>01479 +<a name="l01504"></a><a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e">01504</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e" title="SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to...">SetTabSize</a>( <span class="keywordtype">int</span> _tabsize ) { tabsize = _tabsize; } +<a name="l01505"></a>01505 +<a name="l01506"></a>01506 <span class="keywordtype">int</span> TabSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> tabsize; } +<a name="l01507"></a>01507 +<a name="l01511"></a><a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35">01511</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35" title="If you have handled the error, it can be reset with this call.">ClearError</a>() { error = <span class="keyword">false</span>; +<a name="l01512"></a>01512 errorId = 0; +<a name="l01513"></a>01513 errorDesc = <span class="stringliteral">""</span>; +<a name="l01514"></a>01514 errorLocation.row = errorLocation.col = 0; +<a name="l01515"></a>01515 <span class="comment">//errorLocation.last = 0; </span> +<a name="l01516"></a>01516 } +<a name="l01517"></a>01517 +<a name="l01519"></a><a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510">01519</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>()<span class="keyword"> const </span>{ <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>( stdout, 0 ); } +<a name="l01520"></a>01520 +<a name="l01521"></a>01521 <span class="comment">/* Write the document to a string using formatted printing ("pretty print"). This</span> +<a name="l01522"></a>01522 <span class="comment"> will allocate a character array (new char[]) and return it as a pointer. The</span> +<a name="l01523"></a>01523 <span class="comment"> calling code pust call delete[] on the return char* to avoid a memory leak.</span> +<a name="l01524"></a>01524 <span class="comment"> */</span> +<a name="l01525"></a>01525 <span class="comment">//char* PrintToMemory() const; </span> +<a name="l01526"></a>01526 +<a name="l01528"></a>01528 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&quot;pretty print&quot;)...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth = 0 ) <span class="keyword">const</span>; +<a name="l01529"></a>01529 <span class="comment">// [internal use]</span> +<a name="l01530"></a>01530 <span class="keywordtype">void</span> SetError( <span class="keywordtype">int</span> err, <span class="keyword">const</span> <span class="keywordtype">char</span>* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); <a name="l01531"></a>01531 -<a name="l01532"></a>01532 <span class="keyword">protected</span> : -<a name="l01533"></a>01533 <span class="comment">// [internal use]</span> -<a name="l01534"></a>01534 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDocument.html#a4968661cab4a1f44a23329c6f8db1907" title="Create an exact duplicate of this node and return it.">Clone</a>() <span class="keyword">const</span>; -<a name="l01535"></a>01535 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01536"></a>01536 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); -<a name="l01537"></a>01537 <span class="preprocessor"> #endif</span> -<a name="l01538"></a>01538 <span class="preprocessor"></span> -<a name="l01539"></a>01539 <span class="keyword">private</span>: -<a name="l01540"></a>01540 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* target ) <span class="keyword">const</span>; -<a name="l01541"></a>01541 -<a name="l01542"></a>01542 <span class="keywordtype">bool</span> error; -<a name="l01543"></a>01543 <span class="keywordtype">int</span> errorId; -<a name="l01544"></a>01544 TIXML_STRING errorDesc; -<a name="l01545"></a>01545 <span class="keywordtype">int</span> tabsize; -<a name="l01546"></a>01546 TiXmlCursor errorLocation; -<a name="l01547"></a>01547 <span class="keywordtype">bool</span> useMicrosoftBOM; <span class="comment">// the UTF-8 BOM were found when read. Note this, and try to write.</span> -<a name="l01548"></a>01548 }; -<a name="l01549"></a>01549 -<a name="l01550"></a>01550 -<a name="l01631"></a><a class="code" href="classTiXmlHandle.html">01631</a> <span class="keyword">class </span><a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> -<a name="l01632"></a>01632 { -<a name="l01633"></a>01633 <span class="keyword">public</span>: -<a name="l01635"></a><a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8">01635</a> <a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8" title="Create a handle from any node (at any depth of the tree.) This can be a null pointer...">TiXmlHandle</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* _node ) { this->node = _node; } -<a name="l01637"></a><a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7">01637</a> <a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7" title="Copy constructor.">TiXmlHandle</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>& ref ) { this->node = ref.node; } -<a name="l01638"></a>01638 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>& ref ) { this->node = ref.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; } -<a name="l01639"></a>01639 -<a name="l01641"></a>01641 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>() <span class="keyword">const</span>; -<a name="l01643"></a>01643 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>; -<a name="l01645"></a>01645 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>() <span class="keyword">const</span>; -<a name="l01647"></a>01647 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>; -<a name="l01648"></a>01648 -<a name="l01652"></a>01652 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; -<a name="l01656"></a>01656 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; -<a name="l01661"></a>01661 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; -<a name="l01666"></a>01666 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; -<a name="l01667"></a>01667 -<a name="l01668"></a>01668 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01669"></a>01669 <span class="preprocessor"></span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> std::string& _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( _value.c_str() ); } -<a name="l01670"></a>01670 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> std::string& _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( _value.c_str() ); } -<a name="l01671"></a>01671 -<a name="l01672"></a>01672 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keyword">const</span> std::string& _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( _value.c_str(), index ); } -<a name="l01673"></a>01673 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> std::string& _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( _value.c_str(), index ); } -<a name="l01674"></a>01674 <span class="preprocessor"> #endif</span> -<a name="l01675"></a>01675 <span class="preprocessor"></span> -<a name="l01678"></a><a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3">01678</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> node; } -<a name="l01681"></a><a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e">01681</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } -<a name="l01684"></a><a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586">01684</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToText() ) ? node->ToText() : 0 ); } -<a name="l01687"></a><a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674">01687</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } -<a name="l01688"></a>01688 -<a name="l01692"></a><a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">01692</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">Node</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>(); } -<a name="l01696"></a><a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">01696</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">Element</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>(); } -<a name="l01700"></a><a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">01700</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">Text</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>(); } -<a name="l01704"></a><a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">01704</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">Unknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>(); } -<a name="l01705"></a>01705 -<a name="l01706"></a>01706 <span class="keyword">private</span>: -<a name="l01707"></a>01707 <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* node; -<a name="l01708"></a>01708 }; -<a name="l01709"></a>01709 -<a name="l01710"></a>01710 -<a name="l01730"></a><a class="code" href="classTiXmlPrinter.html">01730</a> <span class="keyword">class </span><a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a> -<a name="l01731"></a>01731 { -<a name="l01732"></a>01732 <span class="keyword">public</span>: -<a name="l01733"></a>01733 <a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a>() : depth( 0 ), simpleTextPrint( <span class="keyword">false</span> ), -<a name="l01734"></a>01734 buffer(), indent( <span class="stringliteral">" "</span> ), lineBreak( <span class="stringliteral">"\n"</span> ) {} -<a name="l01735"></a>01735 -<a name="l01736"></a>01736 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& doc ); -<a name="l01737"></a>01737 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& doc ); -<a name="l01738"></a>01738 -<a name="l01739"></a>01739 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& element, <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* firstAttribute ); -<a name="l01740"></a>01740 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& element ); -<a name="l01741"></a>01741 -<a name="l01742"></a>01742 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& declaration ); -<a name="l01743"></a>01743 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& text ); -<a name="l01744"></a>01744 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& comment ); -<a name="l01745"></a>01745 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& unknown ); -<a name="l01746"></a>01746 -<a name="l01750"></a><a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">01750</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e" title="Set the indent characters for printing.">SetIndent</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _indent ) { indent = _indent ? _indent : <span class="stringliteral">""</span> ; } -<a name="l01752"></a><a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d">01752</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d" title="Query the indention string.">Indent</a>() { <span class="keywordflow">return</span> indent.c_str(); } -<a name="l01757"></a><a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6">01757</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6" title="Set the line breaking string.">SetLineBreak</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : <span class="stringliteral">""</span>; } -<a name="l01759"></a><a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d">01759</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d" title="Query the current line breaking string.">LineBreak</a>() { <span class="keywordflow">return</span> lineBreak.c_str(); } -<a name="l01760"></a>01760 -<a name="l01764"></a><a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19">01764</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19" title="Switch over to &quot;stream printing&quot; which is the most dense formatting without...">SetStreamPrinting</a>() { indent = <span class="stringliteral">""</span>; -<a name="l01765"></a>01765 lineBreak = <span class="stringliteral">""</span>; -<a name="l01766"></a>01766 } -<a name="l01768"></a><a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e">01768</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e" title="Return the result.">CStr</a>() { <span class="keywordflow">return</span> buffer.c_str(); } -<a name="l01770"></a><a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d">01770</a> <span class="keywordtype">size_t</span> <a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d" title="Return the length of the result string.">Size</a>() { <span class="keywordflow">return</span> buffer.size(); } -<a name="l01771"></a>01771 -<a name="l01772"></a>01772 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> -<a name="l01774"></a><a class="code" href="classTiXmlPrinter.html#a3bd4daf44309b41f5813a833caa0d1c9">01774</a> <span class="preprocessor"> const std::string& Str() { return buffer; }</span> -<a name="l01775"></a>01775 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> -<a name="l01776"></a>01776 <span class="preprocessor"></span> -<a name="l01777"></a>01777 <span class="keyword">private</span>: -<a name="l01778"></a>01778 <span class="keywordtype">void</span> DoIndent() { -<a name="l01779"></a>01779 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i=0; i<depth; ++i ) -<a name="l01780"></a>01780 buffer += indent; -<a name="l01781"></a>01781 } -<a name="l01782"></a>01782 <span class="keywordtype">void</span> DoLineBreak() { -<a name="l01783"></a>01783 buffer += lineBreak; -<a name="l01784"></a>01784 } -<a name="l01785"></a>01785 -<a name="l01786"></a>01786 <span class="keywordtype">int</span> depth; -<a name="l01787"></a>01787 <span class="keywordtype">bool</span> simpleTextPrint; -<a name="l01788"></a>01788 TIXML_STRING buffer; -<a name="l01789"></a>01789 TIXML_STRING indent; -<a name="l01790"></a>01790 TIXML_STRING lineBreak; -<a name="l01791"></a>01791 }; +<a name="l01532"></a><a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4">01532</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01533"></a><a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42">01533</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; } +<a name="l01534"></a>01534 +<a name="l01537"></a>01537 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#aa545aae325d9752ad64120bc4ecf939a" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>; +<a name="l01538"></a>01538 +<a name="l01539"></a>01539 <span class="keyword">protected</span> : +<a name="l01540"></a>01540 <span class="comment">// [internal use]</span> +<a name="l01541"></a>01541 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDocument.html#a4968661cab4a1f44a23329c6f8db1907" title="Create an exact duplicate of this node and return it.">Clone</a>() <span class="keyword">const</span>; +<a name="l01542"></a>01542 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01543"></a>01543 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag ); +<a name="l01544"></a>01544 <span class="preprocessor"> #endif</span> +<a name="l01545"></a>01545 <span class="preprocessor"></span> +<a name="l01546"></a>01546 <span class="keyword">private</span>: +<a name="l01547"></a>01547 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* target ) <span class="keyword">const</span>; +<a name="l01548"></a>01548 +<a name="l01549"></a>01549 <span class="keywordtype">bool</span> error; +<a name="l01550"></a>01550 <span class="keywordtype">int</span> errorId; +<a name="l01551"></a>01551 TIXML_STRING errorDesc; +<a name="l01552"></a>01552 <span class="keywordtype">int</span> tabsize; +<a name="l01553"></a>01553 TiXmlCursor errorLocation; +<a name="l01554"></a>01554 <span class="keywordtype">bool</span> useMicrosoftBOM; <span class="comment">// the UTF-8 BOM were found when read. Note this, and try to write.</span> +<a name="l01555"></a>01555 }; +<a name="l01556"></a>01556 +<a name="l01557"></a>01557 +<a name="l01638"></a><a class="code" href="classTiXmlHandle.html">01638</a> <span class="keyword">class </span><a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> +<a name="l01639"></a>01639 { +<a name="l01640"></a>01640 <span class="keyword">public</span>: +<a name="l01642"></a><a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8">01642</a> <a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8" title="Create a handle from any node (at any depth of the tree.) This can be a null pointer...">TiXmlHandle</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* _node ) { this->node = _node; } +<a name="l01644"></a><a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7">01644</a> <a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7" title="Copy constructor.">TiXmlHandle</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>& ref ) { this->node = ref.node; } +<a name="l01645"></a>01645 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>& ref ) { <span class="keywordflow">if</span> ( &ref != <span class="keyword">this</span> ) this->node = ref.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; } +<a name="l01646"></a>01646 +<a name="l01648"></a>01648 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>() <span class="keyword">const</span>; +<a name="l01650"></a>01650 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>; +<a name="l01652"></a>01652 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>() <span class="keyword">const</span>; +<a name="l01654"></a>01654 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>; +<a name="l01655"></a>01655 +<a name="l01659"></a>01659 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; +<a name="l01663"></a>01663 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; +<a name="l01668"></a>01668 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; +<a name="l01673"></a>01673 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>; +<a name="l01674"></a>01674 +<a name="l01675"></a>01675 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01676"></a>01676 <span class="preprocessor"></span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> std::string& _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( _value.c_str() ); } +<a name="l01677"></a>01677 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> std::string& _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( _value.c_str() ); } +<a name="l01678"></a>01678 +<a name="l01679"></a>01679 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( <span class="keyword">const</span> std::string& _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &quot;index&quot; child with the given name.">Child</a>( _value.c_str(), index ); } +<a name="l01680"></a>01680 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> std::string& _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &quot;index&quot; child element with the given name.">ChildElement</a>( _value.c_str(), index ); } +<a name="l01681"></a>01681 <span class="preprocessor"> #endif</span> +<a name="l01682"></a>01682 <span class="preprocessor"></span> +<a name="l01685"></a><a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3">01685</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> node; } +<a name="l01688"></a><a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e">01688</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } +<a name="l01691"></a><a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586">01691</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToText() ) ? node->ToText() : 0 ); } +<a name="l01694"></a><a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674">01694</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } +<a name="l01695"></a>01695 +<a name="l01699"></a><a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">01699</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">Node</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>(); } +<a name="l01703"></a><a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">01703</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">Element</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>(); } +<a name="l01707"></a><a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">01707</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">Text</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>(); } +<a name="l01711"></a><a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">01711</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">Unknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>(); } +<a name="l01712"></a>01712 +<a name="l01713"></a>01713 <span class="keyword">private</span>: +<a name="l01714"></a>01714 <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* node; +<a name="l01715"></a>01715 }; +<a name="l01716"></a>01716 +<a name="l01717"></a>01717 +<a name="l01737"></a><a class="code" href="classTiXmlPrinter.html">01737</a> <span class="keyword">class </span><a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &quot;Visitor pattern&quot; (see the Accept() method...">TiXmlVisitor</a> +<a name="l01738"></a>01738 { +<a name="l01739"></a>01739 <span class="keyword">public</span>: +<a name="l01740"></a>01740 <a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a>() : depth( 0 ), simpleTextPrint( <span class="keyword">false</span> ), +<a name="l01741"></a>01741 buffer(), indent( <span class="stringliteral">" "</span> ), lineBreak( <span class="stringliteral">"\n"</span> ) {} +<a name="l01742"></a>01742 +<a name="l01743"></a>01743 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& doc ); +<a name="l01744"></a>01744 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>& doc ); +<a name="l01745"></a>01745 +<a name="l01746"></a>01746 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& element, <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* firstAttribute ); +<a name="l01747"></a>01747 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>& element ); +<a name="l01748"></a>01748 +<a name="l01749"></a>01749 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>& declaration ); +<a name="l01750"></a>01750 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>& text ); +<a name="l01751"></a>01751 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>& comment ); +<a name="l01752"></a>01752 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>& unknown ); +<a name="l01753"></a>01753 +<a name="l01757"></a><a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">01757</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e" title="Set the indent characters for printing.">SetIndent</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _indent ) { indent = _indent ? _indent : <span class="stringliteral">""</span> ; } +<a name="l01759"></a><a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d">01759</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d" title="Query the indention string.">Indent</a>() { <span class="keywordflow">return</span> indent.c_str(); } +<a name="l01764"></a><a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6">01764</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6" title="Set the line breaking string.">SetLineBreak</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : <span class="stringliteral">""</span>; } +<a name="l01766"></a><a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d">01766</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d" title="Query the current line breaking string.">LineBreak</a>() { <span class="keywordflow">return</span> lineBreak.c_str(); } +<a name="l01767"></a>01767 +<a name="l01771"></a><a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19">01771</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19" title="Switch over to &quot;stream printing&quot; which is the most dense formatting without...">SetStreamPrinting</a>() { indent = <span class="stringliteral">""</span>; +<a name="l01772"></a>01772 lineBreak = <span class="stringliteral">""</span>; +<a name="l01773"></a>01773 } +<a name="l01775"></a><a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e">01775</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e" title="Return the result.">CStr</a>() { <span class="keywordflow">return</span> buffer.c_str(); } +<a name="l01777"></a><a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d">01777</a> <span class="keywordtype">size_t</span> <a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d" title="Return the length of the result string.">Size</a>() { <span class="keywordflow">return</span> buffer.size(); } +<a name="l01778"></a>01778 +<a name="l01779"></a>01779 <span class="preprocessor"> #ifdef TIXML_USE_STL</span> +<a name="l01781"></a><a class="code" href="classTiXmlPrinter.html#a3bd4daf44309b41f5813a833caa0d1c9">01781</a> <span class="preprocessor"> const std::string& Str() { return buffer; }</span> +<a name="l01782"></a>01782 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> +<a name="l01783"></a>01783 <span class="preprocessor"></span> +<a name="l01784"></a>01784 <span class="keyword">private</span>: +<a name="l01785"></a>01785 <span class="keywordtype">void</span> DoIndent() { +<a name="l01786"></a>01786 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i=0; i<depth; ++i ) +<a name="l01787"></a>01787 buffer += indent; +<a name="l01788"></a>01788 } +<a name="l01789"></a>01789 <span class="keywordtype">void</span> DoLineBreak() { +<a name="l01790"></a>01790 buffer += lineBreak; +<a name="l01791"></a>01791 } <a name="l01792"></a>01792 -<a name="l01793"></a>01793 -<a name="l01794"></a>01794 <span class="preprocessor">#ifdef _MSC_VER</span> -<a name="l01795"></a>01795 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span> -<a name="l01796"></a>01796 <span class="preprocessor"></span><span class="preprocessor">#endif</span> -<a name="l01797"></a>01797 <span class="preprocessor"></span> -<a name="l01798"></a>01798 <span class="preprocessor">#endif</span> -<a name="l01799"></a>01799 <span class="preprocessor"></span> +<a name="l01793"></a>01793 <span class="keywordtype">int</span> depth; +<a name="l01794"></a>01794 <span class="keywordtype">bool</span> simpleTextPrint; +<a name="l01795"></a>01795 TIXML_STRING buffer; +<a name="l01796"></a>01796 TIXML_STRING indent; +<a name="l01797"></a>01797 TIXML_STRING lineBreak; +<a name="l01798"></a>01798 }; +<a name="l01799"></a>01799 +<a name="l01800"></a>01800 +<a name="l01801"></a>01801 <span class="preprocessor">#ifdef _MSC_VER</span> +<a name="l01802"></a>01802 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span> +<a name="l01803"></a>01803 <span class="preprocessor"></span><span class="preprocessor">#endif</span> +<a name="l01804"></a>01804 <span class="preprocessor"></span> +<a name="l01805"></a>01805 <span class="preprocessor">#endif</span> </pre></div></div> <hr size="1"/><address style="text-align: right;"><small>Generated by <a href="http://www.doxygen.org/index.html"> diff --git a/shared/tinyxml/echo.dsp b/shared/tinyxml/echo.dsp deleted file mode 100644 index d81db12e..00000000 --- a/shared/tinyxml/echo.dsp +++ /dev/null @@ -1,113 +0,0 @@ -# Microsoft Developer Studio Project File - Name="echo" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=echo - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "echo.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "echo.mak" CFG="echo - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "echo - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "echo - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "echo - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "echoRelease" -# PROP Intermediate_Dir "echoRelease" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "echo - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "echo___Win32_Debug" -# PROP BASE Intermediate_Dir "echo___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "echoDebug" -# PROP Intermediate_Dir "echoDebug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "echo - Win32 Release" -# Name "echo - Win32 Debug" -# Begin Source File - -SOURCE=.\xmltester\bugtest.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinystr.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinystr.h -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.h -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlerror.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlparser.cpp -# End Source File -# End Target -# End Project diff --git a/shared/tinyxml/tinyXmlTest.dsp b/shared/tinyxml/tinyXmlTest.dsp deleted file mode 100644 index bf4baf02..00000000 --- a/shared/tinyxml/tinyXmlTest.dsp +++ /dev/null @@ -1,92 +0,0 @@ -# Microsoft Developer Studio Project File - Name="tinyXmlTest" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=tinyXmlTest - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "tinyXmlTest.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "tinyXmlTest.mak" CFG="tinyXmlTest - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "tinyXmlTest - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "tinyXmlTest - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "tinyXmlTest - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "tinyXmlTest___Win32_Release" -# PROP BASE Intermediate_Dir "tinyXmlTest___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "tinyXmlTest___Win32_Release" -# PROP Intermediate_Dir "tinyXmlTest___Win32_Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 ./Release/tinyxml.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "tinyXmlTest - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "tinyXmlTest___Win32_Debug" -# PROP BASE Intermediate_Dir "tinyXmlTest___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "tinyXmlTest___Win32_Debug" -# PROP Intermediate_Dir "tinyXmlTest___Win32_Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TUNE" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ./Debug/tinyxmld.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "tinyXmlTest - Win32 Release" -# Name "tinyXmlTest - Win32 Debug" -# Begin Source File - -SOURCE=.\xmltest.cpp -# End Source File -# End Target -# End Project diff --git a/shared/tinyxml/tinyXmlTest.vcproj b/shared/tinyxml/tinyXmlTest.vcproj deleted file mode 100644 index e32ecdff..00000000 --- a/shared/tinyxml/tinyXmlTest.vcproj +++ /dev/null @@ -1,226 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="tinyXmlTest" - ProjectGUID="{34719950-09E8-457E-BE23-8F1CE3A1F1F6}" - TargetFrameworkVersion="131072" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory=".\tinyXmlTest___Win32_Debug" - IntermediateDirectory=".\tinyXmlTest___Win32_Debug" - ConfigurationType="1" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TypeLibraryName=".\tinyXmlTest___Win32_Debug/tinyXmlTest.tlb" - HeaderFileName="" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TUNE;_CRT_SECURE_NO_WARNINGS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.pch" - AssemblerListingLocation=".\tinyXmlTest___Win32_Debug/" - ObjectFile=".\tinyXmlTest___Win32_Debug/" - ProgramDataBaseFileName=".\tinyXmlTest___Win32_Debug/" - BrowseInformation="1" - WarningLevel="4" - SuppressStartupBanner="true" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="./Debug/tinyxmld.lib" - OutputFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.exe" - LinkIncremental="2" - SuppressStartupBanner="true" - GenerateDebugInformation="true" - ProgramDatabaseFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.pdb" - SubSystem="1" - RandomizedBaseAddress="1" - DataExecutionPrevention="0" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory=".\tinyXmlTest___Win32_Release" - IntermediateDirectory=".\tinyXmlTest___Win32_Release" - ConfigurationType="1" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TypeLibraryName=".\tinyXmlTest___Win32_Release/tinyXmlTest.tlb" - HeaderFileName="" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS" - StringPooling="true" - RuntimeLibrary="0" - EnableFunctionLevelLinking="true" - PrecompiledHeaderFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.pch" - AssemblerListingLocation=".\tinyXmlTest___Win32_Release/" - ObjectFile=".\tinyXmlTest___Win32_Release/" - ProgramDataBaseFileName=".\tinyXmlTest___Win32_Release/" - BrowseInformation="1" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="./Release/tinyxml.lib" - OutputFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.exe" - LinkIncremental="1" - SuppressStartupBanner="true" - ProgramDatabaseFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.pdb" - SubSystem="1" - RandomizedBaseAddress="1" - DataExecutionPrevention="0" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <File - RelativePath="xmltest.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/shared/tinyxml/tinyXmlTest.vcxproj b/shared/tinyxml/tinyXmlTest.vcxproj new file mode 100644 index 00000000..573b5543 --- /dev/null +++ b/shared/tinyxml/tinyXmlTest.vcxproj @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{34719950-09E8-457E-BE23-8F1CE3A1F1F6}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Midl> + <TypeLibraryName>.\tinyXmlTest___Win32_Debug/tinyXmlTest.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;TUNE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Midl> + <TypeLibraryName>.\tinyXmlTest___Win32_Release/tinyXmlTest.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> + <SuppressStartupBanner>true</SuppressStartupBanner> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="xmltest.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="tinyxml_lib.vcxproj"> + <Project>{c406daec-0886-4771-8dea-9d7329b46cc1}</Project> + <ReferenceOutputAssembly>false</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/tinyxml/tinyXmlTestSTL.dsp b/shared/tinyxml/tinyXmlTestSTL.dsp deleted file mode 100644 index c4b1926e..00000000 --- a/shared/tinyxml/tinyXmlTestSTL.dsp +++ /dev/null @@ -1,92 +0,0 @@ -# Microsoft Developer Studio Project File - Name="tinyXmlTestSTL" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=tinyXmlTestSTL - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "tinyXmlTestSTL.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "tinyXmlTestSTL.mak" CFG="tinyXmlTestSTL - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "tinyXmlTestSTL - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "tinyXmlTestSTL - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "tinyXmlTestSTL - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "tinyXmlTestSTL___Win32_Release" -# PROP BASE Intermediate_Dir "tinyXmlTestSTL___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "tinyXmlTestSTL___Win32_Release" -# PROP Intermediate_Dir "tinyXmlTestSTL___Win32_Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 ./Release_STL/tinyxml_stl.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "tinyXmlTestSTL - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "tinyXmlTestSTL___Win32_Debug" -# PROP BASE Intermediate_Dir "tinyXmlTestSTL___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "tinyXmlTestSTL___Win32_Debug" -# PROP Intermediate_Dir "tinyXmlTestSTL___Win32_Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /D "TUNE" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ./Debug_STL/tinyxmld_stl.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "tinyXmlTestSTL - Win32 Release" -# Name "tinyXmlTestSTL - Win32 Debug" -# Begin Source File - -SOURCE=.\xmltest.cpp -# End Source File -# End Target -# End Project diff --git a/shared/tinyxml/tinyXmlTestSTL.vcproj b/shared/tinyxml/tinyXmlTestSTL.vcproj deleted file mode 100644 index 482a5aa7..00000000 --- a/shared/tinyxml/tinyXmlTestSTL.vcproj +++ /dev/null @@ -1,225 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="tinyXmlTestSTL" - ProjectGUID="{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}" - TargetFrameworkVersion="131072" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory=".\tinyXmlTestSTL___Win32_Debug" - IntermediateDirectory=".\tinyXmlTestSTL___Win32_Debug" - ConfigurationType="1" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TypeLibraryName=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.tlb" - HeaderFileName="" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TIXML_USE_STL;TUNE;_CRT_SECURE_NO_WARNINGS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.pch" - AssemblerListingLocation=".\tinyXmlTestSTL___Win32_Debug/" - ObjectFile=".\tinyXmlTestSTL___Win32_Debug/" - ProgramDataBaseFileName=".\tinyXmlTestSTL___Win32_Debug/" - BrowseInformation="1" - WarningLevel="4" - SuppressStartupBanner="true" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="./Debug_STL/tinyxmld_stl.lib" - OutputFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.exe" - LinkIncremental="1" - SuppressStartupBanner="true" - GenerateDebugInformation="true" - ProgramDatabaseFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.pdb" - SubSystem="1" - RandomizedBaseAddress="1" - DataExecutionPrevention="0" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory=".\tinyXmlTestSTL___Win32_Release" - IntermediateDirectory=".\tinyXmlTestSTL___Win32_Release" - ConfigurationType="1" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TypeLibraryName=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.tlb" - HeaderFileName="" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;TIXML_USE_STL;_CRT_SECURE_NO_WARNINGS" - StringPooling="true" - RuntimeLibrary="0" - EnableFunctionLevelLinking="true" - PrecompiledHeaderFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.pch" - AssemblerListingLocation=".\tinyXmlTestSTL___Win32_Release/" - ObjectFile=".\tinyXmlTestSTL___Win32_Release/" - ProgramDataBaseFileName=".\tinyXmlTestSTL___Win32_Release/" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="./Release_STL/tinyxml_stl.lib" - OutputFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.exe" - LinkIncremental="1" - SuppressStartupBanner="true" - ProgramDatabaseFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.pdb" - SubSystem="1" - RandomizedBaseAddress="1" - DataExecutionPrevention="0" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <File - RelativePath="xmltest.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/shared/tinyxml/tinyXmlTestSTL.vcxproj b/shared/tinyxml/tinyXmlTestSTL.vcxproj new file mode 100644 index 00000000..71cc6301 --- /dev/null +++ b/shared/tinyxml/tinyXmlTestSTL.vcxproj @@ -0,0 +1,135 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Midl> + <TypeLibraryName>.\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;TIXML_USE_STL;TUNE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Midl> + <TypeLibraryName>.\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;TIXML_USE_STL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> + <SuppressStartupBanner>true</SuppressStartupBanner> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="xmltest.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="tinyxmlSTL.vcxproj"> + <Project>{a3a84737-5017-4577-b8a2-79429a25b8b6}</Project> + <ReferenceOutputAssembly>false</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/tinyxml/tinystr.cpp b/shared/tinyxml/tinystr.cpp index 86377ad1..2e28a874 100644 --- a/shared/tinyxml/tinystr.cpp +++ b/shared/tinyxml/tinystr.cpp @@ -1,6 +1,5 @@ /* www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -22,10 +21,6 @@ must not be misrepresented as being the original software. distribution. */ -/* - * THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005. - */ - #ifndef TIXML_USE_STL diff --git a/shared/tinyxml/tinystr.h b/shared/tinyxml/tinystr.h index b11407a4..9555549f 100644 --- a/shared/tinyxml/tinystr.h +++ b/shared/tinyxml/tinystr.h @@ -1,6 +1,5 @@ /* www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -22,17 +21,6 @@ must not be misrepresented as being the original software. distribution. */ -/* - * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. - * - * - completely rewritten. compact, clean, and fast implementation. - * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems) - * - fixed reserve() to work as per specification. - * - fixed buggy compares operator==(), operator<(), and operator>() - * - fixed operator+=() to take a const ref argument, following spec. - * - added "copy" constructor with length, and most compare operators. - * - added swap(), clear(), size(), capacity(), operator+(). - */ #ifndef TIXML_USE_STL @@ -106,13 +94,11 @@ public : quit(); } - // = operator TiXmlString& operator = (const char* copy) { return assign( copy, (size_type)strlen(copy)); } - // = operator TiXmlString& operator = (const TiXmlString& copy) { return assign(copy.start(), copy.length()); diff --git a/shared/tinyxml/tinyxml.cpp b/shared/tinyxml/tinyxml.cpp index 2b8f17a8..a9c6e22b 100644 --- a/shared/tinyxml/tinyxml.cpp +++ b/shared/tinyxml/tinyxml.cpp @@ -1,6 +1,6 @@ /* www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) +Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -57,10 +57,10 @@ void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) { unsigned char c = (unsigned char) str[i]; - if (c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) { // Hexadecimal character reference. // Pass through unchanged. @@ -191,7 +191,8 @@ TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT ) { delete node; - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } @@ -214,7 +215,8 @@ TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); @@ -233,7 +235,8 @@ TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } @@ -266,7 +269,8 @@ TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& a } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + if ( GetDocument() ) + GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } @@ -548,10 +552,11 @@ TiXmlElement::TiXmlElement( const TiXmlElement& copy) } -void TiXmlElement::operator=( const TiXmlElement& base ) +TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base ) { ClearThis(); base.CopyTo( this ); + return *this; } @@ -674,6 +679,45 @@ int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const } +int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value2 ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + int ival = 0; + int result = node->QueryIntValue( &ival ); + *value2 = (unsigned)ival; + return result; +} + + +int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + int result = TIXML_WRONG_TYPE; + if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) ) + { + *bval = true; + result = TIXML_SUCCESS; + } + else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN ) + || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) ) + { + *bval = false; + result = TIXML_SUCCESS; + } + return result; +} + + + #ifdef TIXML_USE_STL int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const { @@ -921,10 +965,11 @@ TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode } -void TiXmlDocument::operator=( const TiXmlDocument& copy ) +TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy ) { Clear(); copy.CopyTo( this ); + return *this; } @@ -1280,10 +1325,11 @@ TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::T } -void TiXmlComment::operator=( const TiXmlComment& base ) +TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base ) { Clear(); base.CopyTo( this ); + return *this; } @@ -1401,10 +1447,11 @@ TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) } -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) +TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { Clear(); copy.CopyTo( this ); + return *this; } @@ -1416,32 +1463,17 @@ void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) co if ( !version.empty() ) { if ( cfile ) fprintf (cfile, "version=\"%s\" ", version.c_str ()); - if ( str ) - { - (*str) += "version=\""; - (*str) += version; - (*str) += "\" "; - } + if ( str ) { (*str) += "version=\""; (*str) += version; (*str) += "\" "; } } if ( !encoding.empty() ) { if ( cfile ) fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ()); - if ( str ) - { - (*str) += "encoding=\""; - (*str) += encoding; - (*str) += "\" "; - } + if ( str ) { (*str) += "encoding=\""; (*str) += encoding; (*str) += "\" "; } } if ( !standalone.empty() ) { if ( cfile ) fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ()); - if ( str ) - { - (*str) += "standalone=\""; - (*str) += standalone; - (*str) += "\" "; - } + if ( str ) { (*str) += "standalone=\""; (*str) += standalone; (*str) += "\" "; } } if ( cfile ) fprintf( cfile, "?>" ); if ( str ) (*str) += "?>"; @@ -1796,9 +1828,9 @@ bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute else { buffer += ">"; - if (element.FirstChild()->ToText() - && element.LastChild() == element.FirstChild() - && element.FirstChild()->ToText()->CDATA() == false ) + if ( element.FirstChild()->ToText() + && element.LastChild() == element.FirstChild() + && element.FirstChild()->ToText()->CDATA() == false ) { simpleTextPrint = true; // no DoLineBreak()! diff --git a/shared/tinyxml/tinyxml.dsw b/shared/tinyxml/tinyxml.dsw deleted file mode 100644 index 6ff9cfae..00000000 --- a/shared/tinyxml/tinyxml.dsw +++ /dev/null @@ -1,71 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "tinyXmlTest"=.\tinyXmlTest.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name tinyxml - End Project Dependency -}}} - -############################################################################### - -Project: "tinyXmlTestSTL"=.\tinyXmlTestSTL.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name tinyxmlSTL - End Project Dependency -}}} - -############################################################################### - -Project: "tinyxml"=.\tinyxml_lib.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "tinyxmlSTL"=.\tinyxmlSTL.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/shared/tinyxml/tinyxml.h b/shared/tinyxml/tinyxml.h index 226415c9..32801d0f 100644 --- a/shared/tinyxml/tinyxml.h +++ b/shared/tinyxml/tinyxml.h @@ -1,6 +1,6 @@ /* www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) +Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -91,7 +91,7 @@ class TiXmlParsingData; const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 6; -const int TIXML_PATCH_VERSION = 1; +const int TIXML_PATCH_VERSION = 2; /* Internal structure for tracking location of items in the XML file. @@ -146,7 +146,7 @@ public: virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } /// Visit a comment node virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } - /// Visit an unknow node + /// Visit an unknown node virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } }; @@ -689,8 +689,8 @@ public: #endif /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. + The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, + TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. */ int Type() const { return type; } @@ -965,7 +965,7 @@ public: TiXmlElement( const TiXmlElement& ); - void operator=( const TiXmlElement& base ); + TiXmlElement& operator=( const TiXmlElement& base ); virtual ~TiXmlElement(); @@ -998,6 +998,13 @@ public: does not exist, then TIXML_NO_ATTRIBUTE is returned. */ int QueryIntAttribute( const char* name, int* _value ) const; + /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). + int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; + /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). + Note that '1', 'true', or 'yes' are considered true, while '0', 'false' + and 'no' are considered false. + */ + int QueryBoolAttribute( const char* name, bool* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). @@ -1182,7 +1189,7 @@ public: SetValue( _value ); } TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); + TiXmlComment& operator=( const TiXmlComment& base ); virtual ~TiXmlComment() {} @@ -1196,8 +1203,8 @@ public: */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ @@ -1247,7 +1254,7 @@ public: #endif TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } + TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } // Write this text object to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; @@ -1314,7 +1321,7 @@ public: const char* _standalone ); TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); + TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); virtual ~TiXmlDeclaration() {} @@ -1372,7 +1379,7 @@ public: virtual ~TiXmlUnknown() {} TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } + TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } /// Creates a copy of this Unknown and returns it. virtual TiXmlNode* Clone() const; @@ -1381,8 +1388,8 @@ public: virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ @@ -1418,7 +1425,7 @@ public: #endif TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); + TiXmlDocument& operator=( const TiXmlDocument& copy ); virtual ~TiXmlDocument() {} @@ -1658,7 +1665,7 @@ public: TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } /// Copy constructor TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } /// Return a handle to the first child node. TiXmlHandle FirstChild() const; @@ -1823,4 +1830,3 @@ private: #endif #endif - diff --git a/shared/tinyxml/tinyxml.sln b/shared/tinyxml/tinyxml.sln index 394baf2c..b3a4d3d7 100644 --- a/shared/tinyxml/tinyxml.sln +++ b/shared/tinyxml/tinyxml.sln @@ -1,19 +1,13 @@  -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTest", "tinyXmlTest.vcproj", "{34719950-09E8-457E-BE23-8F1CE3A1F1F6}" - ProjectSection(ProjectDependencies) = postProject - {C406DAEC-0886-4771-8DEA-9D7329B46CC1} = {C406DAEC-0886-4771-8DEA-9D7329B46CC1} - EndProjectSection +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTest", "tinyXmlTest.vcxproj", "{34719950-09E8-457E-BE23-8F1CE3A1F1F6}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTestSTL", "tinyXmlTestSTL.vcproj", "{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}" - ProjectSection(ProjectDependencies) = postProject - {A3A84737-5017-4577-B8A2-79429A25B8B6} = {A3A84737-5017-4577-B8A2-79429A25B8B6} - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTestSTL", "tinyXmlTestSTL.vcxproj", "{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml", "tinyxml_lib.vcproj", "{C406DAEC-0886-4771-8DEA-9D7329B46CC1}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml", "tinyxml_lib.vcxproj", "{C406DAEC-0886-4771-8DEA-9D7329B46CC1}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxmlSTL", "tinyxmlSTL.vcproj", "{A3A84737-5017-4577-B8A2-79429A25B8B6}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxmlSTL", "tinyxmlSTL.vcxproj", "{A3A84737-5017-4577-B8A2-79429A25B8B6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/shared/tinyxml/tinyxmlSTL.dsp b/shared/tinyxml/tinyxmlSTL.dsp deleted file mode 100644 index 8f50e449..00000000 --- a/shared/tinyxml/tinyxmlSTL.dsp +++ /dev/null @@ -1,126 +0,0 @@ -# Microsoft Developer Studio Project File - Name="tinyxmlSTL" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=tinyxmlSTL - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "tinyxmlSTL.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "tinyxmlSTL.mak" CFG="tinyxmlSTL - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "tinyxmlSTL - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "tinyxmlSTL - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "tinyxmlSTL - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "tinyxmlSTL___Win32_Release" -# PROP BASE Intermediate_Dir "tinyxmlSTL___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_STL" -# PROP Intermediate_Dir "Release_STL" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "TIXML_USE_STL" /FR /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"Release_STL\tinyxml_STL.lib" - -!ELSEIF "$(CFG)" == "tinyxmlSTL - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "tinyxmlSTL___Win32_Debug0" -# PROP BASE Intermediate_Dir "tinyxmlSTL___Win32_Debug0" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug_STL" -# PROP Intermediate_Dir "Debug_STL" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "TIXML_USE_STL" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"Debug_STL\tinyxmld_STL.lib" - -!ENDIF - -# Begin Target - -# Name "tinyxmlSTL - Win32 Release" -# Name "tinyxmlSTL - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tinystr.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlerror.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlparser.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\tinystr.h -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.h -# End Source File -# End Group -# Begin Source File - -SOURCE=.\changes.txt -# End Source File -# Begin Source File - -SOURCE=.\readme.txt -# End Source File -# End Target -# End Project diff --git a/shared/tinyxml/tinyxmlSTL.vcproj b/shared/tinyxml/tinyxmlSTL.vcproj deleted file mode 100644 index 933dfd67..00000000 --- a/shared/tinyxml/tinyxmlSTL.vcproj +++ /dev/null @@ -1,279 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="tinyxmlSTL" - ProjectGUID="{A3A84737-5017-4577-B8A2-79429A25B8B6}" - TargetFrameworkVersion="131072" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory=".\Debug_STL" - IntermediateDirectory=".\Debug_STL" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB;TIXML_USE_STL;" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile=".\Debug_STL/tinyxmlSTL.pch" - AssemblerListingLocation=".\Debug_STL/" - ObjectFile=".\Debug_STL/" - ProgramDataBaseFileName=".\Debug_STL/" - BrowseInformation="1" - WarningLevel="4" - SuppressStartupBanner="true" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="Debug_STL\tinyxmld_STL.lib" - SuppressStartupBanner="true" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\Debug_STL/tinyxmlSTL.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory=".\Release_STL" - IntermediateDirectory=".\Release_STL" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB;TIXML_USE_STL" - StringPooling="true" - RuntimeLibrary="0" - EnableFunctionLevelLinking="true" - PrecompiledHeaderFile=".\Release_STL/tinyxmlSTL.pch" - AssemblerListingLocation=".\Release_STL/" - ObjectFile=".\Release_STL/" - ProgramDataBaseFileName=".\Release_STL/" - BrowseInformation="1" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="Release_STL\tinyxml_STL.lib" - SuppressStartupBanner="true" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\Release_STL/tinyxmlSTL.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - > - <File - RelativePath="tinystr.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxml.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxmlerror.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxmlparser.cpp" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - > - <File - RelativePath="tinystr.h" - > - </File> - <File - RelativePath="tinyxml.h" - > - </File> - </Filter> - <File - RelativePath="changes.txt" - > - </File> - <File - RelativePath="readme.txt" - > - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/shared/tinyxml/tinyxmlSTL.vcxproj b/shared/tinyxml/tinyxmlSTL.vcxproj new file mode 100644 index 00000000..db7a2fc9 --- /dev/null +++ b/shared/tinyxml/tinyxmlSTL.vcxproj @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{A3A84737-5017-4577-B8A2-79429A25B8B6}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Lib> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Lib> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Lib> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Lib> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="tinystr.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxml.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxmlerror.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxmlparser.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="tinystr.h" /> + <ClInclude Include="tinyxml.h" /> + </ItemGroup> + <ItemGroup> + <None Include="changes.txt" /> + <None Include="readme.txt" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/tinyxml/tinyxml_lib.dsp b/shared/tinyxml/tinyxml_lib.dsp deleted file mode 100644 index 833d3436..00000000 --- a/shared/tinyxml/tinyxml_lib.dsp +++ /dev/null @@ -1,130 +0,0 @@ -# Microsoft Developer Studio Project File - Name="tinyxml" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=tinyxml - Win32 Release -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "tinyxml_lib.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "tinyxml_lib.mak" CFG="tinyxml - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "tinyxml - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "tinyxml - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "tinyxml - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x407 /d "NDEBUG" -# ADD RSC /l 0x407 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"Release\tinyxml.lib" - -!ELSEIF "$(CFG)" == "tinyxml - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x407 /d "_DEBUG" -# ADD RSC /l 0x407 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"Debug\tinyxmld.lib" - -!ENDIF - -# Begin Target - -# Name "tinyxml - Win32 Release" -# Name "tinyxml - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\tinystr.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlerror.cpp -# End Source File -# Begin Source File - -SOURCE=.\tinyxmlparser.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\tinystr.h -# End Source File -# Begin Source File - -SOURCE=.\tinyxml.h -# End Source File -# End Group -# Begin Source File - -SOURCE=.\changes.txt -# End Source File -# Begin Source File - -SOURCE=.\readme.txt -# End Source File -# Begin Source File - -SOURCE=.\tutorial_gettingStarted.txt -# End Source File -# End Target -# End Project diff --git a/shared/tinyxml/tinyxml_lib.vcproj b/shared/tinyxml/tinyxml_lib.vcproj deleted file mode 100644 index 41a9266b..00000000 --- a/shared/tinyxml/tinyxml_lib.vcproj +++ /dev/null @@ -1,284 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="tinyxml" - ProjectGUID="{C406DAEC-0886-4771-8DEA-9D7329B46CC1}" - TargetFrameworkVersion="131072" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Release|Win32" - OutputDirectory=".\Release" - IntermediateDirectory=".\Release" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="true" - RuntimeLibrary="0" - EnableFunctionLevelLinking="true" - PrecompiledHeaderFile=".\Release/tinyxml_lib.pch" - AssemblerListingLocation=".\Release/" - ObjectFile=".\Release/" - ProgramDataBaseFileName=".\Release/" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1031" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="Release\tinyxml.lib" - SuppressStartupBanner="true" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\Release/tinyxml_lib.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Debug|Win32" - OutputDirectory=".\Debug" - IntermediateDirectory=".\Debug" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB;" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile=".\Debug/tinyxml_lib.pch" - AssemblerListingLocation=".\Debug/" - ObjectFile=".\Debug/" - ProgramDataBaseFileName=".\Debug/" - BrowseInformation="1" - WarningLevel="4" - SuppressStartupBanner="true" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1031" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="Debug\tinyxmld.lib" - SuppressStartupBanner="true" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\Debug/tinyxml_lib.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" - > - <File - RelativePath="tinystr.cpp" - > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxml.cpp" - > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxmlerror.cpp" - > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="tinyxmlparser.cpp" - > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl" - > - <File - RelativePath="tinystr.h" - > - </File> - <File - RelativePath="tinyxml.h" - > - </File> - </Filter> - <File - RelativePath="changes.txt" - > - </File> - <File - RelativePath="readme.txt" - > - </File> - <File - RelativePath="tutorial_gettingStarted.txt" - > - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/shared/tinyxml/tinyxml_lib.vcxproj b/shared/tinyxml/tinyxml_lib.vcxproj new file mode 100644 index 00000000..0da3981a --- /dev/null +++ b/shared/tinyxml/tinyxml_lib.vcxproj @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>tinyxml</ProjectName> + <ProjectGuid>{C406DAEC-0886-4771-8DEA-9D7329B46CC1}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0407</Culture> + </ResourceCompile> + <Lib> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Lib> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0407</Culture> + </ResourceCompile> + <Lib> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Lib> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="tinystr.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxml.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxmlerror.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="tinyxmlparser.cpp"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="tinystr.h" /> + <ClInclude Include="tinyxml.h" /> + </ItemGroup> + <ItemGroup> + <None Include="changes.txt" /> + <None Include="readme.txt" /> + <None Include="tutorial_gettingStarted.txt" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/tinyxml/tinyxmlerror.cpp b/shared/tinyxml/tinyxmlerror.cpp index 3034074b..12d90c2a 100644 --- a/shared/tinyxml/tinyxmlerror.cpp +++ b/shared/tinyxml/tinyxmlerror.cpp @@ -31,7 +31,7 @@ distribution. // It also cleans up the code a bit. // -const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = +const char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] = { "No error", "Error", diff --git a/shared/tinyxml/tinyxmlparser.cpp b/shared/tinyxml/tinyxmlparser.cpp index ea691fd4..6b21a2b5 100644 --- a/shared/tinyxml/tinyxmlparser.cpp +++ b/shared/tinyxml/tinyxmlparser.cpp @@ -1,6 +1,6 @@ /* www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) +Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -40,7 +40,7 @@ distribution. // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries // or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = { { "&", 5, '&' }, { "<", 4, '<' }, @@ -100,10 +100,7 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng else if ( input < 0x200000 ) *length = 4; else - { - *length = 0; // This code won't covert this correctly anyway. - return; - } + { *length = 0; return; } // This code won't covert this correctly anyway. output += *length; @@ -177,10 +174,7 @@ class TiXmlParsingData public: void Stamp( const char* now, TiXmlEncoding encoding ); - const TiXmlCursor& Cursor() - { - return cursor; - } + const TiXmlCursor& Cursor() const { return cursor; } private: // Only used by the document! @@ -281,10 +275,7 @@ void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) p += 3; else - { - p +=3; // A normal character. - ++col; - } + { p +=3; ++col; } // A normal character. } } else @@ -425,8 +416,8 @@ const char* TiXmlBase::ReadName( const char* p, TIXML_STRING* name, TiXmlEncodin // After that, they can be letters, underscores, numbers, // hyphens, or colons. (Colons are valid ony for namespaces, // but tinyxml can't tell namespaces from names.) - if (p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) + if ( p && *p + && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) { const char* start = p; while( p && *p @@ -592,8 +583,8 @@ const char* TiXmlBase::ReadText( const char* p, TiXmlEncoding encoding ) { *text = ""; - if (!trimWhiteSpace // certain tags always keep whitespace - || !condenseWhiteSpace ) // if true, whitespace is always kept + if ( !trimWhiteSpace // certain tags always keep whitespace + || !condenseWhiteSpace ) // if true, whitespace is always kept { // Keep all the white space. while ( p && *p @@ -646,7 +637,7 @@ const char* TiXmlBase::ReadText( const char* p, } if ( p && *p ) p += strlen( endTag ); - return p; + return ( p && *p ) ? p : 0; } #ifdef TIXML_USE_STL @@ -778,8 +769,8 @@ const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiX } // Did we get encoding info? - if (encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) + if ( encoding == TIXML_ENCODING_UNKNOWN + && node->ToDeclaration() ) { TiXmlDeclaration* dec = node->ToDeclaration(); const char* enc = dec->Encoding(); @@ -888,8 +879,8 @@ TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) #endif returnNode = new TiXmlUnknown(); } - else if (IsAlpha( *(p+1), encoding ) - || *(p+1) == '_' ) + else if ( IsAlpha( *(p+1), encoding ) + || *(p+1) == '_' ) { #ifdef DEBUG_PARSER TIXML_LOG( "XML parsing Element\n" ); @@ -939,8 +930,8 @@ void TiXmlElement::StreamIn (std::istream* in, TIXML_STRING* tag) // Okay...if we are a "/>" tag, then we're done. We've read a complete tag. // If not, identify and stream. - if (tag->at( tag->length() - 1 ) == '>' - && tag->at( tag->length() - 2 ) == '/' ) + if ( tag->at( tag->length() - 1 ) == '>' + && tag->at( tag->length() - 2 ) == '/' ) { // All good! return; @@ -1315,9 +1306,10 @@ const char* TiXmlUnknown::Parse( const char* p, TiXmlParsingData* data, TiXmlEnc if ( !p ) { - if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding ); + if ( document ) + document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding ); } - if ( *p == '>' ) + if ( p && *p == '>' ) return p+1; return p; } @@ -1367,7 +1359,8 @@ const char* TiXmlComment::Parse( const char* p, TiXmlParsingData* data, TiXmlEnc if ( !StringEqual( p, startTag, false, encoding ) ) { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); + if ( document ) + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); return 0; } p += strlen( startTag ); @@ -1532,7 +1525,8 @@ const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncodi if ( !StringEqual( p, startTag, false, encoding ) ) { - document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); + if ( document ) + document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); return 0; } p += strlen( startTag ); @@ -1556,7 +1550,7 @@ const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncodi const char* end = "<"; p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) + if ( p && *p ) return p-1; // don't truncate the '<' return 0; } diff --git a/shared/tinyxml/xmltest.cpp b/shared/tinyxml/xmltest.cpp index b4d3551c..7d920466 100644 --- a/shared/tinyxml/xmltest.cpp +++ b/shared/tinyxml/xmltest.cpp @@ -69,6 +69,19 @@ bool XmlTest( const char* testString, int expected, int found, bool noEcho ) } +void NullLineEndings( char* p ) +{ + while( p && *p ) + { + if ( *p == '\n' || *p == '\r' ) + { + *p = 0; + return; + } + ++p; + } +} + // // This file demonstrates some basic functionality of TinyXml. // Note that the example is very contrived. It presumes you know @@ -590,20 +603,30 @@ int main() FILE* saved = fopen( "utf8testout.xml", "r" ); FILE* verify = fopen( "utf8testverify.xml", "r" ); + + //bool firstLineBOM=true; if ( saved && verify ) { while ( fgets( verifyBuf, 256, verify ) ) { fgets( savedBuf, 256, saved ); - if ( strcmp( verifyBuf, savedBuf ) ) + NullLineEndings( verifyBuf ); + NullLineEndings( savedBuf ); + + if ( /*!firstLineBOM && */ strcmp( verifyBuf, savedBuf ) ) { + printf( "verify:%s<\n", verifyBuf ); + printf( "saved :%s<\n", savedBuf ); okay = 0; break; } + //firstLineBOM = false; } + } + if ( saved ) fclose( saved ); + if ( verify ) fclose( verify ); - } XmlTest( "UTF-8: Verified multi-language round trip.", 1, okay ); // On most Western machines, this is an element that contains @@ -1327,6 +1350,13 @@ int main() } { + // This one must not result in an infinite loop + TiXmlDocument xml; + xml.Parse( "<infinite>loop" ); + XmlTest( "Infinite loop test.", true, true ); + } + + { // 1709904 - can not repro the crash { TiXmlDocument xml; @@ -1355,6 +1385,7 @@ int main() xml.Print(stdout); } */ + #if defined( WIN32 ) && defined( TUNE ) _CrtMemCheckpoint( &endMemState ); //_CrtMemDumpStatistics( &endMemState ); diff --git a/shared/util.cpp b/shared/util.cpp index 7ab5b4e7..ab0b5a44 100644 --- a/shared/util.cpp +++ b/shared/util.cpp @@ -13,17 +13,18 @@ #include "file_handling.h" #include "string_conv.h" #include <stdexcept> -#include "system_func.h" +#include "last_error.h" #include "check_exist.h" #include "assert_static.h" #include "system_constants.h" +#include "global_func.h" #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" #endif -wxString ffs3::extractJobName(const wxString& configFilename) +wxString zen::extractJobName(const wxString& configFilename) { using namespace common; @@ -33,29 +34,22 @@ wxString ffs3::extractJobName(const wxString& configFilename) } -wxString ffs3::formatFilesizeToShortString(const wxLongLong& filesize) +wxString zen::formatFilesizeToShortString(zen::UInt64 size) { - return ffs3::formatFilesizeToShortString(filesize.ToDouble()); -} - - -wxString ffs3::formatFilesizeToShortString(const wxULongLong& filesize) -{ - return ffs3::formatFilesizeToShortString(filesize.ToDouble()); -} - + if (to<zen::Int64>(size) < 0) return _("Error"); -wxString ffs3::formatFilesizeToShortString(double filesize) -{ - if (filesize < 0) - return _("Error"); - - wxString output = _("%x Bytes"); - - if (filesize > 999) + if (size <= 999U) { + wxString output = _P("1 Byte", "%x Bytes", to<int>(size)); + output.Replace(wxT("%x"), zen::toStringSep(size)); //no decimal places in case of bytes + return output; + } + else + { + double filesize = to<double>(size); + filesize /= 1024; - output = _("%x kB"); + wxString output = _("%x KB"); if (filesize > 999) { filesize /= 1024; @@ -82,19 +76,14 @@ wxString ffs3::formatFilesizeToShortString(double filesize) return _("Error"); output.Replace(wxT("%x"), wxString::Format(wxT("%.*f"), static_cast<int>(3 - leadDigitCount), filesize)); + return output; } - else - { - output.Replace(wxT("%x"), common::numberToString(static_cast<int>(filesize))); //no decimal places in case of bytes - } - - return output; } -wxString ffs3::formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor) +wxString zen::formatPercentage(zen::Int64 dividend, zen::Int64 divisor) { - const double ratio = divisor != 0 ? dividend.ToDouble() * 100 / divisor.ToDouble() : 0; + const double ratio = divisor != 0 ? to<double>(dividend) * 100.0 / to<double>(divisor) : 0; wxString output = _("%x%"); output.Replace(wxT("%x"), wxString::Format(wxT("%3.2f"), ratio), false); return output; @@ -105,13 +94,13 @@ wxString ffs_Impl::includeNumberSeparator(const wxString& number) { wxString output(number); for (size_t i = output.size(); i > 3; i -= 3) - output.insert(i - 3, ffs3::getThousandsSeparator()); + output.insert(i - 3, zen::getThousandsSeparator()); return output; } -void ffs3::scrollToBottom(wxScrolledWindow* scrWindow) +void zen::scrollToBottom(wxScrolledWindow* scrWindow) { int height = 0; scrWindow->GetClientSize(NULL, &height); @@ -149,28 +138,28 @@ bool isVistaOrLater() } -wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime) +wxString zen::utcTimeToLocalString(zen::Int64 utcTime) { #ifdef FFS_WIN //convert ansi C time to FILETIME - wxLongLong fileTimeLong(utcTime); - fileTimeLong += wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - fileTimeLong *= 10000000; + zen::UInt64 fileTimeLong = to<zen::UInt64>(utcTime + //may be < 0 + zen::Int64(3054539008UL, 2)); //timeshift between ansi C time and FILETIME in seconds == 11644473600s + fileTimeLong *= 10000000U; FILETIME lastWriteTimeUtc = {}; - lastWriteTimeUtc.dwLowDateTime = fileTimeLong.GetLo(); //GetLo() returns unsigned - lastWriteTimeUtc.dwHighDateTime = static_cast<DWORD>(fileTimeLong.GetHi()); //GetHi() returns signed + lastWriteTimeUtc.dwLowDateTime = fileTimeLong.getLo(); + lastWriteTimeUtc.dwHighDateTime = fileTimeLong.getHi(); - assert(fileTimeLong.GetHi() >= 0); - assert_static(sizeof(DWORD) == sizeof(long)); - assert_static(sizeof(long) == 4); + //dates less than a few (let's say 13) hours after 1.1.1601 cause conversion errors in ::SystemTimeToTzSpecificLocalTime() if timezone is subtracted! + if (lastWriteTimeUtc.dwHighDateTime < 110) + return _("Error"); SYSTEMTIME systemTimeLocal = {}; static const bool useNewLocalTimeCalculation = isVistaOrLater(); if (useNewLocalTimeCalculation) //use DST setting from source date (like in Windows 7, see http://msdn.microsoft.com/en-us/library/ms724277(VS.85).aspx) { - if (lastWriteTimeUtc.dwHighDateTime > 0x7FFFFFFF) + if (lastWriteTimeUtc.dwHighDateTime >= 0x80000000) return _("Error"); SYSTEMTIME systemTimeUtc = {}; @@ -178,7 +167,8 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime) &lastWriteTimeUtc, //__in const FILETIME *lpFileTime, &systemTimeUtc)) //__out LPSYSTEMTIME lpSystemTime throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" FILETIME -> SYSTEMTIME: ") + - wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") + + wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") + + wxT("UTC FILETIME: ") + toString<wxString>(fileTimeLong) + wxT(") ") + wxT("\n\n") + getLastErrorFormatted()).ToAscii())); if (!::SystemTimeToTzSpecificLocalTime( @@ -186,29 +176,39 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime) &systemTimeUtc, //__in LPSYSTEMTIME lpUniversalTime, &systemTimeLocal)) //__out LPSYSTEMTIME lpLocalTime throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" SYSTEMTIME -> local SYSTEMTIME: ") + - wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") + + wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT("\n") + + wxT("UTC System time: ") + + toString<wxString>(systemTimeUtc.wYear) + wxT(" ") + + toString<wxString>(systemTimeUtc.wMonth) + wxT(" ") + + toString<wxString>(systemTimeUtc.wDay) + wxT(" ") + + toString<wxString>(systemTimeUtc.wHour) + wxT(" ") + + toString<wxString>(systemTimeUtc.wMinute) + wxT(" ") + + toString<wxString>(systemTimeUtc.wSecond) + wxT(")") + wxT("\n\n") + getLastErrorFormatted()).ToAscii())); } - else //use current DST setting (like in Windows 2000 and XP) + else //use DST setting (like in Windows 2000 and XP) { FILETIME fileTimeLocal = {}; if (!::FileTimeToLocalFileTime( //convert to local time &lastWriteTimeUtc, //pointer to UTC file time to convert &fileTimeLocal)) //pointer to converted file time throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") + - wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") + + wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") + + wxT("UTC FILETIME: ") + toString<wxString>(fileTimeLong) + wxT(") ") + wxT("\n\n") + getLastErrorFormatted()).ToAscii())); - if (fileTimeLocal.dwHighDateTime > 0x7FFFFFFF) + if (fileTimeLocal.dwHighDateTime >= 0x80000000) return _("Error"); //this actually CAN happen if UTC time is just below this border and ::FileTimeToLocalFileTime() adds 2 hours due to DST or whatever! //Testcase (UTC): dateHigh = 2147483647 (=0x7fffffff) -> year 30000 // dateLow = 4294967295 - if (!::FileTimeToSystemTime( - &fileTimeLocal, //pointer to file time to convert - &systemTimeLocal)) //pointer to structure to receive system time + if (!::FileTimeToSystemTime(&fileTimeLocal, //pointer to file time to convert + &systemTimeLocal)) //pointer to structure to receive system time throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" local FILETIME -> local SYSTEMTIME: ") + - wxT("(") + wxULongLong(fileTimeLocal.dwHighDateTime, fileTimeLocal.dwLowDateTime).ToString() + wxT(") ") + + wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") + + wxT("local FILETIME: ") + + wxT("High: ") + toString<wxString>(fileTimeLocal.dwHighDateTime) + + wxT("Low: ") + toString<wxString>(fileTimeLocal.dwLowDateTime) + wxT(") ") + wxT("\n\n") + getLastErrorFormatted()).ToAscii())); } @@ -220,9 +220,8 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime) systemTimeLocal.wSecond); #elif defined FFS_LINUX - tm* timeinfo; - const time_t fileTime = utcTime.ToLong(); - timeinfo = localtime(&fileTime); //convert to local time + const time_t fileTime = to<time_t>(utcTime); + const tm* timeinfo = ::localtime(&fileTime); //convert to local time /* char buffer[50]; diff --git a/shared/util.h b/shared/util.h index 90a73094..2c9af176 100644 --- a/shared/util.h +++ b/shared/util.h @@ -8,31 +8,45 @@ #define UTIL_H_INCLUDED #include <wx/string.h> -#include <wx/longlong.h> #include <wx/textctrl.h> #include <wx/filepicker.h> #include <wx/combobox.h> #include <wx/scrolwin.h> +#include <wx/choice.h> #include "zstring.h" -#include "global_func.h" +#include "string_tools.h" +#include "int64.h" - -namespace ffs3 +namespace zen { wxString extractJobName(const wxString& configFilename); -wxString formatFilesizeToShortString(const wxLongLong& filesize); -wxString formatFilesizeToShortString(const wxULongLong& filesize); -wxString formatFilesizeToShortString(double filesize); - -wxString formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor); +wxString formatFilesizeToShortString(zen::UInt64 filesize); +wxString formatPercentage(zen::Int64 dividend, zen::Int64 divisor); template <class NumberType> -wxString numberToStringSep(NumberType number); //convert number to wxString including thousands separator +wxString toStringSep(NumberType number); //convert number to wxString including thousands separator void scrollToBottom(wxScrolledWindow* scrWindow); -wxString utcTimeToLocalString(const wxLongLong& utcTime); //throw std::runtime_error +wxString utcTimeToLocalString(zen::Int64 utcTime); //throw std::runtime_error + + +//handle mapping of enum values to wxChoice controls +template <class Enum> +struct EnumDescrList +{ + EnumDescrList& add(Enum value, const wxString& text, const wxString& tooltip = wxEmptyString) + { + descrList.push_back(std::make_pair(value, std::make_pair(text, tooltip))); + return *this; + } + typedef std::vector<std::pair<Enum, std::pair<wxString, wxString> > > DescrList; + DescrList descrList; +}; +template <class Enum> void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value); +template <class Enum> Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl); +template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl); } @@ -69,23 +83,59 @@ wxString includeNumberSeparator(const wxString& number); } -namespace ffs3 +namespace zen { -//wxULongLongNative doesn't support operator<<(std::ostream&, wxULongLongNative) -template <> +template <class NumberType> inline -wxString numberToStringSep(wxULongLongNative number) +wxString toStringSep(NumberType number) { - return ffs_Impl::includeNumberSeparator(number.ToString()); + return ffs_Impl::includeNumberSeparator(zen::toString<wxString>(number)); } +template <class Enum> +void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value) +{ + ctrl.Clear(); + + int selectedPos = 0; + for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i) + { + ctrl.Append(i->second.first); + if (i->first == value) + { + selectedPos = i - mapping.descrList.begin(); + + if (!i->second.second.empty()) + ctrl.SetToolTip(i->second.second); + } + } + + ctrl.SetSelection(selectedPos); +} -template <class NumberType> -inline -wxString numberToStringSep(NumberType number) +template <class Enum> +Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl) { - return ffs_Impl::includeNumberSeparator(common::numberToString(number)); + const int selectedPos = ctrl.GetSelection(); + + if (0 <= selectedPos && selectedPos < static_cast<int>(mapping.descrList.size())) + return mapping.descrList[selectedPos].first; + else + { + assert(false); + return Enum(0); + } } + +template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl) +{ + const Enum value = getEnumVal(mapping, ctrl); + + for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i) + if (i->first == value) + ctrl.SetToolTip(i->second.second); +} + } diff --git a/shared/xml_base.cpp b/shared/xml_base.cpp index 3f2a9e48..efed738a 100644 --- a/shared/xml_base.cpp +++ b/shared/xml_base.cpp @@ -9,30 +9,10 @@ #include "i18n.h" #include "string_conv.h" #include "system_constants.h" -#include <boost/scoped_array.hpp> #include "file_handling.h" -using namespace ffs3; - - -std::string getTypeName(xmlAccess::XmlType type) -{ - switch (type) - { - case xmlAccess::XML_GUI_CONFIG: - return "GUI"; - case xmlAccess::XML_BATCH_CONFIG: - return "BATCH"; - case xmlAccess::XML_GLOBAL_SETTINGS: - return "GLOBAL"; - case xmlAccess::XML_REAL_CONFIG: - return "REAL"; - case xmlAccess::XML_OTHER: - break; - } - assert(false); - return "OTHER"; -} +using namespace zen; +using namespace xmlAccess; namespace @@ -44,9 +24,9 @@ void normalize(std::vector<char>& stream) for (std::vector<char>::const_iterator i = stream.begin(); i != stream.end(); ++i) switch (*i) { - case 0xD: - tmp.push_back(0xA); - if (i + 1 != stream.end() && *(i + 1) == 0xA) + case '\xD': + tmp.push_back('\xA'); + if (i + 1 != stream.end() && *(i + 1) == '\xA') ++i; break; default: @@ -57,105 +37,55 @@ void normalize(std::vector<char>& stream) } -void loadRawXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError() +void parseRawXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError() { - using xmlAccess::XmlError; - - const size_t BUFFER_SIZE = 2 * 1024 * 1024; //maximum size of a valid FreeFileSync XML file! - - std::vector<char> inputBuffer; - inputBuffer.resize(BUFFER_SIZE); + const zen::UInt64 fs = zen::getFilesize(wxToZ(filename)); try { + { + //quick test whether input is an XML: avoid loading large binary files up front! + std::string xmlBegin = "<?xml version="; + std::vector<char> buffer(xmlBegin.size()); + + FileInput inputFile(wxToZ(filename)); //throw (FileError); + const size_t bytesRead = inputFile.read(&buffer[0], buffer.size()); //throw (FileError) + if (bytesRead < xmlBegin.size() || !std::equal(buffer.begin(), buffer.end(), xmlBegin.begin())) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); + } + + std::vector<char> buffer(to<size_t>(fs) + 1); //inc. null-termination (already set!) + FileInput inputFile(wxToZ(filename)); //throw (FileError); - const size_t bytesRead = inputFile.read(&inputBuffer[0], inputBuffer.size()); //throw (FileError) + const size_t bytesRead = inputFile.read(&buffer[0], to<size_t>(fs)); //throw (FileError) + if (bytesRead < to<size_t>(fs)) + { + wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + filename + wxT("\""); + throw XmlError(errorMessage + wxT("\n\n")); + } - if (bytesRead == 0 || bytesRead >= inputBuffer.size()) //treat XML files larger than 2 MB as erroneous: loading larger files just wastes CPU + memory - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); + //convert (0xD, 0xA) and (0xD) to (0xA): just like in TiXmlDocument::LoadFile(); not sure if actually needed + normalize(buffer); - inputBuffer.resize(bytesRead + 1); - inputBuffer[bytesRead] = 0; //set null-termination!!!! + document.Parse(&buffer[0], 0, TIXML_ENCODING_UTF8); //respect null-termination! } catch (const FileError& error) //more detailed error messages than with wxWidgets { throw XmlError(error.msg()); } - - //convert (0xD, 0xA) and (0xD) to (0xA): just like in TiXmlDocument::LoadFile(); not sure if actually needed - normalize(inputBuffer); - - document.Parse(&inputBuffer[0], 0, TIXML_DEFAULT_ENCODING); //respect null-termination! - - TiXmlElement* root = document.RootElement(); - - if (root && (root->ValueStr() == std::string("FreeFileSync"))) //check for FFS configuration xml - return; //finally... success! - - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); } } -xmlAccess::XmlType xmlAccess::getXmlType(const wxString& filename) //throw() -{ - try - { - TiXmlDocument doc; - ::loadRawXmlDocument(filename, doc); //throw XmlError() - - TiXmlElement* root = doc.RootElement(); - if (root) - { - const char* cfgType = root->Attribute("XmlType"); - if (cfgType) - { - const std::string type(cfgType); - - if (type == getTypeName(XML_GUI_CONFIG)) - return XML_GUI_CONFIG; - else if (type == getTypeName(XML_BATCH_CONFIG)) - return XML_BATCH_CONFIG; - else if (type == getTypeName(XML_GLOBAL_SETTINGS)) - return XML_GLOBAL_SETTINGS; - else if (type == getTypeName(XML_REAL_CONFIG)) - return XML_REAL_CONFIG; - } - } - } - catch (const XmlError&) {} - - return XML_OTHER; -} - - -void xmlAccess::loadXmlDocument(const wxString& filename, const xmlAccess::XmlType type, TiXmlDocument& document) //throw XmlError() +void xmlAccess::loadXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError() { TiXmlBase::SetCondenseWhiteSpace(false); //do not condense whitespace characters - ::loadRawXmlDocument(filename, document); //throw XmlError() + ::parseRawXmlDocument(filename, document); //throw XmlError() TiXmlElement* root = document.RootElement(); - if (root) - { - const char* cfgType = root->Attribute("XmlType"); - if (cfgType && std::string(cfgType) == getTypeName(type)) - return; //finally... success! - } - - throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); -} - - -void xmlAccess::getDefaultXmlDocument(const XmlType type, TiXmlDocument& document) -{ - TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument! - document.LinkEndChild(decl); - - TiXmlElement* root = new TiXmlElement("FreeFileSync"); - root->SetAttribute("XmlType", getTypeName(type)); //xml configuration type - - document.LinkEndChild(root); + if (!root) + throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); } @@ -165,18 +95,18 @@ bool saveNecessary(const Zstring& filename, const std::string& dataToWrite) //th { try { - if (ffs3::getFilesize(filename) != static_cast<unsigned long>(dataToWrite.size())) //throw (FileError); + if (zen::getFilesize(filename) != static_cast<unsigned long>(dataToWrite.size())) //throw (FileError); return true; - boost::scoped_array<char> inputBuffer(new char[dataToWrite.size() + 1]); //+ 1 in order to test for end of file! + std::vector<char> inputBuffer(dataToWrite.size() + 1); //+ 1 in order to test for end of file! FileInput inputFile(filename); //throw (FileError); - const size_t bytesRead = inputFile.read(inputBuffer.get(), dataToWrite.size() + 1); //throw (FileError) + const size_t bytesRead = inputFile.read(&inputBuffer[0], inputBuffer.size()); //throw (FileError) if (bytesRead != dataToWrite.size()) //implicit test for eof! return true; - return ::memcmp(inputBuffer.get(), dataToWrite.c_str(), dataToWrite.size()) != 0; + return ::memcmp(&inputBuffer[0], dataToWrite.c_str(), dataToWrite.size()) != 0; } catch (const FileError&) { @@ -260,21 +190,21 @@ bool xmlAccess::readXmlElement(const std::string& name, const TiXmlElement* pare { if (parent) { - output.clear(); - //load elements - const TiXmlElement* element = parent->FirstChildElement(name); - while (element) + const TiXmlElement* xmlList = parent->FirstChildElement(name); + if (xmlList) { - const char* text = element->GetText(); - if (text) //may be NULL!! - output.push_back(wxString::FromUTF8(text)); - else - output.push_back(wxEmptyString); - - element = element->NextSiblingElement(); + output.clear(); + for (const TiXmlElement* item = xmlList->FirstChildElement("Item"); item != NULL; item = item->NextSiblingElement()) + { + const char* text = item->GetText(); + if (text) //may be NULL!! + output.push_back(wxString::FromUTF8(text)); + else + output.push_back(wxEmptyString); + } + return true; } - return true; } return false; @@ -351,8 +281,14 @@ void xmlAccess::addXmlElement(const std::string& name, const bool value, TiXmlEl void xmlAccess::addXmlElement(const std::string& name, const std::vector<wxString>& value, TiXmlElement* parent) { - for (std::vector<wxString>::const_iterator i = value.begin(); i != value.end(); ++i) - addXmlElement(name, std::string(i->ToUTF8()), parent); + if (parent) + { + TiXmlElement* xmlList= new TiXmlElement(name); + parent->LinkEndChild(xmlList); + + for (std::vector<wxString>::const_iterator i = value.begin(); i != value.end(); ++i) + addXmlElement("Item", std::string(i->ToUTF8()), xmlList); + } } @@ -378,21 +314,15 @@ void xmlAccess::addXmlAttribute(const std::string& name, const bool value, TiXml } -using xmlAccess::XmlParser; +using xmlAccess::XmlErrorLogger; -void XmlParser::logError(const std::string& nodeName) +void XmlErrorLogger::logError(const std::string& nodeName) { failedNodes.push_back(wxString::FromUTF8(nodeName.c_str())); } -bool XmlParser::errorsOccurred() const -{ - return !failedNodes.empty(); -} - - -const wxString XmlParser::getErrorMessageFormatted() const +const wxString XmlErrorLogger::getErrorMessageFormatted() const { wxString errorMessage = wxString(_("Could not read values for the following XML nodes:")) + wxT("\n"); for (std::vector<wxString>::const_iterator i = failedNodes.begin(); i != failedNodes.end(); ++i) diff --git a/shared/xml_base.h b/shared/xml_base.h index 44650ec9..337bfbd8 100644 --- a/shared/xml_base.h +++ b/shared/xml_base.h @@ -7,33 +7,33 @@ #ifndef XMLBASE_H_INCLUDED #define XMLBASE_H_INCLUDED -#include "tinyxml/tinyxml.h" -#include "global_func.h" #include <string> #include <vector> +#include "tinyxml/tinyxml.h" +#include "string_tools.h" #include <wx/string.h> #include "xml_error.h" namespace xmlAccess { +/* Init XML document: -enum XmlType -{ - XML_GUI_CONFIG, - XML_BATCH_CONFIG, - XML_GLOBAL_SETTINGS, - XML_REAL_CONFIG, - XML_OTHER -}; - -XmlType getXmlType(const wxString& filename); //throw() + TiXmlDocument doc; + TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); + doc.LinkEndChild(decl); //ownership passed -void loadXmlDocument(const wxString& fileName, const XmlType type, TiXmlDocument& document); //throw (XmlError) -void getDefaultXmlDocument(const XmlType type, TiXmlDocument& document); + TiXmlElement* root = new TiXmlElement("HeaderName"); + doc.LinkEndChild(root); +*/ +void loadXmlDocument(const wxString& fileName, TiXmlDocument& document); //throw (XmlError) void saveXmlDocument(const wxString& fileName, const TiXmlDocument& document); //throw (XmlError) +#ifndef TIXML_USE_STL +#error we need this macro +#endif + //------------------------------------------------------------------------------------------ //small helper functions @@ -44,13 +44,6 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, wxStrin bool readXmlElement(const std::string& name, const TiXmlElement* parent, bool& output); bool readXmlElement(const std::string& name, const TiXmlElement* parent, std::vector<wxString>& output); - -template <class T> -bool readXmlAttribute(const std::string& name, const TiXmlElement* node, T& output); -bool readXmlAttribute(const std::string& name, const TiXmlElement* node, std::string& output); -bool readXmlAttribute(const std::string& name, const TiXmlElement* node, wxString& output); -bool readXmlAttribute(const std::string& name, const TiXmlElement* node, bool& output); - template <class T> void addXmlElement(const std::string& name, T value, TiXmlElement* parent); void addXmlElement(const std::string& name, const std::string& value, TiXmlElement* parent); @@ -59,6 +52,12 @@ void addXmlElement(const std::string& name, const bool value, TiXmlEleme void addXmlElement(const std::string& name, const std::vector<wxString>& value, TiXmlElement* parent); template <class T> +bool readXmlAttribute(const std::string& name, const TiXmlElement* node, T& output); +bool readXmlAttribute(const std::string& name, const TiXmlElement* node, std::string& output); +bool readXmlAttribute(const std::string& name, const TiXmlElement* node, wxString& output); +bool readXmlAttribute(const std::string& name, const TiXmlElement* node, bool& output); + +template <class T> void addXmlAttribute(const std::string& name, T value, TiXmlElement* node); void addXmlAttribute(const std::string& name, const std::string& value, TiXmlElement* node); void addXmlAttribute(const std::string& name, const wxString& value, TiXmlElement* node); @@ -66,16 +65,15 @@ void addXmlAttribute(const std::string& name, const bool value, TiXmlEle -class XmlParser +class XmlErrorLogger { public: - XmlParser(const TiXmlElement* rootElement) : root(rootElement) {} + virtual ~XmlErrorLogger() {} void logError(const std::string& nodeName); - bool errorsOccurred() const; + bool errorsOccurred() const { return !failedNodes.empty(); } const wxString getErrorMessageFormatted() const; -protected: //another level of indirection: if errors occur during xml parsing they are logged template <class T> void readXmlElementLogging(const std::string& name, const TiXmlElement* parent, T& output) @@ -91,13 +89,7 @@ protected: logError(name); } - const TiXmlElement* const getRoot() const - { - return root; - } - private: - const TiXmlElement* const root; std::vector<wxString> failedNodes; }; } @@ -113,10 +105,7 @@ public: return TiXmlHandleConst(m_element != NULL ? m_element->FirstChildElement(name) : NULL); } - const TiXmlElement* ToElement() const - { - return m_element; - } + const TiXmlElement* ToElement() const { return m_element; } private: const TiXmlElement* const m_element; @@ -172,7 +161,7 @@ bool xmlAccess::readXmlElement(const std::string& name, const TiXmlElement* pare if (!readXmlElement(name, parent, temp)) return false; - output = common::stringToNumber<T>(temp); + output = zen::toNumber<T>(temp); return true; } @@ -181,7 +170,7 @@ template <class T> inline void xmlAccess::addXmlElement(const std::string& name, T value, TiXmlElement* parent) { - addXmlElement(name, common::numberToString<std::string::value_type>(value), parent); + addXmlElement(name, zen::toString<std::string>(value), parent); } @@ -192,7 +181,7 @@ bool xmlAccess::readXmlAttribute(const std::string& name, const TiXmlElement* no std::string dummy; if (readXmlAttribute(name, node, dummy)) { - output = common::stringToNumber<T>(dummy); + output = zen::toNumber<T>(dummy); return true; } else @@ -204,7 +193,7 @@ template <class T> inline void xmlAccess::addXmlAttribute(const std::string& name, T value, TiXmlElement* node) { - addXmlAttribute(name, common::numberToString<std::string::value_type>(value), node); + addXmlAttribute(name, zen::toString<std::string>(value), node); } #endif // XMLBASE_H_INCLUDED diff --git a/shared/zbase.h b/shared/zbase.h index f08a87e3..5bc43295 100644 --- a/shared/zbase.h +++ b/shared/zbase.h @@ -7,14 +7,11 @@ #ifndef Z_BASE_H_INCLUDED #define Z_BASE_H_INCLUDED -#include <cstddef> //size_t -#include <cctype> //isspace -#include <cwctype> //iswspace #include <cassert> #include <vector> #include <sstream> #include <algorithm> - +#include "string_tools.h" /* Allocator Policy: @@ -25,15 +22,8 @@ Allocator Policy: class AllocatorFreeStore //same performance characterisics like malloc()/free() { public: - static void* allocate(size_t size) //throw (std::bad_alloc) - { - return ::operator new(size); - } - - static void deallocate(void* ptr) - { - ::operator delete(ptr); - } + static void* allocate(size_t size) { return ::operator new(size); } //throw (std::bad_alloc) + static void deallocate(void* ptr) { ::operator delete(ptr); } }; @@ -219,10 +209,12 @@ class Zbase : public SP<T, AP> { public: Zbase(); - Zbase(T source); Zbase(const T* source); Zbase(const T* source, size_t length); Zbase(const Zbase& source); + explicit Zbase(T source); //dangerous if implicit: T buffer[]; Zbase name = buffer; ups... + //allow explicit construction from different string type, prevent ambiguity via SFINAE + template <class S> explicit Zbase(const S& other, typename S::value_type = 0); ~Zbase(); operator const T* () const; //implicit conversion to C-string @@ -239,20 +231,25 @@ public: T* end(); //wxString-like functions - bool StartsWith(const Zbase& prefix) const; - bool StartsWith(const T* prefix) const; - bool StartsWith(T prefix) const; - bool EndsWith(const Zbase& postfix) const; - bool EndsWith(const T* postfix) const; - bool EndsWith(T postfix) const; - Zbase& Truncate(size_t newLen); - Zbase& Replace(const T* old, const T* replacement, bool replaceAll = true); - Zbase AfterLast( T ch) const; //returns the whole string if "ch" not found - Zbase BeforeLast( T ch) const; //returns empty string if "ch" not found - Zbase AfterFirst( T ch) const; //returns empty string if "ch" not found - Zbase BeforeFirst(T ch) const; //returns the whole string if "ch" not found - Zbase& Trim(bool fromLeft = true, bool fromRight = true); - std::vector<Zbase> Split(T delimiter) const; + bool StartsWith(const Zbase& prefix ) const { return zen::startsWith(*this, prefix ); } + bool StartsWith(const T* prefix ) const { return zen::startsWith(*this, prefix ); } + bool StartsWith( T prefix ) const { return zen::startsWith(*this, prefix ); } + bool EndsWith (const Zbase& postfix) const { return zen::endsWith (*this, postfix); } + bool EndsWith (const T* postfix) const { return zen::endsWith (*this, postfix); } + bool EndsWith ( T postfix) const { return zen::endsWith (*this, postfix); } + void Truncate(size_t newLen) { return zen::truncate(*this, newLen); } + Zbase& Replace(const T* old, const T* replacement, bool replaceAll = true) { zen::replace(*this, old, replacement, replaceAll); return *this; } + Zbase AfterLast( T ch) const { return zen::afterLast (*this, ch); } //returns the whole string if "ch" not found + Zbase BeforeLast( T ch) const { return zen::beforeLast (*this, ch); } //returns empty string if "ch" not found + Zbase AfterFirst( T ch) const { return zen::afterFirst (*this, ch); } //returns empty string if "ch" not found + Zbase BeforeFirst(T ch) const { return zen::beforeFirst(*this, ch); } //returns the whole string if "ch" not found + void Trim(bool fromLeft = true, bool fromRight = true) { zen::trim(*this, fromLeft, fromRight); } + std::vector<Zbase> Split(T delimiter) const { return zen::split(*this, delimiter); } + std::vector<Zbase> Split(const Zbase& delimiter) const { return zen::split(*this, delimiter); } + + //number conversion + template <class N> static Zbase fromNumber(N number) { return zen::toString<Zbase>(number); } + template <class N> N toNumber() const { return zen::toNumber<N>(*this); } //std::string functions size_t length() const; @@ -275,10 +272,6 @@ public: void swap(Zbase& other); void push_back(T val); //STL access - //number conversion - template <class N> static Zbase fromNumber(N number); - template <class N> N toNumber() const; - Zbase& operator=(const Zbase& source); Zbase& operator=(const T* source); Zbase& operator=(T source); @@ -350,22 +343,6 @@ template <class T, template <class, class> class SP, class AP> const Zbase<T, SP //################################# inline implementation ######################################## -namespace z_impl -{ -//-------------C-string helper functions --------------------------------------------------------- -template <class T> -inline -size_t cStringLength(const T* input) //strlen() -{ - const T* iter = input; - while (*iter != 0) - ++iter; - return iter - input; -} -} - - -//-------------------------------------------------------------------------------------------------- template <class T, template <class, class> class SP, class AP> inline Zbase<T, SP, AP>::Zbase() @@ -390,7 +367,7 @@ template <class T, template <class, class> class SP, class AP> inline Zbase<T, SP, AP>::Zbase(const T* source) { - const size_t sourceLen = z_impl::cStringLength(source); + const size_t sourceLen = zen::cStringLength(source); rawStr = this->create(sourceLen); std::copy(source, source + sourceLen + 1, rawStr); //include null-termination } @@ -415,159 +392,30 @@ Zbase<T, SP, AP>::Zbase(const Zbase<T, SP, AP>& source) template <class T, template <class, class> class SP, class AP> +template <class S> inline -Zbase<T, SP, AP>::~Zbase() -{ - this->destroy(rawStr); -} - - -template <class T, template <class, class> class SP, class AP> -inline -Zbase<T, SP, AP>::operator const T* () const -{ - return rawStr; -} - - -// get all characters after the last occurence of ch -// (returns the whole string if ch not found) -template <class T, template <class, class> class SP, class AP> -inline -Zbase<T, SP, AP> Zbase<T, SP, AP>::AfterLast(T ch) const -{ - const size_t pos = rfind(ch, npos); - if (pos != npos ) - return Zbase(rawStr + pos + 1, length() - pos - 1); - else - return *this; -} - - -// get all characters before the last occurence of ch -// (returns empty string if ch not found) -template <class T, template <class, class> class SP, class AP> -inline -Zbase<T, SP, AP> Zbase<T, SP, AP>::BeforeLast(T ch) const -{ - const size_t pos = rfind(ch, npos); - if (pos != npos) - return Zbase(rawStr, pos); //data is non-empty string in this context: else ch would not have been found! - else - return Zbase(); -} - - -//returns empty string if ch not found -template <class T, template <class, class> class SP, class AP> -inline -Zbase<T, SP, AP> Zbase<T, SP, AP>::AfterFirst(T ch) const -{ - const size_t pos = find(ch, 0); - if (pos != npos) - return Zbase(rawStr + pos + 1, length() - pos - 1); - else - return Zbase(); - -} - -//returns the whole string if ch not found -template <class T, template <class, class> class SP, class AP> -inline -Zbase<T, SP, AP> Zbase<T, SP, AP>::BeforeFirst(T ch) const -{ - const size_t pos = find(ch, 0); - if (pos != npos) - return Zbase(rawStr, pos); //data is non-empty string in this context: else ch would not have been found! - else - return *this; -} - - -template <class T, template <class, class> class SP, class AP> -inline -bool Zbase<T, SP, AP>::StartsWith(const T* prefix) const -{ - const size_t pfLength = z_impl::cStringLength(prefix); - if (length() < pfLength) - return false; - - return std::equal(rawStr, rawStr + pfLength, - prefix); -} - - -template <class T, template <class, class> class SP, class AP> -inline -bool Zbase<T, SP, AP>::StartsWith(T prefix) const -{ - return length() != 0 && operator[](0) == prefix; -} - - -template <class T, template <class, class> class SP, class AP> -inline -bool Zbase<T, SP, AP>::StartsWith(const Zbase<T, SP, AP>& prefix) const -{ - if (length() < prefix.length()) - return false; - - return std::equal(rawStr, rawStr + prefix.length(), - prefix.rawStr); -} - - -template <class T, template <class, class> class SP, class AP> -inline -bool Zbase<T, SP, AP>::EndsWith(const T* postfix) const -{ - const size_t pfLength = z_impl::cStringLength(postfix); - if (length() < pfLength) - return false; - - const T* cmpBegin = rawStr + length() - pfLength; - return std::equal(cmpBegin, cmpBegin + pfLength, - postfix); -} - - -template <class T, template <class, class> class SP, class AP> -inline -bool Zbase<T, SP, AP>::EndsWith(T postfix) const +Zbase<T, SP, AP>::Zbase(const S& other, typename S::value_type) { - const size_t len = length(); - return len != 0 && operator[](len - 1) == postfix; + const size_t sourceLen = other.size(); + rawStr = this->create(sourceLen); + std::copy(other.c_str(), other.c_str() + sourceLen, rawStr); + rawStr[sourceLen] = 0; } template <class T, template <class, class> class SP, class AP> inline -bool Zbase<T, SP, AP>::EndsWith(const Zbase<T, SP, AP>& postfix) const +Zbase<T, SP, AP>::~Zbase() { - if (length() < postfix.length()) - return false; - - const T* cmpBegin = rawStr + length() - postfix.length(); - return std::equal(cmpBegin, cmpBegin + postfix.length(), - postfix.rawStr); + this->destroy(rawStr); } template <class T, template <class, class> class SP, class AP> inline -Zbase<T, SP, AP>& Zbase<T, SP, AP>::Truncate(size_t newLen) +Zbase<T, SP, AP>::operator const T* () const { - if (newLen < length()) - { - if (canWrite(rawStr, newLen)) - { - rawStr[newLen] = 0; - setLength(rawStr, newLen); - } - else - *this = Zbase(rawStr, newLen); - } - return *this; + return rawStr; } @@ -590,7 +438,7 @@ size_t Zbase<T, SP, AP>::find(const T* str, size_t pos) const assert(pos <= length()); const T* thisEnd = end(); //respect embedded 0 const T* iter = std::search(begin() + pos, thisEnd, - str, str + z_impl::cStringLength(str)); + str, str + zen::cStringLength(str)); return iter == thisEnd ? npos : iter - begin(); } @@ -632,7 +480,7 @@ size_t Zbase<T, SP, AP>::rfind(const T* str, size_t pos) const { assert(pos == npos || pos <= length()); - const size_t strLen = z_impl::cStringLength(str); + const size_t strLen = zen::cStringLength(str); const T* currEnd = pos == npos ? end() : begin() + std::min(pos + strLen, length()); const T* iter = std::find_end(begin(), currEnd, @@ -686,26 +534,6 @@ Zbase<T, SP, AP>& Zbase<T, SP, AP>::replace(size_t pos1, size_t n1, const T* str template <class T, template <class, class> class SP, class AP> inline -Zbase<T, SP, AP>& Zbase<T, SP, AP>::Replace(const T* old, const T* replacement, bool replaceAll) -{ - const size_t oldLen = z_impl::cStringLength(old); - const size_t replacementLen = z_impl::cStringLength(replacement); - - size_t pos = 0; - while ((pos = find(old, pos)) != npos) - { - replace(pos, oldLen, replacement, replacementLen); - pos += replacementLen; //move past the string that was replaced - - if (!replaceAll) - break; - } - return *this; -} - - -template <class T, template <class, class> class SP, class AP> -inline void Zbase<T, SP, AP>::resize(size_t newSize, T fillChar) { if (canWrite(rawStr, newSize)) @@ -746,7 +574,7 @@ template <class T, template <class, class> class SP, class AP> inline bool operator==(const Zbase<T, SP, AP>& lhs, const T* rhs) { - return lhs.length() == z_impl::cStringLength(rhs) && std::equal(lhs.begin(), lhs.end(), rhs); //respect embedded 0 + return lhs.length() == zen::cStringLength(rhs) && std::equal(lhs.begin(), lhs.end(), rhs); //respect embedded 0 } @@ -796,7 +624,7 @@ inline bool operator<(const Zbase<T, SP, AP>& lhs, const T* rhs) { return std::lexicographical_compare(lhs.begin(), lhs.end(), //respect embedded 0 - rhs, rhs + z_impl::cStringLength(rhs)); + rhs, rhs + zen::cStringLength(rhs)); } @@ -804,7 +632,7 @@ template <class T, template <class, class> class SP, class AP> inline bool operator<(const T* lhs, const Zbase<T, SP, AP>& rhs) { - return std::lexicographical_compare(lhs, lhs + z_impl::cStringLength(lhs), //respect embedded 0 + return std::lexicographical_compare(lhs, lhs + zen::cStringLength(lhs), //respect embedded 0 rhs.begin(), rhs.end()); } @@ -944,7 +772,7 @@ template <class T, template <class, class> class SP, class AP> inline const Zbase<T, SP, AP> operator+(T lhs, const Zbase<T, SP, AP>& rhs) { - return Zbase<T, SP, AP>(lhs) += rhs; + return (Zbase<T, SP, AP>() += lhs) += rhs; } @@ -1019,7 +847,7 @@ template <class T, template <class, class> class SP, class AP> inline Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator=(const T* source) { - return assign(source, z_impl::cStringLength(source)); + return assign(source, zen::cStringLength(source)); } @@ -1059,7 +887,7 @@ inline Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator+=(const T* other) { const size_t thisLen = length(); - const size_t otherLen = z_impl::cStringLength(other); + const size_t otherLen = zen::cStringLength(other); reserve(thisLen + otherLen); //make unshared and check capacity std::copy(other, other + otherLen + 1, rawStr + thisLen); //include null-termination @@ -1080,113 +908,4 @@ Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator+=(T ch) return *this; } - -template <class T, template <class, class> class SP, class AP> -template <class N> -inline -Zbase<T, SP, AP> Zbase<T, SP, AP>::fromNumber(N number) -{ - std::basic_ostringstream<T> ss; - ss << number; - return Zbase<T, SP, AP>(ss.str().c_str()); -} - - -template <class T, template <class, class> class SP, class AP> -template <class N> -inline -N Zbase<T, SP, AP>::toNumber() const -{ - std::basic_istringstream<T> ss((std::basic_string<T>(rawStr))); - N number = 0; - ss >> number; - return number; -} - - -namespace z_impl -{ -template <class T> -bool cStringWhiteSpace(T ch); - -template <> -inline -bool cStringWhiteSpace(char ch) -{ - return std::isspace(static_cast<unsigned char>(ch)) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC -} - - -template <> -inline -bool cStringWhiteSpace(wchar_t ch) -{ - return std::iswspace(ch) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC -} -} - - -template <class T, template <class, class> class SP, class AP> -Zbase<T, SP, AP>& Zbase<T, SP, AP>::Trim(bool fromLeft, bool fromRight) -{ - assert(fromLeft || fromRight); - - const T* newBegin = rawStr; - const T* newEnd = rawStr + length(); - - if (fromRight) - while (newBegin != newEnd && z_impl::cStringWhiteSpace(newEnd[-1])) - --newEnd; - - if (fromLeft) - while (newBegin != newEnd && z_impl::cStringWhiteSpace(*newBegin)) - ++newBegin; - - const size_t newLength = newEnd - newBegin; - if (newLength != length()) - { - if (canWrite(rawStr, newLength)) - { - std::copy(newBegin, newBegin + newLength, rawStr); //shift left => std::copy, shift right std::copy_backward - rawStr[newLength] = 0; - setLength(rawStr, newLength); - } - else - *this = Zbase(newBegin, newLength); - } - return *this; -} - - -template <class T, template <class, class> class SP, class AP> -std::vector<Zbase<T, SP, AP> > Zbase<T, SP, AP>::Split(T delimiter) const -{ - std::vector<Zbase> output; - - const size_t thisLen = length(); - size_t startPos = 0; - for (;;) //make MSVC happy - { - size_t endPos = find(delimiter, startPos); - if (endPos == npos) - endPos = thisLen; - - if (startPos != endPos) //do not add empty strings - { - Zbase newEntry = substr(startPos, endPos - startPos); - newEntry.Trim(); //remove whitespace characters - - if (!newEntry.empty()) - output.push_back(newEntry); - } - if (endPos == thisLen) - break; - - startPos = endPos + 1; //skip delimiter - } - - return output; -} - - #endif //Z_BASE_H_INCLUDED diff --git a/shared/zstring.cpp b/shared/zstring.cpp index 6440c9af..2955ec3e 100644 --- a/shared/zstring.cpp +++ b/shared/zstring.cpp @@ -12,7 +12,6 @@ #undef min #undef max #include "dll_loader.h" -#include <boost/scoped_array.hpp> #endif //FFS_WIN #ifndef NDEBUG @@ -161,16 +160,16 @@ int z_impl::compareFilenamesWin(const wchar_t* a, const wchar_t* b, size_t sizeA } else //use freestore { - boost::scoped_array<wchar_t> bufferA(new wchar_t[minSize]); - boost::scoped_array<wchar_t> bufferB(new wchar_t[minSize]); + std::vector<wchar_t> bufferA(minSize); + std::vector<wchar_t> bufferB(minSize); - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, a, static_cast<int>(minSize), bufferA.get(), static_cast<int>(minSize)) == 0) + if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, a, static_cast<int>(minSize), &bufferA[0], static_cast<int>(minSize)) == 0) throw std::runtime_error("Error comparing strings! (LCMapString: FS)"); - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, b, static_cast<int>(minSize), bufferB.get(), static_cast<int>(minSize)) == 0) + if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, b, static_cast<int>(minSize), &bufferB[0], static_cast<int>(minSize)) == 0) throw std::runtime_error("Error comparing strings! (LCMapString: FS)"); - rv = ::wmemcmp(bufferA.get(), bufferB.get(), minSize); + rv = ::wmemcmp(&bufferA[0], &bufferB[0], minSize); } return rv == 0 ? diff --git a/shared/zstring.h b/shared/zstring.h index 286ed7cc..ae77d333 100644 --- a/shared/zstring.h +++ b/shared/zstring.h @@ -112,6 +112,9 @@ typedef wchar_t Zchar; #elif defined FFS_LINUX //Linux uses UTF-8 typedef char Zchar; #define Zstr(x) x + +#else +#error define platform you are in: FFS_WIN or FFS_LINUX #endif //"The reason for all the fuss above" (Loki/SmartPtr) diff --git a/structures.cpp b/structures.cpp index 6f38a0cf..f155fd84 100644 --- a/structures.cpp +++ b/structures.cpp @@ -6,27 +6,13 @@ // #include "structures.h" #include "shared/i18n.h" -//#include <stdexcept> +#include <iterator> +#include <stdexcept> -using namespace ffs3; +using namespace zen; -Zstring ffs3::standardExcludeFilter() -{ -#ifdef FFS_WIN - static Zstring exclude(wxT("\ -\\System Volume Information\\\n\ -\\RECYCLER\\\n\ -\\RECYCLED\\\n\ -\\$Recycle.Bin\\")); //exclude Recycle Bin -#elif defined FFS_LINUX - static Zstring exclude; //exclude nothing -#endif - return exclude; -} - - -wxString ffs3::getVariantName(CompareVariant var) +wxString zen::getVariantName(CompareVariant var) { switch (var) { @@ -41,120 +27,93 @@ wxString ffs3::getVariantName(CompareVariant var) } -wxString ffs3::getVariantName(const SyncConfiguration& syncCfg) +wxString zen::getVariantName(SyncConfig::Variant var) { - switch (getVariant(syncCfg)) + switch (var) { - case SyncConfiguration::AUTOMATIC: + case SyncConfig::AUTOMATIC: return _("<Automatic>"); - case SyncConfiguration::MIRROR: + case SyncConfig::MIRROR: return _("Mirror ->>"); - case SyncConfiguration::UPDATE: + case SyncConfig::UPDATE: return _("Update ->"); - case SyncConfiguration::CUSTOM: + case SyncConfig::CUSTOM: return _("Custom"); } return _("Error"); } -void ffs3::setTwoWay(SyncConfiguration& syncCfg) //helper method used by <Automatic> mode fallback to overwrite old with newer files -{ - syncCfg.automatic = false; - syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; - syncCfg.exRightSideOnly = SYNC_DIR_LEFT; - syncCfg.leftNewer = SYNC_DIR_RIGHT; - syncCfg.rightNewer = SYNC_DIR_LEFT; - syncCfg.different = SYNC_DIR_NONE; - syncCfg.conflict = SYNC_DIR_NONE; -} - - -SyncConfiguration::Variant ffs3::getVariant(const SyncConfiguration& syncCfg) -{ - if (syncCfg.automatic == true) - return SyncConfiguration::AUTOMATIC; //automatic mode - - if (syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT && - syncCfg.exRightSideOnly == SYNC_DIR_RIGHT && - syncCfg.leftNewer == SYNC_DIR_RIGHT && - syncCfg.rightNewer == SYNC_DIR_RIGHT && - syncCfg.different == SYNC_DIR_RIGHT && - syncCfg.conflict == SYNC_DIR_RIGHT) - return SyncConfiguration::MIRROR; //one way -> - - else if (syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT && - syncCfg.exRightSideOnly == SYNC_DIR_NONE && - syncCfg.leftNewer == SYNC_DIR_RIGHT && - syncCfg.rightNewer == SYNC_DIR_NONE && - syncCfg.different == SYNC_DIR_RIGHT && - syncCfg.conflict == SYNC_DIR_NONE) - return SyncConfiguration::UPDATE; //Update -> - else - return SyncConfiguration::CUSTOM; //other -} - - -void ffs3::setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var) +DirectionSet zen::extractDirections(const SyncConfig& cfg) { - switch (var) + DirectionSet output; + switch (cfg.var) { - case SyncConfiguration::AUTOMATIC: - syncCfg.automatic = true; + case SyncConfig::AUTOMATIC: + throw std::logic_error("there are no predefined directions for automatic mode!"); + + case SyncConfig::MIRROR: + output.exLeftSideOnly = SYNC_DIR_RIGHT; + output.exRightSideOnly = SYNC_DIR_RIGHT; + output.leftNewer = SYNC_DIR_RIGHT; + output.rightNewer = SYNC_DIR_RIGHT; + output.different = SYNC_DIR_RIGHT; + output.conflict = SYNC_DIR_RIGHT; break; - case SyncConfiguration::MIRROR: - syncCfg.automatic = false; - syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; - syncCfg.exRightSideOnly = SYNC_DIR_RIGHT; - syncCfg.leftNewer = SYNC_DIR_RIGHT; - syncCfg.rightNewer = SYNC_DIR_RIGHT; - syncCfg.different = SYNC_DIR_RIGHT; - syncCfg.conflict = SYNC_DIR_RIGHT; - break; - case SyncConfiguration::UPDATE: - syncCfg.automatic = false; - syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT; - syncCfg.exRightSideOnly = SYNC_DIR_NONE; - syncCfg.leftNewer = SYNC_DIR_RIGHT; - syncCfg.rightNewer = SYNC_DIR_NONE; - syncCfg.different = SYNC_DIR_RIGHT; - syncCfg.conflict = SYNC_DIR_NONE; + + case SyncConfig::UPDATE: + output.exLeftSideOnly = SYNC_DIR_RIGHT; + output.exRightSideOnly = SYNC_DIR_NONE; + output.leftNewer = SYNC_DIR_RIGHT; + output.rightNewer = SYNC_DIR_NONE; + output.different = SYNC_DIR_RIGHT; + output.conflict = SYNC_DIR_NONE; break; - case SyncConfiguration::CUSTOM: - assert(false); + + case SyncConfig::CUSTOM: + output = cfg.custom; break; } + return output; } +DirectionSet zen::getTwoWaySet() +{ + DirectionSet output; + output.exLeftSideOnly = SYNC_DIR_RIGHT; + output.exRightSideOnly = SYNC_DIR_LEFT; + output.leftNewer = SYNC_DIR_RIGHT; + output.rightNewer = SYNC_DIR_LEFT; + output.different = SYNC_DIR_NONE; + output.conflict = SYNC_DIR_NONE; + return output; +} + wxString MainConfiguration::getSyncVariantName() { - const SyncConfiguration firstSyncCfg = - firstPair.altSyncConfig.get() ? - firstPair.altSyncConfig->syncConfiguration : - syncConfiguration; //fallback to main sync cfg - - const SyncConfiguration::Variant firstVariant = getVariant(firstSyncCfg); + const SyncConfig::Variant firstVariant = firstPair.altSyncConfig.get() ? + firstPair.altSyncConfig->syncConfiguration.var : + syncConfiguration.var; //fallback to main sync cfg //test if there's a deviating variant within the additional folder pairs for (std::vector<FolderPairEnh>::const_iterator i = additionalPairs.begin(); i != additionalPairs.end(); ++i) { - const SyncConfiguration::Variant thisVariant = - i->altSyncConfig.get() ? - getVariant(i->altSyncConfig->syncConfiguration) : - getVariant(syncConfiguration); + const SyncConfig::Variant thisVariant = i->altSyncConfig.get() ? + i->altSyncConfig->syncConfiguration.var : + syncConfiguration.var; if (thisVariant != firstVariant) return _("Multiple..."); } //seems to be all in sync... - return getVariantName(firstSyncCfg); + return getVariantName(firstVariant); } -wxString ffs3::getDescription(CompareFilesResult cmpRes) +wxString zen::getDescription(CompareFilesResult cmpRes) { switch (cmpRes) { @@ -181,7 +140,7 @@ wxString ffs3::getDescription(CompareFilesResult cmpRes) } -wxString ffs3::getSymbol(CompareFilesResult cmpRes) +wxString zen::getSymbol(CompareFilesResult cmpRes) { switch (cmpRes) { @@ -207,7 +166,7 @@ wxString ffs3::getSymbol(CompareFilesResult cmpRes) } -wxString ffs3::getDescription(SyncOperation op) +wxString zen::getDescription(SyncOperation op) { switch (op) { @@ -231,7 +190,7 @@ wxString ffs3::getDescription(SyncOperation op) return _("Copy attributes only from right to left"); case SO_COPY_METADATA_TO_RIGHT: return _("Copy attributes only from left to right"); - case SO_UNRESOLVED_CONFLICT: + case SO_UNRESOLVED_CONFLICT: //not used on GUI, but in .csv return _("Conflicts/files that cannot be categorized"); }; @@ -240,7 +199,7 @@ wxString ffs3::getDescription(SyncOperation op) } -wxString ffs3::getSymbol(SyncOperation op) +wxString zen::getSymbol(SyncOperation op) { switch (op) { @@ -273,7 +232,71 @@ wxString ffs3::getSymbol(SyncOperation op) namespace { -bool sameFilterConfig(const std::vector<FolderPairEnh>& folderPairs) +assert_static(std::numeric_limits<zen:: Int64>::is_specialized); +assert_static(std::numeric_limits<zen::UInt64>::is_specialized); + +zen::Int64 resolve(size_t value, UnitTime unit, zen::Int64 defaultVal) +{ + double out = value; + switch (unit) + { + case UTIME_NONE: + return defaultVal; + case UTIME_SEC: + return zen::Int64(value); + case UTIME_MIN: + out *= 60; + break; + case UTIME_HOUR: + out *= 3600; + break; + case UTIME_DAY: + out *= 24 * 3600; + break; + } + return out >= to<double>(std::numeric_limits<zen::Int64>::max()) ? //prevent overflow!!! + std::numeric_limits<zen::Int64>::max() : + zen::Int64(out); +} + +zen::UInt64 resolve(size_t value, UnitSize unit, zen::UInt64 defaultVal) +{ + double out = value; + switch (unit) + { + case USIZE_NONE: + return defaultVal; + case USIZE_BYTE: + return value; + case USIZE_KB: + out *= 1024; + break; + case USIZE_MB: + out *= 1024 * 1024; + break; + } + return out >= to<double>(std::numeric_limits<zen::UInt64>::max()) ? //prevent overflow!!! + std::numeric_limits<zen::UInt64>::max() : + zen::UInt64(out); +} +} + +void zen::resolveUnits(size_t timeSpan, UnitTime unitTimeSpan, + size_t sizeMin, UnitSize unitSizeMin, + size_t sizeMax, UnitSize unitSizeMax, + zen::Int64& timeSpanSec, //unit: seconds + zen::UInt64& sizeMinBy, //unit: bytes + zen::UInt64& sizeMaxBy) //unit: bytes +{ + timeSpanSec = resolve(timeSpan, unitTimeSpan, std::numeric_limits<zen::Int64>::max()); + sizeMinBy = resolve(sizeMin, unitSizeMin, 0U); + sizeMaxBy = resolve(sizeMax, unitSizeMax, std::numeric_limits<zen::UInt64>::max()); +} + + +namespace +{ +bool sameFilter(const std::vector<FolderPairEnh>& folderPairs) { if (folderPairs.empty()) return true; @@ -284,14 +307,75 @@ bool sameFilterConfig(const std::vector<FolderPairEnh>& folderPairs) return true; } + + +bool isEmpty(const FolderPairEnh& fp) +{ + return fp == FolderPairEnh(); } -ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCfgs) +FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& local) +{ + FilterConfig out = local; + + //hard filter + + //pragmatism: if both global and local include filter contain data, only local filter is preserved + if (out.includeFilter == FilterConfig().includeFilter) + out.includeFilter = global.includeFilter; + + out.excludeFilter.Trim(true, false); + out.excludeFilter = global.excludeFilter + Zstr("\n") + out.excludeFilter; + out.excludeFilter.Trim(true, false); + + //soft filter + zen::Int64 locTimeSpanSec; + zen::UInt64 locSizeMinBy; + zen::UInt64 locSizeMaxBy; + zen::resolveUnits(out.timeSpan, out.unitTimeSpan, + out.sizeMin, out.unitSizeMin, + out.sizeMax, out.unitSizeMax, + locTimeSpanSec, //unit: seconds + locSizeMinBy, //unit: bytes + locSizeMaxBy); //unit: bytes + + //soft filter + zen::Int64 gloTimeSpanSec; + zen::UInt64 gloSizeMinBy; + zen::UInt64 gloSizeMaxBy; + zen::resolveUnits(global.timeSpan, global.unitTimeSpan, + global.sizeMin, global.unitSizeMin, + global.sizeMax, global.unitSizeMax, + gloTimeSpanSec, //unit: seconds + gloSizeMinBy, //unit: bytes + gloSizeMaxBy); //unit: bytes + + if (gloTimeSpanSec < locTimeSpanSec) + { + out.timeSpan = global.timeSpan; + out.unitTimeSpan = global.unitTimeSpan; + } + if (gloSizeMinBy > locSizeMinBy) + { + out.sizeMin = global.sizeMin; + out.unitSizeMin = global.unitSizeMin; + } + if (gloSizeMaxBy < locSizeMaxBy) + { + out.sizeMax = global.sizeMax; + out.unitSizeMax = global.unitSizeMax; + } + return out; +} +} + + +zen::MainConfiguration zen::merge(const std::vector<MainConfiguration>& mainCfgs) { assert(!mainCfgs.empty()); if (mainCfgs.empty()) - return ffs3::MainConfiguration(); + return zen::MainConfiguration(); if (mainCfgs.size() == 1) //mergeConfigFilesImpl relies on this! return mainCfgs[0]; // @@ -301,10 +385,12 @@ ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCf for (std::vector<MainConfiguration>::const_iterator i = mainCfgs.begin(); i != mainCfgs.end(); ++i) { std::vector<FolderPairEnh> fpTmp; - fpTmp.push_back(i->firstPair); - fpTmp.insert(fpTmp.end(), i->additionalPairs.begin(), i->additionalPairs.end()); - //move all configuration to item level + //list non-empty local configurations + if (!isEmpty(i->firstPair)) fpTmp.push_back(i->firstPair); + std::remove_copy_if(i->additionalPairs.begin(), i->additionalPairs.end(), std::back_inserter(fpTmp), &isEmpty); + + //move all configuration down to item level for (std::vector<FolderPairEnh>::iterator fp = fpTmp.begin(); fp != fpTmp.end(); ++fp) { if (!fp->altSyncConfig.get()) @@ -313,42 +399,37 @@ ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCf i->handleDeletion, i->customDeletionDirectory)); - //pragmatism: if both global and local include filter contain data, only local filter is preserved - if (fp->localFilter.includeFilter == FilterConfig().includeFilter) - fp->localFilter.includeFilter = i->globalFilter.includeFilter; - - fp->localFilter.excludeFilter.Trim(true, false); - fp->localFilter.excludeFilter = i->globalFilter.excludeFilter + Zstr("\n") + fp->localFilter.excludeFilter; - fp->localFilter.excludeFilter.Trim(true, false); + fp->localFilter = mergeFilterConfig(i->globalFilter, fp->localFilter); } fpMerged.insert(fpMerged.end(), fpTmp.begin(), fpTmp.end()); } + if (fpMerged.empty()) + return zen::MainConfiguration(); + //optimization: remove redundant configuration FilterConfig newGlobalFilter; - const bool sameLocalFilter = sameFilterConfig(fpMerged); - if (sameLocalFilter) + const bool equalFilters = sameFilter(fpMerged); + if (equalFilters) newGlobalFilter = fpMerged[0].localFilter; for (std::vector<FolderPairEnh>::iterator fp = fpMerged.begin(); fp != fpMerged.end(); ++fp) { //if local config matches output global config we don't need local one if (fp->altSyncConfig && - *fp->altSyncConfig == - AlternateSyncConfig(mainCfgs[0].syncConfiguration, - mainCfgs[0].handleDeletion, - mainCfgs[0].customDeletionDirectory)) + *fp->altSyncConfig == AlternateSyncConfig(mainCfgs[0].syncConfiguration, + mainCfgs[0].handleDeletion, + mainCfgs[0].customDeletionDirectory)) fp->altSyncConfig.reset(); - if (sameLocalFilter) //use global filter in this case + if (equalFilters) //use global filter in this case fp->localFilter = FilterConfig(); } - //final assembly - ffs3::MainConfiguration cfgOut = mainCfgs[0]; + zen::MainConfiguration cfgOut = mainCfgs[0]; cfgOut.globalFilter = newGlobalFilter; cfgOut.firstPair = fpMerged[0]; cfgOut.additionalPairs.assign(fpMerged.begin() + 1, fpMerged.end()); diff --git a/structures.h b/structures.h index 6146865e..c492ed85 100644 --- a/structures.h +++ b/structures.h @@ -13,9 +13,11 @@ #include "shared/system_constants.h" #include "shared/assert_static.h" #include <boost/shared_ptr.hpp> +#include "shared/int64.h" -namespace ffs3 + +namespace zen { enum CompareVariant { @@ -108,10 +110,9 @@ wxString getSymbol(SyncOperation op); class AbortThisProcess {}; -struct SyncConfiguration //technical representation of sync-config: not to be edited by GUI directly! +struct DirectionSet { - SyncConfiguration() : - automatic(true), + DirectionSet() : exLeftSideOnly( SYNC_DIR_RIGHT), exRightSideOnly(SYNC_DIR_LEFT), leftNewer( SYNC_DIR_RIGHT), @@ -119,27 +120,6 @@ struct SyncConfiguration //technical representation of sync-config: not to be ed different( SYNC_DIR_NONE), conflict( SYNC_DIR_NONE) {} - enum Variant - { - AUTOMATIC, - MIRROR, - UPDATE, - CUSTOM - }; - - bool operator==(const SyncConfiguration& other) const - { - return automatic == other.automatic && - (automatic || //if automatic is on, other settings are not relevant - (exLeftSideOnly == other.exLeftSideOnly && - exRightSideOnly == other.exRightSideOnly && - leftNewer == other.leftNewer && - rightNewer == other.rightNewer && - different == other.different && - conflict == other.conflict)); - } - - bool automatic; //use sync-database SyncDirection exLeftSideOnly; SyncDirection exRightSideOnly; SyncDirection leftNewer; @@ -148,11 +128,49 @@ struct SyncConfiguration //technical representation of sync-config: not to be ed SyncDirection conflict; }; +DirectionSet getTwoWaySet(); + +inline +bool operator==(const DirectionSet& lhs, const DirectionSet& rhs) +{ + return lhs.exLeftSideOnly == rhs.exLeftSideOnly && + lhs.exRightSideOnly == rhs.exRightSideOnly && + lhs.leftNewer == rhs.leftNewer && + lhs.rightNewer == rhs.rightNewer && + lhs.different == rhs.different && + lhs.conflict == rhs.conflict; +} + +struct SyncConfig //technical representation of sync-config +{ + enum Variant + { + AUTOMATIC, //use sync-database to determine directions + MIRROR, //predefined + UPDATE, // + CUSTOM //use custom directions + }; + + SyncConfig() : var(AUTOMATIC) {} + + Variant var; + + //custom sync directions + DirectionSet custom; +}; + +inline +bool operator==(const SyncConfig& lhs, const SyncConfig& rhs) +{ + return lhs.var == rhs.var && + (lhs.var != SyncConfig::CUSTOM || lhs.custom == rhs.custom); //directions are only relevant if variant "custom" is active +} + +//get sync directions: DON'T call for variant AUTOMATIC! +DirectionSet extractDirections(const SyncConfig& cfg); + +wxString getVariantName(SyncConfig::Variant var); -SyncConfiguration::Variant getVariant(const SyncConfiguration& syncCfg); -void setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var); -wxString getVariantName(const SyncConfiguration& syncCfg); -void setTwoWay(SyncConfiguration& syncCfg); //helper method used by <Automatic> mode fallback to overwrite old with newer files enum DeletionPolicy @@ -165,9 +183,9 @@ enum DeletionPolicy struct AlternateSyncConfig { - AlternateSyncConfig(const SyncConfiguration& syncCfg, - const DeletionPolicy handleDel, - const wxString& customDelDir) : + AlternateSyncConfig(const SyncConfig& syncCfg, + const DeletionPolicy handleDel, + const wxString& customDelDir) : syncConfiguration(syncCfg), handleDeletion(handleDel), customDeletionDirectory(customDelDir) {}; @@ -176,43 +194,102 @@ struct AlternateSyncConfig handleDeletion(MOVE_TO_RECYCLE_BIN) {} //Synchronisation settings - SyncConfiguration syncConfiguration; + SyncConfig syncConfiguration; //misc options DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location wxString customDeletionDirectory; - - bool operator==(const AlternateSyncConfig& other) const - { - return syncConfiguration == other.syncConfiguration && - handleDeletion == other.handleDeletion && - customDeletionDirectory == other.customDeletionDirectory; - } }; -//standard exclude filter settings, OS dependent -Zstring standardExcludeFilter(); +inline +bool operator==(const AlternateSyncConfig& lhs, const AlternateSyncConfig& rhs) +{ + return lhs.syncConfiguration == rhs.syncConfiguration && + lhs.handleDeletion == rhs.handleDeletion && + lhs.customDeletionDirectory == rhs.customDeletionDirectory; +} -struct FilterConfig +enum UnitSize { - FilterConfig(const Zstring& include, const Zstring& exclude) : - includeFilter(include), - excludeFilter(exclude) {} + USIZE_NONE, + USIZE_BYTE, + USIZE_KB, + USIZE_MB +}; - FilterConfig() : //construct with default values - includeFilter(Zstr("*")) {} +enum UnitTime +{ + UTIME_NONE, + UTIME_SEC, + UTIME_MIN, + UTIME_HOUR, + UTIME_DAY +}; +struct FilterConfig +{ + FilterConfig(const Zstring& include = Zstr("*"), + const Zstring& exclude = Zstring(), + size_t timeSpanIn = 0, + UnitTime unitTimeSpanIn = UTIME_NONE, + size_t sizeMinIn = 0, + UnitSize unitSizeMinIn = USIZE_NONE, + size_t sizeMaxIn = 0, + UnitSize unitSizeMaxIn = USIZE_NONE) : + includeFilter(include), + excludeFilter(exclude), + timeSpan (timeSpanIn), + unitTimeSpan (unitTimeSpanIn), + sizeMin (sizeMinIn), + unitSizeMin (unitSizeMinIn), + sizeMax (sizeMaxIn), + unitSizeMax (unitSizeMaxIn) {} + + /* + Semantics of HardFilter: + 1. using it creates a NEW folder hierarchy! -> must be considered by <Automatic>-mode! (fortunately it turns out, doing nothing already has perfect semantics :) + 2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder! + */ Zstring includeFilter; Zstring excludeFilter; - bool operator==(const FilterConfig& other) const - { - return includeFilter == other.includeFilter && - excludeFilter == other.excludeFilter; - } + /* + Semantics of SoftFilter: + 1. It potentially may match only one side => it MUST NOT be applied while traversing a single folder to avoid mismatches + 2. => it is applied after traversing and just marks rows, (NO deletions after comparison are allowed) + 3. => equivalent to a user temporarily (de-)selecting rows -> not relevant for <Automatic>-mode! ;) + */ + size_t timeSpan; + UnitTime unitTimeSpan; + + size_t sizeMin; + UnitSize unitSizeMin; + + size_t sizeMax; + UnitSize unitSizeMax; }; +inline +bool operator==(const FilterConfig& lhs, const FilterConfig& rhs) +{ + return lhs.includeFilter == rhs.includeFilter && + lhs.excludeFilter == rhs.excludeFilter && + lhs.timeSpan == rhs.timeSpan && + lhs.unitTimeSpan == rhs.unitTimeSpan && + lhs.sizeMin == rhs.sizeMin && + lhs.unitSizeMin == rhs.unitSizeMin && + lhs.sizeMax == rhs.sizeMax && + lhs.unitSizeMax == rhs.unitSizeMax; +} + +void resolveUnits(size_t timeSpan, UnitTime unitTimeSpan, + size_t sizeMin, UnitSize unitSizeMin, + size_t sizeMax, UnitSize unitSizeMax, + zen::Int64& timeSpanSec, //unit: seconds + zen::UInt64& sizeMinBy, //unit: bytes + zen::UInt64& sizeMaxBy); //unit: bytes + struct FolderPairEnh //enhanced folder pairs with (optional) alternate configuration { @@ -232,20 +309,21 @@ struct FolderPairEnh //enhanced folder pairs with (optional) alternate configura boost::shared_ptr<const AlternateSyncConfig> altSyncConfig; //optional FilterConfig localFilter; +}; - bool operator==(const FolderPairEnh& other) const - { - return leftDirectory == other.leftDirectory && - rightDirectory == other.rightDirectory && - (altSyncConfig.get() && other.altSyncConfig.get() ? - *altSyncConfig == *other.altSyncConfig : - altSyncConfig.get() == other.altSyncConfig.get()) && +inline +bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs) +{ + return lhs.leftDirectory == rhs.leftDirectory && + lhs.rightDirectory == rhs.rightDirectory && - localFilter == other.localFilter; - } -}; + (lhs.altSyncConfig.get() && rhs.altSyncConfig.get() ? + *lhs.altSyncConfig == *rhs.altSyncConfig : + lhs.altSyncConfig.get() == rhs.altSyncConfig.get()) && + lhs.localFilter == rhs.localFilter; +} enum SymLinkHandling { @@ -260,7 +338,15 @@ struct MainConfiguration MainConfiguration() : compareVar(CMP_BY_TIME_SIZE), handleSymlinks(SYMLINK_IGNORE), - globalFilter(Zstr("*"), standardExcludeFilter()), +#ifdef FFS_WIN + globalFilter(Zstr("*"), Zstr("\ +\\System Volume Information\\\n\ +\\RECYCLER\\\n\ +\\RECYCLED\\\n\ +\\$Recycle.Bin\\")), //exclude Recycle Bin +#elif defined FFS_LINUX + //exclude nothing +#endif handleDeletion(MOVE_TO_RECYCLE_BIN) {} FolderPairEnh firstPair; //there needs to be at least one pair! @@ -275,25 +361,27 @@ struct MainConfiguration FilterConfig globalFilter; //Synchronisation settings - SyncConfiguration syncConfiguration; + SyncConfig syncConfiguration; DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location wxString customDeletionDirectory; wxString getSyncVariantName(); - - bool operator==(const MainConfiguration& other) const - { - return firstPair == other.firstPair && - additionalPairs == other.additionalPairs && - compareVar == other.compareVar && - handleSymlinks == other.handleSymlinks && - syncConfiguration == other.syncConfiguration && - globalFilter == other.globalFilter && - handleDeletion == other.handleDeletion && - customDeletionDirectory == other.customDeletionDirectory; - } }; + +inline +bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs) +{ + return lhs.firstPair == rhs.firstPair && + lhs.additionalPairs == rhs.additionalPairs && + lhs.compareVar == rhs.compareVar && + lhs.handleSymlinks == rhs.handleSymlinks && + lhs.syncConfiguration == rhs.syncConfiguration && + lhs.globalFilter == rhs.globalFilter && + lhs.handleDeletion == rhs.handleDeletion && + lhs.customDeletionDirectory == rhs.customDeletionDirectory; +} + //facilitate drag & drop config merge: MainConfiguration merge(const std::vector<MainConfiguration>& mainCfgs); } diff --git a/synchronization.cpp b/synchronization.cpp index d131b567..293eabf2 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -19,7 +19,6 @@ #include <wx/file.h> #include <boost/bind.hpp> #include "shared/global_func.h" -#include <boost/scoped_array.hpp> #include <memory> #include "library/db_file.h" #include "shared/disable_standby.h" @@ -34,7 +33,7 @@ #include "shared/shadow.h" #endif -using namespace ffs3; +using namespace zen; void SyncStatistics::init() @@ -74,7 +73,7 @@ const SyncStatistics::ConflictTexts& SyncStatistics::getFirstConflicts() const / return firstConflicts; } -wxULongLong SyncStatistics::getDataToProcess() const +zen::UInt64 SyncStatistics::getDataToProcess() const { return dataToProcess; } @@ -255,7 +254,7 @@ void SyncStatistics::getDirNumbers(const DirMapping& dirObj) } -std::vector<ffs3::FolderPairSyncCfg> ffs3::extractSyncCfg(const MainConfiguration& mainCfg) +std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& mainCfg) { //merge first and additional pairs std::vector<FolderPairEnh> allPairs; @@ -271,11 +270,11 @@ std::vector<ffs3::FolderPairSyncCfg> ffs3::extractSyncCfg(const MainConfiguratio output.push_back( i->altSyncConfig.get() ? - FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.automatic, + FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.var == SyncConfig::AUTOMATIC, i->altSyncConfig->handleDeletion, wxToZ(i->altSyncConfig->customDeletionDirectory)) : - FolderPairSyncCfg(mainCfg.syncConfiguration.automatic, + FolderPairSyncCfg(mainCfg.syncConfiguration.var == SyncConfig::AUTOMATIC, mainCfg.handleDeletion, wxToZ(mainCfg.customDeletionDirectory))); return output; @@ -295,7 +294,7 @@ public: processRecursively(baseObj); } - std::pair<wxLongLong, wxLongLong> getSpaceTotal() const + std::pair<zen::Int64, zen::Int64> getSpaceTotal() const { return std::make_pair(spaceNeededLeft, spaceNeededRight); } @@ -310,33 +309,33 @@ private: switch (i->getSyncOperation()) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - spaceNeededLeft += common::convertToSigned(i->getFileSize<RIGHT_SIDE>()); + spaceNeededLeft += to<zen::Int64>(i->getFileSize<RIGHT_SIDE>()); break; case SO_CREATE_NEW_RIGHT: - spaceNeededRight += common::convertToSigned(i->getFileSize<LEFT_SIDE>()); + spaceNeededRight += to<zen::Int64>(i->getFileSize<LEFT_SIDE>()); break; case SO_DELETE_LEFT: if (freeSpaceDelLeft_) - spaceNeededLeft -= common::convertToSigned(i->getFileSize<LEFT_SIDE>()); + spaceNeededLeft -= to<zen::Int64>(i->getFileSize<LEFT_SIDE>()); break; case SO_DELETE_RIGHT: if (freeSpaceDelRight_) - spaceNeededRight -= common::convertToSigned(i->getFileSize<RIGHT_SIDE>()); + spaceNeededRight -= to<zen::Int64>(i->getFileSize<RIGHT_SIDE>()); break; case SO_OVERWRITE_LEFT: if (freeSpaceDelLeft_) - spaceNeededLeft -= common::convertToSigned(i->getFileSize<LEFT_SIDE>()); - spaceNeededLeft += common::convertToSigned(i->getFileSize<RIGHT_SIDE>()); + spaceNeededLeft -= to<zen::Int64>(i->getFileSize<LEFT_SIDE>()); + spaceNeededLeft += to<zen::Int64>(i->getFileSize<RIGHT_SIDE>()); break; case SO_OVERWRITE_RIGHT: if (freeSpaceDelRight_) - spaceNeededRight -= common::convertToSigned(i->getFileSize<RIGHT_SIDE>()); - spaceNeededRight += common::convertToSigned(i->getFileSize<LEFT_SIDE>()); + spaceNeededRight -= to<zen::Int64>(i->getFileSize<RIGHT_SIDE>()); + spaceNeededRight += to<zen::Int64>(i->getFileSize<LEFT_SIDE>()); break; case SO_DO_NOTHING: @@ -357,8 +356,8 @@ private: const bool freeSpaceDelLeft_; const bool freeSpaceDelRight_; - wxLongLong spaceNeededLeft; - wxLongLong spaceNeededRight; + zen::Int64 spaceNeededLeft; + zen::Int64 spaceNeededRight; }; @@ -374,7 +373,7 @@ bool deletionFreesSpace(const Zstring& baseDir, case MOVE_TO_RECYCLE_BIN: return false; //in general... (unless Recycle Bin is full) case MOVE_TO_CUSTOM_DIRECTORY: - switch (ffs3::onSameVolume(baseDir, custDelFolderFmt)) + switch (zen::onSameVolume(baseDir, custDelFolderFmt)) { case VOLUME_SAME: return false; @@ -389,7 +388,7 @@ bool deletionFreesSpace(const Zstring& baseDir, } -std::pair<wxLongLong, wxLongLong> freeDiskSpaceNeeded( +std::pair<zen::Int64, zen::Int64> freeDiskSpaceNeeded( const BaseDirMapping& baseDirObj, const DeletionPolicy handleDeletion, const Zstring& custDelFolderFmt) @@ -443,13 +442,13 @@ FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode, const Zstring& custDelDir) : inAutomaticMode(automaticMode), handleDeletion(handleDel), - custDelFolder(ffs3::getFormattedDirectoryName(custDelDir)) {} + custDelFolder(zen::getFormattedDirectoryName(custDelDir)) {} //----------------------------------------------------------------------------------------------------------- template <typename Function> inline -bool tryReportingError(StatusHandler& handler, Function cmd) //return "true" on success, "false" if error was ignored +bool tryReportingError(ProcessCallback& handler, Function cmd) //return "true" on success, "false" if error was ignored { while (true) { @@ -463,7 +462,7 @@ bool tryReportingError(StatusHandler& handler, Function cmd) //return "true" on //User abort when copying files or moving files/directories into custom deletion directory: //windows build: abort if requested, don't show error message if cancelled by user! //linux build: this refresh is not necessary, because user abort triggers an AbortThisProcess() exception without a FileError() - handler.requestUiRefresh(true); //may throw! + handler.requestUiRefresh(); //may throw! ErrorHandler::Response rv = handler.reportError(error.msg()); //may throw! if (rv == ErrorHandler::IGNORE_ERROR) @@ -500,7 +499,7 @@ Zstring getSessionDeletionDir(const Zstring& deletionDirectory, const Zstring& p Zstring output = formattedDir; //ensure uniqueness - for (int i = 1; ffs3::somethingExists(output); ++i) + for (int i = 1; zen::somethingExists(output); ++i) output = formattedDir + Zchar('_') + Zstring::fromNumber(i); output += common::FILE_NAME_SEPARATOR; @@ -512,12 +511,12 @@ SyncProcess::SyncProcess(xmlAccess::OptionalDialogs& warnings, bool verifyCopiedFiles, bool copyLockedFiles, bool copyFilePermissions, - StatusHandler& handler) : + ProcessCallback& handler) : verifyCopiedFiles_(verifyCopiedFiles), copyLockedFiles_(copyLockedFiles), copyFilePermissions_(copyFilePermissions), m_warnings(warnings), - statusUpdater(handler) {} + procCallback(handler) {} //-------------------------------------------------------------------------------------------------------------- @@ -528,16 +527,16 @@ public: const Zstring& custDelFolder, const Zstring& baseDirLeft, const Zstring& baseDirRight, - StatusHandler& statusUpdater); + ProcessCallback& procCallback); ~DeletionHandling(); //always (try to) clean up, even if synchronization is aborted! //clean-up temporary directory (recycler bin optimization) void tryCleanup() const; //throw (FileError) -> call this in non-exceptional coding, i.e. after Sync somewhere! - template <ffs3::SelectedSide side> + template <zen::SelectedSide side> void removeFile(const FileSystemObject& fileObj) const; //throw (FileError) - template <ffs3::SelectedSide side> + template <zen::SelectedSide side> void removeFolder(const FileSystemObject& dirObj) const; //throw (FileError) const Zstring& getTxtRemovingFile() const; //status text templates @@ -552,7 +551,7 @@ private: void tryCleanupRight() const; //throw (FileError) const DeletionPolicy deletionType; - StatusHandler& statusUpdater_; + ProcessCallback& procCallback_; Zstring sessionDelDirLeft; //target deletion folder for current folder pair (with timestamp, ends with path separator) Zstring sessionDelDirRight; // @@ -568,9 +567,9 @@ DeletionHandling::DeletionHandling(const DeletionPolicy handleDel, const Zstring& custDelFolder, const Zstring& baseDirLeft, const Zstring& baseDirRight, - StatusHandler& statusUpdater) : + ProcessCallback& procCallback) : deletionType(handleDel), - statusUpdater_(statusUpdater) + procCallback_(procCallback) { switch (handleDel) { @@ -616,22 +615,22 @@ DeletionHandling::~DeletionHandling() void DeletionHandling::tryCleanup() const //throw(AbortThisProcess) { - tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupLeft, this)); - tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupRight, this)); + tryReportingError(procCallback_, boost::bind(&DeletionHandling::tryCleanupLeft, this)); + tryReportingError(procCallback_, boost::bind(&DeletionHandling::tryCleanupRight, this)); } void DeletionHandling::tryCleanupLeft() const //throw (FileError) { if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin) - ffs3::moveToRecycleBin(sessionDelDirLeft.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError) + zen::moveToRecycleBin(sessionDelDirLeft.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError) } void DeletionHandling::tryCleanupRight() const //throw (FileError) { if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin) - ffs3::moveToRecycleBin(sessionDelDirRight.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError) + zen::moveToRecycleBin(sessionDelDirRight.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError) } @@ -676,7 +675,7 @@ namespace class CallbackMoveFileImpl : public CallbackMoveFile //callback functionality { public: - CallbackMoveFileImpl(StatusHandler& handler) : statusHandler_(handler) {} + CallbackMoveFileImpl(ProcessCallback& handler) : statusHandler_(handler) {} virtual Response requestUiRefresh(const Zstring& currentObject) //DON'T throw exceptions here, at least in Windows build! { @@ -691,13 +690,13 @@ public: } private: - StatusHandler& statusHandler_; + ProcessCallback& statusHandler_; }; struct CallbackRemoveDirImpl : public CallbackRemoveDir { - CallbackRemoveDirImpl(StatusHandler& handler) : statusHandler_(handler) {} + CallbackRemoveDirImpl(ProcessCallback& handler) : statusHandler_(handler) {} virtual void notifyDeletion(const Zstring& currentObject) { @@ -705,20 +704,20 @@ struct CallbackRemoveDirImpl : public CallbackRemoveDir } private: - StatusHandler& statusHandler_; + ProcessCallback& statusHandler_; }; } -template <ffs3::SelectedSide side> +template <zen::SelectedSide side> void DeletionHandling::removeFile(const FileSystemObject& fileObj) const { - using namespace ffs3; + using namespace zen; switch (deletionType) { case DELETE_PERMANENTLY: - ffs3::removeFile(fileObj.getFullName<side>()); + zen::removeFile(fileObj.getFullName<side>()); break; case MOVE_TO_RECYCLE_BIN: @@ -753,7 +752,7 @@ void DeletionHandling::removeFile(const FileSystemObject& fileObj) const if (!dirExists(targetDir)) createDirectory(targetDir); //throw (FileError) - CallbackMoveFileImpl callBack(statusUpdater_); //if file needs to be copied we need callback functionality to update screen and offer abort + CallbackMoveFileImpl callBack(procCallback_); //if file needs to be copied we need callback functionality to update screen and offer abort moveFile(fileObj.getFullName<side>(), targetFile, true, &callBack); } break; @@ -761,16 +760,16 @@ void DeletionHandling::removeFile(const FileSystemObject& fileObj) const } -template <ffs3::SelectedSide side> +template <zen::SelectedSide side> void DeletionHandling::removeFolder(const FileSystemObject& dirObj) const { - using namespace ffs3; + using namespace zen; switch (deletionType) { case DELETE_PERMANENTLY: { - CallbackRemoveDirImpl remDirCallback(statusUpdater_); + CallbackRemoveDirImpl remDirCallback(procCallback_); removeDirectory(dirObj.getFullName<side>(), &remDirCallback); } break; @@ -808,7 +807,7 @@ void DeletionHandling::removeFolder(const FileSystemObject& dirObj) const if (!dirExists(targetSuperDir)) createDirectory(targetSuperDir); //throw (FileError) - CallbackMoveFileImpl callBack(statusUpdater_); //if files need to be copied, we need callback functionality to update screen and offer abort + CallbackMoveFileImpl callBack(procCallback_); //if files need to be copied, we need callback functionality to update screen and offer abort moveDirectory(dirObj.getFullName<side>(), targetDir, true, &callBack); } break; @@ -871,7 +870,7 @@ bool diskSpaceIsReduced(const DirMapping& dirObj) //--------------------------------------------------------------------------------------------------------------- -class ffs3::SynchronizeFolderPair +class zen::SynchronizeFolderPair { public: SynchronizeFolderPair(const SyncProcess& syncProc, @@ -879,7 +878,7 @@ public: shadow::ShadowCopy* shadowCopyHandler, #endif const DeletionHandling& delHandling) : - statusUpdater_(syncProc.statusUpdater), + procCallback_(syncProc.procCallback), #ifdef FFS_WIN shadowCopyHandler_(shadowCopyHandler), #endif @@ -910,14 +909,14 @@ private: void synchronizeFolder(DirMapping& dirObj) const; //more low level helper - template <ffs3::SelectedSide side> + template <zen::SelectedSide side> void deleteSymlink(const SymLinkMapping& linkObj) const; void copySymlink(const Zstring& source, const Zstring& target, LinkDescriptor::LinkType type, bool inRecursion = false) const; template <class DelTargetCommand> - void copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, const wxULongLong& sourceFileSize, int recursionLvl = 0) const; + void copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, zen::UInt64 sourceFileSize, int recursionLvl = 0) const; void verifyFileCopy(const Zstring& source, const Zstring& target) const; - StatusHandler& statusUpdater_; + ProcessCallback& procCallback_; #ifdef FFS_WIN shadow::ShadowCopy* shadowCopyHandler_; //optional! #endif @@ -943,56 +942,56 @@ void SynchronizeFolderPair::execute(HierarchyObject& hierObj) //synchronize files: for (HierarchyObject::SubFileMapping::iterator i = hierObj.useSubFiles().begin(); i != hierObj.useSubFiles().end(); ++i) { - const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i); + const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i); if (letsDoThis) - tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFile, this, boost::ref(*i))); + tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeFile, this, boost::ref(*i))); } //synchronize symbolic links: (process in second step only) if (!reduceDiskSpace) for (HierarchyObject::SubLinkMapping::iterator i = hierObj.useSubLinks().begin(); i != hierObj.useSubLinks().end(); ++i) - tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeLink, this, boost::ref(*i))); + tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeLink, this, boost::ref(*i))); //synchronize folders: for (HierarchyObject::SubDirMapping::iterator i = hierObj.useSubDirs().begin(); i != hierObj.useSubDirs().end(); ++i) { const SyncOperation syncOp = i->getSyncOperation(); - //ensure folder creation happens in second pass, to enable time adaption below - const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i); + //ensure folder creation happens in second pass, to enable time adaption below + const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i); if (letsDoThis) - tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFolder, this, boost::ref(*i))); + tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeFolder, this, boost::ref(*i))); //recursive synchronization: execute<reduceDiskSpace>(*i); //adapt folder modification dates: apply AFTER all subobjects have been synced to preserve folder modification date! - if (letsDoThis) - try - { - switch (syncOp) + if (letsDoThis) + try { - case SO_CREATE_NEW_LEFT: - case SO_COPY_METADATA_TO_LEFT: - copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>(), true); //deref symlinks; throw (FileError) - break; - case SO_CREATE_NEW_RIGHT: - case SO_COPY_METADATA_TO_RIGHT: - copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>(), true); //deref symlinks; throw (FileError) - break; - case SO_OVERWRITE_RIGHT: - case SO_OVERWRITE_LEFT: - assert(false); - case SO_UNRESOLVED_CONFLICT: - case SO_DELETE_LEFT: - case SO_DELETE_RIGHT: - case SO_DO_NOTHING: - case SO_EQUAL: - break; + switch (syncOp) + { + case SO_CREATE_NEW_LEFT: + case SO_COPY_METADATA_TO_LEFT: + copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>(), true); //deref symlinks; throw (FileError) + break; + case SO_CREATE_NEW_RIGHT: + case SO_COPY_METADATA_TO_RIGHT: + copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>(), true); //deref symlinks; throw (FileError) + break; + case SO_OVERWRITE_RIGHT: + case SO_OVERWRITE_LEFT: + assert(false); + case SO_UNRESOLVED_CONFLICT: + case SO_DELETE_LEFT: + case SO_DELETE_RIGHT: + case SO_DO_NOTHING: + case SO_EQUAL: + break; + } } - } - catch (...) {} + catch (...) {} } } @@ -1038,8 +1037,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const statusText = txtCopyingFile; statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false); statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target, NullCommand(), //no target to delete @@ -1052,8 +1051,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const statusText = txtCopyingFile; statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false); statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target, NullCommand(), //no target to delete @@ -1063,8 +1062,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const case SO_DELETE_LEFT: statusText = delHandling_.getTxtRemovingFile(); statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh delHandling_.removeFile<LEFT_SIDE>(fileObj); //throw (FileError) break; @@ -1072,8 +1071,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const case SO_DELETE_RIGHT: statusText = delHandling_.getTxtRemovingFile(); statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh delHandling_.removeFile<RIGHT_SIDE>(fileObj); //throw (FileError) break; @@ -1084,8 +1083,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const statusText = txtOverwritingFile; statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false); statusText.Replace(Zstr("%y"), fileObj.getFullName<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target, DelTargetCommand<LEFT_SIDE>(fileObj, delHandling_), //delete target at appropriate time @@ -1098,8 +1097,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const statusText = txtOverwritingFile; statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false); statusText.Replace(Zstr("%y"), fileObj.getFullName<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target, DelTargetCommand<RIGHT_SIDE>(fileObj, delHandling_), //delete target at appropriate time @@ -1109,8 +1108,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const case SO_COPY_METADATA_TO_LEFT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(fileObj.getFullName<LEFT_SIDE>(), @@ -1123,8 +1122,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const case SO_COPY_METADATA_TO_RIGHT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(fileObj.getFullName<RIGHT_SIDE>(), @@ -1145,7 +1144,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const //progress indicator update //indicator is updated only if file is sync'ed correctly (and if some sync was done)! - statusUpdater_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! + procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! } @@ -1162,8 +1161,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const statusText = txtCopyingLink; statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false); statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, linkObj.getLinkType<RIGHT_SIDE>()); break; @@ -1174,8 +1173,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const statusText = txtCopyingLink; statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false); statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, linkObj.getLinkType<LEFT_SIDE>()); break; @@ -1183,8 +1182,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const case SO_DELETE_LEFT: statusText = delHandling_.getTxtRemovingSymLink(); statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError) break; @@ -1192,8 +1191,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const case SO_DELETE_RIGHT: statusText = delHandling_.getTxtRemovingSymLink(); statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError) break; @@ -1204,8 +1203,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const statusText = txtOverwritingLink; statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false); statusText.Replace(Zstr("%y"), linkObj.getFullName<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError) linkObj.removeObject<LEFT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) @@ -1219,8 +1218,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const statusText = txtOverwritingLink; statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false); statusText.Replace(Zstr("%y"), linkObj.getFullName<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError) linkObj.removeObject<RIGHT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) @@ -1231,8 +1230,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const case SO_COPY_METADATA_TO_LEFT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(linkObj.getFullName<LEFT_SIDE>(), @@ -1245,8 +1244,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const case SO_COPY_METADATA_TO_RIGHT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(linkObj.getFullName<RIGHT_SIDE>(), @@ -1267,7 +1266,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const //progress indicator update //indicator is updated only if file is sync'ed correctly (and if some sync was done)! - statusUpdater_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! + procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! } @@ -1284,11 +1283,11 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const statusText = txtCreatingFolder; statusText.Replace(Zstr("%x"), target, false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh //some check to catch the error that directory on source has been deleted externally after "compare"... - if (!ffs3::dirExists(dirObj.getFullName<RIGHT_SIDE>())) + if (!zen::dirExists(dirObj.getFullName<RIGHT_SIDE>())) throw FileError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(dirObj.getFullName<RIGHT_SIDE>()) + wxT("\"")); createDirectory(target, dirObj.getFullName<RIGHT_SIDE>(), copyFilePermissions_); //no symlink copying! break; @@ -1298,11 +1297,11 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const statusText = txtCreatingFolder; statusText.Replace(Zstr("%x"), target, false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh //some check to catch the error that directory on source has been deleted externally after "compare"... - if (!ffs3::dirExists(dirObj.getFullName<LEFT_SIDE>())) + if (!zen::dirExists(dirObj.getFullName<LEFT_SIDE>())) throw FileError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(dirObj.getFullName<LEFT_SIDE>()) + wxT("\"")); createDirectory(target, dirObj.getFullName<LEFT_SIDE>(), copyFilePermissions_); //no symlink copying! break; @@ -1311,8 +1310,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const //status information statusText = delHandling_.getTxtRemovingDir(); statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh delHandling_.removeFolder<LEFT_SIDE>(dirObj); //throw (FileError) { @@ -1322,7 +1321,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const dirObj.useSubFiles().clear(); dirObj.useSubLinks().clear(); dirObj.useSubDirs().clear(); - statusUpdater_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), subObjects.getDataToProcess().ToDouble()); + procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); } break; @@ -1330,8 +1329,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const //status information statusText = delHandling_.getTxtRemovingDir(); statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh delHandling_.removeFolder<RIGHT_SIDE>(dirObj); //throw (FileError) { @@ -1341,15 +1340,15 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const dirObj.useSubFiles().clear(); dirObj.useSubLinks().clear(); dirObj.useSubDirs().clear(); - statusUpdater_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), subObjects.getDataToProcess().ToDouble()); + procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); } break; case SO_COPY_METADATA_TO_LEFT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(dirObj.getFullName<LEFT_SIDE>(), @@ -1360,8 +1359,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const case SO_COPY_METADATA_TO_RIGHT: statusText = txtWritingAttributes; statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(dirObj.getFullName<RIGHT_SIDE>(), @@ -1383,7 +1382,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const //progress indicator update //indicator is updated only if directory is sync'ed correctly (and if some work was done)! - statusUpdater_.updateProcessedData(1, 0); //each call represents one processed file + procCallback_.updateProcessedData(1, 0); //each call represents one processed file } @@ -1392,7 +1391,7 @@ bool dataLossPossible(const Zstring& dirName, const SyncStatistics& folderPairSt { return folderPairStat.getCreate() + folderPairStat.getOverwrite() + folderPairStat.getConflict() == 0 && folderPairStat.getDelete() > 0 && //deletions only... (respect filtered items!) - !dirName.empty() && !ffs3::dirExists(dirName); + !dirName.empty() && !zen::dirExists(dirName); } @@ -1422,6 +1421,41 @@ struct EqualDependentDirectory : public std::binary_function<Zstring, Zstring, b Zstring(rhs.c_str(), std::min(lhs.length(), rhs.length()))); } }; + + +class EnforceUpdateDatabase +{ +public: + EnforceUpdateDatabase(const BaseDirMapping& baseMap, ProcessCallback& procCallback) : + dbWasWritten(false), + baseMap_(baseMap), + procCallback_(procCallback) {} + + ~EnforceUpdateDatabase() + { + try + { + tryWriteDB(); + } + catch (...) {} + } + + void tryWriteDB() //(try to gracefully) write db file; may throw in error-callback! + { + if (!dbWasWritten) + { + procCallback_.reportInfo(wxToZ(_("Generating database..."))); + procCallback_.forceUiRefresh(); + tryReportingError(procCallback_, boost::bind(zen::saveToDisk, boost::cref(baseMap_))); //may throw in error-callback! + dbWasWritten = true; + } + } + +private: + bool dbWasWritten; + const BaseDirMapping& baseMap_; + ProcessCallback& procCallback_; +}; } @@ -1441,12 +1475,12 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf const SyncStatistics statisticsTotal(folderCmp); //keep at beginning so that all gui elements are initialized properly - statusUpdater.initNewProcess(statisticsTotal.getCreate() + statisticsTotal.getOverwrite() + statisticsTotal.getDelete(), - common::convertToSigned(statisticsTotal.getDataToProcess()), - StatusHandler::PROCESS_SYNCHRONIZING); + procCallback.initNewProcess(statisticsTotal.getCreate() + statisticsTotal.getOverwrite() + statisticsTotal.getDelete(), + to<zen::Int64>(statisticsTotal.getDataToProcess()), + ProcessCallback::PROCESS_SYNCHRONIZING); if (!synchronizationNeeded(statisticsTotal)) - statusUpdater.reportInfo(wxToZ(_("Nothing to synchronize according to configuration!"))); //inform about this special case + procCallback.reportInfo(wxToZ(_("Nothing to synchronize according to configuration!"))); //inform about this special case std::deque<bool> skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found @@ -1463,7 +1497,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf typedef std::vector<std::pair<Zstring, Zstring> > DirPairList; DirPairList significantDiff; - typedef std::vector<std::pair<Zstring, std::pair<wxLongLong, wxLongLong> > > DirSpaceRequAvailList; //dirname / space required / space available + typedef std::vector<std::pair<Zstring, std::pair<zen::Int64, zen::Int64> > > DirSpaceRequAvailList; //dirname / space required / space available DirSpaceRequAvailList diskSpaceMissing; @@ -1502,7 +1536,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf if ((j->getBaseDir<LEFT_SIDE>(). empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || (j->getBaseDir<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode))) { - statusUpdater.reportFatalError(_("Cannot write to empty directory path!")); + procCallback.reportFatalError(_("Target directory name must not be empty!")); skipFolderPair[folderIndex] = true; continue; } @@ -1534,19 +1568,19 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf if (statisticsFolderPair.getOverwrite() + statisticsFolderPair.getDelete() > 0) { //test existence of Recycle Bin - if (folderPairCfg.handleDeletion == ffs3::MOVE_TO_RECYCLE_BIN && !ffs3::recycleBinExists()) + if (folderPairCfg.handleDeletion == zen::MOVE_TO_RECYCLE_BIN && !zen::recycleBinExists()) { - statusUpdater.reportFatalError(_("Recycle Bin not yet supported for this system!")); + procCallback.reportFatalError(_("Recycle Bin not yet supported for this system!")); skipFolderPair[folderIndex] = true; continue; } - if (folderPairCfg.handleDeletion == ffs3::MOVE_TO_CUSTOM_DIRECTORY) + if (folderPairCfg.handleDeletion == zen::MOVE_TO_CUSTOM_DIRECTORY) { //check if user-defined directory for deletion was specified if (folderPairCfg.custDelFolder.empty()) { - statusUpdater.reportFatalError(_("User-defined directory for deletion was not specified!")); + procCallback.reportFatalError(_("User-defined directory for deletion was not specified!")); skipFolderPair[folderIndex] = true; continue; } @@ -1556,13 +1590,13 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors(else we wouldn't arrive here) if (dataLossPossible(j->getBaseDir<LEFT_SIDE>(), statisticsFolderPair)) { - statusUpdater.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\"")); + procCallback.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\"")); skipFolderPair[folderIndex] = true; continue; } if (dataLossPossible(j->getBaseDir<RIGHT_SIDE>(), statisticsFolderPair)) { - statusUpdater.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\"") ); + procCallback.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\"") ); skipFolderPair[folderIndex] = true; continue; } @@ -1572,14 +1606,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf significantDiff.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>())); //check for sufficient free diskspace in left directory - const std::pair<wxLongLong, wxLongLong> spaceNeeded = freeDiskSpaceNeeded(*j, folderPairCfg.handleDeletion, folderPairCfg.custDelFolder); + const std::pair<zen::Int64, zen::Int64> spaceNeeded = freeDiskSpaceNeeded(*j, folderPairCfg.handleDeletion, folderPairCfg.custDelFolder); wxLongLong freeDiskSpaceLeft; if (wxGetDiskSpace(zToWx(j->getBaseDir<LEFT_SIDE>()), NULL, &freeDiskSpaceLeft)) { if (0 < freeDiskSpaceLeft && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0) - freeDiskSpaceLeft < spaceNeeded.first) - diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft))); + freeDiskSpaceLeft.ToDouble() < to<double>(spaceNeeded.first)) + diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft.ToDouble()))); } //check for sufficient free diskspace in right directory @@ -1587,8 +1621,8 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf if (wxGetDiskSpace(zToWx(j->getBaseDir<RIGHT_SIDE>()), NULL, &freeDiskSpaceRight)) { if (0 < freeDiskSpaceRight && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0) - freeDiskSpaceRight < spaceNeeded.second) - diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight))); + freeDiskSpaceRight.ToDouble() < to<double>(spaceNeeded.second)) + diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight.ToDouble()))); } } @@ -1597,7 +1631,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf { //show the first few conflicts in warning message also: wxString warningMessage = wxString(_("Unresolved conflicts existing!")) + - wxT(" (") + numberToStringSep(statisticsTotal.getConflict()) + wxT(")\n\n"); + wxT(" (") + toStringSep(statisticsTotal.getConflict()) + wxT(")\n\n"); const SyncStatistics::ConflictTexts& firstConflicts = statisticsTotal.getFirstConflicts(); //get first few sync conflicts for (SyncStatistics::ConflictTexts::const_iterator i = firstConflicts.begin(); i != firstConflicts.end(); ++i) @@ -1613,7 +1647,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf warningMessage += _("You can ignore conflicts and continue synchronization."); - statusUpdater.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts); + procCallback.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts); } @@ -1628,7 +1662,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf zToWx(i->second); warningMessage += wxString(wxT("\n\n")) +_("More than 50% of the total number of files will be copied or deleted!"); - statusUpdater.reportWarning(warningMessage, m_warnings.warningSignificantDifference); + procCallback.reportWarning(warningMessage, m_warnings.warningSignificantDifference); } @@ -1640,10 +1674,10 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf for (DirSpaceRequAvailList::const_iterator i = diskSpaceMissing.begin(); i != diskSpaceMissing.end(); ++i) warningMessage += wxString(wxT("\n\n")) + wxT("\"") + zToWx(i->first) + wxT("\"\n") + - _("Free disk space required:") + wxT(" ") + formatFilesizeToShortString(i->second.first) + wxT("\n") + - _("Free disk space available:") + wxT(" ") + formatFilesizeToShortString(i->second.second); + _("Free disk space required:") + wxT(" ") + formatFilesizeToShortString(to<zen::UInt64>(i->second.first)) + wxT("\n") + + _("Free disk space available:") + wxT(" ") + formatFilesizeToShortString(to<zen::UInt64>(i->second.second)); - statusUpdater.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace); + procCallback.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace); } @@ -1660,7 +1694,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf for (std::vector<Zstring>::const_iterator i = conflictDirs.begin(); i != conflictDirs.end(); ++i) warningMessage += wxString(wxT("\n")) + wxT("\"") + zToWx(*i) + wxT("\""); - statusUpdater.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess); + procCallback.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess); } //-------------------end of basic checks------------------------------------------ @@ -1668,18 +1702,18 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf #ifdef FFS_WIN struct ShadowCallback : public shadow::WaitingForShadow { - ShadowCallback(StatusHandler& updater) : statusUpdater_(updater) {} + ShadowCallback(ProcessCallback& updater) : procCallback_(updater) {} virtual void requestUiRefresh() //allowed to throw exceptions { - statusUpdater_.requestUiRefresh(); + procCallback_.requestUiRefresh(); } virtual void reportInfo(const Zstring& text) { - statusUpdater_.reportInfo(text); + procCallback_.reportInfo(text); } private: - StatusHandler& statusUpdater_; - } shadowCb(statusUpdater); + ProcessCallback& procCallback_; + } shadowCb(procCallback); //shadow copy buffer: per sync-instance, not folder pair boost::scoped_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new shadow::ShadowCopy(&shadowCb) : NULL); @@ -1689,6 +1723,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf { //prevent shutdown while synchronization is in progress util::DisableStandby dummy; + (void)dummy; //loop through all directory pairs assert(syncConfig.size() == folderCmp.size()); @@ -1714,21 +1749,21 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf const wxString statusTxt = wxString(_("Processing folder pair:")) + wxT(" \n") + wxT("\t") + left + wxT("\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\"")+ wxT(" \n") + wxT("\t") + right + wxT("\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\""); - statusUpdater.reportInfo(wxToZ(statusTxt)); + procCallback.reportInfo(wxToZ(statusTxt)); //------------------------------------------------------------------------------------------ //create base directories first (if not yet existing) -> no symlink or attribute copying! -> single error message instead of one per file (e.g. unplugged network drive) const Zstring dirnameLeft = j->getBaseDir<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR); - if (!dirnameLeft.empty() && !ffs3::dirExists(dirnameLeft)) + if (!dirnameLeft.empty() && !zen::dirExists(dirnameLeft)) { - if (!tryReportingError(statusUpdater, boost::bind(ffs3::createDirectory, boost::cref(dirnameLeft)))) //may throw in error-callback! + if (!tryReportingError(procCallback, boost::bind(zen::createDirectory, boost::cref(dirnameLeft)))) //may throw in error-callback! continue; //skip this folder pair } const Zstring dirnameRight = j->getBaseDir<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR); - if (!dirnameRight.empty() && !ffs3::dirExists(dirnameRight)) + if (!dirnameRight.empty() && !zen::dirExists(dirnameRight)) { - if (!tryReportingError(statusUpdater, boost::bind(ffs3::createDirectory, boost::cref(dirnameRight)))) //may throw in error-callback! + if (!tryReportingError(procCallback, boost::bind(zen::createDirectory, boost::cref(dirnameRight)))) //may throw in error-callback! continue; //skip this folder pair } //------------------------------------------------------------------------------------------ @@ -1738,11 +1773,16 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf folderPairCfg.handleDeletion, folderPairCfg.custDelFolder, j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>(), - statusUpdater); + procCallback); //------------------------------------------------------------------------------------------ //execute synchronization recursively + //update synchronization database (automatic sync only) + std::auto_ptr<EnforceUpdateDatabase> dummyUpdateDb; + if (folderPairCfg.inAutomaticMode) + dummyUpdateDb.reset(new EnforceUpdateDatabase(*j, procCallback)); + //enforce removal of invalid entries (where element on both sides is empty) struct RemoveInvalid { @@ -1769,20 +1809,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //(try to gracefully) cleanup temporary folders (Recycle bin optimization) -> will be done in ~DeletionHandling anyway... currentDelHandling.tryCleanup(); //show error dialog if necessary - //------------------------------------------------------------------------------------------ - - //update synchronization database (automatic sync only) - if (folderPairCfg.inAutomaticMode) - { - statusUpdater.reportInfo(wxToZ(_("Generating database..."))); - statusUpdater.forceUiRefresh(); - tryReportingError(statusUpdater, boost::bind(ffs3::saveToDisk, boost::cref(*j))); //may throw in error-callback! - } + //(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...) + if (dummyUpdateDb.get()) + dummyUpdateDb->tryWriteDB(); } } catch (const std::exception& e) { - statusUpdater.reportFatalError(wxString::FromUTF8(e.what())); + procCallback.reportFatalError(wxString::FromUTF8(e.what())); } } @@ -1791,11 +1825,11 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //callback functionality for smooth progress indicators template <class DelTargetCommand> -class WhileCopying : public ffs3::CallbackCopyFile //callback functionality +class WhileCopying : public zen::CallbackCopyFile //callback functionality { public: - WhileCopying(wxLongLong& bytesTransferredLast, - StatusHandler& statusHandler, + WhileCopying(zen::Int64& bytesTransferredLast, + ProcessCallback& statusHandler, const DelTargetCommand& cmd) : bytesTransferredLast_(bytesTransferredLast), statusHandler_(statusHandler), @@ -1803,10 +1837,9 @@ public: virtual void deleteTargetFile(const Zstring& targetFile) { cmd_(); } - virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred) + virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred) { - //convert to signed - const wxLongLong totalBytes = common::convertToSigned(totalBytesTransferred); + const zen::Int64 totalBytes = to<zen::Int64>(totalBytesTransferred); //convert to signed //inform about the (differential) processed amount of data statusHandler_.updateProcessedData(0, totalBytes - bytesTransferredLast_); @@ -1823,8 +1856,8 @@ public: } private: - wxLongLong& bytesTransferredLast_; - StatusHandler& statusHandler_; + zen::Int64& bytesTransferredLast_; + ProcessCallback& statusHandler_; DelTargetCommand cmd_; }; @@ -1832,17 +1865,17 @@ private: class CleanUpStats //lambdas coming soon... unfortunately Loki::ScopeGuard is no option because of lazy function argument evaluation (-1 * ...) { bool dismissed; - StatusHandler& statusUpdater_; - const wxLongLong& bytesTransferred_; + ProcessCallback& procCallback_; + zen::Int64 bytesTransferred_; public: - CleanUpStats(StatusHandler& statusUpdater, const wxLongLong& bytesTransferred) : dismissed(false), statusUpdater_(statusUpdater), bytesTransferred_(bytesTransferred) {} + CleanUpStats(ProcessCallback& procCallback, zen::Int64 bytesTransferred) : dismissed(false), procCallback_(procCallback), bytesTransferred_(bytesTransferred) {} ~CleanUpStats() { if (!dismissed) try { - statusUpdater_.updateProcessedData(0, bytesTransferred_ * -1); //throw ? + procCallback_.updateProcessedData(0, bytesTransferred_ * -1); //throw ? } catch (...) {} } @@ -1850,28 +1883,28 @@ public: }; -//copy file while executing statusUpdater->requestUiRefresh() calls +//copy file while executing procCallback->requestUiRefresh() calls template <class DelTargetCommand> -void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, const wxULongLong& totalBytesToCpy, int recursionLvl) const +void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, zen::UInt64 totalBytesToCpy, int recursionLvl) const { const int exceptionPaths = 2; try { //start of (possibly) long-running copy process: ensure status updates are performed regularly - wxLongLong totalBytesTransferred; - CleanUpStats dummy(statusUpdater_, totalBytesTransferred); //error situation: undo communication of processed amount of data + zen::Int64 totalBytesTransferred; + CleanUpStats dummy(procCallback_, totalBytesTransferred); //error situation: undo communication of processed amount of data - WhileCopying<DelTargetCommand> callback(totalBytesTransferred, statusUpdater_, cmd); + WhileCopying<DelTargetCommand> callback(totalBytesTransferred, procCallback_, cmd); - ffs3::copyFile(source, //type File implicitly means symlinks need to be dereferenced! - target, - copyFilePermissions_, - &callback); //throw (FileError, ErrorFileLocked); + zen::copyFile(source, //type File implicitly means symlinks need to be dereferenced! + target, + copyFilePermissions_, + &callback); //throw (FileError, ErrorFileLocked); //inform about the (remaining) processed amount of data dummy.dismiss(); - statusUpdater_.updateProcessedData(0, common::convertToSigned(totalBytesToCpy) - totalBytesTransferred); + procCallback_.updateProcessedData(0, to<zen::Int64>(totalBytesToCpy) - totalBytesTransferred); } #ifdef FFS_WIN catch (ErrorFileLocked&) @@ -1910,7 +1943,7 @@ void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstrin if (!targetDir.empty()) { - ffs3::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError) + zen::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError) /*symbolic link handling: if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> => setting irrelevant @@ -1937,11 +1970,11 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta switch (type) { case LinkDescriptor::TYPE_DIR: - ffs3::copySymlink(source, target, SYMLINK_TYPE_DIR, copyFilePermissions_); //throw (FileError) + zen::copySymlink(source, target, SYMLINK_TYPE_DIR, copyFilePermissions_); //throw (FileError) break; case LinkDescriptor::TYPE_FILE: //Windows: true file symlink; Linux: file-link or broken link - ffs3::copySymlink(source, target, SYMLINK_TYPE_FILE, copyFilePermissions_); //throw (FileError) + zen::copySymlink(source, target, SYMLINK_TYPE_FILE, copyFilePermissions_); //throw (FileError) break; } } @@ -1954,9 +1987,9 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta const Zstring targetDir = target.BeforeLast(common::FILE_NAME_SEPARATOR); const Zstring templateDir = source.BeforeLast(common::FILE_NAME_SEPARATOR); - if (!targetDir.empty() && !ffs3::dirExists(targetDir)) + if (!targetDir.empty() && !zen::dirExists(targetDir)) { - ffs3::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError) + zen::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError) /*symbolic link handling: if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> => setting irrelevant @@ -1972,7 +2005,7 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta } -template <ffs3::SelectedSide side> +template <zen::SelectedSide side> void SynchronizeFolderPair::deleteSymlink(const SymLinkMapping& linkObj) const { switch (linkObj.getLinkType<side>()) @@ -2000,12 +2033,11 @@ struct VerifyCallback void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* callback) // throw (FileError) { - const size_t BUFFER_SIZE = 1024 * 1024; //1024 kb seems to be a reasonable buffer size - static const boost::scoped_array<char> memory1(new char[BUFFER_SIZE]); - static const boost::scoped_array<char> memory2(new char[BUFFER_SIZE]); + static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size + static std::vector<char> memory2(1024 * 1024); #ifdef FFS_WIN - wxFile file1(ffs3::applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification! + wxFile file1(zen::applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification! #elif defined FFS_LINUX wxFile file1(::open(source.c_str(), O_RDONLY)); //utilize UTF-8 filename #endif @@ -2013,7 +2045,7 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(source) + wxT("\"")); #ifdef FFS_WIN - wxFile file2(ffs3::applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification! + wxFile file2(zen::applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification! #elif defined FFS_LINUX wxFile file2(::open(target.c_str(), O_RDONLY)); //utilize UTF-8 filename #endif @@ -2022,15 +2054,15 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c do { - const size_t length1 = file1.Read(memory1.get(), BUFFER_SIZE); + const size_t length1 = file1.Read(&memory1[0], memory1.size()); if (file1.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(source) + wxT("\"")); callback->updateStatus(); //send progress updates - const size_t length2 = file2.Read(memory2.get(), BUFFER_SIZE); + const size_t length2 = file2.Read(&memory2[0], memory2.size()); if (file2.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(target) + wxT("\"")); callback->updateStatus(); //send progress updates - if (length1 != length2 || ::memcmp(memory1.get(), memory2.get(), length1) != 0) + if (length1 != length2 || ::memcmp(&memory1[0], &memory2[0], length1) != 0) { const wxString errorMsg = wxString(_("Data verification error: Source and target file have different content!")) + wxT("\n"); throw FileError(errorMsg + wxT("\"") + zToWx(source) + wxT("\" -> \n\"") + zToWx(target) + wxT("\"")); @@ -2049,7 +2081,7 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c class VerifyStatusUpdater : public VerifyCallback { public: - VerifyStatusUpdater(StatusHandler& statusHandler) : statusHandler_(statusHandler) {} + VerifyStatusUpdater(ProcessCallback& statusHandler) : statusHandler_(statusHandler) {} virtual void updateStatus() { @@ -2057,7 +2089,7 @@ public: } private: - StatusHandler& statusHandler_; + ProcessCallback& statusHandler_; }; @@ -2065,10 +2097,10 @@ void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& { Zstring statusText = txtVerifying; statusText.Replace(Zstr("%x"), target, false); - statusUpdater_.reportInfo(statusText); - statusUpdater_.requestUiRefresh(); //trigger display refresh + procCallback_.reportInfo(statusText); + procCallback_.requestUiRefresh(); //trigger display refresh - VerifyStatusUpdater callback(statusUpdater_); + VerifyStatusUpdater callback(procCallback_); - tryReportingError(statusUpdater_, boost::bind(&::verifyFiles, boost::ref(source), boost::ref(target), &callback)); + tryReportingError(procCallback_, boost::bind(&::verifyFiles, boost::ref(source), boost::ref(target), &callback)); } diff --git a/synchronization.h b/synchronization.h index d44d03ba..62a55d99 100644 --- a/synchronization.h +++ b/synchronization.h @@ -9,11 +9,10 @@ #include "file_hierarchy.h" #include "library/process_xml.h" +#include "library/status_handler.h" -class StatusHandler; - -namespace ffs3 +namespace zen { class SyncStatistics @@ -36,7 +35,7 @@ public: typedef std::vector<std::pair<Zstring, wxString> > ConflictTexts; // Pair(filename/conflict text) const ConflictTexts& getFirstConflicts() const; //get first few sync conflicts - wxULongLong getDataToProcess() const; + zen::UInt64 getDataToProcess() const; size_t getRowCount() const; private: @@ -53,7 +52,7 @@ private: int deleteLeft, deleteRight; int conflict; ConflictTexts firstConflicts; //save the first few conflict texts to display as a warning message - wxULongLong dataToProcess; + zen::UInt64 dataToProcess; size_t rowsTotal; }; @@ -81,7 +80,7 @@ public: bool verifyCopiedFiles, bool copyLockedFiles, bool copyFilePermissions, - StatusHandler& handler); + ProcessCallback& handler); //CONTRACT: syncConfig must have SAME SIZE folderCmp and correspond per row! void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp); @@ -96,7 +95,7 @@ private: //warnings xmlAccess::OptionalDialogs& m_warnings; - StatusHandler& statusUpdater; + ProcessCallback& procCallback; }; diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp index ca489916..18b8a555 100644 --- a/ui/batch_config.cpp +++ b/ui/batch_config.cpp @@ -13,70 +13,85 @@ #include "../shared/help_provider.h" #include "../shared/file_handling.h" #include "msg_popup.h" +#include "gui_generated.h" #include <wx/dnd.h> #include <wx/msgdlg.h> +#include "../shared/util.h" #include "../shared/mouse_move_dlg.h" -using namespace ffs3; +using namespace zen; +class DirectoryPairBatchFirst; +class DirectoryPairBatch; -class BatchFileDropEvent : public wxFileDropTarget + +class BatchDialog: public BatchDlgGenerated { + friend class BatchFileDropEvent; + template <class GuiPanel> + friend class FolderPairCallback; + public: - BatchFileDropEvent(BatchDialog& dlg) : - batchDlg(dlg) {} + BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg); + BatchDialog(wxWindow* window, const wxString& filename); + ~BatchDialog(); - virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray) - { - if (fileArray.IsEmpty()) - return false; +private: + void init(); - std::vector<wxString> filenames; - for (size_t i = 0; i < fileArray.GetCount(); ++i) - filenames.push_back(fileArray[i]); + virtual void OnCmpSettings( wxCommandEvent& event); + virtual void OnSyncSettings( wxCommandEvent& event); + virtual void OnConfigureFilter( wxCommandEvent& event); + virtual void OnHelp( wxCommandEvent& event); - switch (xmlAccess::getMergeType(filenames)) //throw () - { - case xmlAccess::MERGE_BATCH: - case xmlAccess::MERGE_GUI: - case xmlAccess::MERGE_GUI_BATCH: - if (filenames.size() == 1) - { - batchDlg.loadBatchFile(filenames[0]); - return false; - } - else - { - xmlAccess::XmlBatchConfig batchCfg; - try - { - convertConfig(filenames, batchCfg); //throw (xmlAccess::XmlError) - } - catch (const xmlAccess::XmlError& error) - { - if (error.getSeverity() == xmlAccess::XmlError::WARNING) - wxMessageBox(error.msg(), _("Warning"), wxOK | wxICON_WARNING); - else - { - wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR); - return false; - } - } - batchDlg.loadBatchCfg(batchCfg); - } - break; + void OnGlobalFilterOpenContext(wxCommandEvent& event); + void OnGlobalFilterRemConfirm(wxCommandEvent& event); + virtual void OnCheckSilent( wxCommandEvent& event); + virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event); + virtual void OnClose( wxCloseEvent& event); + virtual void OnCancel( wxCommandEvent& event); + virtual void OnSaveBatchJob( wxCommandEvent& event); + virtual void OnLoadBatchJob( wxCommandEvent& event); + virtual void OnAddFolderPair( wxCommandEvent& event); + virtual void OnRemoveFolderPair( wxCommandEvent& event); + virtual void OnRemoveTopFolderPair(wxCommandEvent& event); + void OnFilesDropped(FFSFileDropEvent& event); - case xmlAccess::MERGE_OTHER: - wxMessageBox(_("Invalid FreeFileSync config file!"), _("Error"), wxOK | wxICON_ERROR); - break; - } + void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false); + void removeAddFolderPair(const int pos); + void clearAddFolderPairs(); - return false; - } + void updateGuiForFolderPair(); -private: - BatchDialog& batchDlg; + void updateGui(); //re-evaluate gui after config changes + + void showNotebookpage(wxWindow* page, const wxString& pageName, bool show); + + //error handling + //xmlAccess::OnError getSelectionHandleError() const; -> obsolete, use getEnumVal() + void setSelectionHandleError(const xmlAccess::OnError value); + void OnChangeErrorHandling(wxCommandEvent& event); + + bool saveBatchFile(const wxString& filename); + void loadBatchFile(const wxString& filename); + void loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg); + + xmlAccess::XmlBatchConfig getCurrentConfiguration() const; + + boost::shared_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!! + std::vector<DirectoryPairBatch*> additionalFolderPairs; + + //used when saving batch file + wxString proposedBatchFileName; + + xmlAccess::XmlBatchConfig localBatchCfg; + + std::auto_ptr<wxMenu> contextMenu; + + std::auto_ptr<zen::DirectoryName> logfileDir; + + zen::EnumDescrList<xmlAccess::OnError> enumDescrMap; }; //################################################################################################################################### @@ -144,20 +159,14 @@ public: dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} - void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) { setConfig(syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } - Zstring getLeftDir() const - { - return dirNameLeft.getName(); - } - Zstring getRightDir() const - { - return dirNameRight.getName(); - } + wxString getLeftDir () const { return dirNameLeft .getName(); } + wxString getRightDir() const { return dirNameRight.getName(); } private: //support for drag and drop @@ -180,20 +189,14 @@ public: *batchDialog.m_dirPickerRight, *batchDialog.m_directoryRight) {} - void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) { setConfig(syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } - Zstring getLeftDir() const - { - return dirNameLeft.getName(); - } - Zstring getRightDir() const - { - return dirNameRight.getName(); - } + wxString getLeftDir () const { return dirNameLeft .getName(); } + wxString getRightDir() const { return dirNameRight.getName(); } private: //support for drag and drop @@ -225,17 +228,17 @@ BatchDialog::~BatchDialog() {} //non-inline destructor for std::auto_ptr to work void BatchDialog::init() { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, - m_panelOverview, - m_panelLogging, - m_staticText56, - m_staticText44, - m_bitmap27); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif wxWindowUpdateLocker dummy(this); //avoid display distortion + enumDescrMap. + add(xmlAccess::ON_ERROR_POPUP , _("Show popup") , _("Show popup on errors or warnings")). + add(xmlAccess::ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")). + add(xmlAccess::ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately")); + + m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("cmpConfig"))); m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfig"))); @@ -247,7 +250,9 @@ void BatchDialog::init() m_bpButtonFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(BatchDialog::OnGlobalFilterOpenContext), NULL, this); //prepare drag & drop for loading of *.ffs_batch files - SetDropTarget(new BatchFileDropEvent(*this)); + setupFileDrop(*this); + Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(BatchDialog::OnFilesDropped), NULL, this); + logfileDir.reset(new DirectoryName(*m_panelLogging, *m_dirPickerLogfileDir, *m_textCtrlLogfileDir, sbSizerLogfileDir)); //set icons for this dialog @@ -259,72 +264,21 @@ void BatchDialog::init() //------------------- error handling -------------------------- -xmlAccess::OnError BatchDialog::getSelectionHandleError() const -{ - switch (m_choiceHandleError->GetSelection()) - { - case 0: - return xmlAccess::ON_ERROR_POPUP; - case 1: - return xmlAccess::ON_ERROR_IGNORE; - case 2: - return xmlAccess::ON_ERROR_EXIT; - default: - assert(false); - return xmlAccess::ON_ERROR_POPUP; - } -} - - -void BatchDialog::updateToolTipErrorHandling(const xmlAccess::OnError value) -{ - switch (value) - { - case xmlAccess::ON_ERROR_POPUP: - m_choiceHandleError->SetToolTip(_("Show popup on errors or warnings")); - break; - case xmlAccess::ON_ERROR_IGNORE: - m_choiceHandleError->SetToolTip(_("Hide all error and warning messages")); - break; - case xmlAccess::ON_ERROR_EXIT: - m_choiceHandleError->SetToolTip(_("Abort synchronization immediately")); - break; - } -} - - void BatchDialog::setSelectionHandleError(const xmlAccess::OnError value) { - m_choiceHandleError->Clear(); - m_choiceHandleError->Append(_("Show popup")); - m_choiceHandleError->Append(_("Ignore errors")); - if (m_checkBoxSilent->GetValue()) //this option shall be available for silent mode only! - m_choiceHandleError->Append(_("Exit instantly")); - - //default - m_choiceHandleError->SetSelection(0); - - switch (value) + if (m_checkBoxSilent->GetValue()) + setEnumVal(enumDescrMap, *m_choiceHandleError, value); + else { - case xmlAccess::ON_ERROR_POPUP: - m_choiceHandleError->SetSelection(0); - break; - case xmlAccess::ON_ERROR_IGNORE: - m_choiceHandleError->SetSelection(1); - break; - case xmlAccess::ON_ERROR_EXIT: - if (m_checkBoxSilent->GetValue()) //this option shall be available for silent mode only! - m_choiceHandleError->SetSelection(2); - break; + EnumDescrList<xmlAccess::OnError> tmp(enumDescrMap); + tmp.descrList.pop_back(); //remove "Exit instantly" -> this option shall be available for silent mode only! + setEnumVal(tmp, *m_choiceHandleError, value); } - - updateToolTipErrorHandling(getSelectionHandleError()); } - void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event) { - updateToolTipErrorHandling(getSelectionHandleError()); + updateTooltipEnumVal(enumDescrMap, *m_choiceHandleError); } @@ -335,9 +289,9 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event) wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - if (ffs3::showCompareCfgDialog(windowPos, - localBatchCfg.mainCfg.compareVar, - localBatchCfg.mainCfg.handleSymlinks) == DefaultReturnCode::BUTTON_OKAY) + if (zen::showCompareCfgDialog(windowPos, + localBatchCfg.mainCfg.compareVar, + localBatchCfg.mainCfg.handleSymlinks) == ReturnSmallDlg::BUTTON_OKAY) { updateGui(); } @@ -346,13 +300,11 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event) void BatchDialog::OnSyncSettings(wxCommandEvent& event) { - SyncCfgDialog syncDlg(this, - localBatchCfg.mainCfg.compareVar, + if (showSyncConfigDlg(localBatchCfg.mainCfg.compareVar, localBatchCfg.mainCfg.syncConfiguration, localBatchCfg.mainCfg.handleDeletion, localBatchCfg.mainCfg.customDeletionDirectory, - NULL); - if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY) + NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter { updateGui(); } @@ -362,8 +314,7 @@ void BatchDialog::OnSyncSettings(wxCommandEvent& event) void BatchDialog::OnConfigureFilter(wxCommandEvent& event) { if (showFilterDialog(true, //is main filter dialog - localBatchCfg.mainCfg.globalFilter.includeFilter, - localBatchCfg.mainCfg.globalFilter.excludeFilter) == DefaultReturnCode::BUTTON_OKAY) + localBatchCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY) { updateGui(); } @@ -427,7 +378,7 @@ void BatchDialog::OnCheckSilent(wxCommandEvent& event) updateGui(); //reset error handling depending on "m_checkBoxSilent" - setSelectionHandleError(getSelectionHandleError()); + setSelectionHandleError(getEnumVal(enumDescrMap, *m_choiceHandleError)); } @@ -437,12 +388,57 @@ void BatchDialog::OnChangeMaxLogCountTxt(wxCommandEvent& event) } +void BatchDialog::OnFilesDropped(FFSFileDropEvent& event) +{ + if (event.getFiles().empty()) + return; + + std::vector<wxString> fileList = event.getFiles(); + + switch (xmlAccess::getMergeType(fileList)) //throw () + { + case xmlAccess::MERGE_BATCH: + case xmlAccess::MERGE_GUI: + case xmlAccess::MERGE_GUI_BATCH: + if (fileList.size() == 1) + { + loadBatchFile(fileList[0]); + return; + } + else + { + xmlAccess::XmlBatchConfig batchCfg; + try + { + convertConfig(fileList, batchCfg); //throw (xmlAccess::XmlError) + } + catch (const xmlAccess::XmlError& error) + { + if (error.getSeverity() == xmlAccess::XmlError::WARNING) + wxMessageBox(error.msg(), _("Warning"), wxOK | wxICON_WARNING); + else + { + wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR); + return; + } + } + loadBatchCfg(batchCfg); + } + break; + + case xmlAccess::MERGE_OTHER: + wxMessageBox(_("Invalid FreeFileSync config file!"), _("Error"), wxOK | wxICON_ERROR); + break; + } +} + + void BatchDialog::OnHelp(wxCommandEvent& event) { #ifdef FFS_WIN - ffs3::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html")); + zen::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html")); #elif defined FFS_LINUX - ffs3::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html")); + zen::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html")); #endif } @@ -478,13 +474,13 @@ void BatchDialog::showNotebookpage(wxWindow* page, const wxString& pageName, boo void BatchDialog::OnClose(wxCloseEvent& event) { - EndModal(0); + EndModal(ReturnBatchConfig::BUTTON_CANCEL); } void BatchDialog::OnCancel(wxCommandEvent& event) { - EndModal(0); + EndModal(ReturnBatchConfig::BUTTON_CANCEL); } @@ -502,13 +498,10 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) if (filePicker.ShowModal() == wxID_OK) { const wxString newFileName = filePicker.GetPath(); - if (ffs3::fileExists(wxToZ(newFileName))) + if (zen::fileExists(wxToZ(newFileName))) { - QuestionDlg messageDlg(this, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL, - wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")); - - if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES) + if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, + wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES) { OnSaveBatchJob(event); //retry return; @@ -517,7 +510,7 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) //create batch file if (saveBatchFile(newFileName)) - EndModal(BATCH_FILE_SAVED); + EndModal(ReturnBatchConfig::BATCH_FILE_SAVED); } } @@ -532,10 +525,10 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event) inline -FolderPairEnh getEnahncedPair(const DirectoryPairBatch* panel) +FolderPairEnh getEnhancedPair(const DirectoryPairBatch* panel) { - return FolderPairEnh(panel->getLeftDir(), - panel->getRightDir(), + return FolderPairEnh(wxToZ(panel->getLeftDir()), + wxToZ(panel->getRightDir()), panel->getAltSyncConfig(), panel->getAltFilterConfig()); } @@ -548,22 +541,22 @@ xmlAccess::XmlBatchConfig BatchDialog::getCurrentConfiguration() const //load parameter with ownership within wxWidgets controls... //first folder pair - batchCfg.mainCfg.firstPair = FolderPairEnh(firstFolderPair->getLeftDir(), - firstFolderPair->getRightDir(), + batchCfg.mainCfg.firstPair = FolderPairEnh(wxToZ(firstFolderPair->getLeftDir()), + wxToZ(firstFolderPair->getRightDir()), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); //add additional pairs batchCfg.mainCfg.additionalPairs.clear(); std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(), - std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnahncedPair); + std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnhancedPair); //load structure with batch settings "batchCfg" batchCfg.silent = m_checkBoxSilent->GetValue(); - batchCfg.logFileDirectory = zToWx(logfileDir->getName()); + batchCfg.logFileDirectory = logfileDir->getName(); batchCfg.logFileCountMax = m_spinCtrlLogCountMax->GetValue(); - batchCfg.handleError = getSelectionHandleError(); + batchCfg.handleError = getEnumVal(enumDescrMap, *m_choiceHandleError); return batchCfg; } @@ -633,12 +626,12 @@ void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg) //error handling is dependent from m_checkBoxSilent! /|\ \|/ setSelectionHandleError(batchCfg.handleError); - logfileDir->setName(wxToZ(batchCfg.logFileDirectory)); + logfileDir->setName(batchCfg.logFileDirectory); m_spinCtrlLogCountMax->SetValue(static_cast<int>(batchCfg.logFileCountMax)); //attention: this one emits a "change value" event!! => updateGui() called implicitly! //set first folder pair - firstFolderPair->setValues(batchCfg.mainCfg.firstPair.leftDirectory, - batchCfg.mainCfg.firstPair.rightDirectory, + firstFolderPair->setValues(zToWx(batchCfg.mainCfg.firstPair.leftDirectory), + zToWx(batchCfg.mainCfg.firstPair.rightDirectory), batchCfg.mainCfg.firstPair.altSyncConfig, batchCfg.mainCfg.firstPair.localFilter); @@ -667,8 +660,8 @@ void BatchDialog::OnAddFolderPair(wxCommandEvent& event) //clear first pair const FolderPairEnh cfgEmpty; - firstFolderPair->setValues(cfgEmpty.leftDirectory, - cfgEmpty.rightDirectory, + firstFolderPair->setValues(zToWx(cfgEmpty.leftDirectory), + zToWx(cfgEmpty.rightDirectory), cfgEmpty.altSyncConfig, cfgEmpty.localFilter); } @@ -694,11 +687,11 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event) if (additionalFolderPairs.size() > 0) { //get settings from second folder pair - const FolderPairEnh cfgSecond = getEnahncedPair(additionalFolderPairs[0]); + const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]); //reset first pair - firstFolderPair->setValues(cfgSecond.leftDirectory, - cfgSecond.rightDirectory, + firstFolderPair->setValues(zToWx(cfgSecond.leftDirectory), + zToWx(cfgSecond.rightDirectory), cfgSecond.altSyncConfig, cfgSecond.localFilter); @@ -718,8 +711,7 @@ void BatchDialog::updateGuiForFolderPair() //adapt local filter and sync cfg for first folder pair if (additionalFolderPairs.size() == 0 && firstFolderPair->getAltSyncConfig().get() == NULL && - NameFilter(firstFolderPair->getAltFilterConfig().includeFilter, - firstFolderPair->getAltFilterConfig().excludeFilter).isNull()) + isNullFilter(firstFolderPair->getAltFilterConfig())) { m_bpButtonLocalFilter->Hide(); m_bpButtonAltSyncCfg->Hide(); @@ -753,14 +745,14 @@ void BatchDialog::updateGuiForFolderPair() } -void BatchDialog::addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront) +void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront) { wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion if (!newPairs.empty()) { //add folder pairs - for (std::vector<ffs3::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i) + for (std::vector<zen::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i) { DirectoryPairBatch* newPair = new DirectoryPairBatch(m_scrolledWindow6, *this); @@ -779,8 +771,8 @@ void BatchDialog::addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BatchDialog::OnRemoveFolderPair), NULL, this ); //set alternate configuration - newPair->setValues(i->leftDirectory, - i->rightDirectory, + newPair->setValues(zToWx(i->leftDirectory), + zToWx(i->rightDirectory), i->altSyncConfig, i->localFilter); } @@ -893,3 +885,18 @@ bool BatchDialog::createBatchFile(const wxString& filename) return true; } */ + + + +ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const wxString& filename) +{ + BatchDialog batchDlg(NULL, filename); + return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal()); +} + + +ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg) +{ + BatchDialog batchDlg(NULL, batchCfg); + return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal()); +} diff --git a/ui/batch_config.h b/ui/batch_config.h index 88d5e4eb..574fef66 100644 --- a/ui/batch_config.h +++ b/ui/batch_config.h @@ -7,89 +7,23 @@ #ifndef BATCHCONFIG_H_INCLUDED #define BATCHCONFIG_H_INCLUDED -#include "gui_generated.h" #include "../library/process_xml.h" -namespace ffs3 +namespace zen { -class DirectoryName; -} - -class DirectoryPairBatch; -class DirectoryPairBatchFirst; - - -class BatchDialog: public BatchDlgGenerated +struct ReturnBatchConfig { - friend class BatchFileDropEvent; - template <class GuiPanel> - friend class FolderPairCallback; - -public: - BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg); - BatchDialog(wxWindow* window, const wxString& filename); - ~BatchDialog(); - - enum + enum ButtonPressed { - BATCH_FILE_SAVED = 15 + BUTTON_CANCEL, + BATCH_FILE_SAVED = 1 }; +}; -private: - void init(); - - virtual void OnCmpSettings( wxCommandEvent& event); - virtual void OnSyncSettings( wxCommandEvent& event); - virtual void OnConfigureFilter( wxCommandEvent& event); - - virtual void OnHelp( wxCommandEvent& event); - - void OnGlobalFilterOpenContext(wxCommandEvent& event); - void OnGlobalFilterRemConfirm(wxCommandEvent& event); - virtual void OnCheckSilent( wxCommandEvent& event); - virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event); - virtual void OnClose( wxCloseEvent& event); - virtual void OnCancel( wxCommandEvent& event); - virtual void OnSaveBatchJob( wxCommandEvent& event); - virtual void OnLoadBatchJob( wxCommandEvent& event); - virtual void OnAddFolderPair( wxCommandEvent& event); - virtual void OnRemoveFolderPair( wxCommandEvent& event); - virtual void OnRemoveTopFolderPair(wxCommandEvent& event); - - void addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront = false); - void removeAddFolderPair(const int pos); - void clearAddFolderPairs(); - - void updateGuiForFolderPair(); - - void updateGui(); //re-evaluate gui after config changes - - void showNotebookpage(wxWindow* page, const wxString& pageName, bool show); - - //error handling - xmlAccess::OnError getSelectionHandleError() const; - void setSelectionHandleError(const xmlAccess::OnError value); - void OnChangeErrorHandling(wxCommandEvent& event); - void updateToolTipErrorHandling(const xmlAccess::OnError value); - - bool saveBatchFile(const wxString& filename); - void loadBatchFile(const wxString& filename); - void loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg); - - xmlAccess::XmlBatchConfig getCurrentConfiguration() const; - - boost::shared_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!! - std::vector<DirectoryPairBatch*> additionalFolderPairs; - - //used when saving batch file - wxString proposedBatchFileName; - - xmlAccess::XmlBatchConfig localBatchCfg; - - std::auto_ptr<wxMenu> contextMenu; +ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const wxString& filename); +ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg); +} - std::auto_ptr<ffs3::DirectoryName> logfileDir; -}; #endif // BATCHCONFIG_H_INCLUDED diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp index 859415fa..b9eff9fa 100644 --- a/ui/batch_status_handler.cpp +++ b/ui/batch_status_handler.cpp @@ -5,7 +5,6 @@ // ************************************************************************** // #include "batch_status_handler.h" -//#include "small_dlgs.h" #include "msg_popup.h" #include <wx/ffile.h> #include <wx/msgdlg.h> @@ -18,12 +17,12 @@ #include "../shared/util.h" #include "../shared/file_traverser.h" -using namespace ffs3; +using namespace zen; namespace { -class FindLogfiles : public ffs3::TraverseCallback +class FindLogfiles : public zen::TraverseCallback { public: FindLogfiles(const Zstring& prefix, std::vector<Zstring>& logfiles) : prefix_(prefix), logfiles_(logfiles) {} @@ -53,7 +52,7 @@ void removeFileNoThrow(const Zstring& filename) { try { - ffs3::removeFile(filename); + zen::removeFile(filename); } catch(...) {} } @@ -132,11 +131,11 @@ private: //create logfile directory Zstring logfileDir = logfileDirectory.empty() ? - wxToZ(ffs3::getConfigDir() + wxT("Logs")) : - ffs3::getFormattedDirectoryName(wxToZ(logfileDirectory)); + wxToZ(zen::getConfigDir() + wxT("Logs")) : + zen::getFormattedDirectoryName(wxToZ(logfileDirectory)); - if (!ffs3::dirExists(logfileDir)) - ffs3::createDirectory(logfileDir); //create recursively if necessary: may throw (FileError&) + if (!zen::dirExists(logfileDir)) + zen::createDirectory(logfileDir); //create recursively if necessary: may throw (FileError&) //assemble logfile name if (!logfileDir.EndsWith(FILE_NAME_SEPARATOR)) @@ -155,8 +154,8 @@ private: wxString output = logfileName + wxT(".log"); //ensure uniqueness - for (int i = 1; ffs3::somethingExists(wxToZ(output)); ++i) - output = logfileName + wxChar('_') + common::numberToString(i) + wxT(".log"); + for (int i = 1; zen::somethingExists(wxToZ(output)); ++i) + output = logfileName + wxChar('_') + zen::toString<wxString>(i) + wxT(".log"); return output; } @@ -192,11 +191,11 @@ BatchStatusHandler::BatchStatusHandler(bool runSilent, logFile.reset(new LogFile(*logfileDirectory, jobName)); logFile->limitLogfileCount(logFileMaxCount); } - catch (ffs3::FileError& error) + catch (zen::FileError& error) { wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR); returnValue = -7; - throw ffs3::AbortThisProcess(); + throw zen::AbortThisProcess(); } } @@ -241,7 +240,7 @@ BatchStatusHandler::~BatchStatusHandler() else if (!exitWhenFinished || syncStatusFrame.getAsWindow()->IsShown()) //warning: wxWindow::Show() is called within processHasFinished()! { //notify about (logical) application main window => program won't quit, but stay on this dialog - ffs3::AppMainWindow::setMainWindow(syncStatusFrame.getAsWindow()); + zen::AppMainWindow::setMainWindow(syncStatusFrame.getAsWindow()); //notify to syncStatusFrame that current process has ended if (abortIsRequested()) @@ -266,7 +265,7 @@ void BatchStatusHandler::reportInfo(const Zstring& text) } -void BatchStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, StatusHandler::Process processID) +void BatchStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, StatusHandler::Process processID) { currentProcess = processID; @@ -292,7 +291,7 @@ void BatchStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, inline -void BatchStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) +void BatchStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) { switch (currentProcess) { @@ -323,25 +322,21 @@ void BatchStatusHandler::reportWarning(const wxString& warningMessage, bool& war { //show popup and ask user how to handle warning bool dontWarnAgain = false; - WarningDlg warningDlg(NULL, - WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_SWITCH | WarningDlg::BUTTON_ABORT, - warningMessage + wxT("\n\n") + _("Press \"Switch\" to open FreeFileSync GUI mode."), - dontWarnAgain); - warningDlg.Raise(); - const WarningDlg::Response rv = static_cast<WarningDlg::Response>(warningDlg.ShowModal()); - switch (rv) + switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_SWITCH | ReturnWarningDlg::BUTTON_ABORT, + warningMessage + wxT("\n\n") + _("Press \"Switch\" to open FreeFileSync GUI mode."), + dontWarnAgain)) { - case WarningDlg::BUTTON_ABORT: + case ReturnWarningDlg::BUTTON_ABORT: abortThisProcess(); break; - case WarningDlg::BUTTON_SWITCH: + case ReturnWarningDlg::BUTTON_SWITCH: errorLog.logMsg(_("Switching to FreeFileSync GUI mode..."), TYPE_WARNING); switchToGuiRequested = true; abortThisProcess(); break; - case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! + case ReturnWarningDlg::BUTTON_IGNORE: //no unhandled error situation! warningActive = !dontWarnAgain; break; } @@ -365,24 +360,21 @@ ErrorHandler::Response BatchStatusHandler::reportError(const wxString& errorMess case xmlAccess::ON_ERROR_POPUP: { bool ignoreNextErrors = false; - ErrorDlg errorDlg(NULL, - ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, - errorMessage, - ignoreNextErrors); - errorDlg.Raise(); - const ErrorDlg::ReturnCodes rv = static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal()); - switch (rv) + + switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT, + errorMessage, + ignoreNextErrors)) { - case ErrorDlg::BUTTON_IGNORE: + case ReturnErrorDlg::BUTTON_IGNORE: if (ignoreNextErrors) //falsify only handleError_ = xmlAccess::ON_ERROR_IGNORE; errorLog.logMsg(errorMessage, TYPE_ERROR); return ErrorHandler::IGNORE_ERROR; - case ErrorDlg::BUTTON_RETRY: + case ReturnErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; - case ErrorDlg::BUTTON_ABORT: + case ReturnErrorDlg::BUTTON_ABORT: errorLog.logMsg(errorMessage, TYPE_ERROR); abortThisProcess(); } @@ -423,5 +415,5 @@ void BatchStatusHandler::forceUiRefresh() void BatchStatusHandler::abortThisProcess() { requestAbortion(); - throw ffs3::AbortThisProcess(); //abort can be triggered by syncStatusFrame + throw zen::AbortThisProcess(); //abort can be triggered by syncStatusFrame } diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h index 61d8bddc..0e03141e 100644 --- a/ui/batch_status_handler.h +++ b/ui/batch_status_handler.h @@ -25,12 +25,12 @@ public: const wxString* logfileDirectory, //non-empty if logging shall be active size_t logFileMaxCount, const xmlAccess::OnError handleError, - const ffs3::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode + const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode int& returnVal); ~BatchStatusHandler(); - virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID); - virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed); + virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); virtual void reportInfo(const Zstring& text); virtual void forceUiRefresh(); @@ -41,11 +41,11 @@ public: private: virtual void abortThisProcess(); - const ffs3::SwitchToGui& switchBatchToGui_; //functionality to change from batch mode to GUI mode + const zen::SwitchToGui& switchBatchToGui_; //functionality to change from batch mode to GUI mode bool exitWhenFinished; bool switchToGuiRequested; xmlAccess::OnError handleError_; - ffs3::ErrorLogging errorLog; //list of non-resolved errors and warnings + zen::ErrorLogging errorLog; //list of non-resolved errors and warnings Process currentProcess; int& returnValue; diff --git a/ui/check_version.cpp b/ui/check_version.cpp index fa1b84a1..2147d717 100644 --- a/ui/check_version.cpp +++ b/ui/check_version.cpp @@ -11,10 +11,11 @@ #include "../version/version.h" #include <wx/utils.h> #include <wx/timer.h> -#include "../shared/global_func.h" +#include "../shared/string_tools.h" #include "msg_popup.h" #include "../shared/standard_paths.h" #include <wx/tokenzr.h> +#include "../shared/i18n.h" class CloseConnectionOnExit @@ -81,7 +82,7 @@ std::vector<size_t> parseVersion(const wxString& version) while (tkz.HasMoreTokens()) { const wxString& token = tkz.GetNextToken(); - output.push_back(common::stringToNumber<size_t>(token)); + output.push_back(zen::toNumber<size_t>(token)); } return output; } @@ -89,7 +90,7 @@ std::vector<size_t> parseVersion(const wxString& version) bool newerVersionExists(const wxString& onlineVersion) { - std::vector<size_t> current = parseVersion(ffs3::currentVersion); + std::vector<size_t> current = parseVersion(zen::currentVersion); std::vector<size_t> online = parseVersion(onlineVersion); if (online.empty() || online[0] == 0) //onlineVersion may be "This website has been moved..." In this case better check for an update @@ -100,7 +101,7 @@ bool newerVersionExists(const wxString& onlineVersion) } -void ffs3::checkForUpdateNow() +void zen::checkForUpdateNow() { wxString onlineVersion; if (!getOnlineVersion(onlineVersion)) @@ -120,10 +121,10 @@ void ffs3::checkForUpdateNow() } -void ffs3::checkForUpdatePeriodically(long& lastUpdateCheck) +void zen::checkForUpdatePeriodically(long& lastUpdateCheck) { #ifdef FFS_LINUX - if (!ffs3::isPortableVersion()) //don't check for updates in installer version -> else: handled by .deb + if (!zen::isPortableVersion()) //don't check for updates in installer version -> else: handled by .deb return; #endif @@ -131,12 +132,9 @@ void ffs3::checkForUpdatePeriodically(long& lastUpdateCheck) { if (lastUpdateCheck == 0) { - QuestionDlg messageDlg(NULL, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_NO, - wxString(_("Do you want FreeFileSync to automatically check for updates every week?")) + wxT("\n") + - _("(Requires an Internet connection!)")); - - const bool checkRegularly = messageDlg.ShowModal() == QuestionDlg::BUTTON_YES; + const bool checkRegularly = showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO, + wxString(_("Do you want FreeFileSync to automatically check for updates every week?")) + wxT("\n") + + _("(Requires an Internet connection!)")) == ReturnQuestionDlg::BUTTON_YES; if (checkRegularly) { lastUpdateCheck = 123; //some old date (few seconds after 1970) diff --git a/ui/check_version.h b/ui/check_version.h index f7fb409d..b9606987 100644 --- a/ui/check_version.h +++ b/ui/check_version.h @@ -8,7 +8,7 @@ #define UPDATEVERSION_H_INCLUDED -namespace ffs3 +namespace zen { void checkForUpdateNow(); diff --git a/ui/folder_pair.h b/ui/folder_pair.h index af614176..d72651c8 100644 --- a/ui/folder_pair.h +++ b/ui/folder_pair.h @@ -13,11 +13,12 @@ #include "small_dlgs.h" #include "sync_cfg.h" #include <wx/event.h> -#include "is_null_filter.h" +#include <wx/menu.h> #include "../shared/util.h" #include "../shared/string_conv.h" +#include "../library/norm_filter.h" -namespace ffs3 +namespace zen { //basic functionality for handling alternate folder pair configuration: change sync-cfg/filter cfg, right-click context menu, button icons... @@ -25,7 +26,7 @@ template <class GuiPanel> class FolderPairPanelBasic : private wxEvtHandler { public: - typedef boost::shared_ptr<const ffs3::AlternateSyncConfig> AltSyncCfgPtr; + typedef boost::shared_ptr<const zen::AlternateSyncConfig> AltSyncCfgPtr; AltSyncCfgPtr getAltSyncConfig() const { @@ -51,7 +52,7 @@ public: { basicPanel_.m_bpButtonAltSyncCfg->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfigSmall"))); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" ") + common::LINE_BREAK + - wxT("(") + getVariantName(altSyncConfig->syncConfiguration) + wxT(")")); + wxT("(") + getVariantName(altSyncConfig->syncConfiguration.var) + wxT(")")); } else { @@ -107,7 +108,7 @@ private: contextMenu->Append(menuId, _("Clear filter settings")); contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this); - if (NameFilter(localFilter.includeFilter, localFilter.excludeFilter).isNull()) + if (isNullFilter(localFilter)) contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway basicPanel_.PopupMenu(contextMenu.get()); //show context menu @@ -139,13 +140,13 @@ private: mainCfg.customDeletionDirectory); AlternateSyncConfig altSyncCfg = altSyncConfig.get() ? *altSyncConfig : syncConfigMain; - SyncCfgDialog syncDlg(getParentWindow(), - mainCfg.compareVar, + + + if (showSyncConfigDlg(mainCfg.compareVar, altSyncCfg.syncConfiguration, altSyncCfg.handleDeletion, altSyncCfg.customDeletionDirectory, - NULL); - if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY) + NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter { altSyncConfig.reset(new AlternateSyncConfig(altSyncCfg)); refreshButtons(); @@ -161,8 +162,7 @@ private: FilterConfig localFiltTmp = localFilter; if (showFilterDialog(false, //is local filter dialog - localFiltTmp.includeFilter, - localFiltTmp.excludeFilter) == DefaultReturnCode::BUTTON_OKAY) + localFiltTmp) == ReturnSmallDlg::BUTTON_OKAY) { localFilter = localFiltTmp; refreshButtons(); diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp index 93f75b95..4db921fa 100644 --- a/ui/grid_view.cpp +++ b/ui/grid_view.cpp @@ -9,7 +9,7 @@ #include "../synchronization.h" #include <boost/bind.hpp> -using namespace ffs3; +using namespace zen; GridView::StatusCmpResult::StatusCmpResult() : @@ -338,7 +338,7 @@ public: }; -template <bool ascending, ffs3::SelectedSide side> +template <bool ascending, zen::SelectedSide side> class GridView::SortByRelName : public std::binary_function<RefIndex, RefIndex, bool> { public: @@ -366,7 +366,7 @@ private: }; -template <bool ascending, ffs3::SelectedSide side> +template <bool ascending, zen::SelectedSide side> class GridView::SortByFileName : public std::binary_function<RefIndex, RefIndex, bool> { public: @@ -388,7 +388,7 @@ private: }; -template <bool ascending, ffs3::SelectedSide side> +template <bool ascending, zen::SelectedSide side> class GridView::SortByFileSize : public std::binary_function<RefIndex, RefIndex, bool> { public: @@ -410,7 +410,7 @@ private: }; -template <bool ascending, ffs3::SelectedSide side> +template <bool ascending, zen::SelectedSide side> class GridView::SortByDate : public std::binary_function<RefIndex, RefIndex, bool> { public: @@ -432,7 +432,7 @@ private: }; -template <bool ascending, ffs3::SelectedSide side> +template <bool ascending, zen::SelectedSide side> class GridView::SortByExtension : public std::binary_function<RefIndex, RefIndex, bool> { public: diff --git a/ui/grid_view.h b/ui/grid_view.h index acc63ea5..b21bcde4 100644 --- a/ui/grid_view.h +++ b/ui/grid_view.h @@ -10,7 +10,7 @@ #include "../file_hierarchy.h" -namespace ffs3 +namespace zen { //gui view of FolderComparison class GridView @@ -42,8 +42,8 @@ public: unsigned int filesOnRightView; unsigned int foldersOnRightView; - wxULongLong filesizeLeftView; - wxULongLong filesizeRightView; + zen::UInt64 filesizeLeftView; + zen::UInt64 filesizeRightView; }; //comparison results view @@ -75,8 +75,8 @@ public: unsigned int filesOnRightView; unsigned int foldersOnRightView; - wxULongLong filesizeLeftView; - wxULongLong filesizeRightView; + zen::UInt64 filesizeLeftView; + zen::UInt64 filesizeRightView; }; //synchronization preview @@ -219,14 +219,14 @@ size_t GridView::rowsTotal() const //total number of rows available inline -const ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const +const zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const { return folderCmp[ref.folderIndex].retrieveById(ref.objId); } inline -ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) +zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) { //code re-use of const method: see Meyers Effective C++ return const_cast<FileSystemObject*>(static_cast<const GridView&>(*this).getReferencedRow(ref)); diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp index a1bc1679..d3d7488f 100644 --- a/ui/gui_generated.cpp +++ b/ui/gui_generated.cpp @@ -36,20 +36,20 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxMenuItem* m_separator2; m_separator2 = m_menuFile->AppendSeparator(); - m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("CTRL-N"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl-N"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemNew ); - m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("Ctrl-S"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemSave ); - m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("Ctrl-L"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemLoad ); wxMenuItem* m_separator3; m_separator3 = m_menuFile->AppendSeparator(); wxMenuItem* m_menuItem4; - m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL ); + m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("Ctrl-Q"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItem4 ); m_menubar1->Append( m_menuFile, _("&Program") ); @@ -84,7 +84,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxMenuItem* m_separator5; m_separator5 = m_menuHelp->AppendSeparator(); - m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("SHIFT-F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("Shift-F1"), wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemAbout ); m_menubar1->Append( m_menuHelp, _("&Help") ); @@ -96,8 +96,11 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer155; + bSizer155 = new wxBoxSizer( wxHORIZONTAL ); - bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer155->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); wxFlexGridSizer* fgSizer121; fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 ); @@ -138,10 +141,15 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); - bSizerTopButtons->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + bSizer155->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + bSizerTopButtons->Add( bSizer155, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerTopButtons->Add( 0, 0, 1, 0, 5 ); + wxBoxSizer* bSizer1551; + bSizer1551 = new wxBoxSizer( wxHORIZONTAL ); wxFlexGridSizer* fgSizer12; fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 ); @@ -169,10 +177,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const fgSizer12->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerTopButtons->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + bSizer1551->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1551->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerTopButtons->Add( bSizer1551, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelTopButtons->SetSizer( bSizerTopButtons ); m_panelTopButtons->Layout(); @@ -1581,7 +1591,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText81 = new wxStaticText( this, wxID_ANY, _("Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( 300 ); + m_staticText81->Wrap( 400 ); fgSizer1->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); @@ -1595,7 +1605,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText8->Wrap( 300 ); + m_staticText8->Wrap( 400 ); fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); @@ -1609,34 +1619,21 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( 300 ); + m_staticText101->Wrap( 400 ); fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_radioBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_radioBtnCustom->Enable( false ); fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer65; - bSizer65 = new wxBoxSizer( wxVERTICAL ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); + m_buttonUpdate1 = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonUpdate1->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER ); - m_staticText23->Wrap( -1 ); - m_staticText23->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); - - fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer1->Add( m_buttonUpdate1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9->Wrap( 300 ); + m_staticText9->Wrap( 400 ); fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); sbSizer7->Add( fgSizer1, 0, 0, 5 ); @@ -1849,11 +1846,12 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); @@ -1872,11 +1870,12 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated() this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); @@ -1910,18 +1909,18 @@ CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const w m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByTime->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); + m_bitmapByTime->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxSize( -1,42 ), 0 ); m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") ); + m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); @@ -2366,7 +2365,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText61->Wrap( 500 ); bSizer70->Add( m_staticText61, 0, wxALL, 5 ); - m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,175 ), wxTR_DEFAULT_STYLE ); + m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,220 ), wxTR_DEFAULT_STYLE ); m_treeCtrl1->SetBackgroundColour( wxColour( 208, 208, 208 ) ); bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); @@ -2395,7 +2394,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText80->Wrap( -1 ); bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); - m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- conflict"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- conflict (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText78->Wrap( -1 ); bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); @@ -2509,40 +2508,108 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS wxBoxSizer* bSizer53; bSizer53 = new wxBoxSizer( wxVERTICAL ); - m_scrolledWindowCodeInfo = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindowCodeInfo->SetScrollRate( 5, 5 ); - m_scrolledWindowCodeInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_scrolledWindowCodeInfo->SetMinSize( wxSize( -1,120 ) ); + m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxTAB_TRAVERSAL ); + m_panel33->SetBackgroundColour( wxColour( 208, 208, 208 ) ); bSizerCodeInfo = new wxBoxSizer( wxVERTICAL ); - m_staticText72 = new wxStaticText( m_scrolledWindowCodeInfo, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText72 = new wxStaticText( m_panel33, wxID_ANY, _("Source code written in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText72->Wrap( -1 ); m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 ); + bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + wxBoxSizer* bSizer167; + bSizer167 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer171; + bSizer171 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink9 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink9->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink10 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink10->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink7 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink7->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink13 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink13->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink14 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink14->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_staticText73 = new wxStaticText( m_scrolledWindowCodeInfo, wxID_ANY, _(" MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText73->Wrap( -1 ); - bSizerCodeInfo->Add( m_staticText73, 0, wxALL|wxEXPAND, 5 ); + bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_hyperlink21 = new wxHyperlinkCtrl( m_scrolledWindowCodeInfo, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink16 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink16->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer167->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink8 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Loki"), wxT("http://sourceforge.net/projects/loki-lib"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink15 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("TinyXML"), wxT("http://www.grinninglizard.com/tinyxml"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink15->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink11 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink11->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink12 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink12->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink17 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("inotify"), wxT("http://inotify.aiken.cz"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink17->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink18 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink18->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizer167->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) ); m_hyperlink21->SetBackgroundColour( wxColour( 208, 208, 208 ) ); m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") ); bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_scrolledWindowCodeInfo->SetSizer( bSizerCodeInfo ); - m_scrolledWindowCodeInfo->Layout(); - bSizerCodeInfo->Fit( m_scrolledWindowCodeInfo ); - bSizer53->Add( m_scrolledWindowCodeInfo, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 ); + m_panel33->SetSizer( bSizerCodeInfo ); + m_panel33->Layout(); + bSizerCodeInfo->Fit( m_panel33 ); + bSizer53->Add( m_panel33, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); m_scrolledWindowTranslators = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); m_scrolledWindowTranslators->SetScrollRate( 5, 5 ); m_scrolledWindowTranslators->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_scrolledWindowTranslators->SetMinSize( wxSize( -1,140 ) ); - m_scrolledWindowTranslators->SetMaxSize( wxSize( -1,145 ) ); + m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) ); bSizerTranslators = new wxBoxSizer( wxVERTICAL ); @@ -2999,7 +3066,7 @@ DeleteDlgGenerated::~DeleteDlgGenerated() FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetSizeHints( wxSize( 370,380 ), wxDefaultSize ); wxBoxSizer* bSizer21; bSizer21 = new wxBoxSizer( wxVERTICAL ); @@ -3035,8 +3102,8 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer70; bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText44->Wrap( 400 ); + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that match all filter settings will be selected for synchronization.\nNote: The name filter must be specified relative(!) to main synchronization directories."), wxDefaultPosition, wxSize( 550,-1 ), wxALIGN_CENTRE ); + m_staticText44->Wrap( 550 ); bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); @@ -3104,61 +3171,135 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer69->Fit( m_panel13 ); bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); + + bSizer21->Add( 0, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Include") ), wxHORIZONTAL ); - wxFlexGridSizer* fgSizer3; - fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer3->AddGrowableCol( 1 ); - fgSizer3->AddGrowableRow( 1 ); - fgSizer3->SetFlexibleDirection( wxBOTH ); - fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + m_bitmapInclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + sbSizer8->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + sbSizer8->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer166->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + wxStaticBoxSizer* sbSizer26; + sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Exclude") ), wxHORIZONTAL ); - fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_bitmapExclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + sbSizer26->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + sbSizer26->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - fgSizer3->Add( m_textCtrlInclude, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + bSizer166->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - sbSizer8->Add( fgSizer3, 1, wxEXPAND, 5 ); + bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - wxFlexGridSizer* fgSizer4; - fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer4->AddGrowableCol( 1 ); - fgSizer4->AddGrowableRow( 1 ); - fgSizer4->SetFlexibleDirection( wxBOTH ); - fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + bSizer159->Add( 5, 0, 0, 0, 5 ); - fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 ); + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); - m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText16->Wrap( -1 ); - m_staticText16->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Date") ), wxHORIZONTAL ); - fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + wxBoxSizer* bSizer169; + bSizer169 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapFilterDate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 ); + bSizer169->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - fgSizer4->Add( m_textCtrlExclude, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxVERTICAL ); - sbSizer8->Add( fgSizer4, 1, wxEXPAND, 5 ); + m_staticText103 = new wxStaticText( this, wxID_ANY, _("Select time span:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText103->Wrap( -1 ); + bSizer165->Add( m_staticText103, 0, 0, 5 ); - bSizer21->Add( sbSizer8, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + wxBoxSizer* bSizer164; + bSizer164 = new wxBoxSizer( wxVERTICAL ); + m_spinCtrlTimespan = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer164->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer21->Add( 0, 0, 0, 0, 5 ); + wxArrayString m_choiceUnitTimespanChoices; + m_choiceUnitTimespan = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); + m_choiceUnitTimespan->SetSelection( 0 ); + bSizer164->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer165->Add( bSizer164, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + bSizer169->Add( bSizer165, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer25->Add( bSizer169, 0, 0, 5 ); + + bSizer160->Add( sbSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBoxSizer* sbSizer81; + sbSizer81 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Size") ), wxHORIZONTAL ); + + wxBoxSizer* bSizer170; + bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapFilterSize = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); + bSizer170->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Minimum file size:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer158->Add( m_staticText101, 0, 0, 5 ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); + + m_spinCtrlMinSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxArrayString m_choiceUnitMinSizeChoices; + m_choiceUnitMinSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); + m_choiceUnitMinSize->SetSelection( 0 ); + bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer158->Add( bSizer162, 0, wxBOTTOM, 5 ); + + m_staticText102 = new wxStaticText( this, wxID_ANY, _("Maximum file size:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText102->Wrap( -1 ); + bSizer158->Add( m_staticText102, 0, 0, 5 ); + + wxBoxSizer* bSizer163; + bSizer163 = new wxBoxSizer( wxVERTICAL ); + + m_spinCtrlMaxSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxArrayString m_choiceUnitMaxSizeChoices; + m_choiceUnitMaxSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); + m_choiceUnitMaxSize->SetSelection( 0 ); + bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer158->Add( bSizer163, 0, wxTOP, 5 ); + + bSizer170->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer81->Add( bSizer170, 0, 0, 5 ); + + bSizer160->Add( sbSizer81, 1, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer159->Add( bSizer160, 0, wxEXPAND, 5 ); + + bSizer21->Add( bSizer159, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizer22; bSizer22 = new wxBoxSizer( wxHORIZONTAL ); @@ -3193,6 +3334,11 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); @@ -3203,6 +3349,11 @@ FilterDlgGenerated::~FilterDlgGenerated() // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); diff --git a/ui/gui_generated.h b/ui/gui_generated.h index 621ad1fe..ef0462bc 100644 --- a/ui/gui_generated.h +++ b/ui/gui_generated.h @@ -445,9 +445,7 @@ protected: wxButton* m_buttonUpdate; wxStaticText* m_staticText101; wxRadioButton* m_radioBtnCustom; - - wxStaticText* m_staticText23; - + wxButton* m_buttonUpdate1; wxStaticText* m_staticText9; wxBoxSizer* bSizer201; @@ -489,7 +487,7 @@ protected: // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncLeftToRight( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } @@ -704,10 +702,21 @@ protected: wxStaticBitmap* m_bitmap11; wxStaticText* m_build; - wxScrolledWindow* m_scrolledWindowCodeInfo; + wxPanel* m_panel33; wxBoxSizer* bSizerCodeInfo; wxStaticText* m_staticText72; - wxStaticText* m_staticText73; + wxHyperlinkCtrl* m_hyperlink9; + wxHyperlinkCtrl* m_hyperlink10; + wxHyperlinkCtrl* m_hyperlink7; + wxHyperlinkCtrl* m_hyperlink13; + wxHyperlinkCtrl* m_hyperlink14; + wxHyperlinkCtrl* m_hyperlink16; + wxHyperlinkCtrl* m_hyperlink8; + wxHyperlinkCtrl* m_hyperlink15; + wxHyperlinkCtrl* m_hyperlink11; + wxHyperlinkCtrl* m_hyperlink12; + wxHyperlinkCtrl* m_hyperlink17; + wxHyperlinkCtrl* m_hyperlink18; wxHyperlinkCtrl* m_hyperlink21; wxScrolledWindow* m_scrolledWindowTranslators; wxBoxSizer* bSizerTranslators; @@ -901,14 +910,22 @@ protected: wxStaticText* m_staticText181; wxStaticText* m_staticText1811; - wxStaticText* m_staticText15; - wxStaticBitmap* m_bitmap8; + wxStaticBitmap* m_bitmapInclude; wxTextCtrl* m_textCtrlInclude; - - wxStaticText* m_staticText16; - wxStaticBitmap* m_bitmap9; + wxStaticBitmap* m_bitmapExclude; wxTextCtrl* m_textCtrlExclude; + wxStaticBitmap* m_bitmapFilterDate; + wxStaticText* m_staticText103; + wxSpinCtrl* m_spinCtrlTimespan; + wxChoice* m_choiceUnitTimespan; + wxStaticBitmap* m_bitmapFilterSize; + wxStaticText* m_staticText101; + wxSpinCtrl* m_spinCtrlMinSize; + wxChoice* m_choiceUnitMinSize; + wxStaticText* m_staticText102; + wxSpinCtrl* m_spinCtrlMaxSize; + wxChoice* m_choiceUnitMaxSize; wxButton* m_button9; wxButton* m_button10; @@ -917,6 +934,8 @@ protected: // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); } virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp index 0543922c..09c59b92 100644 --- a/ui/gui_status_handler.cpp +++ b/ui/gui_status_handler.cpp @@ -14,28 +14,29 @@ #include "../shared/string_conv.h" #include "../shared/util.h" -using namespace ffs3; +using namespace zen; +using namespace xmlAccess; -CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : - mainDialog(dlg), +CompareStatusHandler::CompareStatusHandler(MainDialog& dlg) : + mainDlg(dlg), ignoreErrors(false), currentProcess(StatusHandler::PROCESS_NONE) { - wxWindowUpdateLocker dummy(mainDialog); //avoid display distortion + wxWindowUpdateLocker dummy(&mainDlg); //avoid display distortion //prevent user input during "compare", do not disable maindialog since abort-button would also be disabled - mainDialog->disableAllElements(); - mainDialog->compareStatus->init(); //clear old values + mainDlg.disableAllElements(true); + mainDlg.compareStatus->init(); //clear old values //display status panel during compare - mainDialog->auiMgr.GetPane(mainDialog->compareStatus->getAsWindow()).Show(); - mainDialog->auiMgr.Update(); + mainDlg.auiMgr.GetPane(mainDlg.compareStatus->getAsWindow()).Show(); + mainDlg.auiMgr.Update(); //register abort button - mainDialog->m_buttonAbort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this); + mainDlg.m_buttonAbort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this); //register key event - mainDialog->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this); + mainDlg.Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this); } @@ -44,18 +45,18 @@ CompareStatusHandler::~CompareStatusHandler() updateUiNow(); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks //reenable complete main dialog - mainDialog->enableAllElements(); - mainDialog->compareStatus->finalize(); + mainDlg.enableAllElements(); + mainDlg.compareStatus->finalize(); - mainDialog->auiMgr.GetPane(mainDialog->compareStatus->getAsWindow()).Hide(); - mainDialog->auiMgr.Update(); + mainDlg.auiMgr.GetPane(mainDlg.compareStatus->getAsWindow()).Hide(); + mainDlg.auiMgr.Update(); if (abortIsRequested()) - mainDialog->pushStatusInformation(_("Operation aborted!")); + mainDlg.pushStatusInformation(_("Operation aborted!")); //de-register keys - mainDialog->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this); - mainDialog->m_buttonAbort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this); + mainDlg.Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this); + mainDlg.m_buttonAbort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this); } @@ -74,11 +75,11 @@ void CompareStatusHandler::OnKeyPressed(wxKeyEvent& event) void CompareStatusHandler::reportInfo(const Zstring& text) { - mainDialog->compareStatus->setStatusText_NoUpdate(text); + mainDlg.compareStatus->setStatusText_NoUpdate(text); } -void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID) +void CompareStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID) { currentProcess = processID; @@ -88,10 +89,10 @@ void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal break; case StatusHandler::PROCESS_COMPARING_CONTENT: { - wxWindowUpdateLocker dummy(mainDialog); - mainDialog->compareStatus->switchToCompareBytewise(objectsTotal, dataTotal); - mainDialog->Layout(); //show progress bar... - mainDialog->Refresh(); //remove distortion... + wxWindowUpdateLocker dummy(&mainDlg); + mainDlg.compareStatus->switchToCompareBytewise(objectsTotal, dataTotal); + mainDlg.Layout(); //show progress bar... + mainDlg.Refresh(); //remove distortion... } break; case StatusHandler::PROCESS_SYNCHRONIZING: @@ -103,15 +104,15 @@ void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal inline -void CompareStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) +void CompareStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) { switch (currentProcess) { case StatusHandler::PROCESS_SCANNING: - mainDialog->compareStatus->incScannedObjects_NoUpdate(objectsProcessed); + mainDlg.compareStatus->incScannedObjects_NoUpdate(objectsProcessed); break; case StatusHandler::PROCESS_COMPARING_CONTENT: - mainDialog->compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); + mainDlg.compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); break; case StatusHandler::PROCESS_SYNCHRONIZING: case StatusHandler::PROCESS_NONE: @@ -126,23 +127,20 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message if (ignoreErrors) return ErrorHandler::IGNORE_ERROR; - mainDialog->compareStatus->updateStatusPanelNow(); + mainDlg.compareStatus->updateStatusPanelNow(); bool ignoreNextErrors = false; - ErrorDlg errorDlg(NULL, - ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, - message, ignoreNextErrors); - errorDlg.Raise(); - switch (static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal())) + switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT, + message, ignoreNextErrors)) { - case ErrorDlg::BUTTON_IGNORE: + case ReturnErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; return ErrorHandler::IGNORE_ERROR; - case ErrorDlg::BUTTON_RETRY: + case ReturnErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; - case ErrorDlg::BUTTON_ABORT: + case ReturnErrorDlg::BUTTON_ABORT: abortThisProcess(); } @@ -153,15 +151,13 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message void CompareStatusHandler::reportFatalError(const wxString& errorMessage) { - mainDialog->compareStatus->updateStatusPanelNow(); + mainDlg.compareStatus->updateStatusPanelNow(); //show message and abort: currently there are no fatal errors during comparison that can be ignored bool dummy = false; - ErrorDlg errorDlg(NULL, - ErrorDlg::BUTTON_ABORT, - errorMessage, dummy); - errorDlg.Raise(); - errorDlg.ShowModal(); + showErrorDlg(ReturnErrorDlg::BUTTON_ABORT, + errorMessage, dummy); + abortThisProcess(); } @@ -171,24 +167,21 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w if (!warningActive || ignoreErrors) //if errors are ignored, then warnings should also return; - mainDialog->compareStatus->updateStatusPanelNow(); + mainDlg.compareStatus->updateStatusPanelNow(); //show popup and ask user how to handle warning bool dontWarnAgain = false; - WarningDlg warningDlg(NULL, - WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, - warningMessage, - dontWarnAgain); - warningDlg.Raise(); - switch (static_cast<WarningDlg::Response>(warningDlg.ShowModal())) + switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_ABORT, + warningMessage, + dontWarnAgain)) { - case WarningDlg::BUTTON_IGNORE: + case ReturnWarningDlg::BUTTON_IGNORE: warningActive = !dontWarnAgain; break; - case WarningDlg::BUTTON_SWITCH: + case ReturnWarningDlg::BUTTON_SWITCH: assert(false); - case WarningDlg::BUTTON_ABORT: + case ReturnWarningDlg::BUTTON_ABORT: abortThisProcess(); break; } @@ -198,7 +191,7 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w inline void CompareStatusHandler::forceUiRefresh() { - mainDialog->compareStatus->updateStatusPanelNow(); + mainDlg.compareStatus->updateStatusPanelNow(); } @@ -211,15 +204,15 @@ void CompareStatusHandler::OnAbortCompare(wxCommandEvent& event) void CompareStatusHandler::abortThisProcess() { requestAbortion(); - throw ffs3::AbortThisProcess(); + throw zen::AbortThisProcess(); } //######################################################################################################## -SyncStatusHandler::SyncStatusHandler(MainDialog* parentDlg, bool ignoreAllErrors, const wxString& jobName) : - mainDialog(parentDlg), +SyncStatusHandler::SyncStatusHandler(MainDialog* parentDlg, OnGuiError handleError, const wxString& jobName) : + parentDlg_(parentDlg), syncStatusFrame(*this, parentDlg, false, jobName), - ignoreErrors(ignoreAllErrors) + handleError_(handleError) { } @@ -256,7 +249,7 @@ void SyncStatusHandler::reportInfo(const Zstring& text) } -void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID) +void SyncStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID) { switch (processID) { @@ -274,7 +267,7 @@ void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, P inline -void SyncStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) +void SyncStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) { syncStatusFrame.incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); } @@ -282,32 +275,31 @@ void SyncStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dat ErrorHandler::Response SyncStatusHandler::reportError(const wxString& errorMessage) { - if (ignoreErrors) + switch (handleError_) { - errorLog.logMsg(errorMessage, TYPE_ERROR); - return ErrorHandler::IGNORE_ERROR; + case ON_GUIERROR_POPUP: + break; + case ON_GUIERROR_IGNORE: + errorLog.logMsg(errorMessage, TYPE_ERROR); + return ErrorHandler::IGNORE_ERROR; } syncStatusFrame.updateStatusDialogNow(); bool ignoreNextErrors = false; - ErrorDlg errorDlg(NULL, - ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, - errorMessage, - ignoreNextErrors); - errorDlg.Raise(); - const ErrorDlg::ReturnCodes rv = static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal()); - switch (rv) + switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT, + errorMessage, + ignoreNextErrors)) { - case ErrorDlg::BUTTON_IGNORE: - ignoreErrors = ignoreNextErrors; + case ReturnErrorDlg::BUTTON_IGNORE: + handleError_ = ignoreNextErrors ? ON_GUIERROR_IGNORE : ON_GUIERROR_POPUP; errorLog.logMsg(errorMessage, TYPE_ERROR); return ErrorHandler::IGNORE_ERROR; - case ErrorDlg::BUTTON_RETRY: + case ReturnErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; - case ErrorDlg::BUTTON_ABORT: + case ReturnErrorDlg::BUTTON_ABORT: errorLog.logMsg(errorMessage, TYPE_ERROR); abortThisProcess(); } @@ -328,35 +320,35 @@ void SyncStatusHandler::reportWarning(const wxString& warningMessage, bool& warn { errorLog.logMsg(warningMessage, TYPE_WARNING); - if (ignoreErrors || !warningActive) //if errors are ignored, then warnings should also - return; - else + switch (handleError_) { - syncStatusFrame.updateStatusDialogNow(); - - //show popup and ask user how to handle warning - bool dontWarnAgain = false; - WarningDlg warningDlg(NULL, - WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, - warningMessage, - dontWarnAgain); - warningDlg.Raise(); - const WarningDlg::Response rv = static_cast<WarningDlg::Response>(warningDlg.ShowModal()); - switch (rv) - { - case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! - warningActive = !dontWarnAgain; - return; - - case WarningDlg::BUTTON_SWITCH: - assert(false); - case WarningDlg::BUTTON_ABORT: - abortThisProcess(); - return; - } + case ON_GUIERROR_POPUP: + break; + case ON_GUIERROR_IGNORE: + return; //if errors are ignored, then warnings should also + } + if (!warningActive) return; + + syncStatusFrame.updateStatusDialogNow(); + + //show popup and ask user how to handle warning + bool dontWarnAgain = false; + switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_ABORT, + warningMessage, + dontWarnAgain)) + { + case ReturnWarningDlg::BUTTON_IGNORE: //no unhandled error situation! + warningActive = !dontWarnAgain; + return; - assert(false); + case ReturnWarningDlg::BUTTON_SWITCH: + assert(false); + case ReturnWarningDlg::BUTTON_ABORT: + abortThisProcess(); + return; } + + assert(false); } @@ -369,5 +361,5 @@ void SyncStatusHandler::forceUiRefresh() void SyncStatusHandler::abortThisProcess() { requestAbortion(); - throw ffs3::AbortThisProcess(); //abort can be triggered by syncStatusFrame + throw zen::AbortThisProcess(); //abort can be triggered by syncStatusFrame } diff --git a/ui/gui_status_handler.h b/ui/gui_status_handler.h index c0e75a8d..bd5b061a 100644 --- a/ui/gui_status_handler.h +++ b/ui/gui_status_handler.h @@ -11,10 +11,10 @@ #include <wx/event.h> #include "../library/error_log.h" #include "progress_indicator.h" +#include "../library/process_xml.h" +#include "main_dlg.h" class SyncStatus; -class MainDialog; -class wxWindow; class wxCommandEvent; @@ -22,11 +22,11 @@ class wxCommandEvent; class CompareStatusHandler : private wxEvtHandler, public StatusHandler { public: - CompareStatusHandler(MainDialog* dlg); + CompareStatusHandler(MainDialog& dlg); ~CompareStatusHandler(); - virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID); - virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed); + virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); virtual void reportInfo(const Zstring& text); virtual void forceUiRefresh(); @@ -39,7 +39,7 @@ private: void OnAbortCompare(wxCommandEvent& event); //handle abort button click virtual void abortThisProcess(); - MainDialog* mainDialog; + MainDialog& mainDlg; bool ignoreErrors; Process currentProcess; }; @@ -48,11 +48,11 @@ private: class SyncStatusHandler : public StatusHandler { public: - SyncStatusHandler(MainDialog* parentDlg, bool ignoreAllErrors, const wxString& jobName); + SyncStatusHandler(MainDialog* parentDlg, xmlAccess::OnGuiError handleError, const wxString& jobName); ~SyncStatusHandler(); - virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID); - virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed); + virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); virtual void reportInfo(const Zstring& text); virtual void forceUiRefresh(); @@ -63,10 +63,10 @@ public: private: virtual void abortThisProcess(); - MainDialog* mainDialog; //optional + MainDialog* parentDlg_; SyncStatus syncStatusFrame; //the window managed by SyncStatus has longer lifetime than this handler! - bool ignoreErrors; - ffs3::ErrorLogging errorLog; + xmlAccess::OnGuiError handleError_; + zen::ErrorLogging errorLog; }; diff --git a/ui/is_null_filter.h b/ui/is_null_filter.h deleted file mode 100644 index 21981a03..00000000 --- a/ui/is_null_filter.h +++ /dev/null @@ -1,24 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** -// -#ifndef ISNULLFILTER_H_INCLUDED -#define ISNULLFILTER_H_INCLUDED - -#include "../structures.h" -#include "../library/filter.h" - -namespace ffs3 -{ - -inline -bool isNullFilter(const FilterConfig& filterCfg) -{ - return NameFilter(filterCfg.includeFilter, filterCfg.excludeFilter).isNull(); -} - -} - -#endif // ISNULLFILTER_H_INCLUDED diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp index 8eae6fb1..6e6c17f7 100644 --- a/ui/main_dlg.cpp +++ b/ui/main_dlg.cpp @@ -37,7 +37,6 @@ #include "progress_indicator.h" #include "msg_popup.h" #include "../shared/dir_name.h" -#include "../library/filter.h" #include "../structures.h" #include "grid_view.h" #include "../library/resources.h" @@ -51,13 +50,12 @@ #include "../shared/global_func.h" #include "search.h" #include "../shared/help_provider.h" -#include "is_null_filter.h" #include "batch_config.h" #include "../shared/check_exist.h" +#include "../library/lock_holder.h" +#include "../shared/shell_execute.h" -using namespace ffs3; -using ffs3::CustomLocale; - +using namespace zen; namespace { @@ -92,8 +90,7 @@ public: case xmlAccess::MERGE_BATCH: if (droppedFiles.size() == 1) { - BatchDialog batchDlg(&mainDlg_, droppedFiles[0]); - if (batchDlg.ShowModal() == BatchDialog::BATCH_FILE_SAVED) + if (showSyncBatchDlg(droppedFiles[0]) == ReturnBatchConfig::BATCH_FILE_SAVED) mainDlg_.pushStatusInformation(_("Batch file created successfully!")); return false; } @@ -221,20 +218,14 @@ public: dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} - void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) { setConfig(syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } - Zstring getLeftDir() const - { - return dirNameLeft.getName(); - } - Zstring getRightDir() const - { - return dirNameRight.getName(); - } + wxString getLeftDir () const { return dirNameLeft .getName(); } + wxString getRightDir() const { return dirNameRight.getName(); } private: //support for drag and drop @@ -263,20 +254,14 @@ public: *mainDialog.m_directoryRight, *mainDialog.sbSizerDirRight) {} - void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) { setConfig(syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } - Zstring getLeftDir() const - { - return dirNameLeft.getName(); - } - Zstring getRightDir() const - { - return dirNameRight.getName(); - } + wxString getLeftDir () const { return dirNameLeft .getName(); } + wxString getRightDir() const { return dirNameRight.getName(); } private: //support for drag and drop @@ -329,8 +314,8 @@ struct DirNotFound { bool operator()(const FolderPairEnh& fp) const { - const Zstring dirFmtLeft = ffs3::getFormattedDirectoryName(fp.leftDirectory); - const Zstring dirFmtRight = ffs3::getFormattedDirectoryName(fp.rightDirectory); + const Zstring dirFmtLeft = zen::getFormattedDirectoryName(fp.leftDirectory); + const Zstring dirFmtRight = zen::getFormattedDirectoryName(fp.rightDirectory); if (dirFmtLeft.empty() && dirFmtRight.empty()) return false; @@ -345,14 +330,7 @@ class PanelMoveWindow : public MouseMoveWindow { public: PanelMoveWindow(MainDialog& mainDlg) : - MouseMoveWindow(mainDlg, - mainDlg.m_panelTopButtons, - //mainDlg.m_panelDirectoryPairs, - mainDlg.m_panelConfig, - mainDlg.m_panelFilter, - mainDlg.m_panelViewFilter, - mainDlg.m_panelStatistics, - mainDlg.m_panelStatusBar), + MouseMoveWindow(mainDlg, false), //don't include main dialog itself, thereby prevent various mouse capture lost issues mainDlg_(mainDlg) {} virtual bool allowMove(const wxMouseEvent& event) @@ -490,6 +468,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, wxAuiPaneInfo().Name(wxT("Panel8")).Bottom().Row(0).CaptionVisible(false).PaneBorder(false).DockFixed()); auiMgr.Update(); + defaultPerspective = auiMgr.SavePerspective(); //---------------------------------------------------------------------------------- //register view layout context menu @@ -502,7 +481,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, //---------------------------------------------------------------------------------- globalSettings = &settings; - gridDataView.reset(new ffs3::GridView); + gridDataView.reset(new zen::GridView); contextMenu.reset(new wxMenu); //initialize right-click context menu; will be dynamically re-created on each R-mouse-click cleanedUp = false; @@ -523,7 +502,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, SetIcon(*GlobalResources::instance().programIcon); //set application icon //notify about (logical) application main window => program won't quit, but stay on this dialog - ffs3::AppMainWindow::setMainWindow(this); + zen::AppMainWindow::setMainWindow(this); //init handling of first folder pair firstFolderPair.reset(new DirectoryPairFirst(*this)); @@ -566,12 +545,12 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, updateMenuHelp.addForUpdate(m_menuItemAbout, GlobalResources::instance().getImage(wxT("aboutSmall"))); #ifdef FFS_LINUX - if (!ffs3::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb + if (!zen::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb m_menuItemCheckVer->Enable(false); #endif //create language selection menu - for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i) + for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i) { wxMenuItem* newItem = new wxMenuItem(m_menuLanguages, wxID_ANY, i->languageName, wxEmptyString, wxITEM_NORMAL ); newItem->SetBitmap(GlobalResources::instance().getImage(i->languageFlag)); @@ -605,11 +584,13 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeFolderPairs), NULL, this); //dynamically change sizer direction depending on size + //m_panelTopButtons->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeTopButtons), NULL, this); m_panelConfig ->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeConfigPanel), NULL, this); m_panelViewFilter->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeViewPanel), NULL, this); m_panelStatistics->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeStatisticsPanel), NULL, this); wxSizeEvent dummy3; - OnResizeConfigPanel (dummy3); //call once on window creation + //OnResizeTopButtons (dummy3); //call once on window creation + OnResizeConfigPanel (dummy3); // OnResizeViewPanel (dummy3); // OnResizeStatisticsPanel(dummy3); // @@ -638,7 +619,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, //some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right off if (startComparison) { - const ffs3::MainConfiguration currMainCfg = getCurrentConfiguration().mainCfg; + const zen::MainConfiguration currMainCfg = getCurrentConfiguration().mainCfg; const bool allFoldersExist = !DirNotFound()(currMainCfg.firstPair) && std::find_if(currMainCfg.additionalPairs.begin(), currMainCfg.additionalPairs.end(), DirNotFound()) == currMainCfg.additionalPairs.end(); @@ -776,7 +757,7 @@ void MainDialog::writeGlobalSettings() } -void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const ffs3::SyncDirection dir) +void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const zen::SyncDirection dir) { if (rowsToSetOnUiTable.size() > 0) { @@ -786,7 +767,7 @@ void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, if (fsObj) { setSyncDirectionRec(dir, *fsObj); //set new direction (recursively) - ffs3::setActiveStatus(true, *fsObj); //works recursively for directories + zen::setActiveStatus(true, *fsObj); //works recursively for directories } } @@ -815,7 +796,7 @@ void MainDialog::filterRangeManually(const std::set<size_t>& rowsToFilterOnUiTab gridDataView->getAllFileRef(rowsToFilterOnUiTable, compRef); //everything in compRef is bound for (std::vector<FileSystemObject*>::iterator i = compRef.begin(); i != compRef.end(); ++i) - ffs3::setActiveStatus(newSelection, **i); //works recursively for directories + zen::setActiveStatus(newSelection, **i); //works recursively for directories refreshGridAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts } @@ -827,7 +808,7 @@ void MainDialog::OnIdleEvent(wxEvent& event) //small routine to restore status information after some time if (stackObjects.size() > 0 ) //check if there is some work to do { - wxLongLong currentTime = wxGetLocalTimeMillis(); + wxMilliClock_t currentTime = wxGetLocalTimeMillis(); if (currentTime - lastStatusChange > 2500) //restore stackObject after two seconds { lastStatusChange = currentTime; @@ -909,7 +890,7 @@ public: ignoreErrors(false), deletionCount(0) { - mainDlg->disableAllElements(); //disable everything except abort button + mainDlg->disableAllElements(true); //disable everything except abort button mainDlg->clearStatusBar(); //register abort button @@ -929,25 +910,22 @@ public: virtual Response reportError(const wxString& errorMessage) { if (abortRequested) - throw ffs3::AbortThisProcess(); + throw zen::AbortThisProcess(); if (ignoreErrors) return DeleteFilesHandler::IGNORE_ERROR; bool ignoreNextErrors = false; - ErrorDlg errorDlg(NULL, - ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, - errorMessage, ignoreNextErrors); - const int rv = errorDlg.ShowModal(); - switch (static_cast<ErrorDlg::ReturnCodes>(rv)) + switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT, + errorMessage, ignoreNextErrors)) { - case ErrorDlg::BUTTON_IGNORE: + case ReturnErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; return DeleteFilesHandler::IGNORE_ERROR; - case ErrorDlg::BUTTON_RETRY: + case ReturnErrorDlg::BUTTON_RETRY: return DeleteFilesHandler::RETRY; - case ErrorDlg::BUTTON_ABORT: - throw ffs3::AbortThisProcess(); + case ReturnErrorDlg::BUTTON_ABORT: + throw zen::AbortThisProcess(); } assert (false); @@ -960,8 +938,8 @@ public: if (updateUiIsAllowed()) //test if specific time span between ui updates is over { - wxString statusMessage = _("%x objects deleted successfully"); - statusMessage.Replace(wxT("%x"), ffs3::numberToStringSep(deletionCount), false); + wxString statusMessage = _P("Object deleted successfully!", "%x objects deleted successfully!", deletionCount); + statusMessage.Replace(wxT("%x"), zen::toStringSep(deletionCount), false); if (mainDlg->m_staticTextStatusMiddle->GetLabel() != statusMessage) { @@ -972,20 +950,20 @@ public: } if (abortRequested) //test after (implicit) call to wxApp::Yield() - throw ffs3::AbortThisProcess(); + throw zen::AbortThisProcess(); } private: void OnAbortCompare(wxCommandEvent& event) //handle abort button click { - abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw ffs3::AbortThisProcess()) + abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess()) } void OnKeyPressed(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); if (keyCode == WXK_ESCAPE) - abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw ffs3::AbortThisProcess()) + abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess()) event.Skip(); } @@ -999,12 +977,8 @@ private: }; -void MainDialog::deleteSelectedFiles() +void MainDialog::deleteSelectedFiles(const std::set<size_t>& viewSelectionLeft, const std::set<size_t>& viewSelectionRight) { - //get set of selected rows on view - const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft); - const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight); - if (viewSelectionLeft.size() + viewSelectionRight.size()) { //map lines from GUI view to grid line references @@ -1017,12 +991,12 @@ void MainDialog::deleteSelectedFiles() wxWindow* oldFocus = wxWindow::FindFocus(); - if (ffs3::showDeleteDialog(compRefLeft, - compRefRight, - globalSettings->gui.deleteOnBothSides, - globalSettings->gui.useRecyclerForManualDeletion) == DefaultReturnCode::BUTTON_OKAY) + if (zen::showDeleteDialog(compRefLeft, + compRefRight, + globalSettings->gui.deleteOnBothSides, + globalSettings->gui.useRecyclerForManualDeletion) == ReturnSmallDlg::BUTTON_OKAY) { - if (globalSettings->gui.useRecyclerForManualDeletion && !ffs3::recycleBinExists()) + if (globalSettings->gui.useRecyclerForManualDeletion && !zen::recycleBinExists()) { wxMessageBox(_("Recycle Bin not yet supported for this system!")); return; @@ -1033,14 +1007,14 @@ void MainDialog::deleteSelectedFiles() //handle errors when deleting files/folders ManualDeletionHandler statusHandler(this); - ffs3::deleteFromGridAndHD(gridDataView->getDataTentative(), - compRefLeft, - compRefRight, - globalSettings->gui.deleteOnBothSides, - globalSettings->gui.useRecyclerForManualDeletion, - statusHandler); + zen::deleteFromGridAndHD(gridDataView->getDataTentative(), + compRefLeft, + compRefRight, + globalSettings->gui.deleteOnBothSides, + globalSettings->gui.useRecyclerForManualDeletion, + statusHandler); } - catch (ffs3::AbortThisProcess&) {} + catch (zen::AbortThisProcess&) {} //remove rows that are empty: just a beautification, invalid rows shouldn't cause issues gridDataView->removeInvalidRows(); @@ -1140,9 +1114,9 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const if (name.empty()) { if (leftSide) - wxExecute(wxString(wxT("explorer ")) + zToWx(fsObj->getBaseDirPf<LEFT_SIDE>())); + zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + zToWx(fsObj->getBaseDirPf<LEFT_SIDE>()) + L"\""); else - wxExecute(wxString(wxT("explorer ")) + zToWx(fsObj->getBaseDirPf<RIGHT_SIDE>())); + zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + zToWx(fsObj->getBaseDirPf<RIGHT_SIDE>()) + L"\""); return; } #endif @@ -1150,14 +1124,14 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const else { //fallback - dir = zToWx(ffs3::getFormattedDirectoryName(firstFolderPair->getLeftDir())); - dirCo = zToWx(ffs3::getFormattedDirectoryName(firstFolderPair->getRightDir())); + dir = zToWx(zen::getFormattedDirectoryName(wxToZ(firstFolderPair->getLeftDir()))); + dirCo = zToWx(zen::getFormattedDirectoryName(wxToZ(firstFolderPair->getRightDir()))); if (!leftSide) std::swap(dir, dirCo); #ifdef FFS_WIN - wxExecute(wxString(wxT("explorer ")) + dir); //default + zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + dir + L"\""); //default return; #endif } @@ -1167,7 +1141,7 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const command.Replace(wxT("%name"), name, true); command.Replace(wxT("%dir"), dir, true); - wxExecute(command); + zen::shellExecute(command); } @@ -1193,9 +1167,9 @@ void MainDialog::clearStatusBar() } -void MainDialog::disableAllElements() +void MainDialog::disableAllElements(bool enableAbort) { - //disenables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion + //disables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion m_panelViewFilter ->Disable(); m_bpButtonCmpConfig ->Disable(); m_panelFilter ->Disable(); @@ -1208,17 +1182,22 @@ void MainDialog::disableAllElements() m_menubar1->EnableTop(1, false); m_menubar1->EnableTop(2, false); - //show abort button - m_buttonAbort->Enable(); - m_buttonAbort->Show(); - m_buttonAbort->SetFocus(); - m_buttonCompare->Disable(); - m_buttonCompare->Hide(); - m_bpButtonCmpConfig ->Disable(); - m_bpButtonSyncConfig->Disable(); - m_buttonStartSync ->Disable(); + if (enableAbort) + { - m_panelTopButtons->Layout(); + //show abort button + m_buttonAbort->Enable(); + m_buttonAbort->Show(); + m_buttonAbort->SetFocus(); + m_buttonCompare->Disable(); + m_buttonCompare->Hide(); + m_bpButtonCmpConfig ->Disable(); + m_bpButtonSyncConfig->Disable(); + m_buttonStartSync ->Disable(); + m_panelTopButtons->Layout(); + } + else + m_panelTopButtons->Disable(); } @@ -1246,6 +1225,7 @@ void MainDialog::enableAllElements() m_buttonStartSync ->Enable(); m_panelTopButtons->Layout(); + m_panelTopButtons->Enable(); } @@ -1302,20 +1282,24 @@ void updateSizerOrientation(wxBoxSizer& sizer, wxWindow& window) } +/*void MainDialog::OnResizeTopButtons(wxEvent& event) +{ + updateSizerOrientation(*bSizerTopButtons, *m_panelTopButtons); + event.Skip(); +}*/ + void MainDialog::OnResizeConfigPanel(wxEvent& event) { updateSizerOrientation(*bSizerConfig, *m_panelConfig); event.Skip(); } - void MainDialog::OnResizeViewPanel(wxEvent& event) { updateSizerOrientation(*bSizerViewFilter, *m_panelViewFilter); event.Skip(); } - void MainDialog::OnResizeStatisticsPanel(wxEvent& event) { updateSizerOrientation(*bSizerStatistics, *m_panelStatistics); @@ -1386,8 +1370,12 @@ void MainDialog::onGridLeftButtonEvent(wxKeyEvent& event) { case WXK_DELETE: case WXK_NUMPAD_DELETE: - deleteSelectedFiles(); - return; + { + const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft); + const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight); + deleteSelectedFiles(viewSelectionLeft, viewSelectionRight); + } + return; case WXK_SPACE: case WXK_NUMPAD_SPACE: @@ -1421,6 +1409,57 @@ void MainDialog::onGridMiddleButtonEvent(wxKeyEvent& event) case WXK_INSERT: //CTRL + C || CTRL + INS copySelectionToClipboard(*m_gridMiddle); return; + + case 'A': //CTRL + A + m_gridMiddle->SelectAll(); + return; + } + + else if (event.AltDown()) + switch (keyCode) + { + case WXK_LEFT: //ALT + <- + { + std::set<size_t> selection = getSelectedRows(m_gridMiddle); + setSyncDirManually(selection, zen::SYNC_DIR_LEFT); + } + return; + + case WXK_RIGHT: //ALT + -> + { + std::set<size_t> selection = getSelectedRows(m_gridMiddle); + setSyncDirManually(selection, zen::SYNC_DIR_RIGHT); + } + return; + + case WXK_UP: /* ALT + /|\ */ + case WXK_DOWN: /* ALT + \|/ */ + { + std::set<size_t> selection = getSelectedRows(m_gridMiddle); + setSyncDirManually(selection, zen::SYNC_DIR_NONE); + } + return; + } + + else + switch (keyCode) + { + case WXK_DELETE: + case WXK_NUMPAD_DELETE: + { + std::set<size_t> selection = getSelectedRows(m_gridMiddle); + deleteSelectedFiles(selection, selection); + } + + return; + + case WXK_SPACE: + case WXK_NUMPAD_SPACE: + { + std::set<size_t> selection = getSelectedRows(m_gridMiddle); + filterRangeManually(selection, static_cast<int>(*selection.begin())); + } + return; } event.Skip(); //unknown keypress: propagate @@ -1479,8 +1518,13 @@ void MainDialog::onGridRightButtonEvent(wxKeyEvent& event) { case WXK_DELETE: case WXK_NUMPAD_DELETE: - deleteSelectedFiles(); - return; + { + const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft); + const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight); + deleteSelectedFiles(viewSelectionLeft, viewSelectionRight); + } + + return; case WXK_SPACE: case WXK_NUMPAD_SPACE: @@ -1542,7 +1586,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou switch (keyCode) { case 'F': //CTRL + F - ffs3::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase); + zen::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase); return; //-> swallow event! } @@ -1550,7 +1594,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou { case WXK_F3: //F3 case WXK_NUMPAD_F3: // - ffs3::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase); + zen::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase); return; //-> swallow event! //redirect certain (unhandled) keys directly to grid! @@ -1656,7 +1700,10 @@ void MainDialog::OnContextRim(wxGridEvent& event) const FileSystemObject* fsObj = gridDataView->getObject(selectionBegin); - int contextItemID = 2000; +#ifndef _MSC_VER +#warning context menu buttons komplett lokalisieren: ALT+LEFT, SPACE D-Click, ENTER.. +#warning statt "Set direction: *-" besser "Set direction: ->" +#endif //####################################################### //re-create context menu @@ -1668,57 +1715,56 @@ void MainDialog::OnContextRim(wxGridEvent& event) if (selection.size() > 0) { //CONTEXT_SYNC_DIR_LEFT - wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) + + wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_LEFT)) + - wxT("\tALT + LEFT")); //Linux needs a direction, "<-", because it has no context menu icons! + wxT("\tAlt + Left")); //Linux needs a direction, "<-", because it has no context menu icons! menuItemSyncDirLeft->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_LEFT))); contextMenu->Append(menuItemSyncDirLeft); - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirLeft), NULL, this); + contextMenu->Connect(menuItemSyncDirLeft->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirLeft), NULL, this); //CONTEXT_SYNC_DIR_NONE - wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) + + wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_NONE)) + - wxT("\tALT + UP")); + wxT("\tAlt + Up")); menuItemSyncDirNone->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_NONE))); contextMenu->Append(menuItemSyncDirNone); - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirNone), NULL, this); + contextMenu->Connect(menuItemSyncDirNone->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirNone), NULL, this); //CONTEXT_SYNC_DIR_RIGHT - wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) + + wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT)) + - wxT("\tALT + RIGHT")); + wxT("\tAlt + Right")); menuItemSyncDirRight->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT))); contextMenu->Append(menuItemSyncDirRight); - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirRight), NULL, this); + contextMenu->Connect(menuItemSyncDirRight->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirRight), NULL, this); contextMenu->AppendSeparator(); } } - //CONTEXT_FILTER_TEMP if (fsObj && (selection.size() > 0)) { + wxMenuItem* menuItemInExcl = NULL; if (fsObj->isActive()) { - wxMenuItem* menuItemExclTemp = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Exclude temporarily")) + wxT("\tSPACE")); - menuItemExclTemp->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxFalse"))); - contextMenu->Append(menuItemExclTemp); + menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude temporarily")) + wxT("\tSpace")); + menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxFalse"))); } else { - wxMenuItem* menuItemInclTemp = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Include temporarily")) + wxT("\tSPACE")); - menuItemInclTemp->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxTrue"))); - contextMenu->Append(menuItemInclTemp); + menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Include temporarily")) + wxT("\tSpace")); + menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxTrue"))); } + + contextMenu->Append(menuItemInExcl); + contextMenu->Connect(menuItemInExcl->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextFilterTemp), NULL, this); } else { - contextMenu->Append(contextItemID, wxString(_("Exclude temporarily")) + wxT("\tSPACE")); //this element should always be visible - contextMenu->Enable(contextItemID, false); + wxMenuItem* menuItemExcl = contextMenu->Append(wxID_ANY, wxString(_("Exclude temporarily")) + wxT("\tSpace")); //this element should always be visible + contextMenu->Enable(menuItemExcl->GetId(), false); } - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextFilterTemp), NULL, this); - //############################################################################################### //get list of relative file/dir-names for filtering @@ -1766,12 +1812,12 @@ void MainDialog::OnContextRim(wxGridEvent& event) const Zstring extension = filename.AfterLast(Zchar('.')); //add context menu item - wxMenuItem* menuItemExclExt = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + zToWx(extension)); + wxMenuItem* menuItemExclExt = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + zToWx(extension)); menuItemExclExt->SetBitmap(GlobalResources::instance().getImage(wxT("filterSmall"))); contextMenu->Append(menuItemExclExt); //connect event - contextMenu->Connect(contextItemID, + contextMenu->Connect(menuItemExclExt->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextExcludeExtension), new SelectedExtension(extension), //ownership passed! @@ -1781,12 +1827,11 @@ void MainDialog::OnContextRim(wxGridEvent& event) //CONTEXT_EXCLUDE_OBJ - ++contextItemID; wxMenuItem* menuItemExclObj = NULL; if (exFilterCandidateObj.size() == 1) - menuItemExclObj = new wxMenuItem(contextMenu.get(), contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + zToWx(exFilterCandidateObj.begin()->first.AfterLast(common::FILE_NAME_SEPARATOR))); + menuItemExclObj = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + zToWx(exFilterCandidateObj.begin()->first.AfterLast(common::FILE_NAME_SEPARATOR))); else if (exFilterCandidateObj.size() > 1) - menuItemExclObj = new wxMenuItem(contextMenu.get(), contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + _("<multiple selection>")); + menuItemExclObj = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + _("<multiple selection>")); if (menuItemExclObj != NULL) { @@ -1794,7 +1839,7 @@ void MainDialog::OnContextRim(wxGridEvent& event) contextMenu->Append(menuItemExclObj); //connect event - contextMenu->Connect(contextItemID, + contextMenu->Connect(menuItemExclObj->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextExcludeObject), new FilterObjContainer(exFilterCandidateObj), //ownership passed! @@ -1815,18 +1860,19 @@ void MainDialog::OnContextRim(wxGridEvent& event) ++i) { //some trick to translate default external apps on the fly: 1. "open in explorer" 2. "start directly" - wxString description = wxGetTranslation(i->first); + //wxString description = wxGetTranslation(i->first); + wxString description = zen::translate(i->first); if (description.empty()) description = wxT(" "); //wxWidgets doesn't like empty items - ++contextItemID; + wxMenuItem* itemExtApp = NULL; if (i == globalSettings->gui.externelApplications.begin()) - contextMenu->Append(contextItemID, description + wxT("\t") + wxString(_("D-Click")) + wxT("; ENTER")); + itemExtApp = contextMenu->Append(wxID_ANY, description + wxT("\t") + wxString(_("D-Click")) + wxT("; Enter")); else - contextMenu->Append(contextItemID, description); - contextMenu->Enable(contextItemID, externalAppEnabled); + itemExtApp = contextMenu->Append(wxID_ANY, description); + contextMenu->Enable(itemExtApp->GetId(), externalAppEnabled); - contextMenu->Connect(contextItemID, + contextMenu->Connect(itemExtApp->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextOpenWith), new CtxtSelectionString(i->second), //ownership passed! @@ -1837,24 +1883,14 @@ void MainDialog::OnContextRim(wxGridEvent& event) contextMenu->AppendSeparator(); - //CONTEXT_CLIPBOARD - contextMenu->Append(++contextItemID, _("Copy to clipboard\tCTRL+C")); - - if (!selection.empty() && - (m_gridLeft->isLeadGrid() || m_gridRight->isLeadGrid())) - contextMenu->Enable(contextItemID, true); - else - contextMenu->Enable(contextItemID, false); - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextCopyClipboard), NULL, this); - +#ifndef _MSC_VER +#warning context menu buttons: nicht mehr all caps +#endif //CONTEXT_DELETE_FILES - contextMenu->Append(++contextItemID, _("Delete files\tDEL")); - - if (selection.size() == 0) - contextMenu->Enable(contextItemID, false); - - contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextDeleteFiles), NULL, this); + wxMenuItem* menuItemDelFiles = contextMenu->Append(wxID_ANY, _("Delete files\tDEL")); + contextMenu->Enable(menuItemDelFiles->GetId(), selection.size() > 0); + contextMenu->Connect(menuItemDelFiles->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextDeleteFiles), NULL, this); //show context menu PopupMenu(contextMenu.get()); @@ -1886,7 +1922,7 @@ void MainDialog::OnContextExcludeExtension(wxCommandEvent& event) updateFilterButtons(); //do not fully apply filter, just exclude new items - addExcludeFiltering(newExclude, gridDataView->getDataTentative()); + addExcludeFiltering(gridDataView->getDataTentative(), newExclude); //applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative()); updateGuiGrid(); @@ -1927,7 +1963,7 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event) updateFilterButtons(); //do not fully apply filter, just exclude new items - addExcludeFiltering(newExclude, gridDataView->getDataTentative()); + addExcludeFiltering(gridDataView->getDataTentative(), newExclude); //applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative()); updateGuiGrid(); @@ -1942,14 +1978,6 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event) } -void MainDialog::OnContextCopyClipboard(wxCommandEvent& event) -{ - if (m_gridLeft->isLeadGrid()) - copySelectionToClipboard(*m_gridLeft); - else if (m_gridRight->isLeadGrid()) - copySelectionToClipboard(*m_gridRight); -} - void MainDialog::OnContextOpenWith(wxCommandEvent& event) { @@ -1962,7 +1990,9 @@ void MainDialog::OnContextOpenWith(wxCommandEvent& event) void MainDialog::OnContextDeleteFiles(wxCommandEvent& event) { - deleteSelectedFiles(); + const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft); + const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight); + deleteSelectedFiles(viewSelectionLeft, viewSelectionRight); } @@ -1970,7 +2000,7 @@ void MainDialog::OnContextSyncDirLeft(wxCommandEvent& event) { //merge selections from left and right grid const std::set<size_t> selection = getSelectedRows(); - setSyncDirManually(selection, ffs3::SYNC_DIR_LEFT); + setSyncDirManually(selection, zen::SYNC_DIR_LEFT); } @@ -1978,7 +2008,7 @@ void MainDialog::OnContextSyncDirNone(wxCommandEvent& event) { //merge selections from left and right grid const std::set<size_t> selection = getSelectedRows(); - setSyncDirManually(selection, ffs3::SYNC_DIR_NONE); + setSyncDirManually(selection, zen::SYNC_DIR_NONE); } @@ -1986,7 +2016,7 @@ void MainDialog::OnContextSyncDirRight(wxCommandEvent& event) { //merge selections from left and right grid const std::set<size_t> selection = getSelectedRows(); - setSyncDirManually(selection, ffs3::SYNC_DIR_RIGHT); + setSyncDirManually(selection, zen::SYNC_DIR_RIGHT); } @@ -2033,7 +2063,7 @@ void MainDialog::OnContextCustColumnLeft(wxCommandEvent& event) { xmlAccess::ColumnAttributes colAttr = m_gridLeft->getColumnAttributes(); - if (ffs3::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY) + if (zen::showCustomizeColsDlg(colAttr) == ReturnSmallDlg::BUTTON_OKAY) { m_gridLeft->setColumnAttributes(colAttr); @@ -2048,7 +2078,7 @@ void MainDialog::OnContextCustColumnRight(wxCommandEvent& event) { xmlAccess::ColumnAttributes colAttr = m_gridRight->getColumnAttributes(); - if (ffs3::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY) + if (zen::showCustomizeColsDlg(colAttr) == ReturnSmallDlg::BUTTON_OKAY) { m_gridRight->setColumnAttributes(colAttr); @@ -2176,14 +2206,14 @@ void MainDialog::OnContextSetLayoutShowPanel(wxCommandEvent& event) void MainDialog::OnContextIncludeAll(wxCommandEvent& event) { - ffs3::setActiveStatus(true, gridDataView->getDataTentative()); + zen::setActiveStatus(true, gridDataView->getDataTentative()); refreshGridAfterFilterChange(0); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts break; } void MainDialog::OnContextExcludeAll(wxCommandEvent& event) { - ffs3::setActiveStatus(false, gridDataView->getDataTentative()); + zen::setActiveStatus(false, gridDataView->getDataTentative()); refreshGridAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts } @@ -2224,8 +2254,12 @@ wxString getFormattedHistoryElement(const wxString& filename) } -void MainDialog::addFileToCfgHistory(const wxString& filename) +void MainDialog::addFileToCfgHistory(const wxString& cfgFile) { + wxString filename = cfgFile; + if (filename.empty()) + filename = lastRunConfigName(); + //only (still) existing files should be included in the list if (util::fileExists(wxToZ(filename), 200) == util::EXISTING_FALSE) //potentially slow network access: wait 200ms return; @@ -2270,13 +2304,13 @@ void MainDialog::addFileToCfgHistory(const wxString& filename) void MainDialog::addLeftFolderToHistory(const wxString& leftFolder) { - m_directoryLeft->addPairToFolderHistory(leftFolder, globalSettings->gui.folderHistLeftMax); + m_directoryLeft->addPairToFolderHistory(leftFolder, globalSettings->gui.folderHistMax); } void MainDialog::addRightFolderToHistory(const wxString& rightFolder) { - m_directoryRight->addPairToFolderHistory(rightFolder, globalSettings->gui.folderHistRightMax); + m_directoryRight->addPairToFolderHistory(rightFolder, globalSettings->gui.folderHistMax); } @@ -2299,13 +2333,10 @@ bool MainDialog::trySaveConfig() //return true if saved successfully { const wxString newFileName = filePicker.GetPath(); - if (ffs3::fileExists(wxToZ(newFileName))) + if (zen::fileExists(wxToZ(newFileName))) { - QuestionDlg messageDlg(this, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL, - wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")); - - if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES) + if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, + wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES) return trySaveConfig(); //retry } @@ -2366,21 +2397,18 @@ bool MainDialog::saveOldConfig() //return false on user abort { bool dontShowAgain = !globalSettings->optDialogs.popupOnConfigChange; - QuestionDlg notifyChangeDlg(this, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_NO | QuestionDlg::BUTTON_CANCEL, - _("Save changes to current configuration?"), - &dontShowAgain); - - switch (notifyChangeDlg.ShowModal()) + switch (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL, + _("Save changes to current configuration?"), + &dontShowAgain)) { - case QuestionDlg::BUTTON_YES: + case ReturnQuestionDlg::BUTTON_YES: if (!trySaveConfig()) return false; break; - case QuestionDlg::BUTTON_NO: + case ReturnQuestionDlg::BUTTON_NO: globalSettings->optDialogs.popupOnConfigChange = !dontShowAgain; break; - case QuestionDlg::BUTTON_CANCEL: + case ReturnQuestionDlg::BUTTON_CANCEL: return false; } } @@ -2490,7 +2518,7 @@ void MainDialog::OnSetSyncDirection(FFSSyncDirectionEvent& event) if (fsObj) { setSyncDirectionRec(event.direction, *fsObj); //set new direction (recursively) - ffs3::setActiveStatus(true, *fsObj); //works recursively for directories + zen::setActiveStatus(true, *fsObj); //works recursively for directories } } @@ -2538,7 +2566,7 @@ void MainDialog::setLastUsedConfig(const wxString& filename, const xmlAccess::Xm addFileToCfgHistory(filename); //put filename on list of last used config files //set title - if (filename == lastRunConfigName()) + if (filename.empty() || filename == lastRunConfigName()) { SetTitle(wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization")); currentConfigFileName.clear(); @@ -2591,8 +2619,8 @@ void MainDialog::setCurrentConfiguration(const xmlAccess::XmlGuiConfig& newGuiCf updateFilterButtons(); //set first folder pair - firstFolderPair->setValues(currentCfg.mainCfg.firstPair.leftDirectory, - currentCfg.mainCfg.firstPair.rightDirectory, + firstFolderPair->setValues(zToWx(currentCfg.mainCfg.firstPair.leftDirectory), + zToWx(currentCfg.mainCfg.firstPair.rightDirectory), currentCfg.mainCfg.firstPair.altSyncConfig, currentCfg.mainCfg.firstPair.localFilter); @@ -2622,10 +2650,10 @@ void MainDialog::setCurrentConfiguration(const xmlAccess::XmlGuiConfig& newGuiCf inline -FolderPairEnh getEnahncedPair(const DirectoryPair* panel) +FolderPairEnh getEnhancedPair(const DirectoryPair* panel) { - return FolderPairEnh(panel->getLeftDir(), - panel->getRightDir(), + return FolderPairEnh(wxToZ(panel->getLeftDir()), + wxToZ(panel->getRightDir()), panel->getAltSyncConfig(), panel->getAltFilterConfig()); } @@ -2638,15 +2666,15 @@ xmlAccess::XmlGuiConfig MainDialog::getCurrentConfiguration() const //load settings whose ownership lies not in currentCfg: //first folder pair - guiCfg.mainCfg.firstPair = FolderPairEnh(firstFolderPair->getLeftDir(), - firstFolderPair->getRightDir(), + guiCfg.mainCfg.firstPair = FolderPairEnh(wxToZ(firstFolderPair->getLeftDir()), + wxToZ(firstFolderPair->getRightDir()), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); //add additional pairs guiCfg.mainCfg.additionalPairs.clear(); std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(), - std::back_inserter(guiCfg.mainCfg.additionalPairs), getEnahncedPair); + std::back_inserter(guiCfg.mainCfg.additionalPairs), getEnhancedPair); //sync preview guiCfg.syncPreviewEnabled = syncPreview->previewIsEnabled(); @@ -2657,7 +2685,7 @@ xmlAccess::XmlGuiConfig MainDialog::getCurrentConfiguration() const const wxString& MainDialog::lastRunConfigName() { - static wxString instance = ffs3::getConfigDir() + wxT("LastRun.ffs_gui"); + static wxString instance = zen::getConfigDir() + wxT("LastRun.ffs_gui"); return instance; } @@ -2703,8 +2731,7 @@ void MainDialog::OnHideFilteredButton(wxCommandEvent& event) void MainDialog::OnConfigureFilter(wxCommandEvent& event) { if (showFilterDialog(true, //is main filter dialog - currentCfg.mainCfg.globalFilter.includeFilter, - currentCfg.mainCfg.globalFilter.excludeFilter) == DefaultReturnCode::BUTTON_OKAY) + currentCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY) { updateFilterButtons(); //refresh global filter icon updateFilterConfig(); //re-apply filter @@ -2966,75 +2993,76 @@ void MainDialog::OnCompare(wxCommandEvent& event) gridDataView->clearAllRows(); //updateGuiGrid(); -> don't resize grid to keep scroll position! - bool aborted = false; try { //class handling status display and error messages - CompareStatusHandler statusHandler(this); + CompareStatusHandler statusHandler(*this); + + const std::vector<zen::FolderPairCfg> cmpConfig = zen::extractCompareCfg(getCurrentConfiguration().mainCfg); + + //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization + LockHolder dummy2; + for (std::vector<FolderPairCfg>::const_iterator i = cmpConfig.begin(); i != cmpConfig.end(); ++i) + { + dummy2.addDir(i->leftDirectoryFmt, statusHandler); + dummy2.addDir(i->rightDirectoryFmt, statusHandler); + } //begin comparison - ffs3::CompareProcess comparison(currentCfg.mainCfg.handleSymlinks, - globalSettings->fileTimeTolerance, - globalSettings->optDialogs, - &statusHandler); + zen::CompareProcess comparison(currentCfg.mainCfg.handleSymlinks, + globalSettings->fileTimeTolerance, + globalSettings->optDialogs, + statusHandler); //technical representation of comparison data - ffs3::FolderComparison newCompareData; - - comparison.startCompareProcess( - ffs3::extractCompareCfg(getCurrentConfiguration().mainCfg), //call getCurrentCfg() to get current values for directory pairs! - currentCfg.mainCfg.compareVar, - newCompareData); + zen::FolderComparison newCompareData; + comparison.startCompareProcess(cmpConfig, //call getCurrentCfg() to get current values for directory pairs! + currentCfg.mainCfg.compareVar, + newCompareData); gridDataView->setData(newCompareData); //newCompareData is invalidated after this call //play (optional) sound notification after sync has completed (GUI and batch mode) - const wxString soundFile = ffs3::getResourceDir() + wxT("Compare_Complete.wav"); + const wxString soundFile = zen::getResourceDir() + wxT("Compare_Complete.wav"); if (fileExists(wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); } catch (AbortThisProcess&) { - aborted = true; - } - - if (aborted) - { //disable the sync button syncPreview->enableSynchronization(false); m_buttonCompare->SetFocus(); updateGuiGrid(); //refresh grid in ANY case! (also on abort) + return; } - else - { - //once compare is finished enable the sync button - syncPreview->enableSynchronization(true); - m_buttonStartSync->SetFocus(); - //hide sort direction indicator on GUI grids - m_gridLeft ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); - m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); - m_gridRight ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); + //once compare is finished enable the sync button + syncPreview->enableSynchronization(true); + m_buttonStartSync->SetFocus(); - //reset last sort selection: used for determining sort direction - lastSortColumn = -1; - lastSortGrid = NULL; + //hide sort direction indicator on GUI grids + m_gridLeft ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); + m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); + m_gridRight ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); - m_gridLeft-> ClearSelection(); - m_gridMiddle->ClearSelection(); - m_gridRight-> ClearSelection(); + //reset last sort selection: used for determining sort direction + lastSortColumn = -1; + lastSortGrid = NULL; - //add to folder history after successful comparison only - addLeftFolderToHistory( m_directoryLeft->GetValue()); - addRightFolderToHistory(m_directoryRight->GetValue()); + m_gridLeft-> ClearSelection(); + m_gridMiddle->ClearSelection(); + m_gridRight-> ClearSelection(); - //refresh grid in ANY case! (also on abort) - updateGuiGrid(); + //add to folder history after successful comparison only + addLeftFolderToHistory( m_directoryLeft->GetValue()); + addRightFolderToHistory(m_directoryRight->GetValue()); - //prepare status information - if (allElementsEqual(gridDataView->getDataTentative())) - pushStatusInformation(_("All directories in sync!")); - } + //refresh grid in ANY case! (also on abort) + updateGuiGrid(); + + //prepare status information + if (allElementsEqual(gridDataView->getDataTentative())) + pushStatusInformation(_("All directories in sync!")); } @@ -3085,10 +3113,10 @@ void MainDialog::updateStatistics() { //update preview of bytes to be transferred: const SyncStatistics st(gridDataView->getDataTentative()); - const wxString toCreate = ffs3::numberToStringSep(st.getCreate()); - const wxString toUpdate = ffs3::numberToStringSep(st.getOverwrite()); - const wxString toDelete = ffs3::numberToStringSep(st.getDelete()); - const wxString data = ffs3::formatFilesizeToShortString(st.getDataToProcess()); + const wxString toCreate = zen::toStringSep(st.getCreate()); + const wxString toUpdate = zen::toStringSep(st.getOverwrite()); + const wxString toDelete = zen::toStringSep(st.getDelete()); + const wxString data = zen::formatFilesizeToShortString(st.getDataToProcess()); m_textCtrlCreate->SetValue(toCreate); m_textCtrlUpdate->SetValue(toUpdate); @@ -3106,14 +3134,14 @@ void MainDialog::OnSwitchView(wxCommandEvent& event) void MainDialog::OnSyncSettings(wxCommandEvent& event) { - SyncCfgDialog syncDlg(this, - currentCfg.mainCfg.compareVar, + if (showSyncConfigDlg(currentCfg.mainCfg.compareVar, currentCfg.mainCfg.syncConfiguration, currentCfg.mainCfg.handleDeletion, currentCfg.mainCfg.customDeletionDirectory, - ¤tCfg.ignoreErrors); - if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY) + ¤tCfg.handleError) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter + { applySyncConfig(); + } } @@ -3126,9 +3154,9 @@ void MainDialog::OnCmpSettings(wxCommandEvent& event) const CompareVariant compareVarOld = currentCfg.mainCfg.compareVar; const SymLinkHandling handleSymlinksOld = currentCfg.mainCfg.handleSymlinks; - if (ffs3::showCompareCfgDialog(windowPos, - currentCfg.mainCfg.compareVar, - currentCfg.mainCfg.handleSymlinks) == DefaultReturnCode::BUTTON_OKAY && + if (zen::showCompareCfgDialog(windowPos, + currentCfg.mainCfg.compareVar, + currentCfg.mainCfg.handleSymlinks) == ReturnSmallDlg::BUTTON_OKAY && //check if settings were changed at all (compareVarOld != currentCfg.mainCfg.compareVar || handleSymlinksOld != currentCfg.mainCfg.handleSymlinks)) @@ -3164,8 +3192,14 @@ void MainDialog::OnStartSync(wxCommandEvent& event) { if (!syncPreview->synchronizationIsEnabled()) { - pushStatusInformation(_("Please run a Compare first before synchronizing!")); - return; + //quick sync: simulate button click on "compare" + wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED); + m_buttonCompare->GetEventHandler()->ProcessEvent(dummy2); //synchronous call + + if (!syncPreview->synchronizationIsEnabled()) //check if user aborted or error occured, ect... + return; + //pushStatusInformation(_("Please run a Compare first before synchronizing!")); + //return; } //show sync preview screen @@ -3173,10 +3207,10 @@ void MainDialog::OnStartSync(wxCommandEvent& event) { bool dontShowAgain = false; - if (ffs3::showSyncPreviewDlg( + if (zen::showSyncPreviewDlg( getCurrentConfiguration().mainCfg.getSyncVariantName(), - ffs3::SyncStatistics(gridDataView->getDataTentative()), - dontShowAgain) != DefaultReturnCode::BUTTON_OKAY) + zen::SyncStatistics(gridDataView->getDataTentative()), + dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY) return; globalSettings->optDialogs.showSummaryBeforeSync = !dontShowAgain; @@ -3190,18 +3224,27 @@ void MainDialog::OnStartSync(wxCommandEvent& event) //PERF_START; //class handling status updates and error messages - SyncStatusHandler statusHandler(this, currentCfg.ignoreErrors, ffs3::extractJobName(currentConfigFileName)); + SyncStatusHandler statusHandler(this, currentCfg.handleError, zen::extractJobName(currentConfigFileName)); + + FolderComparison& dataToSync = gridDataView->getDataTentative(); + + //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization + LockHolder dummy2; + for (FolderComparison::const_iterator i = dataToSync.begin(); i != dataToSync.end(); ++i) + { + dummy2.addDir(i->getBaseDir<LEFT_SIDE >(), statusHandler); + dummy2.addDir(i->getBaseDir<RIGHT_SIDE>(), statusHandler); + } //start synchronization and mark all elements processed - ffs3::SyncProcess synchronization( + zen::SyncProcess synchronization( globalSettings->optDialogs, globalSettings->verifyFileCopy, globalSettings->copyLockedFiles, globalSettings->copyFilePermissions, statusHandler); - const std::vector<ffs3::FolderPairSyncCfg> syncProcessCfg = ffs3::extractSyncCfg(getCurrentConfiguration().mainCfg); - FolderComparison& dataToSync = gridDataView->getDataTentative(); + const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(getCurrentConfiguration().mainCfg); //make sure syncProcessCfg and dataToSync have same size and correspond! if (syncProcessCfg.size() != dataToSync.size()) @@ -3210,7 +3253,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event) synchronization.startSynchronizationProcess(syncProcessCfg, dataToSync); //play (optional) sound notification after sync has completed (GUI and batch mode) - const wxString soundFile = ffs3::getResourceDir() + wxT("Sync_Complete.wav"); + const wxString soundFile = zen::getResourceDir() + wxT("Sync_Complete.wav"); if (fileExists(wxToZ(soundFile))) wxSound::Play(soundFile, wxSOUND_ASYNC); } @@ -3434,7 +3477,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) m_bpButtonSyncDirOverwRight->setActive(tmp); //swap grid information - ffs3::swapGrids(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative()); + zen::swapGrids(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative()); updateGuiGrid(); } @@ -3445,8 +3488,8 @@ void MainDialog::updateGridViewData() size_t foldersOnLeftView = 0; size_t filesOnRightView = 0; size_t foldersOnRightView = 0; - wxULongLong filesizeLeftView; - wxULongLong filesizeRightView; + zen::UInt64 filesizeLeftView; + zen::UInt64 filesizeRightView; //disable all buttons per default m_bpButtonLeftOnly-> Show(false); @@ -3570,16 +3613,9 @@ void MainDialog::updateGridViewData() //show status information on "root" level. if (foldersOnLeftView) { - if (foldersOnLeftView == 1) - statusLeftNew += _("1 directory"); - else - { - wxString folderCount = ffs3::numberToStringSep(foldersOnLeftView); - - wxString outputString = _("%x directories"); - outputString.Replace(wxT("%x"), folderCount, false); - statusLeftNew += outputString; - } + wxString tmp = _P("1 directory", "%x directories", foldersOnLeftView); + tmp.Replace(wxT("%x"), zen::toStringSep(foldersOnLeftView), false); + statusLeftNew += tmp; if (filesOnLeftView) statusLeftNew += wxT(" - "); @@ -3587,49 +3623,26 @@ void MainDialog::updateGridViewData() if (filesOnLeftView) { - if (filesOnLeftView == 1) - statusLeftNew += _("1 file"); - else - { - wxString fileCount = ffs3::numberToStringSep(filesOnLeftView); + wxString tmp = _P("1 file", "%x files", filesOnLeftView); + tmp.Replace(wxT("%x"), zen::toStringSep(filesOnLeftView), false); + statusLeftNew += tmp; - wxString outputString = _("%x files"); - outputString.Replace(wxT("%x"), fileCount, false); - statusLeftNew += outputString; - } statusLeftNew += wxT(" - "); - statusLeftNew += ffs3::formatFilesizeToShortString(filesizeLeftView); + statusLeftNew += zen::formatFilesizeToShortString(filesizeLeftView); } - const wxString objectsView = ffs3::numberToStringSep(gridDataView->rowsOnView()); - if (gridDataView->rowsTotal() == 1) { - wxString outputString = _("%x of 1 row in view"); - outputString.Replace(wxT("%x"), objectsView, false); - statusMiddleNew = outputString; - } - else - { - const wxString objectsTotal = ffs3::numberToStringSep(gridDataView->rowsTotal()); - - wxString outputString = _("%x of %y rows in view"); - outputString.Replace(wxT("%x"), objectsView, false); - outputString.Replace(wxT("%y"), objectsTotal, false); - statusMiddleNew = outputString; + wxString tmp = _P("%x of 1 row in view", "%x of %y rows in view", gridDataView->rowsTotal()); + tmp.Replace(wxT("%x"), toStringSep(gridDataView->rowsOnView()), false); + tmp.Replace(wxT("%y"), toStringSep(gridDataView->rowsTotal()), false); + statusMiddleNew = tmp; } if (foldersOnRightView) { - if (foldersOnRightView == 1) - statusRightNew += _("1 directory"); - else - { - wxString folderCount = ffs3::numberToStringSep(foldersOnRightView); - - wxString outputString = _("%x directories"); - outputString.Replace(wxT("%x"), folderCount, false); - statusRightNew += outputString; - } + wxString tmp = _P("1 directory", "%x directories", foldersOnRightView); + tmp.Replace(wxT("%x"), zen::toStringSep(foldersOnRightView), false); + statusRightNew += tmp; if (filesOnRightView) statusRightNew += wxT(" - "); @@ -3637,19 +3650,12 @@ void MainDialog::updateGridViewData() if (filesOnRightView) { - if (filesOnRightView == 1) - statusRightNew += _("1 file"); - else - { - wxString fileCount = ffs3::numberToStringSep(filesOnRightView); - - wxString outputString = _("%x files"); - outputString.Replace(wxT("%x"), fileCount, false); - statusRightNew += outputString; - } + wxString tmp = _P("1 file", "%x files", filesOnRightView); + tmp.Replace(wxT("%x"), zen::toStringSep(filesOnRightView), false); + statusRightNew += tmp; statusRightNew += wxT(" - "); - statusRightNew += ffs3::formatFilesizeToShortString(filesizeRightView); + statusRightNew += zen::formatFilesizeToShortString(filesizeRightView); } @@ -3676,8 +3682,8 @@ void MainDialog::OnAddFolderPair(wxCommandEvent& event) //clear first pair const FolderPairEnh cfgEmpty; - firstFolderPair->setValues(cfgEmpty.leftDirectory, - cfgEmpty.rightDirectory, + firstFolderPair->setValues(zToWx(cfgEmpty.leftDirectory), + zToWx(cfgEmpty.rightDirectory), cfgEmpty.altSyncConfig, cfgEmpty.localFilter); @@ -3692,7 +3698,7 @@ void MainDialog::OnAddFolderPair(wxCommandEvent& event) void MainDialog::updateFilterConfig() { - applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative()); + applyFiltering(gridDataView->getDataTentative(), getCurrentConfiguration().mainCfg); refreshGridAfterFilterChange(400); } @@ -3716,11 +3722,9 @@ void MainDialog::applySyncConfig() if (warningSyncDatabase_) { bool dontWarnAgain = false; - WarningDlg warningDlg(parent_, //show popup and ask user how to handle warning - WarningDlg::BUTTON_IGNORE, - text, - dontWarnAgain); - if (warningDlg.ShowModal() == WarningDlg::BUTTON_IGNORE) + if (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE, + text, + dontWarnAgain) == ReturnWarningDlg::BUTTON_IGNORE) warningSyncDatabase_ = !dontWarnAgain; } } @@ -3729,7 +3733,7 @@ void MainDialog::applySyncConfig() wxWindow* parent_; } redetCallback(globalSettings->optDialogs.warningSyncDatabase, this); - ffs3::redetermineSyncDirection(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative(), &redetCallback); + zen::redetermineSyncDirection(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative(), &redetCallback); updateGuiGrid(); } @@ -3741,11 +3745,11 @@ void MainDialog::OnRemoveTopFolderPair(wxCommandEvent& event) wxWindowUpdateLocker dummy(this); //avoid display distortion //get settings from second folder pair - const FolderPairEnh cfgSecond = getEnahncedPair(additionalFolderPairs[0]); + const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]); //reset first pair - firstFolderPair->setValues(cfgSecond.leftDirectory, - cfgSecond.rightDirectory, + firstFolderPair->setValues(zToWx(cfgSecond.leftDirectory), + zToWx(cfgSecond.rightDirectory), cfgSecond.altSyncConfig, cfgSecond.localFilter); @@ -3796,8 +3800,7 @@ void MainDialog::updateGuiForFolderPair() //adapt local filter and sync cfg for first folder pair if (additionalFolderPairs.size() == 0 && firstFolderPair->getAltSyncConfig().get() == NULL && - NameFilter(firstFolderPair->getAltFilterConfig().includeFilter, - firstFolderPair->getAltFilterConfig().excludeFilter).isNull()) + isNullFilter(firstFolderPair->getAltFilterConfig())) { m_bpButtonLocalFilter->Hide(); m_bpButtonAltSyncCfg->Hide(); @@ -3827,6 +3830,12 @@ void MainDialog::updateGuiForFolderPair() //m_scrolledWindowFolderPairs->Layout(); //adjust stuff inside scrolled window m_panelDirectoryPairs->Layout(); + + /* + #warning test + auiMgr.GetPane(m_panelDirectoryPairs).MaxSize(20, 20); + auiMgr.Update(); + */ } @@ -3861,8 +3870,8 @@ void MainDialog::addFolderPair(const std::vector<FolderPairEnh>& newPairs, bool newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolderPair), NULL, this); //set alternate configuration - newPair->setValues(i->leftDirectory, - i->rightDirectory, + newPair->setValues(zToWx(i->leftDirectory), + zToWx(i->rightDirectory), i->altSyncConfig, i->localFilter); } @@ -3926,11 +3935,23 @@ void MainDialog::clearAddFolderPairs() //menu events void MainDialog::OnMenuGlobalSettings(wxCommandEvent& event) { - ffs3::showGlobalSettingsDlg(*globalSettings); + zen::showGlobalSettingsDlg(*globalSettings); //event.Skip(); } +namespace +{ +inline +void addCellValue(zxString& exportString, const wxString& cellVal) +{ + if (cellVal.find(wxT(';')) != wxString::npos) + exportString += wxT('\"') + wxToZx(cellVal) + wxT('\"'); + else + exportString += wxToZx(cellVal); +} +} + void MainDialog::OnMenuExportFileList(wxCommandEvent& event) { @@ -3941,13 +3962,10 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) if (filePicker.ShowModal() == wxID_OK) { const wxString newFileName = filePicker.GetPath(); - if (ffs3::fileExists(wxToZ(newFileName))) + if (zen::fileExists(wxToZ(newFileName))) { - QuestionDlg messageDlg(this, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL, - wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")); - - if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES) + if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, + wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES) { OnMenuExportFileList(event); //retry return; @@ -3986,21 +4004,21 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) const int colsLeft = m_gridLeft->GetNumberCols(); for (int k = 0; k < colsLeft; ++k) { - exportString += wxToZx(m_gridLeft->GetColLabelValue(k)); + addCellValue(exportString, m_gridLeft->GetColLabelValue(k)); exportString += wxT(';'); } const int colsMiddle = m_gridMiddle->GetNumberCols(); for (int k = 0; k < colsMiddle; ++k) { - exportString += wxToZx(m_gridMiddle->GetColLabelValue(k)); + addCellValue(exportString, m_gridMiddle->GetColLabelValue(k)); exportString += wxT(';'); } const int colsRight = m_gridRight->GetNumberCols(); for (int k = 0; k < colsRight; ++k) { - exportString += wxToZx(m_gridRight->GetColLabelValue(k)); + addCellValue(exportString, m_gridRight->GetColLabelValue(k)); if (k != m_gridRight->GetNumberCols() - 1) exportString += wxT(';'); } @@ -4012,19 +4030,19 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) { for (int k = 0; k < colsLeft; ++k) { - exportString += wxToZx(m_gridLeft->GetCellValue(i, k)); + addCellValue(exportString, m_gridLeft->GetCellValue(i, k)); exportString += wxT(';'); } for (int k = 0; k < colsMiddle; ++k) { - exportString += wxToZx(m_gridMiddle->GetCellValue(i, k)); + addCellValue(exportString, m_gridMiddle->GetCellValue(i, k)); exportString += wxT(';'); } for (int k = 0; k < colsRight; ++k) { - exportString += wxToZx(m_gridRight->GetCellValue(i, k)); + addCellValue(exportString, m_gridRight->GetCellValue(i, k)); if (k != colsRight - 1) exportString += wxT(';'); } @@ -4035,8 +4053,12 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) wxFFile output(newFileName.c_str(), wxT("w")); //don't write in binary mode if (output.IsOpened()) { + //generate UTF8 representation + size_t bufferSize = 0; + const wxCharBuffer utf8buffer = wxConvUTF8.cWC2MB(exportString.c_str(), exportString.size(), &bufferSize); + output.Write(common::BYTE_ORDER_MARK_UTF8, sizeof(common::BYTE_ORDER_MARK_UTF8) - 1); - output.Write(exportString.c_str(), exportString.size() * sizeof(zxString::value_type)); + output.Write(utf8buffer, bufferSize); pushStatusInformation(_("File list exported!")); } else @@ -4054,15 +4076,14 @@ void MainDialog::OnMenuBatchJob(wxCommandEvent& event) const xmlAccess::XmlBatchConfig batchCfg = convertGuiToBatch(currCfg); - BatchDialog batchDlg(this, batchCfg); - if (batchDlg.ShowModal() == BatchDialog::BATCH_FILE_SAVED) + if (showSyncBatchDlg(batchCfg) == ReturnBatchConfig::BATCH_FILE_SAVED) pushStatusInformation(_("Batch file created successfully!")); } void MainDialog::OnMenuCheckVersion(wxCommandEvent& event) { - ffs3::checkForUpdateNow(); + zen::checkForUpdateNow(); } @@ -4071,7 +4092,7 @@ void MainDialog::OnRegularUpdateCheck(wxIdleEvent& event) //execute just once per startup! Disconnect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnRegularUpdateCheck), NULL, this); - ffs3::checkForUpdatePeriodically(globalSettings->gui.lastUpdateCheck); + zen::checkForUpdatePeriodically(globalSettings->gui.lastUpdateCheck); } @@ -4094,13 +4115,13 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event) void MainDialog::OnMenuAbout(wxCommandEvent& event) { - ffs3::showAboutDialog(); + zen::showAboutDialog(); } void MainDialog::OnShowHelp(wxCommandEvent& event) { - ffs3::displayHelpEntry(); + zen::displayHelpEntry(); } @@ -4115,7 +4136,7 @@ void MainDialog::OnMenuQuit(wxCommandEvent& event) void MainDialog::switchProgramLanguage(const int langID) { //create new dialog with respect to new language - ffs3::setLanguage(langID); //language is a global attribute + zen::setLanguage(langID); //language is a global attribute const xmlAccess::XmlGuiConfig currentGuiCfg = getCurrentConfiguration(); diff --git a/ui/main_dlg.h b/ui/main_dlg.h index 9b8d491b..9f12e284 100644 --- a/ui/main_dlg.h +++ b/ui/main_dlg.h @@ -14,7 +14,7 @@ #include <map> #include <set> #include <wx/aui/aui.h> - +#include "../shared/int64.h" class CustomGrid; class FFSCheckRowsEvent; @@ -27,7 +27,7 @@ class SyncStatusHandler; class PanelMoveWindow; -namespace ffs3 +namespace zen { class CustomLocale; class GridView; @@ -46,6 +46,9 @@ public: ~MainDialog(); + void disableAllElements(bool enableAbort); //dis-/enables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion + void enableAllElements(); // + private: friend class CompareStatusHandler; friend class SyncStatusHandler; @@ -88,7 +91,7 @@ private: void addLeftFolderToHistory(const wxString& leftFolder); void addRightFolderToHistory(const wxString& rightFolder); - void addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront = false); + void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false); void removeAddFolderPair(size_t pos); void clearAddFolderPairs(); @@ -101,10 +104,10 @@ private: //context menu functions std::set<size_t> getSelectedRows(const CustomGrid* grid) const; std::set<size_t> getSelectedRows() const; - void setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const ffs3::SyncDirection dir); + void setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const zen::SyncDirection dir); void filterRangeManually(const std::set<size_t>& rowsToFilterOnUiTable, int leadingRow); void copySelectionToClipboard(CustomGrid& selectedGrid); - void deleteSelectedFiles(); + void deleteSelectedFiles(const std::set<size_t>& viewSelectionLeft, const std::set<size_t>& viewSelectionRight); void openExternalApplication(const wxString& commandline); void openExternalApplication(size_t rowNumber, bool leftSide, const wxString& commandline); @@ -116,9 +119,6 @@ private: void pushStatusInformation(const wxString& text); void clearStatusBar(); - void disableAllElements(); //dis-/enables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion - void enableAllElements(); // - //events void onGridLeftButtonEvent( wxKeyEvent& event); void onGridRightButtonEvent( wxKeyEvent& event); @@ -135,7 +135,6 @@ private: void OnContextFilterTemp (wxCommandEvent& event); void OnContextExcludeExtension (wxCommandEvent& event); void OnContextExcludeObject (wxCommandEvent& event); - void OnContextCopyClipboard (wxCommandEvent& event); void OnContextOpenWith (wxCommandEvent& event); void OnContextDeleteFiles (wxCommandEvent& event); void OnContextSyncDirLeft (wxCommandEvent& event); @@ -194,6 +193,7 @@ private: void refreshGridAfterFilterChange(const int delay); void OnResize( wxSizeEvent& event); + //void OnResizeTopButtons( wxEvent& event); void OnResizeFolderPairs( wxEvent& event); void OnResizeConfigPanel( wxEvent& event); void OnResizeViewPanel( wxEvent& event); @@ -243,7 +243,7 @@ private: xmlAccess::XmlGlobalSettings* globalSettings; //always bound //UI view of FolderComparison structure - std::auto_ptr<ffs3::GridView> gridDataView; + std::auto_ptr<zen::GridView> gridDataView; //------------------------------------- //functional configuration diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp index 3dff49d2..7e35e19b 100644 --- a/ui/msg_popup.cpp +++ b/ui/msg_popup.cpp @@ -7,141 +7,200 @@ #include "msg_popup.h" #include "../library/resources.h" #include "../shared/mouse_move_dlg.h" +#include "gui_generated.h" -ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors) : +using namespace zen; + + +class ErrorDlg : public ErrorDlgGenerated +{ +public: + ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString& messageText, bool& ignoreNextErrors); + +private: + void OnClose(wxCloseEvent& event); + void OnIgnore(wxCommandEvent& event); + void OnRetry(wxCommandEvent& event); + void OnAbort(wxCommandEvent& event); + + bool& ignoreErrors; +}; + + +ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString& messageText, bool& ignoreNextErrors) : ErrorDlgGenerated(parentWindow), ignoreErrors(ignoreNextErrors) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap10); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("error"))); m_textCtrl8->SetValue(messageText); m_checkBoxIgnoreErrors->SetValue(ignoreNextErrors); - if (~activeButtons & BUTTON_IGNORE) + if (~activeButtons & ReturnErrorDlg::BUTTON_IGNORE) { m_buttonIgnore->Hide(); m_checkBoxIgnoreErrors->Hide(); } - if (~activeButtons & BUTTON_RETRY) + if (~activeButtons & ReturnErrorDlg::BUTTON_RETRY) m_buttonRetry->Hide(); - if (~activeButtons & BUTTON_ABORT) + if (~activeButtons & ReturnErrorDlg::BUTTON_ABORT) m_buttonAbort->Hide(); //set button focus precedence - if (activeButtons & BUTTON_RETRY) + if (activeButtons & ReturnErrorDlg::BUTTON_RETRY) m_buttonRetry->SetFocus(); - else if (activeButtons & BUTTON_IGNORE) + else if (activeButtons & ReturnErrorDlg::BUTTON_IGNORE) m_buttonIgnore->SetFocus(); - else if (activeButtons & BUTTON_ABORT) + else if (activeButtons & ReturnErrorDlg::BUTTON_ABORT) m_buttonAbort->SetFocus(); } void ErrorDlg::OnClose(wxCloseEvent& event) { - ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_ABORT); + EndModal(ReturnErrorDlg::BUTTON_ABORT); } void ErrorDlg::OnIgnore(wxCommandEvent& event) { ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_IGNORE); + EndModal(ReturnErrorDlg::BUTTON_IGNORE); } void ErrorDlg::OnRetry(wxCommandEvent& event) { ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_RETRY); + EndModal(ReturnErrorDlg::BUTTON_RETRY); } void ErrorDlg::OnAbort(wxCommandEvent& event) { ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(BUTTON_ABORT); + EndModal(ReturnErrorDlg::BUTTON_ABORT); +} + + +ReturnErrorDlg::ButtonPressed zen::showErrorDlg(int activeButtons, const wxString& messageText, bool& ignoreNextErrors) +{ + ErrorDlg errorDlg(NULL, activeButtons, messageText, ignoreNextErrors); + errorDlg.Raise(); + return static_cast<ReturnErrorDlg::ButtonPressed>(errorDlg.ShowModal()); } //######################################################################################## -WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowDlgAgain) : +class WarningDlg : public WarningDlgGenerated +{ +public: + WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool& dontShowAgain); + +private: + void OnClose(wxCloseEvent& event); + void OnIgnore(wxCommandEvent& event); + void OnSwitch(wxCommandEvent& event); + void OnAbort(wxCommandEvent& event); + bool& dontShowAgain; +}; + + +WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool& dontShowDlgAgain) : WarningDlgGenerated(parentWindow), dontShowAgain(dontShowDlgAgain) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap10); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("warning"))); m_textCtrl8->SetValue(messageText); m_checkBoxDontShowAgain->SetValue(dontShowAgain); - if (~activeButtons & BUTTON_IGNORE) + if (~activeButtons & ReturnWarningDlg::BUTTON_IGNORE) { m_buttonIgnore->Hide(); m_checkBoxDontShowAgain->Hide(); } - if (~activeButtons & BUTTON_SWITCH) + if (~activeButtons & ReturnWarningDlg::BUTTON_SWITCH) m_buttonSwitch->Hide(); - if (~activeButtons & BUTTON_ABORT) + if (~activeButtons & ReturnWarningDlg::BUTTON_ABORT) m_buttonAbort->Hide(); //set button focus precedence - if (activeButtons & BUTTON_IGNORE) + if (activeButtons & ReturnWarningDlg::BUTTON_IGNORE) m_buttonIgnore->SetFocus(); - else if (activeButtons & BUTTON_ABORT) + else if (activeButtons & ReturnWarningDlg::BUTTON_ABORT) m_buttonAbort->SetFocus(); } void WarningDlg::OnClose(wxCloseEvent& event) { - dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_ABORT); + EndModal(ReturnWarningDlg::BUTTON_ABORT); } void WarningDlg::OnIgnore(wxCommandEvent& event) { dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_IGNORE); + EndModal(ReturnWarningDlg::BUTTON_IGNORE); } void WarningDlg::OnSwitch(wxCommandEvent& event) { dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_SWITCH); + EndModal(ReturnWarningDlg::BUTTON_SWITCH); } void WarningDlg::OnAbort(wxCommandEvent& event) { dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_ABORT); + EndModal(ReturnWarningDlg::BUTTON_ABORT); +} + + +ReturnWarningDlg::ButtonPressed zen::showWarningDlg(int activeButtons, const wxString& messageText, bool& dontShowAgain) +{ + WarningDlg warningDlg(NULL, activeButtons, messageText, dontShowAgain); + warningDlg.Raise(); + return static_cast<ReturnWarningDlg::ButtonPressed>(warningDlg.ShowModal()); } //######################################################################################## -QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowDlgAgain) : +class QuestionDlg : public QuestionDlgGenerated +{ +public: + QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool* dontShowAgain = NULL); + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnYes(wxCommandEvent& event); + void OnNo(wxCommandEvent& event); + + bool* dontShowAgain; //optional +}; + + +QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool* dontShowDlgAgain) : QuestionDlgGenerated(parentWindow), dontShowAgain(dontShowDlgAgain) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap10); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("question"))); @@ -151,41 +210,37 @@ QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxStri else m_checkBoxDontAskAgain->Hide(); - if (~activeButtons & BUTTON_YES) + if (~activeButtons & ReturnQuestionDlg::BUTTON_YES) m_buttonYes->Hide(); - if (~activeButtons & BUTTON_NO) + if (~activeButtons & ReturnQuestionDlg::BUTTON_NO) { m_buttonNo->Hide(); m_checkBoxDontAskAgain->Hide(); } - if (~activeButtons & BUTTON_CANCEL) + if (~activeButtons & ReturnQuestionDlg::BUTTON_CANCEL) m_buttonCancel->Hide(); //set button focus precedence - if (activeButtons & BUTTON_YES) + if (activeButtons & ReturnQuestionDlg::BUTTON_YES) m_buttonYes->SetFocus(); - else if (activeButtons & BUTTON_CANCEL) + else if (activeButtons & ReturnQuestionDlg::BUTTON_CANCEL) m_buttonCancel->SetFocus(); - else if (activeButtons & BUTTON_NO) + else if (activeButtons & ReturnQuestionDlg::BUTTON_NO) m_buttonNo->SetFocus(); } void QuestionDlg::OnClose(wxCloseEvent& event) { - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_CANCEL); + EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } void QuestionDlg::OnCancel(wxCommandEvent& event) { - if (dontShowAgain) - *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_CANCEL); + EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } @@ -193,12 +248,20 @@ void QuestionDlg::OnYes(wxCommandEvent& event) { if (dontShowAgain) *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_YES); + EndModal(ReturnQuestionDlg::BUTTON_YES); } void QuestionDlg::OnNo(wxCommandEvent& event) { if (dontShowAgain) *dontShowAgain = m_checkBoxDontAskAgain->GetValue(); - EndModal(BUTTON_NO); + EndModal(ReturnQuestionDlg::BUTTON_NO); +} + + +ReturnQuestionDlg::ButtonPressed zen::showQuestionDlg(int activeButtons, const wxString& messageText, bool* dontShowAgain) +{ + QuestionDlg qtnDlg(NULL, activeButtons, messageText, dontShowAgain); + qtnDlg.Raise(); + return static_cast<ReturnQuestionDlg::ButtonPressed>(qtnDlg.ShowModal()); } diff --git a/ui/msg_popup.h b/ui/msg_popup.h index 44743c1b..f6c2e5d2 100644 --- a/ui/msg_popup.h +++ b/ui/msg_popup.h @@ -7,72 +7,46 @@ #ifndef MESSAGEPOPUP_H_INCLUDED #define MESSAGEPOPUP_H_INCLUDED -#include "gui_generated.h" +#include <wx/string.h> -class ErrorDlg : public ErrorDlgGenerated +namespace zen { -public: - ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors); - - enum ReturnCodes +struct ReturnErrorDlg +{ + enum ButtonPressed { BUTTON_IGNORE = 1, BUTTON_RETRY = 2, BUTTON_ABORT = 4 }; - -private: - void OnClose(wxCloseEvent& event); - void OnIgnore(wxCommandEvent& event); - void OnRetry(wxCommandEvent& event); - void OnAbort(wxCommandEvent& event); - - bool& ignoreErrors; }; +ReturnErrorDlg::ButtonPressed showErrorDlg(int activeButtons, const wxString& messageText, bool& ignoreNextErrors); -class WarningDlg : public WarningDlgGenerated +struct ReturnWarningDlg { -public: - WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); - - enum Response + enum ButtonPressed { BUTTON_IGNORE = 1, BUTTON_SWITCH = 2, BUTTON_ABORT = 4 }; - -private: - void OnClose(wxCloseEvent& event); - void OnIgnore(wxCommandEvent& event); - void OnSwitch(wxCommandEvent& event); - void OnAbort(wxCommandEvent& event); - bool& dontShowAgain; }; +ReturnWarningDlg::ButtonPressed showWarningDlg(int activeButtons, const wxString& messageText, bool& dontShowAgain); -class QuestionDlg : public QuestionDlgGenerated +struct ReturnQuestionDlg { -public: - QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowAgain = NULL); - - enum + enum ButtonPressed { BUTTON_YES = 1, BUTTON_NO = 2, BUTTON_CANCEL = 4 }; - -private: - void OnClose(wxCloseEvent& event); - void OnCancel(wxCommandEvent& event); - void OnYes(wxCommandEvent& event); - void OnNo(wxCommandEvent& event); - - bool* dontShowAgain; //optional }; +ReturnQuestionDlg::ButtonPressed showQuestionDlg(int activeButtons, const wxString& messageText, bool* dontShowAgain = NULL); +} #endif // MESSAGEPOPUP_H_INCLUDED diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp index aa25d07a..f71abab4 100644 --- a/ui/progress_indicator.cpp +++ b/ui/progress_indicator.cpp @@ -24,11 +24,13 @@ #include "../shared/taskbar.h" #endif -using namespace ffs3; +using namespace zen; namespace { +const int GAUGE_FULL_RANGE = 50000; + //window size used for statistics in milliseconds const int windowSizeRemainingTime = 60000; //some usecases have dropouts of 40 seconds -> 60 sec. window size handles them well const int windowSizeBytesPerSec = 5000; // @@ -62,9 +64,9 @@ public: void init(); //make visible, initialize all status values void finalize(); //hide again - void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess); void incScannedObjects_NoUpdate(int number); - void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed); void setStatusText_NoUpdate(const Zstring& text); void updateStatusPanelNow(); @@ -79,11 +81,11 @@ private: wxStopWatch timeElapsed; //gauge variables - int totalObjects; - wxLongLong totalData; //each data element represents one byte for proper progress indicator scaling - int currentObjects; //each object represents a file or directory processed - wxLongLong currentData; - double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation + int totalObjects; + zen::Int64 totalData; //each data element represents one byte for proper progress indicator scaling + int currentObjects; //each object represents a file or directory processed + zen::Int64 currentData; + double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation void showProgressExternally(const wxString& progressText, float percent = 0); @@ -129,7 +131,7 @@ void CompareStatus::finalize() pimpl->finalize(); } -void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess) +void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess) { pimpl->switchToCompareBytewise(totalObjectsToProcess, totalDataToProcess); } @@ -139,7 +141,7 @@ void CompareStatus::incScannedObjects_NoUpdate(int number) pimpl->incScannedObjects_NoUpdate(number); } -void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed) { pimpl->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); } @@ -188,7 +190,7 @@ void CompareStatus::CompareStatusImpl::init() status = SCANNING; //initialize gauge - m_gauge2->SetRange(50000); + m_gauge2->SetRange(GAUGE_FULL_RANGE); m_gauge2->SetValue(0); //initially hide status that's relevant for comparing bytewise only @@ -229,7 +231,7 @@ void CompareStatus::CompareStatusImpl::finalize() //hide again } -void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess) +void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess) { status = COMPARING_CONTENT; @@ -240,12 +242,12 @@ void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsT totalObjects = totalObjectsToProcess; if (totalData != 0) - scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 + scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000 else scalingFactor = 0; //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed - statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), windowSizeRemainingTime, windowSizeBytesPerSec)); + statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec)); lastStatCallSpeed = -1000000; //some big number lastStatCallRemTime = -1000000; @@ -267,7 +269,7 @@ void CompareStatus::CompareStatusImpl::incScannedObjects_NoUpdate(int number) } -void CompareStatus::CompareStatusImpl::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +void CompareStatus::CompareStatusImpl::incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed) { currentData += dataProcessed; currentObjects += objectsProcessed; @@ -315,13 +317,13 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() { //wxWindowUpdateLocker dummy(this) -> not needed - const float percent = totalData == 0 ? 0 : currentData.ToDouble() * 100 / totalData.ToDouble(); + const float percent = totalData == 0 ? 0 : to<double>(currentData) * 100.0 / to<double>(totalData); //write status information to taskbar, parent title ect. switch (status) { case SCANNING: - showProgressExternally(numberToStringSep(scannedObjects) + wxT(" - ") + _("Scanning...")); + showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning...")); break; case COMPARING_CONTENT: showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content..."), percent); @@ -342,17 +344,17 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() m_textCtrlStatus->ChangeValue(formattedStatusText); //nr of scanned objects - setNewText(numberToStringSep(scannedObjects), *m_staticTextScanned, updateLayout); + setNewText(toStringSep(scannedObjects), *m_staticTextScanned, updateLayout); //progress indicator for "compare file content" - m_gauge2->SetValue(int(currentData.ToDouble() * scalingFactor)); + m_gauge2->SetValue(to<double>(currentData) * scalingFactor); //remaining files left for file comparison - const wxString filesToCompareTmp = numberToStringSep(totalObjects - currentObjects); + const wxString filesToCompareTmp = toStringSep(totalObjects - currentObjects); setNewText(filesToCompareTmp, *m_staticTextFilesRemaining, updateLayout); //remaining bytes left for file comparison - const wxString remainingBytesTmp = ffs3::formatFilesizeToShortString(totalData - currentData); + const wxString remainingBytesTmp = zen::formatFilesizeToShortString(to<zen::UInt64>(totalData - currentData)); setNewText(remainingBytesTmp, *m_staticTextDataRemaining, updateLayout); if (statistics.get()) @@ -361,7 +363,7 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() { lastStatCallSpeed = timeElapsed.Time(); - statistics->addMeasurement(currentObjects, currentData.ToDouble()); + statistics->addMeasurement(currentObjects, to<double>(currentData)); //current speed setNewText(statistics->getBytesPerSecond(), *m_staticTextSpeed, updateLayout); @@ -480,11 +482,11 @@ private: class SyncStatus::SyncStatusImpl : public SyncStatusDlgGenerated { public: - SyncStatusImpl(StatusHandler& updater, wxTopLevelWindow* parentWindow, const wxString& jobName); + SyncStatusImpl(AbortCallback& abortCb, MainDialog* parentWindow, const wxString& jobName); ~SyncStatusImpl(); - void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess); - void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess); + void incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed); void incScannedObjects_NoUpdate(int number); void setStatusText_NoUpdate(const Zstring& text); void updateStatusDialogNow(); @@ -509,14 +511,14 @@ private: const wxString jobName_; wxStopWatch timeElapsed; - StatusHandler* processStatusHandler; - wxTopLevelWindow* mainDialog; + AbortCallback* abortCb_; //temporarily bound + MainDialog* mainDialog; //optional //gauge variables int totalObjects; - wxLongLong totalData; + zen::Int64 totalData; int currentObjects; //each object represents a file or directory processed - wxLongLong currentData; //each data element represents one byte for proper progress indicator scaling + zen::Int64 currentData; //each data element represents one byte for proper progress indicator scaling double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation //status variables @@ -546,8 +548,8 @@ private: //redirect to implementation -SyncStatus::SyncStatus(StatusHandler& updater, wxTopLevelWindow* parentWindow, bool startSilent, const wxString& jobName) : - pimpl(new SyncStatusImpl(updater, parentWindow, jobName)) +SyncStatus::SyncStatus(AbortCallback& abortCb, MainDialog* parentWindow, bool startSilent, const wxString& jobName) : + pimpl(new SyncStatusImpl(abortCb, parentWindow, jobName)) { if (startSilent) pimpl->minimizeToTray(); @@ -573,7 +575,7 @@ void SyncStatus::closeWindowDirectly() //don't wait for user (silent mode) pimpl->Destroy(); } -void SyncStatus::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess) +void SyncStatus::resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess) { pimpl->resetGauge(totalObjectsToProcess, totalDataToProcess); } @@ -583,7 +585,7 @@ void SyncStatus::incScannedObjects_NoUpdate(int number) pimpl->incScannedObjects_NoUpdate(number); } -void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed) { pimpl->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); } @@ -610,7 +612,7 @@ void SyncStatus::processHasFinished(SyncStatusID id, const ErrorLogging& log) //######################################################################################## -SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWindow* parentWindow, const wxString& jobName) : +SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb, MainDialog* parentWindow, const wxString& jobName) : SyncStatusDlgGenerated(parentWindow, wxID_ANY, parentWindow ? wxString(wxEmptyString) : (wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization")), @@ -619,7 +621,7 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT : //wxTAB_TRAVERSAL is needed for standard button handling: wxID_OK/wxID_CANCEL wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL), jobName_(jobName), - processStatusHandler(&updater), + abortCb_(&abortCb), mainDialog(parentWindow), totalObjects(0), totalData(0), @@ -634,8 +636,7 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin progressPercentLast(0) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmapStatus, m_staticTextStatus); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif if (mainDialog) //save old title (will be used as progress indicator) @@ -648,21 +649,24 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin m_staticTextTimeRemaining->SetLabel(wxT("-")); //initialize gauge - m_gauge1->SetRange(50000); + m_gauge1->SetRange(GAUGE_FULL_RANGE); m_gauge1->SetValue(0); if (IsShown()) //don't steal focus when starting in sys-tray! m_buttonAbort->SetFocus(); if (mainDialog) - mainDialog->Disable(); + { + mainDialog->EnableCloseButton(false); + mainDialog->disableAllElements(false); //disable all child elements + } timeElapsed.Start(); //measure total time #ifdef FFS_WIN try //try to get access to Windows 7 Taskbar { - taskbar_.reset(new util::TaskbarProgress(mainDialog != NULL ? *mainDialog : *this)); + taskbar_.reset(new util::TaskbarProgress(mainDialog != NULL ? *static_cast<wxTopLevelWindow*>(mainDialog) : *this)); } catch (const util::TaskbarNotAvailable&) {} #endif @@ -682,10 +686,12 @@ SyncStatus::SyncStatusImpl::~SyncStatusImpl() { if (mainDialog) { + mainDialog->EnableCloseButton(true); + mainDialog->enableAllElements(); + //restore title text mainDialog->SetTitle(titelTextBackup); - mainDialog->Enable(); mainDialog->Raise(); mainDialog->SetFocus(); } @@ -705,7 +711,7 @@ void SyncStatus::SyncStatusImpl::OnKeyPressed(wxKeyEvent& event) } -void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess) +void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess) { currentData = 0; totalData = totalDataToProcess; @@ -714,19 +720,21 @@ void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, wxLongLon totalObjects = totalObjectsToProcess; if (totalData != 0) - scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000 + scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000 else scalingFactor = 0; //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed - statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), windowSizeRemainingTime, windowSizeBytesPerSec)); + statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec)); lastStatCallSpeed = -1000000; //some big number lastStatCallRemTime = -1000000; + + m_gauge1->SetValue(totalDataToProcess == 0 ? GAUGE_FULL_RANGE : 0); //explicitly reset and end "pending" state (if not data will be synced) } -void SyncStatus::SyncStatusImpl::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed) +void SyncStatus::SyncStatusImpl::incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed) { //assert(dataProcessed >= 0); @@ -812,7 +820,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() //static RetrieveStatistics statistic; //statistic.writeEntry(currentData.ToDouble(), currentObjects); - const float percent = totalData == 0 ? 0 : currentData.ToDouble() * 100 / totalData.ToDouble(); + const float percent = totalData == 0 ? 0 : to<double>(currentData) * 100.0 / to<double>(totalData); //write status information to systray, taskbar, parent title ect. @@ -820,7 +828,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() switch (currentStatus) { case SyncStatus::SCANNING: - showProgressExternally(numberToStringSep(scannedObjects) + wxT(" - ") + _("Scanning...") + postFix); + showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning...") + postFix); break; case SyncStatus::COMPARING_CONTENT: showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content...") + postFix, percent); @@ -850,7 +858,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() if (currentStatus == SyncStatus::SCANNING) m_gauge1->Pulse(); else - m_gauge1->SetValue(common::round(currentData.ToDouble() * scalingFactor)); + m_gauge1->SetValue(common::round(to<double>(currentData) * scalingFactor)); //status text const wxString statusTxt = zToWx(currentStatusText); @@ -858,11 +866,11 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() m_textCtrlInfo->ChangeValue(statusTxt); //remaining objects - const wxString remainingObjTmp = numberToStringSep(totalObjects - currentObjects); + const wxString remainingObjTmp = toStringSep(totalObjects - currentObjects); setNewText(remainingObjTmp, *m_staticTextRemainingObj, updateLayout); //remaining bytes left for copy - const wxString remainingBytesTmp = ffs3::formatFilesizeToShortString(totalData - currentData); + const wxString remainingBytesTmp = zen::formatFilesizeToShortString(to<zen::UInt64>(totalData - currentData)); setNewText(remainingBytesTmp, *m_staticTextDataRemaining, updateLayout); if (statistics.get()) @@ -871,7 +879,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() { lastStatCallSpeed = timeElapsed.Time(); - statistics->addMeasurement(currentObjects, currentData.ToDouble()); + statistics->addMeasurement(currentObjects, to<double>(currentData)); //current speed setNewText(statistics->getBytesPerSecond(), *m_staticTextSpeed, updateLayout); @@ -923,7 +931,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow() bool SyncStatus::SyncStatusImpl::currentProcessIsRunning() { - return processStatusHandler != NULL; + return abortCb_ != NULL; } @@ -977,7 +985,7 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncStatus::SyncStatusID id, //at the LATEST(!) to prevent access to currentStatusHandler //enable okay and close events; may be set in this method ONLY - processStatusHandler = NULL; //avoid callback to (maybe) deleted parent process + abortCb_ = NULL; //avoid callback to (maybe) deleted parent process setCurrentStatus(id); @@ -1008,8 +1016,8 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncStatus::SyncStatusID id, bSizerObjectsProcessed->Show(true); - m_staticTextProcessedObj->SetLabel(numberToStringSep(currentObjects)); - m_staticTextDataProcessed->SetLabel(ffs3::formatFilesizeToShortString(currentData)); + m_staticTextProcessedObj->SetLabel(toStringSep(currentObjects)); + m_staticTextDataProcessed->SetLabel(zen::formatFilesizeToShortString(to<zen::UInt64>(currentData))); } updateStatusDialogNow(); //keep this sequence to avoid display distortion, if e.g. only 1 item is sync'ed @@ -1044,7 +1052,7 @@ void SyncStatus::SyncStatusImpl::OnAbort(wxCommandEvent& event) setStatusText_NoUpdate(wxToZ(_("Abort requested: Waiting for current operation to finish..."))); //no Layout() or UI-update here to avoid cascaded Yield()-call - processStatusHandler->requestAbortion(); + abortCb_->requestAbortion(); } } diff --git a/ui/progress_indicator.h b/ui/progress_indicator.h index 4bf0c048..34e2c1a5 100644 --- a/ui/progress_indicator.h +++ b/ui/progress_indicator.h @@ -10,8 +10,9 @@ #include "../shared/zstring.h" #include <wx/toplevel.h> #include "../library/status_handler.h" +#include "main_dlg.h" -namespace ffs3 +namespace zen { class ErrorLogging; } @@ -28,9 +29,9 @@ public: void init(); //make visible, initialize all status values void finalize(); //hide again - void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess); void incScannedObjects_NoUpdate(int number); - void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed); void setStatusText_NoUpdate(const Zstring& text); void updateStatusPanelNow(); @@ -43,8 +44,8 @@ private: class SyncStatus { public: - SyncStatus(StatusHandler& updater, - wxTopLevelWindow* parentWindow, //may be NULL + SyncStatus(AbortCallback& abortCb, + MainDialog* parentWindow, //may be NULL bool startSilent, const wxString& jobName); ~SyncStatus(); @@ -62,9 +63,9 @@ public: SYNCHRONIZING }; - void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess); + void resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess); void incScannedObjects_NoUpdate(int number); - void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed); + void incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed); void setStatusText_NoUpdate(const Zstring& text); void updateStatusDialogNow(); @@ -72,7 +73,7 @@ public: //essential to call one of these two methods in StatusUpdater derived class destructor at the LATEST(!) //to prevent access to callback to updater (e.g. request abort) - void processHasFinished(SyncStatusID id, const ffs3::ErrorLogging& log); + void processHasFinished(SyncStatusID id, const zen::ErrorLogging& log); void closeWindowDirectly(); //don't wait for user private: diff --git a/ui/search.cpp b/ui/search.cpp index e6fa4255..7fdaec03 100644 --- a/ui/search.cpp +++ b/ui/search.cpp @@ -39,8 +39,7 @@ SearchDlg::SearchDlg(wxWindow& parentWindow, wxString& searchText, bool& respect respectCase_(respectCase) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_checkBoxMatchCase->SetValue(respectCase_); @@ -265,13 +264,13 @@ void executeSearch(bool forceShowDialog, //########################################################################################### -void ffs3::startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //Strg + F +void zen::startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //Strg + F { executeSearch(true, respectCase, parentWindow, leftGrid, rightGrid); } -void ffs3::findNext(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //F3 +void zen::findNext(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //F3 { executeSearch(false, respectCase, parentWindow, leftGrid, rightGrid); } diff --git a/ui/search.h b/ui/search.h index 4b1c0a81..ce7e479a 100644 --- a/ui/search.h +++ b/ui/search.h @@ -11,7 +11,7 @@ class wxGrid; class wxWindow; -namespace ffs3 +namespace zen { void startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //Strg + F void findNext( wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //F3 diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp index 58eac33f..cb81431b 100644 --- a/ui/small_dlgs.cpp +++ b/ui/small_dlgs.cpp @@ -21,13 +21,13 @@ #include <wx/msgdlg.h> #include "../shared/mouse_move_dlg.h" -using namespace ffs3; +using namespace zen; class AboutDlg : public AboutDlgGenerated { public: - AboutDlg(wxWindow* window); + AboutDlg(wxWindow* parent); private: void OnClose(wxCloseEvent& event); @@ -35,14 +35,8 @@ private: }; -AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) +AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) { -#ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, - m_bitmap11); //ownership passed to "this" -#endif - m_bitmap9->SetBitmap(GlobalResources::instance().getImage(wxT("website"))); m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("email"))); m_bitmap11->SetBitmap(GlobalResources::instance().getImage(wxT("logo"))); @@ -50,7 +44,7 @@ AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) m_bitmapTransl->SetBitmap(GlobalResources::instance().getImage(wxT("translation"))); //create language credits - for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i) + for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i) { //flag wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, GlobalResources::instance().getImage(i->languageFlag), wxDefaultPosition, wxSize(-1,11), 0 ); @@ -95,6 +89,10 @@ AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) m_buttonOkay->SetFocus(); Fit(); + +#ifdef FFS_WIN + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" +#endif } @@ -110,7 +108,7 @@ void AboutDlg::OnOK(wxCommandEvent& event) } -void ffs3::showAboutDialog() +void zen::showAboutDialog() { AboutDlg aboutDlg(NULL); aboutDlg.ShowModal(); @@ -121,7 +119,7 @@ void ffs3::showAboutDialog() class HelpDlg : public HelpDlgGenerated { public: - HelpDlg(wxWindow* window); + HelpDlg(wxWindow* parent); private: void OnClose(wxCloseEvent& event); @@ -129,11 +127,10 @@ private: }; -HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) +HelpDlg::HelpDlg(wxWindow* parent) : HelpDlgGenerated(parent) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap25, m_staticText56, m_scrolledWindow1, m_scrolledWindow5); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_notebook1->SetFocus(); @@ -145,15 +142,17 @@ HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) wxTreeItemId treeBothSides = m_treeCtrl1->AppendItem(treeRoot, _("file exists on both sides")); wxTreeItemId treeOneSide = m_treeCtrl1->AppendItem(treeRoot, _("on one side only")); - m_treeCtrl1->AppendItem(treeOneSide, _("- left")); - m_treeCtrl1->AppendItem(treeOneSide, _("- right")); + m_treeCtrl1->AppendItem(treeOneSide, _("- exists left only")); + m_treeCtrl1->AppendItem(treeOneSide, _("- exists right only")); + + wxTreeItemId treeSameDate = m_treeCtrl1->AppendItem(treeBothSides, _("same date")); + m_treeCtrl1->AppendItem(treeSameDate, _("- equal")); + m_treeCtrl1->AppendItem(treeSameDate, _("- conflict (same date, different size)")); - m_treeCtrl1->AppendItem(treeBothSides, _("- equal")); - wxTreeItemId treeDifferent = m_treeCtrl1->AppendItem(treeBothSides, _("different")); - m_treeCtrl1->AppendItem(treeDifferent, _("- left newer")); - m_treeCtrl1->AppendItem(treeDifferent, _("- right newer")); - m_treeCtrl1->AppendItem(treeDifferent, _("- conflict (same date, different size)")); + wxTreeItemId treeDifferentDate = m_treeCtrl1->AppendItem(treeBothSides, _("different date")); + m_treeCtrl1->AppendItem(treeDifferentDate, _("- left newer")); + m_treeCtrl1->AppendItem(treeDifferentDate, _("- right newer")); m_treeCtrl1->ExpandAll(); @@ -162,8 +161,8 @@ HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) wxTreeItemId tree2BothSides = m_treeCtrl2->AppendItem(tree2Root, _("file exists on both sides")); wxTreeItemId tree2OneSide = m_treeCtrl2->AppendItem(tree2Root, _("on one side only")); - m_treeCtrl2->AppendItem(tree2OneSide, _("- left")); - m_treeCtrl2->AppendItem(tree2OneSide, _("- right")); + m_treeCtrl2->AppendItem(tree2OneSide, _("- exists left only")); + m_treeCtrl2->AppendItem(tree2OneSide, _("- exists right only")); m_treeCtrl2->AppendItem(tree2BothSides, _("- equal")); m_treeCtrl2->AppendItem(tree2BothSides, _("- different")); @@ -184,7 +183,7 @@ void HelpDlg::OnOK(wxCommandEvent& event) } -void ffs3::showHelpDialog() +void zen::showHelpDialog() { HelpDlg helpDlg(NULL); helpDlg.ShowModal(); @@ -195,51 +194,60 @@ void ffs3::showHelpDialog() class FilterDlg : public FilterDlgGenerated { public: - FilterDlg(wxWindow* window, + FilterDlg(wxWindow* parent, bool isGlobalFilter, - Zstring& filterIncl, - Zstring& filterExcl); + FilterConfig& filter); ~FilterDlg() {} - enum - { - BUTTON_APPLY = 1 - }; - private: - void OnHelp(wxCommandEvent& event); - void OnDefault(wxCommandEvent& event); - void OnApply(wxCommandEvent& event); - void OnCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); + void OnClose (wxCloseEvent& event); + void OnHelp (wxCommandEvent& event); + void OnDefault (wxCommandEvent& event); + void OnApply (wxCommandEvent& event); + void OnCancel (wxCommandEvent& event); + void OnUpdateChoice(wxCommandEvent& event) { updateGui(); } + void OnUpdateNameFilter(wxCommandEvent& event) { updateGui(); } + + void updateGui(); + void setFilter(const FilterConfig& filter); + FilterConfig getFilter() const; const bool isGlobalFilter_; - Zstring& includeFilter; - Zstring& excludeFilter; + FilterConfig& outputRef; + + EnumDescrList<UnitTime> enumTimeDescr; + EnumDescrList<UnitSize> enumSizeDescr; }; -FilterDlg::FilterDlg(wxWindow* window, +FilterDlg::FilterDlg(wxWindow* parent, bool isGlobalFilter, //global or local filter dialog? - Zstring& filterIncl, - Zstring& filterExcl) : - FilterDlgGenerated(window), + FilterConfig& filter) : + FilterDlgGenerated(parent), isGlobalFilter_(isGlobalFilter), - includeFilter(filterIncl), - excludeFilter(filterExcl) + outputRef(filter) //just hold reference { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap26, m_staticTexHeader, m_bitmap8, m_bitmap9); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bitmap8->SetBitmap(GlobalResources::instance().getImage(wxT("include"))); - m_bitmap9->SetBitmap(GlobalResources::instance().getImage(wxT("exclude"))); + enumTimeDescr. + add(UTIME_NONE, _("Inactive")). + add(UTIME_SEC, _("Second")). + add(UTIME_MIN, _("Minute")). + add(UTIME_HOUR, _("Hour")). + add(UTIME_DAY, _("Day")); + + enumSizeDescr. + add(USIZE_NONE, _("Inactive")). + add(USIZE_BYTE, _("Byte")). + add(USIZE_KB, _("KB")). + add(USIZE_MB, _("MB")); + m_bitmap26->SetBitmap(GlobalResources::instance().getImage(wxT("filterOn"))); m_bpButtonHelp->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); - m_textCtrlInclude->SetValue(zToWx(includeFilter)); - m_textCtrlExclude->SetValue(zToWx(excludeFilter)); + setFilter(filter); m_panel13->Hide(); m_button10->SetFocus(); @@ -254,6 +262,67 @@ FilterDlg::FilterDlg(wxWindow* window, } +void FilterDlg::updateGui() +{ + FilterConfig activeCfg = getFilter(); + + if (!NameFilter(activeCfg.includeFilter, FilterConfig().excludeFilter).isNull()) + m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include"))); + else + m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include_grey"))); + + if (!NameFilter(FilterConfig().includeFilter, activeCfg.excludeFilter).isNull()) + m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude"))); + else + m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude_grey"))); + + if (activeCfg.unitTimeSpan != UTIME_NONE) + m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock"))); + else + m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock_grey"))); + + if (activeCfg.unitSizeMin != USIZE_NONE || + activeCfg.unitSizeMax != USIZE_NONE) + m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size"))); + else + m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size_grey"))); + + m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan != UTIME_NONE); + m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != USIZE_NONE); + m_spinCtrlMaxSize ->Enable(activeCfg.unitSizeMax != USIZE_NONE); +} + + +void FilterDlg::setFilter(const FilterConfig& filter) +{ + m_textCtrlInclude->ChangeValue(zToWx(filter.includeFilter)); + m_textCtrlExclude->ChangeValue(zToWx(filter.excludeFilter)); + + setEnumVal(enumTimeDescr, *m_choiceUnitTimespan, filter.unitTimeSpan); + setEnumVal(enumSizeDescr, *m_choiceUnitMinSize, filter.unitSizeMin); + setEnumVal(enumSizeDescr, *m_choiceUnitMaxSize, filter.unitSizeMax); + + m_spinCtrlTimespan->SetValue(static_cast<int>(filter.timeSpan)); + m_spinCtrlMinSize ->SetValue(static_cast<int>(filter.sizeMin)); + m_spinCtrlMaxSize ->SetValue(static_cast<int>(filter.sizeMax)); + + updateGui(); +} + + +FilterConfig FilterDlg::getFilter() const +{ + return FilterConfig(wxToZ(m_textCtrlInclude->GetValue()), + wxToZ(m_textCtrlExclude->GetValue()), + m_spinCtrlTimespan->GetValue(), + getEnumVal(enumTimeDescr, *m_choiceUnitTimespan), + m_spinCtrlMinSize->GetValue(), + getEnumVal(enumSizeDescr, *m_choiceUnitMinSize), + m_spinCtrlMaxSize->GetValue(), + getEnumVal(enumSizeDescr, *m_choiceUnitMaxSize)); +} + + void FilterDlg::OnHelp(wxCommandEvent& event) { m_bpButtonHelp->Hide(); @@ -267,19 +336,10 @@ void FilterDlg::OnHelp(wxCommandEvent& event) void FilterDlg::OnDefault(wxCommandEvent& event) { - const FilterConfig nullFilter; - if (isGlobalFilter_) - { - m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter)); - //exclude various recycle bin directories with global filter - m_textCtrlExclude->SetValue(zToWx(standardExcludeFilter())); - } + setFilter(MainConfiguration().globalFilter); else - { - m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter)); - m_textCtrlExclude->SetValue(zToWx(nullFilter.excludeFilter)); - } + setFilter(FilterConfig()); //changes to mainDialog are only committed when the OK button is pressed Fit(); @@ -289,11 +349,10 @@ void FilterDlg::OnDefault(wxCommandEvent& event) void FilterDlg::OnApply(wxCommandEvent& event) { //only if user presses ApplyFilter, he wants the changes to be committed - includeFilter = wxToZ(m_textCtrlInclude->GetValue()); - excludeFilter = wxToZ(m_textCtrlExclude->GetValue()); + outputRef = getFilter(); //when leaving dialog: filter and redraw grid, if filter is active - EndModal(BUTTON_APPLY); + EndModal(ReturnSmallDlg::BUTTON_OKAY); } @@ -310,19 +369,12 @@ void FilterDlg::OnClose(wxCloseEvent& event) -DefaultReturnCode::Response ffs3::showFilterDialog(bool isGlobalFilter, - Zstring& filterIncl, - Zstring& filterExcl) +ReturnSmallDlg::ButtonPressed zen::showFilterDialog(bool isGlobalFilter, FilterConfig& filter) { - DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; FilterDlg filterDlg(NULL, isGlobalFilter, //is main filter dialog - filterIncl, - filterExcl); - if (filterDlg.ShowModal() == FilterDlg::BUTTON_APPLY) - rv = DefaultReturnCode::BUTTON_OKAY; - - return rv; + filter); + return static_cast<ReturnSmallDlg::ButtonPressed>(filterDlg.ShowModal()); } //######################################################################################## @@ -330,18 +382,12 @@ DefaultReturnCode::Response ffs3::showFilterDialog(bool isGlobalFilter, class DeleteDialog : public DeleteDlgGenerated { public: - DeleteDialog(wxWindow* main, - const std::vector<ffs3::FileSystemObject*>& rowsOnLeft, - const std::vector<ffs3::FileSystemObject*>& rowsOnRight, + DeleteDialog(wxWindow* parent, + const std::vector<zen::FileSystemObject*>& rowsOnLeft, + const std::vector<zen::FileSystemObject*>& rowsOnRight, bool& deleteOnBothSides, bool& useRecycleBin); - enum - { - BUTTON_OKAY = 1, - BUTTON_CANCEL - }; - private: void OnOK(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); @@ -349,64 +395,69 @@ private: void OnDelOnBothSides(wxCommandEvent& event); void OnUseRecycler(wxCommandEvent& event); - void updateTexts(); + void updateGui(); - const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnLeft; - const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnRight; - bool& m_deleteOnBothSides; - bool& m_useRecycleBin; + const std::vector<zen::FileSystemObject*>& rowsToDeleteOnLeft; + const std::vector<zen::FileSystemObject*>& rowsToDeleteOnRight; + bool& outRefdeleteOnBothSides; + bool& outRefuseRecycleBin; }; -DeleteDialog::DeleteDialog(wxWindow* main, +DeleteDialog::DeleteDialog(wxWindow* parent, const std::vector<FileSystemObject*>& rowsOnLeft, const std::vector<FileSystemObject*>& rowsOnRight, bool& deleteOnBothSides, bool& useRecycleBin) : - DeleteDlgGenerated(main), + DeleteDlgGenerated(parent), rowsToDeleteOnLeft(rowsOnLeft), rowsToDeleteOnRight(rowsOnRight), - m_deleteOnBothSides(deleteOnBothSides), - m_useRecycleBin(useRecycleBin) + outRefdeleteOnBothSides(deleteOnBothSides), + outRefuseRecycleBin(useRecycleBin) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmap12, m_staticTextHeader); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides); m_checkBoxUseRecycler->SetValue(useRecycleBin); - updateTexts(); + + //if both sides contain same rows this checkbox is superfluous + if (rowsToDeleteOnLeft == rowsToDeleteOnRight) + { + m_checkBoxDeleteBothSides->Show(false); + m_checkBoxDeleteBothSides->SetValue(true); + } + + updateGui(); m_buttonOK->SetFocus(); } -void DeleteDialog::updateTexts() +void DeleteDialog::updateGui() { + const std::pair<wxString, int> delInfo = zen::deleteFromGridAndHDPreview( + rowsToDeleteOnLeft, + rowsToDeleteOnRight, + m_checkBoxDeleteBothSides->GetValue()); + wxString header; if (m_checkBoxUseRecycler->GetValue()) { - m_staticTextHeader->SetLabel(_("Do you really want to move the following object(s) to the Recycle Bin?")); + header = _P("Do you really want to move the following object to the Recycle Bin?", + "Do you really want to move the following %x objects to the Recycle Bin?", delInfo.second); m_bitmap12->SetBitmap(GlobalResources::instance().getImage(wxT("recycler"))); } else { - m_staticTextHeader->SetLabel(_("Do you really want to delete the following object(s)?")); + header = _P("Do you really want to delete the following object?", + "Do you really want to delete the following %x objects?", delInfo.second); m_bitmap12->SetBitmap(GlobalResources::instance().getImage(wxT("deleteFile"))); } - - const std::pair<wxString, int> delInfo = ffs3::deleteFromGridAndHDPreview( - rowsToDeleteOnLeft, - rowsToDeleteOnRight, - m_checkBoxDeleteBothSides->GetValue()); + header.Replace(wxT("%x"), toStringSep(delInfo.second)); + m_staticTextHeader->SetLabel(header); const wxString filesToDelete = delInfo.first; - - #ifndef _MSC_VER - #warning do something with this number: ("Do you really want to delete the following %x object(s)?")); - //totalDelCount = delInfo.second; - #endif - m_textCtrlMessage->SetValue(filesToDelete); Layout(); @@ -415,47 +466,45 @@ void DeleteDialog::updateTexts() void DeleteDialog::OnOK(wxCommandEvent& event) { - EndModal(BUTTON_OKAY); + outRefuseRecycleBin = m_checkBoxUseRecycler->GetValue(); + if (rowsToDeleteOnLeft != rowsToDeleteOnRight) + outRefdeleteOnBothSides = m_checkBoxDeleteBothSides->GetValue(); + + EndModal(ReturnSmallDlg::BUTTON_OKAY); } void DeleteDialog::OnCancel(wxCommandEvent& event) { - EndModal(BUTTON_CANCEL); + EndModal(ReturnSmallDlg::BUTTON_CANCEL); } void DeleteDialog::OnClose(wxCloseEvent& event) { - EndModal(BUTTON_CANCEL); + EndModal(ReturnSmallDlg::BUTTON_CANCEL); } void DeleteDialog::OnDelOnBothSides(wxCommandEvent& event) { - m_deleteOnBothSides = m_checkBoxDeleteBothSides->GetValue(); - updateTexts(); + updateGui(); } void DeleteDialog::OnUseRecycler(wxCommandEvent& event) { - m_useRecycleBin = m_checkBoxUseRecycler->GetValue(); - updateTexts(); + updateGui(); } -DefaultReturnCode::Response ffs3::showDeleteDialog(const std::vector<ffs3::FileSystemObject*>& rowsOnLeft, - const std::vector<ffs3::FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, - bool& useRecycleBin) +ReturnSmallDlg::ButtonPressed zen::showDeleteDialog(const std::vector<zen::FileSystemObject*>& rowsOnLeft, + const std::vector<zen::FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin) { - DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; - DeleteDialog confirmDeletion(NULL, rowsOnLeft, rowsOnRight, deleteOnBothSides, useRecycleBin); - if (confirmDeletion.ShowModal() == DeleteDialog::BUTTON_OKAY) - rv = DefaultReturnCode::BUTTON_OKAY; - return rv; + return static_cast<ReturnSmallDlg::ButtonPressed>(confirmDeletion.ShowModal()); } //######################################################################################## @@ -463,12 +512,7 @@ DefaultReturnCode::Response ffs3::showDeleteDialog(const std::vector<ffs3::FileS class CustomizeColsDlg : public CustomizeColsDlgGenerated { public: - CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr); - - enum - { - BUTTON_OKAY = 10 - }; + CustomizeColsDlg(wxWindow* parent, xmlAccess::ColumnAttributes& attr); private: void OnOkay(wxCommandEvent& event); @@ -483,13 +527,12 @@ private: }; -CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr) : - CustomizeColsDlgGenerated(window), +CustomizeColsDlg::CustomizeColsDlg(wxWindow* parent, xmlAccess::ColumnAttributes& attr) : + CustomizeColsDlgGenerated(parent), output(attr) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_bpButton29->SetBitmapLabel(GlobalResources::instance().getImage(wxT("moveUp"))); @@ -526,7 +569,7 @@ void CustomizeColsDlg::OnOkay(wxCommandEvent& event) } } - EndModal(BUTTON_OKAY); + EndModal(ReturnSmallDlg::BUTTON_OKAY); } @@ -589,15 +632,10 @@ void CustomizeColsDlg::OnMoveDown(wxCommandEvent& event) } -DefaultReturnCode::Response ffs3::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr) +ReturnSmallDlg::ButtonPressed zen::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr) { - DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; - CustomizeColsDlg customizeDlg(NULL, attr); - if (customizeDlg.ShowModal() == CustomizeColsDlg::BUTTON_OKAY) - rv = DefaultReturnCode::BUTTON_OKAY; - - return rv; + return static_cast<ReturnSmallDlg::ButtonPressed>(customizeDlg.ShowModal()); } //######################################################################################## @@ -605,16 +643,10 @@ DefaultReturnCode::Response ffs3::showCustomizeColsDlg(xmlAccess::ColumnAttribut class SyncPreviewDlg : public SyncPreviewDlgGenerated { public: - SyncPreviewDlg(wxWindow* parentWindow, + SyncPreviewDlg(wxWindow* parent, const wxString& variantName, - const ffs3::SyncStatistics& statistics, + const zen::SyncStatistics& statistics, bool& dontShowAgain); - enum - { - BUTTON_START = 1, - BUTTON_CANCEL = 2 - }; - private: void OnClose(wxCloseEvent& event); void OnCancel(wxCommandEvent& event); @@ -625,19 +657,18 @@ private: -SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow, +SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent, const wxString& variantName, - const ffs3::SyncStatistics& statistics, + const zen::SyncStatistics& statistics, bool& dontShowAgain) : - SyncPreviewDlgGenerated(parentWindow), + SyncPreviewDlgGenerated(parent), m_dontShowAgain(dontShowAgain) { #ifdef FFS_WIN - new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_staticTextVariant); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - using ffs3::numberToStringSep; + using zen::toStringSep; m_buttonStartSync->setBitmapFront(GlobalResources::instance().getImage(wxT("startSync"))); m_bitmapCreate->SetBitmap(GlobalResources::instance().getImage(wxT("create"))); @@ -646,15 +677,15 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow, m_bitmapData->SetBitmap(GlobalResources::instance().getImage(wxT("data"))); m_staticTextVariant->SetLabel(variantName); - m_textCtrlData->SetValue(ffs3::formatFilesizeToShortString(statistics.getDataToProcess())); + m_textCtrlData->SetValue(zen::formatFilesizeToShortString(statistics.getDataToProcess())); - m_textCtrlCreateL->SetValue(numberToStringSep(statistics.getCreate <LEFT_SIDE>())); - m_textCtrlUpdateL->SetValue(numberToStringSep(statistics.getOverwrite<LEFT_SIDE>())); - m_textCtrlDeleteL->SetValue(numberToStringSep(statistics.getDelete <LEFT_SIDE>())); + m_textCtrlCreateL->SetValue(toStringSep(statistics.getCreate <LEFT_SIDE>())); + m_textCtrlUpdateL->SetValue(toStringSep(statistics.getOverwrite<LEFT_SIDE>())); + m_textCtrlDeleteL->SetValue(toStringSep(statistics.getDelete <LEFT_SIDE>())); - m_textCtrlCreateR->SetValue(numberToStringSep(statistics.getCreate <RIGHT_SIDE>())); - m_textCtrlUpdateR->SetValue(numberToStringSep(statistics.getOverwrite<RIGHT_SIDE>())); - m_textCtrlDeleteR->SetValue(numberToStringSep(statistics.getDelete <RIGHT_SIDE>())); + m_textCtrlCreateR->SetValue(toStringSep(statistics.getCreate <RIGHT_SIDE>())); + m_textCtrlUpdateR->SetValue(toStringSep(statistics.getOverwrite<RIGHT_SIDE>())); + m_textCtrlDeleteR->SetValue(toStringSep(statistics.getDelete <RIGHT_SIDE>())); m_checkBoxDontShowAgain->SetValue(dontShowAgain); @@ -665,39 +696,34 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow, void SyncPreviewDlg::OnClose(wxCloseEvent& event) { - EndModal(BUTTON_CANCEL); + EndModal(ReturnSmallDlg::BUTTON_CANCEL); } void SyncPreviewDlg::OnCancel(wxCommandEvent& event) { - EndModal(BUTTON_CANCEL); + EndModal(ReturnSmallDlg::BUTTON_CANCEL); } void SyncPreviewDlg::OnStartSync(wxCommandEvent& event) { m_dontShowAgain = m_checkBoxDontShowAgain->GetValue(); - EndModal(BUTTON_START); + EndModal(ReturnSmallDlg::BUTTON_OKAY); } -DefaultReturnCode::Response ffs3::showSyncPreviewDlg( +ReturnSmallDlg::ButtonPressed zen::showSyncPreviewDlg( const wxString& variantName, - const ffs3::SyncStatistics& statistics, + const zen::SyncStatistics& statistics, bool& dontShowAgain) { - DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; - SyncPreviewDlg preview(NULL, variantName, statistics, dontShowAgain); - if (preview.ShowModal() == SyncPreviewDlg::BUTTON_START) - rv = DefaultReturnCode::BUTTON_OKAY; - - return rv; + return static_cast<ReturnSmallDlg::ButtonPressed>(preview.ShowModal()); } //######################################################################################## @@ -705,16 +731,11 @@ DefaultReturnCode::Response ffs3::showSyncPreviewDlg( class CompareCfgDialog : public CmpCfgDlgGenerated { public: - CompareCfgDialog(wxWindow* parentWindow, + CompareCfgDialog(wxWindow* parent, const wxPoint& position, - ffs3::CompareVariant& cmpVar, + zen::CompareVariant& cmpVar, SymLinkHandling& handleSymlinks); - enum - { - BUTTON_OKAY = 10 - }; - private: void OnOkay(wxCommandEvent& event); void OnClose(wxCloseEvent& event); @@ -725,14 +746,14 @@ private: void updateView(); - ffs3::CompareVariant& cmpVarOut; + zen::CompareVariant& cmpVarOut; SymLinkHandling& handleSymlinksOut; }; namespace { -void setValue(wxChoice& choiceCtrl, ffs3::SymLinkHandling value) +void setValue(wxChoice& choiceCtrl, zen::SymLinkHandling value) { choiceCtrl.Clear(); choiceCtrl.Append(_("Ignore")); @@ -744,55 +765,54 @@ void setValue(wxChoice& choiceCtrl, ffs3::SymLinkHandling value) switch (value) { - case ffs3::SYMLINK_IGNORE: + case zen::SYMLINK_IGNORE: choiceCtrl.SetSelection(0); break; - case ffs3::SYMLINK_USE_DIRECTLY: + case zen::SYMLINK_USE_DIRECTLY: choiceCtrl.SetSelection(1); break; - case ffs3::SYMLINK_FOLLOW_LINK: + case zen::SYMLINK_FOLLOW_LINK: choiceCtrl.SetSelection(2); break; } } -ffs3::SymLinkHandling getValue(const wxChoice& choiceCtrl) +zen::SymLinkHandling getValue(const wxChoice& choiceCtrl) { switch (choiceCtrl.GetSelection()) { case 0: - return ffs3::SYMLINK_IGNORE; + return zen::SYMLINK_IGNORE; case 1: - return ffs3::SYMLINK_USE_DIRECTLY; + return zen::SYMLINK_USE_DIRECTLY; case 2: - return ffs3::SYMLINK_FOLLOW_LINK; + return zen::SYMLINK_FOLLOW_LINK; default: assert(false); - return ffs3::SYMLINK_IGNORE; + return zen::SYMLINK_IGNORE; } } } -CompareCfgDialog::CompareCfgDialog(wxWindow* parentWindow, +CompareCfgDialog::CompareCfgDialog(wxWindow* parent, const wxPoint& position, CompareVariant& cmpVar, SymLinkHandling& handleSymlinks) : - CmpCfgDlgGenerated(parentWindow), + CmpCfgDlgGenerated(parent), cmpVarOut(cmpVar), handleSymlinksOut(handleSymlinks) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif //move dialog up so that compare-config button and first config-variant are on same level Move(wxPoint(position.x, std::max(0, position.y - (m_buttonTimeSize->GetScreenPosition() - GetScreenPosition()).y))); - m_bpButtonHelp->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); - m_bitmapByTime->SetBitmap(GlobalResources::instance().getImage(wxT("cmpByTime"))); - m_bitmapByContent->SetBitmap(GlobalResources::instance().getImage(wxT("cmpByContent"))); + m_bpButtonHelp ->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); + m_bitmapByTime ->SetBitmap (GlobalResources::instance().getImage(wxT("clock"))); + m_bitmapByContent->SetBitmap (GlobalResources::instance().getImage(wxT("cmpByContent"))); switch (cmpVar) { @@ -826,7 +846,7 @@ void CompareCfgDialog::OnOkay(wxCommandEvent& event) handleSymlinksOut = getValue(*m_choiceHandleSymlinks);; - EndModal(BUTTON_OKAY); + EndModal(ReturnSmallDlg::BUTTON_OKAY); } @@ -863,16 +883,14 @@ void CompareCfgDialog::OnShowHelp(wxCommandEvent& event) } -DefaultReturnCode::Response ffs3::showCompareCfgDialog( +ReturnSmallDlg::ButtonPressed zen::showCompareCfgDialog( const wxPoint& position, CompareVariant& cmpVar, SymLinkHandling& handleSymlinks) { CompareCfgDialog syncDlg(NULL, position, cmpVar, handleSymlinks); - return syncDlg.ShowModal() == CompareCfgDialog::BUTTON_OKAY ? - DefaultReturnCode::BUTTON_OKAY : - DefaultReturnCode::BUTTON_CANCEL; + return static_cast<ReturnSmallDlg::ButtonPressed>(syncDlg.ShowModal()); } //######################################################################################## @@ -880,12 +898,7 @@ DefaultReturnCode::Response ffs3::showCompareCfgDialog( class GlobalSettingsDlg : public GlobalSettingsDlgGenerated { public: - GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings); - - enum - { - BUTTON_OKAY = 10 - }; + GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSettings); private: void OnOkay(wxCommandEvent& event); @@ -903,13 +916,12 @@ private: }; -GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings) : - GlobalSettingsDlgGenerated(window), +GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSettings) : + GlobalSettingsDlgGenerated(parent), settings(globalSettings) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_bitmapSettings, m_staticText56); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif m_bitmapSettings->SetBitmap(GlobalResources::instance().getImage(wxT("settings"))); @@ -948,17 +960,14 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) settings.copyFilePermissions = m_checkBoxCopyPermissions->GetValue(); settings.gui.externelApplications = getExtApp(); - EndModal(BUTTON_OKAY); + EndModal(ReturnSmallDlg::BUTTON_OKAY); } void GlobalSettingsDlg::OnResetDialogs(wxCommandEvent& event) { - QuestionDlg messageDlg(this, - QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL, - _("Restore all hidden dialogs?")); - - if (messageDlg.ShowModal() == QuestionDlg::BUTTON_YES) + if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, + _("Restore all hidden dialogs?")) == ReturnQuestionDlg::BUTTON_YES) settings.optDialogs.resetDialogs(); } @@ -1044,13 +1053,8 @@ void GlobalSettingsDlg::OnRemoveRow(wxCommandEvent& event) } -DefaultReturnCode::Response ffs3::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings) +ReturnSmallDlg::ButtonPressed zen::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings) { - DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; - GlobalSettingsDlg settingsDlg(NULL, globalSettings); - if (settingsDlg.ShowModal() == GlobalSettingsDlg::BUTTON_OKAY) - rv = DefaultReturnCode::BUTTON_OKAY; - - return rv; + return static_cast<ReturnSmallDlg::ButtonPressed>(settingsDlg.ShowModal()); } diff --git a/ui/small_dlgs.h b/ui/small_dlgs.h index d4fce824..06fb9964 100644 --- a/ui/small_dlgs.h +++ b/ui/small_dlgs.h @@ -9,48 +9,45 @@ #include "../file_hierarchy.h" #include "../library/process_xml.h" +#include "../synchronization.h" -namespace ffs3 +namespace zen { -class SyncStatistics; - - -struct DefaultReturnCode +struct ReturnSmallDlg { - enum Response + enum ButtonPressed { - BUTTON_OKAY, - BUTTON_CANCEL + BUTTON_CANCEL, + BUTTON_OKAY = 1 }; }; + void showAboutDialog(); void showHelpDialog(); -DefaultReturnCode::Response showFilterDialog(bool isGlobalFilter, - Zstring& filterIncl, - Zstring& filterExcl); +ReturnSmallDlg::ButtonPressed showFilterDialog(bool isGlobalFilter, FilterConfig& filter); -DefaultReturnCode::Response showDeleteDialog( +ReturnSmallDlg::ButtonPressed showDeleteDialog( const std::vector<FileSystemObject*>& rowsOnLeft, const std::vector<FileSystemObject*>& rowsOnRight, bool& deleteOnBothSides, bool& useRecycleBin); -DefaultReturnCode::Response showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr); +ReturnSmallDlg::ButtonPressed showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr); -DefaultReturnCode::Response showSyncPreviewDlg( +ReturnSmallDlg::ButtonPressed showSyncPreviewDlg( const wxString& variantName, const SyncStatistics& statistics, bool& dontShowAgain); -DefaultReturnCode::Response showCompareCfgDialog( +ReturnSmallDlg::ButtonPressed showCompareCfgDialog( const wxPoint& position, CompareVariant& cmpVar, SymLinkHandling& handleSymlinks); -DefaultReturnCode::Response showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings); +ReturnSmallDlg::ButtonPressed showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings); } #endif // SMALLDIALOGS_H_INCLUDED diff --git a/ui/sorting.h b/ui/sorting.h index ce3e4648..52921f84 100644 --- a/ui/sorting.h +++ b/ui/sorting.h @@ -13,7 +13,7 @@ #include "../shared/assert_static.h" -namespace ffs3 +namespace zen { namespace { @@ -68,7 +68,7 @@ bool sortByFileName(const FileSystemObject& a, const FileSystemObject& b) if (isDirectoryMapping(a)) //sort directories by relative name { if (isDirectoryMapping(b)) - return cmpFileName(a.getRelativeName<side>(), b.getRelativeName<side>()) < 0; + return LessFilename()(a.getRelativeName<side>(), b.getRelativeName<side>()); else return false; } @@ -113,7 +113,7 @@ bool sortByRelativeName(const FileSystemObject& a, const FileSystemObject& b) else if (isDirectoryA) return true; - return cmpFileName(a.getShortName<side>(), b.getShortName<side>()) < 0; + return LessFilename()(a.getShortName<side>(), b.getShortName<side>()); } } @@ -172,8 +172,8 @@ bool sortByDate(const FileSystemObject& a, const FileSystemObject& b) else if (!fileObjB && !linkObjB) return true; //directories last - const wxLongLong& dateA = fileObjA ? fileObjA->getLastWriteTime<side>() : linkObjA->getLastWriteTime<side>(); - const wxLongLong& dateB = fileObjB ? fileObjB->getLastWriteTime<side>() : linkObjB->getLastWriteTime<side>(); + zen::Int64 dateA = fileObjA ? fileObjA->getLastWriteTime<side>() : linkObjA->getLastWriteTime<side>(); + zen::Int64 dateB = fileObjB ? fileObjB->getLastWriteTime<side>() : linkObjB->getLastWriteTime<side>(); //return list beginning with newest files first return Compare<ascending>().isSmallerThan(dateA, dateB); diff --git a/ui/switch_to_gui.cpp b/ui/switch_to_gui.cpp index 87827c54..4bfdfd1f 100644 --- a/ui/switch_to_gui.cpp +++ b/ui/switch_to_gui.cpp @@ -7,7 +7,7 @@ #include "switch_to_gui.h" #include "main_dlg.h" -using ffs3::SwitchToGui; +using zen::SwitchToGui; SwitchToGui::SwitchToGui(const xmlAccess::XmlBatchConfig& batchCfg, diff --git a/ui/switch_to_gui.h b/ui/switch_to_gui.h index a938c7d8..03e18324 100644 --- a/ui/switch_to_gui.h +++ b/ui/switch_to_gui.h @@ -10,7 +10,7 @@ #include "../library/process_xml.h" -namespace ffs3 +namespace zen { //switch from FreeFileSync Batch to GUI modus: opens a new FreeFileSync GUI session asynchronously diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp index 406ca5c6..3a7283e1 100644 --- a/ui/sync_cfg.cpp +++ b/ui/sync_cfg.cpp @@ -5,43 +5,268 @@ // ************************************************************************** // #include "sync_cfg.h" - #include "../library/resources.h" #include "../shared/dir_name.h" #include <wx/wupdlock.h> #include "../shared/mouse_move_dlg.h" #include "../shared/string_conv.h" #include "../shared/dir_picker_i18n.h" +#include "gui_generated.h" +#include <memory> +#include "../shared/util.h" +#include "../shared/dir_name.h" + +using namespace zen; +using namespace xmlAccess; + + + + +class SyncCfgDialog : public SyncCfgDlgGenerated +{ +public: + SyncCfgDialog(wxWindow* window, + zen::CompareVariant compareVar, + zen::SyncConfig& syncConfiguration, + zen::DeletionPolicy& handleDeletion, + wxString& customDeletionDirectory, + xmlAccess::OnGuiError* handleError); //optional input parameter + + ~SyncCfgDialog(); + +private: + virtual void OnSyncAutomatic( wxCommandEvent& event); + virtual void OnSyncMirror( wxCommandEvent& event); + virtual void OnSyncUpdate( wxCommandEvent& event); + virtual void OnSyncCustom( wxCommandEvent& event); + + virtual void OnExLeftSideOnly( wxCommandEvent& event); + virtual void OnExRightSideOnly( wxCommandEvent& event); + virtual void OnLeftNewer( wxCommandEvent& event); + virtual void OnRightNewer( wxCommandEvent& event); + virtual void OnDifferent( wxCommandEvent& event); + virtual void OnConflict( wxCommandEvent& event); + + virtual void OnClose( wxCloseEvent& event); + virtual void OnCancel( wxCommandEvent& event); + virtual void OnApply( wxCommandEvent& event); + + void updateGui(); + + void OnChangeErrorHandling(wxCommandEvent& event); + void OnChangeDeletionHandling(wxCommandEvent& event); + + const zen::CompareVariant cmpVariant; + + //temporal copy of maindialog.cfg.syncConfiguration -> ownership NOT within GUI controls! + zen::SyncConfig currentSyncConfig; + + //changing data + zen::SyncConfig& refSyncConfiguration; + zen::DeletionPolicy& refHandleDeletion; + wxString& refCustomDeletionDirectory; + xmlAccess::OnGuiError* refHandleError; + + zen::DirectoryName customDelFolder; + + zen::EnumDescrList<zen::DeletionPolicy> enumDelhandDescr; + zen::EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr; +}; + + + +void updateConfigIcons(const CompareVariant compareVar, + const SyncConfig& syncConfig, + wxBitmapButton* buttonLeftOnly, + wxBitmapButton* buttonRightOnly, + wxBitmapButton* buttonLeftNewer, + wxBitmapButton* buttonRightNewer, + wxBitmapButton* buttonDifferent, + wxBitmapButton* buttonConflict, + wxStaticBitmap* bitmapLeftOnly, + wxStaticBitmap* bitmapRightOnly, + wxStaticBitmap* bitmapLeftNewer, + wxStaticBitmap* bitmapRightNewer, + wxStaticBitmap* bitmapDifferent, + wxStaticBitmap* bitmapConflict, + wxSizer* syncDirections) //sizer containing all sync-directions +{ + //display only relevant sync options + syncDirections->Show(true); + + buttonLeftOnly ->Show(); // + buttonRightOnly ->Show(); // + buttonLeftNewer ->Show(); // + buttonRightNewer->Show(); // enable everything by default + buttonDifferent ->Show(); // + buttonConflict ->Show(); // + + bitmapLeftOnly ->Show(); // + bitmapRightOnly ->Show(); // + bitmapLeftNewer ->Show(); // + bitmapRightNewer->Show(); // + bitmapDifferent ->Show(); // + bitmapConflict ->Show(); // + + switch (compareVar) + { + case CMP_BY_TIME_SIZE: + buttonDifferent ->Hide(); + + bitmapDifferent ->Hide(); + break; + + case CMP_BY_CONTENT: + buttonLeftNewer ->Hide(); + buttonRightNewer->Hide(); + + bitmapLeftNewer ->Hide(); + bitmapRightNewer->Hide(); + break; + } -using namespace ffs3; + if (syncConfig.var == SyncConfig::AUTOMATIC) //automatic mode needs no sync-directions + syncDirections->Show(false); + else + { + const DirectionSet dirCfg = extractDirections(syncConfig); + + switch (dirCfg.exLeftSideOnly) + { + case SYNC_DIR_RIGHT: + buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRightCr"))); + buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteLeft"))); + buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT)); + break; + case SYNC_DIR_NONE: + buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING)); + break; + } + + switch (dirCfg.exRightSideOnly) + { + case SYNC_DIR_RIGHT: + buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteRight"))); + buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeftCr"))); + buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT)); + break; + case SYNC_DIR_NONE: + buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING)); + break; + } + + switch (dirCfg.leftNewer) + { + case SYNC_DIR_RIGHT: + buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); + break; + case SYNC_DIR_NONE: + buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING)); + break; + } + + switch (dirCfg.rightNewer) + { + case SYNC_DIR_RIGHT: + buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); + break; + case SYNC_DIR_NONE: + buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING)); + break; + } + + switch (dirCfg.different) + { + case SYNC_DIR_RIGHT: + buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); + break; + case SYNC_DIR_NONE: + buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING)); + break; + } + + switch (dirCfg.conflict) + { + case SYNC_DIR_RIGHT: + buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); + break; + case SYNC_DIR_LEFT: + buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); + break; + case SYNC_DIR_NONE: + buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("conflict"))); + buttonConflict->SetToolTip(_("Leave as unresolved conflict")); + break; + } + } +} SyncCfgDialog::SyncCfgDialog(wxWindow* window, - const CompareVariant compareVar, - SyncConfiguration& syncConfiguration, - DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, - bool* ignoreErrors) : + CompareVariant compareVar, + SyncConfig& syncConfiguration, + DeletionPolicy& handleDeletion, + wxString& customDeletionDirectory, + OnGuiError* handleError) : SyncCfgDlgGenerated(window), cmpVariant(compareVar), currentSyncConfig(syncConfiguration), //make working copy of syncConfiguration refSyncConfiguration(syncConfiguration), refHandleDeletion(handleDeletion), refCustomDeletionDirectory(customDeletionDirectory), - refIgnoreErrors(ignoreErrors), - customDelFolder(new DirectoryName(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_textCtrlCustomDelFolder)) + refHandleError(handleError), + customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_textCtrlCustomDelFolder) { #ifdef FFS_WIN - new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere... - this, m_staticText81, m_staticText8, m_staticText101, m_staticText9); //ownership passed to "this" + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - setDeletionHandling(handleDeletion); - customDelFolder->setName(wxToZ(customDeletionDirectory)); + enumDelhandDescr. + add(DELETE_PERMANENTLY, _("Delete permanently"), _("Delete or overwrite files permanently")). + add(MOVE_TO_RECYCLE_BIN, _("Use Recycle Bin"), _("Use Recycle Bin when deleting or overwriting files")). + add(MOVE_TO_CUSTOM_DIRECTORY, _("Versioning"), _("Move files into a time-stamped subdirectory")); + + enumErrhandDescr. + add(ON_GUIERROR_POPUP, _("Show popup"), _("Show popup on errors or warnings")). + add(ON_GUIERROR_IGNORE, _("Ignore errors"), _("Hide all error and warning messages")); + + + //a proper set-method may be in order some time... + setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, handleDeletion); + customDelFolder.setName(customDeletionDirectory); + updateGui(); //error handling - if (ignoreErrors) - setErrorHandling(*ignoreErrors); + if (handleError) + setEnumVal(enumErrhandDescr, *m_choiceHandleError, *handleError); else { sbSizerErrorHandling->Show(false); @@ -49,15 +274,15 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, } //set sync config icons - updateConfigIcons(cmpVariant, currentSyncConfig); + updateGui(); //set icons for this dialog - m_bitmapLeftOnly->SetBitmap(GlobalResources::instance().getImage(wxT("leftOnly"))); - m_bitmapRightOnly->SetBitmap(GlobalResources::instance().getImage(wxT("rightOnly"))); - m_bitmapLeftNewer->SetBitmap(GlobalResources::instance().getImage(wxT("leftNewer"))); + m_bitmapLeftOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("leftOnly"))); + m_bitmapRightOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("rightOnly"))); + m_bitmapLeftNewer ->SetBitmap(GlobalResources::instance().getImage(wxT("leftNewer"))); m_bitmapRightNewer->SetBitmap(GlobalResources::instance().getImage(wxT("rightNewer"))); - m_bitmapDifferent->SetBitmap(GlobalResources::instance().getImage(wxT("different"))); - m_bitmapConflict->SetBitmap(GlobalResources::instance().getImage(wxT("conflictGrey"))); + m_bitmapDifferent ->SetBitmap(GlobalResources::instance().getImage(wxT("different"))); + m_bitmapConflict ->SetBitmap(GlobalResources::instance().getImage(wxT("conflictGrey"))); bSizer201->Layout(); //wxButtonWithImage size might have changed @@ -71,7 +296,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, SyncCfgDialog::~SyncCfgDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration -void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const ffs3::SyncConfiguration& syncConfig) +void SyncCfgDialog::updateGui() { //wxWindowUpdateLocker dummy(this); //avoid display distortion wxWindowUpdateLocker dummy2(m_panelCustomDeletionDir); //avoid display distortion @@ -82,9 +307,8 @@ void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const f wxWindowUpdateLocker dummy7(m_bpButtonDifferent); wxWindowUpdateLocker dummy8(m_bpButtonConflict); - - updateConfigIcons(cmpVar, - syncConfig, + updateConfigIcons(cmpVariant, + currentSyncConfig, m_bpButtonLeftOnly, m_bpButtonRightOnly, m_bpButtonLeftNewer, @@ -100,174 +324,25 @@ void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const f sbSizerSyncDirections); //set radiobuttons -> have no parameter-ownership at all! - switch (ffs3::getVariant(currentSyncConfig)) + switch (currentSyncConfig.var) { - case SyncConfiguration::AUTOMATIC: + case SyncConfig::AUTOMATIC: m_radioBtnAutomatic->SetValue(true); //automatic mode break; - case SyncConfiguration::MIRROR: + case SyncConfig::MIRROR: m_radioBtnMirror->SetValue(true); //one way -> break; - case SyncConfiguration::UPDATE: + case SyncConfig::UPDATE: m_radioBtnUpdate->SetValue(true); //Update -> break; - case SyncConfiguration::CUSTOM: + case SyncConfig::CUSTOM: m_radioBtnCustom->SetValue(true); //custom break; } GetSizer()->SetSizeHints(this); //this works like a charm for GTK2 with window resizing problems!!! (includes call to Fit()) -} - - -void SyncCfgDialog::updateConfigIcons(const CompareVariant compareVar, - const SyncConfiguration& syncConfig, - wxBitmapButton* buttonLeftOnly, - wxBitmapButton* buttonRightOnly, - wxBitmapButton* buttonLeftNewer, - wxBitmapButton* buttonRightNewer, - wxBitmapButton* buttonDifferent, - wxBitmapButton* buttonConflict, - wxStaticBitmap* bitmapLeftOnly, - wxStaticBitmap* bitmapRightOnly, - wxStaticBitmap* bitmapLeftNewer, - wxStaticBitmap* bitmapRightNewer, - wxStaticBitmap* bitmapDifferent, - wxStaticBitmap* bitmapConflict, - wxSizer* syncDirections) //sizer containing all sync-directions -{ - //display only relevant sync options - syncDirections->Show(true); - - buttonLeftOnly ->Show(); // - buttonRightOnly ->Show(); // - buttonLeftNewer ->Show(); // - buttonRightNewer->Show(); // enable everything by default - buttonDifferent ->Show(); // - buttonConflict ->Show(); // - - bitmapLeftOnly ->Show(); // - bitmapRightOnly ->Show(); // - bitmapLeftNewer ->Show(); // - bitmapRightNewer->Show(); // - bitmapDifferent ->Show(); // - bitmapConflict ->Show(); // - - switch (compareVar) - { - case CMP_BY_TIME_SIZE: - buttonDifferent ->Hide(); - - bitmapDifferent ->Hide(); - break; - - case CMP_BY_CONTENT: - buttonLeftNewer ->Hide(); - buttonRightNewer->Hide(); - - bitmapLeftNewer ->Hide(); - bitmapRightNewer->Hide(); - break; - } - - if (syncConfig.automatic) //automatic mode needs no sync-directions - syncDirections->Show(false); - - switch (syncConfig.exLeftSideOnly) - { - case SYNC_DIR_RIGHT: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRightCr"))); - buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteLeft"))); - buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); - buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.exRightSideOnly) - { - case SYNC_DIR_RIGHT: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteRight"))); - buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeftCr"))); - buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT)); - break; - case SYNC_DIR_NONE: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); - buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.leftNewer) - { - case SYNC_DIR_RIGHT: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); - buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); - buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); - buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.rightNewer) - { - case SYNC_DIR_RIGHT: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); - buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); - buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); - buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.different) - { - case SYNC_DIR_RIGHT: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); - buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); - buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); - buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - switch (syncConfig.conflict) - { - case SYNC_DIR_RIGHT: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); - buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); - buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("conflict"))); - buttonConflict->SetToolTip(_("Leave as unresolved conflict")); - break; - } + m_panelCustomDeletionDir->Enable(getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion) == zen::MOVE_TO_CUSTOM_DIRECTORY); } @@ -287,142 +362,54 @@ void SyncCfgDialog::OnApply(wxCommandEvent& event) { //write configuration to main dialog refSyncConfiguration = currentSyncConfig; - refHandleDeletion = getDeletionHandling(); - refCustomDeletionDirectory = zToWx(customDelFolder->getName()); - if (refIgnoreErrors) - *refIgnoreErrors = getErrorHandling(); - - EndModal(BUTTON_APPLY); -} - - -void SyncCfgDialog::updateToolTipErrorHandling(bool ignoreErrors) -{ - if (ignoreErrors) - m_choiceHandleError->SetToolTip(_("Hide all error and warning messages")); - else - m_choiceHandleError->SetToolTip(_("Show popup on errors or warnings")); -} - - -bool SyncCfgDialog::getErrorHandling() -{ - if (m_choiceHandleError->GetSelection() == 1) //Ignore errors - return true; - else - return false; // Show popup -} - + refHandleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); -void SyncCfgDialog::setErrorHandling(bool ignoreErrors) -{ - m_choiceHandleError->Clear(); - m_choiceHandleError->Append(_("Show popup")); - m_choiceHandleError->Append(_("Ignore errors")); - - if (ignoreErrors) - m_choiceHandleError->SetSelection(1); - else - m_choiceHandleError->SetSelection(0); + refCustomDeletionDirectory = customDelFolder.getName(); + if (refHandleError) + *refHandleError = getEnumVal(enumErrhandDescr, *m_choiceHandleError); - updateToolTipErrorHandling(ignoreErrors); + EndModal(ReturnSyncConfig::BUTTON_OKAY); } void SyncCfgDialog::OnChangeErrorHandling(wxCommandEvent& event) { - updateToolTipErrorHandling(getErrorHandling()); -} - -//------------------- - -void updateToolTipDeletionHandling(wxChoice* choiceHandleError, wxPanel* customDir, const ffs3::DeletionPolicy value) -{ - customDir->Disable(); - - switch (value) - { - case ffs3::DELETE_PERMANENTLY: - choiceHandleError->SetToolTip(_("Delete or overwrite files permanently")); - break; - - case ffs3::MOVE_TO_RECYCLE_BIN: - choiceHandleError->SetToolTip(_("Use Recycle Bin when deleting or overwriting files")); - break; - - case ffs3::MOVE_TO_CUSTOM_DIRECTORY: - choiceHandleError->SetToolTip(_("Move files into a time-stamped subdirectory")); - customDir->Enable(); - break; - } -} - - -ffs3::DeletionPolicy SyncCfgDialog::getDeletionHandling() -{ - switch (m_choiceHandleDeletion->GetSelection()) - { - case 0: - return ffs3::DELETE_PERMANENTLY; - case 1: - return ffs3::MOVE_TO_RECYCLE_BIN; - case 2: - return ffs3::MOVE_TO_CUSTOM_DIRECTORY; - default: - assert(false); - return ffs3::MOVE_TO_RECYCLE_BIN; - } + updateTooltipEnumVal(enumErrhandDescr, *m_choiceHandleError); } -void SyncCfgDialog::setDeletionHandling(ffs3::DeletionPolicy newValue) +void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) { - m_choiceHandleDeletion->Clear(); - m_choiceHandleDeletion->Append(_("Delete permanently")); - m_choiceHandleDeletion->Append(_("Use Recycle Bin")); - m_choiceHandleDeletion->Append(_("Versioning")); - - switch (newValue) - { - case ffs3::DELETE_PERMANENTLY: - m_choiceHandleDeletion->SetSelection(0); - break; - case ffs3::MOVE_TO_RECYCLE_BIN: - m_choiceHandleDeletion->SetSelection(1); - break; - case ffs3::MOVE_TO_CUSTOM_DIRECTORY: - m_choiceHandleDeletion->SetSelection(2); - break; - } - - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, newValue); + updateTooltipEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); + updateGui(); } -void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) +void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event) { - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, getDeletionHandling()); + currentSyncConfig.var = SyncConfig::AUTOMATIC; + updateGui(); } -void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event) +void SyncCfgDialog::OnSyncMirror(wxCommandEvent& event) { - ffs3::setVariant(currentSyncConfig, SyncConfiguration::AUTOMATIC); - updateConfigIcons(cmpVariant, currentSyncConfig); + currentSyncConfig.var = SyncConfig::MIRROR; + updateGui(); } -void SyncCfgDialog::OnSyncLeftToRight(wxCommandEvent& event) +void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) { - ffs3::setVariant(currentSyncConfig, SyncConfiguration::MIRROR); - updateConfigIcons(cmpVariant, currentSyncConfig); + currentSyncConfig.var = SyncConfig::UPDATE; + updateGui(); } -void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) +void SyncCfgDialog::OnSyncCustom(wxCommandEvent& event) { - ffs3::setVariant(currentSyncConfig, SyncConfiguration::UPDATE); - updateConfigIcons(cmpVariant, currentSyncConfig); + currentSyncConfig.var = SyncConfig::CUSTOM; + updateGui(); } @@ -443,43 +430,104 @@ void toggleSyncDirection(SyncDirection& current) } +void pressCustomDir(SyncConfig& syncCfg, SyncDirection& syncdir) +{ + switch (syncCfg.var) + { + case SyncConfig::AUTOMATIC: + assert(false); + break; + case SyncConfig::MIRROR: + case SyncConfig::UPDATE: + syncCfg.custom = extractDirections(syncCfg); + syncCfg.var = SyncConfig::CUSTOM; + toggleSyncDirection(syncdir); + break; + case SyncConfig::CUSTOM: + toggleSyncDirection(syncdir); + + //some config optimization: if custom settings happen to match "mirror" or "update", just switch variant + DirectionSet currentSet = extractDirections(syncCfg); + DirectionSet setMirror; + DirectionSet setUpdate; + { + SyncConfig mirrorCfg; + mirrorCfg.var = SyncConfig::MIRROR; + setMirror = extractDirections(mirrorCfg); + } + { + SyncConfig updateCfg; + updateCfg.var = SyncConfig::UPDATE; + setUpdate = extractDirections(updateCfg); + } + + if (currentSet == setMirror) + syncCfg.var = SyncConfig::MIRROR; + else if (currentSet == setUpdate) + syncCfg.var = SyncConfig::UPDATE; + break; + } +} + + void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event ) { - toggleSyncDirection(currentSyncConfig.exLeftSideOnly); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exLeftSideOnly); + updateGui(); } void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event ) { - toggleSyncDirection(currentSyncConfig.exRightSideOnly); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exRightSideOnly); + updateGui(); } void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event ) { - toggleSyncDirection(currentSyncConfig.leftNewer); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.leftNewer); + updateGui(); } void SyncCfgDialog::OnRightNewer(wxCommandEvent& event ) { - toggleSyncDirection(currentSyncConfig.rightNewer); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.rightNewer); + updateGui(); } void SyncCfgDialog::OnDifferent(wxCommandEvent& event ) { - toggleSyncDirection(currentSyncConfig.different); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.different); + updateGui(); } void SyncCfgDialog::OnConflict(wxCommandEvent& event) { - toggleSyncDirection(currentSyncConfig.conflict); - updateConfigIcons(cmpVariant, currentSyncConfig); + pressCustomDir(currentSyncConfig, currentSyncConfig.custom.conflict); + updateGui(); } + + + + + +ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(zen::CompareVariant compareVar, + zen::SyncConfig& syncConfiguration, + zen::DeletionPolicy& handleDeletion, + wxString& customDeletionDirectory, + xmlAccess::OnGuiError* handleError) //optional input parameter +{ + SyncCfgDialog syncDlg(NULL, + compareVar, + syncConfiguration, + handleDeletion, + customDeletionDirectory, + handleError); + + return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal()); +} + diff --git a/ui/sync_cfg.h b/ui/sync_cfg.h index fb00136a..bd52984b 100644 --- a/ui/sync_cfg.h +++ b/ui/sync_cfg.h @@ -7,93 +7,24 @@ #ifndef SYNCCONFIG_H_INCLUDED #define SYNCCONFIG_H_INCLUDED -#include <memory> -#include "gui_generated.h" -#include "../structures.h" +#include "../library/process_xml.h" - -namespace ffs3 +namespace zen { -class DirectoryName; -} - - -class SyncCfgDialog : public SyncCfgDlgGenerated +struct ReturnSyncConfig { -public: - SyncCfgDialog(wxWindow* window, - const ffs3::CompareVariant compareVar, - ffs3::SyncConfiguration& syncConfiguration, - ffs3::DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, - bool* ignoreErrors); //optional input parameter - - ~SyncCfgDialog(); - - enum + enum ButtonPressed { - BUTTON_APPLY = 10 + BUTTON_CANCEL, + BUTTON_OKAY = 1 }; - - static void updateConfigIcons(const ffs3::CompareVariant compareVar, - const ffs3::SyncConfiguration& syncConfig, - wxBitmapButton* buttonLeftOnly, - wxBitmapButton* buttonRightOnly, - wxBitmapButton* buttonLeftNewer, - wxBitmapButton* buttonRightNewer, - wxBitmapButton* buttonDifferent, - wxBitmapButton* buttonConflict, - wxStaticBitmap* bitmapLeftOnly, - wxStaticBitmap* bitmapRightOnly, - wxStaticBitmap* bitmapLeftNewer, - wxStaticBitmap* bitmapRightNewer, - wxStaticBitmap* bitmapDifferent, - wxStaticBitmap* bitmapConflict, - wxSizer* syncDirections); - //some syntax relaxation - void updateConfigIcons(const ffs3::CompareVariant cmpVar, const ffs3::SyncConfiguration& syncConfig); - -private: - virtual void OnSyncAutomatic( wxCommandEvent& event); - virtual void OnSyncLeftToRight( wxCommandEvent& event); - virtual void OnSyncUpdate( wxCommandEvent& event); - - virtual void OnExLeftSideOnly( wxCommandEvent& event); - virtual void OnExRightSideOnly( wxCommandEvent& event); - virtual void OnLeftNewer( wxCommandEvent& event); - virtual void OnRightNewer( wxCommandEvent& event); - virtual void OnDifferent( wxCommandEvent& event); - virtual void OnConflict( wxCommandEvent& event); - - virtual void OnClose( wxCloseEvent& event); - virtual void OnCancel( wxCommandEvent& event); - virtual void OnApply( wxCommandEvent& event); - - //set tooltip - void updateToolTipErrorHandling(bool ignoreErrors); - - //error handling - bool getErrorHandling(); - void setErrorHandling(bool ignoreErrors); - void OnChangeErrorHandling(wxCommandEvent& event); - - //deletion handling - ffs3::DeletionPolicy getDeletionHandling(); - void setDeletionHandling(ffs3::DeletionPolicy newValue); - void OnChangeDeletionHandling(wxCommandEvent& event); - - const ffs3::CompareVariant cmpVariant; - - //temporal copy of maindialog.cfg.syncConfiguration - ffs3::SyncConfiguration currentSyncConfig; - - //changing data - ffs3::SyncConfiguration& refSyncConfiguration; - ffs3::DeletionPolicy& refHandleDeletion; - wxString& refCustomDeletionDirectory; - bool* refIgnoreErrors; - - std::auto_ptr<ffs3::DirectoryName> customDelFolder; }; +ReturnSyncConfig::ButtonPressed showSyncConfigDlg(zen::CompareVariant compareVar, + zen::SyncConfig& syncConfiguration, + zen::DeletionPolicy& handleDeletion, + wxString& customDeletionDirectory, + xmlAccess::OnGuiError* handleError); //optional input parameter +} + #endif // SYNCCONFIG_H_INCLUDED diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp index d82d5733..278f1888 100644 --- a/ui/tray_icon.cpp +++ b/ui/tray_icon.cpp @@ -23,74 +23,118 @@ int roundNum(double d) //little rounding function } -wxIcon generateIcon(size_t percent) //generate icon with progress indicator +void fillRange(wxImage& img, int pixelFirst, int pixelLast, const wxColor& col) { - percent = std::min(percent, static_cast<size_t>(100)); //handle invalid input + const int pixelCount = img.GetWidth() >= 0 ? img.GetWidth() * img.GetHeight() : -1; + if (0 <= pixelFirst && pixelFirst < pixelLast && pixelLast <= pixelCount) + { + unsigned char* const bytesBegin = img.GetData() + pixelFirst * 3; + unsigned char* const bytesEnd = img.GetData() + pixelLast * 3; + + for (unsigned char* bytePos = bytesBegin; bytePos < bytesEnd; bytePos += 3) + { + bytePos[0] = col.Red (); + bytePos[1] = col.Green(); + bytePos[2] = col.Blue (); + } + + if (img.HasAlpha()) //make progress indicator fully opaque: + std::fill(img.GetAlpha() + pixelFirst, img.GetAlpha() + pixelLast, wxIMAGE_ALPHA_OPAQUE); + } +} + +wxIcon generateIcon(double percent) //generate icon with progress indicator +{ #ifdef FFS_WIN static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_win.png")); #elif defined FFS_LINUX static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_linux.png")); #endif - const int indicatorHeight = roundNum((trayIcon.GetHeight() * percent) / 100.0); + const int pixelCount = trayIcon.GetWidth() * trayIcon.GetHeight(); + const int startFillPixel = std::min(roundNum(percent / 100.0 * pixelCount), pixelCount); //minor optimization static std::pair<int, wxIcon> buffer = std::make_pair(-1, wxNullIcon); - if (buffer.first == indicatorHeight) + if (buffer.first == startFillPixel) return buffer.second; - wxImage genImage(trayIcon.ConvertToImage()); + wxIcon genIcon; + wxImage genImage(trayIcon.ConvertToImage()); if (genImage.GetWidth() > 0 && genImage.GetHeight() > 0) { - const int indicatorWidth = genImage.GetWidth() * .4; - const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0); - const int indicatorYBegin = genImage.GetHeight() - indicatorHeight; - - //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! - //We need a simple, working solution: - unsigned char* const data = genImage.GetData(); - - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + //fill black border row + if (startFillPixel <= pixelCount - genImage.GetWidth()) { - for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) - { - unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; - pixelBegin[0] = 240; //red - pixelBegin[1] = 200; //green - pixelBegin[2] = 0; //blue - } + /* + -------- + ---bbbbb + bbbbSyyy S : start yellow remainder + yyyyyyyy + */ + int bStart = startFillPixel - genImage.GetWidth(); + if (bStart % genImage.GetWidth() != 0) //add one more black pixel, see ascii-art + --bStart; + fillRange(genImage, std::max(bStart, 0), startFillPixel, *wxBLACK); } - - if (genImage.HasAlpha()) + else if (startFillPixel != pixelCount) { - unsigned char* const alpha = genImage.GetAlpha(); - //make progress indicator fully opaque: - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) - ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); + //special handling for last row + /* + -------- + -------- + ---bbbbb + ---bSyyy S : start yellow remainder + */ + int bStart = startFillPixel - genImage.GetWidth() - 1; + int bEnd = (bStart / genImage.GetWidth() + 1) * (genImage.GetWidth()); + + fillRange(genImage, std::max(bStart, 0), bEnd, *wxBLACK); + fillRange(genImage, startFillPixel - 1, startFillPixel, *wxBLACK); } - wxIcon genIcon; + //fill yellow remainder + fillRange(genImage, startFillPixel, pixelCount, wxColour(240, 200, 0)); + + /* + const int indicatorWidth = genImage.GetWidth() * .4; + const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0); + const int indicatorYBegin = genImage.GetHeight() - indicatorHeight; + + //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! + //We need a simple, working solution: + + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + { + for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) + { + unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; + pixelBegin[0] = 240; //red + pixelBegin[1] = 200; //green + pixelBegin[2] = 0; //blue + } + } + + if (genImage.HasAlpha()) + { + unsigned char* const alpha = genImage.GetAlpha(); + //make progress indicator fully opaque: + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); + } + */ genIcon.CopyFromBitmap(wxBitmap(genImage)); - - //fill buffer - buffer.first = indicatorHeight; - buffer.second = genIcon; - - return genIcon; } - - //fallback - wxIcon defaultIcon; - defaultIcon.CopyFromBitmap(trayIcon); + else //fallback + genIcon.CopyFromBitmap(trayIcon); //fill buffer - buffer.first = indicatorHeight; - buffer.second = defaultIcon; - - return defaultIcon; + buffer.first = startFillPixel; + buffer.second = genIcon; + return genIcon; } } @@ -183,7 +227,7 @@ void MinimizeToTray::resumeFromTray() //remove trayIcon and restore windows: Mi } -void MinimizeToTray::setToolTip(const wxString& toolTipText, size_t percent) +void MinimizeToTray::setToolTip(const wxString& toolTipText, double percent) { if (trayIcon) trayIcon->SetIcon(generateIcon(percent), toolTipText); @@ -203,7 +247,7 @@ void MinimizeToTray::OnContextMenuSelection(wxCommandEvent& event) switch (eventId) { case CONTEXT_ABOUT: - ffs3::showAboutDialog(); + zen::showAboutDialog(); break; case CONTEXT_RESTORE: resumeFromTray(); diff --git a/ui/tray_icon.h b/ui/tray_icon.h index af9200d1..8b5b5851 100644 --- a/ui/tray_icon.h +++ b/ui/tray_icon.h @@ -17,7 +17,7 @@ public: MinimizeToTray(wxTopLevelWindow* callerWnd, wxTopLevelWindow* secondWnd = NULL); //ensure both windows have longer lifetime than this instance! ~MinimizeToTray(); //show windows again - void setToolTip(const wxString& toolTipText, size_t percent = 0); //percent (optional), number between [0, 100], for small progress indicator + void setToolTip(const wxString& toolTipText, double percent = 0); //percent (optional), number between [0, 100], for small progress indicator void keepHidden(); //do not show windows again: avoid window flashing shortly before it is destroyed private: diff --git a/version/version.h b/version/version.h index 32e29ea9..2001e2b1 100644 --- a/version/version.h +++ b/version/version.h @@ -1,6 +1,6 @@ #include <wx/string.h> -namespace ffs3 +namespace zen { -const wxString currentVersion = wxT("3.16"); //internal linkage! +const wxString currentVersion = wxT("3.17"); //internal linkage! } diff --git a/version/version.rc b/version/version.rc index fa44c3f7..c7ca5865 100644 --- a/version/version.rc +++ b/version/version.rc @@ -1,2 +1,2 @@ -#define VER_FREEFILESYNC 3,16,0,0 -#define VER_FREEFILESYNC_STR "3.16\0" +#define VER_FREEFILESYNC 3,17,0,0 +#define VER_FREEFILESYNC_STR "3.17\0" |