diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:31:50 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:31:50 +0200 |
commit | 570916ddc376b09205125eaaab517561dfead9f0 (patch) | |
tree | 309a94f040707c402623e4f9f887346d1b561df7 | |
parent | 6.2 (diff) | |
download | FreeFileSync-570916ddc376b09205125eaaab517561dfead9f0.tar.gz FreeFileSync-570916ddc376b09205125eaaab517561dfead9f0.tar.bz2 FreeFileSync-570916ddc376b09205125eaaab517561dfead9f0.zip |
6.3
102 files changed, 3530 insertions, 3353 deletions
diff --git a/FreeFileSync/Build/Changelog.txt b/FreeFileSync/Build/Changelog.txt index c8b029a7..05561eea 100644 --- a/FreeFileSync/Build/Changelog.txt +++ b/FreeFileSync/Build/Changelog.txt @@ -1,3 +1,16 @@ +FreeFileSync 6.3 +---------------- +No wait time anymore while searching for recycle bin (Windows Vista and later) +Revised synchronization progress graph +Clean up "On completion" considering last usage +Fixed CTRL + C keyboard short cut in filter dialog (OS X) +Resolved static initialization order issues +Reduced disk accesses when resolving directory name +Added view filter labels +Updated translation files +Updated help file + + FreeFileSync 6.2 [2014-02-01] ----------------------------- New synchronization progress graph diff --git a/FreeFileSync/Build/Help/html/Command Line.html b/FreeFileSync/Build/Help/html/Command Line.html index bea7c61a..3123ba49 100644 --- a/FreeFileSync/Build/Help/html/Command Line.html +++ b/FreeFileSync/Build/Help/html/Command Line.html @@ -83,7 +83,7 @@ and check if synchronization completed successfully: <br> <ul STYLE="margin: 0"> - <LI>Disable checkbox <B>Show progress dialog</B> or have <B>On completion</B> automatically close the results dialog after synchronization. + <LI>Enable checkbox <B>Run minimized</B> or have <B>On completion</B> automatically close the results dialog after synchronization. <LI>Set error handling to <B>Stop</B> or <B>Ignore</B>. </ul> diff --git a/FreeFileSync/Build/Help/html/Schedule a Batch Job.html b/FreeFileSync/Build/Help/html/Schedule a Batch Job.html index 96f67fe3..eb746127 100644 --- a/FreeFileSync/Build/Help/html/Schedule a Batch Job.html +++ b/FreeFileSync/Build/Help/html/Schedule a Batch Job.html @@ -13,7 +13,7 @@ <LI>Create a new batch job via FreeFileSync's main dialog: <B>Menu → Program → Save as batch job...</B><BR> <LI>If the batch job shall run without user interaction or as part of an - unattended batch script, make sure that no popup dialog stops the progress:<BR>Disable checkbox <B>Show progress dialog</B> to avoid blocking while showing + unattended batch script, make sure that no popup dialog stops the progress:<BR>Enable checkbox <B>Run minimized</B> to avoid blocking while showing the result after synchronization. Alternatively you can leave this option checked and select the <i>On completion</i> action <B>Close progress dialog</B> located in synchronization settings. FreeFileSync will then show a progress dialog but close it automatically when it is finished.<BR> <br> diff --git a/FreeFileSync/Build/Help/img/SetupBatch.png b/FreeFileSync/Build/Help/img/SetupBatch.png Binary files differindex e1789917..88cb3e53 100644 --- a/FreeFileSync/Build/Help/img/SetupBatch.png +++ b/FreeFileSync/Build/Help/img/SetupBatch.png diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng index ebc87c28..7fc6076e 100644 --- a/FreeFileSync/Build/Languages/arabic.lng +++ b/FreeFileSync/Build/Languages/arabic.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>الحجم:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>تم تجاهل مقارنة المحتوى للملفات المستثناة %x.</target> + <source>Items differ in attributes only</source> <target>العناصر مختلفة في السمات فقط</target> @@ -307,9 +310,6 @@ <source>%x items/sec</source> <target>%x عنصر\الثانية</target> -<source>Configuration file %x loaded partially only.</source> -<target>تم تحميل ملف التكوين %x بشكلٍ جزئي فقط.</target> - <source>Show in Explorer</source> <target>إظهار في المستكشف</target> @@ -337,11 +337,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>طلب إحباط المهمة: في انتظار انتهاء المهمة الحالية...</target> -<source>Unable to create timestamp for versioning:</source> -<target>فشل إنشاء طبعة زمنية من أجل عملية الوسم حسب الإصدار:</target> - -<source>Cannot read the following XML elements:</source> -<target>لا يمكن قراءة عناصر XML التالية:</target> +<source>Unable to create time stamp for versioning:</source> +<target>تعذر إنشاء بصمة زمنية من أجل مفاضلة الزمنية:</target> <source>&Open...</source> <target>&فتح...</target> @@ -570,6 +567,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>حفظ ملف السجل %x...</target> +<source>Stopped</source> +<target>توقف</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة.</target> @@ -667,21 +667,6 @@ The command is triggered if: <source>Drag && drop</source> <target>سحب و إفلات</target> -<source>Close progress dialog</source> -<target>إنهاء نافذة حوار تقدم العملية</target> - -<source>Standby</source> -<target>وضع الاستعداد</target> - -<source>Log off</source> -<target>تسجيل الخروج</target> - -<source>Shut down</source> -<target>إيقاف التشغيل</target> - -<source>Hibernate</source> -<target>السبات</target> - <source>Alternate comparison settings</source> <target>خيارات المفارنة البديلة</target> @@ -787,6 +772,15 @@ The command is triggered if: <source>Save as batch job</source> <target>حفظ كمهمة دفعية</target> +<source>View type:</source> +<target>عرض النوع:</target> + +<source>Select view:</source> +<target>اختيار نمط العرض:</target> + +<source>Statistics:</source> +<target>إحصائيات:</target> + <source>Number of files and folders that will be created</source> <target>عدد الملفات و المجلدات التي سيتم إنشاؤها</target> @@ -888,15 +882,15 @@ The command is triggered if: <source>On completion:</source> <target>عند الانتهاء:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>تحديد اتجاه المزامنة بالاستعانة بقواعد بيانات الملفات</target> + <source>Start synchronization now?</source> <target>بدأ المزامنة الآن؟</target> <source>Variant:</source> <target>بديل</target> -<source>Statistics</source> -<target>إحصائيات</target> - <source>&Don't show this dialog again</source> <target>&لا تظهر نافذة الحوار هذه مرة ثانية</target> @@ -933,8 +927,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>إحباط المزامنة عند أول خطأ</target> -<source>Show progress dialog</source> -<target>إظهار نافذة حوار تقدم العملية</target> +<source>Run minimized</source> +<target>تشغيل بوضع التصغير</target> <source>Save log:</source> <target>حفظ السجل</target> @@ -951,12 +945,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&سلة المهملات</target> -<source>Delete on both sides</source> -<target>حذف على كلا الجانبين</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>حذف الملف في كلا الجانبين حتى إذا كان الملف محدداً على جانب واحد فقط</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>اختيار قوانين فلترة لاستثناء ملفات معينة من المزامنة. أدخل مسارات الملفات منسوبة إلى زوج المجلدات المقابل.</target> @@ -978,8 +966,8 @@ The command is triggered if: <source>Maximum:</source> <target>الحد الأقصى:</target> -<source>&Clear</source> -<target>&إزالة</target> +<source>&Reset</source> +<target>إعادة&</target> <source>The following settings are used for all synchronization jobs.</source> <target>هذه الإعدادات مستخدمة لجميع مهمات المزامنة</target> @@ -1077,8 +1065,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>بحث</target> -<source>Select View</source> -<target>اخيار طريقة العرض</target> +<source>View Settings</source> +<target>عرض الإعدادات</target> <source>Overview</source> <target>نظرة عامة</target> @@ -1177,12 +1165,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>استبعاد باستخدام عامل الفلترة:</target> -<source>Exclude temporarily</source> -<target>استبعاد مؤقتاً</target> - <source>Include temporarily</source> <target>شمول مؤقتاً</target> +<source>Exclude temporarily</source> +<target>استبعاد مؤقتاً</target> + <source>Delete</source> <target>حذف</target> @@ -1234,6 +1222,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&لا تحفظ</target> +<source>Delete selected configurations</source> +<target>حذف الخيارات المنتقاة</target> + <source>Filter</source> <target>عامل الفلترة</target> @@ -1285,8 +1276,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>تحديد كوضع افتراضي</target> -<source>All folders are in sync</source> -<target>جميع المجلدات متزامنة</target> +<source>All files are in sync</source> +<target>جميع الملفات في تزامن كامل</target> <source>Synchronization Settings</source> <target>إعدادات المزامنة</target> @@ -1306,6 +1297,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>جاري البحث عن تحديثات للبرنامج...</target> +<source>Close progress dialog</source> +<target>إنهاء نافذة حوار تقدم العملية</target> + +<source>Standby</source> +<target>وضع الاستعداد</target> + +<source>Log off</source> +<target>تسجيل الخروج</target> + +<source>Shut down</source> +<target>إيقاف التشغيل</target> + +<source>Hibernate</source> +<target>السبات</target> + <source>Scanning...</source> <target>جاري الفحص...</target> @@ -1327,15 +1333,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>التجهيز للبدأ...</target> -<source>Stopped</source> -<target>توقف</target> - <source>Completed</source> <target>انتهت العملية</target> <source>&Continue</source> <target>&مواصلة</target> +<source>Progress</source> +<target>التقدم</target> + <source>Log</source> <target>السجل</target> @@ -1434,8 +1440,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>البصمة الزمنية</target> -<source>Append a timestamp to each file name</source> -<target>إلحاق طابع زمني اسم كل ملف</target> +<source>Append a time stamp to each file name</source> +<target>إلحاق ختم زمني بكل اسم ملف</target> <source>File</source> <target>ملف</target> @@ -1572,9 +1578,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>تعذر نقل %x إلى سلة المحذوفات.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>فشل تصفح سلة المهملات من أجل الملف %x.</target> + <source>Cannot determine final path for %x.</source> <target>تعذر تحديد المسار النهائي لـ %x.</target> <source>Error Code %x:</source> <target>خطأ رقم %x:</target> +<source>Cannot read the following XML elements:</source> +<target>لا يمكن قراءة عناصر XML التالية:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>تم تحميل ملف التكوين %x بشكلٍ جزئي فقط.</target> + diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng index 639a7873..00305a41 100644 --- a/FreeFileSync/Build/Languages/chinese_simple.lng +++ b/FreeFileSync/Build/Languages/chinese_simple.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>大小:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>对于被排除的文件 %x 内容比较已跳过.</target> + <source>Items differ in attributes only</source> <target>项目仅是文件属性不同</target> @@ -292,9 +295,6 @@ <source>%x items/sec</source> <target>%x 个项目/秒</target> -<source>Configuration file %x loaded partially only.</source> -<target>配置文件 %x 只是部分载入.</target> - <source>Show in Explorer</source> <target>在Explorer中显示</target> @@ -322,12 +322,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>停止要求: 等待当前操作完成...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>无法为历史版本创建时间戳:</target> -<source>Cannot read the following XML elements:</source> -<target>无法读取如下XML元素:</target> - <source>&Open...</source> <target>打开(&O)...</target> @@ -555,6 +552,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>正在保存日志文件 %x...</target> +<source>Stopped</source> +<target>已停止</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>你可以切换至 FreeFileSync 的主窗口来解决这个问题.</target> @@ -647,21 +647,6 @@ The command is triggered if: <source>Drag && drop</source> <target>拖放</target> -<source>Close progress dialog</source> -<target>关闭进度对话框</target> - -<source>Standby</source> -<target>待机</target> - -<source>Log off</source> -<target>注销</target> - -<source>Shut down</source> -<target>关机</target> - -<source>Hibernate</source> -<target>休眠</target> - <source>Alternate comparison settings</source> <target>备用比较设置</target> @@ -767,6 +752,15 @@ The command is triggered if: <source>Save as batch job</source> <target>另存为批处理作业</target> +<source>View type:</source> +<target>视图类型:</target> + +<source>Select view:</source> +<target>选择视图:</target> + +<source>Statistics:</source> +<target>统计:</target> + <source>Number of files and folders that will be created</source> <target>将被创建的文件和文件夹数</target> @@ -868,15 +862,15 @@ The command is triggered if: <source>On completion:</source> <target>在完成时:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>借助数据库文件来检测同步的方向</target> + <source>Start synchronization now?</source> <target>现在开始同步吗?</target> <source>Variant:</source> <target>变化:</target> -<source>Statistics</source> -<target>统计</target> - <source>&Don't show this dialog again</source> <target>不要再显示这个对话框(&D)</target> @@ -913,8 +907,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>在遇到第一个错误时停止同步</target> -<source>Show progress dialog</source> -<target>显示进度对话框</target> +<source>Run minimized</source> +<target>以最小化运行</target> <source>Save log:</source> <target>保存日志:</target> @@ -931,12 +925,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>回收站(&R)</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>选择过滤器规则以将某些文件从同步中排除. 输入与相关的文件夹对相对的与文件路径.</target> @@ -958,8 +946,8 @@ The command is triggered if: <source>Maximum:</source> <target>最大:</target> -<source>&Clear</source> -<target>清除(&C)</target> +<source>&Reset</source> +<target>重置(&R)</target> <source>The following settings are used for all synchronization jobs.</source> <target>如下的设置使用于所有同步作业.</target> @@ -1054,8 +1042,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>查找</target> -<source>Select View</source> -<target>选择视图</target> +<source>View Settings</source> +<target>视图设置</target> <source>Overview</source> <target>摘要</target> @@ -1134,12 +1122,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>通过过滤器排除:</target> -<source>Exclude temporarily</source> -<target>暂时排除</target> - <source>Include temporarily</source> <target>暂时包括</target> +<source>Exclude temporarily</source> +<target>暂时排除</target> + <source>Delete</source> <target>删除</target> @@ -1191,6 +1179,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>不保存(&N)</target> +<source>Delete selected configurations</source> +<target>删除已选定的配置文件</target> + <source>Filter</source> <target>过滤器</target> @@ -1242,8 +1233,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>设置为默认值</target> -<source>All folders are in sync</source> -<target>所有文件夹都是同步的</target> +<source>All files are in sync</source> +<target>所有文件均是同步的</target> <source>Synchronization Settings</source> <target>同步设置</target> @@ -1263,6 +1254,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>正在搜索程序的更新...</target> +<source>Close progress dialog</source> +<target>关闭进度对话框</target> + +<source>Standby</source> +<target>待机</target> + +<source>Log off</source> +<target>注销</target> + +<source>Shut down</source> +<target>关机</target> + +<source>Hibernate</source> +<target>休眠</target> + <source>Scanning...</source> <target>正扫描...</target> @@ -1284,15 +1290,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>正在初始化...</target> -<source>Stopped</source> -<target>已停止</target> - <source>Completed</source> <target>完成</target> <source>&Continue</source> <target>继续(&C)</target> +<source>Progress</source> +<target>进度</target> + <source>Log</source> <target>日志</target> @@ -1381,8 +1387,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>时间戳</target> -<source>Append a timestamp to each file name</source> -<target>附加时间戳到每一个文件名</target> +<source>Append a time stamp to each file name</source> +<target>添加一个时间戳到每个文件名</target> <source>File</source> <target>文件</target> @@ -1504,9 +1510,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>无法将 %x 移动到回收站.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>为文件夹 %x 检查回收站失败.</target> + <source>Cannot determine final path for %x.</source> <target>无法确定 %x 的最终路径.</target> <source>Error Code %x:</source> <target>错误代码 %x:</target> +<source>Cannot read the following XML elements:</source> +<target>无法读取如下XML元素:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>配置文件 %x 只是部分载入.</target> + diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng index ea5801d3..ae702dbe 100644 --- a/FreeFileSync/Build/Languages/chinese_traditional.lng +++ b/FreeFileSync/Build/Languages/chinese_traditional.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>大小:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>內容比對已跳過排除檔案 %x。</target> + <source>Items differ in attributes only</source> <target>只有項目的屬性不同</target> @@ -292,9 +295,6 @@ <source>%x items/sec</source> <target>%x 個項目/秒</target> -<source>Configuration file %x loaded partially only.</source> -<target>只載入設定檔 %x 的一部份。</target> - <source>Show in Explorer</source> <target>在資源管理器中顯示</target> @@ -322,11 +322,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>停止要求:等待目前的操作結束...</target> -<source>Unable to create timestamp for versioning:</source> -<target>無法新建版本控制的時間戳記:</target> - -<source>Cannot read the following XML elements:</source> -<target>無法讀取下列XML元素:</target> +<source>Unable to create time stamp for versioning:</source> +<target>無法新建時間戳記的版本控制:</target> <source>&Open...</source> <target>開啟(&O)...</target> @@ -362,7 +359,7 @@ <target>3. 按下 '開始'。</target> <source>To get started just import a .ffs_batch file.</source> -<target>開始只是導入一個.ffs_batch檔。</target> +<target>若要開始只要導入一個.ffs_batch檔。</target> <source>Folders to watch:</source> <target>要監看的資料夾:</target> @@ -555,6 +552,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>正在儲存日誌檔 %x...</target> +<source>Stopped</source> +<target>已停止</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>您可以切換到FreeFileSync的主視窗中來解決此問題。</target> @@ -647,21 +647,6 @@ The command is triggered if: <source>Drag && drop</source> <target>拖放</target> -<source>Close progress dialog</source> -<target>關閉進度對話框</target> - -<source>Standby</source> -<target>待機</target> - -<source>Log off</source> -<target>登出</target> - -<source>Shut down</source> -<target>關機</target> - -<source>Hibernate</source> -<target>休眠</target> - <source>Alternate comparison settings</source> <target>備用比對設定</target> @@ -767,6 +752,15 @@ The command is triggered if: <source>Save as batch job</source> <target>另存為批次處理作業</target> +<source>View type:</source> +<target>檢視類型:</target> + +<source>Select view:</source> +<target>選擇視圖:</target> + +<source>Statistics:</source> +<target>統計資料:</target> + <source>Number of files and folders that will be created</source> <target>將被新建的檔案和資料夾數量</target> @@ -868,15 +862,15 @@ The command is triggered if: <source>On completion:</source> <target>完成後:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>檢測同步方向和資料庫檔案的說明</target> + <source>Start synchronization now?</source> <target>現在開始同步?</target> <source>Variant:</source> <target>變數:</target> -<source>Statistics</source> -<target>統計</target> - <source>&Don't show this dialog again</source> <target>不要再顯示此對話框(&D)</target> @@ -913,8 +907,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>在第一個錯誤出現停止同步</target> -<source>Show progress dialog</source> -<target>顯示進度對話框</target> +<source>Run minimized</source> +<target>最小化執行</target> <source>Save log:</source> <target>儲存日誌</target> @@ -931,12 +925,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>資源回收筒(&R)</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>選擇從同步中排除某些檔案的篩選器規則。輸入相對於其對應的配對資料夾路徑。</target> @@ -958,8 +946,8 @@ The command is triggered if: <source>Maximum:</source> <target>最大:</target> -<source>&Clear</source> -<target>清除(&C)</target> +<source>&Reset</source> +<target>重置(&R)</target> <source>The following settings are used for all synchronization jobs.</source> <target>以下設定用於所有同步作業。</target> @@ -1057,8 +1045,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>尋找</target> -<source>Select View</source> -<target>選擇檢視</target> +<source>View Settings</source> +<target>檢視設定</target> <source>Overview</source> <target>摘要</target> @@ -1137,12 +1125,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>透過篩選器排除:</target> -<source>Exclude temporarily</source> -<target>暫時排除</target> - <source>Include temporarily</source> <target>暫時包括</target> +<source>Exclude temporarily</source> +<target>暫時排除</target> + <source>Delete</source> <target>刪除</target> @@ -1194,6 +1182,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>不儲存(&N)</target> +<source>Delete selected configurations</source> +<target>刪除選定的配置</target> + <source>Filter</source> <target>篩選器</target> @@ -1245,8 +1236,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>設為預設值</target> -<source>All folders are in sync</source> -<target>所有資料夾都是同步的</target> +<source>All files are in sync</source> +<target>所有檔案都在同步</target> <source>Synchronization Settings</source> <target>同步設定</target> @@ -1266,6 +1257,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>正在搜尋程式更新...</target> +<source>Close progress dialog</source> +<target>關閉進度對話框</target> + +<source>Standby</source> +<target>待機</target> + +<source>Log off</source> +<target>登出</target> + +<source>Shut down</source> +<target>關機</target> + +<source>Hibernate</source> +<target>休眠</target> + <source>Scanning...</source> <target>正在掃瞄...</target> @@ -1287,15 +1293,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>正在初始化...</target> -<source>Stopped</source> -<target>已停止</target> - <source>Completed</source> <target>已完成</target> <source>&Continue</source> <target>繼續(&C)</target> +<source>Progress</source> +<target>進展</target> + <source>Log</source> <target>日誌</target> @@ -1384,7 +1390,7 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>時間戳記</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>將時間戳記附加到每個檔案名稱上</target> <source>File</source> @@ -1507,9 +1513,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>無法將 %x 移動到資源回收筒。</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>正在檢查資源回收筒的資料夾 %x 失敗。</target> + <source>Cannot determine final path for %x.</source> <target>無法確定最後路徑為 %x。</target> <source>Error Code %x:</source> <target>錯誤代碼 %x:</target> +<source>Cannot read the following XML elements:</source> +<target>無法讀取下列XML元素:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>只載入設定檔 %x 的一部份。</target> + diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng index b3077965..725c8f46 100644 --- a/FreeFileSync/Build/Languages/croatian.lng +++ b/FreeFileSync/Build/Languages/croatian.lng @@ -7,9 +7,6 @@ <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>MyButton</source> -<target></target> - <source>Both sides have changed since last synchronization.</source> <target>Obje su strane promjenjene od posljednje sinkronizacije.</target> @@ -118,6 +115,9 @@ <source>Size:</source> <target>Veličina:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Usporedba sadržaja je preskočena za izdvojene datoteke %x.</target> + <source>Items differ in attributes only</source> <target>Stavke se razlikuju samo u atributima</target> @@ -301,9 +301,6 @@ <source>%x items/sec</source> <target>%x stavki/sek</target> -<source>Configuration file %x loaded partially only.</source> -<target>Datoteka postavki %x učitana samo djelomično</target> - <source>Show in Explorer</source> <target>Prikaži u Exploreru</target> @@ -331,11 +328,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Zaustavljam naredbu: Čekam trenutni zadatak da se dovrši...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Nije moguća izrada vremenske oznake za označavanje:</target> - -<source>Cannot read the following XML elements:</source> -<target>Ne mogu čitati slijedeće XML elemente</target> +<source>Unable to create time stamp for versioning:</source> +<target>Nije moguće izraditi vremensku oznaku</target> <source>&Open...</source> <target>&Otvori...</target> @@ -564,6 +558,9 @@ Naredba će biti pokrenuta ako se: <source>Saving log file %x...</source> <target>Spremam izješće %x...</target> +<source>Stopped</source> +<target>Zaustavljeno</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Možete prijeći na glavni prozor FreeFileSynca da bi rješili ovaj problem.</target> @@ -658,21 +655,6 @@ Naredba će biti pokrenuta ako se: <source>Drag && drop</source> <target>Povuci && ispusti</target> -<source>Close progress dialog</source> -<target>Zatvori prozor zadatka</target> - -<source>Standby</source> -<target>Spavaj</target> - -<source>Log off</source> -<target>Odlogiraj se</target> - -<source>Shut down</source> -<target>Isključi računalo</target> - -<source>Hibernate</source> -<target>Hibernacija</target> - <source>Alternate comparison settings</source> <target>Alternativne postavke usporedbe</target> @@ -778,6 +760,15 @@ Naredba će biti pokrenuta ako se: <source>Save as batch job</source> <target>Spremi kao Slijedni zadatak</target> +<source>View type:</source> +<target>Vrsta prikaza:</target> + +<source>Select view:</source> +<target>Prikaz odabira:</target> + +<source>Statistics:</source> +<target>Statistika:</target> + <source>Number of files and folders that will be created</source> <target>Broj datoteka i foldera koji će se stvoriti</target> @@ -879,15 +870,15 @@ Naredba će biti pokrenuta ako se: <source>On completion:</source> <target>Pri završetku:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Otkrij putanju sinkronizacije pomoću baze</target> + <source>Start synchronization now?</source> <target>Započeti sinkronizaciju sada?</target> <source>Variant:</source> <target>Opcija:</target> -<source>Statistics</source> -<target>Statistika</target> - <source>&Don't show this dialog again</source> <target>&Nemoj više prikazivati ovaj dijaloški prozor</target> @@ -924,8 +915,8 @@ Naredba će biti pokrenuta ako se: <source>Stop synchronization at first error</source> <target>Zaustavi sinkronizaciju pri prvoj pogrešci</target> -<source>Show progress dialog</source> -<target>Prikaži napredak</target> +<source>Run minimized</source> +<target>Pokreni minimizirano</target> <source>Save log:</source> <target>Spremi izvještaj:</target> @@ -942,12 +933,6 @@ Naredba će biti pokrenuta ako se: <source>&Recycle bin</source> <target>&Koš za smeće</target> -<source>Delete on both sides</source> -<target>Izbriši na obje strane</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Izbriši na obje strane iako je označena datoteka samo na jednoj strani</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Odaberite filterska pravila za odvojiti određene datoteke iz sinkronizacije. Unesite putanju datoteka prema njihovim odgovarajućim parovima.</target> @@ -969,8 +954,8 @@ Naredba će biti pokrenuta ako se: <source>Maximum:</source> <target>Maksimum:</target> -<source>&Clear</source> -<target>&Brisati</target> +<source>&Reset</source> +<target>&Resetiraj</target> <source>The following settings are used for all synchronization jobs.</source> <target>Ove postavke se koriste za sve sinkronizacijske zadatke</target> @@ -1068,8 +1053,8 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Find</source> <target>Pronađi</target> -<source>Select View</source> -<target>Odaberi pogled</target> +<source>View Settings</source> +<target>Postavke prikaza</target> <source>Overview</source> <target>Pregled</target> @@ -1156,12 +1141,12 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Exclude via filter:</source> <target>Isključi preko filtra:</target> -<source>Exclude temporarily</source> -<target>Izuzmi privremeno</target> - <source>Include temporarily</source> <target>Trenutno uključi</target> +<source>Exclude temporarily</source> +<target>Izuzmi privremeno</target> + <source>Delete</source> <target>Izbriši</target> @@ -1213,6 +1198,9 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Do&n't save</source> <target>&Nemoj spremiti</target> +<source>Delete selected configurations</source> +<target>Izbriši odabrane postavke</target> + <source>Filter</source> <target>Filtriranje</target> @@ -1264,8 +1252,8 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Set as default</source> <target>Postavi kao zadano</target> -<source>All folders are in sync</source> -<target>Sve mape su u sinkronizaciji</target> +<source>All files are in sync</source> +<target>Sve datoteke su u sinkronizaciji</target> <source>Synchronization Settings</source> <target>Postavke Sinkronizacije</target> @@ -1285,6 +1273,21 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Searching for program updates...</source> <target>Pretražujem ažuriranja programa...</target> +<source>Close progress dialog</source> +<target>Zatvori prozor zadatka</target> + +<source>Standby</source> +<target>Spavaj</target> + +<source>Log off</source> +<target>Odlogiraj se</target> + +<source>Shut down</source> +<target>Isključi računalo</target> + +<source>Hibernate</source> +<target>Hibernacija</target> + <source>Scanning...</source> <target>Tražim...</target> @@ -1306,15 +1309,15 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Initializing...</source> <target>Učitavam</target> -<source>Stopped</source> -<target>Zaustavljeno</target> - <source>Completed</source> <target>Završeno</target> <source>&Continue</source> <target>&Nastavi</target> +<source>Progress</source> +<target>Napredak</target> + <source>Log</source> <target>Dnevnik</target> @@ -1407,8 +1410,8 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Time stamp</source> <target>Vremenska oznaka</target> -<source>Append a timestamp to each file name</source> -<target>Dodaj vremensku oznaku svakom imenu datoteke</target> +<source>Append a time stamp to each file name</source> +<target>Dodijeli vremensku oznaku za svaki naziv datoteke</target> <source>File</source> <target>Datoteka</target> @@ -1536,9 +1539,18 @@ To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške <source>Unable to move %x to the recycle bin.</source> <target>Nije moguće prebaciti %x u koš za smeće.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Provjeravanje koša za smeće neuspješno za mapu %x.</target> + <source>Cannot determine final path for %x.</source> <target>Ne mogu odrediti završnu putanju za %x.</target> <source>Error Code %x:</source> <target>Pogreška broj %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Ne mogu čitati slijedeće XML elemente</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Datoteka postavki %x učitana samo djelomično</target> + diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng index d2f5b587..55c64427 100644 --- a/FreeFileSync/Build/Languages/czech.lng +++ b/FreeFileSync/Build/Languages/czech.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Velikost:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Porovnání obsahu bylo vynecháno pro soubory %x.</target> + <source>Items differ in attributes only</source> <target>Položky se liší pouze ve vlastnostech</target> @@ -298,9 +301,6 @@ <source>%x items/sec</source> <target>%x položek/s</target> -<source>Configuration file %x loaded partially only.</source> -<target>Konfigurace ze souboru %x byla načtena jen částečně.</target> - <source>Show in Explorer</source> <target>Zobrazit v Průzkumníkovi</target> @@ -328,12 +328,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Zastavování: Čekání na dokončení právě probíhající operace...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Nelze vytvořit časové značky verzování:</target> -<source>Cannot read the following XML elements:</source> -<target>Nelze načíst následující XML elementy:</target> - <source>&Open...</source> <target>&Otevřít...</target> @@ -561,6 +558,9 @@ Příkaz je spuštěn když: <source>Saving log file %x...</source> <target>Ukládání žurnálu %x...</target> +<source>Stopped</source> +<target>Zastaveno</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>K odstranění tohoto problému se přepněte do hlavního okna FreeFileSync.</target> @@ -655,21 +655,6 @@ Příkaz je spuštěn když: <source>Drag && drop</source> <target>Přetáhni sem && pusť</target> -<source>Close progress dialog</source> -<target>Zavřít průběh zpracování</target> - -<source>Standby</source> -<target>Přepnout do úsporného režimu</target> - -<source>Log off</source> -<target>Odhlásit uživatele</target> - -<source>Shut down</source> -<target>Vypnout počítač</target> - -<source>Hibernate</source> -<target>Přepnout do režimu spánku</target> - <source>Alternate comparison settings</source> <target>Jiné nastavení porovnání</target> @@ -775,6 +760,15 @@ Příkaz je spuštěn když: <source>Save as batch job</source> <target>Uložit jako dávku</target> +<source>View type:</source> +<target>Typ zobrazení:</target> + +<source>Select view:</source> +<target>Výběr zobrazení:</target> + +<source>Statistics:</source> +<target>Statistika</target> + <source>Number of files and folders that will be created</source> <target>Počet souborů a složek k vytvoření</target> @@ -876,15 +870,15 @@ Příkaz je spuštěn když: <source>On completion:</source> <target>Po dokončení:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Určit směr synchronizace pomocí databáze</target> + <source>Start synchronization now?</source> <target>Začít synchronizovat nyní?</target> <source>Variant:</source> <target>Varianta:</target> -<source>Statistics</source> -<target>Statistika</target> - <source>&Don't show this dialog again</source> <target>Tento dialog již &nezobrazovat</target> @@ -921,8 +915,8 @@ Příkaz je spuštěn když: <source>Stop synchronization at first error</source> <target>Ukončit synchronizaci při první chybě</target> -<source>Show progress dialog</source> -<target>Zobrazit průběh zpracování</target> +<source>Run minimized</source> +<target>Minimalizovat</target> <source>Save log:</source> <target>Uložit žurnál:</target> @@ -939,12 +933,6 @@ Příkaz je spuštěn když: <source>&Recycle bin</source> <target>&Koš</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Nastavte pravidla filtru pro vynechání některých souborů ze synchronizace. Zadávajte cesty relativně k odpovídající složce.</target> @@ -966,7 +954,7 @@ Příkaz je spuštěn když: <source>Maximum:</source> <target>Do:</target> -<source>&Clear</source> +<source>&Reset</source> <target>&Smazat</target> <source>The following settings are used for all synchronization jobs.</source> @@ -1062,8 +1050,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Najít</target> -<source>Select View</source> -<target>Zobrazení</target> +<source>View Settings</source> +<target>Nastavení zobrazení</target> <source>Overview</source> <target>Přehled</target> @@ -1150,12 +1138,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Vynechat pomocí filtru:</target> -<source>Exclude temporarily</source> -<target>Vynechat dočasně</target> - <source>Include temporarily</source> <target>Přidat dočasně</target> +<source>Exclude temporarily</source> +<target>Vynechat dočasně</target> + <source>Delete</source> <target>Smazat</target> @@ -1207,6 +1195,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&Neukládat</target> +<source>Delete selected configurations</source> +<target>Smazat vybrané konfigurace</target> + <source>Filter</source> <target>Filtr</target> @@ -1258,8 +1249,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Nastavit jako výchozí</target> -<source>All folders are in sync</source> -<target>Všechny složky jsou synchronizovány</target> +<source>All files are in sync</source> +<target>Všechny soubory jsou synchronizovány</target> <source>Synchronization Settings</source> <target>Nastavení synchronizace</target> @@ -1279,6 +1270,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Hledání aktualizací programu ...</target> +<source>Close progress dialog</source> +<target>Zavřít průběh zpracování</target> + +<source>Standby</source> +<target>Přepnout do úsporného režimu</target> + +<source>Log off</source> +<target>Odhlásit uživatele</target> + +<source>Shut down</source> +<target>Vypnout počítač</target> + +<source>Hibernate</source> +<target>Přepnout do režimu spánku</target> + <source>Scanning...</source> <target>Zpracovávání...</target> @@ -1300,15 +1306,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Inicializace...</target> -<source>Stopped</source> -<target>Zastaveno</target> - <source>Completed</source> <target>Hotovo</target> <source>&Continue</source> <target>&Pokračovat</target> +<source>Progress</source> +<target>Průběh</target> + <source>Log</source> <target>Záznam zpracování</target> @@ -1401,7 +1407,7 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Časová značka</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Přidat časovou značku ke jménu souboru</target> <source>File</source> @@ -1530,9 +1536,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Není možné přesunout %x do Koše.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Selhala kontrola Koše pro složku %x</target> + <source>Cannot determine final path for %x.</source> <target>Nelze určit výslednou cestu pro %x.</target> <source>Error Code %x:</source> <target>Chybový kód %x</target> +<source>Cannot read the following XML elements:</source> +<target>Nelze načíst následující XML elementy:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Konfigurace ze souboru %x byla načtena jen částečně.</target> + diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng index d7f9d27c..37e93512 100644 --- a/FreeFileSync/Build/Languages/danish.lng +++ b/FreeFileSync/Build/Languages/danish.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Størrelse:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Indholdsanalyse udeladt for ekskluderede filer %x</target> + <source>Items differ in attributes only</source> <target>Enhederne har kun attributter til forskel</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x emner/sek</target> -<source>Configuration file %x loaded partially only.</source> -<target>Indstillingsfilen %x er kun delvist indlæst.</target> - <source>Show in Explorer</source> <target>Åben filplacering</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Afbrydelse: Venter på aktuel opgave afsluttes...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Kunne ikke oprette versioneringstid:</target> - -<source>Cannot read the following XML elements:</source> -<target>Kan ikke læse følgende XML emner:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Kan ikke oprette tidsstempel til versionering:</target> <source>&Open...</source> <target>&Åben...</target> @@ -558,6 +555,9 @@ Kommandoen udføres hvis: <source>Saving log file %x...</source> <target>Gemmer rapport %x...</target> +<source>Stopped</source> +<target>Afbrudt</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Skift til FreeFileSyncs hovedvindue for at løse problemet.</target> @@ -651,21 +651,6 @@ Kommandoen udføres hvis: <source>Drag && drop</source> <target>Træk emner hertil</target> -<source>Close progress dialog</source> -<target>Luk dialogen</target> - -<source>Standby</source> -<target>Standby</target> - -<source>Log off</source> -<target>Log af</target> - -<source>Shut down</source> -<target>Luk ned</target> - -<source>Hibernate</source> -<target>Dvale</target> - <source>Alternate comparison settings</source> <target>Tilpas analyse</target> @@ -771,6 +756,15 @@ Kommandoen udføres hvis: <source>Save as batch job</source> <target>Gem som batchfil</target> +<source>View type:</source> +<target>Visning:</target> + +<source>Select view:</source> +<target>Vælg visning:</target> + +<source>Statistics:</source> +<target>Statistik:</target> + <source>Number of files and folders that will be created</source> <target>Antal filer og mapper der oprettes</target> @@ -872,15 +866,15 @@ Kommandoen udføres hvis: <source>On completion:</source> <target>Ved gennemført:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Genkend synkretninger ved hjælp af databasefiler</target> + <source>Start synchronization now?</source> <target>Synkroniser nu?</target> <source>Variant:</source> <target>Jobtype:</target> -<source>Statistics</source> -<target>Statistik</target> - <source>&Don't show this dialog again</source> <target>&Vis ikke igen</target> @@ -917,8 +911,8 @@ Kommandoen udføres hvis: <source>Stop synchronization at first error</source> <target>Stop synkronisering ved første fejl</target> -<source>Show progress dialog</source> -<target>Vis fremskridt</target> +<source>Run minimized</source> +<target>Kør minimeret</target> <source>Save log:</source> <target>Gem log:</target> @@ -935,12 +929,6 @@ Kommandoen udføres hvis: <source>&Recycle bin</source> <target>&Papirkurv</target> -<source>Delete on both sides</source> -<target>Slet på begge sider</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Slet på begge sider selvom selvom filen kun er valgt på en side</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Angiv filterregler til ekskludering af bestemte filer fra synkroniseringen. Filstier skal relatere til kildemapperne.</target> @@ -962,8 +950,8 @@ Kommandoen udføres hvis: <source>Maximum:</source> <target>Maksimum:</target> -<source>&Clear</source> -<target>&Ryd</target> +<source>&Reset</source> +<target>&Nulstil</target> <source>The following settings are used for all synchronization jobs.</source> <target>Disse indstillinger gælder alle synkroniseringer.</target> @@ -1058,8 +1046,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Søg</target> -<source>Select View</source> -<target>Tilpas visning</target> +<source>View Settings</source> +<target>Visninger</target> <source>Overview</source> <target>Oversigt</target> @@ -1142,12 +1130,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Ekskluder m. filter:</target> -<source>Exclude temporarily</source> -<target>Ekskluder midlertidigt</target> - <source>Include temporarily</source> <target>Inkluder midlertidigt</target> +<source>Exclude temporarily</source> +<target>Ekskluder midlertidigt</target> + <source>Delete</source> <target>Slet</target> @@ -1199,6 +1187,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&Gem ikke</target> +<source>Delete selected configurations</source> +<target>Slet valgte indstillinger</target> + <source>Filter</source> <target>Filter</target> @@ -1250,8 +1241,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Sæt som standard</target> -<source>All folders are in sync</source> -<target>Alle mapper er synkrone</target> +<source>All files are in sync</source> +<target>Alt er synkroniseret</target> <source>Synchronization Settings</source> <target>Synkroniseringsindstillinger</target> @@ -1271,6 +1262,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Søger efter opdatering...</target> +<source>Close progress dialog</source> +<target>Luk dialogen</target> + +<source>Standby</source> +<target>Standby</target> + +<source>Log off</source> +<target>Log af</target> + +<source>Shut down</source> +<target>Luk ned</target> + +<source>Hibernate</source> +<target>Dvale</target> + <source>Scanning...</source> <target>Skanner...</target> @@ -1292,15 +1298,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Forbereder...</target> -<source>Stopped</source> -<target>Afbrudt</target> - <source>Completed</source> <target>Gennemført</target> <source>&Continue</source> <target>&Fortsæt</target> +<source>Progress</source> +<target>Fremskridt</target> + <source>Log</source> <target>Log</target> @@ -1391,7 +1397,7 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Tidsstempel</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Føj tidsstempel til hvert filnavn</target> <source>File</source> @@ -1517,9 +1523,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Kunne ikke flytte %x til papirkurv.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Check papirkurv fejlede for mappen %x</target> + <source>Cannot determine final path for %x.</source> <target>Kan ikke bestemme endelig sti for %x</target> <source>Error Code %x:</source> <target>Fejlkode %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Kan ikke læse følgende XML emner:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Indstillingsfilen %x er kun delvist indlæst.</target> + diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng index bb2c19fb..95974153 100644 --- a/FreeFileSync/Build/Languages/dutch.lng +++ b/FreeFileSync/Build/Languages/dutch.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Grootte:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Vergelijking voor uitgesloten bestanden %x is overgeslagen.</target> + <source>Items differ in attributes only</source> <target>Items verschillen alleen in attributen</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x items per seconde</target> -<source>Configuration file %x loaded partially only.</source> -<target>Configuratiebestand %x alleen deels geladen.</target> - <source>Show in Explorer</source> <target>Toon in Verkenner</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Stop aangegeven: Wachten tot de huidige handeling klaar is...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Niet mogelijk om een timestamp voor versiebeheer te maken:</target> - -<source>Cannot read the following XML elements:</source> -<target>Kan de volgende XML elementen niet lezen:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Aanmaken van timestamp voor versiebeheer mislukt:</target> <source>&Open...</source> <target>&Open...</target> @@ -558,6 +555,9 @@ De opdracht word geactiveerd als: <source>Saving log file %x...</source> <target>Opslaan van logbestand %x...</target> +<source>Stopped</source> +<target>Gestopt</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>U kunt naar het hoofdvenster overschakelen om dit probleem op te lossen.</target> @@ -651,21 +651,6 @@ De opdracht word geactiveerd als: <source>Drag && drop</source> <target>Drag en drop</target> -<source>Close progress dialog</source> -<target>Sluit voortgangsvenster</target> - -<source>Standby</source> -<target>Stand-by</target> - -<source>Log off</source> -<target>Afmelden</target> - -<source>Shut down</source> -<target>Afsluiten</target> - -<source>Hibernate</source> -<target>Slaapstand</target> - <source>Alternate comparison settings</source> <target>Alternatieve vergelijkings instellingen</target> @@ -771,6 +756,15 @@ De opdracht word geactiveerd als: <source>Save as batch job</source> <target>Opslaan als batch opdracht</target> +<source>View type:</source> +<target>Laat type zien:</target> + +<source>Select view:</source> +<target>Selecteer uiterlijk:</target> + +<source>Statistics:</source> +<target>Statistieken:</target> + <source>Number of files and folders that will be created</source> <target>Aantal bestanden en mappen die zullen worden aangemaakt</target> @@ -872,15 +866,15 @@ De opdracht word geactiveerd als: <source>On completion:</source> <target>Bij voltooiing:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detecteer synchronisatierichtingen met behulp van databasebestanden</target> + <source>Start synchronization now?</source> <target>Start de synchronisatie nu?</target> <source>Variant:</source> <target>Variant:</target> -<source>Statistics</source> -<target>Statistieken</target> - <source>&Don't show this dialog again</source> <target>Laat deze dialoog &niet meer zien</target> @@ -917,8 +911,8 @@ De opdracht word geactiveerd als: <source>Stop synchronization at first error</source> <target>Stop synchronisatie bij eerste foutmelding</target> -<source>Show progress dialog</source> -<target>Toon voortgangsdialoogvenster</target> +<source>Run minimized</source> +<target>Draai geminimaliseerd</target> <source>Save log:</source> <target>Bewaar logbestand:</target> @@ -930,17 +924,11 @@ De opdracht word geactiveerd als: <target>Limiteer maximaal aantal log bestanden</target> <source>How can I schedule a batch job?</source> -<target>Hoe kan ik een batch taak inroosteren?</target> +<target>Hoe kan ik een batch opdracht inroosteren?</target> <source>&Recycle bin</source> <target>&Prullebak</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Selecteer filter regels om bepaalde bestanden uit te sluiten van synchronisatie. Geef bestandspaden in die relatief zijn aan hun corresponderende folderparen.</target> @@ -962,8 +950,8 @@ De opdracht word geactiveerd als: <source>Maximum:</source> <target>Maximum:</target> -<source>&Clear</source> -<target>&Leegmaken</target> +<source>&Reset</source> +<target>&Reset</target> <source>The following settings are used for all synchronization jobs.</source> <target>De volgende instellingen worden gebruikt voor alle synchronisaties.</target> @@ -1061,8 +1049,8 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Find</source> <target>Vind</target> -<source>Select View</source> -<target>Selecteer zichtbaarheid</target> +<source>View Settings</source> +<target>Instellingen</target> <source>Overview</source> <target>Overzicht</target> @@ -1145,12 +1133,12 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Exclude via filter:</source> <target>Sluit via filter uit:</target> -<source>Exclude temporarily</source> -<target>Tijdelijk uitsluiten</target> - <source>Include temporarily</source> <target>Tijdelijk opnemen</target> +<source>Exclude temporarily</source> +<target>Tijdelijk uitsluiten</target> + <source>Delete</source> <target>Verwijderen</target> @@ -1202,6 +1190,9 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Do&n't save</source> <target>&Niet opslaan</target> +<source>Delete selected configurations</source> +<target>Verwijder geselecteerde configuraties</target> + <source>Filter</source> <target>Filter</target> @@ -1253,8 +1244,8 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Set as default</source> <target>Instellen als standaard</target> -<source>All folders are in sync</source> -<target>Alle mappen zijn gesynchroniseerd</target> +<source>All files are in sync</source> +<target>Alle bestanden zijn gesynchroniseerd</target> <source>Synchronization Settings</source> <target>Synchronisatie instellingen</target> @@ -1274,6 +1265,21 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Searching for program updates...</source> <target>Bezig met zoeken naar programma updates...</target> +<source>Close progress dialog</source> +<target>Sluit voortgangsvenster</target> + +<source>Standby</source> +<target>Stand-by</target> + +<source>Log off</source> +<target>Afmelden</target> + +<source>Shut down</source> +<target>Afsluiten</target> + +<source>Hibernate</source> +<target>Slaapstand</target> + <source>Scanning...</source> <target>Doorzoekt...</target> @@ -1295,15 +1301,15 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Initializing...</source> <target>Initialiseren...</target> -<source>Stopped</source> -<target>Gestopt</target> - <source>Completed</source> <target>Voltooid</target> <source>&Continue</source> <target>&Doorgaan</target> +<source>Progress</source> +<target>Voortgang</target> + <source>Log</source> <target>Log</target> @@ -1394,8 +1400,8 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Time stamp</source> <target>Tijdstempel</target> -<source>Append a timestamp to each file name</source> -<target>Voeg een timestamp aan elke bestandsnaam toe</target> +<source>Append a time stamp to each file name</source> +<target>Voeg een timestamp toe aan elke bestandsnaam</target> <source>File</source> <target>Bestand</target> @@ -1520,9 +1526,18 @@ Dit garandeert een consistente staat, zelfs in het geval van een serieuze fout. <source>Unable to move %x to the recycle bin.</source> <target>Kan %x niet verplaatsen naar de prullenbak.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Controleren van prullenbak voor map %x mislukt.</target> + <source>Cannot determine final path for %x.</source> <target>Kan pad voor %x niet vaststellen.</target> <source>Error Code %x:</source> <target>Foutcode %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Kan de volgende XML elementen niet lezen:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Configuratiebestand %x alleen deels geladen.</target> + diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng index ae1d0cb4..b4e1b0e6 100644 --- a/FreeFileSync/Build/Languages/english_uk.lng +++ b/FreeFileSync/Build/Languages/english_uk.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Size:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Content comparison was skipped for excluded files %x.</target> + <source>Items differ in attributes only</source> <target>Items differ in attributes only</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x items/sec</target> -<source>Configuration file %x loaded partially only.</source> -<target>Configuration file %x loaded partially only.</target> - <source>Show in Explorer</source> <target>Show in Explorer</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Stop requested: Waiting for current operation to finish...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Unable to create timestamp for versioning:</target> - -<source>Cannot read the following XML elements:</source> -<target>Cannot read the following XML elements:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Unable to create time stamp for versioning:</target> <source>&Open...</source> <target>&Open...</target> @@ -547,7 +544,7 @@ The command is triggered if: <target>Synchronisation completed with errors</target> <source>Synchronization completed with warnings</source> -<target>Synchronization completed with warnings</target> +<target>Synchronisation completed with warnings</target> <source>Nothing to synchronize</source> <target>Nothing to synchronise</target> @@ -558,6 +555,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>Saving log file %x...</target> +<source>Stopped</source> +<target>Stopped</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>You can switch to FreeFileSync's main window to resolve this issue.</target> @@ -651,21 +651,6 @@ The command is triggered if: <source>Drag && drop</source> <target>Drag && drop</target> -<source>Close progress dialog</source> -<target>Close progress dialogue</target> - -<source>Standby</source> -<target>Standby</target> - -<source>Log off</source> -<target>Log off</target> - -<source>Shut down</source> -<target>Shut down</target> - -<source>Hibernate</source> -<target>Hibernate</target> - <source>Alternate comparison settings</source> <target>Alternate comparison settings</target> @@ -771,6 +756,15 @@ The command is triggered if: <source>Save as batch job</source> <target>Save as batch job</target> +<source>View type:</source> +<target>View type:</target> + +<source>Select view:</source> +<target>Select view:</target> + +<source>Statistics:</source> +<target>Statistics:</target> + <source>Number of files and folders that will be created</source> <target>Number of files and folders that will be created</target> @@ -872,15 +866,15 @@ The command is triggered if: <source>On completion:</source> <target>On completion:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detect synchronisation directions with the help of database files</target> + <source>Start synchronization now?</source> <target>Start synchronisation now?</target> <source>Variant:</source> <target>Variant:</target> -<source>Statistics</source> -<target>Statistics</target> - <source>&Don't show this dialog again</source> <target>&Don't show this dialogue again</target> @@ -900,7 +894,7 @@ The command is triggered if: <target>Synchronising...</target> <source>Minimize to notification area</source> -<target>Minimize to notification area</target> +<target>Minimise to notification area</target> <source>Close</source> <target>Close</target> @@ -917,8 +911,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>Stop synchronisation at first error</target> -<source>Show progress dialog</source> -<target>Show progress dialogue</target> +<source>Run minimized</source> +<target>Run minimised</target> <source>Save log:</source> <target>Save log:</target> @@ -935,12 +929,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&Recycle bin</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Select filter rules to exclude certain files from synchronisation. Enter file paths relative to their corresponding folder pair.</target> @@ -962,8 +950,8 @@ The command is triggered if: <source>Maximum:</source> <target>Maximum:</target> -<source>&Clear</source> -<target>&Clear</target> +<source>&Reset</source> +<target>&Reset</target> <source>The following settings are used for all synchronization jobs.</source> <target>The following settings are used for all synchronisation jobs.</target> @@ -1061,8 +1049,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Find</target> -<source>Select View</source> -<target>Select View</target> +<source>View Settings</source> +<target>View Settings</target> <source>Overview</source> <target>Overview</target> @@ -1145,12 +1133,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Exclude via filter:</target> -<source>Exclude temporarily</source> -<target>Exclude temporarily</target> - <source>Include temporarily</source> <target>Include temporarily</target> +<source>Exclude temporarily</source> +<target>Exclude temporarily</target> + <source>Delete</source> <target>Delete</target> @@ -1202,6 +1190,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>Do&n't save</target> +<source>Delete selected configurations</source> +<target>Delete selected configurations</target> + <source>Filter</source> <target>Filter</target> @@ -1253,8 +1244,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Set as default</target> -<source>All folders are in sync</source> -<target>All folders are in sync</target> +<source>All files are in sync</source> +<target>All files are in sync</target> <source>Synchronization Settings</source> <target>Synchronisation Settings</target> @@ -1274,6 +1265,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Searching for program updates...</target> +<source>Close progress dialog</source> +<target>Close progress dialogue</target> + +<source>Standby</source> +<target>Standby</target> + +<source>Log off</source> +<target>Log off</target> + +<source>Shut down</source> +<target>Shut down</target> + +<source>Hibernate</source> +<target>Hibernate</target> + <source>Scanning...</source> <target>Scanning...</target> @@ -1295,15 +1301,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Initialising...</target> -<source>Stopped</source> -<target>Stopped</target> - <source>Completed</source> <target>Completed</target> <source>&Continue</source> <target>&Continue</target> +<source>Progress</source> +<target>Progress</target> + <source>Log</source> <target>Log</target> @@ -1394,8 +1400,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Time stamp</target> -<source>Append a timestamp to each file name</source> -<target>Append a timestamp to each file name</target> +<source>Append a time stamp to each file name</source> +<target>Append a time stamp to each file name</target> <source>File</source> <target>File</target> @@ -1520,9 +1526,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Unable to move %x to the recycle bin.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Checking recycle bin failed for folder %x.</target> + <source>Cannot determine final path for %x.</source> <target>Cannot determine final path for %x.</target> <source>Error Code %x:</source> <target>Error Code %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Cannot read the following XML elements:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Configuration file %x loaded partially only.</target> + diff --git a/FreeFileSync/Build/Languages/finnish.lng b/FreeFileSync/Build/Languages/finnish.lng index 1ca0d45b..76020609 100644 --- a/FreeFileSync/Build/Languages/finnish.lng +++ b/FreeFileSync/Build/Languages/finnish.lng @@ -7,6 +7,9 @@ <plural_definition>n == 1 ? 0 : 1</plural_definition> </header> +<source>All files are in sync</source> +<target></target> + <source>Both sides have changed since last synchronization.</source> <target>Molemmat puolet muuttuneet edellisestä täsmäyksestä.</target> @@ -20,40 +23,40 @@ <target>Tietokanta ei vastaa nykyisiä asetuksia.</target> <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> -<target>Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla.</target> +<target>Asetetaan oletussuunta täsmäykselle: vanhat tiedostot korvataan uudemilla tiedostoilla.</target> <source>Checking recycle bin availability for folder %x...</source> -<target>Tarkistetaan Roskakorin käyttö hakemistolle %x...</target> +<target>Tarkistetaan hakemisto %x:n käyttöoikeus Roskakoriin ...</target> <source>Moving file %x to the recycle bin</source> -<target>Siirrä tiedosto %x Roskakoriin</target> +<target>Siirretään tiedosto %x Roskakoriin</target> <source>Moving folder %x to the recycle bin</source> -<target>Siirrä hakemisto %x Roskakoriin</target> +<target>Siirretään hakemisto %x Roskakoriin</target> <source>Moving symbolic link %x to the recycle bin</source> -<target>Siirrä linkki %x Roskakoriin</target> +<target>Siirretään pikakuvike %x Roskakoriin</target> <source>Deleting file %x</source> -<target>Poista tiedosto %x</target> +<target>Poistetaan tiedosto %x</target> <source>Deleting folder %x</source> -<target>Poista hakemisto %x</target> +<target>Poistetaan hakemisto %x</target> <source>Deleting symbolic link %x</source> <target>Pistetaan pikakuvake %x</target> <source>The recycle bin is not available for the following folders. Files will be deleted permanently instead:</source> -<target>Roskakori puuttuu näiltä hakemistoilta. Tiedostot poistetaan ehdotta:</target> +<target>Roskakori ei ole käytettävissä näiden hakemistojen osalta. Tiedostot poistetaan sen sijaan lopullisesti:</target> <source>An exception occurred</source> <target>Virhe havaittu</target> <source>A directory path is expected after %x.</source> -<target>Tarvitaan hakemistopolku %x jälkeen.</target> +<target>%x:n jälkeen kuuluisi olla hakemistopolku.</target> <source>Syntax error</source> -<target>Komento virhe</target> +<target>Muotovirhe</target> <source>Cannot open file %x.</source> <target>Tiedosto %x ei aukea.</target> @@ -62,13 +65,13 @@ <target>Tiedosto %x ei sisällä kelvollista kokoonpanoa.</target> <source>Unequal number of left and right directories specified.</source> -<target>Hakemisto määrät ei täsmää (oikea<>vasen).</target> +<target>Oikealla ja vasemmalla määriteltyjen hakemistojen määrä poikkeaa.</target> <source>The config file must not contain settings at directory pair level when directories are set via command line.</source> -<target>Määrittelyssä on oltava viittaukset hakemistopareista, jos hakemistot kutsutaam komentoriviltä.</target> +<target>Määrittely ei saa sisältää hakemistoparitason asetuksia, jos hakemistot määritellään komentoriviltä.</target> <source>Directories cannot be set for more than one configuration file.</source> -<target>Hakemisto määriteltävä vain yhteen määrittelyyn.</target> +<target>Hakemistot voi asettaa vain yhtä määrittelyä varten.</target> <source>Command line</source> <target>Komentokehote</target> @@ -77,7 +80,7 @@ <target>Syntaksi:</target> <source>config files</source> -<target>määrittelytiedosto</target> +<target>määrittelytiedostot</target> <source>directory</source> <target>hakemisto</target> @@ -86,22 +89,22 @@ <target>Vapaa määrä FreeFileSync .ffs_gui ja/tai .ffs_batch määrittelytiedostoja.</target> <source>Any number of alternative directories for at most one config file.</source> -<target>Vapaa määrä eri hakemistoja yhdessä määrittelytiedostossa.</target> +<target>Vapaa määrä eri hakemistoja yhdessä tietyssä määrittelyssä.</target> <source>Cannot find the following folders:</source> -<target>Hakemistot ei löydy:</target> +<target>Seuraavia hakemistoja ei löydy:</target> <source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source> -<target>Voit ohita virhe olettamalla hakemistot tyhjiksi. Hakemistot luodaan täsmäytyksen aikana.</target> +<target>Voit ohittaa virheen olettamalla hakemistot tyhjiksi. Nämä hakemistot luodaan automaattisesti täsmäyksen aikana.</target> <source>A folder input field is empty.</source> -<target>Hakemiston syöte on tyhjä.</target> +<target>Hakemiston syötekenttä on tyhjä.</target> <source>The corresponding folder will be considered as empty.</source> -<target>Hakemisto tulkitaan tyhjäksi.</target> +<target>Vastaava hakemisto tulkitaan tyhjäksi.</target> <source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source> -<target>Hakemistolla on polkumäärittely. Luo täsmäytyksen vertailusäännöt huolella:</target> +<target>Hakemiston hakemistopolussa on alikansioita. Luo täsmäyksen vertailusäännöt huolella:</target> <source>File %x has an invalid date.</source> <target>Tiedostolla %x on virheellinen päiväys.</target> @@ -110,37 +113,40 @@ <target>Pvm:</target> <source>Files %x have the same date but a different size.</source> -<target>Tiedostoilla %x on sama päiväys mutta eri koko.</target> +<target>Tiedostoilla %x on sama päiväys, mutta eri koko.</target> <source>Size:</source> <target>Koko:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Sisällön vertailu sivutettiin poissuljetuille tiedostoille %x.</target> + <source>Items differ in attributes only</source> -<target>Kohteiden eroaa vain määritteissä</target> +<target>Kohteet eroavat vain attribuuttien osalta</target> <source>Resolving symbolic link %x</source> <target>Tulkitaan pikakuvike %x</target> <source>Comparing content of files %x</source> -<target>Vertaa tiedostojen %x tietosisältöä</target> +<target>Verrataan tiedostojen %x sisältöä</target> <source>Generating file list...</source> -<target>Luodaan tiedostolista...</target> +<target>Luodaan tiedostoluettelo...</target> <source>Starting comparison</source> <target>Vertailu alkaa</target> <source>Calculating sync directions...</source> -<target>Lasketaa täsmäytyksen suuntaa...</target> +<target>Lasketaan täsmäyksen suuntaa...</target> <source>Out of memory.</source> <target>Muisti loppui.</target> <source>Item exists on left side only</source> -<target>Kohde löytyy vain vasemmalta</target> +<target>Kohde on vain vasemmalla</target> <source>Item exists on right side only</source> -<target>Kohde löytyy vain oikealta</target> +<target>Kohde on vain oikealla</target> <source>Left side is newer</source> <target>Uudempi vasemmalla</target> @@ -149,37 +155,37 @@ <target>Uudempi oikealla</target> <source>Items have different content</source> -<target>Kohteilla eri sisältö</target> +<target>Kohteilla on eri sisältö</target> <source>Both sides are equal</source> <target>Puolet ovat identtiset</target> <source>Conflict/item cannot be categorized</source> -<target>Ristiriita, ei määriteltävissä</target> +<target>Ristiriita/kohde ei ole luokiteltavissa</target> <source>Copy new item to left</source> -<target>Monista uusi vasemmalle</target> +<target>Kopioi uusi kohde vasemmalle</target> <source>Copy new item to right</source> -<target>Monista uusi oikealle</target> +<target>Kopioi uusi kohde oikealle</target> <source>Delete left item</source> -<target>Poista vasen</target> +<target>Poista vasen kohde</target> <source>Delete right item</source> -<target>Poista oikea</target> +<target>Poista oikea kohde</target> <source>Move file on left</source> -<target>Siirä vasen tiedosto</target> +<target>Siirrä vasen tiedosto</target> <source>Move file on right</source> <target>Siirrä oikea tiedosto</target> <source>Overwrite left item</source> -<target>Korvaa vasen</target> +<target>Korvaa vasen kohde</target> <source>Overwrite right item</source> -<target>Korvaa oikea</target> +<target>Korvaa oikea kohde</target> <source>Do nothing</source> <target>Älä tee mitään</target> @@ -191,25 +197,25 @@ <target>Päivitä oikeudet oikealla</target> <source>Database file %x is incompatible.</source> -<target>Tietokanta %x vierasta muotoa.</target> +<target>Tietokanta %x ei ole yhteensopiva.</target> <source>Initial synchronization:</source> -<target>Ensi täsmäytys:</target> +<target>Esitäsmäys:</target> <source>Database file %x does not yet exist.</source> -<target>Tietokanta %x on vielä luomatta.</target> +<target>Tietokantaa %x ei vielä ole.</target> <source>Database file is corrupt:</source> -<target>Tietokanta viottunut:</target> +<target>Tietokanta on viottunut:</target> <source>Cannot write file %x.</source> -<target>Kirjoittaminen ei onnistu %x.</target> +<target>Tiedoston %x kirjoittaminen ei onnistu.</target> <source>Cannot read file %x.</source> -<target>Lukeminen ei onnistu %x.</target> +<target>Tiedoston %x lukeminen ei onnistu.</target> <source>Database files do not share a common session.</source> -<target>Tietokannan tiedostot eri sessioista.</target> +<target>Tietokannan tiedostot ovat eri istunnoista.</target> <source>Searching for folder %x...</source> <target>Etsitään hakemistoa %x...</target> @@ -221,10 +227,10 @@ <target>Prosessin tietoja ei saada.</target> <source>Waiting while directory is locked:</source> -<target>Odotetaan hakemiston lukitusta:</target> +<target>Odotetaan, kunnes hakemiston lukitus aukeaa:</target> <source>Lock owner:</source> -<target>Lukitse haltija:</target> +<target>Lukitsija:</target> <source> <pluralform>1 sec</pluralform> @@ -236,16 +242,16 @@ </target> <source>Detecting abandoned lock...</source> -<target>Hylätty lukitus löydetty...</target> +<target>Hylätyn lukituksen etsintä...</target> <source>Creating file %x</source> <target>Luodaan tiedosto %x</target> <source>Items processed:</source> -<target>Osia käsitelty:</target> +<target>Osioita käsitelty:</target> <source>Items remaining:</source> -<target>Osia jäljellä:</target> +<target>Osioita jäljellä:</target> <source>Total time:</source> <target>Kokonaisaika:</target> @@ -260,16 +266,16 @@ </target> <source>%x MB</source> -<target>%x MB</target> +<target>%x Mt</target> <source>%x KB</source> -<target>%x KB</target> +<target>%x kt</target> <source>%x GB</source> -<target>%x GB</target> +<target>%x Gt</target> <source>Error parsing file %x, row %y, column %z.</source> -<target>Virhe jäsennys tiedo %x, rivi %y, sarake %z.</target> +<target>Jäsennysvirhe - tiedosto: %x, rivi: %y, sarake: %z.</target> <source>Cannot set directory lock for %x.</source> <target>Hakemiston %x lukitus ei onnistu.</target> @@ -287,16 +293,13 @@ </target> <source>Encoding extended time information: %x</source> -<target>Tulkitaan laajennettua aikatietoa: %x</target> +<target>Koodataan laajennettua aikatietoa: %x</target> <source>/sec</source> <target>/s</target> <source>%x items/sec</source> -<target>%x olioo/s</target> - -<source>Configuration file %x loaded partially only.</source> -<target>Kokoonpanotiedosto %x ladattu vain osittain.</target> +<target>%x oliota/s</target> <source>Show in Explorer</source> <target>Näytä Explorerissa</target> @@ -311,25 +314,22 @@ <target>Volume Shadow Copy palvelu ei vastaa.</target> <source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source> -<target>Tilannevedoksia varten käytä tässä järjestelmässä FreeFileSync 64-bittinen versio.</target> +<target>Tilannevedoksia varten käytä tässä järjestelmässä FreeFileSync 64-bittistä versiota.</target> <source>Cannot load file %x.</source> <target>Tiedostoa %x ei voida ladata.</target> <source>Cannot determine volume name for %x.</source> -<target>Nimen %x tunnistus ei onnistu.</target> +<target>Levyn %x tunnistus ei onnistu.</target> <source>Volume name %x is not part of file path %y.</source> -<target>Nimi %x ei esiinny tiedostopolussa %y.</target> +<target>Levy %x ei esiinny tiedostopolussa %y.</target> <source>Stop requested: Waiting for current operation to finish...</source> -<target>Keskeytyspyyntö: Odotetaan tehtävän valmistumista...</target> +<target>Keskeytyspyyntö: odotetaan tehtävän valmistumista...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Versiohallinan aikaleimaa ei voida luoda:</target> - -<source>Cannot read the following XML elements:</source> -<target>XML elementit lukukelvottimia:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Versionhallinnan aikaleimaa ei voida luoda:</target> <source>&Open...</source> <target>&Avaa...</target> @@ -365,7 +365,7 @@ <target>3. Paina 'Käynnistä'.</target> <source>To get started just import a .ffs_batch file.</source> -<target>Aloita lataamalla joku .ffs_batch -tiedosto.</target> +<target>Aloita lataamalla joku .ffs_batch-tiedosto.</target> <source>Folders to watch:</source> <target>Seurattavat hakemistot:</target> @@ -383,10 +383,10 @@ <target>Valitse hakemisto</target> <source>Idle time (in seconds):</source> -<target>Jouten (s)</target> +<target>Joutoaika (s):</target> <source>Idle time between last detected change and execution of command</source> -<target>Joutoaika edellisen muutoksen ja käskyn suorittamisen välillä</target> +<target>Joutoaika edellisen havaitun muutoksen ja käskyn suorittamisen välillä</target> <source>Command line:</source> <target>Komentokehoite</target> @@ -398,8 +398,8 @@ The command is triggered if: </source> <target> Käsky suoritetaan jos: -- tiedosto tai alihakemisto muuttu -- uusi hakemisto ilmestyy (esim. USB tikku) +- tiedosto tai alihakemisto muuttuu +- uusi hakemisto ilmestyy (esim. muistitikku liitetään) </target> <source>&Start</source> @@ -415,13 +415,13 @@ Käsky suoritetaan jos: <target>Kaikki tiedostot</target> <source>Automated Synchronization</source> -<target>Automaattinen täsmäytys</target> +<target>Automaattinen täsmäys</target> <source>Directory monitoring active</source> <target>Hakemistovalvonta päällä</target> <source>Waiting until all directories are available...</source> -<target>Odota kunnes kaikki hakemistot on saatavilla...</target> +<target>Odota kunnes kaikki hakemistot ovat saatavilla...</target> <source>Error</source> <target>Virhe</target> @@ -430,7 +430,7 @@ Käsky suoritetaan jos: <target>&Palauta</target> <source>&Show error</source> -<target>&Näytä virheet</target> +<target>&Näytä virhe</target> <source>&Exit</source> <target>&Poistu</target> @@ -448,7 +448,7 @@ Käsky suoritetaan jos: <target>Tiedoston aika ja koko</target> <source>Two way</source> -<target>Molemmat</target> +<target>Kaksisuuntainen</target> <source>Mirror</source> <target>Peilaava</target> @@ -463,22 +463,22 @@ Käsky suoritetaan jos: <target>Moninkertainen...</target> <source>Moving file %x to %y</source> -<target>Siirrä tiedosto %x -> %y</target> +<target>Siirretään tiedosto %x -> %y</target> <source>Moving folder %x to %y</source> -<target>Siirrä hakemisto %x -> %y</target> +<target>Siirretään hakemisto %x -> %y</target> <source>Moving symbolic link %x to %y</source> <target>Siirrä pikakuvike %x -> %y</target> <source>Removing old versions...</source> -<target>Vanhat poistetaa...</target> +<target>Vanhat versiot poistetaan...</target> <source>Creating symbolic link %x</source> <target>Luodaan pikakuvake %x</target> <source>Creating folder %x</source> -<target>LuoDAAN hakemisto %x</target> +<target>Luodaan hakemisto %x</target> <source>Overwriting file %x</source> <target>Korvaa tiedosto %x</target> @@ -487,22 +487,22 @@ Käsky suoritetaan jos: <target>Korvaa pikakuvake %x</target> <source>Verifying file %x</source> -<target>Tarkistan tiedostoa %x</target> +<target>Tarkistetaan tiedostoa %x</target> <source>Updating attributes of %x</source> -<target>Päivitän %x:n ominaisuudet</target> +<target>Päivitetään %x:n attribuutit</target> <source>Creating a Volume Shadow Copy for %x...</source> -<target>Luo %x:lle Volume Shadow Copy ...</target> +<target>Luodaan %x:lle Volume Shadow Copy ...</target> <source>Data verification error: %x and %y have different content.</source> -<target>Tiedon verifiointie virhe: %x ja %y sisältö on erilainen.</target> +<target>Tiedon tarkistusvirhe: %x:n ja %y:n sisältö ovat erilaiset.</target> <source>Cannot find %x.</source> <target>%x ei löydy.</target> <source>Target folder %x already existing.</source> -<target>Kohdehakemisto %x on olemassa.</target> +<target>Kohdehakemisto %x on jo olemassa.</target> <source>Target folder input field must not be empty.</source> <target>Kohde hakemiston kenttä on annettava.</target> @@ -511,13 +511,13 @@ Käsky suoritetaan jos: <target>Anna versioinnin kohdehakemisto.</target> <source>Source folder %x not found.</source> -<target>Lähdehakemisto %x ei löydy.</target> +<target>Lähdehakemistoa %x ei löydy.</target> <source>The following items have unresolved conflicts and will not be synchronized:</source> <target>Näissä kohteissa on selvittämättömiä ristiriitoja, niitä ei täsmäytetä:</target> <source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source> -<target>Hakemistoissa on oleelliset erot. Varmista että hakemistot on oikein valittu.</target> +<target>Hakemistoissa on oleellisia eroja. Varmista, että olet valinnut hakemistot oikein.</target> <source>Not enough free disk space available in:</source> <target>Vapaa levytila ei riitä:</target> @@ -529,7 +529,7 @@ Käsky suoritetaan jos: <target>Saatavilla:</target> <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> -<target>Moniosaisen hakemistoparin hakemistoa muutetaan. Tarkista täsmäytyksen asetuksia.</target> +<target>Useampiin hakemistopareihin kuuluvaa hakemistoa muutetaan. Tarkista täsmäysasetukset.</target> <source>Synchronizing folder pair:</source> <target>Täsmäytetään hakemistoparia:</target> @@ -538,52 +538,55 @@ Käsky suoritetaan jos: <target>Tietokanta luodaan...</target> <source>job name</source> -<target>työnimi</target> +<target>työnnimi</target> <source>Synchronization stopped</source> <target>Täsmäytys on pysäytetty</target> <source>Synchronization completed with errors</source> -<target>Täsmäytys päättyi virheisiin</target> +<target>Täsmäys päättyi virheisiin</target> <source>Synchronization completed with warnings</source> -<target>Täsmäytys päättyi varoituksin</target> +<target>Täsmäys päättyi varoituksin</target> <source>Nothing to synchronize</source> <target>Ei mitään täsmäytettävää</target> <source>Synchronization completed successfully</source> -<target>Täsmäytys päättyi onnistuneesti</target> +<target>Täsmäys päättyi onnistuneesti</target> <source>Saving log file %x...</source> -<target>Lokitiedosto: tallennetaan %x...</target> +<target>Tallennetaan lokitiedosto %x...</target> + +<source>Stopped</source> +<target>Keskeytys</target> <source>You can switch to FreeFileSync's main window to resolve this issue.</source> -<target>Siirry FreeFileSync -pääikkunaan korjataksesi virheen.</target> +<target>Voit siirtyä FreeFileSyncin pääikkunaan korjataksesi tämä virhe.</target> <source>&Don't show this warning again</source> <target>&Älä enää näytä tätä varoitusta</target> <source>&Ignore</source> -<target>&Unohda</target> +<target>&Sivuta</target> <source>&Switch</source> <target>&Vaihda</target> <source>Switching to FreeFileSync's main window</source> -<target>Vaihdä FreeFileSync -pääikkunaan</target> +<target>Vaihdetaan FreeFileSyncin pääikkunaan</target> <source> <pluralform>Automatic retry in 1 second...</pluralform> <pluralform>Automatic retry in %x seconds...</pluralform> </source> <target> -<pluralform>Uusi yritys 1 sekuntti...</pluralform> -<pluralform>Uusi yritys %x sekunttia...</pluralform> +<pluralform>Uusi yritys 1 sekunnin kuluttua...</pluralform> +<pluralform>Uusi yritys %x sekunnin kuluttua...</pluralform> </target> <source>&Ignore subsequent errors</source> -<target>&Hylkää toistuvat virheet</target> +<target>&Sivuta toistuvat virheet</target> <source>Retrying operation...</source> <target>Yritetään uudestaan...</target> @@ -595,10 +598,10 @@ Käsky suoritetaan jos: <target>Etsi ohjelmaan päivitystä</target> <source>A new version of FreeFileSync is available:</source> -<target>FreeFileSync:n uusi verio on saatavilla:</target> +<target>FreeFileSyncin uusi versio on saatavilla:</target> <source>Download now?</source> -<target>Lataa nyt?</target> +<target>Ladataanko nyt?</target> <source>&Download</source> <target>&Lataa</target> @@ -607,10 +610,10 @@ Käsky suoritetaan jos: <target>FreeFileSync on ajan tasalla.</target> <source>Unable to connect to sourceforge.net.</source> -<target>Yhteys sourceforge.net:n ei onnistu.</target> +<target>Sourceforge.nettiin ei saada yhteyttä.</target> <source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source> -<target>Nykyinen FreeFileSync versio ei löydy verkosta, etsitäänkö manuaalisesti?</target> +<target>Nykyistä FreeFileSyncin versiota ei löydy verkosta. Suoritetaanko manuaalinen haku?</target> <source>&Check</source> <target>&Tarkista</target> @@ -646,31 +649,16 @@ Käsky suoritetaan jos: <target>Luokka</target> <source>Action</source> -<target>Suorita</target> +<target>Toiminto</target> <source>Drag && drop</source> <target>Vedä ja pudota</target> -<source>Close progress dialog</source> -<target>Sulje etenämän dialoogi</target> - -<source>Standby</source> -<target>Lepotila</target> - -<source>Log off</source> -<target>Kirjaudu ulos</target> - -<source>Shut down</source> -<target>Sulje</target> - -<source>Hibernate</source> -<target>Horrostila</target> - <source>Alternate comparison settings</source> -<target>Vaihtoehtoinen asetus vertailulle</target> +<target>Vaihtoehtoiset asetukset vertailuille</target> <source>Alternate synchronization settings</source> -<target>Vaihtoehtoinen asetus täsmäytykselle</target> +<target>Vaihtoehtoiset asetukset täsmäykselle</target> <source>Local filter</source> <target>Paikallinen suodin</target> @@ -679,13 +667,13 @@ Käsky suoritetaan jos: <target>Aktiivinen</target> <source>None</source> -<target>Ei yhtään</target> +<target>Ei ole</target> <source>Remove alternate settings</source> -<target>Poista muut asetukset</target> +<target>Poista vaihtoehtoiset asetukset</target> <source>Clear filter settings</source> -<target>Nollaa suodin</target> +<target>Nollaa suodinasetukset</target> <source>Copy</source> <target>Monista</target> @@ -694,10 +682,10 @@ Käsky suoritetaan jos: <target>Liitä</target> <source>Alternate Comparison Settings</source> -<target>Vaihtoehtoinen asetus vertailulle</target> +<target>Vaihtoehtoiset asetukset vertailuille</target> <source>Alternate Synchronization Settings</source> -<target>Vaihtoehtoinen asetus täsmäytykselle</target> +<target>Vaihtoehtoiset asetukset täsmäykselle</target> <source>Local Filter</source> <target>Paikallinen suodin</target> @@ -757,20 +745,29 @@ Käsky suoritetaan jos: <target>Poista hakemistopari</target> <source>Swap sides</source> -<target>Puolten vaihto</target> +<target>Puoltenvaihto</target> <source>Close search bar</source> <target>Sulje hakukenttä</target> <source>Find:</source> -<target>Etsi</target> +<target>Etsi:</target> <source>Match case</source> -<target>Täsmää kirjainkoko</target> +<target>Täsmäytä kirjainkoko</target> <source>Save as batch job</source> <target>Tallenna eräajona</target> +<source>View type:</source> +<target>Näytä tyyppi:</target> + +<source>Select view:</source> +<target>Valitse näkymä:</target> + +<source>Statistics:</source> +<target>Tilastot:</target> + <source>Number of files and folders that will be created</source> <target>Luotavien tiedostojen ja hakemistojen määrä</target> @@ -787,10 +784,10 @@ Käsky suoritetaan jos: <target>Valitse vaihtoehto:</target> <source>Identify equal files by comparing modification time and size.</source> -<target>Tunnista tiedostojen vastaavuus ajan ja koon mukaan.</target> +<target>Tunnista identtiset tiedostot aikaleimoja ja kokoa vertailemalla.</target> <source>Identify equal files by comparing the file content.</source> -<target>Tunnista tiedostojen vastaavuus sisällöstä.</target> +<target>Tunnista identtiset tiedostot sisältöä vertailemalla.</target> <source>Symbolic links:</source> <target>Pikakuvike:</target> @@ -802,16 +799,16 @@ Käsky suoritetaan jos: <target>OK</target> <source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source> -<target>Löydä ja suorita muutokset molemmilla puolilla. Poistot, siirrot ja eroavuudet tunnistetaan tietokannan avulla.</target> +<target>Löydä ja monista muutokset molemmille puolille. Poistot, siirrot ja eroavuudet tunnistetaan tietokannan avulla.</target> <source>Create a mirror backup of the left folder by adapting the right folder to match.</source> -<target>Luo näköisversio vasemmasta hakemistosta muokkaamalla oikeata.</target> +<target>Luo peilikuva vasemmasta kansiosta muokkaamalla oikeata kansiota samanlaiseksi.</target> <source>Copy new and updated files to the right folder.</source> -<target>Monista muuttuneet ja uudet oikealle.</target> +<target>Monista uudet ja päivitetyt tiedostot oikealle.</target> <source>Configure your own synchronization rules.</source> -<target>Määritä omat täsmäytyssäännöt.</target> +<target>Määritä omat täsmäyssäännöt.</target> <source>Detect moved files</source> <target>Tunnista siirretyt tiedostot</target> @@ -822,9 +819,9 @@ Käsky suoritetaan jos: - Not supported by all file systems </source> <target> -- Luodaan tarvittavat tietokannat -- Tunnistus alkaa 1:tä täsmäytyksestä -- Ei toimi kaikissa tietojärjestelmissä +- Vaatii ja luo tarvittavat tietokannat +- Tunnistus alkaa ensimmäisestä täsmäyksestä +- Ei toimi kaikissa tiedostojärjestelmissä </target> <source>Delete files:</source> @@ -840,19 +837,19 @@ Käsky suoritetaan jos: <target>Roskakori</target> <source>Back up deleted and overwritten files in the recycle bin</source> -<target>Tallenna poistetut/ylikirjoitetut tiedostot Roskakoriin</target> +<target>Tallenna poistetut/korvatut tiedostot Roskakoriin</target> <source>Versioning</source> <target>Versiointi</target> <source>Move files to a user-defined folder</source> -<target>Siirrä tiedostot määrättyyn hakemistoon</target> +<target>Siirrä tiedostot itse määräämäsi hakemistoon</target> <source>Naming convention:</source> -<target>Nimeämis käytäntö:</target> +<target>Nimeämiskäytäntö:</target> <source>Show examples</source> -<target>Näytä esimerkki</target> +<target>Näytä esimerkkejä</target> <source>Handle errors:</source> <target>Hoida virheet:</target> @@ -864,28 +861,28 @@ Käsky suoritetaan jos: <target>Piilota kaikki virhe- ja varoitusviestit</target> <source>Pop-up</source> -<target>Pop-up</target> +<target>Ponnahdusikkuna</target> <source>Show pop-up on errors or warnings</source> -<target>Näytä Pop-Up (virheet/varoitukset)</target> +<target>Näytä ponnahdusikkuna virheiden tai varoituksien kohdalla</target> <source>On completion:</source> -<target>Kun valmis:</target> +<target>Toimet kun valmis:</target> + +<source>Detect synchronization directions with the help of database files</source> +<target>Tunnista tietokannan avulla täysmäyksen suuntaa</target> <source>Start synchronization now?</source> -<target>Kännistetäänkö täsmäyts?</target> +<target>Käynnistetäänkö täsmäytys?</target> <source>Variant:</source> -<target>Vaihtoehto</target> - -<source>Statistics</source> -<target>Tilastot</target> +<target>Vaihtoehto:</target> <source>&Don't show this dialog again</source> -<target>&Älä näytä valitaa uudestaan</target> +<target>&Älä näytä tätä ruutua uudestaan</target> <source>Items found:</source> -<target>Osia löytyi:</target> +<target>Osioita löytyi:</target> <source>Speed:</source> <target>Nopeus:</target> @@ -900,7 +897,7 @@ Käsky suoritetaan jos: <target>Täsmäytetään...</target> <source>Minimize to notification area</source> -<target>Pienennä huomiokenttään</target> +<target>Pienennä ilmaisinalueelle</target> <source>Close</source> <target>Sulje</target> @@ -912,13 +909,13 @@ Käsky suoritetaan jos: <target>Keskeytä</target> <source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source> -<target>Luo eräajo-tiedosto automaattiseen täsmäytykseen. Käynnista tuplaklickillä tai ajasta: %x</target> +<target>Luo eräajotiedosto automaattista täsmäystä varten. Käynnistä kaksoisnapsauttamalla tai ajasta tehtävä: %x</target> <source>Stop synchronization at first error</source> -<target>Keskeytä täsmäytys ensimmäiseen virheeseen</target> +<target>Keskeytä täsmäys ensimmäiseen virheeseen</target> -<source>Show progress dialog</source> -<target>Näytä etenemä ikkuna</target> +<source>Run minimized</source> +<target>Suorita pienennettynä</target> <source>Save log:</source> <target>Tallenna loki:</target> @@ -927,7 +924,7 @@ Käsky suoritetaan jos: <target>Raja:</target> <source>Limit maximum number of log files</source> -<target>Lokeja enintäin</target> +<target>Rajoita lokien maksimimäärä</target> <source>How can I schedule a batch job?</source> <target>Miten ajastan eräajon?</target> @@ -935,14 +932,8 @@ Käsky suoritetaan jos: <source>&Recycle bin</source> <target>&Roskakori</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 molemmin puolin, vaikka tiedosto on valittu vain toisella puolella</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> -<target>Ohitettavien tiedostojen ehdot täsmäytysessä. Anna hakemistopariin nähden suhteellinen osoite.</target> +<target>Määrittele suodatussäännöt täsmäyksestä pois jätettäville tiedostoille. Anna hakemistopariin nähden suhteellinen osoite.</target> <source>Include:</source> <target>Sisällytä:</target> @@ -954,19 +945,19 @@ Käsky suoritetaan jos: <target>Aikajakso:</target> <source>File size:</source> -<target>Tiedosto koko:</target> +<target>Tiedoston koko:</target> <source>Minimum:</source> -<target>Vähintäin:</target> +<target>Vähintään:</target> <source>Maximum:</source> -<target>Enintäin:</target> +<target>Enintään:</target> -<source>&Clear</source> -<target>&Pyyhi</target> +<source>&Reset</source> +<target>&Palauta</target> <source>The following settings are used for all synchronization jobs.</source> -<target>Nämä asetukset käytetään kaikkiin täsmäytyksiin.</target> +<target>Näitä asetuksia käytetään kaikkiin täsmäyksiin.</target> <source>Fail-safe file copy</source> <target>Varmennettu tiedostokopiointi</target> @@ -977,7 +968,7 @@ This guarantees a consistent state even in case of a serious error. </source> <target> Kopioi väliaikaistiedostoon (*.ffs_tmp) ennen kohteen ylikirjoitusta. -Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. +Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. </target> <source>(recommended)</source> @@ -993,43 +984,43 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>(edellyttää pääkäyttäjän oikeuksia)</target> <source>Copy file access permissions</source> -<target>Kopioi tiedoston käyttöoikeuksia</target> +<target>Kopioi tiedoston käyttöoikeudet</target> <source>Transfer file and folder permissions.</source> -<target>Tiedosto ja hakemisto määreet siirretään.</target> +<target>Siirrä tiedostojen ja hakemistojen käyttöoikeudet.</target> <source>Automatic retry on error:</source> -<target>Automaattinen uusintayritys virheestä:</target> +<target>Automaattinen uusintayritys, kun virhe sattuu:</target> <source>Retry count:</source> <target>Uusintayrityksiä:</target> <source>Delay (in seconds):</source> -<target>Viive (s):</target> +<target>Viive (sekunneissa):</target> <source>Customize context menu:</source> -<target>Yksilöi valikko:</target> +<target>Muokkaa kontekstivalikko:</target> <source>Description</source> -<target>Seloste</target> +<target>Kuvaus</target> <source>Restore hidden windows</source> -<target>Palauta piiloitettu ikkuna</target> +<target>Palauta piilotetut ikkunat</target> <source>&Default</source> -<target>&Vakio</target> +<target>&Oletus</target> <source>Source code written in C++ using:</source> -<target>Koodikieli on C++ käyttäen:</target> +<target>Koodattu C++-kielellä käyttäen:</target> <source>If you like FreeFileSync</source> -<target>Jos pidät FreeFileSync:tä</target> +<target>Jos pidät FreeFileSyncistä</target> <source>Donate with PayPal</source> -<target>Lahjoita PayPal:lla</target> +<target>Lahjoita PayPalilla</target> <source>Feedback and suggestions are welcome</source> -<target>Palaute ja uudet ideat ovat tervetulleita</target> +<target>Palaute ja uudet ehdotukset ovat tervetulleita</target> <source>Homepage</source> <target>Kotisivu</target> @@ -1038,7 +1029,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>S-posti</target> <source>Published under the GNU General Public License</source> -<target>Julkaistu lisenssillä GNU General Public License</target> +<target>Julkaistu noudattaen GNU General Public Licensen ehtoja:</target> <source>Many thanks for localization:</source> <target>Paljon kiitoksia kääntäjille:</target> @@ -1050,19 +1041,19 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Poista kohteet</target> <source>Global Settings</source> -<target>Yleinen asetus</target> +<target>Yleiset asetukset</target> <source>Select Time Span</source> <target>Valitse aikajakso</target> <source>Folder Pairs</source> -<target>Hakemisto parit</target> +<target>Hakemistoparit</target> <source>Find</source> <target>Etsi</target> -<source>Select View</source> -<target>Valitse näkymä</target> +<source>View Settings</source> +<target>Näytä asetukset</target> <source>Overview</source> <target>Yleiskatsaus</target> @@ -1080,16 +1071,16 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Tallenna</target> <source>Compare both sides</source> -<target>Vertaile molemmat puolet</target> +<target>Vertaile molempia puolia</target> <source>Comparison settings</source> <target>Vertailun asetukset</target> <source>Synchronization settings</source> -<target>Täsmäytyksen asetukset</target> +<target>Täsmäyksen asetukset</target> <source>Start synchronization</source> -<target>Käynnistä täsmäytys</target> +<target>Käynnistä täsmäys</target> <source>Confirm</source> <target>Vahvista</target> @@ -1129,8 +1120,8 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <pluralform>Showing %y of %x rows</pluralform> </source> <target> -<pluralform>Näytetään %y 1 riville</pluralform> -<pluralform>Näytetään %y , %x riville</pluralform> +<pluralform>Näytetään %y (1 rivi)</pluralform> +<pluralform>Näytetään %y (%x riviä)</pluralform> </target> <source>Set direction:</source> @@ -1140,17 +1131,17 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>monivalinta</target> <source>Include via filter:</source> -<target>Lisää suotimella:</target> +<target>Sisällytä suotimella:</target> <source>Exclude via filter:</source> -<target>Sulje pois suotimella:</target> - -<source>Exclude temporarily</source> -<target>Sulje pois, tilapäisesti</target> +<target>Suodata suotimella:</target> <source>Include temporarily</source> <target>Sisällytä, tilapäisesti</target> +<source>Exclude temporarily</source> +<target>Suodat tilapäisesti</target> + <source>Delete</source> <target>Poista</target> @@ -1158,7 +1149,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Valitse kaikki</target> <source>Exclude all</source> -<target>Hylkää kaikki</target> +<target>Suodata kaikki</target> <source>Show icons:</source> <target>Näytä kuvakkeet:</target> @@ -1182,10 +1173,10 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Näytä "%x"</target> <source>Last session</source> -<target>Edellinen istunto</target> +<target>Viime istunto</target> <source>Folder Comparison and Synchronization</source> -<target>Hakemistojen vertailu ja täsmäytys</target> +<target>Hakemistojen vertailu ja täsmäys</target> <source>Configuration saved</source> <target>Asetukset tallennettu</target> @@ -1202,6 +1193,9 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <source>Do&n't save</source> <target>Äl&ä tallenna</target> +<source>Delete selected configurations</source> +<target>Poista valitus määrittelyt</target> + <source>Filter</source> <target>Suodin</target> @@ -1215,7 +1209,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Näytä vasemmalla olevat uudemmat tiedostot</target> <source>Show files that are newer on right</source> -<target>Näytä uudemmat tiedostot oikealla</target> +<target>Näytä oikealla olevat uudemmat tiedostot</target> <source>Show files that are equal</source> <target>Näytä yhteneväiset tiedostot</target> @@ -1248,16 +1242,13 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Näytä kopioimatta jäävät tiedostot</target> <source>Show filtered or temporarily excluded files</source> -<target>Näytä suodatetut/nyt pois suljetut tiedostot</target> +<target>Näytä suodatetut tai tilapäisesti pois suljetut tiedostot</target> <source>Set as default</source> <target>Aseta oletukseksi</target> -<source>All folders are in sync</source> -<target>Kaikki hakemistot täsmäytetty</target> - <source>Synchronization Settings</source> -<target>Täsmäytyksen asetukset</target> +<target>Täsmäyksen asetukset</target> <source>Comparison Settings</source> <target>Vertailun asetukset</target> @@ -1272,13 +1263,28 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Tiedostolista viety</target> <source>Searching for program updates...</source> -<target>Ohjelmapäivytys haetaa...</target> +<target>Ohjelmapäivytystä haetaan...</target> + +<source>Close progress dialog</source> +<target>Sulje etenämän dialoogi</target> + +<source>Standby</source> +<target>Lepotila</target> + +<source>Log off</source> +<target>Kirjaudu ulos</target> + +<source>Shut down</source> +<target>Sulje</target> + +<source>Hibernate</source> +<target>Horrostila</target> <source>Scanning...</source> <target>Tiedostoja haetaan...</target> <source>Comparing content...</source> -<target>Sisällön vertailu...</target> +<target>Sisältöä vertaillaan...</target> <source>Info</source> <target>Info</target> @@ -1293,10 +1299,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Pysäytetty</target> <source>Initializing...</source> -<target>Alustus...</target> - -<source>Stopped</source> -<target>Keskeytys</target> +<target>Alustetaan...</target> <source>Completed</source> <target>Valmis</target> @@ -1304,6 +1307,9 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <source>&Continue</source> <target>&Jatka</target> +<source>Progress</source> +<target>Etenemä</target> + <source>Log</source> <target>Loki</target> @@ -1326,17 +1332,17 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>tavua</target> <source>KB</source> -<target>KB</target> +<target>kt</target> <source>MB</source> -<target>MB</target> +<target>Mt</target> <source> <pluralform>Do you really want to move the following item to the recycle bin?</pluralform> <pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform> </source> <target> -<pluralform>Haluatko varmasti siirtää kohde Roskakoriin?</pluralform> +<pluralform>Haluatko varmasti siirtää kohteen Roskakoriin?</pluralform> <pluralform>Haluatko varmasti siirtää nämä %x kohteet Roskakoriin?</pluralform> </target> @@ -1348,7 +1354,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <pluralform>Do you really want to delete the following %x items?</pluralform> </source> <target> -<pluralform>Haluatko todella poistta tämä?</pluralform> +<pluralform>Haluatko todella poistaa tämän kohteen?</pluralform> <pluralform>Haluatko todella poistaa nämä %x kohdetta?</pluralform> </target> @@ -1362,13 +1368,13 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Seuraa</target> <source>Copy NTFS permissions</source> -<target>Monista NTFS oikeudet</target> +<target>Kopioi NTFS-oikeudet</target> <source>Integrate external applications into context menu. The following macros are available:</source> -<target>Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa:</target> +<target>Liitä ulkoinen sovellus kontekstivalikkoon. Seuraavat makrot ovat valittavissa:</target> <source>- full file or folder name</source> -<target>- tiedoston/hakemiston koko nimi</target> +<target>- tiedoston tai hakemiston koko nimi</target> <source>- folder part only</source> <target>- vain hakemisto-osa</target> @@ -1383,7 +1389,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Palauta kaikki piiloitetut ikkunat ja varoitukset?</target> <source>Leave as unresolved conflict</source> -<target>Jätä ratkaisemattomana virheenä</target> +<target>Jätä ratkaisemattomana ristiriitana</target> <source>Replace</source> <target>Korvaa</target> @@ -1394,7 +1400,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <source>Time stamp</source> <target>Aikaleima</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Lisää aikaleima tiedostoihin</target> <source>File</source> @@ -1434,19 +1440,19 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Tiedoston %x ominaisuuksia ei voitu tallentaa.</target> <source>Cannot write modification time of %x.</source> -<target>Tiedoston %x muutosaikaa ei voida kirjoittaa.</target> +<target>Tiedoston %x aikaleimaa ei voida kirjoittaa.</target> <source>Cannot read security context of %x.</source> -<target>Ei voi lukea %x -suojauskontekstia.</target> +<target>Ei voi lukea %x:n suojauskontekstia.</target> <source>Cannot write security context of %x.</source> -<target>Ei voi tallentaa %x -suojauskontekstia.</target> +<target>Ei voi tallentaa %x:n suojauskontekstia.</target> <source>Cannot read permissions of %x.</source> -<target>Ei voi lukea %x -oikeuksia.</target> +<target>Ei voi lukea %x:n oikeuksia.</target> <source>Cannot write permissions of %x.</source> -<target>Ei voi tallentaa %x -oikeuksia.</target> +<target>Ei voi tallentaa %x:n oikeuksia.</target> <source>Cannot create directory %x.</source> <target>Hakemistoa %x ei voitu luoda.</target> @@ -1455,7 +1461,7 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Pikakuvikkeen luonti epäonnistui %x.</target> <source>Cannot find system function %x.</source> -<target>Järjestelmäfunktio ei löydy, %x</target> +<target>Järjestelmäfunktiota %x ei löydy.</target> <source>Cannot copy file %x to %y.</source> <target>Tiedostoa %x ei voida kopioida kohtaan %y.</target> @@ -1464,19 +1470,19 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. <target>Kohteen %x tyyppiä ei tueta:</target> <source>Cannot resolve symbolic link %x.</source> -<target>Tämä linkki on virheellinen %x.</target> +<target>Pikakuvike %x on virheellinen.</target> <source>Cannot open directory %x.</source> -<target>Hakemistoa %x ei voida avata.</target> +<target>Hakemistoa %x ei voi avata.</target> <source>Cannot enumerate directory %x.</source> -<target>Hakemistoa %x ei voitu luetella.</target> +<target>Hakemistoa %x ei voi luetella.</target> <source>%x TB</source> -<target>%x TB</target> +<target>%x Tt</target> <source>%x PB</source> -<target>%x PB</target> +<target>%x Pt</target> <source> <pluralform>1 min</pluralform> @@ -1506,23 +1512,32 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi. </target> <source>Unable to register to receive system messages.</source> -<target>Virheviestien vastaanotto ei onnistu.</target> +<target>Kirjautuminen järjestelmäviestien vastaanottamiseksi ei onnistu.</target> <source>Cannot set privilege %x.</source> -<target>Oikeuksia %x ei voitu asettaa.</target> +<target>Oikeutta %x ei voitu asettaa.</target> <source>Unable to suspend system sleep mode.</source> -<target>Lepotilan katkaisu ei onnistu.</target> +<target>Lepotilan keskeyttäminen ei onnistu.</target> <source>Cannot change process I/O priorities.</source> -<target>Prosessin I/O -pririteetin muutos ei onnistu.</target> +<target>Prosessin I/O-prioriteetin muutos ei onnistu.</target> <source>Unable to move %x to the recycle bin.</source> -<target>%x siirto Roskakoriin epäonnistui.</target> +<target>%x:n siirto Roskakoriin epäonnistui.</target> + +<source>Checking recycle bin failed for folder %x.</source> +<target>Roskakorin tarkistus hakemistolle %x epäonnistui.</target> <source>Cannot determine final path for %x.</source> -<target>Polkua ei voida määrittää, %x.</target> +<target>%x:n lopullista polkua ei voida määrittää.</target> <source>Error Code %x:</source> -<target>Virhe %x:</target> +<target>Virhekoodi %x:</target> + +<source>Cannot read the following XML elements:</source> +<target>Nämä XML elementit ovat lukukelvottimia:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Kokoonpanotiedosto %x ladattu vain osittain.</target> diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng index 5b2fb8f2..fab09308 100644 --- a/FreeFileSync/Build/Languages/french.lng +++ b/FreeFileSync/Build/Languages/french.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Taille :</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>La comparaison du contenu a été ignorée pour les fichiers exclus %x.</target> + <source>Items differ in attributes only</source> <target>Seuls les attributs des éléments diffèrent</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x éléments/sec</target> -<source>Configuration file %x loaded partially only.</source> -<target>Le fichier de configuration %x a été chargé seulement partiellement.</target> - <source>Show in Explorer</source> <target>Montrer dans l'explorateur</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Arrêt demandé : En attente de la fin de l'opération en cours...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Impossible de créer l'horodatage des versions :</target> - -<source>Cannot read the following XML elements:</source> -<target>Impossible de lire les données XML suivantes :</target> +<source>Unable to create time stamp for versioning:</source> +<target>Impossible de générer l'horodatage pour la gestion des versions.</target> <source>&Open...</source> <target>&Ouvrir...</target> @@ -558,6 +555,9 @@ La commande est déclenchée si : <source>Saving log file %x...</source> <target>Enregistrement du fichier log %x...</target> +<source>Stopped</source> +<target>Arrêté</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Vous pouvez basculer vers la fenêtre principale de FreeFileSync pour résoudre ce problème.</target> @@ -651,21 +651,6 @@ La commande est déclenchée si : <source>Drag && drop</source> <target>Glisser && Déposer</target> -<source>Close progress dialog</source> -<target>Fermer la fenêtre de progression</target> - -<source>Standby</source> -<target>Pause</target> - -<source>Log off</source> -<target>Quitter</target> - -<source>Shut down</source> -<target>Arrêter</target> - -<source>Hibernate</source> -<target>Figer</target> - <source>Alternate comparison settings</source> <target>configuration distincte de la comparaison</target> @@ -771,6 +756,15 @@ La commande est déclenchée si : <source>Save as batch job</source> <target>Enrgistrer en temps que fichier batch</target> +<source>View type:</source> +<target>Type de vue :</target> + +<source>Select view:</source> +<target>Choisir la vue :</target> + +<source>Statistics:</source> +<target>Statistiques :</target> + <source>Number of files and folders that will be created</source> <target>Nombre de fichiers et de dossiers qui seront créés</target> @@ -872,15 +866,15 @@ La commande est déclenchée si : <source>On completion:</source> <target>A la fin :</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Détection du sens de la synchronisation à l'aide de la base de données</target> + <source>Start synchronization now?</source> <target>Démarrer la synchronisation maintenant ?</target> <source>Variant:</source> <target>Variante :</target> -<source>Statistics</source> -<target>Statistiques</target> - <source>&Don't show this dialog again</source> <target>&Ne plus afficher cette boîte de dialogue</target> @@ -917,8 +911,8 @@ La commande est déclenchée si : <source>Stop synchronization at first error</source> <target>Arrêter la synchronisation à la première erreur</target> -<source>Show progress dialog</source> -<target>Montrer la fenêtre de progression</target> +<source>Run minimized</source> +<target>Exécution fenêtre réduite</target> <source>Save log:</source> <target>Sauvegarder le fichier log :</target> @@ -935,12 +929,6 @@ La commande est déclenchée si : <source>&Recycle bin</source> <target>&Corbeille</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Sélectionnez les règles de filtrage pour exclure certains fichiers de la synchronisation. Entrez les chemins des fichiers par rapport à leur paire de dossiers.</target> @@ -962,8 +950,8 @@ La commande est déclenchée si : <source>Maximum:</source> <target>Maximum :</target> -<source>&Clear</source> -<target>&Effacer</target> +<source>&Reset</source> +<target>&Réinitialiser</target> <source>The following settings are used for all synchronization jobs.</source> <target>Les paramètres suivants sont utilisés lors de toutes les synchronisations.</target> @@ -1061,8 +1049,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Find</source> <target>Rechercher</target> -<source>Select View</source> -<target>Sélection de l'Affichage</target> +<source>View Settings</source> +<target>Configuration de la vue</target> <source>Overview</source> <target>Présentation</target> @@ -1145,12 +1133,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Exclude via filter:</source> <target>Exclure à l'aide du filtre :</target> -<source>Exclude temporarily</source> -<target>Exclure temporairement</target> - <source>Include temporarily</source> <target>Inclure temporairement</target> +<source>Exclude temporarily</source> +<target>Exclure temporairement</target> + <source>Delete</source> <target>Supprimer</target> @@ -1202,6 +1190,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Do&n't save</source> <target>&Ne pas Sauvegarder</target> +<source>Delete selected configurations</source> +<target>Supprimer les configurations sélectionnées</target> + <source>Filter</source> <target>Filtre</target> @@ -1253,8 +1244,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Set as default</source> <target>Définir par défaut</target> -<source>All folders are in sync</source> -<target>Tous les dossiers sont synchronisés</target> +<source>All files are in sync</source> +<target>Tous les fichiers sont concernés</target> <source>Synchronization Settings</source> <target>Configuration de la Synchronisation</target> @@ -1274,6 +1265,21 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Searching for program updates...</source> <target>Recherche de mises à jour ...</target> +<source>Close progress dialog</source> +<target>Fermer la fenêtre de progression</target> + +<source>Standby</source> +<target>Pause</target> + +<source>Log off</source> +<target>Quitter</target> + +<source>Shut down</source> +<target>Arrêter</target> + +<source>Hibernate</source> +<target>Figer</target> + <source>Scanning...</source> <target>Lecture en cours...</target> @@ -1295,15 +1301,15 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Initializing...</source> <target>Initialisation...</target> -<source>Stopped</source> -<target>Arrêté</target> - <source>Completed</source> <target>Terminé</target> <source>&Continue</source> <target>&Continuer</target> +<source>Progress</source> +<target>Progression</target> + <source>Log</source> <target>Log</target> @@ -1394,8 +1400,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Time stamp</source> <target>Horodatage</target> -<source>Append a timestamp to each file name</source> -<target>Ajouter un horodatage à chaque fichier</target> +<source>Append a time stamp to each file name</source> +<target>Ajouter un horodatage à chaque nom de fichier</target> <source>File</source> <target>Fichier</target> @@ -1520,9 +1526,18 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. <source>Unable to move %x to the recycle bin.</source> <target>Impossible de déplacer %x dans la Corbeille.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Echec de la vérification de la corbeille pour le dossier %x.</target> + <source>Cannot determine final path for %x.</source> <target>Impossible de déterminer le chemin pour %x.</target> <source>Error Code %x:</source> <target>Code erreur %x :</target> +<source>Cannot read the following XML elements:</source> +<target>Impossible de lire les données XML suivantes :</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Le fichier de configuration %x a été chargé seulement partiellement.</target> + diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng index 0670a54f..2a374102 100644 --- a/FreeFileSync/Build/Languages/german.lng +++ b/FreeFileSync/Build/Languages/german.lng @@ -7,12 +7,6 @@ <plural_definition>n == 1 ? 0 : 1</plural_definition> </header> -<source>Detect synchronization directions with the help of database files</source> -<target></target> - -<source>Binary comparison was skipped for excluded files %x.</source> -<target>Der binäre Vergleich wurde für die ausgeschlossenen Dateien %x übersprungen.</target> - <source>Both sides have changed since last synchronization.</source> <target>Beide Seiten wurden seit der letzten Synchronisation verändert.</target> @@ -121,6 +115,9 @@ <source>Size:</source> <target>Größe:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Der Vergleich nach Dateiinhalt wurde für die ausgeschlossenen Dateien %x übersprungen.</target> + <source>Items differ in attributes only</source> <target>Die Elemente unterscheiden sich nur in Attributen</target> @@ -328,7 +325,7 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Stop wurde eingeleitet: Warte bis die aktuelle Operation beendet ist...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Der Zeitstempel für die Versionierung kann nicht erstellt werden:</target> <source>&Open...</source> @@ -604,7 +601,7 @@ Die Befehlszeile wird ausgelöst, wenn: <target>Jetzt herunterladen?</target> <source>&Download</source> -<target>&Download</target> +<target>Zum &Download</target> <source>FreeFileSync is up to date.</source> <target>FreeFileSync ist auf dem neuesten Stand.</target> @@ -654,21 +651,6 @@ Die Befehlszeile wird ausgelöst, wenn: <source>Drag && drop</source> <target>Drag && Drop</target> -<source>Close progress dialog</source> -<target>Schließe Fortschrittsdialog</target> - -<source>Standby</source> -<target>Energie sparen</target> - -<source>Log off</source> -<target>Abmelden</target> - -<source>Shut down</source> -<target>Herunterfahren</target> - -<source>Hibernate</source> -<target>Ruhezustand</target> - <source>Alternate comparison settings</source> <target>Alternative Vergleichseinstellungen</target> @@ -774,6 +756,15 @@ Die Befehlszeile wird ausgelöst, wenn: <source>Save as batch job</source> <target>Als Batch-Auftrag speichern</target> +<source>View type:</source> +<target>Ansichtstyp:</target> + +<source>Select view:</source> +<target>Ansicht wählen:</target> + +<source>Statistics:</source> +<target>Statistiken:</target> + <source>Number of files and folders that will be created</source> <target>Anzahl der zu erstellenden Dateien und Ordner</target> @@ -875,15 +866,15 @@ Die Befehlszeile wird ausgelöst, wenn: <source>On completion:</source> <target>Nach Abschluss:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Ermittle die Synchronisationsrichtungen mit Hilfe von Datenbankdateien</target> + <source>Start synchronization now?</source> <target>Synchronisation jetzt starten?</target> <source>Variant:</source> <target>Variante:</target> -<source>Statistics</source> -<target>Statistiken</target> - <source>&Don't show this dialog again</source> <target>&Diesen Dialog nicht mehr anzeigen</target> @@ -920,8 +911,8 @@ Die Befehlszeile wird ausgelöst, wenn: <source>Stop synchronization at first error</source> <target>Synchronisation beim ersten Fehler anhalten</target> -<source>Show progress dialog</source> -<target>Fortschrittsdialog zeigen</target> +<source>Run minimized</source> +<target>Minimiert ausführen</target> <source>Save log:</source> <target>Protokoll speichern:</target> @@ -938,12 +929,6 @@ Die Befehlszeile wird ausgelöst, wenn: <source>&Recycle bin</source> <target>&Papierkorb</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Wählen Sie Filterregeln aus, um einzelne Dateien von der Synchronisation auszuschließen. Geben Sie Dateipfade relativ zu ihrem zugehörigen Ordnerpaar an.</target> @@ -965,8 +950,8 @@ Die Befehlszeile wird ausgelöst, wenn: <source>Maximum:</source> <target>Maximum:</target> -<source>&Clear</source> -<target>&Löschen</target> +<source>&Reset</source> +<target>&Zurücksetzen</target> <source>The following settings are used for all synchronization jobs.</source> <target>Die folgenden Einstellungen werden für alle Synchronisationsaufgaben verwendet.</target> @@ -1064,8 +1049,8 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Find</source> <target>Suchen</target> -<source>Select View</source> -<target>Ansicht auswählen</target> +<source>View Settings</source> +<target>Ansichtseinstellungen</target> <source>Overview</source> <target>Übersicht</target> @@ -1205,6 +1190,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Do&n't save</source> <target>&Nicht speichern</target> +<source>Delete selected configurations</source> +<target>Ausgewählte Konfigurationen löschen</target> + <source>Filter</source> <target>Filter</target> @@ -1256,8 +1244,8 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Set as default</source> <target>Als Standard festlegen</target> -<source>All folders are in sync</source> -<target>Alle Ordner sind synchron</target> +<source>All files are in sync</source> +<target>Alle Dateien sind synchron</target> <source>Synchronization Settings</source> <target>Synchronisationseinstellungen</target> @@ -1277,6 +1265,21 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Searching for program updates...</source> <target>Suche nach aktualisierten Programmversionen...</target> +<source>Close progress dialog</source> +<target>Schließe Fortschrittsdialog</target> + +<source>Standby</source> +<target>Energie sparen</target> + +<source>Log off</source> +<target>Abmelden</target> + +<source>Shut down</source> +<target>Herunterfahren</target> + +<source>Hibernate</source> +<target>Ruhezustand</target> + <source>Scanning...</source> <target>Suche Dateien...</target> @@ -1304,6 +1307,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>&Continue</source> <target>&Fortfahren</target> +<source>Progress</source> +<target>Fortschritt</target> + <source>Log</source> <target>Protokoll</target> @@ -1394,7 +1400,7 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Time stamp</source> <target>Zeitstempel</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Einen Zeitstempel an jeden Dateinamen anhängen</target> <source>File</source> @@ -1520,6 +1526,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert. <source>Unable to move %x to the recycle bin.</source> <target>%x kann nicht in den Papierkorb verschoben werden.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Die Prüfung des Papierkorbs für Ordner %x ist fehlgeschlagen.</target> + <source>Cannot determine final path for %x.</source> <target>Der endgültige Pfad für %x kann nicht ermittelt werden.</target> diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng index 216bea96..33b08da6 100644 --- a/FreeFileSync/Build/Languages/greek.lng +++ b/FreeFileSync/Build/Languages/greek.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Μέγεθος:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Η σύγκριση περιεχομένου παραλήφθηκε για τα εξαιρούμενα αρχεία %x.</target> + <source>Items differ in attributes only</source> <target>Τα στοιχεία διαφέρουν μόνο ως προς τα χαρακτηριστικά τους</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x στοιχεία</target> -<source>Configuration file %x loaded partially only.</source> -<target>Το αρχείο διάταξης %x έχει φορτωθεί μόνο κατά ένα μέρος.</target> - <source>Show in Explorer</source> <target>Εμφάνιση στην Εξερεύνηση</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Αίτημα διακοπής: Αναμονή για την ολοκλήρωση της τρέχουσας εργασίας...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Αδυναμία δημιουργίας χρονικής σήμανσης για διατήρηση εκδόσεων:</target> - -<source>Cannot read the following XML elements:</source> -<target>Δεν ήταν δυνατό να αναγνωσθούν τα ακόλουθα στοιχεία XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων:</target> <source>&Open...</source> <target>Ά&νοιγμα...</target> @@ -558,6 +555,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>Αποθήκευση του αρχείου καταγραφής %x...</target> +<source>Stopped</source> +<target>Διεκόπη</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Μπορείτε να επιστρέψετε στο κύριο παράθυρο του FreeFileSync για να επιλύσετε αυτό το θέμα.</target> @@ -651,21 +651,6 @@ The command is triggered if: <source>Drag && drop</source> <target>Μεταφορά && Απόθεση</target> -<source>Close progress dialog</source> -<target>Κλείσιμο του παράθυρου αναφοράς</target> - -<source>Standby</source> -<target>Αναστολή λειτουργίας</target> - -<source>Log off</source> -<target>Αποσύνδεση</target> - -<source>Shut down</source> -<target>Τερματισμός λειτουργίας</target> - -<source>Hibernate</source> -<target>Αδρανοποίηση</target> - <source>Alternate comparison settings</source> <target>Διαφοροποιημένες ρυθμίσεις σύγκρισης</target> @@ -771,6 +756,15 @@ The command is triggered if: <source>Save as batch job</source> <target>Αποθήκευση ως δέσμη ενεργειών</target> +<source>View type:</source> +<target>Τύπος εμφάνισης:</target> + +<source>Select view:</source> +<target>Επιλογή εμφάνισης:</target> + +<source>Statistics:</source> +<target>Στατιστικά:</target> + <source>Number of files and folders that will be created</source> <target>Αριθμός αρχείων και υποκαταλόγων που θα δημιουργηθούν</target> @@ -872,15 +866,15 @@ The command is triggered if: <source>On completion:</source> <target>Μετά την ολοκλήρωση:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Ανίχνευση της κατεύθυνσης συγχρονισμού με τη βοήθεια βάσεων δεδομένων</target> + <source>Start synchronization now?</source> <target>Να ξεκινήσει ο συγχρονισμός τώρα;</target> <source>Variant:</source> <target>Μέθοδος:</target> -<source>Statistics</source> -<target>Στατιστικά</target> - <source>&Don't show this dialog again</source> <target>&Να μην εμφανιστεί ξανά αυτό το μήνυμα</target> @@ -917,8 +911,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>Διακοπή του συγχρονισμού με το πρώτο σφάλμα</target> -<source>Show progress dialog</source> -<target>Εμφάνιση της αναφοράς προόδου</target> +<source>Run minimized</source> +<target>Εκκίνηση σε ελαχιστοποιημένο παράθυρο</target> <source>Save log:</source> <target>Αποθήκευση αρχείου καταγραφής:</target> @@ -935,12 +929,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&Κάδος ανακύκλωσης</target> -<source>Delete on both sides</source> -<target>Διαγραφή και στις δυο πλευρές</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Διαγραφή και στις δυο πλευρές, ακόμα κι αν το αρχείο έχει επιλεχθεί μόνο στη μια πλευρά</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Επιλογή κανόνων φιλτραρίσματος, ώστε να αποκλειστούν ορισμένα αρχεία από το συγχρονισμό. Εισάγετε τις διαδρομές των αρχείων σχετικά με το αντίστοιχο ζεύγος υποκαταλόγων.</target> @@ -962,8 +950,8 @@ The command is triggered if: <source>Maximum:</source> <target>Μέγιστο</target> -<source>&Clear</source> -<target>&Καθαρισμός</target> +<source>&Reset</source> +<target>&Επαναφορά</target> <source>The following settings are used for all synchronization jobs.</source> <target>Οι ακόλουθες ρυθμίσεις χρησιμοποιούνται για όλες τις εργασίες συγχρονισμού.</target> @@ -1061,8 +1049,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Αναζήτηση</target> -<source>Select View</source> -<target>Επιλογή Εμφάνισης</target> +<source>View Settings</source> +<target>Προβολή Ρυθμίσεων</target> <source>Overview</source> <target>Σύνοψη</target> @@ -1145,12 +1133,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Εξαίρεση με βάση το φίλτρο:</target> -<source>Exclude temporarily</source> -<target>Προσωρινή εξαίρεση</target> - <source>Include temporarily</source> <target>Προσωρινή συμπερίληψη</target> +<source>Exclude temporarily</source> +<target>Προσωρινή εξαίρεση</target> + <source>Delete</source> <target>Διαγραφή</target> @@ -1202,6 +1190,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>Να &μην αποθηκευθούν</target> +<source>Delete selected configurations</source> +<target>Διαγραφή επιλεγμένων διατάξεων</target> + <source>Filter</source> <target>Φίλτρο</target> @@ -1253,8 +1244,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Ορισμός ως προεπιλογής</target> -<source>All folders are in sync</source> -<target>Όλοι οι υποκατάλογοι είναι συγχρονισμένοι</target> +<source>All files are in sync</source> +<target>Όλα τα αρχεία είναι συγχρονισμένα</target> <source>Synchronization Settings</source> <target>Ρυθμίσεις συγχρονισμού</target> @@ -1274,6 +1265,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Αναζήτηση καινούριας έκδοσης...</target> +<source>Close progress dialog</source> +<target>Κλείσιμο του παράθυρου αναφοράς</target> + +<source>Standby</source> +<target>Αναστολή λειτουργίας</target> + +<source>Log off</source> +<target>Αποσύνδεση</target> + +<source>Shut down</source> +<target>Τερματισμός λειτουργίας</target> + +<source>Hibernate</source> +<target>Αδρανοποίηση</target> + <source>Scanning...</source> <target>Ανίχνευση...</target> @@ -1295,15 +1301,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Αρχικοποίηση...</target> -<source>Stopped</source> -<target>Διεκόπη</target> - <source>Completed</source> <target>Ολοκληρώθηκε</target> <source>&Continue</source> <target>&Συνέχεια</target> +<source>Progress</source> +<target>Πρόοδος</target> + <source>Log</source> <target>Καταγραφή</target> @@ -1394,8 +1400,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Χρονική σήμανση</target> -<source>Append a timestamp to each file name</source> -<target>Προσάρτηση χρονικής σήμανσης σε κάθε όνομα αρχείου</target> +<source>Append a time stamp to each file name</source> +<target>Προσάρτηση χρονικής σήμανσης στο όνομα κάθε αρχείου</target> <source>File</source> <target>Αρχείο</target> @@ -1520,9 +1526,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Ο έλεγχος του κάδου ανακύκλωσης απέτυχε για τον υποκατάλογο %x.</target> + <source>Cannot determine final path for %x.</source> <target>Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x.</target> <source>Error Code %x:</source> <target>Κωδικός Σφάλματος %x</target> +<source>Cannot read the following XML elements:</source> +<target>Δεν ήταν δυνατό να αναγνωσθούν τα ακόλουθα στοιχεία XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Το αρχείο διάταξης %x έχει φορτωθεί μόνο κατά ένα μέρος.</target> + diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng index daf06a69..93cedce0 100644 --- a/FreeFileSync/Build/Languages/hebrew.lng +++ b/FreeFileSync/Build/Languages/hebrew.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>גודל:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>השוואת תוכן דולגה עבור קבצים שלא נכללו %x.</target> + <source>Items differ in attributes only</source> <target>פריטים שונים בתכונות בלבד</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x פריטים לשניה</target> -<source>Configuration file %x loaded partially only.</source> -<target>קובץ תצורה %x נטען חלקית בלבד.</target> - <source>Show in Explorer</source> <target>הראה בסייר הקבצים</target> @@ -325,12 +325,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>עצירה התבקשה: מחכה שפעולה נוכחית תסתיים...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>לא ניתן ליצור תג זמן לגרסאות:</target> -<source>Cannot read the following XML elements:</source> -<target>לא יכול לקרוא את שמות צמתי XML:</target> - <source>&Open...</source> <target>&פתח...</target> @@ -558,6 +555,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>שומר קובץ יומן %x...</target> +<source>Stopped</source> +<target>נעצר</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>ניתן לעבור לחלון הראשי של FreeFileSybc כדי לפתור את הסוגיה הזו.</target> @@ -651,21 +651,6 @@ The command is triggered if: <source>Drag && drop</source> <target>גרור &והשלך</target> -<source>Close progress dialog</source> -<target>סגור שיח התקדמות</target> - -<source>Standby</source> -<target>עבור למצב המתנה</target> - -<source>Log off</source> -<target>התנתק כמשתמש</target> - -<source>Shut down</source> -<target>כבה מחשב</target> - -<source>Hibernate</source> -<target>עבור למצב שינה</target> - <source>Alternate comparison settings</source> <target>הגדרות השוואה חלופיות</target> @@ -771,6 +756,15 @@ The command is triggered if: <source>Save as batch job</source> <target>שמור כעבודת אצווה</target> +<source>View type:</source> +<target>הצג סוג:</target> + +<source>Select view:</source> +<target>בחר תצוגה:</target> + +<source>Statistics:</source> +<target>סטטיסטיקה:</target> + <source>Number of files and folders that will be created</source> <target>מספר הקבצים והתיקיות שייוצרו</target> @@ -872,15 +866,15 @@ The command is triggered if: <source>On completion:</source> <target>עם הסיום:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>גלה כיווני סינכרון באמצעות קבצי בסיס נתונים</target> + <source>Start synchronization now?</source> <target>האם להתחיל סנכרון עכשיו?</target> <source>Variant:</source> <target>גרסה אחרת:</target> -<source>Statistics</source> -<target>סטטיסטיקה</target> - <source>&Don't show this dialog again</source> <target>&אל תראה דושיח זה שנית</target> @@ -917,8 +911,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>עצור סנכרון עם הופעת שגיאה ראשונה</target> -<source>Show progress dialog</source> -<target>הראה שיח התקדמות</target> +<source>Run minimized</source> +<target>הרץ ממוזער</target> <source>Save log:</source> <target>שמור יומן:</target> @@ -935,12 +929,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&סל מחזור</target> -<source>Delete on both sides</source> -<target>מחק בשני הצדדים</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>מחק בשני הצדדים אף אם הקובץ נבחר בצד אחד בלבד</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>בחר כללי סינון כדי לא לכלול קבצים מסוימים בסנכרון. הזן את נתיבי הקבצים ביחס לזוג התיקיות בהתאמה.</target> @@ -962,8 +950,8 @@ The command is triggered if: <source>Maximum:</source> <target>מקסימום:</target> -<source>&Clear</source> -<target>&נקה</target> +<source>&Reset</source> +<target>&אפס</target> <source>The following settings are used for all synchronization jobs.</source> <target>ההגדרות הבאות משמשות לכל משימות הסנכרון.</target> @@ -1061,8 +1049,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>חפש</target> -<source>Select View</source> -<target>בחר מבט</target> +<source>View Settings</source> +<target>הגדרות תצוגה</target> <source>Overview</source> <target>מבט כללי</target> @@ -1145,12 +1133,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>אל תכלול בעזרת סנן:</target> -<source>Exclude temporarily</source> -<target>אל תכלול זמנית</target> - <source>Include temporarily</source> <target>כלול זמנית</target> +<source>Exclude temporarily</source> +<target>אל תכלול זמנית</target> + <source>Delete</source> <target>מחק</target> @@ -1202,6 +1190,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>אל &תשמור</target> +<source>Delete selected configurations</source> +<target>מחק קופיגורציות שנבחרו</target> + <source>Filter</source> <target>מסנן</target> @@ -1253,8 +1244,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>הגדר כברירת מחדל</target> -<source>All folders are in sync</source> -<target>כל התיקיות מסונכרנות</target> +<source>All files are in sync</source> +<target>כל הקבצים מסונכרנים</target> <source>Synchronization Settings</source> <target>הגדרות סנכרון</target> @@ -1274,6 +1265,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>מחפש עידכוני תוכנה...</target> +<source>Close progress dialog</source> +<target>סגור שיח התקדמות</target> + +<source>Standby</source> +<target>עבור למצב המתנה</target> + +<source>Log off</source> +<target>התנתק כמשתמש</target> + +<source>Shut down</source> +<target>כבה מחשב</target> + +<source>Hibernate</source> +<target>עבור למצב שינה</target> + <source>Scanning...</source> <target>סורק...</target> @@ -1295,15 +1301,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>מאתחל ...</target> -<source>Stopped</source> -<target>נעצר</target> - <source>Completed</source> <target>הושלם</target> <source>&Continue</source> <target>&המשך</target> +<source>Progress</source> +<target>התקדמות</target> + <source>Log</source> <target>יומן</target> @@ -1394,8 +1400,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>תג זמן</target> -<source>Append a timestamp to each file name</source> -<target>הצמד תג זמן לכל שם קובץ</target> +<source>Append a time stamp to each file name</source> +<target>הוסף חתימת זמן לכל שם קובץ</target> <source>File</source> <target>קובץ</target> @@ -1520,9 +1526,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>לא יכול להעביר את %x לסל המחזור</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>בודק כשלון בתא מחזור עבור תיקייה %x.</target> + <source>Cannot determine final path for %x.</source> <target>לא יכול לקבוע את המסלול הסופי ל %x.</target> <source>Error Code %x:</source> <target>קוד שגיאה %x:</target> +<source>Cannot read the following XML elements:</source> +<target>לא יכול לקרוא את שמות צמתי XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>קובץ תצורה %x נטען חלקית בלבד.</target> + diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng index 2bdd0c57..9561f690 100644 --- a/FreeFileSync/Build/Languages/hungarian.lng +++ b/FreeFileSync/Build/Languages/hungarian.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Méret:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>A tartalom összehasonlítását átugrotta a(z) %x kizárt fájlok esetében</target> + <source>Items differ in attributes only</source> <target>Az elemek csak attribútumaikban különböznek</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x elem/másodperc</target> -<source>Configuration file %x loaded partially only.</source> -<target>%x konfigurációs fájl csak részlegesen töltődött be: .</target> - <source>Show in Explorer</source> <target>Mutassa az Intézőben</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Megállás szükséges: várakozás a jelenlegi művelet befejezésére...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Nem sikerült időbélyeget generálni a verziókövetéshez</target> - -<source>Cannot read the following XML elements:</source> -<target>Nem sikerült a következő XML elemek olvasása:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Nem képes időbélyegzés létrehozására a verzióképzéshez:</target> <source>&Open...</source> <target>&Megnyitás...</target> @@ -558,6 +555,9 @@ A parancs végrehajtódik, ha: <source>Saving log file %x...</source> <target>Naplófájl mentése a következő fájlba: %x.</target> +<source>Stopped</source> +<target>Leállítva</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>E jelenség megoldásához kapcsoljon át a FreeFileSync fő ablakába.</target> @@ -651,21 +651,6 @@ A parancs végrehajtódik, ha: <source>Drag && drop</source> <target>Húzd && Ejtsd</target> -<source>Close progress dialog</source> -<target>Zárja be a folyamatjelző párbeszédablakot</target> - -<source>Standby</source> -<target>Készenléti állapot</target> - -<source>Log off</source> -<target>Kijelentkezik</target> - -<source>Shut down</source> -<target>Leállítja a gépet</target> - -<source>Hibernate</source> -<target>Hibernál</target> - <source>Alternate comparison settings</source> <target>Megváltoztatja az összehasonlítási beállításokat</target> @@ -771,6 +756,15 @@ A parancs végrehajtódik, ha: <source>Save as batch job</source> <target>Mentse kötegelt feladatként</target> +<source>View type:</source> +<target>Nézet típusa:</target> + +<source>Select view:</source> +<target>Válasszon nézetet:</target> + +<source>Statistics:</source> +<target>Statisztika:</target> + <source>Number of files and folders that will be created</source> <target>A létrehozandó fájlok és könyvtárak száma</target> @@ -872,15 +866,15 @@ A parancs végrehajtódik, ha: <source>On completion:</source> <target>Végrehajtás alatt:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Érzékelje a szinkronizálási irányokat az adatbázis-fájlok segítségével</target> + <source>Start synchronization now?</source> <target>Megkezdje a szinkronizálást?</target> <source>Variant:</source> <target>Variáns:</target> -<source>Statistics</source> -<target>Statisztika</target> - <source>&Don't show this dialog again</source> <target>&Ne mutassa ismételten ezt a párbeszédablakot</target> @@ -917,8 +911,8 @@ A parancs végrehajtódik, ha: <source>Stop synchronization at first error</source> <target>Állítsa le a szinkronizálást az első hibánál</target> -<source>Show progress dialog</source> -<target>Mutassa a folyamatjelző párbeszédablakot</target> +<source>Run minimized</source> +<target>Minimalizálva fusson</target> <source>Save log:</source> <target>Mentse a következő napló-fájlt:</target> @@ -935,12 +929,6 @@ A parancs végrehajtódik, ha: <source>&Recycle bin</source> <target>Lomtá&r</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 a fájl csak az egyik oldalon lett kijelölve</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Meghatározott fájlok szinkronizálásból történő kizárásához válasszon szűrőt. Az útvonalakat a megfelelő könyvtár-párjaikhoz viszonyítva adja meg.</target> @@ -962,8 +950,8 @@ A parancs végrehajtódik, ha: <source>Maximum:</source> <target>Maximum:</target> -<source>&Clear</source> -<target>&Töröl</target> +<source>&Reset</source> +<target>&Visszaállít</target> <source>The following settings are used for all synchronization jobs.</source> <target>A következő beállítások minden szinkronizálási feladatnál használja.</target> @@ -1061,8 +1049,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Find</source> <target>Keres</target> -<source>Select View</source> -<target>Válasszon nézetet</target> +<source>View Settings</source> +<target>Mutassa a beállításokat</target> <source>Overview</source> <target>Áttekintés</target> @@ -1145,12 +1133,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Exclude via filter:</source> <target>Zárja ki szűrő segítségével:</target> -<source>Exclude temporarily</source> -<target>Zárja ki ideiglenesen</target> - <source>Include temporarily</source> <target>Csatolja ideiglenesen</target> +<source>Exclude temporarily</source> +<target>Zárja ki ideiglenesen</target> + <source>Delete</source> <target>Töröl</target> @@ -1202,6 +1190,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Do&n't save</source> <target>&ne mentse</target> +<source>Delete selected configurations</source> +<target>Törölje a kiválasztott beállításokat</target> + <source>Filter</source> <target>Szűrő</target> @@ -1253,8 +1244,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Set as default</source> <target>Beállítás alapértelmezettként</target> -<source>All folders are in sync</source> -<target>Minden könyvtár szinkronban</target> +<source>All files are in sync</source> +<target>Az összes fájl szinkronizált</target> <source>Synchronization Settings</source> <target>Szinkronizálási beállítások</target> @@ -1274,6 +1265,21 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Searching for program updates...</source> <target>Programfrissítés keresése...</target> +<source>Close progress dialog</source> +<target>Zárja be a folyamatjelző párbeszédablakot</target> + +<source>Standby</source> +<target>Készenléti állapot</target> + +<source>Log off</source> +<target>Kijelentkezik</target> + +<source>Shut down</source> +<target>Leállítja a gépet</target> + +<source>Hibernate</source> +<target>Hibernál</target> + <source>Scanning...</source> <target>Vizsgálat folyamatban...</target> @@ -1295,15 +1301,15 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Initializing...</source> <target>Inicializálás...</target> -<source>Stopped</source> -<target>Leállítva</target> - <source>Completed</source> <target>Befejeződött</target> <source>&Continue</source> <target>&Folytat</target> +<source>Progress</source> +<target>Haladás</target> + <source>Log</source> <target>Napló</target> @@ -1394,8 +1400,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Time stamp</source> <target>Időbélyeg</target> -<source>Append a timestamp to each file name</source> -<target>Adjon időbélyeget minden fájlnévhez</target> +<source>Append a time stamp to each file name</source> +<target>Minden fájlnévhez adjon egy-egy időbélyeget</target> <source>File</source> <target>Fájl</target> @@ -1452,7 +1458,7 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <target>Nem sikerült a következő könyvtár létrehozása: %x.</target> <source>Cannot create symbolic link %x.</source> -<target>Nem lehet létrehozni a(z) %x szimbolikus hivatkozást</target> +<target>Nem lehet létrehozni a(z) %x szimbolikus hivatkozást.</target> <source>Cannot find system function %x.</source> <target>Nem található a következő rendszerfunkció: %x.</target> @@ -1470,7 +1476,7 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <target>A %x könyvtár megnyitása nem sikerült.</target> <source>Cannot enumerate directory %x.</source> -<target>Nem sikerült besorolni a(z) %x könyvtárat. .</target> +<target>Nem sikerült besorolni a(z) %x könyvtárat.</target> <source>%x TB</source> <target>%x TB</target> @@ -1520,9 +1526,18 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. <source>Unable to move %x to the recycle bin.</source> <target>%x nem helyezhető a Lomtárba</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>A lomtár ellenőrzése meghiúsult a(z) %x könyvtár esetében.</target> + <source>Cannot determine final path for %x.</source> <target>Nem lehet meghatározni a végső útvonalat a(z) %x számára.</target> <source>Error Code %x:</source> <target>Hibakód %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Nem sikerült a következő XML elemek olvasása:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>%x konfigurációs fájl csak részlegesen töltődött be.</target> + diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng index 6609ff30..149a1d65 100644 --- a/FreeFileSync/Build/Languages/italian.lng +++ b/FreeFileSync/Build/Languages/italian.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Dimensione:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Confronto contenuto è stato saltato per i file esclusi %x.</target> + <source>Items differ in attributes only</source> <target>Gli oggetti differiscono solo negli attributi</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x elementi/sec</target> -<source>Configuration file %x loaded partially only.</source> -<target>File di configurazione %x caricato solo parzialmente.</target> - <source>Show in Explorer</source> <target>Mostra in Esplora Risorse</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Bloccata richiesta: Aspettare la fine dell'operazione in corso ...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Impossibile creare l'ora per la versione:</target> - -<source>Cannot read the following XML elements:</source> -<target>Impossibile leggere i seguenti elementi XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Impossibile creare l'impronta per il controllo delle versioni:</target> <source>&Open...</source> <target>&Apri...</target> @@ -403,7 +400,7 @@ Il comando è attivato se: </target> <source>&Start</source> -<target>&Start</target> +<target>&Avvio</target> <source>About</source> <target>Info su</target> @@ -558,6 +555,9 @@ Il comando è attivato se: <source>Saving log file %x...</source> <target>Salvataggio file di log %x...</target> +<source>Stopped</source> +<target>Arrestato</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>È possibile passare alla finestra principale di FreeFileSync per risolvere questo problema.</target> @@ -651,21 +651,6 @@ Il comando è attivato se: <source>Drag && drop</source> <target>Trascina</target> -<source>Close progress dialog</source> -<target>Chiudi stato di avanzamento</target> - -<source>Standby</source> -<target>Sospendi</target> - -<source>Log off</source> -<target>Termina sessione</target> - -<source>Shut down</source> -<target>Arresta</target> - -<source>Hibernate</source> -<target>Iberna</target> - <source>Alternate comparison settings</source> <target>Impostazioni di Confronto Alternativi</target> @@ -771,6 +756,15 @@ Il comando è attivato se: <source>Save as batch job</source> <target>Salva come processo batch</target> +<source>View type:</source> +<target>Visualizza tipo:</target> + +<source>Select view:</source> +<target>Seleziona vista:</target> + +<source>Statistics:</source> +<target>Statistiche:</target> + <source>Number of files and folders that will be created</source> <target>Numero di file e cartelle che verranno creati</target> @@ -872,15 +866,15 @@ Il comando è attivato se: <source>On completion:</source> <target>Al termine:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Rileva indicazioni sincronizzazione con l'aiuto del file di database</target> + <source>Start synchronization now?</source> <target>Avviare la sincronizzazione ora?</target> <source>Variant:</source> <target>Variante:</target> -<source>Statistics</source> -<target>Statistiche</target> - <source>&Don't show this dialog again</source> <target>&Non mostrare più questo avviso</target> @@ -917,8 +911,8 @@ Il comando è attivato se: <source>Stop synchronization at first error</source> <target>Interrompere la sincronizzazione al primo errore</target> -<source>Show progress dialog</source> -<target>Mostra stato di avanzamento</target> +<source>Run minimized</source> +<target>Esegui minimizzato</target> <source>Save log:</source> <target>Salva log:</target> @@ -935,12 +929,6 @@ Il comando è attivato se: <source>&Recycle bin</source> <target>&Cestino</target> -<source>Delete on both sides</source> -<target>Elimina su entrambi i lati</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Elimina su entrambi i lati anche se il file è selezionato su un solo lato.</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Selezionare le regole del filtro per escludere alcuni file dalla sincronizzazione. Immettere i percorsi dei file relativi alla loro corrispondente coppia di cartelle.</target> @@ -962,8 +950,8 @@ Il comando è attivato se: <source>Maximum:</source> <target>Massimo:</target> -<source>&Clear</source> -<target>&Pulisci</target> +<source>&Reset</source> +<target>&Ripristina</target> <source>The following settings are used for all synchronization jobs.</source> <target>Le seguenti impostazioni vengono utilizzate per tutti i processi di sincronizzazione.</target> @@ -1061,8 +1049,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Find</source> <target>Trova</target> -<source>Select View</source> -<target>Selezionare Visualizza</target> +<source>View Settings</source> +<target>Impostazioni Visualizzazione</target> <source>Overview</source> <target>Anteprima</target> @@ -1145,12 +1133,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Exclude via filter:</source> <target>Escludi tramite filtro:</target> -<source>Exclude temporarily</source> -<target>Escludi temporaneamente</target> - <source>Include temporarily</source> <target>Includi temporaneamente</target> +<source>Exclude temporarily</source> +<target>Escludi temporaneamente</target> + <source>Delete</source> <target>Elimina</target> @@ -1202,6 +1190,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Do&n't save</source> <target>No&n salvare</target> +<source>Delete selected configurations</source> +<target>Elimina configurazioni selezionate</target> + <source>Filter</source> <target>Filtro</target> @@ -1253,8 +1244,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Set as default</source> <target>Imposta come predefinito</target> -<source>All folders are in sync</source> -<target>Tutte le cartelle risultano sincronizzate</target> +<source>All files are in sync</source> +<target>Tutti i file sono in sincronia</target> <source>Synchronization Settings</source> <target>Impostazioni di Sincronizzazione</target> @@ -1274,6 +1265,21 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Searching for program updates...</source> <target>Ricerca di aggiornamenti al programma...</target> +<source>Close progress dialog</source> +<target>Chiudi stato di avanzamento</target> + +<source>Standby</source> +<target>Sospendi</target> + +<source>Log off</source> +<target>Termina sessione</target> + +<source>Shut down</source> +<target>Arresta</target> + +<source>Hibernate</source> +<target>Iberna</target> + <source>Scanning...</source> <target>Scansione...</target> @@ -1295,15 +1301,15 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Initializing...</source> <target>Inizializzazione...</target> -<source>Stopped</source> -<target>Arrestato</target> - <source>Completed</source> <target>Completato</target> <source>&Continue</source> <target>&Continuare</target> +<source>Progress</source> +<target>Avanzamento</target> + <source>Log</source> <target>Log</target> @@ -1394,8 +1400,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Time stamp</source> <target>Data e ora</target> -<source>Append a timestamp to each file name</source> -<target>Accoda data e ora ad ogni nome di file</target> +<source>Append a time stamp to each file name</source> +<target>Aggiunge un'impronta per ogni nome di file</target> <source>File</source> <target>File</target> @@ -1520,9 +1526,18 @@ Questo garantisce uno stato consistente anche in caso di errore grave. <source>Unable to move %x to the recycle bin.</source> <target>Impossibile spostare %x nel cestino.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Controllo cestino non riuscito per la cartella %x.</target> + <source>Cannot determine final path for %x.</source> <target>Impossibile determinare il percorso finale per %x.</target> <source>Error Code %x:</source> <target>Codice Errore %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Impossibile leggere i seguenti elementi XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>File di configurazione %x caricato solo parzialmente.</target> + diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng index 986db701..b25edf4a 100644 --- a/FreeFileSync/Build/Languages/japanese.lng +++ b/FreeFileSync/Build/Languages/japanese.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>サイズ:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>除外されたファイル %x の内容の比較をスキップ</target> + <source>Items differ in attributes only</source> <target>属性のみ異なる項目</target> @@ -292,9 +295,6 @@ <source>%x items/sec</source> <target>%x 項目/秒</target> -<source>Configuration file %x loaded partially only.</source> -<target>構成ファイル %x は部分的のみ読み込まれます.</target> - <source>Show in Explorer</source> <target>エクスプローラで表示</target> @@ -322,11 +322,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>停止の要求: 現在の操作が完了するのを待機しています...</target> -<source>Unable to create timestamp for versioning:</source> -<target>バージョン付けのタイムスタンプを作成出来ません:</target> - -<source>Cannot read the following XML elements:</source> -<target>次の XML要素を読み込めません:</target> +<source>Unable to create time stamp for versioning:</source> +<target>バージョン管理のタイムスタンプを作成できません:</target> <source>&Open...</source> <target>開く(&O)...</target> @@ -555,6 +552,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>ログファイル %x を保存中...</target> +<source>Stopped</source> +<target>停止</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>FreeFileSync のメインウィンドウを切り替えることでこの問題を解決</target> @@ -647,21 +647,6 @@ The command is triggered if: <source>Drag && drop</source> <target>ドラッグ && ドロップ</target> -<source>Close progress dialog</source> -<target>進捗ダイアログを閉じる</target> - -<source>Standby</source> -<target>スタンバイ</target> - -<source>Log off</source> -<target>ログオフ</target> - -<source>Shut down</source> -<target>シャットダウン</target> - -<source>Hibernate</source> -<target>休止状態</target> - <source>Alternate comparison settings</source> <target>代替比較設定</target> @@ -767,11 +752,20 @@ The command is triggered if: <source>Save as batch job</source> <target>一括ジョブで保存</target> +<source>View type:</source> +<target>表示形式:</target> + +<source>Select view:</source> +<target>選択表示</target> + +<source>Statistics:</source> +<target>統計情報:</target> + <source>Number of files and folders that will be created</source> <target>作成されたファイル、およびフォルダの数</target> <source>Number of files that will be overwritten</source> -<target>上書きされたファイル数</target> +<target>上書きされたファイルの数</target> <source>Number of files and folders that will be deleted</source> <target>削除されたファイル、およびフォルダの数</target> @@ -780,7 +774,7 @@ The command is triggered if: <target>コピーの合計バイト</target> <source>Select a variant:</source> -<target>メソッドを選択:</target> +<target>バリアントを選択:</target> <source>Identify equal files by comparing modification time and size.</source> <target>更新時刻とサイズを比較して、同一ファイルを識別します</target> @@ -830,13 +824,13 @@ The command is triggered if: <target>完全消去</target> <source>Delete or overwrite files permanently</source> -<target>ファイルを上書き、または完全に削除</target> +<target>ファイルを上書き/または完全に削除します</target> <source>Recycle bin</source> <target>ゴミ箱</target> <source>Back up deleted and overwritten files in the recycle bin</source> -<target>ファイルを削除/上書きする時、ゴミ箱にバックアップをとる</target> +<target>ファイルを削除/上書きする時に、ゴミ箱にバックアップをとる</target> <source>Versioning</source> <target>バージョン管理</target> @@ -868,15 +862,15 @@ The command is triggered if: <source>On completion:</source> <target>完了時の動作:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>データベースファイルを利用して、同期の方向を検出します。</target> + <source>Start synchronization now?</source> <target>今すぐ同期を開始しますか?</target> <source>Variant:</source> <target>メソッド:</target> -<source>Statistics</source> -<target>統計</target> - <source>&Don't show this dialog again</source> <target>次回以降から表示しない(&D)</target> @@ -913,8 +907,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>最初のエラーで同期処理を停止</target> -<source>Show progress dialog</source> -<target>進捗ダイアログを表示</target> +<source>Run minimized</source> +<target>最小化で起動</target> <source>Save log:</source> <target>ログ保存:</target> @@ -931,14 +925,8 @@ The command is triggered if: <source>&Recycle bin</source> <target>ゴミ箱(&R)</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> -<target>同期処理から特定のファイルを除外するフィルター規則を選択します。対応するそれらフォルダ ペアからの相対ファイルパスを入力.</target> +<target>同期処理から特定のファイルを除外するためのフィルター規則を選択、対応するそれらフォルダ ペアからの相対ファイルパスを入力します.</target> <source>Include:</source> <target>含める:</target> @@ -958,8 +946,8 @@ The command is triggered if: <source>Maximum:</source> <target>最大:</target> -<source>&Clear</source> -<target>クリア(&C)</target> +<source>&Reset</source> +<target>リセット(&R)</target> <source>The following settings are used for all synchronization jobs.</source> <target>以下の設定は、すべての同期ジョブで使用されます</target> @@ -1057,8 +1045,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>検索</target> -<source>Select View</source> -<target>表示を選択</target> +<source>View Settings</source> +<target>表示設定</target> <source>Overview</source> <target>概要</target> @@ -1137,12 +1125,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>フィルターを経由して除外</target> -<source>Exclude temporarily</source> -<target>一時的に除外</target> - <source>Include temporarily</source> <target>一時的に含める</target> +<source>Exclude temporarily</source> +<target>一時的に除外</target> + <source>Delete</source> <target>削除</target> @@ -1194,6 +1182,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>保存しない(&N)</target> +<source>Delete selected configurations</source> +<target>選択された構成設定を削除</target> + <source>Filter</source> <target>フィルター</target> @@ -1245,8 +1236,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>デフォルトにセット</target> -<source>All folders are in sync</source> -<target>すべてのフォルダを同期</target> +<source>All files are in sync</source> +<target>すべてのファイルを同期</target> <source>Synchronization Settings</source> <target>同期の設定</target> @@ -1266,6 +1257,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>アップデートを検索しています...</target> +<source>Close progress dialog</source> +<target>進捗ダイアログを閉じる</target> + +<source>Standby</source> +<target>スタンバイ</target> + +<source>Log off</source> +<target>ログオフ</target> + +<source>Shut down</source> +<target>シャットダウン</target> + +<source>Hibernate</source> +<target>休止状態</target> + <source>Scanning...</source> <target>スキャン中...</target> @@ -1287,15 +1293,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>初期化中...</target> -<source>Stopped</source> -<target>停止</target> - <source>Completed</source> <target>完了しました!</target> <source>&Continue</source> <target>続行(&C)</target> +<source>Progress</source> +<target>進行状況</target> + <source>Log</source> <target>ログ</target> @@ -1384,8 +1390,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>タイムスタンプ</target> -<source>Append a timestamp to each file name</source> -<target>各ファイル名にタイムスタンプを追加</target> +<source>Append a time stamp to each file name</source> +<target>各ファイル名にタイムスタンプを付加</target> <source>File</source> <target>ファイル</target> @@ -1507,9 +1513,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>%x をゴミ箱に移動できません.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>フォルダ %x のゴミ箱のチェックに失敗</target> + <source>Cannot determine final path for %x.</source> <target>%x の最終的なパスを決定できません.</target> <source>Error Code %x:</source> <target>エラーコード %x:</target> +<source>Cannot read the following XML elements:</source> +<target>次の XML要素を読み込めません:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>構成ファイル %x は部分的のみ読み込まれます.</target> + diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng index 81717d0b..cfb56922 100644 --- a/FreeFileSync/Build/Languages/korean.lng +++ b/FreeFileSync/Build/Languages/korean.lng @@ -7,9 +7,6 @@ <plural_definition>0</plural_definition> </header> -<source>MyButton</source> -<target></target> - <source>Both sides have changed since last synchronization.</source> <target>마지막 동기화 작업 이후, 양측 모두 변경 되었습니다.</target> @@ -118,6 +115,9 @@ <source>Size:</source> <target>크기:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>제외 파일 %x에 대한 내용 비교는 건너 뛰었습니다.</target> + <source>Items differ in attributes only</source> <target>항목들이 속성에서만 차이가 있습니다.</target> @@ -295,9 +295,6 @@ <source>%x items/sec</source> <target>%x 항목</target> -<source>Configuration file %x loaded partially only.</source> -<target>구성 파일 %x이(가) 부분적으로만 로드 되었음.</target> - <source>Show in Explorer</source> <target>탐색기에 표시</target> @@ -325,12 +322,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>사용자에 의한 작업 중단: 현재 작업 종료 대기 중...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>버저닝을 위한 타임 스탬프 생성 불가:</target> -<source>Cannot read the following XML elements:</source> -<target>다음 XML 요소를 읽을 수 없습니다:</target> - <source>&Open...</source> <target>열기(&O)</target> @@ -558,6 +552,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>로그 파일 %x 저장 중...</target> +<source>Stopped</source> +<target>중단</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>이 문제는 FreeFileSync 기본 창으로 전환해서 해결 가능합니다.</target> @@ -650,21 +647,6 @@ The command is triggered if: <source>Drag && drop</source> <target>드래그 앤 드랍(&&) [마우스로 파일 끌어다 놓기]</target> -<source>Close progress dialog</source> -<target>진행 표시 창 닫기</target> - -<source>Standby</source> -<target>대기</target> - -<source>Log off</source> -<target>로그오프</target> - -<source>Shut down</source> -<target>종료</target> - -<source>Hibernate</source> -<target>최대절전모드</target> - <source>Alternate comparison settings</source> <target>비교 설정 변경</target> @@ -770,6 +752,15 @@ The command is triggered if: <source>Save as batch job</source> <target>일괄 작업으로 저장</target> +<source>View type:</source> +<target>유형 보기:</target> + +<source>Select view:</source> +<target>보기 선택:</target> + +<source>Statistics:</source> +<target>통계:</target> + <source>Number of files and folders that will be created</source> <target>생성될 파일 및 폴더 개수</target> @@ -871,15 +862,15 @@ The command is triggered if: <source>On completion:</source> <target>완료 시:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>데이터베이스 파일로 동기화 방향 감지</target> + <source>Start synchronization now?</source> <target>지금 동기화를 시작하시겠습니까?</target> <source>Variant:</source> <target>베어리언트:</target> -<source>Statistics</source> -<target>통 계</target> - <source>&Don't show this dialog again</source> <target>이 대화 창을 다시 표시 안 함(&D)</target> @@ -916,8 +907,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>첫 오류 발생 시 동기화 중지</target> -<source>Show progress dialog</source> -<target>진행 표시 창 보기</target> +<source>Run minimized</source> +<target>최소화 실행</target> <source>Save log:</source> <target>로그 저장:</target> @@ -934,12 +925,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>휴지통(&R)</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>동기화에서 특정 파일을 제외시키는 필터 규칙을 선택합니다. 해당 폴더 페어(짝)에 대한 상대 파일 경로를 입력하세요.</target> @@ -961,8 +946,8 @@ The command is triggered if: <source>Maximum:</source> <target>최대:</target> -<source>&Clear</source> -<target>지우기(&C)</target> +<source>&Reset</source> +<target>리셋(&R)</target> <source>The following settings are used for all synchronization jobs.</source> <target>다음 설정은 모든 동기화 작업에 사용됩니다.</target> @@ -1060,8 +1045,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>검색</target> -<source>Select View</source> -<target>보기 선택</target> +<source>View Settings</source> +<target>설정 보기</target> <source>Overview</source> <target>개요</target> @@ -1140,12 +1125,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>필터를 통해 다음을 제외:</target> -<source>Exclude temporarily</source> -<target>임시 제외</target> - <source>Include temporarily</source> <target>임시 포함</target> +<source>Exclude temporarily</source> +<target>임시 제외</target> + <source>Delete</source> <target>삭제</target> @@ -1197,6 +1182,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>저장 안 함(&n)</target> +<source>Delete selected configurations</source> +<target>선택한 구성 삭제</target> + <source>Filter</source> <target>필터</target> @@ -1248,8 +1236,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>기본 값으로 설정</target> -<source>All folders are in sync</source> -<target>모든 폴더가 동기화 되었음</target> +<source>All files are in sync</source> +<target>모든 파일이 동기화 되었음.</target> <source>Synchronization Settings</source> <target>동기화 설정</target> @@ -1269,6 +1257,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>프로그램 업데이트 검색 중...</target> +<source>Close progress dialog</source> +<target>진행 표시 창 닫기</target> + +<source>Standby</source> +<target>대기</target> + +<source>Log off</source> +<target>로그오프</target> + +<source>Shut down</source> +<target>종료</target> + +<source>Hibernate</source> +<target>최대절전모드</target> + <source>Scanning...</source> <target>스캔 중...</target> @@ -1290,15 +1293,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>초기화 작업 중...</target> -<source>Stopped</source> -<target>중단</target> - <source>Completed</source> <target>완료</target> <source>&Continue</source> <target>계속(&C)</target> +<source>Progress</source> +<target>진행</target> + <source>Log</source> <target>로그</target> @@ -1387,8 +1390,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>타임 스탬프</target> -<source>Append a timestamp to each file name</source> -<target>각 파일 이름마다 타임스탬프 추가</target> +<source>Append a time stamp to each file name</source> +<target>각 파일 이름마다 타임 스탬프 추가</target> <source>File</source> <target>파일</target> @@ -1510,9 +1513,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>휴지통으로 %x을(를) 이동할 수 없습니다.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>폴더 %x 실패에 관한 휴지통 확인</target> + <source>Cannot determine final path for %x.</source> -<target>%x 에 대한 최종 경로를 결정할 수 없습니다.</target> +<target>%x에 대한 최종 경로를 결정할 수 없습니다.</target> <source>Error Code %x:</source> <target>오류 코드 %x</target> +<source>Cannot read the following XML elements:</source> +<target>다음 XML 요소를 읽을 수 없습니다:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>구성 파일 %x이(가) 부분적으로만 로드 되었음.</target> + diff --git a/FreeFileSync/Build/Languages/outdated/lithuanian.lng b/FreeFileSync/Build/Languages/outdated/lithuanian.lng index 19977128..017baca0 100644 --- a/FreeFileSync/Build/Languages/outdated/lithuanian.lng +++ b/FreeFileSync/Build/Languages/outdated/lithuanian.lng @@ -7,6 +7,364 @@ <plural_definition>n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3</plural_definition> </header> +<source>Checking recycle bin failed for folder %x.</source> +<target></target> + +<source>Unable to suspend system sleep mode.</source> +<target></target> + +<source>Unable to register to receive system messages.</source> +<target></target> + +<source>Append a time stamp to each file name</source> +<target></target> + +<source>Restore all hidden windows and warnings?</source> +<target></target> + +<source>Move</source> +<target></target> + +<source>Progress</source> +<target></target> + +<source>&Continue</source> +<target></target> + +<source>Select all</source> +<target></target> + +<source>Comparison Settings</source> +<target></target> + +<source>Synchronization Settings</source> +<target></target> + +<source>All files are in sync</source> +<target></target> + +<source>Delete selected configurations</source> +<target></target> + +<source>Never save &changes</source> +<target></target> + +<source> +<pluralform>Showing %y of 1 row</pluralform> +<pluralform>Showing %y of %x rows</pluralform> +</source> +<target></target> + +<source>&Execute</source> +<target></target> + +<source> +<pluralform>Do you really want to execute the command %y for one item?</pluralform> +<pluralform>Do you really want to execute the command %y for %x items?</pluralform> +</source> +<target></target> + +<source>Main Bar</source> +<target></target> + +<source>View Settings</source> +<target></target> + +<source>Folder Pairs</source> +<target></target> + +<source>Select Time Span</source> +<target></target> + +<source>Global Settings</source> +<target></target> + +<source>Delete Items</source> +<target></target> + +<source>Save as Batch Job</source> +<target></target> + +<source>Restore hidden windows</source> +<target></target> + +<source>Customize context menu:</source> +<target></target> + +<source>Delay (in seconds):</source> +<target></target> + +<source>Retry count:</source> +<target></target> + +<source>Automatic retry on error:</source> +<target></target> + +<source>Transfer file and folder permissions.</source> +<target></target> + +<source>(requires administrator rights)</source> +<target></target> + +<source>Copy shared or locked files using the Volume Shadow Copy Service.</source> +<target></target> + +<source>(recommended)</source> +<target></target> + +<source> +Copy to a temporary file (*.ffs_tmp) before overwriting target. +This guarantees a consistent state even in case of a serious error. +</source> +<target></target> + +<source>The following settings are used for all synchronization jobs.</source> +<target></target> + +<source>&Reset</source> +<target></target> + +<source>Maximum:</source> +<target></target> + +<source>Minimum:</source> +<target></target> + +<source>File size:</source> +<target></target> + +<source>Time span:</source> +<target></target> + +<source>Exclude:</source> +<target></target> + +<source>Include:</source> +<target></target> + +<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> +<target></target> + +<source>&Recycle bin</source> +<target></target> + +<source>How can I schedule a batch job?</source> +<target></target> + +<source>Limit:</source> +<target></target> + +<source>Save log:</source> +<target></target> + +<source>Run minimized</source> +<target></target> + +<source>Stop synchronization at first error</source> +<target></target> + +<source>Stop</source> +<target></target> + +<source>&Don't show this dialog again</source> +<target></target> + +<source>Variant:</source> +<target></target> + +<source>Start synchronization now?</source> +<target></target> + +<source>Detect synchronization directions with the help of database files</source> +<target></target> + +<source>On completion:</source> +<target></target> + +<source>Handle errors:</source> +<target></target> + +<source>Show examples</source> +<target></target> + +<source>Delete files:</source> +<target></target> + +<source> +- Requires and creates database files +- Detection active after initial sync +- Not supported by all file systems +</source> +<target></target> + +<source>Copy new and updated files to the right folder.</source> +<target></target> + +<source>Create a mirror backup of the left folder by adapting the right folder to match.</source> +<target></target> + +<source>More information</source> +<target></target> + +<source>Symbolic links:</source> +<target></target> + +<source>Identify equal files by comparing the file content.</source> +<target></target> + +<source>Identify equal files by comparing modification time and size.</source> +<target></target> + +<source>Select a variant:</source> +<target></target> + +<source>Statistics:</source> +<target></target> + +<source>Select view:</source> +<target></target> + +<source>View type:</source> +<target></target> + +<source>Find:</source> +<target></target> + +<source>Close search bar</source> +<target></target> + +<source>&Check for new version</source> +<target></target> + +<source>&Tools</source> +<target></target> + +<source>&Find...</source> +<target></target> + +<source>Local Filter</source> +<target></target> + +<source>Alternate Synchronization Settings</source> +<target></target> + +<source>Alternate Comparison Settings</source> +<target></target> + +<source>None</source> +<target></target> + +<source>Active</source> +<target></target> + +<source>Local filter</source> +<target></target> + +<source>Alternate synchronization settings</source> +<target></target> + +<source>Alternate comparison settings</source> +<target></target> + +<source>&Check</source> +<target></target> + +<source>&Download</source> +<target></target> + +<source>Check for Program Updates</source> +<target></target> + +<source>Serious Error</source> +<target></target> + +<source>Retrying operation...</source> +<target></target> + +<source>&Ignore subsequent errors</source> +<target></target> + +<source> +<pluralform>Automatic retry in 1 second...</pluralform> +<pluralform>Automatic retry in %x seconds...</pluralform> +</source> +<target></target> + +<source>Switching to FreeFileSync's main window</source> +<target></target> + +<source>&Don't show this warning again</source> +<target></target> + +<source>You can switch to FreeFileSync's main window to resolve this issue.</source> +<target></target> + +<source>Stopped</source> +<target></target> + +<source>Synchronization stopped</source> +<target></target> + +<source>Please enter a target folder for versioning.</source> +<target></target> + +<source>Incorrect command line:</source> +<target></target> + +<source>&Show error</source> +<target></target> + +<source>Automated Synchronization</source> +<target></target> + +<source>&Start</source> +<target></target> + +<source>Command line:</source> +<target></target> + +<source>Idle time (in seconds):</source> +<target></target> + +<source>Folders to watch:</source> +<target></target> + +<source>&View help</source> +<target></target> + +<source>Unable to create time stamp for versioning:</source> +<target></target> + +<source>Stop requested: Waiting for current operation to finish...</source> +<target></target> + +<source>%x items/sec</source> +<target></target> + +<source> +<pluralform>1 thread</pluralform> +<pluralform>%x threads</pluralform> +</source> +<target></target> + +<source> +<pluralform>1 byte</pluralform> +<pluralform>%x bytes</pluralform> +</source> +<target></target> + +<source>Detecting abandoned lock...</source> +<target></target> + +<source>Lock owner:</source> +<target></target> + +<source>Waiting while directory is locked:</source> +<target></target> + +<source>Content comparison was skipped for excluded files %x.</source> +<target></target> + <source>Both sides have changed since last synchronization.</source> <target>Abi pusės buvo pakeistos nuo paskutinio sinchronizavimo.</target> @@ -220,12 +578,6 @@ <source>Cannot get process information.</source> <target>Nepavyksta gauti eigos informacijos.</target> -<source>Waiting while directory is locked:</source> -<target></target> - -<source>Lock owner:</source> -<target></target> - <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -237,9 +589,6 @@ <pluralform>%x sek</pluralform> </target> -<source>Detecting abandoned lock...</source> -<target></target> - <source>Creating file %x</source> <target>Kuriamas failas %x</target> @@ -252,12 +601,6 @@ <source>Total time:</source> <target>Visas laikas:</target> -<source> -<pluralform>1 byte</pluralform> -<pluralform>%x bytes</pluralform> -</source> -<target></target> - <source>%x MB</source> <target>%x MB</target> @@ -276,24 +619,12 @@ <source>Scanning:</source> <target>Skenuojama:</target> -<source> -<pluralform>1 thread</pluralform> -<pluralform>%x threads</pluralform> -</source> -<target></target> - <source>Encoding extended time information: %x</source> <target>Koduojama išplėstinė laiko informacija: %x</target> <source>/sec</source> <target>/sek.</target> -<source>%x items/sec</source> -<target></target> - -<source>Configuration file %x loaded partially only.</source> -<target>Nustatymų failas %x įkeltas tik dalinai.</target> - <source>Show in Explorer</source> <target>Rodyti naršyklėje</target> @@ -318,15 +649,6 @@ <source>Volume name %x is not part of file path %y.</source> <target>Vietos vardas %x nėra failo kelio %y dalis.</target> -<source>Stop requested: Waiting for current operation to finish...</source> -<target></target> - -<source>Unable to create timestamp for versioning:</source> -<target></target> - -<source>Cannot read the following XML elements:</source> -<target>Nepavyksta perskaityti sekančių XML elementų:</target> - <source>&Open...</source> <target>&Atverti...</target> @@ -339,9 +661,6 @@ <source>&Program</source> <target>&Programa</target> -<source>&View help</source> -<target></target> - <source>&About</source> <target>&Apie</target> @@ -363,9 +682,6 @@ <source>To get started just import a .ffs_batch file.</source> <target>Kad pradėti tiesiog importuokite .ffs_batch failą.</target> -<source>Folders to watch:</source> -<target></target> - <source>Add folder</source> <target>Pridėti aplanką</target> @@ -378,15 +694,9 @@ <source>Select a folder</source> <target>Pažymėti aplanką</target> -<source>Idle time (in seconds):</source> -<target></target> - <source>Idle time between last detected change and execution of command</source> <target>Neveiklus laikas tarp paskutinio aptikto pokyčio ir komandos įvykdymo</target> -<source>Command line:</source> -<target></target> - <source> The command is triggered if: - files or subfolders change @@ -398,9 +708,6 @@ Komanda inicijuojama jei: - atsiranda nauji aplankai (pvz.: įkišamas USB raktas) </target> -<source>&Start</source> -<target></target> - <source>About</source> <target>Apie</target> @@ -410,9 +717,6 @@ Komanda inicijuojama jei: <source>All files</source> <target>Visi failai</target> -<source>Automated Synchronization</source> -<target></target> - <source>Directory monitoring active</source> <target>Katalogų stebėjimas yra aktyvus</target> @@ -425,15 +729,9 @@ Komanda inicijuojama jei: <source>&Restore</source> <target>&Atstatyti</target> -<source>&Show error</source> -<target></target> - <source>&Exit</source> <target>&Išeiti</target> -<source>Incorrect command line:</source> -<target></target> - <source>&Retry</source> <target>&Bandyti vėl</target> @@ -503,9 +801,6 @@ Komanda inicijuojama jei: <source>Target folder input field must not be empty.</source> <target>Tikslo aplanko įvesties laukas negali būti tuščias.</target> -<source>Please enter a target folder for versioning.</source> -<target></target> - <source>Source folder %x not found.</source> <target>Šaltinio aplankas %x nerastas.</target> @@ -536,9 +831,6 @@ Komanda inicijuojama jei: <source>job name</source> <target>Užduoties pavadinimas</target> -<source>Synchronization stopped</source> -<target></target> - <source>Synchronization completed with errors</source> <target>Synchronizavimas baigtas su klaidomis</target> @@ -554,48 +846,18 @@ Komanda inicijuojama jei: <source>Saving log file %x...</source> <target>Saugmas žurnalo failas %x...</target> -<source>You can switch to FreeFileSync's main window to resolve this issue.</source> -<target></target> - -<source>&Don't show this warning again</source> -<target></target> - <source>&Ignore</source> <target>&Ignoruoti</target> <source>&Switch</source> <target>&Perjungti</target> -<source>Switching to FreeFileSync's main window</source> -<target></target> - -<source> -<pluralform>Automatic retry in 1 second...</pluralform> -<pluralform>Automatic retry in %x seconds...</pluralform> -</source> -<target></target> - -<source>&Ignore subsequent errors</source> -<target></target> - -<source>Retrying operation...</source> -<target></target> - -<source>Serious Error</source> -<target></target> - -<source>Check for Program Updates</source> -<target></target> - <source>A new version of FreeFileSync is available:</source> <target>Yra nauja FreeFileSync versija:</target> <source>Download now?</source> <target>Atsiųsti dabar?</target> -<source>&Download</source> -<target></target> - <source>FreeFileSync is up to date.</source> <target>FreeFileSync yra naujausia.</target> @@ -605,9 +867,6 @@ Komanda inicijuojama jei: <source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source> <target>Dabartinės FreeFileSync versijos numeris internete nerastas. Ar norėtumėte patikrinti rankiniu būdu?</target> -<source>&Check</source> -<target></target> - <source>Symlink</source> <target>Simbolinė nuoroda</target> @@ -644,36 +903,6 @@ Komanda inicijuojama jei: <source>Drag && drop</source> <target>Vilkti ir numesti</target> -<source>Close progress dialog</source> -<target>Uždaryti eigos langą</target> - -<source>Standby</source> -<target>Stabdyti į diską</target> - -<source>Log off</source> -<target>Atsijungti</target> - -<source>Shut down</source> -<target>Išjungti kompiuterį</target> - -<source>Hibernate</source> -<target>Stabdyti į operatyviąją atmintį</target> - -<source>Alternate comparison settings</source> -<target></target> - -<source>Alternate synchronization settings</source> -<target></target> - -<source>Local filter</source> -<target></target> - -<source>Active</source> -<target></target> - -<source>None</source> -<target></target> - <source>Remove alternate settings</source> <target>Pašalinti alternatyvius nustatymus</target> @@ -686,15 +915,6 @@ Komanda inicijuojama jei: <source>Paste</source> <target>Įklijuoti</target> -<source>Alternate Comparison Settings</source> -<target></target> - -<source>Alternate Synchronization Settings</source> -<target></target> - -<source>Local Filter</source> -<target></target> - <source>&New</source> <target>&Naujas</target> @@ -716,24 +936,15 @@ Komanda inicijuojama jei: <source>&Language</source> <target>&Kalba</target> -<source>&Find...</source> -<target></target> - <source>&Export file list...</source> <target>&Eksportuoti failų sąrašą...</target> -<source>&Tools</source> -<target></target> - <source>&Check now</source> <target>&Tikrinti dabar</target> <source>Check &automatically once a week</source> <target>Tikrinti &automatiškai kartą per savaitę</target> -<source>&Check for new version</source> -<target></target> - <source>Compare</source> <target>Sulyginti</target> @@ -752,12 +963,6 @@ Komanda inicijuojama jei: <source>Swap sides</source> <target>Sukeisti puses</target> -<source>Close search bar</source> -<target></target> - -<source>Find:</source> -<target></target> - <source>Match case</source> <target>Atitikti atveją</target> @@ -776,49 +981,18 @@ Komanda inicijuojama jei: <source>Total bytes to copy</source> <target>Viso baitų kopijuoti</target> -<source>Select a variant:</source> -<target></target> - -<source>Identify equal files by comparing modification time and size.</source> -<target></target> - -<source>Identify equal files by comparing the file content.</source> -<target></target> - -<source>Symbolic links:</source> -<target></target> - -<source>More information</source> -<target></target> - <source>OK</source> <target>Gerai</target> <source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source> <target>Nustatyti ir skatinti pokyčius apbiejose pusėse. Trinimai, perkėlimai ir konfliktai yra aptinkami automatiškai naudojant duomenų bazę.</target> -<source>Create a mirror backup of the left folder by adapting the right folder to match.</source> -<target></target> - -<source>Copy new and updated files to the right folder.</source> -<target></target> - <source>Configure your own synchronization rules.</source> <target>Nustatyti Jūsų pačių sinchronizavimo taisykles.</target> <source>Detect moved files</source> <target>Rasti perkeltus failus</target> -<source> -- Requires and creates database files -- Detection active after initial sync -- Not supported by all file systems -</source> -<target></target> - -<source>Delete files:</source> -<target></target> - <source>Permanent</source> <target>Visiškai</target> @@ -840,12 +1014,6 @@ Komanda inicijuojama jei: <source>Naming convention:</source> <target>Pavadinimų taisyklės:</target> -<source>Show examples</source> -<target></target> - -<source>Handle errors:</source> -<target></target> - <source>Ignore</source> <target>Ignoruoti</target> @@ -858,21 +1026,6 @@ Komanda inicijuojama jei: <source>Show pop-up on errors or warnings</source> <target>Rodyti pranešimą esant klaidoms ar perspėjimams</target> -<source>On completion:</source> -<target></target> - -<source>Start synchronization now?</source> -<target></target> - -<source>Variant:</source> -<target></target> - -<source>Statistics</source> -<target>Statistika</target> - -<source>&Don't show this dialog again</source> -<target></target> - <source>Items found:</source> <target>Rasta elementų:</target> @@ -897,111 +1050,24 @@ Komanda inicijuojama jei: <source>&Pause</source> <target>&Pauzė</target> -<source>Stop</source> -<target></target> - <source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source> <target>Sukurti paleidimo failą sinchronizacijai be priežiūros. Norint jį paleisti reikia paspausti and failo du kartus pele arba nustatyti su užduočių planuotoju: %x</target> -<source>Stop synchronization at first error</source> -<target></target> - -<source>Show progress dialog</source> -<target>Rodyti eigos langą</target> - -<source>Save log:</source> -<target></target> - -<source>Limit:</source> -<target></target> - <source>Limit maximum number of log files</source> <target>Apriboti ataskaitų failų skaičių</target> -<source>How can I schedule a batch job?</source> -<target></target> - -<source>&Recycle bin</source> -<target></target> - -<source>Delete on both sides</source> -<target>Ištrinti abiejose pusėse</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Ištrinti abiejose pusėse net jei failas yra pažymėtas tik vienoje pusėje</target> - -<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> -<target></target> - -<source>Include:</source> -<target></target> - -<source>Exclude:</source> -<target></target> - -<source>Time span:</source> -<target></target> - -<source>File size:</source> -<target></target> - -<source>Minimum:</source> -<target></target> - -<source>Maximum:</source> -<target></target> - -<source>&Clear</source> -<target>&Išvalyti</target> - -<source>The following settings are used for all synchronization jobs.</source> -<target></target> - <source>Fail-safe file copy</source> <target>Apsauginė failo kopija</target> -<source> -Copy to a temporary file (*.ffs_tmp) before overwriting target. -This guarantees a consistent state even in case of a serious error. -</source> -<target></target> - -<source>(recommended)</source> -<target></target> - <source>Copy locked files</source> <target>Kopijuoti užrakintus failus</target> -<source>Copy shared or locked files using the Volume Shadow Copy Service.</source> -<target></target> - -<source>(requires administrator rights)</source> -<target></target> - <source>Copy file access permissions</source> <target>Kopijuoti failo leidimus</target> -<source>Transfer file and folder permissions.</source> -<target></target> - -<source>Automatic retry on error:</source> -<target></target> - -<source>Retry count:</source> -<target></target> - -<source>Delay (in seconds):</source> -<target></target> - -<source>Customize context menu:</source> -<target></target> - <source>Description</source> <target>Apibūdinimas</target> -<source>Restore hidden windows</source> -<target></target> - <source>&Default</source> <target>&Numatyta</target> @@ -1029,36 +1095,15 @@ This guarantees a consistent state even in case of a serious error. <source>Many thanks for localization:</source> <target>Labai dėkojame už vertimą:</target> -<source>Save as Batch Job</source> -<target></target> - -<source>Delete Items</source> -<target></target> - -<source>Global Settings</source> -<target></target> - -<source>Select Time Span</source> -<target></target> - -<source>Folder Pairs</source> -<target></target> - <source>Find</source> <target>Rasti</target> -<source>Select View</source> -<target></target> - <source>Overview</source> <target>Apžvalga</target> <source>Configuration</source> <target>Nustatymai</target> -<source>Main Bar</source> -<target></target> - <source>Open...</source> <target>Atverti...</target> @@ -1081,15 +1126,6 @@ This guarantees a consistent state even in case of a serious error. <target>Patvirtinti</target> <source> -<pluralform>Do you really want to execute the command %y for one item?</pluralform> -<pluralform>Do you really want to execute the command %y for %x items?</pluralform> -</source> -<target></target> - -<source>&Execute</source> -<target></target> - -<source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> </source> @@ -1111,12 +1147,6 @@ This guarantees a consistent state even in case of a serious error. <pluralform>%x failas</pluralform> </target> -<source> -<pluralform>Showing %y of 1 row</pluralform> -<pluralform>Showing %y of %x rows</pluralform> -</source> -<target></target> - <source>Set direction:</source> <target>Nustatyti kryptį:</target> @@ -1129,12 +1159,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Neįtraukti per filtrą:</target> -<source>Exclude temporarily</source> -<target>Neįtraukti laikinai</target> - <source>Include temporarily</source> <target>Įtraukti laikinai</target> +<source>Exclude temporarily</source> +<target>Neįtraukti laikinai</target> + <source>Delete</source> <target>Trinti</target> @@ -1180,9 +1210,6 @@ This guarantees a consistent state even in case of a serious error. <source>Do you want to save changes to %x?</source> <target>Ar norite išsaugoti %x pakeitimus?</target> -<source>Never save &changes</source> -<target></target> - <source>Do&n't save</source> <target>&Nesaugoti</target> @@ -1237,15 +1264,6 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Nustatyti kaip numatytą</target> -<source>All folders are in sync</source> -<target>Visi aplankai susinchronizuoti</target> - -<source>Synchronization Settings</source> -<target></target> - -<source>Comparison Settings</source> -<target></target> - <source>Cannot find %x</source> <target>Nepavyksta rasti %x</target> @@ -1258,6 +1276,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Ieškoma programos atnaujinimų...</target> +<source>Close progress dialog</source> +<target>Uždaryti eigos langą</target> + +<source>Standby</source> +<target>Stabdyti į diską</target> + +<source>Log off</source> +<target>Atsijungti</target> + +<source>Shut down</source> +<target>Išjungti kompiuterį</target> + +<source>Hibernate</source> +<target>Stabdyti į operatyviąją atmintį</target> + <source>Scanning...</source> <target>Skenuojama...</target> @@ -1270,24 +1303,15 @@ This guarantees a consistent state even in case of a serious error. <source>Warning</source> <target>Perspėjimas</target> -<source>Select all</source> -<target></target> - <source>Paused</source> <target>Pristabdyta</target> <source>Initializing...</source> <target>Pradedama...</target> -<source>Stopped</source> -<target></target> - <source>Completed</source> <target>Baigta</target> -<source>&Continue</source> -<target></target> - <source>Log</source> <target>Archyvas</target> @@ -1326,9 +1350,6 @@ This guarantees a consistent state even in case of a serious error. <pluralform>Ar tikrai norite perkelti poziciją %x į šiukšklių dėžę?</pluralform> </target> -<source>Move</source> -<target></target> - <source> <pluralform>Do you really want to delete the following item?</pluralform> <pluralform>Do you really want to delete the following %x items?</pluralform> @@ -1367,9 +1388,6 @@ This guarantees a consistent state even in case of a serious error. <source>- Other side's counterpart to %item_folder%</source> <target>- Kitos pusės atitikmuo %item_folder%</target> -<source>Restore all hidden windows and warnings?</source> -<target></target> - <source>Leave as unresolved conflict</source> <target>Palikti kaip neišpręstą konfliktą</target> @@ -1382,9 +1400,6 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Laiko žymė</target> -<source>Append a timestamp to each file name</source> -<target>Pridėti laiko žymę kiekvieno failo pavadinime</target> - <source>File</source> <target>Failas</target> @@ -1499,15 +1514,9 @@ This guarantees a consistent state even in case of a serious error. <pluralform>%x diena</pluralform> </target> -<source>Unable to register to receive system messages.</source> -<target></target> - <source>Cannot set privilege %x.</source> <target>Nepavyksta nustatyti privilegijos %x.</target> -<source>Unable to suspend system sleep mode.</source> -<target></target> - <source>Cannot change process I/O priorities.</source> <target>Nepavyksta pakeisti proceso I/O prioritetų.</target> @@ -1520,3 +1529,9 @@ This guarantees a consistent state even in case of a serious error. <source>Error Code %x:</source> <target>Klaidos kodas %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Nepavyksta perskaityti sekančių XML elementų:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Nustatymų failas %x įkeltas tik dalinai.</target> + diff --git a/FreeFileSync/Build/Languages/outdated/norwegian.lng b/FreeFileSync/Build/Languages/outdated/norwegian.lng index 6d1fe635..7a789c66 100644 --- a/FreeFileSync/Build/Languages/outdated/norwegian.lng +++ b/FreeFileSync/Build/Languages/outdated/norwegian.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Størrelse:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target></target> + <source>Items differ in attributes only</source> <target>Elementer har kun forskjellige attributter</target> @@ -289,9 +292,6 @@ <source>%x items/sec</source> <target></target> -<source>Configuration file %x loaded partially only.</source> -<target>Innstillingsfilen %x bare delvis lastet.</target> - <source>Show in Explorer</source> <target>Vis i utforsker</target> @@ -319,12 +319,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target></target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target></target> -<source>Cannot read the following XML elements:</source> -<target>Kan ikke lese følgende XML-elementer:</target> - <source>&Open...</source> <target>&Åpne...</target> @@ -552,6 +549,9 @@ Kommandoen utløses hvis: <source>Saving log file %x...</source> <target>Lagrer loggfil %x...</target> +<source>Stopped</source> +<target></target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target></target> @@ -642,21 +642,6 @@ Kommandoen utløses hvis: <source>Drag && drop</source> <target>Dra && slipp</target> -<source>Close progress dialog</source> -<target>Lukk status vindu</target> - -<source>Standby</source> -<target>Standby</target> - -<source>Log off</source> -<target>Logg av</target> - -<source>Shut down</source> -<target>Slå av maskinen</target> - -<source>Hibernate</source> -<target>Sett i dvalemodus</target> - <source>Alternate comparison settings</source> <target></target> @@ -762,6 +747,15 @@ Kommandoen utløses hvis: <source>Save as batch job</source> <target>Lagre som sammensatt oppgave</target> +<source>View type:</source> +<target></target> + +<source>Select view:</source> +<target></target> + +<source>Statistics:</source> +<target></target> + <source>Number of files and folders that will be created</source> <target>Antall filer og mapper som vil opprettes</target> @@ -859,15 +853,15 @@ Kommandoen utløses hvis: <source>On completion:</source> <target></target> +<source>Detect synchronization directions with the help of database files</source> +<target></target> + <source>Start synchronization now?</source> <target></target> <source>Variant:</source> <target></target> -<source>Statistics</source> -<target>Statistikk</target> - <source>&Don't show this dialog again</source> <target></target> @@ -904,8 +898,8 @@ Kommandoen utløses hvis: <source>Stop synchronization at first error</source> <target></target> -<source>Show progress dialog</source> -<target>Vis statuslinje</target> +<source>Run minimized</source> +<target></target> <source>Save log:</source> <target></target> @@ -922,12 +916,6 @@ Kommandoen utløses hvis: <source>&Recycle bin</source> <target></target> -<source>Delete on both sides</source> -<target>Slett på begge sider</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Slett på begge sider selv om filen bare er valgt på en side</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target></target> @@ -949,7 +937,7 @@ Kommandoen utløses hvis: <source>Maximum:</source> <target></target> -<source>&Clear</source> +<source>&Reset</source> <target></target> <source>The following settings are used for all synchronization jobs.</source> @@ -1045,7 +1033,7 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Søk</target> -<source>Select View</source> +<source>View Settings</source> <target></target> <source>Overview</source> @@ -1123,12 +1111,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Ekskluder via filter:</target> -<source>Exclude temporarily</source> -<target>Ekskluder midlertidig</target> - <source>Include temporarily</source> <target>Inkluder midlertidig</target> +<source>Exclude temporarily</source> +<target>Ekskluder midlertidig</target> + <source>Delete</source> <target>Slett</target> @@ -1180,6 +1168,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&Ikke lagre</target> +<source>Delete selected configurations</source> +<target></target> + <source>Filter</source> <target>Filter</target> @@ -1231,8 +1222,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Set som standard</target> -<source>All folders are in sync</source> -<target>Alle mapper er synkroniserte</target> +<source>All files are in sync</source> +<target></target> <source>Synchronization Settings</source> <target></target> @@ -1252,6 +1243,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target></target> +<source>Close progress dialog</source> +<target>Lukk status vindu</target> + +<source>Standby</source> +<target>Standby</target> + +<source>Log off</source> +<target>Logg av</target> + +<source>Shut down</source> +<target>Slå av maskinen</target> + +<source>Hibernate</source> +<target>Sett i dvalemodus</target> + <source>Scanning...</source> <target>Skanner...</target> @@ -1273,15 +1279,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Initialiserer...</target> -<source>Stopped</source> -<target></target> - <source>Completed</source> <target>Fullført</target> <source>&Continue</source> <target></target> +<source>Progress</source> +<target></target> + <source>Log</source> <target></target> @@ -1366,8 +1372,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target></target> -<source>Append a timestamp to each file name</source> -<target>Legg til et tidsstempel til hvert filnavn</target> +<source>Append a time stamp to each file name</source> +<target></target> <source>File</source> <target>Fil</target> @@ -1492,9 +1498,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target></target> +<source>Checking recycle bin failed for folder %x.</source> +<target></target> + <source>Cannot determine final path for %x.</source> <target></target> <source>Error Code %x:</source> <target>Feil kode %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Kan ikke lese følgende XML-elementer:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Innstillingsfilen %x bare delvis lastet.</target> + diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng index e4f5b3ac..fa0e36f9 100644 --- a/FreeFileSync/Build/Languages/polish.lng +++ b/FreeFileSync/Build/Languages/polish.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Rozmiar:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Porównywanie zostało pominięte dla wykluczonych plików %x.</target> + <source>Items differ in attributes only</source> <target>Elementy różnią się wyłącznie atrybutami</target> @@ -298,9 +301,6 @@ <source>%x items/sec</source> <target>%x elementów/sek</target> -<source>Configuration file %x loaded partially only.</source> -<target>Plik konfiguracyjny %x został wczytany tylko częściowo.</target> - <source>Show in Explorer</source> <target>Wyświetl w Eksploratorze</target> @@ -328,11 +328,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Przerwanie: Oczekiwanie na zakończenie aktualnej operacji...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Nie można utowrzyć znacznika czasu dla wersjonowania:</target> - -<source>Cannot read the following XML elements:</source> -<target>Nie można odczytać elementu XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Nie można utworzyć znacznika czasu:</target> <source>&Open...</source> <target>&Otwórz...</target> @@ -561,6 +558,9 @@ Komenda jest wykonywana gdy: <source>Saving log file %x...</source> <target>Zapisywanie pliku logów %x...</target> +<source>Stopped</source> +<target>Zatrzymana</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Możesz przejść do głównego okna FreeFileSync abe rozwiązać ten problem.</target> @@ -655,21 +655,6 @@ Komenda jest wykonywana gdy: <source>Drag && drop</source> <target>Drag && Drop</target> -<source>Close progress dialog</source> -<target>Zamknij okno postępu</target> - -<source>Standby</source> -<target>Przejdź w stan uśpienia</target> - -<source>Log off</source> -<target>Wyloguj użytkownika</target> - -<source>Shut down</source> -<target>Wyłącz komputer</target> - -<source>Hibernate</source> -<target>Przejdź w stan hibernacji</target> - <source>Alternate comparison settings</source> <target>Alternatywne ustawienia porównywania</target> @@ -775,6 +760,15 @@ Komenda jest wykonywana gdy: <source>Save as batch job</source> <target>Zapisz w trybie wsadowym</target> +<source>View type:</source> +<target>Typ widoku:</target> + +<source>Select view:</source> +<target>Widok:</target> + +<source>Statistics:</source> +<target>Statystyki:</target> + <source>Number of files and folders that will be created</source> <target>Liczba plików i katalogów, które zostaną utworzone</target> @@ -876,15 +870,15 @@ Komenda jest wykonywana gdy: <source>On completion:</source> <target>Po zakończeniu:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Kierunki synchronizacji określane są przy pomocy bazy danych</target> + <source>Start synchronization now?</source> <target>Rozpocząć teraz synchronizację?</target> <source>Variant:</source> <target>Wariant:</target> -<source>Statistics</source> -<target>Statystyki</target> - <source>&Don't show this dialog again</source> <target>&Nie pokazuj więcej tego okna</target> @@ -904,7 +898,7 @@ Komenda jest wykonywana gdy: <target>Synchronizuję...</target> <source>Minimize to notification area</source> -<target>Minimalizuj do obszaru powiadomiń</target> +<target>Minimalizuj do obszaru powiadomień</target> <source>Close</source> <target>Zamknij</target> @@ -921,8 +915,8 @@ Komenda jest wykonywana gdy: <source>Stop synchronization at first error</source> <target>Przerwij synchronizację przy pierwszym błędzie</target> -<source>Show progress dialog</source> -<target>Pokaż okno postępu</target> +<source>Run minimized</source> +<target>Uruchom zminimalizowane</target> <source>Save log:</source> <target>Zapisz logi:</target> @@ -939,12 +933,6 @@ Komenda jest wykonywana gdy: <source>&Recycle bin</source> <target>&Kosz systemowy</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Określ reguły filtrowania w celu wykluczenia niektórych plików z synchronizacji. Ścieżki plików muszą być relatywne do podanych par katalogów.</target> @@ -966,8 +954,8 @@ Komenda jest wykonywana gdy: <source>Maximum:</source> <target>Maksymalny:</target> -<source>&Clear</source> -<target>W&yczyść</target> +<source>&Reset</source> +<target>&Resetuj</target> <source>The following settings are used for all synchronization jobs.</source> <target>Następujące ustawienia stosowane są do wszystkich zadań synchronizacji.</target> @@ -1065,8 +1053,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Find</source> <target>Znajdź</target> -<source>Select View</source> -<target>Widok</target> +<source>View Settings</source> +<target>Ustawienia widoku</target> <source>Overview</source> <target>Przegląd</target> @@ -1153,12 +1141,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Exclude via filter:</source> <target>Dodaj filtr:</target> -<source>Exclude temporarily</source> -<target>Wyklucz tymczasowo</target> - <source>Include temporarily</source> <target>Dołącz tymczasowo</target> +<source>Exclude temporarily</source> +<target>Wyklucz tymczasowo</target> + <source>Delete</source> <target>Usuń</target> @@ -1210,6 +1198,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Do&n't save</source> <target>&Nie zapisuj</target> +<source>Delete selected configurations</source> +<target>Usuń wybrane konfiguracje</target> + <source>Filter</source> <target>Filtr</target> @@ -1261,8 +1252,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Set as default</source> <target>Zapisz jako domyślne</target> -<source>All folders are in sync</source> -<target>Wszystkie katalogi są zsynchronizowane</target> +<source>All files are in sync</source> +<target>Pliki zsynchronizowane</target> <source>Synchronization Settings</source> <target>Ustawienia synchronizacji</target> @@ -1282,6 +1273,21 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Searching for program updates...</source> <target>Wyszukiwanie aktualizacji...</target> +<source>Close progress dialog</source> +<target>Zamknij okno postępu</target> + +<source>Standby</source> +<target>Przejdź w stan uśpienia</target> + +<source>Log off</source> +<target>Wyloguj użytkownika</target> + +<source>Shut down</source> +<target>Wyłącz komputer</target> + +<source>Hibernate</source> +<target>Przejdź w stan hibernacji</target> + <source>Scanning...</source> <target>Skanowanie...</target> @@ -1303,15 +1309,15 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Initializing...</source> <target>Inicjalizacja...</target> -<source>Stopped</source> -<target>Zatrzymana</target> - <source>Completed</source> <target>Zakończono</target> <source>&Continue</source> <target>&Kontynuuj</target> +<source>Progress</source> +<target>Postęp</target> + <source>Log</source> <target>Log</target> @@ -1346,7 +1352,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <target> <pluralform>Czy na pewno chcesz przenieść ten element do kosza?</pluralform> <pluralform>Czy na pewno chcesz przenieść te %x elementy do kosza?</pluralform> -<pluralform>Czy na pewno chcesz przenieść te %x elemntów do kosza?</pluralform> +<pluralform>Czy na pewno chcesz przenieść te %x elementów do kosza?</pluralform> </target> <source>Move</source> @@ -1404,8 +1410,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Time stamp</source> <target>Znacznik czasu</target> -<source>Append a timestamp to each file name</source> -<target>Dołącz znacznik czasu do nazwy każdego pliku</target> +<source>Append a time stamp to each file name</source> +<target>Dołącz datę do nazwy każdego pliku</target> <source>File</source> <target>Plik</target> @@ -1533,9 +1539,18 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp <source>Unable to move %x to the recycle bin.</source> <target>Nie można przenieść %x do kosza.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Sprawdzanie kosza systemowego dla katalogu %x zakończone niepowodzeniem.</target> + <source>Cannot determine final path for %x.</source> <target>Nie można określić ostatecznej ścieżki dla %x.</target> <source>Error Code %x:</source> <target>Kod błędu %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Nie można odczytać elementu XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Plik konfiguracyjny %x został wczytany tylko częściowo.</target> + diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng index cb53257b..f6e15a74 100644 --- a/FreeFileSync/Build/Languages/portuguese.lng +++ b/FreeFileSync/Build/Languages/portuguese.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Tamanho:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Comparação por conteúdo foi ignorada para o ficheiro excluído %x.</target> + <source>Items differ in attributes only</source> <target>Itens diferem apenas nos atributos</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x itens/seg</target> -<source>Configuration file %x loaded partially only.</source> -<target>Ficheiro de configuração %x carregado parcialmente.</target> - <source>Show in Explorer</source> <target>Mostrar no Explorer</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Paragem solicitada: À espera que termine a operação actual...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Não é possível criar timestamp para controle de versões:</target> - -<source>Cannot read the following XML elements:</source> -<target>Não é possível ler os elementos XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Não é possível criar data/hora para versionamento:</target> <source>&Open...</source> <target>&Abrir...</target> @@ -558,6 +555,9 @@ O comando é executado se: <source>Saving log file %x...</source> <target>A guardar ficheiro log %x...</target> +<source>Stopped</source> +<target>Parado</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Pode mudar para a janela principal do FreeFileSync para resovler este problema.</target> @@ -651,21 +651,6 @@ O comando é executado se: <source>Drag && drop</source> <target>Arrastar && Largar</target> -<source>Close progress dialog</source> -<target>Fechar diálogo de progresso</target> - -<source>Standby</source> -<target>Standby</target> - -<source>Log off</source> -<target>Terminar sessão</target> - -<source>Shut down</source> -<target>Desligar</target> - -<source>Hibernate</source> -<target>Hibernar</target> - <source>Alternate comparison settings</source> <target>Definições de comparação alternativas</target> @@ -721,7 +706,7 @@ O comando é executado se: <target>&Opções</target> <source>&Language</source> -<target>&Língua</target> +<target>&Idioma</target> <source>&Find...</source> <target>&Procurar...</target> @@ -771,6 +756,15 @@ O comando é executado se: <source>Save as batch job</source> <target>Guardar como batch</target> +<source>View type:</source> +<target>Tipo de vista:</target> + +<source>Select view:</source> +<target>Seleccionar vista:</target> + +<source>Statistics:</source> +<target>Estatísticas:</target> + <source>Number of files and folders that will be created</source> <target>Número de ficheiros e pastas a ser criados</target> @@ -872,15 +866,15 @@ O comando é executado se: <source>On completion:</source> <target>Ao completar:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detectar a direcção de sincronização com a ajuda de base de dados</target> + <source>Start synchronization now?</source> <target>Iniciar sincronização agora?</target> <source>Variant:</source> <target>Variante:</target> -<source>Statistics</source> -<target>Estatísticas</target> - <source>&Don't show this dialog again</source> <target>&Não mostrar este diálogo novamente</target> @@ -917,8 +911,8 @@ O comando é executado se: <source>Stop synchronization at first error</source> <target>Para sincronização ao primeiro erro</target> -<source>Show progress dialog</source> -<target>Mostrar diálogo de progresso</target> +<source>Run minimized</source> +<target>Correr minimizado</target> <source>Save log:</source> <target>Guardar registo:</target> @@ -935,12 +929,6 @@ O comando é executado se: <source>&Recycle bin</source> <target>&Reciclagem</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Seleccionar regras de filtro para excluir certos ficheiros da sincronização. Insira os caminhos relativos ao par de directórios correspondente.</target> @@ -962,8 +950,8 @@ O comando é executado se: <source>Maximum:</source> <target>Máximo</target> -<source>&Clear</source> -<target>&Limpar</target> +<source>&Reset</source> +<target>&Reiniciar</target> <source>The following settings are used for all synchronization jobs.</source> <target>As seguintes definições são usadas para todas as sincronizações.</target> @@ -1061,8 +1049,8 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Find</source> <target>Procurar</target> -<source>Select View</source> -<target>Seleccionar Vista</target> +<source>View Settings</source> +<target>Ver Opções</target> <source>Overview</source> <target>Vista</target> @@ -1145,12 +1133,12 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Exclude via filter:</source> <target>Excluir por filtro:</target> -<source>Exclude temporarily</source> -<target>Excluir temporariamente</target> - <source>Include temporarily</source> <target>Incluir temporariamente</target> +<source>Exclude temporarily</source> +<target>Excluir temporariamente</target> + <source>Delete</source> <target>Eliminar</target> @@ -1202,6 +1190,9 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Do&n't save</source> <target>Não g&uardar</target> +<source>Delete selected configurations</source> +<target>Eliminar configurações seleccionadas</target> + <source>Filter</source> <target>Filtro</target> @@ -1253,8 +1244,8 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Set as default</source> <target>Definir como padrão</target> -<source>All folders are in sync</source> -<target>Todas as pastas estão sincronizadas</target> +<source>All files are in sync</source> +<target>Todos os ficheiros estão sincronizados</target> <source>Synchronization Settings</source> <target>Definições de Sincronização</target> @@ -1274,6 +1265,21 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Searching for program updates...</source> <target>A procurar actualizações do programa...</target> +<source>Close progress dialog</source> +<target>Fechar diálogo de progresso</target> + +<source>Standby</source> +<target>Standby</target> + +<source>Log off</source> +<target>Terminar sessão</target> + +<source>Shut down</source> +<target>Desligar</target> + +<source>Hibernate</source> +<target>Hibernar</target> + <source>Scanning...</source> <target>A pesquisar...</target> @@ -1295,15 +1301,15 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Initializing...</source> <target>A iniciar...</target> -<source>Stopped</source> -<target>Parado</target> - <source>Completed</source> <target>Terminado</target> <source>&Continue</source> <target>&Continuar</target> +<source>Progress</source> +<target>Progresso</target> + <source>Log</source> <target>Registo</target> @@ -1394,8 +1400,8 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Time stamp</source> <target>Selo temporal</target> -<source>Append a timestamp to each file name</source> -<target>Juntar selo temporal a cada nome de ficheiro</target> +<source>Append a time stamp to each file name</source> +<target>Adicione data/hora ao nome de cada ficheiro</target> <source>File</source> <target>Ficheiro</target> @@ -1520,9 +1526,18 @@ Isto garante um estado consistente mesmo em caso de falha grave. <source>Unable to move %x to the recycle bin.</source> <target>Não é possível mover %x para a reciclagem.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Verificar a reciclagem falhou no directório %x.</target> + <source>Cannot determine final path for %x.</source> <target>Não é possível determinar o caminho final de %x.</target> <source>Error Code %x:</source> <target>Código de erro %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Não é possível ler os elementos XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Ficheiro de configuração %x carregado parcialmente.</target> + diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng index 79795af2..f63eb801 100644 --- a/FreeFileSync/Build/Languages/portuguese_br.lng +++ b/FreeFileSync/Build/Languages/portuguese_br.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Tamanho:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>A comparação por conteúdo foi ingorada para os arquivos excluídos %x.</target> + <source>Items differ in attributes only</source> <target>Os itens diferem apenas nos atributos</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x itens/seg</target> -<source>Configuration file %x loaded partially only.</source> -<target>O arquivo de configuração %x foi carregado parcialmente.</target> - <source>Show in Explorer</source> <target>Mostrar no Explorer</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Interromper solicitado: Aguardando operação ser finalizada...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Erro ao criar estampa de tempo para controle de versão:</target> - -<source>Cannot read the following XML elements:</source> -<target>Não foi possível ler os seguintes elementos XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Não foi possível criar a estampa de tempo para o controle de versões:</target> <source>&Open...</source> <target>&Abrir...</target> @@ -558,6 +555,9 @@ O comando é disparado se: <source>Saving log file %x...</source> <target>Salvando arquivo de log %x...</target> +<source>Stopped</source> +<target>Interrompido</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Você pode alternar para a janela principal do FreeFileSync para resolver este problema.</target> @@ -651,21 +651,6 @@ O comando é disparado se: <source>Drag && drop</source> <target>Arrastar && Soltar</target> -<source>Close progress dialog</source> -<target>Fechar indicador de progresso</target> - -<source>Standby</source> -<target>Em espera</target> - -<source>Log off</source> -<target>Fazer logoff</target> - -<source>Shut down</source> -<target>Desligar</target> - -<source>Hibernate</source> -<target>Hibernar</target> - <source>Alternate comparison settings</source> <target>Configurações alternativas de comparação</target> @@ -771,6 +756,15 @@ O comando é disparado se: <source>Save as batch job</source> <target>Salvar como tarefa em lote</target> +<source>View type:</source> +<target>Tipo de visualização:</target> + +<source>Select view:</source> +<target>Selecione visualização:</target> + +<source>Statistics:</source> +<target>Estatísticas:</target> + <source>Number of files and folders that will be created</source> <target>Número de arquivos e pastas que serão criados</target> @@ -872,15 +866,15 @@ O comando é disparado se: <source>On completion:</source> <target>Ao finalizar:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detecta a direção de sincronização com a ajuda do arquivo de banco de dados</target> + <source>Start synchronization now?</source> <target>Iniciar sincronização agora?</target> <source>Variant:</source> <target>Variante:</target> -<source>Statistics</source> -<target>Estatísticas</target> - <source>&Don't show this dialog again</source> <target>&Não mostrar este diálogo novamente</target> @@ -917,8 +911,8 @@ O comando é disparado se: <source>Stop synchronization at first error</source> <target>Interrompe a sincronização ao primeiro erro</target> -<source>Show progress dialog</source> -<target>Mostrar indicador de progresso</target> +<source>Run minimized</source> +<target>Executar minimizado</target> <source>Save log:</source> <target>Salvar arquivo de log:</target> @@ -935,12 +929,6 @@ O comando é disparado se: <source>&Recycle bin</source> <target>&Lixeira</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>Apaga em ambos os lados mesmo se o arquivo está selecionado só em um lado</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Selecione regras de filtro para exlcuir certos arquivos da sincrinização. Entre com os caminhos relativos dos pares de pastas correspondentes.</target> @@ -962,8 +950,8 @@ O comando é disparado se: <source>Maximum:</source> <target>Máximo:</target> -<source>&Clear</source> -<target>&Limpar</target> +<source>&Reset</source> +<target>&Limpar tudo</target> <source>The following settings are used for all synchronization jobs.</source> <target>As seguintes configurações são utilizadas para todas as tarefas de sincronização.</target> @@ -1061,8 +1049,8 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Find</source> <target>Localizar</target> -<source>Select View</source> -<target>Selecionar Visualização</target> +<source>View Settings</source> +<target>Ver configurações</target> <source>Overview</source> <target>Parâmetros</target> @@ -1145,12 +1133,12 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Exclude via filter:</source> <target>Excluir via filtro:</target> -<source>Exclude temporarily</source> -<target>Excluir temporariamente</target> - <source>Include temporarily</source> <target>Incluir temporariamente</target> +<source>Exclude temporarily</source> +<target>Excluir temporariamente</target> + <source>Delete</source> <target>Apagar</target> @@ -1202,6 +1190,9 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Do&n't save</source> <target>&Não salvar</target> +<source>Delete selected configurations</source> +<target>Apagar configurações selecionadas</target> + <source>Filter</source> <target>Filtro</target> @@ -1253,8 +1244,8 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Set as default</source> <target>Definir como padrão</target> -<source>All folders are in sync</source> -<target>Todas as pastas estão sincronizadas</target> +<source>All files are in sync</source> +<target>Todos os arquivos estão em sincronia</target> <source>Synchronization Settings</source> <target>Configurações de Sincronização</target> @@ -1274,6 +1265,21 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Searching for program updates...</source> <target>Procurando atualizações do programa...</target> +<source>Close progress dialog</source> +<target>Fechar indicador de progresso</target> + +<source>Standby</source> +<target>Em espera</target> + +<source>Log off</source> +<target>Fazer logoff</target> + +<source>Shut down</source> +<target>Desligar</target> + +<source>Hibernate</source> +<target>Hibernar</target> + <source>Scanning...</source> <target>Pesquisando...</target> @@ -1295,15 +1301,15 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Initializing...</source> <target>Inicializando...</target> -<source>Stopped</source> -<target>Interrompido</target> - <source>Completed</source> <target>Finalizado</target> <source>&Continue</source> <target>&Continuar</target> +<source>Progress</source> +<target>Progresso</target> + <source>Log</source> <target>Log</target> @@ -1394,8 +1400,8 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Time stamp</source> <target>Estampa de tempo</target> -<source>Append a timestamp to each file name</source> -<target>Atribuir uma estampa de tempo para cada nome de arquivo</target> +<source>Append a time stamp to each file name</source> +<target>Coloca uma estampa de tempo para cada nome de arquivo</target> <source>File</source> <target>Arquivo</target> @@ -1520,9 +1526,18 @@ Isto garante um estado consistente mesmo em caso de erro grave. <source>Unable to move %x to the recycle bin.</source> <target>Não foi possível mover %x para a Lixeira.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Verificando falha na Lixeira para pasta %x.</target> + <source>Cannot determine final path for %x.</source> <target>Não foi possível determinar o caminho final para %x.</target> <source>Error Code %x:</source> <target>Código do Erro %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Não foi possível ler os seguintes elementos XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>O arquivo de configuração %x foi carregado parcialmente.</target> + diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng index a7f6b931..2f654052 100644 --- a/FreeFileSync/Build/Languages/romanian.lng +++ b/FreeFileSync/Build/Languages/romanian.lng @@ -11,7 +11,7 @@ <target>Ambele părți s-au modificat de la ultima sincronizare.</target> <source>Cannot determine sync-direction:</source> -<target>Nu pot determina sensul de sincronizare:</target> +<target>Nu pot determina direcția de sincronizare:</target> <source>No change since last synchronization.</source> <target>Nu sînt schimbări de la ultima sincronizare.</target> @@ -20,7 +20,7 @@ <target>Intrarea în baza de date nu e sincronizată, ținînd cont de setările curente.</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> +<target>Baza de date existentă va fi făcută compatibilă cu versiunea softului și apoi va fi setată direcția implicită de sincronizare: Filele vechi vor fi suprascrise de cele noi.</target> <source>Checking recycle bin availability for folder %x...</source> <target>Verific dacă Reciclatorul e disponibil pentru dosarul %x...</target> @@ -115,6 +115,9 @@ <source>Size:</source> <target>Mărime:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Compararea conținutului a fost sărită pentru filele excluse %x.</target> + <source>Items differ in attributes only</source> <target>Elementele diferă doar prin atributele lor</target> @@ -296,10 +299,7 @@ <target>/sec</target> <source>%x items/sec</source> -<target>%x itemuri/sec</target> - -<source>Configuration file %x loaded partially only.</source> -<target>Fila de configurație %x a fost deschisă doar parțial.</target> +<target>%x elemente/sec</target> <source>Show in Explorer</source> <target>Arată în Exploratorul de File</target> @@ -328,12 +328,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Oprire solicitată: Aștept terminarea operației în curs...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Nu pot crea marcajul de timp pentru versionare:</target> -<source>Cannot read the following XML elements:</source> -<target>Nu pot citi următoarele elemente XML:</target> - <source>&Open...</source> <target>&Deschide...</target> @@ -451,7 +448,7 @@ Comanda este declanșată dacă: <target>Timpul și Mărimea Filelor</target> <source>Two way</source> -<target>Ambele Sensuri</target> +<target>Ambele Direcții</target> <source>Mirror</source> <target>Clonare</target> @@ -520,7 +517,7 @@ Comanda este declanșată dacă: <target>Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate:</target> <source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source> -<target>Dosarele următoare diferă foarte mult. Asigură-te că ai potrivit pentru sincronizare dosarele corecte.</target> +<target>Dosarele următoare diferă foarte mult. Asigură-te că ai ales pentru sincronizare dosarele corecte.</target> <source>Not enough free disk space available in:</source> <target>Spațiu de stocare insuficient pe:</target> @@ -561,6 +558,9 @@ Comanda este declanșată dacă: <source>Saving log file %x...</source> <target>Salvez fila jurnal %x...</target> +<source>Stopped</source> +<target>Oprită</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Poți comuta la fereastra principală FreeFileSync pentru a rezolva această problemă.</target> @@ -655,21 +655,6 @@ Comanda este declanșată dacă: <source>Drag && drop</source> <target>Trage și pune un dosar mai jos sau explorează către el</target> -<source>Close progress dialog</source> -<target>Închide Fereastra cu Progresul Sincronizării</target> - -<source>Standby</source> -<target>Pune Calculatorul în Stare de Veghe [Stand-by]</target> - -<source>Log off</source> -<target>Deloghează Utilizatorul [Log off]</target> - -<source>Shut down</source> -<target>Închide Calculatorul [Shut down]</target> - -<source>Hibernate</source> -<target>Pune Calculatorul în Hibernare</target> - <source>Alternate comparison settings</source> <target>Setări alternative de comparare</target> @@ -775,6 +760,15 @@ Comanda este declanșată dacă: <source>Save as batch job</source> <target>Salvează ca Sarcină Set</target> +<source>View type:</source> +<target>Tipul de Vedere:</target> + +<source>Select view:</source> +<target>Selectează Vederea:</target> + +<source>Statistics:</source> +<target>Statistici:</target> + <source>Number of files and folders that will be created</source> <target>Numărul de file și dosare care vor fi create</target> @@ -876,15 +870,15 @@ Comanda este declanșată dacă: <source>On completion:</source> <target>La terminare:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detectează direcțiile de sincronizare cu ajutorul filelor bază de date</target> + <source>Start synchronization now?</source> <target>Pornesc sincronizarea acum?</target> <source>Variant:</source> <target>Variantă:</target> -<source>Statistics</source> -<target>Statistici</target> - <source>&Don't show this dialog again</source> <target>Nu arăta acest &dialog din nou</target> @@ -921,8 +915,8 @@ Comanda este declanșată dacă: <source>Stop synchronization at first error</source> <target>Oprește sincronizarea la prima eroare întîlnită</target> -<source>Show progress dialog</source> -<target>Arată progresul sincronizării</target> +<source>Run minimized</source> +<target>Rulează minimizat</target> <source>Save log:</source> <target>Salvează jurnalul:</target> @@ -939,12 +933,6 @@ Comanda este declanșată dacă: <source>&Recycle bin</source> <target>&Reciclator</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Selectează regulile filtrului pentru a exclude anumite file de la sincronizare. Introdu căile filelor relative la perechea lor de dosare corespondentă.</target> @@ -966,8 +954,8 @@ Comanda este declanșată dacă: <source>Maximum:</source> <target>Maxim:</target> -<source>&Clear</source> -<target>&Curăță</target> +<source>&Reset</source> +<target>&Resetează</target> <source>The following settings are used for all synchronization jobs.</source> <target>Setările următoare sînt folosite pentru toate sarcinile de sincronizare.</target> @@ -1065,8 +1053,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Find</source> <target>Găsește</target> -<source>Select View</source> -<target>Selectează Vederea</target> +<source>View Settings</source> +<target>Setări de Vedere</target> <source>Overview</source> <target>Panoramă</target> @@ -1103,9 +1091,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <pluralform>Do you really want to execute the command %y for %x items?</pluralform> </source> <target> -<pluralform>Sigur vrei să execuți comanda %y pentru un item?</pluralform> -<pluralform>Sigur vrei să execuți comanda %y pentru %x itemuri?</pluralform> -<pluralform>Sigur vrei să execuți comanda %y pentru %x de itemuri?</pluralform> +<pluralform>Sigur vrei să execuți comanda %y pentru un element?</pluralform> +<pluralform>Sigur vrei să execuți comanda %y pentru %x elemente?</pluralform> +<pluralform>Sigur vrei să execuți comanda %y pentru %x de elemente?</pluralform> </target> <source>&Execute</source> @@ -1153,12 +1141,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Exclude via filter:</source> <target>Exclude prin Filtrul:</target> -<source>Exclude temporarily</source> -<target>Exclude Temporar</target> - <source>Include temporarily</source> <target>Include Temporar</target> +<source>Exclude temporarily</source> +<target>Exclude Temporar</target> + <source>Delete</source> <target>Șterge</target> @@ -1210,6 +1198,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Do&n't save</source> <target>&Nu salva</target> +<source>Delete selected configurations</source> +<target>Șterge Configurațiile Selectate</target> + <source>Filter</source> <target>Filtru</target> @@ -1261,8 +1252,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Set as default</source> <target>Setează ca implicit</target> -<source>All folders are in sync</source> -<target>Toate dosarele sînt sincronizate</target> +<source>All files are in sync</source> +<target>Toate filele sînt sincronizate</target> <source>Synchronization Settings</source> <target>Setările Sincronizării</target> @@ -1282,6 +1273,21 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Searching for program updates...</source> <target>Caut actualizări ale programului...</target> +<source>Close progress dialog</source> +<target>Închide Fereastra cu Progresul Sincr.</target> + +<source>Standby</source> +<target>Pune PC-ul în Stare de Veghe [Stand-by]</target> + +<source>Log off</source> +<target>Deloghează Utilizatorul [Log off]</target> + +<source>Shut down</source> +<target>Închide PC-ul [Shut down]</target> + +<source>Hibernate</source> +<target>Pune Calculatorul în Hibernare</target> + <source>Scanning...</source> <target>Scanez...</target> @@ -1303,15 +1309,15 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Initializing...</source> <target>Inițializez...</target> -<source>Stopped</source> -<target>Oprită</target> - <source>Completed</source> <target>Sincronizare Terminată</target> <source>&Continue</source> <target>&Continuă</target> +<source>Progress</source> +<target>Progres</target> + <source>Log</source> <target>Jurnal</target> @@ -1404,7 +1410,7 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Time stamp</source> <target>Marcaj Temporal</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Adaugă un marcaj temporal la numele fiecărei file</target> <source>File</source> @@ -1533,9 +1539,18 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției <source>Unable to move %x to the recycle bin.</source> <target>Nu pot muta %x în Reciclator.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Verificarea disponibilității Reciclatorului a eșuat pentru dosarul %x.</target> + <source>Cannot determine final path for %x.</source> <target>Nu pot determina calea finală pentru %x.</target> <source>Error Code %x:</source> <target>Cod de Eroare %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Nu pot citi următoarele elemente XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Fila de configurație %x a fost deschisă doar parțial.</target> + diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng index 46f04b1f..6b0d4fb3 100644 --- a/FreeFileSync/Build/Languages/russian.lng +++ b/FreeFileSync/Build/Languages/russian.lng @@ -118,6 +118,9 @@ <source>Size:</source> <target>Размер:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Сравнение содержания было пропущено для исключенного файла %x.</target> + <source>Items differ in attributes only</source> <target>Элементы различаются только атрибутами</target> @@ -301,9 +304,6 @@ <source>%x items/sec</source> <target>%x элементов/с</target> -<source>Configuration file %x loaded partially only.</source> -<target>Файл конфигурации %x загрузился частично.</target> - <source>Show in Explorer</source> <target>Показать в Проводнике</target> @@ -331,11 +331,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Запрошена остановка: Ожидайте, пока текущая операция завершится...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Неспособность создать отметку времени для архивации файлов:</target> - -<source>Cannot read the following XML elements:</source> -<target>Невозможно прочитать следующие XML элементы:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Невозможно создать отметку времени для архивирования файлов:</target> <source>&Open...</source> <target>&Открыть...</target> @@ -514,7 +511,7 @@ The command is triggered if: <target>Поле ввода целевой папки не должно быть пустым.</target> <source>Please enter a target folder for versioning.</source> -<target>Пожалуйста, введите целевую папку для архивации файлов.</target> +<target>Пожалуйста, введите целевую папку для архивирования файлов.</target> <source>Source folder %x not found.</source> <target>Исходная папка %x не найдена.</target> @@ -567,6 +564,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>Сохранение лог-файла %x...</target> +<source>Stopped</source> +<target>Остановлено</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Вы можете переключиться на главное окно FreeFileSync для решения этой проблемы.</target> @@ -661,21 +661,6 @@ The command is triggered if: <source>Drag && drop</source> <target>Drag && drop</target> -<source>Close progress dialog</source> -<target>Закрыть окно процесса</target> - -<source>Standby</source> -<target>Перейти в ожидании</target> - -<source>Log off</source> -<target>Выйти из системы (разлогиниться)</target> - -<source>Shut down</source> -<target>Выключить компьютер</target> - -<source>Hibernate</source> -<target>Гибернация</target> - <source>Alternate comparison settings</source> <target>Альтернативные настройки сравнения</target> @@ -781,6 +766,15 @@ The command is triggered if: <source>Save as batch job</source> <target>Сохранить как пакетное задание</target> +<source>View type:</source> +<target>Тип просмотра:</target> + +<source>Select view:</source> +<target>Выберете отображение:</target> + +<source>Statistics:</source> +<target>Статистика:</target> + <source>Number of files and folders that will be created</source> <target>Количество файлов и папок, которые будут созданы</target> @@ -882,15 +876,15 @@ The command is triggered if: <source>On completion:</source> <target>По завершению:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Обнаружение направления синхронизации с помощью файлов баз данных</target> + <source>Start synchronization now?</source> <target>Начать синхронизацию сейчас?</target> <source>Variant:</source> <target>Вариант:</target> -<source>Statistics</source> -<target>Статистика</target> - <source>&Don't show this dialog again</source> <target>Больше &не показывать это окно</target> @@ -931,8 +925,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>Остановить синхронизацию при первой ошибке</target> -<source>Show progress dialog</source> -<target>Показать окно прогресса</target> +<source>Run minimized</source> +<target>Запустить свернутым</target> <source>Save log:</source> <target>Сохранить лог-файл:</target> @@ -949,12 +943,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>В "&Корзину"</target> -<source>Delete on both sides</source> -<target>Удалить с обеих сторон</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Удалить с обеих сторон, даже если файл выделен только на одной стороне</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Выберите правила фильтрации для исключения определенных файлов из синхронизации. Введите пути файлов относящиеся к соответствующим парам папок.</target> @@ -976,8 +964,8 @@ The command is triggered if: <source>Maximum:</source> <target>максимум:</target> -<source>&Clear</source> -<target>&Очистить</target> +<source>&Reset</source> +<target>&Сбросить</target> <source>The following settings are used for all synchronization jobs.</source> <target>Следующие настройки используются для всех заданий синхронизации.</target> @@ -1075,8 +1063,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Поиск</target> -<source>Select View</source> -<target>Вид списка файлов</target> +<source>View Settings</source> +<target>Настройки просмотра</target> <source>Overview</source> <target>Главная</target> @@ -1163,12 +1151,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Исключить с помощью фильтра:</target> -<source>Exclude temporarily</source> -<target>Временно исключить</target> - <source>Include temporarily</source> <target>Временно включить</target> +<source>Exclude temporarily</source> +<target>Временно исключить</target> + <source>Delete</source> <target>Удалить</target> @@ -1220,6 +1208,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&Не сохранять</target> +<source>Delete selected configurations</source> +<target>Удалить выделенные настройки</target> + <source>Filter</source> <target>Фильтр</target> @@ -1271,8 +1262,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Установить по умолчанию</target> -<source>All folders are in sync</source> -<target>Все папки синхронизированы</target> +<source>All files are in sync</source> +<target>Все файлы синхронизированы</target> <source>Synchronization Settings</source> <target>Настройки синхронизации</target> @@ -1292,6 +1283,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Проверка обновлений программы...</target> +<source>Close progress dialog</source> +<target>Закрыть окно процесса</target> + +<source>Standby</source> +<target>Перейти в ожидании</target> + +<source>Log off</source> +<target>Выйти из системы (разлогиниться)</target> + +<source>Shut down</source> +<target>Выключить компьютер</target> + +<source>Hibernate</source> +<target>Гибернация</target> + <source>Scanning...</source> <target>Сканирование...</target> @@ -1313,15 +1319,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Инициализация...</target> -<source>Stopped</source> -<target>Остановлено</target> - <source>Completed</source> <target>Завершено</target> <source>&Continue</source> <target>&Продолжить</target> +<source>Progress</source> +<target>Прогресс</target> + <source>Log</source> <target>Лог (журнал)</target> @@ -1417,7 +1423,7 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Добавить отметку времени</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Добавить отметку времени для каждого имени файла</target> <source>File</source> @@ -1546,9 +1552,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Невозможно переместить %x в "Корзину".</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Проверка "Корзины" не удалась для папки %x.</target> + <source>Cannot determine final path for %x.</source> <target>Невозможно определить конечный путь для %x.</target> <source>Error Code %x:</source> <target>Код ошибки %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Невозможно прочитать следующие XML элементы:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Файл конфигурации %x загрузился частично.</target> + diff --git a/FreeFileSync/Build/Languages/scottish_gaelic.lng b/FreeFileSync/Build/Languages/scottish_gaelic.lng index f7d69d8a..ff6ea7f0 100644 --- a/FreeFileSync/Build/Languages/scottish_gaelic.lng +++ b/FreeFileSync/Build/Languages/scottish_gaelic.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Meud:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Leumadh thairis air coimeas na susbaint mu choinneamh nam faidhlichean a chaidh an dùnadh às (%x).</target> + <source>Items differ in attributes only</source> <target>Chan eil diofar eatarra ach a thaobh an cuid bhuadhan</target> @@ -301,9 +304,6 @@ <source>%x items/sec</source> <target>%x nithean/diog</target> -<source>Configuration file %x loaded partially only.</source> -<target>Cha deach faidhle an rèiteachaidh %x a luchdadh gu tur.</target> - <source>Show in Explorer</source> <target>Seall san taisgealaiche</target> @@ -331,11 +331,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Dh'iarr thu oirnn sgur: A' feitheamh ri crìoch na h-obrach làithreach...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Chan urrainn dhuinn stampa-ama a chruthachadh airson versioning:</target> - -<source>Cannot read the following XML elements:</source> -<target>Chan urrainn dhuinn na h-eileamaidean XML a leanas a leughadh:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Cha ghabh stampa ama a chruthachadh airson versioning:</target> <source>&Open...</source> <target>F&osgail...</target> @@ -564,6 +561,9 @@ Thèid an loidhne-àithne a chur gu dol: <source>Saving log file %x...</source> <target>A' sàbhaladh faidhle an loga %x...</target> +<source>Stopped</source> +<target>Chaidh stad a chur air</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>'S urrainn dhut leum a ghearradh gu prìomh-uinneag FreeFileSync gus an duilgheadas seo fhuasgladh.</target> @@ -659,21 +659,6 @@ Thèid an loidhne-àithne a chur gu dol: <source>Drag && drop</source> <target>Slaod ⁊ leig às</target> -<source>Close progress dialog</source> -<target>Dùin còmhradh an adhartais</target> - -<source>Standby</source> -<target>Cuir 'na fhuireachas</target> - -<source>Log off</source> -<target>Clàraich a-mach</target> - -<source>Shut down</source> -<target>Dùin sìos an siostam</target> - -<source>Hibernate</source> -<target>Geamhraich</target> - <source>Alternate comparison settings</source> <target>Roghainnean eile airson coimeasadh</target> @@ -779,6 +764,15 @@ Thèid an loidhne-àithne a chur gu dol: <source>Save as batch job</source> <target>Sàbhail mar obair baidse</target> +<source>View type:</source> +<target>Seall an seòrsa:</target> + +<source>Select view:</source> +<target>Tagh an seòrsa:</target> + +<source>Statistics:</source> +<target>Stats:</target> + <source>Number of files and folders that will be created</source> <target>Àireamh nam faidhle 's nam pasgan a thèid a chruthachadh</target> @@ -880,15 +874,15 @@ Thèid an loidhne-àithne a chur gu dol: <source>On completion:</source> <target>An dèidh coileanaidh:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Mothaich do chomhair an t-sioncronachaidh le taic o fhaidhlichean stòir-dhàta</target> + <source>Start synchronization now?</source> <target>A bheil thu airson tòiseachadh air an t-sioncronachadh an-dràsta?</target> <source>Variant:</source> <target>Eug-samhail:</target> -<source>Statistics</source> -<target>Stats</target> - <source>&Don't show this dialog again</source> <target>&Na seall an còmhradh seo a-rithist</target> @@ -925,8 +919,8 @@ Thèid an loidhne-àithne a chur gu dol: <source>Stop synchronization at first error</source> <target>Sguir dhen t-sioncronachadh aig a' chiad mhearachd</target> -<source>Show progress dialog</source> -<target>Seall còmhradh an adhartais</target> +<source>Run minimized</source> +<target>Ruith e sa mhodh lùghdaichte</target> <source>Save log:</source> <target>Sàbhail an loga:</target> @@ -943,12 +937,6 @@ Thèid an loidhne-àithne a chur gu dol: <source>&Recycle bin</source> <target>A&m biona</target> -<source>Delete on both sides</source> -<target>Sguab às air an dà thaobh</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Sguab às air an dà thaobh fiù mur an deach am faidhle a thaghadh ach air aon taobh</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Tagh riaghailteach criathraidh gus seòrsachan àraidh de dh'fhaidhlichean fhàgail às an t-sioncronachadh. Cuir a-steach slighean fhaidhlichean a-rèir paidhir an dà phasgan aca.</target> @@ -970,8 +958,8 @@ Thèid an loidhne-àithne a chur gu dol: <source>Maximum:</source> <target>Air a' char as motha:</target> -<source>&Clear</source> -<target>Fala&mhaich</target> +<source>&Reset</source> +<target>&Ath-shuidhich</target> <source>The following settings are used for all synchronization jobs.</source> <target>Thèid na roghainnean a leanas a chleachdadh airson a h-uile obair sioncronachaidh.</target> @@ -1069,8 +1057,8 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Find</source> <target>Lorg</target> -<source>Select View</source> -<target>Tagh sealladh</target> +<source>View Settings</source> +<target>Seall na roghainnean</target> <source>Overview</source> <target>Foir-shealladh</target> @@ -1161,12 +1149,12 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Exclude via filter:</source> <target>Dùin a-mach le criathrag:</target> -<source>Exclude temporarily</source> -<target>Dùin a-mach gu sealach</target> - <source>Include temporarily</source> <target>Gabh a-steach gu sealach</target> +<source>Exclude temporarily</source> +<target>Dùin a-mach gu sealach</target> + <source>Delete</source> <target>Sguab às</target> @@ -1218,6 +1206,9 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Do&n't save</source> <target>&Na sàbhail</target> +<source>Delete selected configurations</source> +<target>Sguab às na rèiteachaidhean a thagh thu</target> + <source>Filter</source> <target>Criathrag</target> @@ -1269,8 +1260,8 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Set as default</source> <target>Suidhich mar a' bhun-roghainn</target> -<source>All folders are in sync</source> -<target>Tha gach pasgan air a shioncronachadh</target> +<source>All files are in sync</source> +<target>Tha gach faidhle sioncronaichte</target> <source>Synchronization Settings</source> <target>Roghainnean an t-sioncronachaidh</target> @@ -1290,6 +1281,21 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Searching for program updates...</source> <target>A' lorg ùrachaidhean a' phrògraim...</target> +<source>Close progress dialog</source> +<target>Dùin còmhradh an adhartais</target> + +<source>Standby</source> +<target>Cuir 'na fhuireachas</target> + +<source>Log off</source> +<target>Clàraich a-mach</target> + +<source>Shut down</source> +<target>Dùin sìos an siostam</target> + +<source>Hibernate</source> +<target>Geamhraich</target> + <source>Scanning...</source> <target>'Ga sganadh...</target> @@ -1311,15 +1317,15 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Initializing...</source> <target>A' tòiseachadh...</target> -<source>Stopped</source> -<target>Chaidh stad a chur air</target> - <source>Completed</source> <target>Deiseil</target> <source>&Continue</source> <target>Lean air adhar&t</target> +<source>Progress</source> +<target>Adhartas</target> + <source>Log</source> <target>Logaich</target> @@ -1414,8 +1420,8 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Time stamp</source> <target>Stampa ama</target> -<source>Append a timestamp to each file name</source> -<target>Cuir stampa-ama ris ainm gach faidhle</target> +<source>Append a time stamp to each file name</source> +<target>Cuir stampa ama ri gach ainm faidhle</target> <source>File</source> <target>Faidhle</target> @@ -1546,9 +1552,18 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr. <source>Unable to move %x to the recycle bin.</source> <target>Cha ghabh %x a ghluasad dhan bhiona.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Dh'fhàillig sgrùdadh a' bhiona airson a' phasgain %x.</target> + <source>Cannot determine final path for %x.</source> <target>Chan urrainn dhuinn an t-slighe dheireannach airson %x a dhearbhadh.</target> <source>Error Code %x:</source> <target>Còd na mearachd %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Chan urrainn dhuinn na h-eileamaidean XML a leanas a leughadh:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Cha deach faidhle an rèiteachaidh %x a luchdadh gu tur.</target> + diff --git a/FreeFileSync/Build/Languages/serbian.lng b/FreeFileSync/Build/Languages/serbian.lng index d4b7680e..72df9f31 100644 --- a/FreeFileSync/Build/Languages/serbian.lng +++ b/FreeFileSync/Build/Languages/serbian.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Величина:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Упоређење по садржају је изостављено за искључене датотеке %x.</target> + <source>Items differ in attributes only</source> <target>Ставке се разликују само у атрибутима</target> @@ -298,9 +301,6 @@ <source>%x items/sec</source> <target>%x ставки/секунди</target> -<source>Configuration file %x loaded partially only.</source> -<target>Датотека подешавања %x учитана само делимично.</target> - <source>Show in Explorer</source> <target>Прикажи у Експлореру</target> @@ -328,12 +328,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Заустављање захтевано: Чека се да се тренутна акција заврши...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Није могуће стварање временске ознаке за верзију:</target> -<source>Cannot read the following XML elements:</source> -<target>Не могу прочитати следеће XML елементе:</target> - <source>&Open...</source> <target>&Отвори...</target> @@ -561,6 +558,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>Уписујем лог датотеку %x...</target> +<source>Stopped</source> +<target>Заустављено</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Можете се пребацити на главни прозор FreeFileSync-а да би разрешили ову ствар.</target> @@ -655,21 +655,6 @@ The command is triggered if: <source>Drag && drop</source> <target>Вуци && пусти</target> -<source>Close progress dialog</source> -<target>Затвори дијалог прогреса</target> - -<source>Standby</source> -<target>Пређи у стање приправности</target> - -<source>Log off</source> -<target>Одјави се</target> - -<source>Shut down</source> -<target>Искључи рачунар</target> - -<source>Hibernate</source> -<target>Хибернација</target> - <source>Alternate comparison settings</source> <target>Алтернативна подешавања упоређивања</target> @@ -775,6 +760,15 @@ The command is triggered if: <source>Save as batch job</source> <target>Сачувај као беч задатак</target> +<source>View type:</source> +<target>Тип приказа:</target> + +<source>Select view:</source> +<target>Изаберите приказ:</target> + +<source>Statistics:</source> +<target>Статистика:</target> + <source>Number of files and folders that will be created</source> <target>Број датотека и фолдера који ће бити креирани</target> @@ -876,15 +870,15 @@ The command is triggered if: <source>On completion:</source> <target>При завршетку:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Уочи синхронизацијске смерове уз помоћ датотека базе</target> + <source>Start synchronization now?</source> <target>Почни синхронизацију сада?</target> <source>Variant:</source> <target>Варијанта:</target> -<source>Statistics</source> -<target>Статистика</target> - <source>&Don't show this dialog again</source> <target>&Не приказуј овај диалог поновно</target> @@ -921,8 +915,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>Заустави синхронизацију при првој грешци</target> -<source>Show progress dialog</source> -<target>Прикажи дијалог прогреса</target> +<source>Run minimized</source> +<target>Минимизирај при раду</target> <source>Save log:</source> <target>Сачувај лог:</target> @@ -939,12 +933,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&Корпа за смеће</target> -<source>Delete on both sides</source> -<target>Избриши на обе стране</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Избриши на обе стране чак иако је датотека селектована само на једној страни</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Одаберите филтерска подешавања да би искључили одређене датотеке из синхронизације. Унесите путање датотека релативно према њиховим одговарајућим фолдерским паровима.</target> @@ -966,8 +954,8 @@ The command is triggered if: <source>Maximum:</source> <target>Максимум:</target> -<source>&Clear</source> -<target>&Уклони</target> +<source>&Reset</source> +<target>&Ресетуј</target> <source>The following settings are used for all synchronization jobs.</source> <target>Следећа подешавања се користе за све синхронизацијске задатке.</target> @@ -1065,8 +1053,8 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Пронађи</target> -<source>Select View</source> -<target>Изаберите приказ</target> +<source>View Settings</source> +<target>Подешавања приказа</target> <source>Overview</source> <target>Преглед</target> @@ -1153,12 +1141,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Искључи преко филтера:</target> -<source>Exclude temporarily</source> -<target>Тренутно искључи</target> - <source>Include temporarily</source> <target>Тренутно укључи</target> +<source>Exclude temporarily</source> +<target>Тренутно искључи</target> + <source>Delete</source> <target>Избриши</target> @@ -1210,6 +1198,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>Не&мој сачувати</target> +<source>Delete selected configurations</source> +<target>Обриши селектоване конфигурације</target> + <source>Filter</source> <target>Филтрирање</target> @@ -1261,8 +1252,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Постави као подразумевано</target> -<source>All folders are in sync</source> -<target>Сви фолдери су синхронизовани</target> +<source>All files are in sync</source> +<target>Све датотеке су синхронизоване</target> <source>Synchronization Settings</source> <target>Подешавања синхронизације</target> @@ -1282,6 +1273,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Претражујем ажурирање за програм...</target> +<source>Close progress dialog</source> +<target>Затвори дијалог прогреса</target> + +<source>Standby</source> +<target>Пређи у стање приправности</target> + +<source>Log off</source> +<target>Одјави се</target> + +<source>Shut down</source> +<target>Искључи рачунар</target> + +<source>Hibernate</source> +<target>Хибернација</target> + <source>Scanning...</source> <target>Прегледавање...</target> @@ -1303,15 +1309,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Покретање...</target> -<source>Stopped</source> -<target>Заустављено</target> - <source>Completed</source> <target>Завршено</target> <source>&Continue</source> <target>&Настави</target> +<source>Progress</source> +<target>Напредовање</target> + <source>Log</source> <target>Лог</target> @@ -1404,8 +1410,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Временска ознака</target> -<source>Append a timestamp to each file name</source> -<target>Додај временску ознаку сваком имену датотеке</target> +<source>Append a time stamp to each file name</source> +<target>Додај временску ознаку за свако име датотеке</target> <source>File</source> <target>Датотека</target> @@ -1533,9 +1539,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Није могуће преместити %x у Корпи за смеће.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Провера доступности Корпе за смеће није успела за фолдер %x.</target> + <source>Cannot determine final path for %x.</source> <target>Не могу утврдити коначну путању за %x.</target> <source>Error Code %x:</source> <target>Грешка број %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Не могу прочитати следеће XML елементе:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Датотека подешавања %x учитана само делимично.</target> + diff --git a/FreeFileSync/Build/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng index c8c9f3b3..073275c7 100644 --- a/FreeFileSync/Build/Languages/slovenian.lng +++ b/FreeFileSync/Build/Languages/slovenian.lng @@ -7,18 +7,6 @@ <plural_definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural_definition> </header> -<source> -<pluralform>Showing %y of 1 row</pluralform> -<pluralform>Showing %y of %x rows</pluralform> -</source> -<target></target> - -<source> -<pluralform>Do you really want to execute the command %y for one item?</pluralform> -<pluralform>Do you really want to execute the command %y for %x items?</pluralform> -</source> -<target></target> - <source>Both sides have changed since last synchronization.</source> <target>Obe strani sta se spremenili od zadnje sinhronizacije.</target> @@ -127,6 +115,9 @@ <source>Size:</source> <target>Velikost:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target></target> + <source>Items differ in attributes only</source> <target>Elementi se razlikujejo samo v atributih</target> @@ -313,9 +304,6 @@ <source>%x items/sec</source> <target>%x elementov/s</target> -<source>Configuration file %x loaded partially only.</source> -<target>Nastavitvena datoteka %x naložena samo delno.</target> - <source>Show in Explorer</source> <target>Prikaži v Raziskovalcu</target> @@ -343,11 +331,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Zahteva za ustavitev: Čakam da se trenutni proces zaključi...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Ne morem ustvariti časovnega žiga za verzioniranje:</target> - -<source>Cannot read the following XML elements:</source> -<target>Ne morem brati naslednje XML elemente:</target> +<source>Unable to create time stamp for versioning:</source> +<target></target> <source>&Open...</source> <target>&Odpri...</target> @@ -576,6 +561,9 @@ Ukaz se sproži če: <source>Saving log file %x...</source> <target>Shranjujem datoteko beleženja %x...</target> +<source>Stopped</source> +<target>Ustavljen</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Preklopite na FreeFileSync glavno okno za odpravo težave.</target> @@ -671,21 +659,6 @@ Ukaz se sproži če: <source>Drag && drop</source> <target>Povleci && spusti</target> -<source>Close progress dialog</source> -<target>Zapri pogovorno okno z napredkom</target> - -<source>Standby</source> -<target>V pripravljenost</target> - -<source>Log off</source> -<target>Odjavi</target> - -<source>Shut down</source> -<target>Ugasni</target> - -<source>Hibernate</source> -<target>Hibernacija</target> - <source>Alternate comparison settings</source> <target>Alternativne nastavitve primerjave</target> @@ -791,6 +764,15 @@ Ukaz se sproži če: <source>Save as batch job</source> <target>Shrani kot serijsko opravilo</target> +<source>View type:</source> +<target></target> + +<source>Select view:</source> +<target></target> + +<source>Statistics:</source> +<target></target> + <source>Number of files and folders that will be created</source> <target>Število datotek in map, ki bodo ustvarjene</target> @@ -892,15 +874,15 @@ Ukaz se sproži če: <source>On completion:</source> <target>Ob zaključku:</target> +<source>Detect synchronization directions with the help of database files</source> +<target></target> + <source>Start synchronization now?</source> <target>Zaženem sinhnorizacijo takoj?</target> <source>Variant:</source> <target>Možnost:</target> -<source>Statistics</source> -<target>Statistika</target> - <source>&Don't show this dialog again</source> <target>&Ne pokaži več tega sporočila</target> @@ -937,8 +919,8 @@ Ukaz se sproži če: <source>Stop synchronization at first error</source> <target>Ustavi sinhnorizacojo ob prvi napaki</target> -<source>Show progress dialog</source> -<target>Prikazuj pogovorno okno z napredkom</target> +<source>Run minimized</source> +<target></target> <source>Save log:</source> <target>Shrani dnevnik:</target> @@ -955,12 +937,6 @@ Ukaz se sproži če: <source>&Recycle bin</source> <target>&Koš</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Izberi filtrirna pravila za izključitev določenih datotek iz sinhnorizacije. Vpiši pot datotek relativno na imenik v obdelavi</target> @@ -982,8 +958,8 @@ Ukaz se sproži če: <source>Maximum:</source> <target>Maksimum:</target> -<source>&Clear</source> -<target>P&očisti</target> +<source>&Reset</source> +<target></target> <source>The following settings are used for all synchronization jobs.</source> <target>Naslednje nastavitve se uporabljajo pri vseh sinhronizacijskih opravilih.</target> @@ -1081,8 +1057,8 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Find</source> <target>Najdi</target> -<source>Select View</source> -<target>Izberi pogled</target> +<source>View Settings</source> +<target></target> <source>Overview</source> <target>Pregled</target> @@ -1114,6 +1090,12 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Confirm</source> <target>Potrdi</target> +<source> +<pluralform>Do you really want to execute the command %y for one item?</pluralform> +<pluralform>Do you really want to execute the command %y for %x items?</pluralform> +</source> +<target></target> + <source>&Execute</source> <target>&Izvedi</target> @@ -1139,6 +1121,12 @@ To zagotavlja konsistenco podatkov v primeru napake. <pluralform>%x datotek</pluralform> </target> +<source> +<pluralform>Showing %y of 1 row</pluralform> +<pluralform>Showing %y of %x rows</pluralform> +</source> +<target></target> + <source>Set direction:</source> <target>Nastavi smer:</target> @@ -1151,12 +1139,12 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Exclude via filter:</source> <target>Izključi preko filtra:</target> -<source>Exclude temporarily</source> -<target>Začasno izključi</target> - <source>Include temporarily</source> <target>Trenutno vključi</target> +<source>Exclude temporarily</source> +<target>Začasno izključi</target> + <source>Delete</source> <target>Izbriši</target> @@ -1208,6 +1196,9 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Do&n't save</source> <target>Ne shra&ni</target> +<source>Delete selected configurations</source> +<target></target> + <source>Filter</source> <target>Filter</target> @@ -1259,8 +1250,8 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Set as default</source> <target>Nastavi kot privzeto</target> -<source>All folders are in sync</source> -<target>Vse mape so sinhronizirane</target> +<source>All files are in sync</source> +<target></target> <source>Synchronization Settings</source> <target>Nastavitve sinhnorizacije</target> @@ -1280,6 +1271,21 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Searching for program updates...</source> <target>Iščem posodobitve programa...</target> +<source>Close progress dialog</source> +<target>Zapri pogovorno okno z napredkom</target> + +<source>Standby</source> +<target>V pripravljenost</target> + +<source>Log off</source> +<target>Odjavi</target> + +<source>Shut down</source> +<target>Ugasni</target> + +<source>Hibernate</source> +<target>Hibernacija</target> + <source>Scanning...</source> <target>Pregledujem...</target> @@ -1301,15 +1307,15 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Initializing...</source> <target>Inicializiram...</target> -<source>Stopped</source> -<target>Ustavljen</target> - <source>Completed</source> <target>Zaključeno</target> <source>&Continue</source> <target>&Nadaljuj</target> +<source>Progress</source> +<target></target> + <source>Log</source> <target>Dnevnik</target> @@ -1404,8 +1410,8 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Time stamp</source> <target>Časovna oznaka</target> -<source>Append a timestamp to each file name</source> -<target>Dodaj časovno oznako k vsakemu imenu datoteke</target> +<source>Append a time stamp to each file name</source> +<target></target> <source>File</source> <target>Datoteka</target> @@ -1536,9 +1542,18 @@ To zagotavlja konsistenco podatkov v primeru napake. <source>Unable to move %x to the recycle bin.</source> <target>Ne morem premakniti %x v koš-</target> +<source>Checking recycle bin failed for folder %x.</source> +<target></target> + <source>Cannot determine final path for %x.</source> <target>Ne morem določiti končne poti za %x.</target> <source>Error Code %x:</source> <target>Koda napake %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Ne morem brati naslednje XML elemente:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Nastavitvena datoteka %x naložena samo delno.</target> + diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng index 27af018e..af20f3b2 100644 --- a/FreeFileSync/Build/Languages/spanish.lng +++ b/FreeFileSync/Build/Languages/spanish.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Tamaño:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>No se compararon por contenido los archivos excluidos %x.</target> + <source>Items differ in attributes only</source> <target>Los elementos sólo se diferencian en los atributos</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x elementos/seg</target> -<source>Configuration file %x loaded partially only.</source> -<target>Archivo de configuración %x cargado sólo parcialmente.</target> - <source>Show in Explorer</source> <target>Mostrar en el Explorador</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Detención solicitada: esperando a que la operación actual finalice…</target> -<source>Unable to create timestamp for versioning:</source> -<target>No es posible crear fecha y hora para la versión:</target> - -<source>Cannot read the following XML elements:</source> -<target>No se pueden leer los siguientes elementos XML:</target> +<source>Unable to create time stamp for versioning:</source> +<target>No es posible crear la fecha y hora para el versionado:</target> <source>&Open...</source> <target>&Abrir…</target> @@ -558,6 +555,9 @@ El comando es disparado si: <source>Saving log file %x...</source> <target>Guardando registro %x…</target> +<source>Stopped</source> +<target>Detenido</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Puede cambiar a la ventana principal de FreeFileSync para resolver este problema.</target> @@ -651,21 +651,6 @@ El comando es disparado si: <source>Drag && drop</source> <target>Arrastrar y soltar</target> -<source>Close progress dialog</source> -<target>Cerrar diálogo de progreso</target> - -<source>Standby</source> -<target>Suspender</target> - -<source>Log off</source> -<target>Finalizar sesión</target> - -<source>Shut down</source> -<target>Apagar</target> - -<source>Hibernate</source> -<target>Hibernar</target> - <source>Alternate comparison settings</source> <target>Opciones avanzadas de comparación</target> @@ -771,6 +756,15 @@ El comando es disparado si: <source>Save as batch job</source> <target>Salvar como tarea por lotes</target> +<source>View type:</source> +<target>Ver tipo:</target> + +<source>Select view:</source> +<target>Seleccionar vista:</target> + +<source>Statistics:</source> +<target>Estadísticas:</target> + <source>Number of files and folders that will be created</source> <target>Número de archivos y carpetas que serán creados</target> @@ -872,15 +866,15 @@ El comando es disparado si: <source>On completion:</source> <target>Al completar:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Detectar direcciones de sincronización a partir de archivos de bases de datos</target> + <source>Start synchronization now?</source> <target>¿Iniciar la sincronización ahora?</target> <source>Variant:</source> <target>Variante:</target> -<source>Statistics</source> -<target>Estadísticas</target> - <source>&Don't show this dialog again</source> <target>&No volver a mostrar este diálogo</target> @@ -917,8 +911,8 @@ El comando es disparado si: <source>Stop synchronization at first error</source> <target>Detener la sincronización con el primer error</target> -<source>Show progress dialog</source> -<target>Mostrar diálogo de progreso</target> +<source>Run minimized</source> +<target>Ejecutar minimizado</target> <source>Save log:</source> <target>Guardar registro:</target> @@ -935,12 +929,6 @@ El comando es disparado si: <source>&Recycle bin</source> <target>Papelera de &reciclaje</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Seleccione reglas para excluir archivos durante la sincronización. Indique rutas relativas a la carpeta emparejada correspondiente.</target> @@ -962,8 +950,8 @@ El comando es disparado si: <source>Maximum:</source> <target>Máximo:</target> -<source>&Clear</source> -<target>&Borrar</target> +<source>&Reset</source> +<target>&Reiniciar</target> <source>The following settings are used for all synchronization jobs.</source> <target>Las opciones siguientes se utilizan para todas las tareas de sincronización.</target> @@ -1061,8 +1049,8 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Find</source> <target>Buscar</target> -<source>Select View</source> -<target>Seleccione vista</target> +<source>View Settings</source> +<target>Ver opciones</target> <source>Overview</source> <target>Vista general</target> @@ -1145,12 +1133,12 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Exclude via filter:</source> <target>Excluir a través del filtro:</target> -<source>Exclude temporarily</source> -<target>Excluir temporalmente</target> - <source>Include temporarily</source> <target>Incluir temporalmente</target> +<source>Exclude temporarily</source> +<target>Excluir temporalmente</target> + <source>Delete</source> <target>Eliminar</target> @@ -1202,6 +1190,9 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Do&n't save</source> <target>&No guardar</target> +<source>Delete selected configurations</source> +<target>Eliminar las configuraciones seleccionadas</target> + <source>Filter</source> <target>Filtro</target> @@ -1253,8 +1244,8 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Set as default</source> <target>Predeterminado</target> -<source>All folders are in sync</source> -<target>Todas las carpetas están sincronizadas</target> +<source>All files are in sync</source> +<target>Todos los archivos están sincronizados</target> <source>Synchronization Settings</source> <target>Opciones de sincronización</target> @@ -1274,6 +1265,21 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Searching for program updates...</source> <target>Buscando actualizaciones del programa…</target> +<source>Close progress dialog</source> +<target>Cerrar diálogo de progreso</target> + +<source>Standby</source> +<target>Suspender</target> + +<source>Log off</source> +<target>Finalizar sesión</target> + +<source>Shut down</source> +<target>Apagar</target> + +<source>Hibernate</source> +<target>Hibernar</target> + <source>Scanning...</source> <target>Escaneando…</target> @@ -1295,15 +1301,15 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Initializing...</source> <target>Inicializando…</target> -<source>Stopped</source> -<target>Detenido</target> - <source>Completed</source> <target>Terminado</target> <source>&Continue</source> <target>&Continuar</target> +<source>Progress</source> +<target>Progreso</target> + <source>Log</source> <target>Registro</target> @@ -1392,10 +1398,10 @@ Se garantiza un estado coherente incluso en caso de error grave. <target>Mover archivos y reemplazar si ya existen</target> <source>Time stamp</source> -<target>Intervalo de tiempo</target> +<target>Marca horaria</target> -<source>Append a timestamp to each file name</source> -<target>Incluir fecha y hora a cada nombre de archivo</target> +<source>Append a time stamp to each file name</source> +<target>Incluir marca horaria en cada nombre de archivo</target> <source>File</source> <target>Archivo</target> @@ -1520,9 +1526,18 @@ Se garantiza un estado coherente incluso en caso de error grave. <source>Unable to move %x to the recycle bin.</source> <target>Incapaz de mover %x a la papelera de reciclaje.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Fallo al comprobar la papelera de reciclaje para la carpeta %x.</target> + <source>Cannot determine final path for %x.</source> <target>No se puede determinar la ruta final de %x.</target> <source>Error Code %x:</source> <target>Error: %x:</target> +<source>Cannot read the following XML elements:</source> +<target>No se pueden leer los siguientes elementos XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Archivo de configuración %x cargado sólo parcialmente.</target> + diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng index c5fe8bfb..96c8cd5a 100644 --- a/FreeFileSync/Build/Languages/swedish.lng +++ b/FreeFileSync/Build/Languages/swedish.lng @@ -115,6 +115,9 @@ <source>Size:</source> <target>Storlek:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Innehållsjämförelse skippades för undantagna filer %x.</target> + <source>Items differ in attributes only</source> <target>Endast attribut skiljer objekten åt</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x objekt/sek.</target> -<source>Configuration file %x loaded partially only.</source> -<target>Konfigurationsfilen %x lästes bara delvis in.</target> - <source>Show in Explorer</source> <target>Visa i Utforskaren</target> @@ -325,12 +325,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Stopp begärt: Väntar på att aktuell åtgärd skall slutföras...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Kunde inte skapa tidsstämpel för versionshantering:</target> -<source>Cannot read the following XML elements:</source> -<target>Kan inte läsa följande XML-element:</target> - <source>&Open...</source> <target>&Öppna...</target> @@ -558,6 +555,9 @@ Kommandot triggas om: <source>Saving log file %x...</source> <target>Sparar loggfil %x...</target> +<source>Stopped</source> +<target>Stoppad</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Du kan växla till FreeFileSyncs programfönster för att lösa problemet.</target> @@ -651,21 +651,6 @@ Kommandot triggas om: <source>Drag && drop</source> <target>Dra && släpp</target> -<source>Close progress dialog</source> -<target>Stäng förloppsindikator</target> - -<source>Standby</source> -<target>Strömsparläge</target> - -<source>Log off</source> -<target>Logga ut</target> - -<source>Shut down</source> -<target>Stäng av datorn</target> - -<source>Hibernate</source> -<target>Viloläge</target> - <source>Alternate comparison settings</source> <target>Alternativa jämförelseinställningar</target> @@ -771,6 +756,15 @@ Kommandot triggas om: <source>Save as batch job</source> <target>Spara som batch-fil</target> +<source>View type:</source> +<target>Visningstyp:</target> + +<source>Select view:</source> +<target>Välj vy:</target> + +<source>Statistics:</source> +<target>Statistik:</target> + <source>Number of files and folders that will be created</source> <target>Antal filer och mappar som kommer att skapas</target> @@ -872,15 +866,15 @@ Kommandot triggas om: <source>On completion:</source> <target>Vid slutförd åtgärd:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Hitta synkroniseringsmappar med hjälp av databasfiler</target> + <source>Start synchronization now?</source> <target>Vill du starta synkroniseringen nu?</target> <source>Variant:</source> <target>Alternativ:</target> -<source>Statistics</source> -<target>Statistik</target> - <source>&Don't show this dialog again</source> <target>&Visa inte den här dialogen igen</target> @@ -917,8 +911,8 @@ Kommandot triggas om: <source>Stop synchronization at first error</source> <target>Stoppa synkroniseringen vid första fel som uppstår</target> -<source>Show progress dialog</source> -<target>Visa förloppsindikator</target> +<source>Run minimized</source> +<target>Kör minimerad</target> <source>Save log:</source> <target>Spara logg:</target> @@ -935,12 +929,6 @@ Kommandot triggas om: <source>&Recycle bin</source> <target>&Papperskorgen</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>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Skapa filtreringsregler för att undanta vissa filer från synkronisering. Sökvägar relateras till motsvarande mapp-par</target> @@ -962,8 +950,8 @@ Kommandot triggas om: <source>Maximum:</source> <target>Max:</target> -<source>&Clear</source> -<target>&Rensa</target> +<source>&Reset</source> +<target>&Återställ</target> <source>The following settings are used for all synchronization jobs.</source> <target>Följande inställningar används för all synkronisering</target> @@ -1061,8 +1049,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Find</source> <target>Sök</target> -<source>Select View</source> -<target>Välj vy</target> +<source>View Settings</source> +<target>Visningsinställningar</target> <source>Overview</source> <target>Översikt</target> @@ -1145,12 +1133,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Exclude via filter:</source> <target>Lägg till i undantag:</target> -<source>Exclude temporarily</source> -<target>Undanta tillfälligt</target> - <source>Include temporarily</source> <target>Inkludera tillfälligt</target> +<source>Exclude temporarily</source> +<target>Undanta tillfälligt</target> + <source>Delete</source> <target>Ta bort</target> @@ -1202,6 +1190,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Do&n't save</source> <target>Spara &inte</target> +<source>Delete selected configurations</source> +<target>Ta bort markerade konfigurationer</target> + <source>Filter</source> <target>Filter</target> @@ -1253,8 +1244,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Set as default</source> <target>Ange som standard</target> -<source>All folders are in sync</source> -<target>Alla mappar är synkroniserade</target> +<source>All files are in sync</source> +<target>Alla filer är synkroniserade</target> <source>Synchronization Settings</source> <target>Synkroniseringsinställningar</target> @@ -1274,6 +1265,21 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Searching for program updates...</source> <target>Söker efter programuppdateringar...</target> +<source>Close progress dialog</source> +<target>Stäng förloppsindikator</target> + +<source>Standby</source> +<target>Strömsparläge</target> + +<source>Log off</source> +<target>Logga ut</target> + +<source>Shut down</source> +<target>Stäng av datorn</target> + +<source>Hibernate</source> +<target>Viloläge</target> + <source>Scanning...</source> <target>Skannar...</target> @@ -1295,15 +1301,15 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Initializing...</source> <target>Initierar...</target> -<source>Stopped</source> -<target>Stoppad</target> - <source>Completed</source> <target>Slutförd</target> <source>&Continue</source> <target>&Fortsätt</target> +<source>Progress</source> +<target>Förlopp</target> + <source>Log</source> <target>Logg</target> @@ -1394,7 +1400,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Time stamp</source> <target>Tidsstämpel</target> -<source>Append a timestamp to each file name</source> +<source>Append a time stamp to each file name</source> <target>Lägg till en tidsstämpel till varje filnamn</target> <source>File</source> @@ -1520,9 +1526,18 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. <source>Unable to move %x to the recycle bin.</source> <target>Kan inte att flytta %x till papperskorgen</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Kontroll av papperskorgen misslyckades för %x.</target> + <source>Cannot determine final path for %x.</source> <target>Kan inte utläsa slutlig sökväg för %x.</target> <source>Error Code %x:</source> <target>Felkod %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Kan inte läsa följande XML-element:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Konfigurationsfilen %x lästes bara delvis in.</target> + diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng index a0ad9e0f..5841ac33 100644 --- a/FreeFileSync/Build/Languages/turkish.lng +++ b/FreeFileSync/Build/Languages/turkish.lng @@ -101,7 +101,7 @@ <target>Karşıdaki klasör boş olarak kabul edilecek.</target> <source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source> -<target>Şu klasörlerin bağlı yolları var. Eşleştirme kurallarını ayarlarken dikkatli olun:</target> +<target>Şu klasörlerin yolları birbirine bağlı. Eşleştirme kurallarını ayarlarken dikkatli olun:</target> <source>File %x has an invalid date.</source> <target>%x dosyasının tarihi geçersiz.</target> @@ -115,6 +115,9 @@ <source>Size:</source> <target>Boyut:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Katılmayan %x dosyaları için içerik karşılaştırması atlandı.</target> + <source>Items differ in attributes only</source> <target>Yalnız öznitelikleri farklı ögeler</target> @@ -295,9 +298,6 @@ <source>%x items/sec</source> <target>%x öge/saniye</target> -<source>Configuration file %x loaded partially only.</source> -<target>%x ayarlar dosyası kısmen yüklendi.</target> - <source>Show in Explorer</source> <target>Tarayıcıda Görüntüleyin</target> @@ -325,11 +325,8 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Durdurulması istendi: Yürürlükteki işlemin bitmesi bekleniyor...</target> -<source>Unable to create timestamp for versioning:</source> -<target>Sürüm için zaman damgası oluşturulamadı:</target> - -<source>Cannot read the following XML elements:</source> -<target>Şu XML elemanları okunamadı:</target> +<source>Unable to create time stamp for versioning:</source> +<target>Sürüm izlemesi için zaman damgası oluşturulamadı:</target> <source>&Open...</source> <target>&Açın...</target> @@ -558,6 +555,9 @@ Komut şu durumlarda yürütülür: <source>Saving log file %x...</source> <target>%x günlük dosyası kaydediliyor...</target> +<source>Stopped</source> +<target>Durduruldu</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Bu sorunu çözmek için FreeFileSync ana penceresine geçebilirsiniz.</target> @@ -651,21 +651,6 @@ Komut şu durumlarda yürütülür: <source>Drag && drop</source> <target>Dosyaları sürükleyip buraya bırakabilirsiniz</target> -<source>Close progress dialog</source> -<target>İşlem penceresi kapatılsın</target> - -<source>Standby</source> -<target>Uykuya dalınsın</target> - -<source>Log off</source> -<target>Oturum kapatılsın</target> - -<source>Shut down</source> -<target>Bilgisayar kapatılsın</target> - -<source>Hibernate</source> -<target>Hazırda bekletilsin</target> - <source>Alternate comparison settings</source> <target>Alternatif karşılaştırma ayarları</target> @@ -771,6 +756,15 @@ Komut şu durumlarda yürütülür: <source>Save as batch job</source> <target>Toplu iş olarak kaydedin</target> +<source>View type:</source> +<target>Görünüm tipi:</target> + +<source>Select view:</source> +<target>Görünüm seçin:</target> + +<source>Statistics:</source> +<target>İstatistikler:</target> + <source>Number of files and folders that will be created</source> <target>Eklenecek dosya ve klasör sayısı</target> @@ -802,13 +796,13 @@ Komut şu durumlarda yürütülür: <target>Tamam</target> <source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source> -<target>İki taraftaki değişiklikler belirlenir ve kopyalanır. Silinme, taşınma ve çakışmalar, veritabanı kullanılarak kendiliğinden algılanır.</target> +<target>İki tarafta da değişikliklere bakılır ve karşılıklı kopyalanır. Silinmiş, taşınmış ve çakışan ögeler, veritabanı kullanılarak kendiliğinden algılanır.</target> <source>Create a mirror backup of the left folder by adapting the right folder to match.</source> -<target>Sağ klasör, sola uyacak şekilde değiştirilerek, sol klasörün yansı yedeği oluşturulur.</target> +<target>Sağ klasör, sola uyacak şekilde güncellenerek, sol klasörün yansı yedeği oluşturulur.</target> <source>Copy new and updated files to the right folder.</source> -<target>Sol taraftaki yeni ya da güncellenmiş dosyalar sağ tarafa kopyalanır.</target> +<target>Sol taraftaki yeni ya da güncellenmiş ögeler sağ tarafa kopyalanır.</target> <source>Configure your own synchronization rules.</source> <target>Eşleştirme kuralları kullanıcının isteğine göre belirlenir.</target> @@ -831,7 +825,7 @@ Komut şu durumlarda yürütülür: <target>Dosya silme işlemi:</target> <source>Permanent</source> -<target>Kalıcı olarak</target> +<target>Kalıcı olarak silinsin</target> <source>Delete or overwrite files permanently</source> <target>Dosyalar kalıcı olarak silinir ya da üzerine yazılır</target> @@ -870,7 +864,10 @@ Komut şu durumlarda yürütülür: <target>Hata ya da uyarılar açılır pencerede görüntülenir</target> <source>On completion:</source> -<target>Tamamlandığında:</target> +<target>Eşleştirme tamamlandığında:</target> + +<source>Detect synchronization directions with the help of database files</source> +<target>Eşleştirme yönü, veritabanı dosyaları yardımı ile belirlensin</target> <source>Start synchronization now?</source> <target>Eşleştirme başlatılsın mı?</target> @@ -878,9 +875,6 @@ Komut şu durumlarda yürütülür: <source>Variant:</source> <target>İşlem tipi:</target> -<source>Statistics</source> -<target>İstatistikler</target> - <source>&Don't show this dialog again</source> <target>Bu pencere bir daha &görüntülenmesin</target> @@ -917,8 +911,8 @@ Komut şu durumlarda yürütülür: <source>Stop synchronization at first error</source> <target>Oluşacak ilk hatada eşleştirme durdurulur</target> -<source>Show progress dialog</source> -<target>İşlem penceresi görüntülensin</target> +<source>Run minimized</source> +<target>Küçültülmüş olarak çalışsın</target> <source>Save log:</source> <target>Günlüğe kaydedilsin:</target> @@ -935,12 +929,6 @@ Komut şu durumlarda yürütülür: <source>&Recycle bin</source> <target>Ge&ri Dönüşüm Kutusu</target> -<source>Delete on both sides</source> -<target>Her iki taraftaki de silinsin</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 taraftan da silinir</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Eşleştirmeye katılmayacak dosyaların süzülme kurallarını belirleyin. Dosya yollarını bulundukları klasör çiftine göre yazın.</target> @@ -962,8 +950,8 @@ Komut şu durumlarda yürütülür: <source>Maximum:</source> <target>En büyük:</target> -<source>&Clear</source> -<target>&Temizleyin</target> +<source>&Reset</source> +<target>Sıfı&rlayın</target> <source>The following settings are used for all synchronization jobs.</source> <target>Aşağıdaki ayarlar tüm eşleştirme işlemleri için geçerlidir.</target> @@ -1061,8 +1049,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Find</source> <target>Arayın</target> -<source>Select View</source> -<target>Görünümü Seçin</target> +<source>View Settings</source> +<target>Görünüm Ayarları</target> <source>Overview</source> <target>Genel</target> @@ -1145,12 +1133,12 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Exclude via filter:</source> <target>Şu süzgeçle katılmasın:</target> -<source>Exclude temporarily</source> -<target>Geçici olarak katılmasın</target> - <source>Include temporarily</source> <target>Geçici olarak katılsın</target> +<source>Exclude temporarily</source> +<target>Geçici olarak katılmasın</target> + <source>Delete</source> <target>Silin</target> @@ -1202,6 +1190,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Do&n't save</source> <target>Kaydedilmesi&n</target> +<source>Delete selected configurations</source> +<target>Seçili ayarları silin</target> + <source>Filter</source> <target>Süzgeç</target> @@ -1253,8 +1244,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Set as default</source> <target>Varsayılan olarak belirleyin</target> -<source>All folders are in sync</source> -<target>Tüm klasörler eşleştirildi</target> +<source>All files are in sync</source> +<target>Tüm dosyalar eşleştirildi</target> <source>Synchronization Settings</source> <target>Eşleştirme Ayarları</target> @@ -1274,6 +1265,21 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Searching for program updates...</source> <target>Yazılım güncellemesine bakılıyor...</target> +<source>Close progress dialog</source> +<target>İşlem penceresi kapatılsın</target> + +<source>Standby</source> +<target>Uykuya dalınsın</target> + +<source>Log off</source> +<target>Oturum kapatılsın</target> + +<source>Shut down</source> +<target>Bilgisayar kapatılsın</target> + +<source>Hibernate</source> +<target>Hazırda bekletilsin</target> + <source>Scanning...</source> <target>Taranıyor...</target> @@ -1295,15 +1301,15 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Initializing...</source> <target>Başlatılıyor...</target> -<source>Stopped</source> -<target>Durduruldu</target> - <source>Completed</source> <target>Tamamlandı</target> <source>&Continue</source> <target>&Devam</target> +<source>Progress</source> +<target>İlerleme</target> + <source>Log</source> <target>Günlük</target> @@ -1394,8 +1400,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Time stamp</source> <target>Zaman damgası</target> -<source>Append a timestamp to each file name</source> -<target>Dosya adlarına zaman damgası eklensin</target> +<source>Append a time stamp to each file name</source> +<target>Her bir dosya adına bir zaman damgası eklensin</target> <source>File</source> <target>Dosya</target> @@ -1520,9 +1526,18 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya <source>Unable to move %x to the recycle bin.</source> <target>%x Geri Dönüşüm Kutusuna atılamıyor.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>%x klasörü için geri dönüşüm kutusu denetlenemedi.</target> + <source>Cannot determine final path for %x.</source> <target>Son %x yolu belirlenemedi.</target> <source>Error Code %x:</source> <target>Hata Kodu %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Şu XML elemanları okunamadı:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>%x ayarlar dosyası kısmen yüklendi.</target> + diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng index 31fd6bbf..e97fa6c6 100644 --- a/FreeFileSync/Build/Languages/ukrainian.lng +++ b/FreeFileSync/Build/Languages/ukrainian.lng @@ -118,6 +118,9 @@ <source>Size:</source> <target>Розмір:</target> +<source>Content comparison was skipped for excluded files %x.</source> +<target>Порівняння вмісту виключених файлів %x було пропущене.</target> + <source>Items differ in attributes only</source> <target>Елементи відрізняються тільки атрибутами</target> @@ -301,9 +304,6 @@ <source>%x items/sec</source> <target>%x елемента/сек</target> -<source>Configuration file %x loaded partially only.</source> -<target>Файл конфігурації %x завантажено лише частково.</target> - <source>Show in Explorer</source> <target>Показати у Провіднику</target> @@ -331,12 +331,9 @@ <source>Stop requested: Waiting for current operation to finish...</source> <target>Запит зупинки: очікування завершення поточної операції...</target> -<source>Unable to create timestamp for versioning:</source> +<source>Unable to create time stamp for versioning:</source> <target>Не вдається створити часової мітки для версій:</target> -<source>Cannot read the following XML elements:</source> -<target>Не вдається прочитати такі елементи XML:</target> - <source>&Open...</source> <target>&Відкрити...</target> @@ -564,6 +561,9 @@ The command is triggered if: <source>Saving log file %x...</source> <target>Збереження файла журналу %x...</target> +<source>Stopped</source> +<target>Зупинено</target> + <source>You can switch to FreeFileSync's main window to resolve this issue.</source> <target>Ви можете перейти до головного вікна FreeFileSync щоб вирішити це питання.</target> @@ -658,21 +658,6 @@ The command is triggered if: <source>Drag && drop</source> <target>Drag && drop</target> -<source>Close progress dialog</source> -<target>Закрити вікно прогресу</target> - -<source>Standby</source> -<target>Сплячий режим</target> - -<source>Log off</source> -<target>Вилогувати</target> - -<source>Shut down</source> -<target>Вимкнути комп'ютер</target> - -<source>Hibernate</source> -<target>Гібернація</target> - <source>Alternate comparison settings</source> <target>Альтернативні налаштування порівняння</target> @@ -778,6 +763,15 @@ The command is triggered if: <source>Save as batch job</source> <target>Зберегти як пакетне завдання</target> +<source>View type:</source> +<target>Тип перегляду</target> + +<source>Select view:</source> +<target>Вибрати перегляд:</target> + +<source>Statistics:</source> +<target>Статистика:</target> + <source>Number of files and folders that will be created</source> <target>Кількість файлів і папок, які будуть створені</target> @@ -879,15 +873,15 @@ The command is triggered if: <source>On completion:</source> <target>Після завершення:</target> +<source>Detect synchronization directions with the help of database files</source> +<target>Визначити напрямок синхронізації за допомогою файлів баз даних</target> + <source>Start synchronization now?</source> <target>Розпочати синхронізацію?</target> <source>Variant:</source> <target>Варіант:</target> -<source>Statistics</source> -<target>Статистика</target> - <source>&Don't show this dialog again</source> <target>Більше &не показувати цей діалог</target> @@ -924,8 +918,8 @@ The command is triggered if: <source>Stop synchronization at first error</source> <target>Зупинити синхронізацію при першій помилці</target> -<source>Show progress dialog</source> -<target>Показувати вікно прогресу</target> +<source>Run minimized</source> +<target>Запустити мінімізовано</target> <source>Save log:</source> <target>Зберегти журнал:</target> @@ -942,12 +936,6 @@ The command is triggered if: <source>&Recycle bin</source> <target>&Корзина</target> -<source>Delete on both sides</source> -<target>Вилучити з обох сторін</target> - -<source>Delete on both sides even if the file is selected on one side only</source> -<target>Вилучити з обох сторін, навіть якщо файл виділений тільки з однієї сторони</target> - <source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source> <target>Виберіть правила фільтрації для виключення деяких файлів із синхронізації. Введіть шляхи файлів відносно відповідної пари папок.</target> @@ -969,8 +957,8 @@ The command is triggered if: <source>Maximum:</source> <target>Максимум:</target> -<source>&Clear</source> -<target>&Очистити</target> +<source>&Reset</source> +<target>&Відновити</target> <source>The following settings are used for all synchronization jobs.</source> <target>Наступні налаштування використовуються для всіх завдань синхронізації.</target> @@ -1068,11 +1056,11 @@ This guarantees a consistent state even in case of a serious error. <source>Find</source> <target>Знайти</target> -<source>Select View</source> -<target>Вибрати перегляд</target> +<source>View Settings</source> +<target>Налаштування перегляду</target> <source>Overview</source> -<target>Головна</target> +<target>Огляд</target> <source>Configuration</source> <target>Налаштування</target> @@ -1156,12 +1144,12 @@ This guarantees a consistent state even in case of a serious error. <source>Exclude via filter:</source> <target>Виключити через фільтр:</target> -<source>Exclude temporarily</source> -<target>Виключити тимчасово</target> - <source>Include temporarily</source> <target>Включити</target> +<source>Exclude temporarily</source> +<target>Виключити тимчасово</target> + <source>Delete</source> <target>Видалити</target> @@ -1213,6 +1201,9 @@ This guarantees a consistent state even in case of a serious error. <source>Do&n't save</source> <target>&Не зберігати</target> +<source>Delete selected configurations</source> +<target>Вилучити вибрану конфігурацію</target> + <source>Filter</source> <target>Фільтр</target> @@ -1264,8 +1255,8 @@ This guarantees a consistent state even in case of a serious error. <source>Set as default</source> <target>Встановити за замовчуванням</target> -<source>All folders are in sync</source> -<target>Всі папки синхронізовано</target> +<source>All files are in sync</source> +<target>Всі файли синхронні</target> <source>Synchronization Settings</source> <target>Налаштування Синхронізації</target> @@ -1285,6 +1276,21 @@ This guarantees a consistent state even in case of a serious error. <source>Searching for program updates...</source> <target>Пошук оновлень програми ...</target> +<source>Close progress dialog</source> +<target>Закрити вікно прогресу</target> + +<source>Standby</source> +<target>Сплячий режим</target> + +<source>Log off</source> +<target>Вилогувати</target> + +<source>Shut down</source> +<target>Вимкнути комп'ютер</target> + +<source>Hibernate</source> +<target>Гібернація</target> + <source>Scanning...</source> <target>Сканування...</target> @@ -1306,15 +1312,15 @@ This guarantees a consistent state even in case of a serious error. <source>Initializing...</source> <target>Ініціалізація...</target> -<source>Stopped</source> -<target>Зупинено</target> - <source>Completed</source> <target>Завершено</target> <source>&Continue</source> <target>&Продовжити</target> +<source>Progress</source> +<target>Прогрес</target> + <source>Log</source> <target>Лог</target> @@ -1407,8 +1413,8 @@ This guarantees a consistent state even in case of a serious error. <source>Time stamp</source> <target>Часова мітка</target> -<source>Append a timestamp to each file name</source> -<target>Додати часову мітку до кожного імені файлу</target> +<source>Append a time stamp to each file name</source> +<target>Приєднати часову мітку до кожної назви файлу</target> <source>File</source> <target>Файл</target> @@ -1536,9 +1542,18 @@ This guarantees a consistent state even in case of a serious error. <source>Unable to move %x to the recycle bin.</source> <target>Не вдається перемістити %x до Корзини.</target> +<source>Checking recycle bin failed for folder %x.</source> +<target>Перевірка Корзини для папки %x не вдалася.</target> + <source>Cannot determine final path for %x.</source> <target>Не вдається визначити кінцевого шляху для %x.</target> <source>Error Code %x:</source> <target>Код помилки %x:</target> +<source>Cannot read the following XML elements:</source> +<target>Не вдається прочитати такі елементи XML:</target> + +<source>Configuration file %x loaded partially only.</source> +<target>Файл конфігурації %x завантажено лише частково.</target> + diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip Binary files differindex 847beb78..a673e9f3 100644 --- a/FreeFileSync/Build/Resources.zip +++ b/FreeFileSync/Build/Resources.zip diff --git a/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile index 9f61a76a..ad994a62 100644 --- a/FreeFileSync/Source/Makefile +++ b/FreeFileSync/Source/Makefile @@ -79,7 +79,7 @@ CPP_LIST+=synchronization.cpp CPP_LIST+=file_hierarchy.cpp CPP_LIST+=ui/custom_grid.cpp CPP_LIST+=ui/folder_history_box.cpp -CPP_LIST+=ui/exec_finished_box.cpp +CPP_LIST+=ui/on_completion_box.cpp CPP_LIST+=ui/dir_name.cpp CPP_LIST+=ui/batch_config.cpp CPP_LIST+=ui/batch_status_handler.cpp diff --git a/FreeFileSync/Source/RealtimeSync/gui_generated.cpp b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp index 4de8a612..e9d97c01 100644 --- a/FreeFileSync/Source/RealtimeSync/gui_generated.cpp +++ b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp @@ -1,11 +1,11 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Feb 26 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// -#include "../wx+/bitmap_button.h" +#include "wx+/bitmap_button.h" #include "gui_generated.h" diff --git a/FreeFileSync/Source/RealtimeSync/gui_generated.h b/FreeFileSync/Source/RealtimeSync/gui_generated.h index cb0c0cc5..95c97478 100644 --- a/FreeFileSync/Source/RealtimeSync/gui_generated.h +++ b/FreeFileSync/Source/RealtimeSync/gui_generated.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Feb 26 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! diff --git a/FreeFileSync/Source/algorithm.cpp b/FreeFileSync/Source/algorithm.cpp index a58d4bb8..f1ebda76 100644 --- a/FreeFileSync/Source/algorithm.cpp +++ b/FreeFileSync/Source/algorithm.cpp @@ -11,13 +11,13 @@ #include <zen/recycler.h> #include <zen/stl_tools.h> #include <zen/scope_guard.h> -#include <zen/thread.h> +//#include <zen/thread.h> #include <wx+/image_resources.h> #include "lib/norm_filter.h" #include "lib/db_file.h" #include "lib/cmp_filetime.h" #include "lib/norm_filter.h" -#include "process_callback.h" //for UI_UPDATE_INTERVAL +//#include "process_callback.h" //for UI_UPDATE_INTERVAL using namespace zen; using namespace std::rel_ops; @@ -1083,66 +1083,28 @@ void zen::applyTimeSpanFilter(FolderComparison& folderCmp, const Int64& timeFrom std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirPair& baseDirObj) { FilterByTimeSpan::execute(baseDirObj, timeFrom, timeTo); }); } - //############################################################################################################ + std::pair<Zstring, int> zen::deleteFromGridAndHDPreview(const std::vector<FileSystemObject*>& selectionLeft, - const std::vector<FileSystemObject*>& selectionRight, - bool deleteOnBothSides) + const std::vector<FileSystemObject*>& selectionRight) { //don't use wxString here, it's linear allocation strategy would bring perf down to a crawl; Zstring: exponential growth! Zstring fileList; int totalDelCount = 0; - if (deleteOnBothSides) - { - //mix selected rows from left and right (without changing order) - std::vector<FileSystemObject*> selection; + for (const FileSystemObject* fsObj : selectionLeft) + if (!fsObj->isEmpty<LEFT_SIDE>()) { - hash_set<FileSystemObject*> objectsUsed; - std::copy_if(selectionLeft .begin(), selectionLeft .end(), std::back_inserter(selection), [&](FileSystemObject* fsObj) { return objectsUsed.insert(fsObj).second; }); - std::copy_if(selectionRight.begin(), selectionRight.end(), std::back_inserter(selection), [&](FileSystemObject* fsObj) { return objectsUsed.insert(fsObj).second; }); + fileList += fsObj->getFullName<LEFT_SIDE>() + Zstr('\n'); + ++totalDelCount; } - std::for_each(selection.begin(), selection.end(), - [&](const FileSystemObject* fsObj) + for (const FileSystemObject* fsObj : selectionRight) + if (!fsObj->isEmpty<RIGHT_SIDE>()) { - if (!fsObj->isEmpty<LEFT_SIDE>()) - { - fileList += fsObj->getFullName<LEFT_SIDE>() + Zstr('\n'); - ++totalDelCount; - } - - if (!fsObj->isEmpty<RIGHT_SIDE>()) - { - fileList += fsObj->getFullName<RIGHT_SIDE>() + Zstr('\n'); - ++totalDelCount; - } - - fileList += Zstr('\n'); - }); - } - else //delete selected files only - { - std::for_each(selectionLeft.begin(), selectionLeft.end(), - [&](const FileSystemObject* fsObj) - { - if (!fsObj->isEmpty<LEFT_SIDE>()) - { - fileList += fsObj->getFullName<LEFT_SIDE>() + Zstr('\n'); - ++totalDelCount; - } - }); - - std::for_each(selectionRight.begin(), selectionRight.end(), - [&](const FileSystemObject* fsObj) - { - if (!fsObj->isEmpty<RIGHT_SIDE>()) - { - fileList += fsObj->getFullName<RIGHT_SIDE>() + Zstr('\n'); - ++totalDelCount; - } - }); - } + fileList += fsObj->getFullName<RIGHT_SIDE>() + Zstr('\n'); + ++totalDelCount; + } return std::make_pair(fileList, totalDelCount); } @@ -1174,19 +1136,6 @@ bool tryReportingError(Function cmd, DeleteFilesHandler& handler) //return "true } } -#ifdef ZEN_WIN -//recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow -StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, DeleteFilesHandler& callback) -{ - const std::wstring msg = replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(dirname), false); - - auto ft = async([=] { return recycleBinStatus(dirname); }); - while (!ft.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL / 2))) - callback.reportStatus(msg); //may throw! - return ft.get(); -} -#endif - template <SelectedSide side> void categorize(const std::set<FileSystemObject*>& rowsIn, @@ -1196,27 +1145,37 @@ void categorize(const std::set<FileSystemObject*>& rowsIn, std::map<Zstring, bool, LessFilename>& hasRecyclerBuffer, DeleteFilesHandler& callback) { - auto hasRecycler = [&](const FileSystemObject& fsObj) -> bool + auto hasRecycler = [&](const Zstring& baseDirPf) -> bool { #ifdef ZEN_WIN - const Zstring& baseDirPf = fsObj.root().getBaseDirPf<side>(); - auto it = hasRecyclerBuffer.find(baseDirPf); if (it != hasRecyclerBuffer.end()) return it->second; - return hasRecyclerBuffer.insert(std::make_pair(baseDirPf, recycleBinStatusUpdating(baseDirPf, callback) == STATUS_REC_EXISTS)).first->second; + + const std::wstring msg = replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(baseDirPf), false); + + bool recExists = false; + try + { + recExists = recycleBinExists(baseDirPf, [&] { callback.reportStatus(msg); /*may throw*/ }); //throw FileError + } + catch (const FileError& e) { callback.reportError(e.toString()); /*throw?*/ } + + hasRecyclerBuffer.insert(std::make_pair(baseDirPf, recExists)); + return recExists; + #elif defined ZEN_LINUX || defined ZEN_MAC return true; #endif }; - for (auto it = rowsIn.begin(); it != rowsIn.end(); ++it) - if (!(*it)->isEmpty<side>()) + for (FileSystemObject* row : rowsIn) + if (!row->isEmpty<side>()) { - if (useRecycleBin && hasRecycler(**it)) //Windows' ::SHFileOperation() will delete permanently anyway, but we have a superior deletion routine - deleteRecyler.push_back(*it); + if (useRecycleBin && hasRecycler(row->root().getBaseDirPf<side>())) //Windows' ::SHFileOperation() will delete permanently anyway, but we have a superior deletion routine + deleteRecyler.push_back(row); else - deletePermanent.push_back(*it); + deletePermanent.push_back(row); } } @@ -1308,14 +1267,12 @@ void deleteFromGridAndHDOneSide(std::vector<FileSystemObject*>& ptrList, ItemDeleter<side> deleter(useRecycleBin, handler); for (FileSystemObject* fsObj : ptrList) //all pointers are required(!) to be bound - { if (!fsObj->isEmpty<side>()) //element may be implicitly deleted, e.g. if parent folder was deleted first tryReportingError([&] { fsObj->accept(deleter); //throw FileError fsObj->removeObject<side>(); //if directory: removes recursively! }, handler); - } } } @@ -1323,7 +1280,6 @@ void zen::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete const std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! FolderComparison& folderCmp, //attention: rows will be physically deleted! const std::vector<DirectionConfig>& directCfgs, - bool deleteOnBothSides, bool useRecycleBin, DeleteFilesHandler& statusHandler, bool& warningRecyclerMissing) @@ -1340,11 +1296,6 @@ void zen::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete std::set<FileSystemObject*> deleteLeft (rowsToDeleteOnLeft .begin(), rowsToDeleteOnLeft .end()); std::set<FileSystemObject*> deleteRight(rowsToDeleteOnRight.begin(), rowsToDeleteOnRight.end()); - if (deleteOnBothSides) - { - deleteLeft.insert(deleteRight.begin(), deleteRight.end()); - deleteRight = deleteLeft; - } set_remove_if(deleteLeft, [](const FileSystemObject* fsObj) { return fsObj->isEmpty<LEFT_SIDE >(); }); //still needed? set_remove_if(deleteRight, [](const FileSystemObject* fsObj) { return fsObj->isEmpty<RIGHT_SIDE>(); }); // @@ -1403,9 +1354,9 @@ void zen::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete { std::wstring msg = _("The recycle bin is not available for the following folders. Files will be deleted permanently instead:") + L"\n"; - for (auto it = hasRecyclerBuffer.begin(); it != hasRecyclerBuffer.end(); ++it) - if (!it->second) - msg += std::wstring(L"\n") + it->first; + for (const auto& item : hasRecyclerBuffer) + if (!item.second) + msg += std::wstring(L"\n") + item.first; statusHandler.reportWarning(msg, warningRecyclerMissing); //throw? } diff --git a/FreeFileSync/Source/algorithm.h b/FreeFileSync/Source/algorithm.h index c7af2299..ad2189d0 100644 --- a/FreeFileSync/Source/algorithm.h +++ b/FreeFileSync/Source/algorithm.h @@ -36,10 +36,9 @@ void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or //manual deletion of files on main grid -std::pair<Zstring, int> deleteFromGridAndHDPreview( //returns string with elements to be deleted and total count of selected(!) objects, NOT total files/dirs! - const std::vector<FileSystemObject*>& selectionLeft, //all pointers need to be bound! - const std::vector<FileSystemObject*>& selectionRight, // - bool deleteOnBothSides); +std::pair<Zstring, int> deleteFromGridAndHDPreview( //returns string with elements to be deleted and total count of selected(!) objects, NOT total files/dirs! + const std::vector<FileSystemObject*>& selectionLeft, //all pointers need to be bound! + const std::vector<FileSystemObject*>& selectionRight); // struct DeleteFilesHandler { @@ -58,7 +57,6 @@ void deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDeleteOnLef const std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! FolderComparison& folderCmp, //attention: rows will be physically deleted! const std::vector<DirectionConfig>& directCfgs, - bool deleteOnBothSides, bool useRecycleBin, DeleteFilesHandler& statusHandler, //global warnings: diff --git a/FreeFileSync/Source/application.cpp b/FreeFileSync/Source/application.cpp index 0c7f5fe5..fbe7a9a9 100644 --- a/FreeFileSync/Source/application.cpp +++ b/FreeFileSync/Source/application.cpp @@ -26,6 +26,7 @@ #ifdef ZEN_WIN #include <zen/win_ver.h> +#include "../../validate.h" #elif defined ZEN_LINUX #include <gtk/gtk.h> @@ -125,12 +126,9 @@ std::vector<Zstring> getCommandlineArgs(const wxApp& app) if (!args.empty()) args.erase(args.begin()); //remove first argument which is exe path by convention: http://blogs.msdn.com/b/oldnewthing/archive/2006/05/15/597984.aspx - std::for_each(args.begin(), args.end(), - [](Zstring& str) - { + for (Zstring& str : args) if (str.size() >= 2 && startsWith(str, L'\"') && endsWith(str, L'\"')) str = Zstring(str.c_str() + 1, str.size() - 2); - }); #else for (int i = 1; i < app.argc; ++i) //wxWidgets screws up once again making "argv implicitly convertible to a wxChar**" in 2.9.3, @@ -151,7 +149,7 @@ bool Application::OnInit() #ifdef ZEN_WIN enableCrashingOnCrashes(); - + validateHandlers(); #ifdef _MSC_VER _set_invalid_parameter_handler(crtInvalidParameterHandler); //see comment in <zen/time.h> #endif @@ -588,7 +586,7 @@ void runBatchMode(const XmlBatchConfig& batchCfg, const Zstring& referenceFile, const SwitchToGui switchBatchToGui(referenceFile, batchCfg, globalCfg); //prepare potential operational switch //class handling status updates and error messages - BatchStatusHandler statusHandler(batchCfg.showProgress, //throw BatchAbortProcess + BatchStatusHandler statusHandler(!batchCfg.runMinimized, //throw BatchAbortProcess extractJobName(referenceFile), timeStamp, batchCfg.logFileDirectory, diff --git a/FreeFileSync/Source/comparison.cpp b/FreeFileSync/Source/comparison.cpp index 4c125db4..09b747a1 100644 --- a/FreeFileSync/Source/comparison.cpp +++ b/FreeFileSync/Source/comparison.cpp @@ -62,39 +62,49 @@ struct ResolvedFolderPair }; -void determineExistentDirs(const std::vector<FolderPairCfg>& cfgList, //in - bool allowUserInteraction, ProcessCallback& callback, - std::vector<ResolvedFolderPair>& resolvedPairs, //out - std::set<Zstring, LessFilename>& existingDirs) //out +std::vector<ResolvedFolderPair> resolveDirectoryNames(const std::vector<FolderPairCfg>& cfgList) { + std::vector<ResolvedFolderPair> output; + + //support retry for environment variable and and variable driver letter resolution! + for (const FolderPairCfg& fpCfg : cfgList) + output.push_back(ResolvedFolderPair( + getFormattedDirectoryName(fpCfg.dirnamePhraseLeft), + getFormattedDirectoryName(fpCfg.dirnamePhraseRight))); + warn_static("get volume by name for idle HDD! => call async getFormattedDirectoryName, but currently not thread-safe") + + assert(output.size() == cfgList.size()); //postcondition! + return output; +} + + +std::set<Zstring, LessFilename> determineExistentDirs(const std::vector<ResolvedFolderPair>& resolvedPairs, + bool allowUserInteraction, + ProcessCallback& callback) +{ + std::set<Zstring, LessFilename> dirnames; + for (const ResolvedFolderPair& fp : resolvedPairs) + { + dirnames.insert(fp.dirnameLeft); + dirnames.insert(fp.dirnameRight); + } + + std::set<Zstring, LessFilename> output; + tryReportingError([&] { - //support retry for environment variable and and variable driver letter resolution! - resolvedPairs.clear(); - for (const FolderPairCfg& fpCfg : cfgList) - resolvedPairs.push_back(ResolvedFolderPair(getFormattedDirectoryName(fpCfg.dirnamePhraseLeft), - getFormattedDirectoryName(fpCfg.dirnamePhraseRight))); - warn_static("get volume by name for idle HDD! => call async getFormattedDirectoryName, but currently not thread-safe") - - std::set<Zstring, LessFilename> dirnames; - for (const ResolvedFolderPair& fp : resolvedPairs) - { - dirnames.insert(fp.dirnameLeft); - dirnames.insert(fp.dirnameRight); - } + const DirectoryStatus dirStatus = getExistingDirsUpdating(dirnames, allowUserInteraction, callback); //check *all* directories on each try! + output = dirStatus.existing; - std::set<Zstring, LessFilename> missing; - existingDirs = getExistingDirsUpdating(dirnames, missing, allowUserInteraction, callback); //check *all* directories on each try! - if (!missing.empty()) + if (!dirStatus.missing.empty()) { std::wstring msg = _("Cannot find the following folders:") + L"\n"; - for (const Zstring& dirname : missing) + for (const Zstring& dirname : dirStatus.missing) msg += std::wstring(L"\n") + dirname; throw FileError(msg, _("You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.")); } }, callback); - - assert(resolvedPairs.size() == cfgList.size()); //postcondition! + return output; } @@ -248,7 +258,7 @@ std::wstring getConflictSameDateDiffSize(const FilePair& fileObj) std::wstring getConflictSkippedBinaryComparison(const FilePair& fileObj) { - return replaceCpy(_("Binary comparison was skipped for excluded files %x."), L"%x", fmtFileName(fileObj.getObjRelativeName())); + return replaceCpy(_("Content comparison was skipped for excluded files %x."), L"%x", fmtFileName(fileObj.getObjRelativeName())); } @@ -776,12 +786,9 @@ void zen::compare(int fileTimeTolerance, //-------------------some basic checks:------------------------------------------ - std::vector<ResolvedFolderPair> resolvedPairs; - std::set<Zstring, LessFilename> existingDirs; - determineExistentDirs(cfgList, //in - allowUserInteraction, callback, - resolvedPairs, //out - existingDirs); //out + const std::vector<ResolvedFolderPair> resolvedPairs = resolveDirectoryNames(cfgList); + const std::set<Zstring, LessFilename> existingDirs = determineExistentDirs(resolvedPairs, allowUserInteraction, callback); + //directory existence only checked *once* to avoid race conditions! if (resolvedPairs.size() != cfgList.size()) throw std::logic_error("Programming Error: Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__)); diff --git a/FreeFileSync/Source/lib/db_file.h b/FreeFileSync/Source/lib/db_file.h index c432704d..4b499ea5 100644 --- a/FreeFileSync/Source/lib/db_file.h +++ b/FreeFileSync/Source/lib/db_file.h @@ -12,7 +12,7 @@ namespace zen { -const Zstring SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); +const Zchar SYNC_DB_FILE_ENDING[] = Zstr(".ffs_db"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! struct InSyncDescrFile //subset of FileDescriptor { diff --git a/FreeFileSync/Source/lib/dir_exist_async.h b/FreeFileSync/Source/lib/dir_exist_async.h index a6eff1c0..4c8efe22 100644 --- a/FreeFileSync/Source/lib/dir_exist_async.h +++ b/FreeFileSync/Source/lib/dir_exist_async.h @@ -21,14 +21,20 @@ namespace //- check existence of all directories in parallel! (avoid adding up search times if multiple network drives are not reachable) //- add reasonable time-out time! //- avoid checking duplicate entries by design: set<Zstring, LessFilename> -std::set<Zstring, LessFilename> getExistingDirsUpdating(const std::set<Zstring, LessFilename>& dirnames, - std::set<Zstring, LessFilename>& missing, - bool allowUserInteraction, - ProcessCallback& procCallback) +struct DirectoryStatus +{ + std::set<Zstring, LessFilename> existing; + std::set<Zstring, LessFilename> missing; + +}; + +DirectoryStatus getExistingDirsUpdating(const std::set<Zstring, LessFilename>& dirnames, + bool allowUserInteraction, + ProcessCallback& procCallback) { using namespace zen; - missing.clear(); + DirectoryStatus output; std::list<std::pair<Zstring, boost::unique_future<bool>>> futureInfo; for (const Zstring& dirname : dirnames) @@ -43,7 +49,6 @@ std::set<Zstring, LessFilename> getExistingDirsUpdating(const std::set<Zstring, return dirExists(dirname); }))); - std::set<Zstring, LessFilename> output; //don't wait (almost) endlessly like win32 would on not existing network shares: const boost::system_time endTime = boost::get_system_time() + boost::posix_time::seconds(20); //consider CD-rom insert or hard disk spin up time from sleep @@ -56,9 +61,9 @@ std::set<Zstring, LessFilename> getExistingDirsUpdating(const std::set<Zstring, procCallback.requestUiRefresh(); //may throw! if (fi.second.is_ready() && fi.second.get()) - output.insert(fi.first); + output.existing.insert(fi.first); else - missing.insert(fi.first); + output.missing.insert(fi.first); } return output; } @@ -68,10 +73,9 @@ inline //also silences Clang "unused function" for compilation units depending f bool dirExistsUpdating(const Zstring& dirname, bool allowUserInteraction, ProcessCallback& procCallback) { if (dirname.empty()) return false; - std::set<Zstring, LessFilename> missing; - std::set<Zstring, LessFilename> dirsEx = getExistingDirsUpdating({ dirname }, missing, allowUserInteraction, procCallback); - assert(dirsEx.empty() != missing.empty()); - return dirsEx.find(dirname) != dirsEx.end(); + const DirectoryStatus dirStatus = getExistingDirsUpdating({ dirname }, allowUserInteraction, procCallback); + assert(dirStatus.existing.empty() != dirStatus.missing.empty()); + return dirStatus.existing.find(dirname) != dirStatus.existing.end(); } } diff --git a/FreeFileSync/Source/lib/dir_lock.cpp b/FreeFileSync/Source/lib/dir_lock.cpp index 56fadb8f..8c02737b 100644 --- a/FreeFileSync/Source/lib/dir_lock.cpp +++ b/FreeFileSync/Source/lib/dir_lock.cpp @@ -79,13 +79,14 @@ public: //ATTENTION: setting file pointer IS required! => use CreateFile/GENERIC_WRITE + SetFilePointerEx! //although CreateFile/FILE_APPEND_DATA without SetFilePointerEx works locally, it MAY NOT work on some network shares creating a 4 gig file!!! - const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename_).c_str(), - GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp - FILE_SHARE_READ, - nullptr, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - nullptr); + const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename_).c_str(), //_In_ LPCTSTR lpFileName, + //use both when writing over network, see comment in file_io.cpp + GENERIC_READ | GENERIC_WRITE, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_ATTRIBUTE_NORMAL, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (fileHandle == INVALID_HANDLE_VALUE) return; ZEN_ON_SCOPE_EXIT(::CloseHandle(fileHandle)); @@ -141,10 +142,8 @@ UInt64 getLockFileSize(const Zstring& filename) //throw FileError const wchar_t functionName[] = L"stat"; #endif - const ErrorCode lastError = getLastError(); - const std::wstring errorMsg = replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)); - const std::wstring errorDescr = formatSystemError(functionName, lastError); - throw FileError(errorMsg, errorDescr); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), + formatSystemError(functionName, getLastError())); } @@ -516,13 +515,14 @@ void releaseLock(const Zstring& lockfilename) //throw () bool tryLock(const Zstring& lockfilename) //throw FileError { #ifdef ZEN_WIN - const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename).c_str(), - GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - CREATE_NEW, - FILE_ATTRIBUTE_NORMAL, - nullptr); + const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename).c_str(), //_In_ LPCTSTR lpFileName, + //use both when writing over network, see comment in file_io.cpp + GENERIC_READ | GENERIC_WRITE, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + CREATE_NEW, //_In_ DWORD dwCreationDisposition, + FILE_ATTRIBUTE_NORMAL, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (fileHandle == INVALID_HANDLE_VALUE) { const DWORD lastError = ::GetLastError(); diff --git a/FreeFileSync/Source/lib/hard_filter.cpp b/FreeFileSync/Source/lib/hard_filter.cpp index 687aecd8..c3ccb42e 100644 --- a/FreeFileSync/Source/lib/hard_filter.cpp +++ b/FreeFileSync/Source/lib/hard_filter.cpp @@ -21,9 +21,9 @@ using namespace zen; bool zen::operator<(const HardFilter& lhs, const HardFilter& rhs) { if (typeid(lhs) != typeid(rhs)) - return typeid(lhs).before(typeid(rhs)) != 0; //note: in worst case, order is guaranteed to be stable only during each program run + return typeid(lhs).before(typeid(rhs)); //in worst case, order is guaranteed to be stable only during each program run - //this and other are same type: + //this and other are of same type: return lhs.cmpLessSameType(rhs); } diff --git a/FreeFileSync/Source/lib/lock_holder.h b/FreeFileSync/Source/lib/lock_holder.h index cf4c460e..ea92ae9a 100644 --- a/FreeFileSync/Source/lib/lock_holder.h +++ b/FreeFileSync/Source/lib/lock_holder.h @@ -10,7 +10,8 @@ namespace zen { -const Zstring LOCK_FILE_ENDING = Zstr(".ffs_lock"); //intermediate locks created by DirLock use this extension, too! +//intermediate locks created by DirLock use this extension, too: +const Zchar LOCK_FILE_ENDING[] = Zstr(".ffs_lock"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! //hold locks for a number of directories without blocking during lock creation //call after having checked directory existence! diff --git a/FreeFileSync/Source/lib/perf_check.cpp b/FreeFileSync/Source/lib/perf_check.cpp index e016bc6c..7e303041 100644 --- a/FreeFileSync/Source/lib/perf_check.cpp +++ b/FreeFileSync/Source/lib/perf_check.cpp @@ -70,7 +70,7 @@ std::pair<const std::multimap<int64_t, PerfCheck::Record>::value_type*, const st } -zen::Opt<std::wstring> PerfCheck::getRemainingTime(double dataRemaining) const +zen::Opt<double> PerfCheck::getRemainingTimeSec(double dataRemaining) const { auto blk = getBlockFromEnd(windowSizeRemTime); if (blk.first && blk.second) @@ -78,14 +78,14 @@ zen::Opt<std::wstring> PerfCheck::getRemainingTime(double dataRemaining) const const auto& itemFront = *blk.first; const auto& itemBack = *blk.second; //----------------------------------------------------------------------------------------------- - const int64_t timeDelta = itemBack.first - itemFront.first; - const double dataDelta = itemBack.second.data_ - itemFront.second.data_; + const std::int64_t timeDeltaMs = itemBack.first - itemFront.first; + const double dataDelta = itemBack.second.data_ - itemFront.second.data_; //objects model logical operations *NOT* disk accesses, so we better play safe and use "bytes" only! //http://sourceforge.net/p/freefilesync/feature-requests/197/ if (!numeric::isNull(dataDelta)) //sign(dataRemaining) != sign(dataDelta) usually an error, so show it! - return remainingTimeToString(dataRemaining * timeDelta / (1000.0 * dataDelta)); + return dataRemaining * timeDeltaMs / 1000.0 / dataDelta; } return NoValue(); } @@ -99,11 +99,11 @@ zen::Opt<std::wstring> PerfCheck::getBytesPerSecond() const const auto& itemFront = *blk.first; const auto& itemBack = *blk.second; //----------------------------------------------------------------------------------------------- - const int64_t timeDelta = itemBack.first - itemFront.first; - const double dataDelta = itemBack.second.data_ - itemFront.second.data_; + const std::int64_t timeDeltaMs = itemBack.first - itemFront.first; + const double dataDelta = itemBack.second.data_ - itemFront.second.data_; - if (timeDelta != 0/* && dataDelta > 0*/) - return filesizeToShortString(Int64(dataDelta * 1000.0 / timeDelta)) + _("/sec"); + if (timeDeltaMs != 0) + return filesizeToShortString(Int64(dataDelta * 1000.0 / timeDeltaMs)) + _("/sec"); } return NoValue(); } @@ -117,11 +117,11 @@ zen::Opt<std::wstring> PerfCheck::getItemsPerSecond() const const auto& itemFront = *blk.first; const auto& itemBack = *blk.second; //----------------------------------------------------------------------------------------------- - const int64_t timeDelta = itemBack.first - itemFront.first; - const int itemsDelta = itemBack.second.itemCount_ - itemFront.second.itemCount_; + const int64_t timeDeltaMs = itemBack.first - itemFront.first; + const int itemsDelta = itemBack.second.itemCount_ - itemFront.second.itemCount_; - if (timeDelta != 0) - return replaceCpy(_("%x items/sec"), L"%x", formatThreeDigitPrecision(itemsDelta * 1000.0 / timeDelta)); + if (timeDeltaMs != 0) + return replaceCpy(_("%x items/sec"), L"%x", formatThreeDigitPrecision(itemsDelta * 1000.0 / timeDeltaMs)); } return NoValue(); } diff --git a/FreeFileSync/Source/lib/perf_check.h b/FreeFileSync/Source/lib/perf_check.h index 894ba31d..32e74874 100644 --- a/FreeFileSync/Source/lib/perf_check.h +++ b/FreeFileSync/Source/lib/perf_check.h @@ -21,7 +21,7 @@ public: void addSample(int itemsCurrent, double dataCurrent, int64_t timeMs); //timeMs must be ascending! - zen::Opt<std::wstring> getRemainingTime(double dataRemaining) const; + zen::Opt<double> getRemainingTimeSec(double dataRemaining) const; zen::Opt<std::wstring> getBytesPerSecond() const; //for window zen::Opt<std::wstring> getItemsPerSecond() const; //for window diff --git a/FreeFileSync/Source/lib/process_xml.cpp b/FreeFileSync/Source/lib/process_xml.cpp index aaff3d83..a3c14952 100644 --- a/FreeFileSync/Source/lib/process_xml.cpp +++ b/FreeFileSync/Source/lib/process_xml.cpp @@ -1012,7 +1012,15 @@ void readConfig(const XmlIn& in, xmlAccess::XmlBatchConfig& config) XmlIn inBatchCfg = in["BatchConfig"]; inBatchCfg["HandleError" ](config.handleError); - inBatchCfg["ShowProgress" ](config.showProgress); + + warn_static("remove after migration?") + if (inBatchCfg["ShowProgress"]) //2014-2-17 + { + inBatchCfg["ShowProgress"](config.runMinimized); + config.runMinimized = !config.runMinimized; + } + else + inBatchCfg["RunMinimized"](config.runMinimized); warn_static("remove after migration?") if (inBatchCfg["LogfileDirectory"]) inBatchCfg["LogfileDirectory"](config.logFileDirectory); //obsolete name @@ -1398,9 +1406,9 @@ void writeConfig(const XmlBatchConfig& config, XmlOut& out) //write GUI specific config data XmlOut outBatchCfg = out["BatchConfig"]; - outBatchCfg["HandleError" ](config.handleError); - outBatchCfg["ShowProgress" ](config.showProgress); - outBatchCfg["LogfileFolder" ](config.logFileDirectory); + outBatchCfg["HandleError" ](config.handleError); + outBatchCfg["RunMinimized" ](config.runMinimized); + outBatchCfg["LogfileFolder"](config.logFileDirectory); outBatchCfg["LogfileFolder"].attribute("Limit", config.logfilesCountLimit); } diff --git a/FreeFileSync/Source/lib/process_xml.h b/FreeFileSync/Source/lib/process_xml.h index 2790fb58..1a9257bd 100644 --- a/FreeFileSync/Source/lib/process_xml.h +++ b/FreeFileSync/Source/lib/process_xml.h @@ -71,13 +71,13 @@ bool operator==(const XmlGuiConfig& lhs, const XmlGuiConfig& rhs) struct XmlBatchConfig { XmlBatchConfig() : - showProgress(true), + runMinimized(false), logfilesCountLimit(-1), handleError(ON_ERROR_POPUP) {} zen::MainConfiguration mainCfg; - bool showProgress; + bool runMinimized; Zstring logFileDirectory; int logfilesCountLimit; //max logfiles; 0 := don't save logfiles; < 0 := no limit OnError handleError; //reaction on error situation during synchronization @@ -251,7 +251,7 @@ struct XmlGlobalSettings std::vector<Zstring> folderHistoryRight; size_t folderHistMax; - std::vector<std::wstring> onCompletionHistory; + std::vector<Zstring> onCompletionHistory; size_t onCompletionHistoryMax; Zstring defaultExclusionFilter; diff --git a/FreeFileSync/Source/lib/resolve_path.cpp b/FreeFileSync/Source/lib/resolve_path.cpp index 09bc4509..c5a656ea 100644 --- a/FreeFileSync/Source/lib/resolve_path.cpp +++ b/FreeFileSync/Source/lib/resolve_path.cpp @@ -4,6 +4,7 @@ #include <zen/time.h> #include <zen/thread.h> #include <zen/utf.h> +#include <zen/optional.h> #include <zen/scope_guard.h> #include <wx/utils.h> //wxGetEnv @@ -82,7 +83,6 @@ Zstring resolveRelativePath(const Zstring& relativeName) } #endif - #ifdef ZEN_WIN class CsidlConstants { @@ -91,13 +91,16 @@ public: static const CsidlToDirMap& get() { - static CsidlConstants inst; //potential MT solved by intializing at startup, see below - return inst.csidlToDir; + //function scope static initialization: avoid static initialization order problem in global namespace! + static const CsidlToDirMap inst = createCsidlMapping(); + return inst; } private: - CsidlConstants() + static CsidlToDirMap createCsidlMapping() { + CsidlToDirMap output; + auto addCsidl = [&](int csidl, const Zstring& paramName) { wchar_t buffer[MAX_PATH] = {}; @@ -109,7 +112,7 @@ private: { Zstring dirname = buffer; if (!dirname.empty()) - csidlToDir.insert(std::make_pair(paramName, dirname)); + output.insert(std::make_pair(paramName, dirname)); } }; @@ -135,7 +138,7 @@ private: Zstring dirname = path; if (!dirname.empty()) - csidlToDir.insert(std::make_pair(paramName, dirname)); + output.insert(std::make_pair(paramName, dirname)); } } }; @@ -197,16 +200,12 @@ private: FOLDERID_Public covered by %Public% */ + return output; } - - CsidlConstants(const CsidlConstants&); - CsidlConstants& operator=(const CsidlConstants&); - - CsidlToDirMap csidlToDir; }; -//caveat: function scope static initialization is not thread-safe in VS 2010! => make sure to call at app start! -struct Dummy { Dummy() { CsidlConstants::get(); }} blah; +//caveat: function scope static initialization is not thread-safe in VS 2010! +auto& dummy = CsidlConstants::get(); #endif @@ -319,7 +318,7 @@ namespace { #ifdef ZEN_WIN //networks and cdrom excluded - may still block for slow USB sticks! -Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on error +Opt<Zstring> getPathByVolumenName(const Zstring& volumeName) //return no value on error { //FindFirstVolume(): traverses volumes on local hard disks only! //GetLogicalDriveStrings(): traverses all *logical* volumes, including CD-ROM, FreeOTFE virtual volumes @@ -332,13 +331,13 @@ Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on if (0 < rv && rv < bufferSize) { //search for matching path in parallel until first hit - RunUntilFirstHit<Zstring> findFirstMatch; + GetFirstResult<Zstring> firstMatch; for (const wchar_t* it = &buffer[0]; *it != 0; it += strLength(it) + 1) //list terminated by empty c-string { const Zstring path = it; - findFirstMatch.addJob([path, volumeName]() -> std::unique_ptr<Zstring> + firstMatch.addJob([path, volumeName]() -> std::unique_ptr<Zstring> { UINT type = ::GetDriveType(appendSeparator(path).c_str()); //non-blocking call! if (type == DRIVE_REMOTE || type == DRIVE_CDROM) @@ -353,18 +352,18 @@ Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on nullptr, //__out_opt LPDWORD lpVolumeSerialNumber, nullptr, //__out_opt LPDWORD lpMaximumComponentLength, nullptr, //__out_opt LPDWORD lpFileSystemFlags, - nullptr, //__out LPTSTR lpFileSystemNameBuffer, + nullptr, //__out LPTSTR lpFileSystemNameBuffer, 0)) //__in DWORD nFileSystemNameSize if (EqualFilename()(volumeName, Zstring(&volName[0]))) return zen::make_unique<Zstring>(path); return nullptr; }); } - if (auto result = findFirstMatch.get()) //blocks until ready + if (auto result = firstMatch.get()) //blocks until ready return *result; } - return Zstring(); + return NoValue(); } @@ -417,9 +416,8 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna //[.*] pattern was found... if (!volname.empty()) { - Zstring volPath = getPathByVolumenName(volname); //may block for slow USB sticks! - if (!volPath.empty()) - return appendSeparator(volPath) + rest; //successfully replaced pattern + if (Opt<Zstring> volPath = getPathByVolumenName(volname)) //may block for slow USB sticks! + return appendSeparator(*volPath) + rest; //successfully replaced pattern } //error: did not find corresponding volume name: @@ -450,9 +448,8 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less dirname[1] == L':' && dirname[2] == L'\\') { - Zstring volname = getVolumeName(Zstring(dirname.c_str(), 3)); //should not block - if (!volname.empty()) - output.insert(L"[" + volname + L"]" + Zstring(dirname.c_str() + 2)); + if (Opt<Zstring> volname = getVolumeName(Zstring(dirname.c_str(), 3))) //should not block + output.insert(L"[" + *volname + L"]" + Zstring(dirname.c_str() + 2)); } //2. replace volume name by volume path: [SYSTEM]\dirname -> c:\dirname @@ -609,9 +606,9 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio auto connect = [&](NETRESOURCE& trgRes) //blocks heavily if network is not reachable!!! { //1. first try to connect without user interaction - blocks! - DWORD rv = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, - nullptr, // __in LPCTSTR lpPassword, - nullptr, // __in LPCTSTR lpUsername, + DWORD rv = ::WNetAddConnection2(&trgRes, //__in LPNETRESOURCE lpNetResource, + nullptr, //__in LPCTSTR lpPassword, + nullptr, //__in LPCTSTR lpUsername, 0); //__in DWORD dwFlags //53L ERROR_BAD_NETPATH The network path was not found. //67L ERROR_BAD_NET_NAME diff --git a/FreeFileSync/Source/lib/resolve_path.h b/FreeFileSync/Source/lib/resolve_path.h index b9c7196f..d9ec28bc 100644 --- a/FreeFileSync/Source/lib/resolve_path.h +++ b/FreeFileSync/Source/lib/resolve_path.h @@ -19,7 +19,7 @@ FULL directory format: - convert relative paths into absolute - trim whitespace and append file name separator */ -Zstring getFormattedDirectoryName(const Zstring& dirString); //throw() - may still block for slow USB sticks! not thread-safe!!!(see ::GetFullPathName()) +Zstring getFormattedDirectoryName(const Zstring& dirString); //noexcept; may still block for slow USB sticks! not thread-safe!!! see ::GetFullPathName() //macro substitution only Zstring expandMacros(const Zstring& text); @@ -28,7 +28,7 @@ std::vector<Zstring> getDirectoryAliases(const Zstring& dirString); //may block #ifdef ZEN_WIN //*blocks* if network is not reachable or when showing login prompt dialog! -void loginNetworkShare(const Zstring& dirname, bool allowUserInteraction); //throw() - user interaction: show OS password prompt +void loginNetworkShare(const Zstring& dirname, bool allowUserInteraction); //noexcept; user interaction: show OS password prompt #endif } diff --git a/FreeFileSync/Source/lib/versioning.h b/FreeFileSync/Source/lib/versioning.h index 1751e294..bc406ff0 100644 --- a/FreeFileSync/Source/lib/versioning.h +++ b/FreeFileSync/Source/lib/versioning.h @@ -40,7 +40,7 @@ public: timeStamp_(formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp)) //e.g. "2012-05-15 131513" { if (timeStamp_.size() != 17) //formatTime() returns empty string on error; unexpected length: e.g. problem in year 10000! - throw FileError(_("Unable to create timestamp for versioning:") + L" \"" + timeStamp_ + L"\""); + throw FileError(_("Unable to create time stamp for versioning:") + L" \"" + timeStamp_ + L"\""); } bool revisionFile(const Zstring& fullName, //throw FileError; return "false" if file is not existing diff --git a/FreeFileSync/Source/structures.h b/FreeFileSync/Source/structures.h index 71554cc3..45e856a6 100644 --- a/FreeFileSync/Source/structures.h +++ b/FreeFileSync/Source/structures.h @@ -380,7 +380,7 @@ struct MainConfiguration FolderPairEnh firstPair; //there needs to be at least one pair! std::vector<FolderPairEnh> additionalPairs; - std::wstring onCompletion; //user-defined command line + Zstring onCompletion; //user-defined command line std::wstring getCompVariantName() const; std::wstring getSyncVariantName() const; diff --git a/FreeFileSync/Source/synchronization.cpp b/FreeFileSync/Source/synchronization.cpp index 1e4743fb..de987a00 100644 --- a/FreeFileSync/Source/synchronization.cpp +++ b/FreeFileSync/Source/synchronization.cpp @@ -1880,21 +1880,6 @@ void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& //########################################################################################### -#ifdef ZEN_WIN -//recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow -StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, ProcessCallback& procCallback) -{ - procCallback.reportStatus(replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(dirname), false)); - - auto ft = async([=] { return recycleBinStatus(dirname); }); - - while (!ft.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL / 2))) - procCallback.requestUiRefresh(); //may throw! - return ft.get(); -} -#endif - - /* struct LessDependentDirectory : public std::binary_function<Zstring, Zstring, bool> { @@ -2171,7 +2156,17 @@ void zen::synchronize(const TimeComp& timeStamp, { if (!baseDirPf.empty()) //should be if (baseDirHasRecycler.find(baseDirPf) == baseDirHasRecycler.end()) //perf: avoid duplicate checks! - baseDirHasRecycler[baseDirPf] = recycleBinStatusUpdating(baseDirPf, callback) == STATUS_REC_EXISTS; + { + callback.reportStatus(replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(baseDirPf), false)); + + bool recExists = false; + tryReportingError([&] + { + recExists = recycleBinExists(baseDirPf, [&] { callback.requestUiRefresh(); /*may throw*/ }); //throw FileError + }, callback); //show error dialog if necessary + + baseDirHasRecycler[baseDirPf] = recExists; + } }; if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER) diff --git a/FreeFileSync/Source/synchronization.h b/FreeFileSync/Source/synchronization.h index bc6b79db..91d2fe29 100644 --- a/FreeFileSync/Source/synchronization.h +++ b/FreeFileSync/Source/synchronization.h @@ -85,7 +85,6 @@ void synchronize(const TimeComp& timeStamp, bool copyFilePermissions, bool transactionalFileCopy, bool runWithBackgroundPriority, - const std::vector<FolderPairSyncCfg>& syncConfig, //CONTRACT: syncConfig and folderCmp correspond row-wise! FolderComparison& folderCmp, // ProcessCallback& callback); diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp index f99d8731..09bb3280 100644 --- a/FreeFileSync/Source/ui/batch_config.cpp +++ b/FreeFileSync/Source/ui/batch_config.cpp @@ -11,7 +11,7 @@ #include <wx+/image_resources.h> #include "gui_generated.h" #include "dir_name.h" -#include "../ui/exec_finished_box.h" +#include "../ui/on_completion_box.h" #include "../lib/help_provider.h" #ifdef ZEN_WIN @@ -36,7 +36,7 @@ class BatchDialog : public BatchDlgGenerated public: BatchDialog(wxWindow* parent, XmlBatchConfig& batchCfg, //in/out - std::vector<std::wstring>& onCompletionHistory, + std::vector<Zstring>& onCompletionHistory, size_t onCompletionHistoryMax); private: @@ -66,7 +66,7 @@ private: BatchDialog::BatchDialog(wxWindow* parent, XmlBatchConfig& batchCfg, - std::vector<std::wstring>& onCompletionHistory, + std::vector<Zstring>& onCompletionHistory, size_t onCompletionHistoryMax) : BatchDlgGenerated(parent), batchCfgOutRef(batchCfg) @@ -79,7 +79,7 @@ BatchDialog::BatchDialog(wxWindow* parent, m_staticTextDescr->SetLabel(replaceCpy(m_staticTextDescr->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch")); - m_comboBoxExecFinished->initHistory(onCompletionHistory, onCompletionHistoryMax); + m_comboBoxOnCompletion->initHistory(onCompletionHistory, onCompletionHistoryMax); m_bitmapBatchJob->SetBitmap(getResourceImage(L"batch")); @@ -130,9 +130,9 @@ void BatchDialog::setConfig(const XmlBatchConfig& batchCfg) localBatchCfg = batchCfg; //contains some parameters not owned by GUI controls //transfer parameter ownership to GUI - m_checkBoxShowProgress->SetValue(batchCfg.showProgress); + m_checkBoxRunMinimized->SetValue(batchCfg.runMinimized); logfileDir->setName(utfCvrtTo<wxString>(batchCfg.logFileDirectory)); - m_comboBoxExecFinished->setValue(batchCfg.mainCfg.onCompletion); + m_comboBoxOnCompletion->setValue(batchCfg.mainCfg.onCompletion); //map single parameter "logfiles limit" to all three checkboxs and spin ctrl: m_checkBoxGenerateLogfile->SetValue(batchCfg.logfilesCountLimit != 0); @@ -151,9 +151,9 @@ XmlBatchConfig BatchDialog::getConfig() const //load parameters with ownership within GIU controls... //load structure with batch settings "batchCfg" - batchCfg.showProgress = m_checkBoxShowProgress->GetValue(); + batchCfg.runMinimized = m_checkBoxRunMinimized->GetValue(); batchCfg.logFileDirectory = utfCvrtTo<Zstring>(logfileDir->getName()); - batchCfg.mainCfg.onCompletion = m_comboBoxExecFinished->getValue(); + batchCfg.mainCfg.onCompletion = m_comboBoxOnCompletion->getValue(); //get single parameter "logfiles limit" from all three checkboxes and spin ctrl: batchCfg.logfilesCountLimit = m_checkBoxGenerateLogfile->GetValue() ? (m_checkBoxLogfilesLimit->GetValue() ? m_spinCtrlLogfileLimit->GetValue() : -1) : 0; @@ -164,7 +164,7 @@ XmlBatchConfig BatchDialog::getConfig() const void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) { batchCfgOutRef = getConfig(); - m_comboBoxExecFinished->addItemHistory(); //a good place to commit current "on completion" history item + m_comboBoxOnCompletion->addItemHistory(); //a good place to commit current "on completion" history item EndModal(BUTTON_SAVE_AS); } } @@ -172,9 +172,9 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) bool zen::customizeBatchConfig(wxWindow* parent, xmlAccess::XmlBatchConfig& batchCfg, //in/out - std::vector<std::wstring>& execFinishedhistory, - size_t execFinishedhistoryMax) + std::vector<Zstring>& onCompletionHistory, + size_t onCompletionHistoryMax) { - BatchDialog batchDlg(parent, batchCfg, execFinishedhistory, execFinishedhistoryMax); + BatchDialog batchDlg(parent, batchCfg, onCompletionHistory, onCompletionHistoryMax); return static_cast<ButtonPressed>(batchDlg.ShowModal()) == BUTTON_SAVE_AS; } diff --git a/FreeFileSync/Source/ui/batch_config.h b/FreeFileSync/Source/ui/batch_config.h index 5bff09e1..6041d848 100644 --- a/FreeFileSync/Source/ui/batch_config.h +++ b/FreeFileSync/Source/ui/batch_config.h @@ -15,8 +15,8 @@ namespace zen //show and let user customize batch settings (without saving) bool customizeBatchConfig(wxWindow* parent, //return "false" if aborted, "true" on "do save" xmlAccess::XmlBatchConfig& batchCfg, //in/out - std::vector<std::wstring>& execFinishedhistory, - size_t execFinishedhistoryMax); + std::vector<Zstring>& onCompletionHistory, + size_t onCompletionHistoryMax); } #endif // BATCHCONFIG_H_INCLUDED diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp index 28888606..15f2af80 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.cpp +++ b/FreeFileSync/Source/ui/batch_status_handler.cpp @@ -7,11 +7,10 @@ #include "batch_status_handler.h" #include <zen/file_handling.h> #include <zen/file_traverser.h> -//#include <zen/format_unit.h> #include <zen/shell_execute.h> #include <wx+/popup_dlg.h> #include <wx/app.h> -#include "exec_finished_box.h" +#include "on_completion_box.h" #include "../lib/ffs_paths.h" #include "../lib/resolve_path.h" #include "../lib/status_handler_impl.h" @@ -27,7 +26,7 @@ namespace Zstring addStatusToLogfilename(const Zstring& logfilename, const std::wstring& status) { //attention: do not interfere with naming convention required by limitLogfileCount()! - size_t pos = logfilename.rfind(Zstr(".")); + size_t pos = logfilename.rfind(Zstr('.')); if (pos != Zstring::npos) return Zstring(logfilename.begin(), logfilename.begin() + pos) + utfCvrtTo<Zstring>(L" (" + status + L")") + @@ -119,8 +118,8 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, size_t automaticRetryDelay, const SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode FfsReturnCode& returnCode, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory) : + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory) : switchBatchToGui_(switchBatchToGui), showFinalResults(showProgress), //=> exit immediately or wait when finished switchToGuiRequested(false), @@ -130,7 +129,7 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, returnCode_(returnCode), automaticRetryCount_(automaticRetryCount), automaticRetryDelay_(automaticRetryDelay), - progressDlg(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr, showProgress, jobName, execWhenFinished, execFinishedHistory)), + progressDlg(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr, showProgress, jobName, onCompletion, onCompletionHistory)), jobName_(jobName), startTime_(wxGetUTCTimeMillis().GetValue()) { @@ -172,7 +171,7 @@ BatchStatusHandler::~BatchStatusHandler() //execute "on completion" command (even in case of ignored errors) if (!abortIsRequested()) //if aborted (manually), we don't execute the command { - const std::wstring finalCommand = progressDlg->getExecWhenFinishedCommand(); //final value (after possible user modification) + const Zstring finalCommand = progressDlg->getExecWhenFinishedCommand(); //final value (after possible user modification) if (!finalCommand.empty()) { if (isCloseProgressDlgCommand(finalCommand)) @@ -181,7 +180,7 @@ BatchStatusHandler::~BatchStatusHandler() try { //use EXEC_TYPE_ASYNC until there is reason no to: https://sourceforge.net/p/freefilesync/discussion/help/thread/828dca52 - tryReportingError([&] { shellExecute2(expandMacros(utfCvrtTo<Zstring>(finalCommand)), EXEC_TYPE_ASYNC); }, //throw FileError, throw X? + tryReportingError([&] { shellExecute2(expandMacros(finalCommand), EXEC_TYPE_ASYNC); }, //throw FileError, throw X? *this); } catch (...) {} diff --git a/FreeFileSync/Source/ui/batch_status_handler.h b/FreeFileSync/Source/ui/batch_status_handler.h index e8caa7e8..103eddc1 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.h +++ b/FreeFileSync/Source/ui/batch_status_handler.h @@ -36,8 +36,8 @@ public: size_t automaticRetryDelay, const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode zen::FfsReturnCode& returnCode, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory); + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory); ~BatchStatusHandler(); virtual void initNewPhase (int objectsTotal, zen::Int64 dataTotal, Phase phaseID); diff --git a/FreeFileSync/Source/ui/custom_grid.cpp b/FreeFileSync/Source/ui/custom_grid.cpp index 2d551ad6..2959c0bb 100644 --- a/FreeFileSync/Source/ui/custom_grid.cpp +++ b/FreeFileSync/Source/ui/custom_grid.cpp @@ -37,7 +37,7 @@ const wxColour COLOR_SYNC_BLUE (185, 188, 255); const wxColour COLOR_SYNC_GREEN (196, 255, 185); const wxColour COLOR_NOT_ACTIVE (228, 228, 228); //light grey -const size_t ROW_COUNT_NO_DATA = 10; +const size_t ROW_COUNT_IF_NO_DATA = 0; /* class hierarchy: @@ -185,11 +185,11 @@ private: if (gridDataView_) { if (gridDataView_->rowsTotal() == 0) - return ROW_COUNT_NO_DATA; + return ROW_COUNT_IF_NO_DATA; return gridDataView_->rowsOnView(); } else - return ROW_COUNT_NO_DATA; + return ROW_COUNT_IF_NO_DATA; //return std::max(MIN_ROW_COUNT, gridDataView_ ? gridDataView_->rowsOnView() : 0); } @@ -1786,8 +1786,10 @@ void gridview::highlightSyncAction(Grid& gridCenter, bool value) provMiddle->highlightSyncAction(value); else assert(false); + gridCenter.Refresh(); } + wxBitmap zen::getSyncOpImage(SyncOperation syncOp) { switch (syncOp) //evaluate comparison result and sync direction diff --git a/FreeFileSync/Source/ui/dir_name.cpp b/FreeFileSync/Source/ui/dir_name.cpp index ee0ee64a..941fa58d 100644 --- a/FreeFileSync/Source/ui/dir_name.cpp +++ b/FreeFileSync/Source/ui/dir_name.cpp @@ -99,7 +99,7 @@ DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow, } //keep dirPicker and dirName synchronous - dirName_ .Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (DirectoryName::onMouseWheel), nullptr, this); + dirName_ .Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (DirectoryName::onMouseWheel ), nullptr, this); dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(DirectoryName::onWriteDirManually), nullptr, this); selectButton_.Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(DirectoryName::onSelectDir ), nullptr, this); } @@ -112,7 +112,7 @@ DirectoryName<NameControl>::~DirectoryName() if (dropWindow2_) dropWindow2_->Disconnect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::onFilesDropped), nullptr, this); - dirName_ .Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (DirectoryName::onMouseWheel), nullptr, this); + dirName_ .Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (DirectoryName::onMouseWheel ), nullptr, this); dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(DirectoryName::onWriteDirManually), nullptr, this); selectButton_.Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(DirectoryName::onSelectDir ), nullptr, this); } diff --git a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp index 4676aa43..94c3ae57 100644 --- a/FreeFileSync/Source/ui/folder_history_box.cpp +++ b/FreeFileSync/Source/ui/folder_history_box.cpp @@ -97,10 +97,13 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname) if (std::find(dirList.begin(), dirList.end(), dirname) == dirList.end()) dirList.insert(dirList.begin(), dirname); - Clear(); //emits yet another wxEVT_COMMAND_TEXT_UPDATED on Suse/X11/wxWidgets 2.9.4!!! - std::for_each(dirList.begin(), dirList.end(), [&](const wxString& dir) { this->Append(dir); }); + //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! + wxItemContainer::Clear(); //suffices to clear the selection items only! + + for (const wxString& dir : dirList) + this->Append(dir); //this->SetSelection(wxNOT_FOUND); //don't select anything - this->SetValue(dirname); //preserve main text! + ChangeValue(dirname); //preserve main text! } diff --git a/FreeFileSync/Source/ui/folder_history_box.h b/FreeFileSync/Source/ui/folder_history_box.h index 9ffa2d74..a20a47c5 100644 --- a/FreeFileSync/Source/ui/folder_history_box.h +++ b/FreeFileSync/Source/ui/folder_history_box.h @@ -42,11 +42,8 @@ public: zen::trim(nameTmp); //insert new folder or put it to the front if already existing - auto it = std::find_if(dirnames_.begin(), dirnames_.end(), - [&](const Zstring& entry) { return ::EqualFilename()(entry, nameTmp); }); + vector_remove_if(dirnames_, [&](const Zstring& item) { return ::EqualFilename()(item, nameTmp); }); - if (it != dirnames_.end()) - dirnames_.erase(it); dirnames_.insert(dirnames_.begin(), nameTmp); if (dirnames_.size() > maxSize_) //keep maximal size of history list @@ -56,7 +53,6 @@ public: void delItem(const Zstring& dirname) { zen::vector_remove_if(dirnames_, [&](const Zstring& entry) { return ::EqualFilename()(entry, dirname); }); } private: - size_t maxSize_; std::vector<Zstring> dirnames_; }; diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp index c933c5ef..11a1bd4e 100644 --- a/FreeFileSync/Source/ui/gui_generated.cpp +++ b/FreeFileSync/Source/ui/gui_generated.cpp @@ -1,17 +1,17 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Feb 26 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// -#include "../wx+/bitmap_button.h" -#include "../wx+/graph.h" -#include "../wx+/grid.h" -#include "../wx+/toggle_button.h" -#include "exec_finished_box.h" #include "folder_history_box.h" +#include "on_completion_box.h" #include "triple_splitter.h" +#include "wx+/bitmap_button.h" +#include "wx+/graph.h" +#include "wx+/grid.h" +#include "wx+/toggle_button.h" #include "gui_generated.h" @@ -556,18 +556,23 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextViewType = new wxStaticText( m_panelViewFilter, wxID_ANY, _("View type:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextViewType->Wrap( -1 ); + bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 82,42 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); m_bpButtonShowExcluded = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticTextSelectView = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Select view:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSelectView->Wrap( -1 ); + bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -586,6 +591,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -610,6 +618,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticText96 = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + bSizerViewFilter->Add( m_staticText96, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); @@ -854,8 +866,6 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this ); m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); m_bpButtonShowExcluded->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); @@ -868,6 +878,8 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); @@ -1286,8 +1298,8 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const m_staticText89->Wrap( -1 ); bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 ); - m_comboBoxExecFinished = new ExecFinishedBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizerOnCompletion->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_comboBoxOnCompletion = new OnCompletionBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizerOnCompletion->Add( m_comboBoxOnCompletion, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); bSizer179->Add( bSizerOnCompletion, 1, wxALL, 10 ); @@ -1582,7 +1594,7 @@ SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( wxWindow* parent, wx wxBoxSizer* bSizer181; bSizer181 = new wxBoxSizer( wxVERTICAL ); - m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText83->Wrap( -1 ); bSizer181->Add( m_staticText83, 0, wxALL, 5 ); @@ -2180,27 +2192,27 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind wxBoxSizer* bSizer161; bSizer161 = new wxBoxSizer( wxVERTICAL ); - m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT, 15 ); + bSizer161->Add( 0, 15, 0, 0, 5 ); + m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( 0, 15, 0, 0, 5 ); + bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 15 ); m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( m_panelGraphItems, 1, wxEXPAND|wxBOTTOM|wxRIGHT, 15 ); + bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 15 ); - bSizer161->Add( 430, 0, 0, 0, 5 ); + bSizer161->Add( 450, 0, 0, 0, 5 ); bSizer171->Add( bSizer161, 1, wxEXPAND, 5 ); - bSizer171->Add( 0, 230, 0, 0, 5 ); + bSizer171->Add( 0, 280, 0, 0, 5 ); bSizer173->Add( bSizer171, 1, wxEXPAND, 5 ); @@ -2223,17 +2235,17 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind wxBoxSizer* bSizer160; bSizer160 = new wxBoxSizer( wxHORIZONTAL ); - bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL ); + bSizerOnCompletion = new wxBoxSizer( wxHORIZONTAL ); m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText87->Wrap( -1 ); - bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizerOnCompletion->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_comboBoxExecFinished = new ExecFinishedBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_comboBoxOnCompletion = new OnCompletionBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizerOnCompletion->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer160->Add( bSizerExecFinished, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer160->Add( bSizerOnCompletion, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); bSizer160->Add( 0, 0, 0, 0, 5 ); @@ -2386,8 +2398,8 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS wxBoxSizer* bSizer170; bSizer170 = new wxBoxSizer( wxVERTICAL ); - m_checkBoxShowProgress = new wxCheckBox( m_panel35, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer170->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + m_checkBoxRunMinimized = new wxCheckBox( m_panel35, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer170->Add( m_checkBoxRunMinimized, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); wxBoxSizer* bSizer179; bSizer179 = new wxBoxSizer( wxHORIZONTAL ); @@ -2396,8 +2408,8 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_staticText81->Wrap( -1 ); bSizer179->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_comboBoxExecFinished = new ExecFinishedBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer179->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_comboBoxOnCompletion = new OnCompletionBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer179->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 ); bSizer170->Add( bSizer179, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -2558,12 +2570,6 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxDeleteBothSides->Hide(); - m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); - - bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxLEFT, 5 ); - bSizerStdButtons->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -2589,7 +2595,6 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } @@ -2806,7 +2811,7 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Clear"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Reset"), wxDefaultPosition, wxSize( -1,30 ), 0 ); bSizerStdButtons->Add( m_buttonClear, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h index ed6f020b..707401cf 100644 --- a/FreeFileSync/Source/ui/gui_generated.h +++ b/FreeFileSync/Source/ui/gui_generated.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Feb 26 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -11,8 +11,8 @@ #include <wx/artprov.h> #include <wx/xrc/xmlres.h> #include <wx/intl.h> -class ExecFinishedBox; class FolderHistoryBox; +class OnCompletionBox; class ToggleButton; namespace zen { class BitmapTextButton; } namespace zen { class Graph2D; } @@ -143,15 +143,17 @@ protected: wxListBox* m_listBoxHistory; wxPanel* m_panelViewFilter; wxBoxSizer* bSizerViewFilter; + wxStaticText* m_staticTextViewType; ToggleButton* m_bpButtonViewTypeSyncAction; ToggleButton* m_bpButtonShowExcluded; - ToggleButton* m_bpButtonShowDoNothing; + wxStaticText* m_staticTextSelectView; ToggleButton* m_bpButtonShowCreateLeft; ToggleButton* m_bpButtonShowUpdateLeft; ToggleButton* m_bpButtonShowDeleteLeft; ToggleButton* m_bpButtonShowLeftOnly; ToggleButton* m_bpButtonShowLeftNewer; ToggleButton* m_bpButtonShowEqual; + ToggleButton* m_bpButtonShowDoNothing; ToggleButton* m_bpButtonShowDifferent; ToggleButton* m_bpButtonShowRightNewer; ToggleButton* m_bpButtonShowRightOnly; @@ -159,6 +161,7 @@ protected: ToggleButton* m_bpButtonShowUpdateRight; ToggleButton* m_bpButtonShowCreateRight; ToggleButton* m_bpButtonShowConflict; + wxStaticText* m_staticText96; wxPanel* m_panelStatistics; wxBoxSizer* bSizer1801; wxStaticBitmap* m_bitmapCreateLeft; @@ -316,7 +319,7 @@ protected: wxStaticLine* m_staticline36; wxBoxSizer* bSizerOnCompletion; wxStaticText* m_staticText89; - ExecFinishedBox* m_comboBoxExecFinished; + OnCompletionBox* m_comboBoxOnCompletion; wxStaticLine* m_staticline31; wxBoxSizer* bSizerConfig; wxStaticText* m_staticTextHeaderCategory1; @@ -528,8 +531,8 @@ public: wxNotebook* m_notebookResult; wxStaticLine* m_staticlineFooter; wxBoxSizer* bSizerStdButtons; - wxBoxSizer* bSizerExecFinished; - ExecFinishedBox* m_comboBoxExecFinished; + wxBoxSizer* bSizerOnCompletion; + OnCompletionBox* m_comboBoxOnCompletion; wxButton* m_buttonClose; wxButton* m_buttonPause; wxButton* m_buttonStop; @@ -583,9 +586,9 @@ protected: wxToggleButton* m_toggleBtnErrorPopup; wxToggleButton* m_toggleBtnErrorStop; wxStaticLine* m_staticline26; - wxCheckBox* m_checkBoxShowProgress; + wxCheckBox* m_checkBoxRunMinimized; wxStaticText* m_staticText81; - ExecFinishedBox* m_comboBoxExecFinished; + OnCompletionBox* m_comboBoxOnCompletion; wxStaticLine* m_staticline25; wxCheckBox* m_checkBoxGenerateLogfile; wxPanel* m_panelLogfile; @@ -635,14 +638,12 @@ protected: wxStaticLine* m_staticline9; wxBoxSizer* bSizerStdButtons; wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxDeleteBothSides; wxButton* m_buttonOK; wxButton* m_buttonCancel; // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); } virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp index 95a0da00..55a67428 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.cpp +++ b/FreeFileSync/Source/ui/gui_status_handler.cpp @@ -11,7 +11,7 @@ #include <wx+/bitmap_button.h> #include <wx+/popup_dlg.h> #include "main_dlg.h" -#include "exec_finished_box.h" +#include "on_completion_box.h" #include "../lib/generate_logfile.h" #include "../lib/resolve_path.h" #include "../lib/status_handler_impl.h" @@ -185,9 +185,9 @@ SyncStatusHandler::SyncStatusHandler(wxFrame* parentDlg, size_t automaticRetryCount, size_t automaticRetryDelay, const std::wstring& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory) : - progressDlg(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, parentDlg, true, jobName, execWhenFinished, execFinishedHistory)), + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory) : + progressDlg(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, parentDlg, true, jobName, onCompletion, onCompletionHistory)), lastSyncsLogFileSizeMax_(lastSyncsLogFileSizeMax), handleError_(handleError), automaticRetryCount_(automaticRetryCount), @@ -208,7 +208,7 @@ SyncStatusHandler::~SyncStatusHandler() //execute "on completion" command (even in case of ignored errors) if (!abortIsRequested()) //if aborted (manually), we don't execute the command { - const std::wstring finalCommand = progressDlg->getExecWhenFinishedCommand(); //final value (after possible user modification) + const Zstring finalCommand = progressDlg->getExecWhenFinishedCommand(); //final value (after possible user modification) if (!finalCommand.empty()) { if (isCloseProgressDlgCommand(finalCommand)) @@ -217,7 +217,7 @@ SyncStatusHandler::~SyncStatusHandler() try { //use EXEC_TYPE_ASYNC until there is reason no to: https://sourceforge.net/p/freefilesync/discussion/help/thread/828dca52 - tryReportingError([&] { shellExecute2(expandMacros(utfCvrtTo<Zstring>(finalCommand)), EXEC_TYPE_ASYNC); }, //throw FileError, throw X? + tryReportingError([&] { shellExecute2(expandMacros(finalCommand), EXEC_TYPE_ASYNC); }, //throw FileError, throw X? *this); } catch (...) {} diff --git a/FreeFileSync/Source/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h index 5f5e0817..ce75db82 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.h +++ b/FreeFileSync/Source/ui/gui_status_handler.h @@ -56,8 +56,8 @@ public: size_t automaticRetryCount, size_t automaticRetryDelay, const std::wstring& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory); + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory); ~SyncStatusHandler(); virtual void initNewPhase (int objectsTotal, zen::Int64 dataTotal, Phase phaseID); diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp index a9d5064a..5e70f15a 100644 --- a/FreeFileSync/Source/ui/main_dlg.cpp +++ b/FreeFileSync/Source/ui/main_dlg.cpp @@ -374,14 +374,14 @@ void MainDialog::create() //------------------------------------------------------------------------------------------ //check existence of all files in parallel: - RunUntilFirstHit<NullType> findFirstMissing; + GetFirstResult<FalseType> firstMissingDir; for (const Zstring& filename : filenames) - findFirstMissing.addJob([filename] { return filename.empty() /*ever empty??*/ || !fileExists(filename) ? zen::make_unique<NullType>() : nullptr; }); + firstMissingDir.addJob([filename] { return filename.empty() /*ever empty??*/ || !fileExists(filename) ? make_unique<FalseType>() : nullptr; }); //potentially slow network access: give all checks 500ms to finish - const bool allFilesExist = findFirstMissing.timedWait(boost::posix_time::milliseconds(500)) && //false: time elapsed - !findFirstMissing.get(); //no missing + const bool allFilesExist = firstMissingDir.timedWait(boost::posix_time::milliseconds(500)) && //false: time elapsed + !firstMissingDir.get(); //no missing if (!allFilesExist) filenames.clear(); //we do NOT want to show an error due to last config file missing on application start! //------------------------------------------------------------------------------------------ @@ -500,7 +500,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, wxAuiPaneInfo().Name(L"PanelFind").Layer(2).Bottom().Row(2).Caption(_("Find")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(200, m_bpButtonHideSearch->GetSize().GetHeight()).Hide()); auiMgr.AddPane(m_panelViewFilter, - wxAuiPaneInfo().Name(L"PanelView").Layer(2).Bottom().Row(1).Caption(_("Select View")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(m_bpButtonViewTypeSyncAction->GetSize().GetWidth(), m_panelViewFilter->GetSize().GetHeight())); + wxAuiPaneInfo().Name(L"PanelView").Layer(2).Bottom().Row(1).Caption(_("View Settings")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(m_bpButtonViewTypeSyncAction->GetSize().GetWidth(), m_panelViewFilter->GetSize().GetHeight())); auiMgr.AddPane(m_gridNavi, wxAuiPaneInfo().Name(L"PanelOverview").Layer(3).Left().Position(1).Caption(_("Overview")).MinSize(300, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below @@ -719,7 +719,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, //------------------------------------------------------------------------------------------ //check existence of all directories in parallel! - RunUntilFirstHit<NullType> findFirstMissing; + GetFirstResult<FalseType> firstMissingDir; //harmonize checks with comparison.cpp:: checkForIncompleteInput() //we're really doing two checks: 1. check directory existence 2. check config validity -> don't mix them! @@ -737,9 +737,9 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, haveFullPair = true; if (!dirLeft.empty()) - findFirstMissing.addJob([=] { return !dirExists(dirLeft ) ? zen::make_unique<NullType>() : nullptr; }); + firstMissingDir.addJob([=] { return !dirExists(dirLeft ) ? make_unique<FalseType>() : nullptr; }); if (!dirRight.empty()) - findFirstMissing.addJob([=] { return !dirExists(dirRight) ? zen::make_unique<NullType>() : nullptr; }); + firstMissingDir.addJob([=] { return !dirExists(dirRight) ? make_unique<FalseType>() : nullptr; }); }; addDirCheck(currMainCfg.firstPair); @@ -749,8 +749,8 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, if (havePartialPair != haveFullPair) //either all pairs full or all half-filled -> validity check! { //potentially slow network access: give all checks 500ms to finish - const bool allFilesExist = findFirstMissing.timedWait(boost::posix_time::milliseconds(500)) && //true: have result - !findFirstMissing.get(); //no missing + const bool allFilesExist = firstMissingDir.timedWait(boost::posix_time::milliseconds(500)) && //true: have result + !firstMissingDir.get(); //no missing if (allFilesExist) if (wxEvtHandler* evtHandler = m_buttonCompare->GetEventHandler()) { @@ -1234,8 +1234,7 @@ private: void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selectionLeft, const std::vector<FileSystemObject*>& selectionRight) { - bool deleteOnBothSides = false; //let's keep this disabled by default -> don't save - //=> clenup empty selection on either side: + //=> cleanup empty selection on either side: std::vector<FileSystemObject*> selectionLeftTmp; std::vector<FileSystemObject*> selectionRightTmp; std::copy_if(selectionLeft .begin(), selectionLeft .end(), std::back_inserter(selectionLeftTmp ), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty<LEFT_SIDE >(); }); @@ -1249,7 +1248,6 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec if (zen::showDeleteDialog(this, selectionLeftTmp, selectionRightTmp, - deleteOnBothSides, globalCfg.gui.useRecyclerForManualDeletion) == ReturnSmallDlg::BUTTON_OKAY) { //wxBusyCursor dummy; -> redundant: progress already shown in status bar! @@ -1262,7 +1260,6 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec selectionRightTmp, folderCmp, extractDirectionCfg(getConfig().mainCfg), - deleteOnBothSides, globalCfg.gui.useRecyclerForManualDeletion, statusHandler, globalCfg.optDialogs.warningRecyclerMissing); @@ -1833,7 +1830,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou !isComponentOf(focus, this) || !IsEnabled() || //only handle if main window is in use and no modal dialog is shown: !IsActive()) //thanks to wxWidgets non-portability we need both checks: - //first is sufficient for Windows, second is needed on OS X since it does NOT disable the parent when showing a modal dialog + //IsEnabled() is sufficient for Windows, IsActive() is needed on OS X since it does NOT disable the parent when showing a modal dialog { event.Skip(); return; @@ -1893,15 +1890,15 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou case WXK_DOWN: case WXK_LEFT: case WXK_RIGHT: - case WXK_NUMPAD_UP: - case WXK_NUMPAD_DOWN: - case WXK_NUMPAD_LEFT: - case WXK_NUMPAD_RIGHT: - case WXK_PAGEUP: case WXK_PAGEDOWN: case WXK_HOME: case WXK_END: + + case WXK_NUMPAD_UP: + case WXK_NUMPAD_DOWN: + case WXK_NUMPAD_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_NUMPAD_PAGEUP: case WXK_NUMPAD_PAGEDOWN: case WXK_NUMPAD_HOME: @@ -3083,7 +3080,7 @@ void MainDialog::deleteSelectedCfgHistoryItems() void MainDialog::OnCfgHistoryRightClick(wxMouseEvent& event) { ContextMenu menu; - menu.addItem(_("Delete") + L"\tDel", [this] { deleteSelectedCfgHistoryItems(); }); + menu.addItem(_("Delete selected configurations") + L"\tDel", [this] { deleteSelectedCfgHistoryItems(); }); menu.popup(*this); } @@ -3524,7 +3521,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) //prepare status information if (allElementsEqual(folderCmp)) - flashStatusInformation(_("All folders are in sync")); + flashStatusInformation(_("All files are in sync")); } @@ -3600,10 +3597,10 @@ void MainDialog::updateStatistics() void MainDialog::OnSyncSettings(wxCommandEvent& event) { - ExecWhenFinishedCfg ewfCfg = { ¤tCfg.mainCfg.onCompletion, - &globalCfg.gui.onCompletionHistory, - globalCfg.gui.onCompletionHistoryMax - }; + OnCompletionCfg ewfCfg = { ¤tCfg.mainCfg.onCompletion, + &globalCfg.gui.onCompletionHistory, + globalCfg.gui.onCompletionHistoryMax + }; if (showSyncConfigDlg(this, currentCfg.mainCfg.cmpConfig.compareVar, @@ -3945,8 +3942,7 @@ void MainDialog::updateGridViewData() updateVisibility(m_bpButtonShowDifferent , result.existsDifferent); } - const bool anyViewFilterButtonShown = m_bpButtonShowExcluded ->IsShown() || - m_bpButtonShowEqual ->IsShown() || + const bool anySelectViewButtonShown = m_bpButtonShowEqual ->IsShown() || m_bpButtonShowConflict ->IsShown() || m_bpButtonShowCreateLeft ->IsShown() || @@ -3962,16 +3958,14 @@ void MainDialog::updateGridViewData() m_bpButtonShowLeftNewer ->IsShown() || m_bpButtonShowRightNewer->IsShown() || m_bpButtonShowDifferent ->IsShown(); - m_bpButtonViewTypeSyncAction->Show(anyViewFilterButtonShown); - if (anyViewFilterButtonShown) - { - m_panelViewFilter->Show(); - m_panelViewFilter->Layout(); - } - else - m_panelViewFilter->Hide(); + const bool anyViewButtonShown = anySelectViewButtonShown || m_bpButtonShowExcluded->IsShown(); + + m_staticTextViewType ->Show(anyViewButtonShown); + m_bpButtonViewTypeSyncAction->Show(anyViewButtonShown); + m_staticTextSelectView ->Show(anySelectViewButtonShown); + m_panelViewFilter->Layout(); //all three grids retrieve their data directly via gridDataView gridview::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR); diff --git a/FreeFileSync/Source/ui/exec_finished_box.cpp b/FreeFileSync/Source/ui/on_completion_box.cpp index ade8af73..4adc7f31 100644 --- a/FreeFileSync/Source/ui/exec_finished_box.cpp +++ b/FreeFileSync/Source/ui/on_completion_box.cpp @@ -4,11 +4,12 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#include "exec_finished_box.h" +#include "on_completion_box.h" #include <deque> #include <zen/i18n.h> #include <algorithm> #include <zen/stl_tools.h> +#include <zen/utf.h> #ifdef ZEN_WIN #include <zen/win_ver.h> #endif @@ -22,40 +23,41 @@ const std::wstring cmdTxtCloseProgressDlg = L"Close progress dialog"; //special const std::wstring separationLine(L"---------------------------------------------------------------------------------------------------------------"); -std::vector<std::pair<std::wstring, std::wstring>> getDefaultCommands() //(gui name/command) pairs + +std::vector<std::pair<std::wstring, Zstring>> getDefaultCommands() //(gui name/command) pairs { - std::vector<std::pair<std::wstring, std::wstring>> output; + std::vector<std::pair<std::wstring, Zstring>> output; - auto addEntry = [&](const std::wstring& name, const std::wstring& value) { output.push_back(std::make_pair(name, value)); }; + auto addEntry = [&](const std::wstring& name, const Zstring& value) { output.push_back(std::make_pair(name, value)); }; #ifdef ZEN_WIN if (zen::vistaOrLater()) { - addEntry(_("Standby" ), L"rundll32.exe powrprof.dll,SetSuspendState Sleep"); //suspend/Suspend to RAM/sleep - addEntry(_("Log off" ), L"shutdown /l"); - addEntry(_("Shut down"), L"shutdown /s /t 60"); + addEntry(_("Standby" ), Zstr("rundll32.exe powrprof.dll,SetSuspendState Sleep")); //suspend/Suspend to RAM/sleep + addEntry(_("Log off" ), Zstr("shutdown /l")); + addEntry(_("Shut down"), Zstr("shutdown /s /t 60")); //addEntry(_("Hibernate"), L"shutdown /h"); //Suspend to disk -> Standby is better anyway } else //XP { - addEntry(_("Standby"), L"rundll32.exe powrprof.dll,SetSuspendState"); //this triggers standby OR hibernate, depending on whether hibernate setting is active! - addEntry(_("Log off" ), L"shutdown -l"); - addEntry(_("Shut down"), L"shutdown -s -t 60"); + addEntry(_("Standby" ), Zstr("rundll32.exe powrprof.dll,SetSuspendState")); //this triggers standby OR hibernate, depending on whether hibernate setting is active! + addEntry(_("Log off" ), Zstr("shutdown -l")); + addEntry(_("Shut down"), Zstr("shutdown -s -t 60")); //no suspend on XP? } #elif defined ZEN_LINUX - addEntry(_("Standby" ), L"sudo pm-suspend"); - addEntry(_("Log off" ), L"gnome-session-quit"); //alternative requiring admin: sudo killall Xorg - addEntry(_("Shut down"), L"dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown"); + addEntry(_("Standby" ), Zstr("sudo pm-suspend")); + addEntry(_("Log off" ), Zstr("gnome-session-quit")); //alternative requiring admin: sudo killall Xorg + addEntry(_("Shut down"), Zstr("dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown")); //alternative requiring admin: sudo shutdown -h 1 //addEntry(_("Hibernate"), L"sudo pm-hibernate"); //alternative: "pmi action suspend" and "pmi action hibernate", require "sudo apt-get install powermanagement-interaface" #elif defined ZEN_MAC - addEntry(_("Standby" ), L"osascript -e \'tell application \"System Events\" to sleep\'"); - addEntry(_("Log off" ), L"osascript -e \'tell application \"System Events\" to log out\'"); - addEntry(_("Shut down"), L"osascript -e \'tell application \"System Events\" to shut down\'"); + addEntry(_("Standby" ), Zstr("osascript -e \'tell application \"System Events\" to sleep\'")); + addEntry(_("Log off" ), Zstr("osascript -e \'tell application \"System Events\" to log out\'")); + addEntry(_("Shut down"), Zstr("osascript -e \'tell application \"System Events\" to shut down\'")); #endif return output; } @@ -64,15 +66,15 @@ const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType(); } -bool isCloseProgressDlgCommand(const std::wstring& value) +bool isCloseProgressDlgCommand(const Zstring& value) { - std::wstring tmp = value; + auto tmp = utfCvrtTo<std::wstring>(value); trim(tmp); return tmp == cmdTxtCloseProgressDlg; } -ExecFinishedBox::ExecFinishedBox(wxWindow* parent, +OnCompletionBox::OnCompletionBox(wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, @@ -91,36 +93,34 @@ ExecFinishedBox::ExecFinishedBox(wxWindow* parent, /*##*/ SetMinSize(wxSize(150, -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox //##################################### - Connect(wxEVT_KEY_DOWN, wxKeyEventHandler (ExecFinishedBox::OnKeyEvent ), nullptr, this); - Connect(wxEVT_LEFT_DOWN, wxEventHandler (ExecFinishedBox::OnUpdateList), nullptr, this); - Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(ExecFinishedBox::OnSelection ), nullptr, this); - Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (ExecFinishedBox::OnMouseWheel), nullptr, this); + Connect(wxEVT_KEY_DOWN, wxKeyEventHandler (OnCompletionBox::OnKeyEvent ), nullptr, this); + Connect(wxEVT_LEFT_DOWN, wxEventHandler (OnCompletionBox::OnUpdateList), nullptr, this); + Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(OnCompletionBox::OnSelection ), nullptr, this); + Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (OnCompletionBox::OnMouseWheel), nullptr, this); - Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(ExecFinishedBox::OnValidateSelection), nullptr, this); + Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(OnCompletionBox::OnValidateSelection), nullptr, this); } -void ExecFinishedBox::addItemHistory() +void OnCompletionBox::addItemHistory() { if (history_) { - std::wstring command = getValue(); + Zstring command = getValue(); trim(command); - if (command == separationLine || //do not add sep. line - command == cmdTxtCloseProgressDlg || //do not add special command + if (command == utfCvrtTo<Zstring>(separationLine) || //do not add sep. line + command == utfCvrtTo<Zstring>(cmdTxtCloseProgressDlg) || //do not add special command command.empty()) return; //do not add built-in commands to history for (const auto& item : defaultCommands) - if (command == item.first || - command == item.second) + if (command == utfCvrtTo<Zstring>(item.first) || + ::EqualFilename()(command, item.second)) return; - for (const std::wstring& item : *history_) - if (command == item) - return; + vector_remove_if(*history_, [&](const Zstring& item) { return ::EqualFilename()(command, item); }); history_->insert(history_->begin(), command); @@ -130,34 +130,32 @@ void ExecFinishedBox::addItemHistory() } -std::wstring ExecFinishedBox::getValue() const +Zstring OnCompletionBox::getValue() const { - const std::wstring value = zen::copyStringTo<std::wstring>(GetValue()); + auto value = copyStringTo<std::wstring>(GetValue()); + trim(value); - { - std::wstring tmp = value; - trim(tmp); - if (tmp == implementation::translate(cmdTxtCloseProgressDlg)) //have this symbolic constant translated properly - return cmdTxtCloseProgressDlg; - } + if (value == implementation::translate(cmdTxtCloseProgressDlg)) //undo translation for config file storage + value = cmdTxtCloseProgressDlg; - return value; + return utfCvrtTo<Zstring>(value); } -void ExecFinishedBox::setValue(const std::wstring& value) +void OnCompletionBox::setValue(const Zstring& value) { - std::wstring tmp = value; + auto tmp = utfCvrtTo<std::wstring>(value); trim(tmp); if (tmp == cmdTxtCloseProgressDlg) - setValueAndUpdateList(implementation::translate(cmdTxtCloseProgressDlg)); //have this symbolic constant translated properly - else - setValueAndUpdateList(value); + tmp = implementation::translate(cmdTxtCloseProgressDlg); //have this symbolic constant translated properly + + setValueAndUpdateList(tmp); } + //set value and update list are technically entangled: see potential bug description below -void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value) +void OnCompletionBox::setValueAndUpdateList(const std::wstring& value) { //it may be a little lame to update the list on each mouse-button click, but it should be working and we dont't have to manipulate wxComboBox internals @@ -167,14 +165,15 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value) items.push_back(implementation::translate(cmdTxtCloseProgressDlg)); //2. built in commands - for (auto it = defaultCommands.begin(); it != defaultCommands.end(); ++it) - items.push_back(it->first); + for (const auto& item : defaultCommands) + items.push_back(item.first); //3. history elements if (history_ && !history_->empty()) { items.push_back(separationLine); - vector_append(items, *history_); + for (const Zstring& hist : *history_) + items.push_back(utfCvrtTo<std::wstring>(hist)); std::sort(items.end() - history_->size(), items.end()); } @@ -188,14 +187,17 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value) items.push_front(value); } - Clear(); - std::for_each(items.begin(), items.end(), [&](const std::wstring& item) { this->Append(item); }); + //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! + wxItemContainer::Clear(); //suffices to clear the selection items only! + + for (const std::wstring& item : items) + this->Append(item); //this->SetSelection(wxNOT_FOUND); //don't select anything - SetValue(value); //preserve main text! + ChangeValue(value); //preserve main text! } -void ExecFinishedBox::OnSelection(wxCommandEvent& event) +void OnCompletionBox::OnSelection(wxCommandEvent& event) { wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time! if (auto handler = GetEventHandler()) @@ -205,27 +207,27 @@ void ExecFinishedBox::OnSelection(wxCommandEvent& event) } -void ExecFinishedBox::OnValidateSelection(wxCommandEvent& event) +void OnCompletionBox::OnValidateSelection(wxCommandEvent& event) { - const auto& value = getValue(); + const auto value = copyStringTo<std::wstring>(GetValue()); if (value == separationLine) - setValueAndUpdateList(std::wstring()); - else - for (auto it = defaultCommands.begin(); it != defaultCommands.end(); ++it) - if (it->first == value) - return setValueAndUpdateList(it->second); //replace GUI name by actual command string + return setValueAndUpdateList(std::wstring()); + + for (const auto& item : defaultCommands) + if (item.first == value) + return setValueAndUpdateList(utfCvrtTo<std::wstring>(item.second)); //replace GUI name by actual command string } -void ExecFinishedBox::OnUpdateList(wxEvent& event) +void OnCompletionBox::OnUpdateList(wxEvent& event) { setValue(getValue()); event.Skip(); } -void ExecFinishedBox::OnKeyEvent(wxKeyEvent& event) +void OnCompletionBox::OnKeyEvent(wxKeyEvent& event) { switch (event.GetKeyCode()) { @@ -239,7 +241,7 @@ void ExecFinishedBox::OnKeyEvent(wxKeyEvent& event) (GetValue() != GetString(pos) || //avoid problems when a character shall be deleted instead of list item GetValue() == wxEmptyString)) //exception: always allow removing empty entry { - const std::wstring selValue = copyStringTo<std::wstring>(GetString(pos)); + const auto selValue = utfCvrtTo<Zstring>(GetString(pos)); if (history_ && std::find(history_->begin(), history_->end(), selValue) != history_->end()) //only history elements may be deleted { @@ -248,7 +250,7 @@ void ExecFinishedBox::OnKeyEvent(wxKeyEvent& event) //this->SetSelection(wxNOT_FOUND); //delete selected row - vector_remove_if(*history_, [&](const std::wstring& item) { return item == selValue; }); + vector_remove_if(*history_, [&](const Zstring& item) { return item == selValue; }); SetString(pos, wxString()); //in contrast to Delete(), this one does not kill the drop-down list and gives a nice visual feedback! //Delete(pos); @@ -256,9 +258,7 @@ void ExecFinishedBox::OnKeyEvent(wxKeyEvent& event) //(re-)set value SetValue(currentVal); } - - //eat up key event - return; + return; //eat up key event } } break; diff --git a/FreeFileSync/Source/ui/exec_finished_box.h b/FreeFileSync/Source/ui/on_completion_box.h index 2a69faef..1e05a14f 100644 --- a/FreeFileSync/Source/ui/exec_finished_box.h +++ b/FreeFileSync/Source/ui/on_completion_box.h @@ -12,17 +12,18 @@ #include <map> #include <wx/combobox.h> #include <zen/string_tools.h> +#include <zen/zstring.h> //combobox with history function + functionality to delete items (DEL) //special command -bool isCloseProgressDlgCommand(const std::wstring& value); +bool isCloseProgressDlgCommand(const Zstring& value); -class ExecFinishedBox : public wxComboBox +class OnCompletionBox : public wxComboBox { public: - ExecFinishedBox(wxWindow* parent, + OnCompletionBox(wxWindow* parent, wxWindowID id, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, @@ -33,12 +34,12 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); - void initHistory(std::vector<std::wstring>& history, size_t historyMax) { history_ = &history; historyMax_ = historyMax; } + void initHistory(std::vector<Zstring>& history, size_t historyMax) { history_ = &history; historyMax_ = historyMax; } void addItemHistory(); //adds current item to history // use these two accessors instead of GetValue()/SetValue(): - std::wstring getValue() const; - void setValue(const std::wstring& value); + Zstring getValue() const; + void setValue(const Zstring& value); //required for setting value correctly + Linux to ensure the dropdown is shown as being populated private: @@ -50,10 +51,10 @@ private: void setValueAndUpdateList(const std::wstring& value); - std::vector<std::wstring>* history_; + std::vector<Zstring>* history_; size_t historyMax_; - const std::vector<std::pair<std::wstring, std::wstring>> defaultCommands; + const std::vector<std::pair<std::wstring, Zstring>> defaultCommands; }; diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp index 04bb739c..e0eeb6cc 100644 --- a/FreeFileSync/Source/ui/progress_indicator.cpp +++ b/FreeFileSync/Source/ui/progress_indicator.cpp @@ -7,8 +7,6 @@ #include "progress_indicator.h" #include <memory> #include <wx/imaglist.h> -//#include <wx/stopwatch.h> -//#include <wx/time.h> #include <wx/wupdlock.h> #include <wx/sound.h> #include <wx/clipbrd.h> @@ -34,7 +32,7 @@ #include "../lib/perf_check.h" #include "tray_icon.h" #include "taskbar.h" -#include "exec_finished_box.h" +#include "on_completion_box.h" #include "app_icon.h" #ifdef ZEN_WIN @@ -52,8 +50,8 @@ namespace const int GAUGE_FULL_RANGE = 50000; //window size used for statistics in milliseconds -const int WINDOW_REMAINING_TIME = 60000; //some scenarios have dropouts of 40 seconds -> 60 sec. window size handles them well -const int WINDOW_BYTES_PER_SEC = 5000; // +const int WINDOW_REMAINING_TIME_MS = 60000; //USB memory stick scenario can have drop outs of 40 seconds => 60 sec. window size handles it +const int WINDOW_BYTES_PER_SEC = 5000; // //don't use wxStopWatch for long-running measurements: internally it uses ::QueryPerformanceCounter() which can overflow after only a few days: //https://sourceforge.net/p/freefilesync/discussion/help/thread/5d62339e @@ -120,7 +118,7 @@ private: std::unique_ptr<Taskbar> taskbar_; std::unique_ptr<PerfCheck> perf; //estimate remaining time - int64_t lastStatCallSpeed; //used for calculating intervals between showing and collecting perf samples + int64_t timeLastSpeedEstimateMs; //used for calculating intervals between showing and collecting perf samples }; @@ -129,7 +127,7 @@ CompareProgressDialog::Pimpl::Pimpl(wxFrame& parentWindow) : parentWindow_(parentWindow), binCompStartMs(0), syncStat_(nullptr), - lastStatCallSpeed(-1000000) //some big number + timeLastSpeedEstimateMs(-1000000) //some big number { //init(); -> needed? } @@ -178,8 +176,8 @@ void CompareProgressDialog::Pimpl::finalize() void CompareProgressDialog::Pimpl::switchToCompareBytewise() { //start to measure perf - perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC); - lastStatCallSpeed = -1000000; //some big number + perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME_MS, WINDOW_BYTES_PER_SEC); + timeLastSpeedEstimateMs = -1000000; //some big number binCompStartMs = timeElapsed.timeMs(); @@ -209,7 +207,7 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow() }; bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary - const int64_t timeNow = timeElapsed.timeMs(); + const int64_t timeNowMs = timeElapsed.timeMs(); //status texts setText(*m_textCtrlStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! @@ -253,12 +251,12 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow() //remaining time and speed: only visible during binary comparison assert(perf); if (perf) - if (numeric::dist(lastStatCallSpeed, timeNow) >= 500) + if (numeric::dist(timeLastSpeedEstimateMs, timeNowMs) >= 500) { - lastStatCallSpeed = timeNow; + timeLastSpeedEstimateMs = timeNowMs; - if (numeric::dist(binCompStartMs, timeNow) >= 1000) //discard stats for first second: probably messy - perf->addSample(objectsCurrent, to<double>(dataCurrent), timeNow); + if (numeric::dist(binCompStartMs, timeNowMs) >= 1000) //discard stats for first second: probably messy + perf->addSample(objectsCurrent, to<double>(dataCurrent), timeNowMs); //current speed -> Win 7 copy uses 1 sec update interval instead Opt<std::wstring> bps = perf->getBytesPerSecond(); @@ -266,8 +264,8 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow() //remaining time: display with relative error of 10% - based on samples taken every 0.5 sec only //-> call more often than once per second to correctly show last few seconds countdown, but don't call too often to avoid occasional jitter - Opt<std::wstring> rt = perf->getRemainingTime(to<double>(dataTotal - dataCurrent)); - setText(*m_staticTextRemTime, rt ? *rt : L"-", &layoutChanged); + Opt<double> remTimeSec = perf->getRemainingTimeSec(to<double>(dataTotal - dataCurrent)); + setText(*m_staticTextRemTime, remTimeSec ? remainingTimeToString(*remTimeSec) : L"-", &layoutChanged); } } break; @@ -281,7 +279,7 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow() setText(*m_staticTextScanned, scannedObjects, &layoutChanged); //time elapsed - const int64_t timeElapSec = timeNow / 1000; + const int64_t timeElapSec = timeNowMs / 1000; setText(*m_staticTextTimeElapsed, timeElapSec < 3600 ? wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") : @@ -329,22 +327,21 @@ void CompareProgressDialog::updateStatusPanelNow() namespace { inline -wxBitmap buttonPressed(const std::string& name) +wxBitmap getImageButtonPressed(const wchar_t* name) { - wxBitmap background = getResourceImage(L"log button pressed"); - return layOver(getResourceImage(utfCvrtTo<wxString>(name)), background); + return layOver(getResourceImage(name), getResourceImage(L"log button pressed")); } inline -wxBitmap buttonReleased(const std::string& name) +wxBitmap getImageButtonReleased(const wchar_t* name) { - wxImage output = greyScale(getResourceImage(utfCvrtTo<wxString>(name))).ConvertToImage(); + return greyScale(getResourceImage(name)).ConvertToImage(); //getResourceImage(utfCvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! //brighten(output, 30); //zen::moveImage(output, 1, 0); //move image right one pixel - return output; + //return output; } @@ -363,18 +360,21 @@ public: MsgString messageLine; bool firstLine; //if LogEntry::message spans multiple rows }; - bool getEntry(size_t row, LogEntryView& out) const + + Opt<LogEntryView> getEntry(size_t row) const { if (row < viewRef.size()) { const Line& line = viewRef[row]; - out.time = line.entry_->time; - out.type = line.entry_->type; - out.messageLine = extractLine(line.entry_->message, line.rowNumber_); - out.firstLine = line.rowNumber_ == 0; //this is virtually always correct, unless first line of the original message is empty! - return true; + + LogEntryView output = {}; + output.time = line.logIt_->time; + output.type = line.logIt_->type; + output.messageLine = extractLine(line.logIt_->message, line.rowNumber_); + output.firstLine = line.rowNumber_ == 0; //this is virtually always correct, unless first line of the original message is empty! + return output; } - return false; + return NoValue(); } void updateView(int includedTypes) //TYPE_INFO | TYPE_WARNING, ect. see error_log.h @@ -393,7 +393,7 @@ public: if (c == L'\n') { if (!lastCharNewline) //do not reference empty lines! - viewRef.push_back(Line(&*it, rowNumber)); + viewRef.push_back(Line(it, rowNumber)); ++rowNumber; lastCharNewline = true; } @@ -401,7 +401,7 @@ public: lastCharNewline = false; if (!lastCharNewline) - viewRef.push_back(Line(&*it, rowNumber)); + viewRef.push_back(Line(it, rowNumber)); } } @@ -428,8 +428,8 @@ private: struct Line { - Line(const LogEntry* entry, size_t rowNumber) : entry_(entry), rowNumber_(rowNumber) {} - const LogEntry* entry_; //always bound! + Line(ErrorLog::const_iterator logIt, size_t rowNumber) : logIt_(logIt), rowNumber_(rowNumber) {} + ErrorLog::const_iterator logIt_; //always bound! size_t rowNumber_; //LogEntry::message may span multiple rows }; @@ -459,33 +459,33 @@ public: virtual wxString getValue(size_t row, ColumnType colType) const { - MessageView::LogEntryView entry = {}; - if (msgView_ && msgView_->getEntry(row, entry)) - switch (static_cast<ColumnTypeMsg>(colType)) - { - case COL_TYPE_MSG_TIME: - if (entry.firstLine) - return formatTime<wxString>(FORMAT_TIME, localTime(entry.time)); - break; + if (msgView_) + if (Opt<MessageView::LogEntryView> entry = msgView_->getEntry(row)) + switch (static_cast<ColumnTypeMsg>(colType)) + { + case COL_TYPE_MSG_TIME: + if (entry->firstLine) + return formatTime<wxString>(FORMAT_TIME, localTime(entry->time)); + break; - case COL_TYPE_MSG_CATEGORY: - if (entry.firstLine) - switch (entry.type) - { - case TYPE_INFO: - return _("Info"); - case TYPE_WARNING: - return _("Warning"); - case TYPE_ERROR: - return _("Error"); - case TYPE_FATAL_ERROR: - return _("Serious Error"); - } - break; + case COL_TYPE_MSG_CATEGORY: + if (entry->firstLine) + switch (entry->type) + { + case TYPE_INFO: + return _("Info"); + case TYPE_WARNING: + return _("Warning"); + case TYPE_ERROR: + return _("Error"); + case TYPE_FATAL_ERROR: + return _("Serious Error"); + } + break; - case COL_TYPE_MSG_TEXT: - return copyStringTo<wxString>(entry.messageLine); - } + case COL_TYPE_MSG_TEXT: + return copyStringTo<wxString>(entry->messageLine); + } return wxEmptyString; } @@ -493,14 +493,15 @@ public: { wxRect rectTmp = rect; + //-------------- draw item separation line ----------------- const wxColor colorGridLine = wxColour(192, 192, 192); //light grey wxDCPenChanger dummy2(dc, wxPen(colorGridLine, 1, wxSOLID)); const bool drawBottomLine = [&]() -> bool //don't separate multi-line messages { - MessageView::LogEntryView nextEntry = {}; - if (msgView_ && msgView_->getEntry(row + 1, nextEntry)) - return nextEntry.firstLine; + if (msgView_) + if (Opt<MessageView::LogEntryView> nextEntry = msgView_->getEntry(row + 1)) + return nextEntry->firstLine; return true; }(); @@ -512,58 +513,56 @@ public: //-------------------------------------------------------- - MessageView::LogEntryView entry = {}; - if (msgView_ && msgView_->getEntry(row, entry)) - switch (static_cast<ColumnTypeMsg>(colType)) - { - case COL_TYPE_MSG_TIME: - drawCellText(dc, rectTmp, getValue(row, colType), true, wxALIGN_CENTER); - break; + if (msgView_) + if (Opt<MessageView::LogEntryView> entry = msgView_->getEntry(row)) + switch (static_cast<ColumnTypeMsg>(colType)) + { + case COL_TYPE_MSG_TIME: + drawCellText(dc, rectTmp, getValue(row, colType), true, wxALIGN_CENTER); + break; - case COL_TYPE_MSG_CATEGORY: - if (entry.firstLine) - switch (entry.type) - { - case TYPE_INFO: - dc.DrawLabel(wxString(), getResourceImage(L"msg_info_small"), rectTmp, wxALIGN_CENTER); - break; - case TYPE_WARNING: - dc.DrawLabel(wxString(), getResourceImage(L"msg_warning_small"), rectTmp, wxALIGN_CENTER); - break; - case TYPE_ERROR: - case TYPE_FATAL_ERROR: - dc.DrawLabel(wxString(), getResourceImage(L"msg_error_small"), rectTmp, wxALIGN_CENTER); - break; - } - break; + case COL_TYPE_MSG_CATEGORY: + if (entry->firstLine) + switch (entry->type) + { + case TYPE_INFO: + dc.DrawLabel(wxString(), getResourceImage(L"msg_info_small"), rectTmp, wxALIGN_CENTER); + break; + case TYPE_WARNING: + dc.DrawLabel(wxString(), getResourceImage(L"msg_warning_small"), rectTmp, wxALIGN_CENTER); + break; + case TYPE_ERROR: + case TYPE_FATAL_ERROR: + dc.DrawLabel(wxString(), getResourceImage(L"msg_error_small"), rectTmp, wxALIGN_CENTER); + break; + } + break; - case COL_TYPE_MSG_TEXT: - { - rectTmp.x += COLUMN_GAP_LEFT; - rectTmp.width -= COLUMN_GAP_LEFT; - drawCellText(dc, rectTmp, getValue(row, colType), true); + case COL_TYPE_MSG_TEXT: + rectTmp.x += COLUMN_GAP_LEFT; + rectTmp.width -= COLUMN_GAP_LEFT; + drawCellText(dc, rectTmp, getValue(row, colType), true); + break; } - break; - } } virtual int getBestSize(wxDC& dc, size_t row, ColumnType colType) override { // -> synchronize renderCell() <-> getBestSize() - MessageView::LogEntryView entry = {}; - if (msgView_ && msgView_->getEntry(row, entry)) - switch (static_cast<ColumnTypeMsg>(colType)) - { - case COL_TYPE_MSG_TIME: - return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); + if (msgView_) + if (msgView_->getEntry(row)) + switch (static_cast<ColumnTypeMsg>(colType)) + { + case COL_TYPE_MSG_TIME: + return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); - case COL_TYPE_MSG_CATEGORY: - return getResourceImage(L"msg_info_small").GetWidth(); + case COL_TYPE_MSG_CATEGORY: + return getResourceImage(L"msg_info_small").GetWidth(); - case COL_TYPE_MSG_TEXT: - return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); - } + case COL_TYPE_MSG_TEXT: + return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); + } return 0; } @@ -586,17 +585,15 @@ public: virtual wxString getToolTip(size_t row, ColumnType colType) const override { - MessageView::LogEntryView entry = {}; - if (msgView_ && msgView_->getEntry(row, entry)) - switch (static_cast<ColumnTypeMsg>(colType)) - { - case COL_TYPE_MSG_TIME: - case COL_TYPE_MSG_TEXT: - break; + switch (static_cast<ColumnTypeMsg>(colType)) + { + case COL_TYPE_MSG_TIME: + case COL_TYPE_MSG_TEXT: + break; - case COL_TYPE_MSG_CATEGORY: - return getValue(row, colType); - } + case COL_TYPE_MSG_CATEGORY: + return getValue(row, colType); + } return wxEmptyString; } @@ -635,11 +632,11 @@ public: const int warningCount = log.getItemCount(TYPE_WARNING); const int infoCount = log.getItemCount(TYPE_INFO); - auto initButton = [](ToggleButton& btn, const char* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); }; + auto initButton = [](ToggleButton& btn, const wchar_t* imgName, const wxString& tooltip) { btn.init(getImageButtonPressed(imgName), getImageButtonReleased(imgName)); btn.SetToolTip(tooltip); }; - initButton(*m_bpButtonErrors, "msg_error", _("Error" ) + wxString::Format(L" (%d)", errorCount )); - initButton(*m_bpButtonWarnings, "msg_warning", _("Warning") + wxString::Format(L" (%d)", warningCount)); - initButton(*m_bpButtonInfo, "msg_info", _("Info" ) + wxString::Format(L" (%d)", infoCount )); + initButton(*m_bpButtonErrors, L"msg_error", _("Error" ) + printNumber<std::wstring>(L" (%d)", errorCount )); + initButton(*m_bpButtonWarnings, L"msg_warning", _("Warning") + printNumber<std::wstring>(L" (%d)", warningCount)); + initButton(*m_bpButtonInfo, L"msg_info", _("Info" ) + printNumber<std::wstring>(L" (%d)", infoCount )); m_bpButtonErrors ->setActive(true); m_bpButtonWarnings->setActive(true); @@ -773,7 +770,7 @@ private: !isComponentOf(focus, this) || !IsEnabled() || //only handle if main window is in use and no modal dialog is shown: !tlw || !const_cast<wxTopLevelWindow*>(tlw)->IsActive()) //thanks to wxWidgets non-portability we need both checks: - //first is sufficient for Windows, second is needed on OS X since it does NOT disable the parent when showing a modal dialog + //IsEnabled() is sufficient for Windows, IsActive() is needed on OS X since it does NOT disable the parent when showing a modal dialog { event.Skip(); return; @@ -791,6 +788,8 @@ private: m_gridMessages->SetFocus(); m_gridMessages->selectAllRows(ALLOW_GRID_EVENT); return; // -> swallow event! don't allow default grid commands! + + //case 'C': -> already implemented by "Grid" class } else switch (keyCode) @@ -800,15 +799,15 @@ private: case WXK_DOWN: case WXK_LEFT: case WXK_RIGHT: - case WXK_NUMPAD_UP: - case WXK_NUMPAD_DOWN: - case WXK_NUMPAD_LEFT: - case WXK_NUMPAD_RIGHT: - case WXK_PAGEUP: case WXK_PAGEDOWN: case WXK_HOME: case WXK_END: + + case WXK_NUMPAD_UP: + case WXK_NUMPAD_DOWN: + case WXK_NUMPAD_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_NUMPAD_PAGEUP: case WXK_NUMPAD_PAGEDOWN: case WXK_NUMPAD_HOME: @@ -876,144 +875,19 @@ private: //######################################################################################## -warn_static("remove after test") -#define NEW_BAR_PROGRESS_GRAPH - namespace { -#ifdef NEW_BAR_PROGRESS_GRAPH -class CurveDataProgressBar : public CurveData -{ -public: - CurveDataProgressBar() : x(0), xMax(0) {} - - void setValue(double val, double valMax) { x = val; xMax = valMax; } - -private: - virtual std::pair<double, double> getRangeX() const override { return std::make_pair(0, xMax); } //irrelevant; graph range is fixed - - virtual void getPoints(double minX, double maxX, int pixelWidth, std::vector<CurvePoint>& points) const override - { - //- draw a filled rectangle partly outside visible graph area [0, xMax] x [0, xMax] to simulate a progress bar - //- make sure to start within visible area to avoid automatic trimming - points.push_back(CurvePoint( x, xMax / 2)); - points.push_back(CurvePoint( x, -xMax)); - points.push_back(CurvePoint(-xMax, -xMax)); - points.push_back(CurvePoint(-xMax, xMax * 2)); - points.push_back(CurvePoint( x, xMax * 2)); - points.push_back(CurvePoint( x, xMax / 2)); - } - - double x; - double xMax; -}; - - -class CurveDataStretchedGraph : public SparseCurveData -{ -public: - CurveDataStretchedGraph() : SparseCurveData(true), /*true: add steps*/ timeNow(0) {} - - void clear() { samples.clear(); timeNow = 0; } - - void addRecord(int64_t timeNowMs, double value) - { - timeNow = timeNowMs; - - //allow for at most one sample per 100ms (handles duplicate inserts, too!) => this is unrelated to UI_UPDATE_INTERVAL! - if (!samples.empty() && timeNowMs / 100 == samples.rbegin()->first / 100) - { - samples.rbegin()->second = value; - return; - } - - samples.insert(samples.end(), std::make_pair(timeNowMs, value)); //time is "expected" to be monotonously ascending - //documentation differs about whether "hint" should be before or after the to be inserted element! - //however "std::map<>::end()" is interpreted correctly by GCC and VS2010 - - if (samples.size() > MAX_BUFFER_SIZE) //limit buffer size - samples.erase(samples.begin()); - } - -private: - virtual std::pair<double, double> getRangeX() const override { return std::make_pair(0, samples.empty() ? 0 : samples.rbegin()->second); } //irrelevant; graph range is fixed - - virtual Opt<CurvePoint> getLessEq(double x) const override //x: both input and output have unit "data processed" - { - if (samples.empty()) - return NoValue(); - - const double dataCurrent = samples.rbegin()->second; - const int64_t curveDuration = samples.rbegin()->first - samples.begin()->first; - if (numeric::isNull(dataCurrent) || curveDuration == 0) - return NoValue(); - - //map x from [0, dataCurrent] to [curveTimeBegin, curveTimeEnd] - const double timeMs = samples.begin()->first + curveDuration * x / dataCurrent; - auto timePointToX = [&](int64_t tp) { return (tp - samples.begin()->first) * dataCurrent / curveDuration; }; - - //-------------------------------------------------- - const int64_t timex = std::floor(timeMs); - //------ add artifical last sample value ------- - if (samples.rbegin()->first < timeNow) - if (timeNow <= timex) - return CurvePoint(timePointToX(timeNow), samples.rbegin()->second); - //-------------------------------------------------- - - //find first key > x, then go one step back: => samples must be a std::map, NOT std::multimap!!! - auto it = samples.upper_bound(timex); - if (it == samples.begin()) - return NoValue(); - //=> samples not empty in this context - --it; - return CurvePoint(timePointToX(it->first), it->second); - } - - virtual Opt<CurvePoint> getGreaterEq(double x) const override - { - if (samples.empty()) - return NoValue(); - - const double dataCurrent = samples.rbegin()->second; - const int64_t curveDuration = samples.rbegin()->first - samples.begin()->first; - if (numeric::isNull(dataCurrent) || curveDuration == 0) - return NoValue(); - - //map x from [0, dataCurrent] to [curveTimeBegin, curveTimeEnd] - const double timeMs = samples.begin()->first + curveDuration * x / dataCurrent; - auto timePointToX = [&](int64_t tp) { return (tp - samples.begin()->first) * dataCurrent / curveDuration; }; - - //-------------------------------------------------- - const int64_t timex = std::ceil(timeMs); - //------ add artifical last sample value ------- - if (samples.rbegin()->first < timeNow) - if (samples.rbegin()->first < timex && timex <= timeNow) - return CurvePoint(timePointToX(timeNow), samples.rbegin()->second); - //-------------------------------------------------- - - auto it = samples.lower_bound(timex); - if (it == samples.end()) - return NoValue(); - return CurvePoint(timePointToX(it->first), it->second); - } - - static const size_t MAX_BUFFER_SIZE = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte - - std::map<int64_t, double> samples; //time, unit: [ms] !don't use std::multimap, see getLessEq() - int64_t timeNow; //help create an artificial record at the end of samples to visualize current time! -}; - - -#else class CurveDataStatistics : public SparseCurveData { public: - CurveDataStatistics() : SparseCurveData(true), /*true: add steps*/ timeNow(0) {} + CurveDataStatistics() : SparseCurveData(true) /*true: add steps*/ {} - void clear() { samples.clear(); timeNow = 0; } + void clear() { samples.clear(); lastSample = std::make_pair(0, 0); } void addRecord(int64_t timeNowMs, double value) { + assert((!samples.empty() || lastSample == std::pair<int64_t, double>(0, 0))); + //samples.clear(); //samples.insert(std::make_pair(-1000, 0)); //samples.insert(std::make_pair(0, 0)); @@ -1021,14 +895,12 @@ public: //samples.insert(std::make_pair(1000, 0)); //return; - timeNow = timeNowMs; + lastSample = std::make_pair(timeNowMs, value); //allow for at most one sample per 100ms (handles duplicate inserts, too!) => this is unrelated to UI_UPDATE_INTERVAL! - if (!samples.empty() && timeNowMs / 100 == samples.rbegin()->first / 100) - { - samples.rbegin()->second = value; - return; - } + if (!samples.empty()) //always unconditionally insert first sample! + if (timeNowMs / 100 == samples.rbegin()->first / 100) + return; samples.insert(samples.end(), std::make_pair(timeNowMs, value)); //time is "expected" to be monotonously ascending //documentation differs about whether "hint" should be before or after the to be inserted element! @@ -1041,14 +913,17 @@ public: private: virtual std::pair<double, double> getRangeX() const override { - if (samples.empty()) return std::make_pair(0.0, 0.0); + if (samples.empty()) + return std::make_pair(0.0, 0.0); - double upperEndMs = std::max(timeNow, samples.rbegin()->first); + double upperEndMs = std::max(samples.rbegin()->first, lastSample.first); + /* //report some additional width by 5% elapsed time to make graph recalibrate before hitting the right border //caveat: graph for batch mode binary comparison does NOT start at elapsed time 0!! PHASE_COMPARING_CONTENT and PHASE_SYNCHRONIZING! //=> consider width of current sample set! upperEndMs += 0.05 *(upperEndMs - samples.begin()->first); + */ return std::make_pair(samples.begin()->first / 1000.0, //need not start with 0, e.g. "binary comparison, graph reset, followed by sync" upperEndMs / 1000.0); @@ -1058,9 +933,9 @@ private: { const int64_t timex = std::floor(x * 1000); //------ add artifical last sample value ------- - if (!samples.empty() && samples.rbegin()->first < timeNow) - if (timeNow <= timex) - return CurvePoint(timeNow / 1000.0, samples.rbegin()->second); + if (!samples.empty() && samples.rbegin()->first < lastSample.first) + if (lastSample.first <= timex) + return CurvePoint(lastSample.first / 1000.0, lastSample.second); //-------------------------------------------------- //find first key > x, then go one step back: => samples must be a std::map, NOT std::multimap!!! @@ -1076,9 +951,9 @@ private: { const int64_t timex = std::ceil(x * 1000); //------ add artifical last sample value ------- - if (!samples.empty() && samples.rbegin()->first < timeNow) - if (samples.rbegin()->first < timex && timex <= timeNow) - return CurvePoint(timeNow / 1000.0, samples.rbegin()->second); + if (!samples.empty() && samples.rbegin()->first < lastSample.first) + if (samples.rbegin()->first < timex && timex <= lastSample.first) + return CurvePoint(lastSample.first / 1000.0, lastSample.second); //-------------------------------------------------- auto it = samples.lower_bound(timex); @@ -1090,65 +965,31 @@ private: static const size_t MAX_BUFFER_SIZE = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte std::map<int64_t, double> samples; //time, unit: [ms] !don't use std::multimap, see getLessEq() - int64_t timeNow; //help create an artificial record at the end of samples to visualize current time! + std::pair<int64_t, double> lastSample; //artificial most current record at the end of samples to visualize current time! }; -class CurveDataCurrentValue : public CurveData +class CurveDataRectangleArea : public CurveData { public: - CurveDataCurrentValue() : x(0), yCurrent_(0), yTotal_(0) {} + CurveDataRectangleArea () : x(0), y(0) {} - void setValue(int64_t xTimeNowMs, double yCurrent, double yTotal) { x = xTimeNowMs / 1000.0; yCurrent_ = yCurrent; yTotal_ = yTotal; } + void setValue (double xVal, double yVal) { x = xVal; y = yVal; } + void setValueX(double xVal) { x = xVal; } + double getValueX() const { return x; } private: virtual std::pair<double, double> getRangeX() const override { return std::make_pair(x, x); } //conceptually just a vertical line! virtual void getPoints(double minX, double maxX, int pixelWidth, std::vector<CurvePoint>& points) const override { - //points.push_back(CurvePoint(-1, 0)); - //points.push_back(CurvePoint(0, 0)); - //points.push_back(CurvePoint(0.0001, 1)); - //points.push_back(CurvePoint(1, 0)); - //return; - - if (x <= maxX) - { - points.push_back(CurvePoint(x, 0)); - points.push_back(CurvePoint(x, yCurrent_)); - points.push_back(CurvePoint(maxX, yCurrent_)); - points.push_back(CurvePoint(x, yCurrent_)); - points.push_back(CurvePoint(x, yTotal_)); - } + points.push_back(CurvePoint(0, y)); + points.push_back(CurvePoint(x, y)); + points.push_back(CurvePoint(x, 0)); } double x; //time elapsed in seconds - double yCurrent_; //current bytes/items - double yTotal_; -}; - - -class CurveDataTotalValue : public CurveData -{ -public: - CurveDataTotalValue () : x(0), yTotal_(0) {} - - void setValue(int64_t xTimeNowMs, double yTotal) { x = xTimeNowMs / 1000.0; yTotal_ = yTotal; } - -private: - virtual std::pair<double, double> getRangeX() const override { return std::make_pair(x, x); } //conceptually just a vertical line! - - virtual void getPoints(double minX, double maxX, int pixelWidth, std::vector<CurvePoint>& points) const override - { - if (x <= maxX) - { - points.push_back(CurvePoint(x, yTotal_)); - points.push_back(CurvePoint(maxX, yTotal_)); - } - } - - double x; //time elapsed in seconds - double yTotal_; + double y; //items/bytes processed }; @@ -1187,7 +1028,7 @@ struct LabelFormatterItemCount : public LabelFormatter const double steps[] = { 1, 2, 5, 10 }; if (itemsProposed <= 10) - return numeric::nearMatch(itemsProposed, std::begin(steps), std::end(steps)); //similar to nextNiceNumber(), but without the 2.5 step! + return numeric::nearMatch(itemsProposed, std::begin(steps), std::end(steps)); //like nextNiceNumber(), but without the 2.5 step! return nextNiceNumber(itemsProposed); } @@ -1204,7 +1045,8 @@ struct LabelFormatterTimeElapsed : public LabelFormatter virtual double getOptimalBlockSize(double secProposed) const { - const double stepsSec[] = { 20, 30, 60 }; //20 sec: minimum block size; (no 15: avoid flicker between 10<->15<->20 sec blocks) + //5 sec minimum block size + const double stepsSec[] = { 5, 10, 20, 30, 60 }; //nice numbers for seconds if (secProposed <= 60) return numeric::nearMatch(secProposed, std::begin(stepsSec), std::end(stepsSec)); @@ -1213,9 +1055,9 @@ struct LabelFormatterTimeElapsed : public LabelFormatter return 60.0 * numeric::nearMatch(secProposed / 60, std::begin(stepsMin), std::end(stepsMin)); if (secProposed <= 3600 * 24) - return nextNiceNumber(secProposed / 3600) * 3600; //round up to full hours + return 3600 * nextNiceNumber(secProposed / 3600); //round up to full hours - return nextNiceNumber(secProposed / (24 * 3600)) * 24 * 3600; //round to full days + return 24 * 3600 * nextNiceNumber(secProposed / (24 * 3600)); //round to full days } virtual wxString formatText(double timeElapsed, double optimalBlockSize) const @@ -1232,7 +1074,6 @@ struct LabelFormatterTimeElapsed : public LabelFormatter private: bool drawLabel_; }; -#endif } @@ -1253,8 +1094,8 @@ public: wxFrame* parentFrame, bool showProgress, const wxString& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory); + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory); virtual ~SyncProgressDialogImpl(); //call this in StatusUpdater derived class destructor at the LATEST(!) to prevent access to currentStatusUpdater @@ -1268,7 +1109,7 @@ public: virtual void notifyProgressChange(); virtual void updateGui() { updateGuiInt(true); } - virtual std::wstring getExecWhenFinishedCommand() const { return pnl.m_comboBoxExecFinished->getValue(); } + virtual Zstring getExecWhenFinishedCommand() const { return pnl.m_comboBoxOnCompletion->getValue(); } virtual void stopTimer() //halt all internal counters! { @@ -1307,7 +1148,7 @@ private: std::function<void()> notifyWindowTerminate_; //call once in OnClose(), NOT in destructor which is called far too late somewhere in wxWidgets main loop! - bool wereDead; //after wxWindow::Delete, which is equal to "delete this" on OS X! + bool wereDead; //set after wxWindow::Delete(), which equals "delete this" on OS X! //status variables const Statistics* syncStat_; // @@ -1317,24 +1158,17 @@ private: //remaining time std::unique_ptr<PerfCheck> perf; - int64_t lastStatCallSpeed; //used for calculating intervals between collecting perf samples + int64_t timeLastSpeedEstimateMs; //used for calculating intervals between collecting perf samples + //help calculate total speed int64_t phaseStartMs; //begin of current phase in [ms] -#ifdef NEW_BAR_PROGRESS_GRAPH - std::shared_ptr<CurveDataProgressBar> curveDataBytesPerc; - std::shared_ptr<CurveDataProgressBar> curveDataItemsPerc; - std::shared_ptr<CurveDataStretchedGraph> curveDataBytes; - std::shared_ptr<CurveDataStretchedGraph> curveDataItems; -#else - std::shared_ptr<CurveDataStatistics > curveDataBytes; - std::shared_ptr<CurveDataTotalValue > curveDataBytesTotal; - std::shared_ptr<CurveDataCurrentValue> curveDataBytesCurrent; - - std::shared_ptr<CurveDataStatistics > curveDataItems; - std::shared_ptr<CurveDataTotalValue > curveDataItemsTotal; - std::shared_ptr<CurveDataCurrentValue> curveDataItemsCurrent; -#endif + std::shared_ptr<CurveDataStatistics > curveDataBytes; + std::shared_ptr<CurveDataStatistics > curveDataItems; + std::shared_ptr<CurveDataRectangleArea> curveDataBytesCurrent; + std::shared_ptr<CurveDataRectangleArea> curveDataItemsCurrent; + std::shared_ptr<CurveDataRectangleArea> curveDataBytesTotal; + std::shared_ptr<CurveDataRectangleArea> curveDataItemsTotal; wxString parentFrameTitleBackup; std::unique_ptr<FfsTrayIcon> trayIcon; //optional: if filled all other windows should be hidden and conversely @@ -1351,8 +1185,8 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF wxFrame* parentFrame, bool showProgress, const wxString& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory) : + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory) : TopLevelDialog(parentFrame, wxID_ANY, wxString(), wxDefaultPosition, wxDefaultSize, style), //title is overwritten anyway in setExternalStatus() pnl(*new SyncProgressPanelGenerated(this)), //ownership passed to "this" jobName_ (jobName), @@ -1363,7 +1197,7 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF abortCb_ (&abortCb), paused_ (false), finalResult(RESULT_ABORTED), //dummy value - lastStatCallSpeed(-1000000), //some big number + timeLastSpeedEstimateMs (-1000000), //some big number phaseStartMs(0) { assert_static((IsSameType<TopLevelDialog, wxFrame >::value || @@ -1414,80 +1248,48 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF catch (const TaskbarNotAvailable&) {} //hide "processed" statistics until end of process - pnl.m_notebookResult ->Hide(); + pnl.m_notebookResult ->Hide(); pnl.m_panelItemsProcessed->Hide(); - pnl.m_buttonClose ->Show(false); + pnl.m_buttonClose ->Show(false); //set std order after button visibility was set setStandardButtonOrder(*pnl.bSizerStdButtons, StdButtons().setAffirmative(pnl.m_buttonPause).setCancel(pnl.m_buttonStop)); pnl.m_bpButtonMinimizeToTray->SetBitmapLabel(getResourceImage(L"minimize_to_tray")); //init graph -#ifdef NEW_BAR_PROGRESS_GRAPH - curveDataBytesPerc = std::make_shared<CurveDataProgressBar>(); - curveDataItemsPerc = std::make_shared<CurveDataProgressBar>(); - curveDataBytes = std::make_shared<CurveDataStretchedGraph>(); - curveDataItems = std::make_shared<CurveDataStretchedGraph>(); - - pnl.m_panelGraphBytes->setAttributes(Graph2D::MainAttributes().setLabelX(Graph2D::X_LABEL_NONE).setLabelY(Graph2D::Y_LABEL_NONE).setSelectionMode(Graph2D::SELECT_NONE)); - pnl.m_panelGraphItems->setAttributes(Graph2D::MainAttributes().setLabelX(Graph2D::X_LABEL_NONE).setLabelY(Graph2D::Y_LABEL_NONE).setSelectionMode(Graph2D::SELECT_NONE)); - - pnl.m_panelGraphBytes->setCurve(curveDataBytesPerc, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(205, 255, 202)). //faint green - setColor (wxColor(12, 128, 0))); //dark green - - pnl.m_panelGraphItems->setCurve(curveDataItemsPerc, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(198, 206, 255)). //faint blue - setColor (wxColor(53, 25, 255))); //dark blue - - pnl.m_panelGraphBytes->addCurve(curveDataBytes, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(111, 255, 99)). //light green - setColor (wxColor( 20, 200, 0))); //medium green - - pnl.m_panelGraphItems->addCurve(curveDataItems, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(127, 147, 255)). //light blue - setColor (wxColor( 90, 120, 255))); //medium blue - -#else curveDataBytes = std::make_shared<CurveDataStatistics>(); - curveDataBytesTotal = std::make_shared<CurveDataTotalValue>(); - curveDataBytesCurrent = std::make_shared<CurveDataCurrentValue>(); curveDataItems = std::make_shared<CurveDataStatistics>(); - curveDataItemsTotal = std::make_shared<CurveDataTotalValue>(); - curveDataItemsCurrent = std::make_shared<CurveDataCurrentValue>(); + curveDataBytesCurrent = std::make_shared<CurveDataRectangleArea>(); + curveDataItemsCurrent = std::make_shared<CurveDataRectangleArea>(); + curveDataBytesTotal = std::make_shared<CurveDataRectangleArea>(); + curveDataItemsTotal = std::make_shared<CurveDataRectangleArea>(); const int xLabelHeight = 18; //we need to use the same height for both graphs to make sure they stretch evenly const int yLabelWidth = 70; pnl.m_panelGraphBytes->setAttributes(Graph2D::MainAttributes(). setLabelX(Graph2D::X_LABEL_BOTTOM, xLabelHeight, std::make_shared<LabelFormatterTimeElapsed>(true)). setLabelY(Graph2D::Y_LABEL_RIGHT, yLabelWidth, std::make_shared<LabelFormatterBytes>()). + setBackgroundColor(wxColor(208, 208, 208)). //light grey setSelectionMode(Graph2D::SELECT_NONE)); pnl.m_panelGraphItems->setAttributes(Graph2D::MainAttributes(). setLabelX(Graph2D::X_LABEL_BOTTOM, xLabelHeight, std::make_shared<LabelFormatterTimeElapsed>(false)). setLabelY(Graph2D::Y_LABEL_RIGHT, yLabelWidth, std::make_shared<LabelFormatterItemCount>()). + setBackgroundColor(wxColor(208, 208, 208)). //light grey setSelectionMode(Graph2D::SELECT_NONE)); - //pnl.m_panelGraphBytes->setAttributes(Graph2D::MainAttributes().setMinX(-1).setMaxX(1).setMinY(-1).setMaxY(1)); - - pnl.m_panelGraphBytes->setCurve(curveDataBytes, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(205, 255, 202)). //faint green - setColor (wxColor( 20, 200, 0))); //medium green - - pnl.m_panelGraphItems->setCurve(curveDataItems, Graph2D::CurveAttributes().setLineWidth(2). - fillCurveArea(wxColor(198, 206, 255)). //faint blue - setColor (wxColor( 90, 120, 255))); //medium blue + pnl.m_panelGraphBytes->setCurve(curveDataBytesTotal, Graph2D::CurveAttributes().setLineWidth(1).fillCurveArea(*wxWHITE).setColor(wxColor(192, 192, 192))); //medium grey + pnl.m_panelGraphItems->setCurve(curveDataItemsTotal, Graph2D::CurveAttributes().setLineWidth(1).fillCurveArea(*wxWHITE).setColor(wxColor(192, 192, 192))); //medium grey - pnl.m_panelGraphBytes->addCurve(curveDataBytesTotal, Graph2D::CurveAttributes().setLineWidth(2).setColor(wxColor(12, 128, 0))); //dark green - pnl.m_panelGraphBytes->addCurve(curveDataBytesCurrent, Graph2D::CurveAttributes().setLineWidth(1).setColor(wxColor(12, 128, 0))); // + pnl.m_panelGraphBytes->addCurve(curveDataBytesCurrent, Graph2D::CurveAttributes().setLineWidth(1).fillCurveArea(wxColor(205, 255, 202))./*faint green*/ setColor(wxColor(12, 128, 0))); //dark green + pnl.m_panelGraphItems->addCurve(curveDataItemsCurrent, Graph2D::CurveAttributes().setLineWidth(1).fillCurveArea(wxColor(198, 206, 255))./*faint blue */ setColor(wxColor(53, 25, 255))); //dark blue - pnl.m_panelGraphItems->addCurve(curveDataItemsTotal, Graph2D::CurveAttributes().setLineWidth(2).setColor(wxColor(53, 25, 255))); //dark blue - pnl.m_panelGraphItems->addCurve(curveDataItemsCurrent, Graph2D::CurveAttributes().setLineWidth(1).setColor(wxColor(53, 25, 255))); // -#endif + pnl.m_panelGraphBytes->addCurve(curveDataBytes, Graph2D::CurveAttributes().setLineWidth(2).fillCurveArea(wxColor(111, 255, 99))./*light green*/ setColor(wxColor(20, 200, 0))); //medium green + pnl.m_panelGraphItems->addCurve(curveDataItems, Graph2D::CurveAttributes().setLineWidth(2).fillCurveArea(wxColor(127, 147, 255))./*light blue */ setColor(wxColor(90, 120, 255))); //medium blue - //allow changing on completion command - pnl.m_comboBoxExecFinished->initHistory(execFinishedHistory, execFinishedHistory.size()); //-> we won't use addItemHistory() later - pnl.m_comboBoxExecFinished->setValue(execWhenFinished); + //allow changing the "on completion" command + pnl.m_comboBoxOnCompletion->initHistory(onCompletionHistory, onCompletionHistory.size()); //-> we won't use addItemHistory() later + pnl.m_comboBoxOnCompletion->setValue(onCompletion); updateDialogStatus(); //null-status will be shown while waiting for dir locks @@ -1502,7 +1304,6 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon (consider non-silent batch mode) ::SetFrontProcess(&psn); #endif - pnl.m_buttonStop->SetFocus(); //don't steal focus when starting in sys-tray! //clear gui flicker, remove dummy texts: window must be visible to make this work! @@ -1568,23 +1369,19 @@ void SyncProgressDialogImpl<TopLevelDialog>::initNewPhase() updateDialogStatus(); //evaluates "syncStat_->currentPhase()" //reset graphs (e.g. after binary comparison) -#ifdef NEW_BAR_PROGRESS_GRAPH - curveDataBytesPerc->setValue(0, 0); - curveDataItemsPerc->setValue(0, 0); -#else + curveDataBytesCurrent->setValue(0, 0); + curveDataItemsCurrent->setValue(0, 0); curveDataBytesTotal ->setValue(0, 0); - curveDataBytesCurrent->setValue(0, 0, 0); curveDataItemsTotal ->setValue(0, 0); - curveDataItemsCurrent->setValue(0, 0, 0); -#endif + curveDataBytes->clear(); curveDataItems->clear(); - notifyProgressChange(); + notifyProgressChange(); //make sure graphs get initial values //start new measurement - perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC); - lastStatCallSpeed = -1000000; //some big number + perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME_MS, WINDOW_BYTES_PER_SEC); + timeLastSpeedEstimateMs = -1000000; //some big number phaseStartMs = timeElapsed.timeMs(); @@ -1693,10 +1490,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::setExternalStatus(const wxString& s //show text in dialog title (and at the same time in taskbar) if (parentFrame_) - { if (parentFrame_->GetTitle() != title) parentFrame_->SetTitle(title); - } //always set a title: we don't wxGTK to show "nameless window" instead if (this->GetTitle() != title) @@ -1711,7 +1506,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield) return; bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary - const int64_t timeNow = timeElapsed.timeMs(); + const int64_t timeNowMs = timeElapsed.timeMs(); //sync status text setText(*pnl.m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! @@ -1748,7 +1543,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield) //add both data + obj-count, to handle "deletion-only" cases const double fraction = dataTotal + itemsTotal == 0 ? 1 : std::max(0.0, to<double>(dataCurrent + itemsCurrent) / to<double>(dataTotal + itemsTotal)); - //yes, this may legitimately become < 0: failed rename operation falls-back to copy + delete, reducing "dataCurrent" to potentially < 0! //---------------------------------------------------------------------------------------------------- //dialog caption, taskbar, systray tooltip @@ -1758,24 +1552,19 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield) if (trayIcon.get()) trayIcon->setProgress(fraction); if (taskbar_.get()) taskbar_->setProgress(fraction); -#ifdef NEW_BAR_PROGRESS_GRAPH - curveDataBytesPerc->setValue(to<double>(dataCurrent), to<double>(dataTotal)); - curveDataItemsPerc->setValue(itemsCurrent, itemsTotal); - - //(re-)set progress graph max, just in case it changed during sync - pnl.m_panelGraphBytes->setAttributes(pnl.m_panelGraphBytes->getAttributes().setMinX(0).setMaxX(to<double>(dataTotal)).setMinY(0).setMaxY(to<double>(dataTotal))); - pnl.m_panelGraphItems->setAttributes(pnl.m_panelGraphItems->getAttributes().setMinX(0).setMaxX( itemsTotal).setMinY(0).setMaxY( itemsTotal)); -#else //constant line graph - curveDataBytesTotal ->setValue(timeNow, to<double>(dataTotal)); - curveDataBytesCurrent->setValue(timeNow, to<double>(dataCurrent), to<double>(dataTotal)); - curveDataItemsTotal ->setValue(timeNow, itemsTotal); - curveDataItemsCurrent->setValue(timeNow, itemsCurrent, itemsTotal); -#endif - //even though notifyProgressChange() already set the latest data, let's add another sample to have all curves consider "timeNow" + curveDataBytesCurrent->setValue(timeNowMs / 1000.0, to<double>(dataCurrent)); + curveDataItemsCurrent->setValue(timeNowMs / 1000.0, itemsCurrent); + + //tentatively update total time, may be improved on below: + const double timeTotalSecTentative = dataTotal == dataCurrent ? timeNowMs / 1000.0 : std::max(curveDataBytesTotal->getValueX(), timeNowMs / 1000.0); + curveDataBytesTotal->setValue(timeTotalSecTentative, to<double>(dataTotal)); + curveDataItemsTotal->setValue(timeTotalSecTentative, itemsTotal); + + //even though notifyProgressChange() already set the latest data, let's add another sample to have all curves consider "timeNowMs" //no problem with adding too many records: CurveDataStatistics will remove duplicate entries! - curveDataBytes->addRecord(timeNow, to<double>(dataCurrent)); - curveDataItems->addRecord(timeNow, itemsCurrent); + curveDataBytes->addRecord(timeNowMs, to<double>(dataCurrent)); + curveDataItems->addRecord(timeNowMs, itemsCurrent); //remaining objects and data setText(*pnl.m_staticTextRemainingObj, toGuiString(itemsTotal - itemsCurrent), &layoutChanged); @@ -1785,34 +1574,43 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield) //remaining time and speed assert(perf); if (perf) - if (numeric::dist(lastStatCallSpeed, timeNow) >= 500) + if (numeric::dist(timeLastSpeedEstimateMs, timeNowMs) >= 500) { - lastStatCallSpeed = timeNow; + timeLastSpeedEstimateMs = timeNowMs; - if (numeric::dist(phaseStartMs, timeNow) >= 1000) //discard stats for first second: probably messy - perf->addSample(itemsCurrent, to<double>(dataCurrent), timeNow); + if (numeric::dist(phaseStartMs, timeNowMs) >= 1000) //discard stats for first second: probably messy + perf->addSample(itemsCurrent, to<double>(dataCurrent), timeNowMs); //current speed -> Win 7 copy uses 1 sec update interval instead Opt<std::wstring> bps = perf->getBytesPerSecond(); Opt<std::wstring> ips = perf->getItemsPerSecond(); pnl.m_panelGraphBytes->setAttributes(pnl.m_panelGraphBytes->getAttributes().setCornerText(bps ? *bps : L"", Graph2D::CORNER_TOP_LEFT)); pnl.m_panelGraphItems->setAttributes(pnl.m_panelGraphItems->getAttributes().setCornerText(ips ? *ips : L"", Graph2D::CORNER_TOP_LEFT)); - //setText(*pnl.m_staticTextSpeed, perf->getBytesPerSecond(), &layoutChanged); //remaining time: display with relative error of 10% - based on samples taken every 0.5 sec only //-> call more often than once per second to correctly show last few seconds countdown, but don't call too often to avoid occasional jitter - Opt<std::wstring> rt = perf->getRemainingTime(to<double>(dataTotal - dataCurrent)); - setText(*pnl.m_staticTextRemTime, rt ? *rt : L"-", &layoutChanged); + Opt<double> remTimeSec = perf->getRemainingTimeSec(to<double>(dataTotal - dataCurrent)); + setText(*pnl.m_staticTextRemTime, remTimeSec ? remainingTimeToString(*remTimeSec) : L"-", &layoutChanged); + + //update estimated total time marker with precision of "10% remaining time" only to avoid needless jumping around: + const double timeRemainingSec = remTimeSec ? *remTimeSec : 0; + const double timeTotalSec = timeNowMs / 1000.0 + timeRemainingSec; + if (numeric::dist(curveDataBytesTotal->getValueX(), timeTotalSec) > 0.1 * timeRemainingSec) + { + curveDataBytesTotal->setValueX(timeTotalSec); + curveDataItemsTotal->setValueX(timeTotalSec); + } } + + break; } - break; } pnl.m_panelGraphBytes->Refresh(); pnl.m_panelGraphItems->Refresh(); //time elapsed - const int64_t timeElapSec = timeNow / 1000; + const int64_t timeElapSec = timeNowMs / 1000; setText(*pnl.m_staticTextTimeElapsed, timeElapSec < 3600 ? wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") : @@ -1888,6 +1686,14 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield) template <class TopLevelDialog> void SyncProgressDialogImpl<TopLevelDialog>::updateDialogStatus() //depends on "syncStat_, paused_, finalResult" { + auto setStatusBitmap = [&](const wchar_t* bmpName, const wxString& tooltip) + { + pnl.m_bitmapStatus->SetBitmap(getResourceImage(bmpName)); + pnl.m_bitmapStatus->SetToolTip(tooltip); + pnl.m_bitmapStatus->Show(); + pnl.m_animCtrlSyncing->Hide(); + }; + const wxString dlgStatusTxt = getDialogPhaseText(syncStat_, paused_, finalResult); pnl.m_staticTextPhase->SetLabel(dlgStatusTxt); @@ -1895,16 +1701,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateDialogStatus() //depends on " //status bitmap if (syncStat_) //sync running { - auto setStatusBitmap = [&](const wchar_t* bmpName) - { - pnl.m_animCtrlSyncing->Hide(); - pnl.m_bitmapStatus->SetBitmap(getResourceImage(bmpName)); - pnl.m_bitmapStatus->SetToolTip(dlgStatusTxt); - pnl.m_bitmapStatus->Show(); - }; - if (paused_) - setStatusBitmap(L"status_pause"); + setStatusBitmap(L"status_pause", dlgStatusTxt); else switch (syncStat_->currentPhase()) { @@ -1914,11 +1712,11 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateDialogStatus() //depends on " break; case ProcessCallback::PHASE_SCANNING: - setStatusBitmap(L"status_scanning"); + setStatusBitmap(L"status_scanning", dlgStatusTxt); break; case ProcessCallback::PHASE_COMPARING_CONTENT: - setStatusBitmap(L"status_binary_compare"); + setStatusBitmap(L"status_binary_compare", dlgStatusTxt); break; case ProcessCallback::PHASE_SYNCHRONIZING: @@ -1931,14 +1729,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateDialogStatus() //depends on " } } else //sync finished - { - auto setStatusBitmap = [&](const wchar_t* bmpName, const std::wstring& tooltip) - { - pnl.m_animCtrlSyncing->Hide(); - pnl.m_bitmapStatus->SetBitmap(getResourceImage(bmpName)); - pnl.m_bitmapStatus->Show(); - pnl.m_bitmapStatus->SetToolTip(tooltip); - }; switch (finalResult) { case RESULT_ABORTED: @@ -1957,7 +1747,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateDialogStatus() //depends on " setStatusBitmap(L"status_finished_success", _("Synchronization completed successfully")); break; } - } //show status on Windows 7 taskbar if (taskbar_.get()) @@ -2069,7 +1858,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::processHasFinished(SyncResult resul //hide remaining elements... if (itemsCurrent == itemsTotal && //...if everything was processed successfully - dataCurrent == dataTotal) + dataCurrent == dataTotal) pnl.m_panelItemsRemaining->Hide(); } break; @@ -2099,7 +1888,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::processHasFinished(SyncResult resul pnl.m_buttonClose->SetFocus(); - pnl.bSizerExecFinished->Show(false); + pnl.bSizerOnCompletion->Show(false); //set std order after button visibility was set setStandardButtonOrder(*pnl.bSizerStdButtons, StdButtons().setAffirmative(pnl.m_buttonClose)); @@ -2122,7 +1911,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::processHasFinished(SyncResult resul assert(wasDetached); (void)wasDetached; pnl.m_panelProgress->Reparent(pnl.m_notebookResult); - pnl.m_notebookResult->AddPage(pnl.m_panelProgress, _("Statistics"), true); + pnl.m_notebookResult->AddPage(pnl.m_panelProgress, _("Progress"), true); //2. log file const size_t posLog = 1; @@ -2178,9 +1967,9 @@ void SyncProgressDialogImpl<TopLevelDialog>::OnCancel(wxCommandEvent& event) paused_ = false; updateDialogStatus(); //update status + pause button - //no Layout() or UI-update here to avoid cascaded Yield()-call if (abortCb_) abortCb_->requestAbortion(); + //no Layout() or UI-update here to avoid cascaded Yield()-call! } @@ -2315,18 +2104,18 @@ SyncProgressDialog* createProgressDialog(zen::AbortCallback& abortCb, wxFrame* parentWindow, //may be nullptr bool showProgress, const wxString& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory) + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory) { if (parentWindow) //sync from GUI return new SyncProgressDialogImpl<wxDialog>(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER, [&](wxDialog& progDlg) { return parentWindow; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, jobName, execWhenFinished, execFinishedHistory); + abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, jobName, onCompletion, onCompletionHistory); else //FFS batch job { auto dlg = new SyncProgressDialogImpl<wxFrame>(wxDEFAULT_FRAME_STYLE, [](wxFrame& progDlg) { return &progDlg; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, jobName, execWhenFinished, execFinishedHistory); + abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, jobName, onCompletion, onCompletionHistory); //only top level windows should have an icon: dlg->SetIcon(getFfsIcon()); diff --git a/FreeFileSync/Source/ui/progress_indicator.h b/FreeFileSync/Source/ui/progress_indicator.h index e2dbb99c..d4bbf25d 100644 --- a/FreeFileSync/Source/ui/progress_indicator.h +++ b/FreeFileSync/Source/ui/progress_indicator.h @@ -4,15 +4,14 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef PROGRESSINDICATOR_H_INCLUDED -#define PROGRESSINDICATOR_H_INCLUDED +#ifndef PROGRESS_INDICATOR_H_INCLUDED_8037493452348 +#define PROGRESS_INDICATOR_H_INCLUDED_8037493452348 #include <functional> #include <zen/error_log.h> -//#include <zen/zstring.h> +#include <zen/zstring.h> #include <wx/frame.h> #include "../lib/status_handler.h" -//#include "main_dlg.h" class CompareProgressDialog @@ -54,13 +53,13 @@ struct SyncProgressDialog virtual wxWindow* getWindowIfVisible() = 0; //may be nullptr; don't abuse, use as parent for modal dialogs only! - virtual void initNewPhase() = 0; //call after "StatusHandler::initNewPhase" - virtual void notifyProgressChange() = 0; //throw (), required by graph! - virtual void updateGui() = 0; //update GUI and process Window messages + virtual void initNewPhase () = 0; //call after "StatusHandler::initNewPhase" + virtual void notifyProgressChange() = 0; //noexcept, required by graph! + virtual void updateGui () = 0; //update GUI and process Window messages - virtual std::wstring getExecWhenFinishedCommand() const = 0; //final value (after possible user modification) + virtual Zstring getExecWhenFinishedCommand() const = 0; //final value (after possible user modification) - virtual void stopTimer() = 0; //halt all internal timers! + virtual void stopTimer () = 0; //halt all internal timers! virtual void resumeTimer() = 0; // protected: @@ -74,8 +73,8 @@ SyncProgressDialog* createProgressDialog(zen::AbortCallback& abortCb, wxFrame* parentWindow, //may be nullptr bool showProgress, const wxString& jobName, - const std::wstring& execWhenFinished, - std::vector<std::wstring>& execFinishedHistory); //changing parameter! + const Zstring& onCompletion, + std::vector<Zstring>& onCompletionHistory); //changing parameter! //DON'T delete the pointer! it will be deleted by the user clicking "OK/Cancel"/wxWindow::Destroy() after processHasFinished() or closeWindowDirectly() @@ -89,4 +88,4 @@ private: }; -#endif // PROGRESSINDICATOR_H_INCLUDED +#endif //PROGRESS_INDICATOR_H_INCLUDED_8037493452348 diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp index bd6701ed..874f982e 100644 --- a/FreeFileSync/Source/ui/small_dlgs.cpp +++ b/FreeFileSync/Source/ui/small_dlgs.cpp @@ -326,7 +326,6 @@ public: DeleteDialog(wxWindow* parent, const std::vector<zen::FileSystemObject*>& rowsOnLeft, const std::vector<zen::FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, bool& useRecycleBin); private: @@ -340,7 +339,6 @@ private: const std::vector<zen::FileSystemObject*>& rowsToDeleteOnLeft; const std::vector<zen::FileSystemObject*>& rowsToDeleteOnRight; - bool& outRefdeleteOnBothSides; bool& outRefuseRecycleBin; const TickVal tickCountStartup; }; @@ -349,12 +347,10 @@ private: DeleteDialog::DeleteDialog(wxWindow* parent, const std::vector<FileSystemObject*>& rowsOnLeft, const std::vector<FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, bool& useRecycleBin) : DeleteDlgGenerated(parent), rowsToDeleteOnLeft(rowsOnLeft), rowsToDeleteOnRight(rowsOnRight), - outRefdeleteOnBothSides(deleteOnBothSides), outRefuseRecycleBin(useRecycleBin), tickCountStartup(getTicks()) { @@ -365,16 +361,8 @@ DeleteDialog::DeleteDialog(wxWindow* parent, setMainInstructionFont(*m_staticTextHeader); - m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides); m_checkBoxUseRecycler->SetValue(useRecycleBin); - //if both sides contain same rows this checkbox is superfluous - if (rowsToDeleteOnLeft == rowsToDeleteOnRight) - { - m_checkBoxDeleteBothSides->Show(false); - m_checkBoxDeleteBothSides->SetValue(true); - } - #ifndef __WXGTK__ //wxWidgets holds portability promise by not supporting for multi-line controls...not m_textCtrlFileList->SetMaxLength(0); //allow large entries! #endif @@ -397,8 +385,7 @@ void DeleteDialog::updateGui() #endif const std::pair<Zstring, int> delInfo = zen::deleteFromGridAndHDPreview(rowsToDeleteOnLeft, - rowsToDeleteOnRight, - m_checkBoxDeleteBothSides->GetValue()); + rowsToDeleteOnRight); wxString header; if (m_checkBoxUseRecycler->GetValue()) { @@ -443,8 +430,6 @@ void DeleteDialog::OnOK(wxCommandEvent& event) return; outRefuseRecycleBin = m_checkBoxUseRecycler->GetValue(); - if (rowsToDeleteOnLeft != rowsToDeleteOnRight) - outRefdeleteOnBothSides = m_checkBoxDeleteBothSides->GetValue(); EndModal(ReturnSmallDlg::BUTTON_OKAY); } @@ -463,13 +448,11 @@ void DeleteDialog::OnUseRecycler(wxCommandEvent& event) ReturnSmallDlg::ButtonPressed zen::showDeleteDialog(wxWindow* parent, const std::vector<zen::FileSystemObject*>& rowsOnLeft, const std::vector<zen::FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, bool& useRecycleBin) { DeleteDialog confirmDeletion(parent, rowsOnLeft, rowsOnRight, - deleteOnBothSides, useRecycleBin); return static_cast<ReturnSmallDlg::ButtonPressed>(confirmDeletion.ShowModal()); } diff --git a/FreeFileSync/Source/ui/small_dlgs.h b/FreeFileSync/Source/ui/small_dlgs.h index 311a7d14..62942fd0 100644 --- a/FreeFileSync/Source/ui/small_dlgs.h +++ b/FreeFileSync/Source/ui/small_dlgs.h @@ -32,7 +32,6 @@ ReturnSmallDlg::ButtonPressed showFilterDialog(wxWindow* parent, FilterConfig& f ReturnSmallDlg::ButtonPressed showDeleteDialog(wxWindow* parent, const std::vector<FileSystemObject*>& rowsOnLeft, const std::vector<FileSystemObject*>& rowsOnRight, - bool& deleteOnBothSides, bool& useRecycleBin); ReturnSmallDlg::ButtonPressed showSyncConfirmationDlg(wxWindow* parent, diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp index 747c2701..4df77c75 100644 --- a/FreeFileSync/Source/ui/sync_cfg.cpp +++ b/FreeFileSync/Source/ui/sync_cfg.cpp @@ -16,7 +16,7 @@ #include <wx+/popup_dlg.h> #include <wx+/image_resources.h> #include "gui_generated.h" -#include "exec_finished_box.h" +#include "on_completion_box.h" #include "dir_name.h" #include "../file_hierarchy.h" #include "../lib/help_provider.h" @@ -36,8 +36,8 @@ public: CompareVariant compareVar, SyncConfig& syncCfg, const wxString& caption, - xmlAccess::OnGuiError* handleError, // - ExecWhenFinishedCfg* execWhenFinished); //optional input parameter + xmlAccess::OnGuiError* handleError, // + OnCompletionCfg* onCompletion); //optional input parameter private: virtual void OnSyncTwoWay(wxCommandEvent& event) { directionCfg.var = DirectionConfig::TWOWAY; updateGui(); } @@ -78,7 +78,7 @@ private: { SyncConfig syncCfg; xmlAccess::OnGuiError onGuiError; - std::wstring onCompletion; + Zstring onCompletion; }; void setConfig(const Config& cfg); Config getConfig() const; @@ -93,7 +93,7 @@ private: //output data SyncConfig& outSyncCfg; xmlAccess::OnGuiError* outOptOnGuiError; - ExecWhenFinishedCfg* outOptExecWhenFinished; + OnCompletionCfg* outOptOnCompletion; CompareVariant compareVar_; DirectoryName<FolderHistoryBox> versioningFolder; @@ -218,13 +218,13 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, SyncConfig& syncCfg, const wxString& title, xmlAccess::OnGuiError* handleError, - ExecWhenFinishedCfg* execWhenFinished) : + OnCompletionCfg* onCompletion) : SyncCfgDlgGenerated(parent), handleDeletion(DELETE_TO_RECYCLER), // onGuiError(ON_GUIERROR_POPUP), //dummy init outSyncCfg(syncCfg), outOptOnGuiError(handleError), - outOptExecWhenFinished(execWhenFinished), + outOptOnCompletion(onCompletion), compareVar_(compareVar), versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder/*, m_staticTextResolvedPath*/) { @@ -255,21 +255,21 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, enumVersioningStyle. add(VER_STYLE_REPLACE, _("Replace"), _("Move files and replace if existing")). - add(VER_STYLE_ADD_TIMESTAMP, _("Time stamp"), _("Append a timestamp to each file name")); + add(VER_STYLE_ADD_TIMESTAMP, _("Time stamp"), _("Append a time stamp to each file name")); //hide controls for optional parameters - if (!handleError && !execWhenFinished) //currently either both or neither are bound! + if (!handleError && !onCompletion) //currently either both or neither are bound! { bSizerExtraConfig->Show(false); Layout(); } - if (execWhenFinished) - m_comboBoxExecFinished->initHistory(*execWhenFinished->history, execWhenFinished->historyMax); + if (onCompletion) + m_comboBoxOnCompletion->initHistory(*onCompletion->history, onCompletion->historyMax); Config newCfg = { syncCfg, handleError ?* handleError : ON_GUIERROR_POPUP, - execWhenFinished ?* execWhenFinished->command : std::wstring() + onCompletion ?* onCompletion->command : Zstring() }; setConfig(newCfg); @@ -295,7 +295,7 @@ void SyncCfgDialog::setConfig(const Config& cfg) onGuiError = cfg.onGuiError; - m_comboBoxExecFinished->setValue(cfg.onCompletion); + m_comboBoxOnCompletion->setValue(cfg.onCompletion); updateGui(); } @@ -316,7 +316,7 @@ SyncCfgDialog::Config SyncCfgDialog::getConfig() const output.onGuiError = onGuiError; - output.onCompletion = m_comboBoxExecFinished->getValue(); + output.onCompletion = m_comboBoxOnCompletion->getValue(); return output; } @@ -484,11 +484,11 @@ void SyncCfgDialog::OnOkay(wxCommandEvent& event) if (outOptOnGuiError) *outOptOnGuiError = cfg.onGuiError; - if (outOptExecWhenFinished) + if (outOptOnCompletion) { - *outOptExecWhenFinished->command = cfg.onCompletion; + *outOptOnCompletion->command = cfg.onCompletion; //a good place to commit current "on completion" history item - m_comboBoxExecFinished->addItemHistory(); + m_comboBoxOnCompletion->addItemHistory(); } EndModal(ReturnSyncConfig::BUTTON_OKAY); @@ -630,13 +630,13 @@ ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(wxWindow* parent, SyncConfig& syncCfg, const wxString& title, xmlAccess::OnGuiError* handleError, // - ExecWhenFinishedCfg* execWhenFinished) //optional input parameter + OnCompletionCfg* onCompletion) //optional input parameter { SyncCfgDialog syncDlg(parent, compareVar, syncCfg, title, handleError, - execWhenFinished); + onCompletion); return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal()); } diff --git a/FreeFileSync/Source/ui/sync_cfg.h b/FreeFileSync/Source/ui/sync_cfg.h index e56a533b..96d2e3d0 100644 --- a/FreeFileSync/Source/ui/sync_cfg.h +++ b/FreeFileSync/Source/ui/sync_cfg.h @@ -22,20 +22,19 @@ struct ReturnSyncConfig }; }; -struct ExecWhenFinishedCfg +struct OnCompletionCfg { - std::wstring* command; //*must* be bound! - std::vector<std::wstring>* history; // + Zstring* command; //*must* be bound! + std::vector<Zstring>* history; // size_t historyMax; }; - ReturnSyncConfig::ButtonPressed showSyncConfigDlg(wxWindow* parent, CompareVariant compareVar, SyncConfig& syncCfg, const wxString& title, xmlAccess::OnGuiError* handleError, // - ExecWhenFinishedCfg* execWhenFinished); //optional input parameter + OnCompletionCfg* onCompletion); //optional input parameter } #endif // SYNCCONFIG_H_INCLUDED diff --git a/FreeFileSync/Source/ui/taskbar.h b/FreeFileSync/Source/ui/taskbar.h index 82e08656..65509cab 100644 --- a/FreeFileSync/Source/ui/taskbar.h +++ b/FreeFileSync/Source/ui/taskbar.h @@ -38,8 +38,8 @@ public: STATUS_PAUSED }; - void setStatus(Status status); - void setProgress(double fraction); //between [0, 1] + void setStatus(Status status); //noexcept + void setProgress(double fraction); //between [0, 1]; noexcept private: class Pimpl; diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h index 4d7b4022..38d5aa0a 100644 --- a/FreeFileSync/Source/version/version.h +++ b/FreeFileSync/Source/version/version.h @@ -3,7 +3,7 @@ namespace zen { -const wchar_t currentVersion[] = L"6.2"; //internal linkage! +const wchar_t currentVersion[] = L"6.3"; //internal linkage! } #endif diff --git a/wx+/graph.cpp b/wx+/graph.cpp index 9298b10b..1a8f4376 100644 --- a/wx+/graph.cpp +++ b/wx+/graph.cpp @@ -10,7 +10,7 @@ #include <numeric> #include <zen/basic_math.h> #include <zen/scope_guard.h> -#include <wx/settings.h> +//#include <wx/settings.h> #include "dc.h" using namespace zen; @@ -556,7 +556,7 @@ void Graph2D::render(wxDC& dc) const { //paint graph background (excluding label area) wxDCPenChanger dummy (dc, wxColour(130, 135, 144)); //medium grey, the same Win7 uses for other frame borders => not accessible! but no big deal... - wxDCBrushChanger dummy2(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + wxDCBrushChanger dummy2(dc, attr.backgroundColor); //accessibility: consider system text and background colors; small drawback: color of graphs is NOT connected to the background! => responsibility of client to use correct colors dc.DrawRectangle(graphArea); diff --git a/wx+/graph.h b/wx+/graph.h index 84aa56cf..bafbe4eb 100644 --- a/wx+/graph.h +++ b/wx+/graph.h @@ -11,6 +11,7 @@ #include <vector> #include <memory> #include <wx/panel.h> +#include <wx/settings.h> #include <zen/string_tools.h> #include <zen/optional.h> @@ -240,6 +241,7 @@ public: labelposY(Y_LABEL_LEFT), yLabelWidth(60), labelFmtY(std::make_shared<DecimalNumberFormatter>()), + backgroundColor(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)), mouseSelMode(SELECT_RECTANGLE) {} MainAttributes& setMinX(double newMinX) { minX = newMinX; minXauto = false; return *this; } @@ -269,6 +271,8 @@ public: MainAttributes& setCornerText(const wxString& txt, PosCorner pos) { cornerTexts[pos] = txt; return *this; } + MainAttributes& setBackgroundColor(const wxColour& col) { backgroundColor = col; return *this; } + MainAttributes& setSelectionMode(SelMode mode) { mouseSelMode = mode; return *this; } private: @@ -294,6 +298,7 @@ public: std::map<PosCorner, wxString> cornerTexts; + wxColour backgroundColor; SelMode mouseSelMode; }; void setAttributes(const MainAttributes& newAttr) { attr = newAttr; Refresh(); } diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp index ba725d63..09a34de0 100644 --- a/wx+/image_resources.cpp +++ b/wx+/image_resources.cpp @@ -41,6 +41,7 @@ class GlobalResources public: static GlobalResources& instance() { + //caveat: function scope static initialization is not thread-safe in VS 2010! => but we wouldn't use wxWidgets in combination with multithreading anyway! static GlobalResources inst; return inst; } diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp index 951dd3ae..8ba9eb19 100644 --- a/zen/dir_watcher.cpp +++ b/zen/dir_watcher.cpp @@ -147,13 +147,14 @@ public: dirnamePf(appendSeparator(directory)), hDir(INVALID_HANDLE_VALUE) { - hDir = ::CreateFile(applyLongPathPrefix(dirnamePf).c_str(), - FILE_LIST_DIRECTORY, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, - nullptr); + hDir = ::CreateFile(applyLongPathPrefix(dirnamePf).c_str(), //_In_ LPCTSTR lpFileName, + FILE_LIST_DIRECTORY, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_BACKUP_SEMANTICS | + FILE_FLAG_OVERLAPPED, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hDir == INVALID_HANDLE_VALUE) throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(directory)), formatSystemError(L"CreateFile", getLastError())); diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp index e7503dad..b1b2e026 100644 --- a/zen/file_handling.cpp +++ b/zen/file_handling.cpp @@ -146,14 +146,11 @@ Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string const DllFun<FunType_freeString> freeString (getDllName(), funName_freeString); if (getLockingProcesses && freeString) - { - const wchar_t* procList = nullptr; - if (getLockingProcesses(filename.c_str(), procList)) + if (const wchar_t* procList = getLockingProcesses(filename.c_str())) { ZEN_ON_SCOPE_EXIT(freeString(procList)); return procList; } - } } return Zstring(); } @@ -180,13 +177,14 @@ UInt64 zen::getFilesize(const Zstring& filename) //throw FileError return UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); else { - const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), //open handle to target of symbolic link - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory - nullptr); + //open handle to target of symbolic link + const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_BACKUP_SEMANTICS, /*needed to open a directory*/ //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hFile == INVALID_HANDLE_VALUE) throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile)); @@ -346,7 +344,7 @@ void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw File if (::rename(oldName.c_str(), newName.c_str()) != 0) { const int lastError = errno; //copy before making other system calls! - std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)); + const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)); const std::wstring errorDescr = formatSystemError(L"rename", lastError); if (lastError == EXDEV) @@ -415,10 +413,10 @@ bool have8dot3NameClash(const Zstring& filename) { const Zstring origName = afterLast(filename, FILE_NAME_SEPARATOR); //returns the whole string if ch not found const Zstring shortName = afterLast(getFilenameFmt(filename, ::GetShortPathName), FILE_NAME_SEPARATOR); //throw() returns empty string on error - const Zstring longName = afterLast(getFilenameFmt(filename, ::GetLongPathName) , FILE_NAME_SEPARATOR); // + const Zstring longName = afterLast(getFilenameFmt(filename, ::GetLongPathName ), FILE_NAME_SEPARATOR); // if (!shortName.empty() && - !longName.empty() && + !longName .empty() && EqualFilename()(origName, shortName) && !EqualFilename()(shortName, longName)) { @@ -649,7 +647,7 @@ void setFileTimeRaw(const Zstring& filename, const FILETIME& creationTime, const auto openFile = [&](bool conservativeApproach) { - return ::CreateFile(applyLongPathPrefix(filename).c_str(), + return ::CreateFile(applyLongPathPrefix(filename).c_str(), //_In_ LPCTSTR lpFileName, (conservativeApproach ? //some NAS seem to have issues with FILE_WRITE_ATTRIBUTES, even worse, they may fail silently! //http://sourceforge.net/tracker/?func=detail&atid=1093081&aid=3536680&group_id=234430 @@ -658,13 +656,13 @@ void setFileTimeRaw(const Zstring& filename, const FILETIME& creationTime, const //avoids mysterious "access denied" when using "GENERIC_READ | GENERIC_WRITE" on a read-only file, even *after* read-only was removed directly before the call! //http://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3514569&group_id=234430 //since former gives an error notification we may very well try FILE_WRITE_ATTRIBUTES second. - FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES), - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory - (procSl == ProcSymlink::DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0), //process symlinks - nullptr); + FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES), //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + (procSl == ProcSymlink::DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0) | + FILE_FLAG_BACKUP_SEMANTICS, /*needed to open a directory*/ //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile }; HANDLE hFile = INVALID_HANDLE_VALUE; @@ -815,14 +813,14 @@ void setFileTimeRaw(const Zstring& filename, const FILETIME& creationTime, const FILETIME creationTimeDbg = {}; FILETIME lastWriteTimeDbg = {}; - HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), - FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory - (procSl == ProcSymlink::DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0), - nullptr); + HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), //_In_ LPCTSTR lpFileName, + FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + (procSl == ProcSymlink::DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0) | + FILE_FLAG_BACKUP_SEMANTICS, /*needed to open a directory*/ //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile assert(hFile != INVALID_HANDLE_VALUE); ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile)); @@ -1301,13 +1299,14 @@ void zen::makeDirectoryPlain(const Zstring& directory, //throw FileError, ErrorT { #ifdef ZEN_WIN //try to copy file attributes (dereference symlinks and junctions) - const HANDLE hDirSrc = ::CreateFile(zen::applyLongPathPrefix(templateDir).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS /*needed to open a directory*/ /*| FILE_FLAG_OPEN_REPARSE_POINT -> no, we follow symlinks!*/ , - nullptr); + const HANDLE hDirSrc = ::CreateFile(zen::applyLongPathPrefix(templateDir).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + // FILE_FLAG_OPEN_REPARSE_POINT -> no, we follow symlinks! + FILE_FLAG_BACKUP_SEMANTICS, /*needed to open a directory*/ //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hDirSrc != INVALID_HANDLE_VALUE) //dereferencing a symbolic link usually fails if it is located on network drive or client is XP: NOT really an error... { ZEN_ON_SCOPE_EXIT(::CloseHandle(hDirSrc)); @@ -1324,13 +1323,16 @@ void zen::makeDirectoryPlain(const Zstring& directory, //throw FileError, ErrorT if (isEncrypted) ::EncryptFile(directory.c_str()); //seems no long path is required (check passed!) - HANDLE hDirTrg = ::CreateFile(applyLongPathPrefix(directory).c_str(), - GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - nullptr); + HANDLE hDirTrg = ::CreateFile(applyLongPathPrefix(directory).c_str(), //_In_ LPCTSTR lpFileName, + GENERIC_READ | GENERIC_WRITE, //_In_ DWORD dwDesiredAccess, + /*read access required for FSCTL_SET_COMPRESSION*/ + FILE_SHARE_READ | + FILE_SHARE_WRITE | + FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hDirTrg != INVALID_HANDLE_VALUE) { ZEN_ON_SCOPE_EXIT(::CloseHandle(hDirTrg)); @@ -1518,13 +1520,15 @@ bool canCopyAsSparse(DWORD fileAttrSource, const Zstring& targetFile) //throw () bool canCopyAsSparse(const Zstring& sourceFile, const Zstring& targetFile) //throw () { //follow symlinks! - HANDLE hSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications - nullptr, - OPEN_EXISTING, - 0, - nullptr); + HANDLE hSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | //all shared modes are required to read files that are open in other applications + FILE_SHARE_WRITE | + FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + 0, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hSource == INVALID_HANDLE_VALUE) return false; ZEN_ON_SCOPE_EXIT(::CloseHandle(hSource)); @@ -1552,13 +1556,16 @@ void copyFileWindowsSparse(const Zstring& sourceFile, catch (const FileError&) {} //open sourceFile for reading - HANDLE hFileSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, //FILE_FLAG_OVERLAPPED must not be used! - FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS, //FILE_FLAG_NO_BUFFERING should not be used! - nullptr); + HANDLE hFileSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(), //_In_ LPCTSTR lpFileName, + GENERIC_READ, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + //FILE_FLAG_OVERLAPPED must not be used! + //FILE_FLAG_NO_BUFFERING should not be used! + FILE_FLAG_SEQUENTIAL_SCAN | + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hFileSource == INVALID_HANDLE_VALUE) { const DWORD lastError = ::GetLastError(); @@ -1595,14 +1602,18 @@ void copyFileWindowsSparse(const Zstring& sourceFile, //FILE_ATTRIBUTE_ENCRYPTED -> no! //create targetFile and open it for writing - HANDLE hFileTarget = ::CreateFile(applyLongPathPrefix(targetFile).c_str(), - GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION - FILE_SHARE_DELETE, //FILE_SHARE_DELETE is required to rename file while handle is open! - nullptr, - CREATE_NEW, - FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS | (fileInfoSource.dwFileAttributes & validAttribs), + HANDLE hFileTarget = ::CreateFile(applyLongPathPrefix(targetFile).c_str(), //_In_ LPCTSTR lpFileName, + GENERIC_READ | GENERIC_WRITE, //_In_ DWORD dwDesiredAccess, + //read access required for FSCTL_SET_COMPRESSION + FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + //FILE_SHARE_DELETE is required to rename file while handle is open! + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + CREATE_NEW, //_In_ DWORD dwCreationDisposition, //FILE_FLAG_OVERLAPPED must not be used! FILE_FLAG_NO_BUFFERING should not be used! - nullptr); + (fileInfoSource.dwFileAttributes & validAttribs) | + FILE_FLAG_SEQUENTIAL_SCAN | + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hFileTarget == INVALID_HANDLE_VALUE) { const ErrorCode lastError = getLastError(); //copy before making other system calls! @@ -1804,12 +1815,10 @@ public: throw ErrorShouldCopyAsSparse(L"sparse dummy value"); if (exceptionInUserCallback) - try - { - exceptionInUserCallback(0); //should throw again!!! - assert(false); - } - catch (...) { throw; } + { + exceptionInUserCallback(0); //should throw again!!! + assert(false); // + } if (!errorMsg.first.empty()) throw FileError(errorMsg.first, errorMsg.second); @@ -1818,7 +1827,7 @@ public: private: bool shouldCopyAsSparse; // std::pair<std::wstring, std::wstring> errorMsg; //these are exclusive! - std::function<void(Int64 bytesDelta)> exceptionInUserCallback; // -> optional + std::function<void(Int64 bytesDelta)> exceptionInUserCallback; // -> optional }; @@ -1946,7 +1955,6 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize, const bool supportNonEncryptedDestination = winXpOrLater(); //encrypted destination is not supported with Windows 2000 -//const bool supportUnbufferedCopy = vistaOrLater(); //caveat: function scope static initialization is not thread-safe in VS 2010! @@ -1969,7 +1977,7 @@ void copyFileWindowsDefault(const Zstring& sourceFile, if (supportNonEncryptedDestination) copyFlags |= COPY_FILE_ALLOW_DECRYPTED_DESTINATION; //allow copying from encrypted to non-encrytped location - //if (supportUnbufferedCopy) //see http://blogs.technet.com/b/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx + //if (vistaOrLater()) //see http://blogs.technet.com/b/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx // copyFlags |= COPY_FILE_NO_BUFFERING; //no perf difference at worst, huge improvement for large files (20% in test NTFS -> NTFS) //It's a shame this flag causes file corruption! https://sourceforge.net/projects/freefilesync/forums/forum/847542/topic/5177950 //documentation on CopyFile2() even states: "It is not recommended to pause copies that are using this flag." How dangerous is this thing, why offer it at all??? diff --git a/zen/file_handling.h b/zen/file_handling.h index 48a762d7..d14ed27f 100644 --- a/zen/file_handling.h +++ b/zen/file_handling.h @@ -75,7 +75,8 @@ void copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPathMissi //Note: it MAY happen that copyFile() leaves temp files behind, e.g. temporary network drop. // => clean them up at an appropriate time (automatically set sync directions to delete them). They have the following ending: -const Zstring TEMP_FILE_ENDING = Zstr(".ffs_tmp"); + +const Zchar TEMP_FILE_ENDING[] = Zstr(".ffs_tmp"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions); //throw FileError } diff --git a/zen/file_io.cpp b/zen/file_io.cpp index fbca9089..5eab476a 100644 --- a/zen/file_io.cpp +++ b/zen/file_io.cpp @@ -33,14 +33,11 @@ Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string const DllFun<FunType_freeString> freeString (getDllName(), funName_freeString); if (getLockingProcesses && freeString) - { - const wchar_t* procList = nullptr; - if (getLockingProcesses(filename.c_str(), procList)) + if (const wchar_t* procList = getLockingProcesses(filename.c_str())) { ZEN_ON_SCOPE_EXIT(freeString(procList)); return procList; } - } } return Zstring(); } @@ -81,12 +78,12 @@ FileInput::FileInput(const Zstring& filename) : FileInputBase(filename) //throw { #ifdef ZEN_WIN const wchar_t functionName[] = L"CreateFile"; - fileHandle = ::CreateFile(applyLongPathPrefix(filename).c_str(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN, + fileHandle = ::CreateFile(applyLongPathPrefix(filename).c_str(), //_In_ LPCTSTR lpFileName, + GENERIC_READ, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_SEQUENTIAL_SCAN, //_In_ DWORD dwFlagsAndAttributes, /* possible values: (Reference http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx#caching_behavior) FILE_FLAG_NO_BUFFERING FILE_FLAG_RANDOM_ACCESS @@ -111,7 +108,7 @@ FileInput::FileInput(const Zstring& filename) : FileInputBase(filename) //throw for FFS most comparisons are probably between different disks => let's use FILE_FLAG_SEQUENTIAL_SCAN */ - nullptr); + nullptr); //_In_opt_ HANDLE hTemplateFile if (fileHandle == INVALID_HANDLE_VALUE) #elif defined ZEN_LINUX || defined ZEN_MAC checkForUnsupportedType(filename); //throw FileError; reading a named pipe would block forever! @@ -198,18 +195,20 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw Fil auto getHandle = [&](DWORD dwFlagsAndAttributes) { - return ::CreateFile(applyLongPathPrefix(filename).c_str(), - GENERIC_READ | GENERIC_WRITE, + return ::CreateFile(applyLongPathPrefix(filename).c_str(), //_In_ LPCTSTR lpFileName, + GENERIC_READ | GENERIC_WRITE, //_In_ DWORD dwDesiredAccess, /* http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx quote: When an application creates a file across a network, it is better to use GENERIC_READ | GENERIC_WRITE for dwDesiredAccess than to use GENERIC_WRITE alone. The resulting code is faster, because the redirector can use the cache manager and send fewer SMBs with more data. This combination also avoids an issue where writing to a file across a network can occasionally return ERROR_ACCESS_DENIED. */ - FILE_SHARE_DELETE, //FILE_SHARE_DELETE is required to rename file while handle is open! - nullptr, - dwCreationDisposition, - dwFlagsAndAttributes | FILE_FLAG_SEQUENTIAL_SCAN, - nullptr); + FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + //FILE_SHARE_DELETE is required to rename file while handle is open! + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + dwCreationDisposition, //_In_ DWORD dwCreationDisposition, + dwFlagsAndAttributes | + FILE_FLAG_SEQUENTIAL_SCAN, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile }; fileHandle = getHandle(FILE_ATTRIBUTE_NORMAL); diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp index 389833f2..4fe521a6 100644 --- a/zen/file_traverser.cpp +++ b/zen/file_traverser.cpp @@ -81,13 +81,14 @@ bool tryReportingItemError(Command cmd, zen::TraverseCallback& callback, const Z void getInfoFromFileSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output) //throw FileError { //open handle to target of symbolic link - HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory -> keep it even if we expect to open a file! See comment below - nullptr); + HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + //needed to open a directory -> keep it even if we expect to open a file! See comment below + nullptr); //_In_opt_ HANDLE hTemplateFile if (hFile == INVALID_HANDLE_VALUE) throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile)); @@ -117,14 +118,16 @@ DWORD retrieveVolumeSerial(const Zstring& pathName) //returns 0 on error or if s //- root paths "C:\", "D:\" //- network shares: \\share\dirname //- indirection: subst S: %USERPROFILE% - // -> GetVolumePathName()+GetVolumeInformation() OTOH incorrectly resolves "S:\Desktop\somedir" to "S:\Desktop\" - nice try... - const HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(pathName).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS /*needed to open a directory*/ /*| FILE_FLAG_OPEN_REPARSE_POINT -> no, we follow symlinks!*/ , - nullptr); + // -> GetVolumePathName() + GetVolumeInformation() OTOH incorrectly resolves "S:\Desktop\somedir" to "S:\Desktop\" - nice try... + const HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(pathName).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + // FILE_FLAG_OPEN_REPARSE_POINT -> no, we follow symlinks! + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + /*needed to open a directory*/ + nullptr); //_In_opt_ HANDLE hTemplateFile if (hDir == INVALID_HANDLE_VALUE) return 0; ZEN_ON_SCOPE_EXIT(::CloseHandle(hDir)); diff --git a/zen/file_traverser.h b/zen/file_traverser.h index d686e9b8..2944c5ba 100644 --- a/zen/file_traverser.h +++ b/zen/file_traverser.h @@ -7,7 +7,6 @@ #ifndef FILETRAVERSER_H_INCLUDED #define FILETRAVERSER_H_INCLUDED -//#include <memory> #include "zstring.h" #include "int64.h" #include "file_id_def.h" diff --git a/zen/long_path_prefix.h b/zen/long_path_prefix.h index cdff09fa..ae09c5f5 100644 --- a/zen/long_path_prefix.h +++ b/zen/long_path_prefix.h @@ -48,8 +48,8 @@ Zstring removeLongPathPrefix(const Zstring& path); //throw() //################## implementation ################## //there are two flavors of long path prefix: one for UNC paths, one for regular paths -const Zstring LONG_PATH_PREFIX = L"\\\\?\\"; -const Zstring LONG_PATH_PREFIX_UNC = L"\\\\?\\UNC"; +const wchar_t LONG_PATH_PREFIX [] = L"\\\\?\\"; //don't use Zstring as global constant: avoid static initialization order problem in global namespace! +const wchar_t LONG_PATH_PREFIX_UNC[] = L"\\\\?\\UNC"; // template <size_t maxPath> inline Zstring applyLongPathPrefixImpl(const Zstring& path) diff --git a/zen/notify_removal.cpp b/zen/notify_removal.cpp index d1fbc6ed..678675b5 100644 --- a/zen/notify_removal.cpp +++ b/zen/notify_removal.cpp @@ -13,25 +13,17 @@ using namespace zen; -namespace -{ -bool messageProviderConstructed = false; -} - - class MessageProvider //administrates a single dummy window to receive messages { public: - static MessageProvider& instance() //throw (FileError) + static MessageProvider& instance() //throw FileError { static MessageProvider inst; - messageProviderConstructed = true; return inst; } - class Listener + struct Listener { - public: virtual ~Listener() {} virtual void onMessage(UINT message, WPARAM wParam, LPARAM lParam) = 0; //throw()! }; @@ -48,7 +40,8 @@ private: static const wchar_t dummyWindowName[]; - friend LRESULT CALLBACK topWndProc(HWND, UINT, WPARAM, LPARAM); + static LRESULT CALLBACK topWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + void processMessage(UINT message, WPARAM wParam, LPARAM lParam); const HINSTANCE hMainModule; @@ -61,15 +54,15 @@ private: const wchar_t MessageProvider::dummyWindowName[] = L"E6AD5EB1-527B-4EEF-AC75-27883B233380"; //random name -LRESULT CALLBACK topWndProc(HWND hwnd, //handle to window - UINT uMsg, //message identifier - WPARAM wParam, //first message parameter - LPARAM lParam) //second message parameter +LRESULT CALLBACK MessageProvider::topWndProc(HWND hwnd, //handle to window + UINT uMsg, //message identifier + WPARAM wParam, //first message parameter + LPARAM lParam) //second message parameter { - if (messageProviderConstructed) //attention: this callback is triggered in the middle of singleton construction! It is a bad idea to to call back at this time! + if (auto pThis = reinterpret_cast<MessageProvider*>(::GetWindowLongPtr(hwnd, GWLP_USERDATA))) try { - MessageProvider::instance().processMessage(uMsg, wParam, lParam); //not supposed to throw + pThis->processMessage(uMsg, wParam, lParam); //not supposed to throw! } catch (...) { assert(false); } @@ -110,6 +103,13 @@ MessageProvider::MessageProvider() : if (!windowHandle) throw FileError(_("Unable to register to receive system messages."), formatSystemError(L"CreateWindow", getLastError())); + //store this-pointer for topWndProc() to use: do this AFTER CreateWindow() to avoid processing messages while this constructor is running!!! + //unlike: http://blogs.msdn.com/b/oldnewthing/archive/2014/02/03/10496248.aspx + ::SetLastError(ERROR_SUCCESS); //[!] required for proper error handling, see MSDN, SetWindowLongPtr + if (::SetWindowLongPtr(windowHandle, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)) == 0) + if (::GetLastError() != ERROR_SUCCESS) + throw FileError(_("Unable to register to receive system messages."), formatSystemError(L"SetWindowLongPtr", getLastError())); + guardClass.dismiss(); } @@ -125,8 +125,8 @@ MessageProvider::~MessageProvider() void MessageProvider::processMessage(UINT message, WPARAM wParam, LPARAM lParam) { - std::for_each(listener.begin(), listener.end(), - [&](Listener* ls) { ls->onMessage(message, wParam, lParam); }); + for (Listener* ls : listener) + ls->onMessage(message, wParam, lParam); } //#################################################################################################### diff --git a/zen/recycler.cpp b/zen/recycler.cpp index 11b599d4..b9245259 100644 --- a/zen/recycler.cpp +++ b/zen/recycler.cpp @@ -5,17 +5,14 @@ // ************************************************************************** #include "recycler.h" -//#include <stdexcept> -//#include <iterator> #include <zen/file_handling.h> #ifdef ZEN_WIN -//#include <algorithm> -//#include <functional> -#include <zen/dll.h> -#include <zen/assert_static.h> -#include <zen/win_ver.h> -#include <zen/long_path_prefix.h> +#include "thread.h" +#include "dll.h" +#include "assert_static.h" +#include "win_ver.h" +#include "long_path_prefix.h" #include "IFileOperation/file_op.h" #elif defined ZEN_LINUX @@ -45,7 +42,6 @@ IFileOperation - multiple files 2,1s Nevertheless, let's use IFileOperation for better error reporting (including details on locked files)! */ -const bool useIFileOperation = vistaOrLater(); //caveat: function scope static initialization is not thread-safe in VS 2010! struct CallbackData { @@ -58,7 +54,7 @@ struct CallbackData }; -bool recyclerCallback(const wchar_t* filename, void* sink) +bool onRecyclerCallback(const wchar_t* filename, void* sink) { CallbackData& cbd = *static_cast<CallbackData*>(sink); //sink is NOT optional here @@ -76,6 +72,7 @@ bool recyclerCallback(const wchar_t* filename, void* sink) } } + void zen::recycleOrDelete(const std::vector<Zstring>& filenames, const std::function<void (const Zstring& currentItem)>& notifyDeletionStatus) { if (filenames.empty()) @@ -85,7 +82,7 @@ void zen::recycleOrDelete(const std::vector<Zstring>& filenames, const std::func //both ::SHFileOperation() and ::IFileOperation() cannot delete a folder named "System Volume Information" with normal attributes but shamelessly report success //both ::SHFileOperation() and ::IFileOperation() can't handle \\?\-prefix! - if (useIFileOperation) //new recycle bin usage: available since Vista + if (vistaOrLater()) //new recycle bin usage: available since Vista { using namespace fileop; const DllFun<FunType_moveToRecycleBin> moveToRecycler(getDllName(), funName_moveToRecycleBin); @@ -100,16 +97,14 @@ void zen::recycleOrDelete(const std::vector<Zstring>& filenames, const std::func cNames.push_back(it->c_str()); CallbackData cbd(notifyDeletionStatus); - if (!moveToRecycler(&cNames[0], cNames.size(), recyclerCallback, &cbd)) + if (!moveToRecycler(&cNames[0], cNames.size(), onRecyclerCallback, &cbd)) { if (cbd.exceptionInUserCallback) - try - { - assert(notifyDeletionStatus); - notifyDeletionStatus(Zstring()); //should throw again!!! - assert(false); - } - catch (...) { throw; } + { + assert(notifyDeletionStatus); + notifyDeletionStatus(Zstring()); //should throw again!!! + assert(false); + } std::wstring filenameFmt = fmtFileName(filenames[0]); //probably not the correct file name for file lists larger than 1! if (filenames.size() > 1) @@ -174,7 +169,7 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError //implement same behavior as in Windows: if recycler is not existing, delete permanently if (error->code == G_IO_ERROR_NOT_SUPPORTED) { - struct stat fileInfo = {}; + struct ::stat fileInfo = {}; if (::lstat(filename.c_str(), &fileInfo) != 0) return false; @@ -205,7 +200,7 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError throw FileError(errorMsg, errorDescr); }; - FSRef objectRef; + FSRef objectRef = {}; //= POD structure not a pointer type! OSStatus rv = ::FSPathMakeRefWithOptions(filenameUtf8, //const UInt8 *path, kFSPathMakeRefDoNotFollowLeafSymlink, //OptionBits options, &objectRef, //FSRef *ref, @@ -222,7 +217,7 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError //implement same behavior as in Windows: if recycler is not existing, delete permanently if (rv2 == -120) //=="Directory not found or incomplete pathname." but should really be "recycle bin directory not found"! { - struct stat fileInfo = {}; + struct ::stat fileInfo = {}; if (::lstat(filename.c_str(), &fileInfo) != 0) return false; @@ -241,31 +236,53 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError #ifdef ZEN_WIN -StatusRecycler zen::recycleBinStatus(const Zstring& pathName) +bool zen::recycleBinExists(const Zstring& pathName, const std::function<void ()>& onUpdateGui) //throw FileError { - const DWORD bufferSize = MAX_PATH + 1; - std::vector<wchar_t> buffer(bufferSize); - if (!::GetVolumePathName(pathName.c_str(), //__in LPCTSTR lpszFileName, - &buffer[0], //__out LPTSTR lpszVolumePathName, - bufferSize)) //__in DWORD cchBufferLength - return STATUS_REC_UNKNOWN; + if (vistaOrLater()) + { + using namespace fileop; + const DllFun<FunType_getRecycleBinStatus> getRecycleBinStatus(getDllName(), funName_getRecycleBinStatus); + const DllFun<FunType_getLastError> getLastError (getDllName(), funName_getLastError); + + if (!getRecycleBinStatus || !getLastError) + throw FileError(replaceCpy(_("Checking recycle bin failed for folder %x."), L"%x", fmtFileName(pathName)), + replaceCpy(_("Cannot load file %x."), L"%x", fmtFileName(getDllName()))); + + bool hasRecycler = false; + if (!getRecycleBinStatus(pathName.c_str(), hasRecycler)) + throw FileError(replaceCpy(_("Checking recycle bin failed for folder %x."), L"%x", fmtFileName(pathName)), getLastError()); + + return hasRecycler; + } + else + { + //excessive runtime if recycle bin exists, is full and drive is slow: + auto ft = async([pathName]() + { + SHQUERYRBINFO recInfo = {}; + recInfo.cbSize = sizeof(recInfo); + return ::SHQueryRecycleBin(pathName.c_str(), //__in_opt LPCTSTR pszRootPath, + &recInfo); //__inout LPSHQUERYRBINFO pSHQueryRBInfo + }); - const Zstring rootPathPf = appendSeparator(&buffer[0]); + while (!ft.timed_wait(boost::posix_time::milliseconds(50))) + if (onUpdateGui) + onUpdateGui(); //may throw! + + return ft.get() == S_OK; + } - SHQUERYRBINFO recInfo = {}; - recInfo.cbSize = sizeof(recInfo); - HRESULT rv = ::SHQueryRecycleBin(rootPathPf.c_str(), //__in_opt LPCTSTR pszRootPath, - &recInfo); //__inout LPSHQUERYRBINFO pSHQueryRBInfo + //1. ::SHQueryRecycleBin() is excessive: traverses whole $Recycle.Bin directory tree each time!!!! But it's safe and correct. - return rv == S_OK ? STATUS_REC_EXISTS : STATUS_REC_MISSING; - //1. excessive: traverses whole C:\$Recycle.Bin directory tree each time!!!! But it's safe and correct. + //2. we can't simply buffer the ::SHQueryRecycleBin() based on volume serial number: + // "subst S:\ C:\" => GetVolumeInformation() returns same serial for C:\ and S:\, but S:\ does not support recycle bin! - //2. we would prefer to use CLSID_RecycleBinManager beginning with Vista... if only this interface were documented!!! + //3. we would prefer to use CLSID_RecycleBinManager beginning with Vista... if only this interface were documented!!! - //3. check directory existence of "C:\$Recycle.Bin, C:\RECYCLER, C:\RECYCLED" + //4. check directory existence of "C:\$Recycle.Bin, C:\RECYCLER, C:\RECYCLED" // -> not upward-compatible, wrong result for subst-alias: recycler assumed existing, although it is not! - //4. alternative approach a'la Raymond Chen: http://blogs.msdn.com/b/oldnewthing/archive/2008/09/18/8956382.aspx + //5. alternative approach a'la Raymond Chen: http://blogs.msdn.com/b/oldnewthing/archive/2008/09/18/8956382.aspx //caveat: might not be reliable, e.g. "subst"-alias of volume contains "$Recycle.Bin" although it is not available! /* diff --git a/zen/recycler.h b/zen/recycler.h index 8068c4ec..255f11ef 100644 --- a/zen/recycler.h +++ b/zen/recycler.h @@ -4,11 +4,11 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef RECYCLER_H_INCLUDED -#define RECYCLER_H_INCLUDED +#ifndef RECYCLER_H_INCLUDED_18345067341545 +#define RECYCLER_H_INCLUDED_18345067341545 -#include <functional> #include <vector> +#include <functional> #include <zen/file_error.h> #include <zen/zstring.h> @@ -36,14 +36,8 @@ bool recycleOrDelete(const Zstring& filename); //throw FileError, return "true" #ifdef ZEN_WIN -enum StatusRecycler -{ - STATUS_REC_EXISTS, - STATUS_REC_MISSING, - STATUS_REC_UNKNOWN -}; -StatusRecycler recycleBinStatus(const Zstring& pathName); //test existence of Recycle Bin API for certain path -//Win: blocks heavily if recycle bin is really full and drive is slow!!! +//can take a long time if recycle bin is full and drive is slow!!! => buffer volume ids! +bool recycleBinExists(const Zstring& pathName, const std::function<void ()>& onUpdateGui); //throw FileError void recycleOrDelete(const std::vector<Zstring>& filenames, //throw FileError, return "true" if file/dir was actually deleted //may throw: first exception is swallowed, updateStatus() is then called again where it should throw again and the exception will propagate as expected @@ -51,4 +45,4 @@ void recycleOrDelete(const std::vector<Zstring>& filenames, //throw FileError, r #endif } -#endif // RECYCLER_H_INCLUDED +#endif //RECYCLER_H_INCLUDED_18345067341545 diff --git a/zen/string_base.h b/zen/string_base.h index c134a6fc..23cfcdf0 100644 --- a/zen/string_base.h +++ b/zen/string_base.h @@ -4,8 +4,8 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef Z_BASE_H_INCLUDED -#define Z_BASE_H_INCLUDED +#ifndef Z_BASE_H_INCLUDED_08321745456 +#define Z_BASE_H_INCLUDED_08321745456 #include <algorithm> #include <cassert> @@ -186,9 +186,9 @@ private: //perf note: interestingly StorageDeepCopy and StorageRefCountThreadSafe show same performance in FFS comparison -template <class Char, //Character Type +template <class Char, //Character Type template <class, class> class SP = StorageRefCountThreadSafe, //Storage Policy - class AP = AllocatorOptimalSpeed> //Allocator Policy + class AP = AllocatorOptimalSpeed> //Allocator Policy class Zbase : public SP<Char, AP> { public: @@ -381,8 +381,9 @@ template <class Char, template <class, class> class SP, class AP> inline size_t Zbase<Char, SP, AP>::find(const Zbase& str, size_t pos) const { assert(pos <= length()); - const Char* thisEnd = end(); //respect embedded 0 - const Char* it = std::search(begin() + pos, thisEnd, + const size_t len = length(); + const Char* thisEnd = begin() + len; //respect embedded 0 + const Char* it = std::search(begin() + std::min(pos, len), thisEnd, str.begin(), str.end()); return it == thisEnd ? npos : it - begin(); } @@ -392,8 +393,9 @@ template <class Char, template <class, class> class SP, class AP> inline size_t Zbase<Char, SP, AP>::find(const Char* str, size_t pos) const { assert(pos <= length()); - const Char* thisEnd = end(); //respect embedded 0 - const Char* it = std::search(begin() + pos, thisEnd, + const size_t len = length(); + const Char* thisEnd = begin() + len; //respect embedded 0 + const Char* it = std::search(begin() + std::min(pos, len), thisEnd, str, str + strLength(str)); return it == thisEnd ? npos : it - begin(); } @@ -403,8 +405,9 @@ template <class Char, template <class, class> class SP, class AP> inline size_t Zbase<Char, SP, AP>::find(Char ch, size_t pos) const { assert(pos <= length()); - const Char* thisEnd = end(); - const Char* it = std::find(begin() + pos, thisEnd, ch); //respect embedded 0 + const size_t len = length(); + const Char* thisEnd = begin() + len; //respect embedded 0 + const Char* it = std::find(begin() + std::min(pos, len), thisEnd, ch); return it == thisEnd ? npos : it - begin(); } @@ -413,9 +416,8 @@ template <class Char, template <class, class> class SP, class AP> inline size_t Zbase<Char, SP, AP>::rfind(Char ch, size_t pos) const { assert(pos == npos || pos <= length()); - - const Char* currEnd = pos == npos ? end() : begin() + std::min(pos + 1, length()); - + const size_t len = length(); + const Char* currEnd = begin() + (pos == npos ? len : std::min(pos + 1, len)); const Char* it = find_last(begin(), currEnd, ch); return it == currEnd ? npos : it - begin(); } @@ -425,62 +427,15 @@ template <class Char, template <class, class> class SP, class AP> inline size_t Zbase<Char, SP, AP>::rfind(const Char* str, size_t pos) const { assert(pos == npos || pos <= length()); - const size_t strLen = strLength(str); - const Char* currEnd = pos == npos ? end() : begin() + std::min(pos + strLen, length()); - + const size_t len = length(); + const Char* currEnd = begin() + (pos == npos ? len : std::min(pos + strLen, len)); const Char* it = search_last(begin(), currEnd, str, str + strLen); return it == currEnd ? npos : it - begin(); } -/* -> dead code ahead: better use zen::replace template instead! -template <class Char, template <class, class> class SP, class AP> -Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::replace(size_t pos1, size_t n1, const Zbase& str) -{ - assert(str.data() < rawStr || rawStr + length() < str.data()); //str mustn't point to data in this string - assert(pos1 + n1 <= length()); - - const size_t n2 = str.length(); - - const size_t oldLen = length(); - if (oldLen == 0) - return *this = str; - - const size_t newLen = oldLen - n1 + n2; - - if (this->canWrite(rawStr, newLen)) - { - if (n1 < n2) //move remainder right -> std::copy_backward - { - std::copy_backward(rawStr + pos1 + n1, rawStr + oldLen + 1, rawStr + newLen + 1); //include null-termination - this->setLength(rawStr, newLen); - } - else if (n1 > n2) //shift left -> std::copy - { - std::copy(rawStr + pos1 + n1, rawStr + oldLen + 1, rawStr + pos1 + n2); //include null-termination - this->setLength(rawStr, newLen); - } - - std::copy(str.data(), str.data() + n2, rawStr + pos1); - } - else - { - //copy directly into new string - Char* const newStr = this->create(newLen); - - std::copy(rawStr, rawStr + pos1, newStr); - std::copy(str.data(), str.data() + n2, newStr + pos1); - std::copy(rawStr + pos1 + n1, rawStr + oldLen + 1, newStr + pos1 + n2); //include null-termination - - this->destroy(rawStr); - rawStr = newStr; - } - return *this; -} -*/ - template <class Char, template <class, class> class SP, class AP> inline void Zbase<Char, SP, AP>::resize(size_t newSize, Char fillChar) { @@ -558,7 +513,7 @@ size_t Zbase<Char, SP, AP>::length() const template <class Char, template <class, class> class SP, class AP> inline const Char Zbase<Char, SP, AP>::operator[](size_t pos) const { - assert(pos < length()); + assert(pos < length()); //design by contract! no runtime check! return rawStr[pos]; } @@ -712,4 +667,4 @@ Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::operator+=(Char ch) } } -#endif //Z_BASE_H_INCLUDED +#endif //Z_BASE_H_INCLUDED_08321745456 diff --git a/zen/symlink_target.h b/zen/symlink_target.h index 73d67927..4c4c3745 100644 --- a/zen/symlink_target.h +++ b/zen/symlink_target.h @@ -92,13 +92,14 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro { activatePrivilege(SE_BACKUP_NAME); } //throw FileError catch (FileError&) {} //This shall not cause an error in user mode! - const HANDLE hLink = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), - 0, //it seems we do not even need GENERIC_READ! - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, - nullptr); + const HANDLE hLink = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), //_In_ LPCTSTR lpFileName, + //it seems we do not even need GENERIC_READ! + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hLink == INVALID_HANDLE_VALUE) throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hLink)); @@ -162,13 +163,14 @@ Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError { using namespace zen; #ifdef ZEN_WIN - const HANDLE hDir = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory - nullptr); + const HANDLE hDir = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), //_In_ LPCTSTR lpFileName, + 0, //_In_ DWORD dwDesiredAccess, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode, + nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + OPEN_EXISTING, //_In_ DWORD dwCreationDisposition, + //needed to open a directory: + FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes, + nullptr); //_In_opt_ HANDLE hTemplateFile if (hDir == INVALID_HANDLE_VALUE) throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hDir)); diff --git a/zen/thread.h b/zen/thread.h index 5c6eecc5..95cdf074 100644 --- a/zen/thread.h +++ b/zen/thread.h @@ -4,8 +4,8 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef BOOST_THREAD_WRAP_H -#define BOOST_THREAD_WRAP_H +#ifndef BOOST_THREAD_WRAP_H_78963234 +#define BOOST_THREAD_WRAP_H_78963234 //temporary solution until C++11 thread becomes fully available (considering std::thread's non-interruptibility and std::async craziness, this may be NEVER) #include <memory> @@ -57,10 +57,10 @@ bool wait_for_all_timed(InputIterator first, InputIterator last, const Duration& //wait until first job is successful or all failed template <class T> -class RunUntilFirstHit +class GetFirstResult { public: - RunUntilFirstHit(); + GetFirstResult(); template <class Fun> void addJob(Fun f); //f must return a std::unique_ptr<T> containing a value if successful @@ -118,7 +118,7 @@ bool wait_for_all_timed(InputIterator first, InputIterator last, const Duration& template <class T> -class RunUntilFirstHit<T>::AsyncResult +class GetFirstResult<T>::AsyncResult { public: AsyncResult() : @@ -164,6 +164,7 @@ public: private: bool jobDone(size_t jobsTotal) const { return result_ || (jobsFinished >= jobsTotal); } //call while locked! + #ifndef NDEBUG bool returnedResult; #endif @@ -177,14 +178,14 @@ private: template <class T> inline -RunUntilFirstHit<T>::RunUntilFirstHit() : result(std::make_shared<AsyncResult>()), jobsTotal(0) {} +GetFirstResult<T>::GetFirstResult() : result(std::make_shared<AsyncResult>()), jobsTotal(0) {} template <class T> template <class Fun> inline -void RunUntilFirstHit<T>::addJob(Fun f) //f must return a std::unique_ptr<T> containing a value on success +void GetFirstResult<T>::addJob(Fun f) //f must return a std::unique_ptr<T> containing a value on success { - auto result2 = result; //MSVC 2010: this is ridiculous!!! + auto result2 = result; //capture member variable, not "this"! boost::thread t([result2, f] { result2->reportFinished(f()); }); ++jobsTotal; t.detach(); //we have to be explicit since C++11: [thread.thread.destr] ~thread() calls std::terminate() if joinable()!!! @@ -193,11 +194,11 @@ void RunUntilFirstHit<T>::addJob(Fun f) //f must return a std::unique_ptr<T> con template <class T> template <class Duration> inline -bool RunUntilFirstHit<T>::timedWait(const Duration& duration) const { return result->waitForResult(jobsTotal, duration); } +bool GetFirstResult<T>::timedWait(const Duration& duration) const { return result->waitForResult(jobsTotal, duration); } template <class T> inline -std::unique_ptr<T> RunUntilFirstHit<T>::get() const { return result->getResult(jobsTotal); } +std::unique_ptr<T> GetFirstResult<T>::get() const { return result->getResult(jobsTotal); } } -#endif //BOOST_THREAD_WRAP_H +#endif //BOOST_THREAD_WRAP_H_78963234 diff --git a/zen/type_traits.h b/zen/type_traits.h index b6e05871..f69c155a 100644 --- a/zen/type_traits.h +++ b/zen/type_traits.h @@ -142,7 +142,7 @@ struct IsArithmetic : StaticBool<IsInteger<T>::value || IsFloat<T>::value> {}; template <class U> static No& hasMember(Helper<int Fallback::*, &Helper2<U>::NAME>*); \ template <class U> static Yes& hasMember(...); \ public: \ - enum { value = sizeof(hasMember<T>(nullptr)) == sizeof(Yes) }; \ + enum { value = sizeof(hasMember<T>(nullptr)) == sizeof(Yes) }; \ }; \ \ template<class T> \ @@ -166,7 +166,7 @@ struct IsArithmetic : StaticBool<IsInteger<T>::value || IsFloat<T>::value> {}; template <class T> static Yes& hasMember(Helper<TYPE, &T::NAME>*); \ template <class T> static No& hasMember(...); \ public: \ - enum { value = sizeof(hasMember<U>(nullptr)) == sizeof(Yes) }; \ + enum { value = sizeof(hasMember<U>(nullptr)) == sizeof(Yes) }; \ }; //#################################################################### @@ -183,7 +183,7 @@ struct IsArithmetic : StaticBool<IsInteger<T>::value || IsFloat<T>::value> {}; template <class U> static Yes& hasMemberType(Helper<typename U::TYPENAME>*); \ template <class U> static No& hasMemberType(...); \ public: \ - enum { value = sizeof(hasMemberType<T>(nullptr)) == sizeof(Yes) }; \ + enum { value = sizeof(hasMemberType<T>(nullptr)) == sizeof(Yes) }; \ }; } @@ -53,8 +53,8 @@ size_t findUnicodePos(const UtfString& str, size_t unicodePos); //return positio //----------------------- implementation ---------------------------------- namespace implementation { -typedef std::uint_fast32_t CodePoint; //must be at least four bytes -typedef std::uint_fast16_t Char16; //we need an unsigned type +typedef std::uint32_t CodePoint; +typedef std::uint16_t Char16; typedef unsigned char Char8; const CodePoint LEAD_SURROGATE = 0xd800; diff --git a/zen/win_ver.h b/zen/win_ver.h index 2c5e2f81..8797b596 100644 --- a/zen/win_ver.h +++ b/zen/win_ver.h @@ -7,19 +7,28 @@ #ifndef WINDOWS_VERSION_HEADER_238470348254325 #define WINDOWS_VERSION_HEADER_238470348254325 +#include <cstdint> #include <zen/win.h> //includes "windows.h" namespace zen { -bool winXpOrLater(); -bool winServer2003orLater(); -bool vistaOrLater(); -bool win7OrLater(); -bool win8OrLater(); - - +std::uint64_t getOsVersion(); +std::uint64_t toBigOsNumber(DWORD high, DWORD low); +//version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx +const std::uint64_t osVersionWin81 = toBigOsNumber(6, 3); +const std::uint64_t osVersionWin8 = toBigOsNumber(6, 2); +const std::uint64_t osVersionWin7 = toBigOsNumber(6, 1); +const std::uint64_t osVersionWinVista = toBigOsNumber(6, 0); +const std::uint64_t osVersionWinServer2003 = toBigOsNumber(5, 2); +const std::uint64_t osVersionWinXp = toBigOsNumber(5, 1); +inline bool win81OrLater () { return getOsVersion() >= osVersionWin81; } +inline bool win8OrLater () { return getOsVersion() >= osVersionWin8; } +inline bool win7OrLater () { return getOsVersion() >= osVersionWin7; } +inline bool vistaOrLater () { return getOsVersion() >= osVersionWinVista; } +inline bool winServer2003orLater() { return getOsVersion() >= osVersionWinServer2003; } +inline bool winXpOrLater () { return getOsVersion() >= osVersionWinXp; } @@ -29,42 +38,27 @@ bool win8OrLater(); //######################### implementation ######################### -//version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx +inline +std::uint64_t toBigOsNumber(DWORD high, DWORD low) +{ + ULARGE_INTEGER tmp = {}; + tmp.HighPart = high; + tmp.LowPart = low; + + static_assert(sizeof(tmp) == sizeof(std::uint64_t), ""); + return tmp.QuadPart; +} -//2000 is version 5.0 -//XP is version 5.1 -//Server 2003 is version 5.2 -//Vista is version 6.0 -//Seven is version 6.1 -//Eight is version 6.2 -namespace impl -{ inline -bool winXyOrLater(DWORD major, DWORD minor) +std::uint64_t getOsVersion() { OSVERSIONINFO osvi = {}; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (::GetVersionEx(&osvi)) //38 ns per call! (yes, that's nano!) -> we do NOT miss C++11 thread safe statics right now... - return osvi.dwMajorVersion != major ? osvi.dwMajorVersion > major : osvi.dwMinorVersion >= minor; - return false; -} + if (!::GetVersionEx(&osvi)) //38 ns per call! (yes, that's nano!) -> we do NOT miss C++11 thread safe statics right now... + return 0; + return toBigOsNumber(osvi.dwMajorVersion, osvi.dwMinorVersion); } - -inline -bool winXpOrLater() { return impl::winXyOrLater(5, 1); } - -inline -bool winServer2003orLater() { return impl::winXyOrLater(5, 2); } - -inline -bool vistaOrLater() { return impl::winXyOrLater(6, 0); } - -inline -bool win7OrLater() { return impl::winXyOrLater(6, 1); } - -inline -bool win8OrLater() { return impl::winXyOrLater(6, 2); } } #endif //WINDOWS_VERSION_HEADER_238470348254325 diff --git a/zen/xml_io.cpp b/zen/xml_io.cpp index 4b9abc29..a8236300 100644 --- a/zen/xml_io.cpp +++ b/zen/xml_io.cpp @@ -5,16 +5,16 @@ // ************************************************************************** #include "xml_io.h" -#include <zen/file_handling.h> -#include <zen/file_io.h> -#include <zen/serialize.h> +#include "file_handling.h" +#include "file_io.h" +#include "serialize.h" using namespace zen; XmlDoc zen::loadXmlDocument(const Zstring& filename) //throw FileError { - //can't simply use zen::loadBinStream() due to the short-circuit xml-validation below! + //can't simply use zen::loadBinStream() due to the short-circuit xml-validation below! std::string stream; @@ -28,7 +28,7 @@ XmlDoc zen::loadXmlDocument(const Zstring& filename) //throw FileError stream.resize(bytesRead); if (!startsWith(stream, xmlBegin) && - !startsWith(stream, BYTE_ORDER_MARK_UTF8 + xmlBegin)) //respect BOM! + !startsWith(stream, BYTE_ORDER_MARK_UTF8 + xmlBegin)) //allow BOM! throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename))); } @@ -62,10 +62,11 @@ void zen::saveXmlDocument(const XmlDoc& doc, const Zstring& filename) //throw Fi { std::string stream = serialize(doc); //noexcept + //only update xml file if there are real changes try { if (getFilesize(filename) == stream.size()) //throw FileError - if (loadBinStream<std::string>(filename) == stream) //throw FileError + if (loadBinStream<std::string>(filename) == stream) //throw FileError return; } catch (FileError&) {} diff --git a/zen/zstring.cpp b/zen/zstring.cpp index c33ea707..8803d83e 100644 --- a/zen/zstring.cpp +++ b/zen/zstring.cpp @@ -30,6 +30,13 @@ namespace class LeakChecker //small test for memory leaks { public: + static LeakChecker& get() + { + //meyers singleton: avoid static initialization order problem in global namespace! + static LeakChecker inst; + return inst; + } + void insert(const void* ptr, size_t size) { std::lock_guard<std::mutex> dummy(lockActStrings); @@ -44,10 +51,9 @@ public: reportProblem("Serious Error: No memory available for deallocation at this location!"); } - static LeakChecker& instance() { static LeakChecker inst; return inst; } - private: LeakChecker() {} + ~LeakChecker() { if (!activeStrings.empty()) @@ -61,7 +67,7 @@ private: const std::string message = std::string("Memory leak detected!") + "\n\n" + "Candidates:\n" + leakingStrings; #ifdef ZEN_WIN - MessageBoxA(nullptr, message.c_str(), "Error", 0); + MessageBoxA(nullptr, message.c_str(), "Error", MB_SERVICE_NOTIFICATION | MB_ICONERROR); #else std::cerr << message; std::abort(); @@ -75,14 +81,14 @@ private: static std::string rawMemToString(const void* ptr, size_t size) { std::string output(reinterpret_cast<const char*>(ptr), std::min<size_t>(size, 100)); - std::replace(output.begin(), output.end(), '\0', ' '); //don't stop at 0-termination + replace(output, '\0', ' '); //don't stop at 0-termination return output; } void reportProblem(const std::string& message) //throw std::logic_error { #ifdef ZEN_WIN - ::MessageBoxA(nullptr, message.c_str(), "Error", 0); + ::MessageBoxA(nullptr, message.c_str(), "Error", MB_SERVICE_NOTIFICATION | MB_ICONERROR); #else std::cerr << message; #endif @@ -93,12 +99,12 @@ private: zen::hash_map<const void*, size_t> activeStrings; }; -//caveat: function scope static initialization is not thread-safe in VS 2010! => make sure to call at app start! -const LeakChecker& dummy = LeakChecker::instance(); +//caveat: function scope static initialization is not thread-safe in VS 2010! +auto& dummy = LeakChecker::get(); } -void z_impl::leakCheckerInsert(const void* ptr, size_t size) { LeakChecker::instance().insert(ptr, size); } -void z_impl::leakCheckerRemove(const void* ptr ) { LeakChecker::instance().remove(ptr); } +void z_impl::leakCheckerInsert(const void* ptr, size_t size) { LeakChecker::get().insert(ptr, size); } +void z_impl::leakCheckerRemove(const void* ptr ) { LeakChecker::get().remove(ptr); } #endif //NDEBUG @@ -134,18 +140,16 @@ const LCID ZSTRING_INVARIANT_LOCALE = zen::winXpOrLater() ? //try to call "CompareStringOrdinal" for low-level string comparison: unfortunately available not before Windows Vista! //by a factor ~3 faster than old string comparison using "LCMapString" -typedef int (WINAPI* CompareStringOrdinalFunc)(LPCWSTR lpString1, - int cchCount1, - LPCWSTR lpString2, - int cchCount2, - BOOL bIgnoreCase); +typedef int (WINAPI* CompareStringOrdinalFunc)(LPCWSTR lpString1, int cchCount1, + LPCWSTR lpString2, int cchCount2, BOOL bIgnoreCase); const SysDllFun<CompareStringOrdinalFunc> compareStringOrdinal = SysDllFun<CompareStringOrdinalFunc>(L"kernel32.dll", "CompareStringOrdinal"); +//caveat: function scope static initialization is not thread-safe in VS 2010! +//No global dependencies => no static initialization order problem in global namespace! } int z_impl::compareFilenamesNoCase(const wchar_t* lhs, const wchar_t* rhs, size_t sizeLhs, size_t sizeRhs) { - //caveat: function scope static initialization is not thread-safe in VS 2010! if (compareStringOrdinal) //this additional test has no noticeable performance impact { const int rv = compareStringOrdinal(lhs, //__in LPCWSTR lpString1, @@ -163,48 +167,46 @@ int z_impl::compareFilenamesNoCase(const wchar_t* lhs, const wchar_t* rhs, size_ //do NOT use "CompareString"; this function is NOT accurate (even with LOCALE_INVARIANT and SORT_STRINGSORT): for example "wei" == "weiss"!!! //the only reliable way to compare filenames (with XP) is to call "CharUpper" or "LCMapString": - const auto minSize = static_cast<unsigned int>(std::min(sizeLhs, sizeRhs)); - - if (minSize > 0) //LCMapString does not allow input sizes of 0! + auto copyToUpperCase = [](const wchar_t* strIn, wchar_t* strOut, size_t len) { - if (minSize <= MAX_PATH) //performance optimization: stack - { - wchar_t bufferA[MAX_PATH]; - wchar_t bufferB[MAX_PATH]; - - //faster than CharUpperBuff + wmemcpy or CharUpper + wmemcpy and same speed like ::CompareString() - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, //__in LCID Locale, - LCMAP_UPPERCASE, //__in DWORD dwMapFlags, - lhs, //__in LPCTSTR lpSrcStr, - minSize, //__in int cchSrc, - bufferA, //__out LPTSTR lpDestStr, - MAX_PATH) == 0) //__in int cchDest - throw std::runtime_error("Error comparing strings (LCMapString)."); - - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, rhs, minSize, bufferB, MAX_PATH) == 0) - throw std::runtime_error("Error comparing strings (LCMapString)."); - - const int rv = ::wmemcmp(bufferA, bufferB, minSize); - if (rv != 0) - return rv; - } - else //use freestore + //faster than CharUpperBuff + wmemcpy or CharUpper + wmemcpy and same speed like ::CompareString() + if (::LCMapString(ZSTRING_INVARIANT_LOCALE, //__in LCID Locale, + LCMAP_UPPERCASE, //__in DWORD dwMapFlags, + strIn, //__in LPCTSTR lpSrcStr, + static_cast<int>(len), //__in int cchSrc, + strOut, //__out LPTSTR lpDestStr, + static_cast<int>(len)) == 0) //__in int cchDest + throw std::runtime_error("Error comparing strings (LCMapString)."); + }; + + const auto minSize = std::min(sizeLhs, sizeRhs); + + auto eval = [&](wchar_t* bufL, wchar_t* bufR) + { + if (minSize > 0) //LCMapString does not allow input sizes of 0! { - std::vector<wchar_t> bufferA(minSize); - std::vector<wchar_t> bufferB(minSize); - - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, lhs, minSize, &bufferA[0], minSize) == 0) - throw std::runtime_error("Error comparing strings (LCMapString: FS)."); - - if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, rhs, minSize, &bufferB[0], minSize) == 0) - throw std::runtime_error("Error comparing strings (LCMapString: FS)."); + copyToUpperCase(lhs, bufL, minSize); + copyToUpperCase(rhs, bufR, minSize); - const int rv = ::wmemcmp(&bufferA[0], &bufferB[0], minSize); + const int rv = ::wmemcmp(bufL, bufR, minSize); if (rv != 0) return rv; } + return static_cast<int>(sizeLhs) - static_cast<int>(sizeRhs); + }; + + if (minSize <= MAX_PATH) //performance optimization: stack + { + wchar_t bufferL[MAX_PATH] = {}; + wchar_t bufferR[MAX_PATH] = {}; + return eval(bufferL, bufferR); + } + else //use freestore + { + std::vector<wchar_t> bufferL(minSize); + std::vector<wchar_t> bufferR(minSize); + return eval(&bufferL[0], &bufferR[0]); } - return static_cast<int>(sizeLhs) - static_cast<int>(sizeRhs); } } |