OSDN Git Service

Add auto-reload modified files option (#1611)
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 25 Dec 2022 12:23:16 +0000 (21:23 +0900)
committerGitHub <noreply@github.com>
Sun, 25 Dec 2022 12:23:16 +0000 (21:23 +0900)
* Add DirWatcher.*

* WIP (2)

* WIP(2)

* WIP(3)

* WIP(4)

66 files changed:
Docs/Manual/EN/Configuration.xml
Docs/Manual/EN/_VersionNumbers.xml
Docs/Manual/JP/Configuration.xml
Docs/Manual/JP/_VersionNumbers.xml
Src/DirWatcher.cpp [new file with mode: 0644]
Src/DirWatcher.h [new file with mode: 0644]
Src/HexMergeDoc.cpp
Src/ImgMergeFrm.cpp
Src/MainFrm.cpp
Src/MainFrm.h
Src/Merge.rc
Src/Merge.vcxproj
Src/Merge.vcxproj.filters
Src/MergeDoc.cpp
Src/OptionsDef.h
Src/OptionsInit.cpp
Src/PropGeneral.cpp
Src/PropGeneral.h
Src/WebPageDiffFrm.cpp
Src/resource.h
Testing/GoogleTest/DirWatcher/DirWatcher_test.cpp [new file with mode: 0644]
Testing/GoogleTest/GUITests/ConfigTest.cpp
Testing/GoogleTest/TestData/DirWatcher/Subdir1/test.txt [new file with mode: 0644]
Testing/GoogleTest/TestData/DirWatcher/Subdir2/test.txt [new file with mode: 0644]
Testing/GoogleTest/TestData/DirWatcher/test.txt [new file with mode: 0644]
Testing/GoogleTest/TestData/DirWatcher/test2.txt [new file with mode: 0644]
Testing/GoogleTest/UnitTests/UnitTests.vcxproj
Testing/GoogleTest/UnitTests/UnitTests.vcxproj.filters
Translations/TranslationsStatus.md
Translations/WinMerge/Arabic.po
Translations/WinMerge/Basque.po
Translations/WinMerge/Brazilian.po
Translations/WinMerge/Bulgarian.po
Translations/WinMerge/Catalan.po
Translations/WinMerge/ChineseSimplified.po
Translations/WinMerge/ChineseTraditional.po
Translations/WinMerge/Corsican.po
Translations/WinMerge/Croatian.po
Translations/WinMerge/Czech.po
Translations/WinMerge/Danish.po
Translations/WinMerge/Dutch.po
Translations/WinMerge/English.pot
Translations/WinMerge/Finnish.po
Translations/WinMerge/French.po
Translations/WinMerge/Galician.po
Translations/WinMerge/German.po
Translations/WinMerge/Greek.po
Translations/WinMerge/Hungarian.po
Translations/WinMerge/Italian.po
Translations/WinMerge/Japanese.po
Translations/WinMerge/Korean.po
Translations/WinMerge/Lithuanian.po
Translations/WinMerge/Norwegian.po
Translations/WinMerge/Persian.po
Translations/WinMerge/Polish.po
Translations/WinMerge/Portuguese.po
Translations/WinMerge/Romanian.po
Translations/WinMerge/Russian.po
Translations/WinMerge/Serbian.po
Translations/WinMerge/Sinhala.po
Translations/WinMerge/Slovak.po
Translations/WinMerge/Slovenian.po
Translations/WinMerge/Spanish.po
Translations/WinMerge/Swedish.po
Translations/WinMerge/Turkish.po
Translations/WinMerge/Ukrainian.po

index 769f34b..ca1b4f3 100644 (file)
     </section>
 
     <section>
+      <title>Auto-reload modified files<indexterm>
+          <primary>Auto-reload</primary>
+        </indexterm></title>
+
+      <para>Choose one of these options:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para><guilabel>Disabled</guilabel> (default): Disables automatic reloading.
+          </para>
+        </listitem>
+
+        <listitem>
+          <para><guilabel>Only on window activated</guilabel>: When the WinMerge window is activated,
+          if the file has been modified, it will reload the file. 
+          However, a message box asking if you want to reload the file will be displayed at this time.
+          If you do not want to see this message box,
+          check "Don't ask this question again" and press the Yes button.</para>
+        </listitem>
+
+        <listitem>
+          <para><guilabel>Immediately</guilabel>: Reloads the file immediately when it has been modified.
+          However, a message box asking if you want to reload the file will be displayed at this time.
+          If you do not want to see this message box,
+          check "Don't ask this question again" and press the Yes button.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+
+    <section>
       <title>Language<indexterm>
           <primary>Language</primary>
         </indexterm></title>
index 9907800..a90c3c8 100644 (file)
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!ENTITY WinMergeVersion "2.16">
-<!ENTITY ManualRevision "1.7.5">
+<!ENTITY ManualRevision "1.7.6">
index 312b3ca..4f60d8c 100644 (file)
     </section>
 
     <section>
+      <title>変更されたファイルの自動再読み込み<indexterm>
+          <primary>自動再読み込み</primary>
+        </indexterm></title>
+
+      <para>次の中から一つ選択してください:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para><guilabel>無効</guilabel> (default): 自動再読み込みを無効にします。
+          </para>
+        </listitem>
+
+        <listitem>
+          <para><guilabel>ウインドウがアクティブになった時のみ</guilabel>: WinMergeのウインドウがアクティブになった時、
+          もしファイルが変更されていれば、ファイルを再読み込みします。
+          ただし、この時ファイルを開きなおすか問い合わせるメッセージボックスが表示されます。
+          このメッセージボックスを表示したくない場合は、「再びこの質問をしない」をチェックし、
+          はいボタンを押下してください。</para>
+        </listitem>
+
+        <listitem>
+          <para><guilabel>即時</guilabel>: ファイルが変更されたとき再読み込みを即時に行います。
+          ただし、この時ファイルを開きなおすか問い合わせるメッセージボックスが表示されます。
+          このメッセージボックスを表示したくない場合は、「再びこの質問をしない」をチェックし、
+          はいボタンを押下してください。</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+
+    <section>
       <title>言語<indexterm>
           <primary>Language</primary>
         </indexterm></title>
index 9907800..a90c3c8 100644 (file)
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!ENTITY WinMergeVersion "2.16">
-<!ENTITY ManualRevision "1.7.5">
+<!ENTITY ManualRevision "1.7.6">
diff --git a/Src/DirWatcher.cpp b/Src/DirWatcher.cpp
new file mode 100644 (file)
index 0000000..729cc09
--- /dev/null
@@ -0,0 +1,322 @@
+/*
+ * @file  DirWatcher.cpp
+ *
+ * @brief Implementation for DirWatcher
+ */
+
+#include "pch.h"
+#include "DirWatcher.h"
+#include <process.h>
+#include "paths.h"
+
+struct DirEventListener
+{
+       uintptr_t id = 0;
+       bool dir = false;
+       String path;
+       std::function<void(const String&, DirWatcher::ACTION)> callback;
+};
+
+struct DirWatchee
+{
+       String path;
+       HANDLE hDir = nullptr;
+       bool watchSubtree = false;
+       std::unique_ptr<OVERLAPPED> pOverlapped;
+       std::vector<BYTE> info;
+       std::vector<DirEventListener> listeners;
+};
+
+struct DirRequest
+{
+       enum REQTYPE { ADD, DEL, EXIT = -1 };
+       REQTYPE type = EXIT;
+       DirEventListener listener;
+};
+
+DirWatcher::DirWatcher()
+       : m_hEventReq(nullptr)
+       , m_hEventResp(nullptr)
+       , m_hThread(nullptr)
+       , m_resp(S_OK)
+       , m_pReq{ new DirRequest()}
+       , m_cs{}
+{
+       InitializeCriticalSection(&m_cs);
+       m_hEventReq = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+       if (!m_hEventReq)
+               return;
+       m_hEventResp = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+       if (!m_hEventResp)
+       {
+               CloseHandle(m_hEventReq);
+               return;
+       }
+}
+
+DirWatcher::~DirWatcher()
+{
+       Clear();
+       if (m_hThread)
+       {
+               exitThread();
+       }
+       if (m_hEventReq)
+               CloseHandle(m_hEventReq);
+       if (m_hEventResp)
+               CloseHandle(m_hEventResp);
+       m_hEventReq = nullptr;
+       m_hEventResp = nullptr;
+       m_hThread = nullptr;
+       DeleteCriticalSection(&m_cs);
+}
+
+bool DirWatcher::Add(uintptr_t id, bool dir, const String& path, std::function<void(const String&, ACTION)> callback)
+{
+       EnterCriticalSection(&m_cs);
+
+       if (!m_hThread)
+               startThread();
+
+       m_pReq->type = DirRequest::ADD;
+       m_pReq->listener = { id, dir, path, callback };
+       SetEvent(m_hEventReq);
+
+       WaitForSingleObject(m_hEventResp, INFINITE);
+       ResetEvent(m_hEventResp);
+       bool result = SUCCEEDED(m_resp);
+
+       LeaveCriticalSection(&m_cs);
+       return result;
+}
+
+bool DirWatcher::Remove(uintptr_t id)
+{
+       EnterCriticalSection(&m_cs);
+
+       bool result = false;
+       if (m_hThread)
+       {
+               m_pReq->type = DirRequest::DEL;
+               m_pReq->listener.id = id;
+               SetEvent(m_hEventReq);
+
+               WaitForSingleObject(m_hEventResp, INFINITE);
+               ResetEvent(m_hEventResp);
+               result = SUCCEEDED(m_resp);
+       }
+
+       LeaveCriticalSection(&m_cs);
+       return result;
+}
+
+bool DirWatcher::startThread()
+{
+       if (m_hThread)
+               return false;
+
+       unsigned dwThreadId = 0;
+       m_hThread = reinterpret_cast<HANDLE>(
+               _beginthreadex(nullptr, 0, DirWatcherThreadProcStatic,
+                       this, 0, &dwThreadId));
+       return m_hThread != nullptr;
+}
+
+bool DirWatcher::exitThread()
+{
+       bool result = false;
+
+       EnterCriticalSection(&m_cs);
+
+       if (m_hThread)
+       {
+               m_pReq->type = DirRequest::EXIT;
+               SetEvent(m_hEventReq);
+
+               WaitForSingleObject(m_hEventResp, INFINITE);
+               ResetEvent(m_hEventResp);
+               result = SUCCEEDED(m_resp);
+
+               CloseHandle(m_hThread);
+               m_hThread = nullptr;
+       }
+
+       LeaveCriticalSection(&m_cs);
+
+       return result;
+}
+
+void DirWatcher::Clear()
+{
+       Remove(static_cast<uintptr_t>(-1));
+}
+
+unsigned DirWatcher::DirWatcherThreadProc()
+{
+       std::vector<DirWatchee> watchedDirs;
+
+       auto ReadDirAsync = [](DirWatchee& watchedDir) -> bool
+       {
+               DWORD dwBytesReturned = 0;
+               if (0 == ReadDirectoryChangesW(watchedDir.hDir, watchedDir.info.data(),
+                       static_cast<DWORD>(watchedDir.info.size()), watchedDir.watchSubtree,
+                       FILE_NOTIFY_CHANGE_FILE_NAME |
+                       FILE_NOTIFY_CHANGE_LAST_WRITE |
+                       FILE_NOTIFY_CHANGE_SIZE |
+                       FILE_NOTIFY_CHANGE_ATTRIBUTES,
+                       &dwBytesReturned, watchedDir.pOverlapped.get(), nullptr))
+                       return false;
+               return true;
+       };
+
+       auto OpenDir = [&](bool dir, const String& path, DirWatchee& watchedDir) -> bool
+       {
+               String path2 = dir ? path : paths::GetParentPath(path);
+               HANDLE hDir = CreateFile(path2.c_str(), GENERIC_READ,
+                       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                       nullptr, OPEN_EXISTING,
+                       FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
+                       nullptr);
+               if (hDir != INVALID_HANDLE_VALUE)
+               {
+                       HANDLE hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+                       if (hEvent)
+                       {
+                               watchedDir.info.resize(sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(TCHAR));
+                               watchedDir.hDir = hDir;
+                               watchedDir.path = path2;
+                               watchedDir.watchSubtree = dir;
+                               watchedDir.pOverlapped = std::make_unique<OVERLAPPED>();
+                               watchedDir.pOverlapped->hEvent = hEvent;
+                               if (ReadDirAsync(watchedDir))
+                                       return true;
+                               CloseHandle(hEvent);
+                       }
+                       CloseHandle(hDir);
+               }
+               return false;
+       };
+
+       auto OnAdd = [&](DirRequest& req)
+       {
+               DirEventListener& listener = req.listener;
+               auto it = watchedDirs.begin();
+               String path2 = listener.dir ? listener.path : paths::GetParentPath(listener.path);
+               for (; it != watchedDirs.end(); ++it)
+               {
+                       if (strutils::compare_nocase(it->path, path2) == 0 && it->watchSubtree == listener.dir)
+                               break;
+               }
+               if (it == watchedDirs.end())
+               {
+                       auto& watchedDir = watchedDirs.emplace_back();
+                       if (OpenDir(listener.dir, listener.path, watchedDir))
+                       {
+                               watchedDir.listeners.push_back(listener);
+                       }
+                       else
+                       {
+                               watchedDirs.pop_back();
+                               m_resp = HRESULT_FROM_WIN32(GetLastError());
+                       }
+               }
+               else
+               {
+                       it->listeners.push_back(listener);
+               }
+       };
+
+       auto OnDel = [&](uintptr_t id)
+       {
+               for (auto itWatchedDirs = watchedDirs.begin(); itWatchedDirs != watchedDirs.end(); )
+               {
+                       for (auto itListeners = itWatchedDirs->listeners.begin(); itListeners != itWatchedDirs->listeners.end();)
+                       {
+                               if (id == static_cast<uintptr_t>(-1) || itListeners->id == id)
+                                       itListeners = itWatchedDirs->listeners.erase(itListeners);
+                               else
+                                       ++itListeners;
+                       }
+                       if (itWatchedDirs->listeners.empty())
+                       {
+                               CloseHandle(itWatchedDirs->hDir);
+                               CloseHandle(itWatchedDirs->pOverlapped->hEvent);
+                               itWatchedDirs = watchedDirs.erase(itWatchedDirs);
+                       }
+                       else
+                       {
+                               ++itWatchedDirs;
+                       }
+               }
+       };
+
+       auto OnEvent = [&](DirWatchee& watchedDir)
+       {
+               DWORD dwNumberOfBytesTransferred = 0;
+               if (0 != GetOverlappedResult(watchedDir.hDir, watchedDir.pOverlapped.get(), &dwNumberOfBytesTransferred, TRUE))
+               {
+                       ReadDirAsync(watchedDir);
+
+                       auto* pNotifyInfo = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(watchedDir.info.data());
+                       String relpath(pNotifyInfo->FileName, pNotifyInfo->FileNameLength/sizeof(TCHAR));
+                       String path = paths::ConcatPath(watchedDir.path, relpath);
+                       for (auto& listener : watchedDir.listeners)
+                       {
+                               if (listener.dir || strutils::compare_nocase(listener.path, path) == 0)
+                               {
+                                       listener.callback(path, static_cast<ACTION>(pNotifyInfo->Action));
+                               }
+                       }
+               }
+       };
+
+       std::vector<HANDLE> handles;
+       handles.push_back(m_hEventReq);
+       bool fexit = false;
+
+       while (!fexit)
+       {
+               DWORD dwResult = WaitForMultipleObjects(static_cast<DWORD>(handles.size()), handles.data(), FALSE, INFINITE);
+               if (dwResult == WAIT_TIMEOUT || dwResult == WAIT_FAILED)
+                       break;
+               unsigned n = dwResult - WAIT_OBJECT_0;
+               if (n == 0)
+               {
+                       ResetEvent(handles[0]);
+
+                       m_resp = S_OK;
+                       DirRequest& req = *m_pReq.get();
+                       if (req.type == DirRequest::ADD)
+                       {
+                               OnDel(req.listener.id);
+                               OnAdd(req);
+                       }
+                       else if (req.type == DirRequest::DEL)
+                       {
+                               OnDel(req.listener.id);
+                       }
+                       else
+                       {
+                               fexit = true;
+                       }
+
+                       handles.clear();
+                       handles.push_back(m_hEventReq);
+                       for (auto& watchedDir : watchedDirs)
+                               handles.push_back(watchedDir.pOverlapped->hEvent);
+
+                       SetEvent(m_hEventResp);
+               }
+               else
+               {
+                       DirWatchee& watchedDir = watchedDirs[n - 1];
+                       OnEvent(watchedDir);
+               }
+       }
+       return 0;
+}
+
+unsigned __stdcall DirWatcher::DirWatcherThreadProcStatic(void *pvThis)
+{
+       return reinterpret_cast<DirWatcher *>(pvThis)->DirWatcherThreadProc();
+}
diff --git a/Src/DirWatcher.h b/Src/DirWatcher.h
new file mode 100644 (file)
index 0000000..4945482
--- /dev/null
@@ -0,0 +1,37 @@
+/** 
+ * @file  DirWatcher.h
+ *
+ * @brief Declaration file for DirWatcher
+ */
+#pragma once
+
+#include "UnicodeString.h"
+#include <map>
+#include <vector>
+#include <functional>
+#include <Windows.h>
+
+struct DirRequest;
+
+class DirWatcher
+{
+public:
+       enum ACTION { ACTION_ADDED = 1, ACTION_REMOVED, ACTION_MODIFIED, ACTION_RENAMED_OLD_NAME, ACTION_RENAMED_NEW_NAME };
+       DirWatcher();
+       ~DirWatcher();
+       bool Add(uintptr_t id, bool dir, const String& path, std::function<void(const String&, ACTION)> callback);
+       bool Remove(uintptr_t id);
+       void Clear();
+private:
+       bool startThread();
+       bool exitThread();
+       unsigned DirWatcherThreadProc();
+       static unsigned __stdcall DirWatcherThreadProcStatic(void* pParam);
+       HANDLE m_hThread;
+       HANDLE m_hEventReq;
+       HANDLE m_hEventResp;
+       HRESULT m_resp;
+       std::unique_ptr<DirRequest> m_pReq;
+       CRITICAL_SECTION m_cs;
+};
+
index 5afa038..4a663e1 100644 (file)
@@ -146,6 +146,8 @@ CHexMergeDoc::CHexMergeDoc()
  */
 CHexMergeDoc::~CHexMergeDoc()
 {      
+       GetMainFrame()->UnwatchDocuments(this);
+
        if (m_pDirDoc != nullptr)
                m_pDirDoc->MergeDocClosing(this);
 }
@@ -551,6 +553,9 @@ bool CHexMergeDoc::OpenDocs(int nFiles, const FileLocation fileloc[], const bool
                // Use verify macro to trap possible error in debug.
                VERIFY(pf->DestroyWindow());
        }
+
+       GetMainFrame()->WatchDocuments(this);
+
        return bSucceeded;
 }
 
index 05d0850..00bb72f 100644 (file)
@@ -194,6 +194,8 @@ CImgMergeFrame::CImgMergeFrame()
 
 CImgMergeFrame::~CImgMergeFrame()
 {
+       GetMainFrame()->UnwatchDocuments(this);
+
        if (m_pDirDoc != nullptr)
        {
                m_pDirDoc->MergeDocClosing(this);
@@ -260,6 +262,8 @@ bool CImgMergeFrame::OpenDocs(int nFiles, const FileLocation fileloc[], const bo
        if (GetOptionsMgr()->GetBool(OPT_SCROLL_TO_FIRST))
                m_pImgMergeWindow->FirstDiff();
 
+       GetMainFrame()->WatchDocuments(this);
+
        return true;
 }
 
index 9081583..930c45a 100644 (file)
@@ -70,6 +70,7 @@
 #include "WindowsManagerDialog.h"
 #include "ClipboardHistory.h"
 #include "locality.h"
+#include "DirWatcher.h"
 
 using std::vector;
 using boost::begin;
@@ -353,6 +354,7 @@ CMainFrame::CMainFrame()
 , m_bShowErrors(false)
 , m_lfDiff(Options::Font::Load(GetOptionsMgr(), OPT_FONT_FILECMP))
 , m_lfDir(Options::Font::Load(GetOptionsMgr(), OPT_FONT_DIRCMP))
+, m_pDirWatcher(new DirWatcher())
 {
 }
 
@@ -1681,6 +1683,7 @@ void CMainFrame::ApplyDiffOptions()
                // and rescan using new options
                pMergeDoc->RefreshOptions();
                pMergeDoc->FlushAndRescan(true);
+               GetMainFrame()->WatchDocuments(pMergeDoc);
        }
        for (auto pWebPageDiffFrame : GetAllWebPageDiffFrames())
                pWebPageDiffFrame->RefreshOptions();
@@ -2271,7 +2274,8 @@ LRESULT CMainFrame::OnCopyData(WPARAM wParam, LPARAM lParam)
 
 LRESULT CMainFrame::OnUser1(WPARAM wParam, LPARAM lParam)
 {
-       if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
+       IMergeDoc* pMergeDoc = (wParam == 0) ? GetActiveIMergeDoc() : reinterpret_cast<IMergeDoc*>(wParam);
+       if (pMergeDoc)
                pMergeDoc->CheckFileChanged();
        return 0;
 }
@@ -2438,8 +2442,11 @@ void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
        __super::OnActivateApp(bActive, hTask);
 #endif
 
-       if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
-               PostMessage(WM_USER+1);
+       if (GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES) == AUTO_RELOAD_MODIFIED_FILES_ONWINDOWACTIVATED)
+       {
+               if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+                       PostMessage(WM_USER + 1, reinterpret_cast<WPARAM>(pMergeDoc));
+       }
 }
 
 BOOL CMainFrame::CreateToolbar()
@@ -3387,6 +3394,40 @@ IMergeDoc* CMainFrame::GetActiveIMergeDoc()
        return pMergeDoc;
 }
 
+void CMainFrame::WatchDocuments(IMergeDoc* pMergeDoc)
+{
+       const int reloadType = GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES);
+       const int nFiles = pMergeDoc->GetFileCount();
+       for (int pane = 0; pane < nFiles; ++pane)
+       {
+               const String path = pMergeDoc->GetPath(pane);
+               if (!path.empty())
+               {
+                       if (reloadType == AUTO_RELOAD_MODIFIED_FILES_IMMEDIATELY)
+                       {
+                               m_pDirWatcher->Add(reinterpret_cast<uintptr_t>(pMergeDoc) + pane,
+                                       false,
+                                       pMergeDoc->GetPath(pane),
+                                       [this, pMergeDoc](const String& path, DirWatcher::ACTION action)
+                                       {
+                                               PostMessage(WM_USER + 1, reinterpret_cast<WPARAM>(pMergeDoc));
+                                       });
+                       }
+                       else
+                       {
+                               m_pDirWatcher->Remove(reinterpret_cast<uintptr_t>(pMergeDoc) + pane);
+                       }
+               }
+       }
+}
+
+void CMainFrame::UnwatchDocuments(IMergeDoc* pMergeDoc)
+{
+       const int nFiles = pMergeDoc->GetFileCount();
+       for (int pane = 0; pane < nFiles; ++pane)
+               m_pDirWatcher->Remove(reinterpret_cast<uintptr_t>(pMergeDoc) + pane);
+}
+
 void CMainFrame::UpdateDocTitle()
 {
        CDocManager* pDocManager = AfxGetApp()->m_pDocManager;
index d8a210b..b30b7cf 100644 (file)
@@ -34,6 +34,7 @@ class DropHandler;
 class CMainFrame;
 class CImgMergeFrame;
 class CWebPageDiffFrame;
+class DirWatcher;
 
 typedef std::shared_ptr<TempFile> TempFilePtr;
 
@@ -203,6 +204,9 @@ public:
        DropHandler *GetDropHandler() const { return m_pDropHandler; }
        const CTypedPtrArray<CPtrArray, CMDIChildWnd*>* GetChildArray() const { return &m_arrChild; }
        IMergeDoc* GetActiveIMergeDoc();
+       DirWatcher* GetDirWatcher() { return m_pDirWatcher.get(); }
+       void WatchDocuments(IMergeDoc* pMergeDoc);
+       void UnwatchDocuments(IMergeDoc* pMergeDoc);
 
 // Overrides
        virtual void GetMessageString(UINT nID, CString& rMessage) const;
@@ -287,6 +291,12 @@ protected:
                MENU_FOLDERCMP = 0x000004,
                MENU_ALL = MENU_MAINFRM | MENU_FILECMP | MENU_FOLDERCMP
        };
+       enum
+       {
+               AUTO_RELOAD_MODIFIED_FILES_DISABLED,
+               AUTO_RELOAD_MODIFIED_FILES_ONWINDOWACTIVATED,
+               AUTO_RELOAD_MODIFIED_FILES_IMMEDIATELY
+       };
 
        /**
         * A structure attaching a menu item, icon and menu types to apply to.
@@ -305,6 +315,7 @@ protected:
        std::unique_ptr<BCMenu> m_pWebPageMenu;
        std::vector<TempFilePtr> m_tempFiles; /**< List of possibly needed temp files. */
        DropHandler *m_pDropHandler;
+       std::unique_ptr<DirWatcher> m_pDirWatcher;
 
 // Generated message map functions
 protected:
index b44a04b..c3b2942 100644 (file)
@@ -1321,10 +1321,12 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,119,270,10\r
     CONTROL         "Close ""Select Files or Folders"" Dialog on clicking Compare button",IDC_CLOSE_WITH_OK,\r
                     "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,131,270,10\r
-    LTEXT           "Op&en-dialog Auto-Completion:",IDC_STATIC,7,145,270,10\r
-    COMBOBOX        IDC_AUTO_COMPLETE_SOURCE,7,159,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
-    LTEXT           "Language:",IDC_STATIC,7,175,270,10\r
-    COMBOBOX        IDC_LANGUAGE_LIST,7,187,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "Op&en-dialog Auto-Completion:",IDC_STATIC,7,141,270,10\r
+    COMBOBOX        IDC_AUTO_COMPLETE_SOURCE,7,152,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "Auto-&reload modified files:",IDC_STATIC,7,167,270,10\r
+    COMBOBOX        IDC_AUTO_RELOAD_MODIFIED_FILES,7,178,270,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+    LTEXT           "Language:",IDC_STATIC,7,193,270,10\r
+    COMBOBOX        IDC_LANGUAGE_LIST,7,204,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
 END\r
 \r
 IDD_EDIT_FIND DIALOGEX 30, 73, 324, 96\r
@@ -2616,6 +2618,7 @@ BEGIN
     0, 0, 100, 0,\r
     0, 0, 100, 0,\r
     0, 0, 100, 0,\r
+    0, 0, 100, 0,\r
     100, 0, 0, 0\r
 END\r
 \r
@@ -4092,6 +4095,12 @@ END
 \r
 STRINGTABLE\r
 BEGIN\r
+    IDS_AUTO_RELOAD_MODIFIED_FILES_STR1 "Only on window activated"\r
+    IDS_AUTO_RELOAD_MODIFIED_FILES_STR2 "Immediately"\r
+END\r
+\r
+STRINGTABLE\r
+BEGIN\r
     IDS_PLUGIN_ALL          "Al&l"\r
     IDS_PLUGIN_PROCESS_TYPE1 "Prettification"\r
     IDS_PLUGIN_PROCESS_TYPE2 "Content Extraction"\r
index 2a4268c..f54befe 100644 (file)
     </ClCompile>\r
     <ClCompile Include="DirAdditionalPropertiesDlg.cpp" />\r
     <ClCompile Include="DirSelectFilesDlg.cpp" />\r
+    <ClCompile Include="DirWatcher.cpp">\r
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>\r
+    </ClCompile>\r
     <ClCompile Include="InternalPlugins.cpp">\r
       <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>\r
     <ClInclude Include="Common\Bitmap.h" />\r
     <ClInclude Include="charsets.h" />\r
     <ClInclude Include="DirAdditionalPropertiesDlg.h" />\r
+    <ClInclude Include="DirWatcher.h" />\r
     <ClInclude Include="DirItemIterator.h" />\r
     <ClInclude Include="DirSelectFilesDlg.h" />\r
     <ClInclude Include="HashCalc.h" />\r
index b287d8e..4746519 100644 (file)
     <ClCompile Include="WebPageDiffBar.cpp">\r
       <Filter>MFCGui\MDIChild\WebPageCompare\Source Files</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="DirWatcher.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="charsets.h">\r
     <ClInclude Include="WebPageDiffBar.h">\r
       <Filter>MFCGui\MDIChild\WebPageCompare\Header Files</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="DirWatcher.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="res\binarydiff.ico">\r
index c9d2373..4d11b3b 100644 (file)
@@ -187,6 +187,8 @@ CMergeDoc::CMergeDoc()
  */
 CMergeDoc::~CMergeDoc()
 {      
+       GetMainFrame()->UnwatchDocuments(this);
+
        if (m_pDirDoc != nullptr)
        {
                m_pDirDoc->MergeDocClosing(this);
@@ -3333,6 +3335,8 @@ bool CMergeDoc::OpenDocs(int nFiles, const FileLocation ifileloc[],
        if (m_pView[0][0] != nullptr)
                m_pView[0][0]->RepaintLocationPane();
 
+       GetMainFrame()->WatchDocuments(this);
+
        return true;
 }
 
index 6bf4be4..2c273a0 100644 (file)
@@ -114,6 +114,8 @@ inline const String OPT_CUSTOM_TEMP_PATH {_T("Settings/CustomTempPath"s)};
 inline const String OPT_SPLIT_HORIZONTALLY {_T("Settings/SplitHorizontally"s)};
 inline const String OPT_FILE_SIZE_THRESHOLD {_T("Settings/OPT_FILE_SIZE_THRESHOLD"s)};
 
+inline const String OPT_AUTO_RELOAD_MODIFIED_FILES {_T("Settings/AutoReloadModifiedFiles"s)};
+
 // Color options
 // The difference color
 inline const String OPT_CLR_DIFF {_T("Settings/DifferenceColor"s)};
index 5d95bbc..f24cce0 100644 (file)
@@ -88,6 +88,7 @@ void Init(COptionsMgr *pOptions)
        pOptions->InitOption(OPT_SPLIT_HORIZONTALLY, false);
        pOptions->InitOption(OPT_RENDERING_MODE, -1, 0, 6);
        pOptions->InitOption(OPT_FILE_SIZE_THRESHOLD, 64*1024*1024);
+       pOptions->InitOption(OPT_AUTO_RELOAD_MODIFIED_FILES, 1);
 
        pOptions->InitOption(OPT_WORDDIFF_HIGHLIGHT, true);
        pOptions->InitOption(OPT_BREAK_SEPARATORS, _T(".,:;?[](){}<=>`'!\"#$%&^~\\|@+-*/"));
index 784ff71..84cd232 100644 (file)
@@ -38,6 +38,7 @@ PropGeneral::PropGeneral(COptionsMgr *optionsMgr)
        , m_bPreserveFiletime(false)
        , m_bShowSelectFolderOnStartup(false)
        , m_bCloseWithOK(true)
+       , m_nFileReloadMode(0)
 {
 }
 
@@ -77,6 +78,15 @@ BOOL PropGeneral::OnInitDialog()
 
        pWnd->SetCurSel(m_nSingleInstance);
 
+       pWnd = (CComboBox*)GetDlgItem(IDC_AUTO_RELOAD_MODIFIED_FILES);
+       ASSERT(pWnd != nullptr);
+
+       pWnd->AddString(_("Disabled").c_str());
+       pWnd->AddString(_("Only on window activated").c_str());
+       pWnd->AddString(_("Immediately").c_str());
+
+       pWnd->SetCurSel(m_nFileReloadMode);
+
        m_ctlLangList.SetDroppedWidth(600);
        m_ctlLangList.EnableWindow(FALSE);
        m_asyncLanguagesLoader = Concurrent::CreateTask([hwnd = m_hWnd] {
@@ -101,6 +111,7 @@ void PropGeneral::DoDataExchange(CDataExchange* pDX)
        DDX_Check(pDX, IDC_PRESERVE_FILETIME, m_bPreserveFiletime);
        DDX_Check(pDX, IDC_STARTUP_FOLDER_SELECT, m_bShowSelectFolderOnStartup);
        DDX_Check(pDX, IDC_CLOSE_WITH_OK, m_bCloseWithOK);
+       DDX_CBIndex(pDX, IDC_AUTO_RELOAD_MODIFIED_FILES, m_nFileReloadMode);
        DDX_Control(pDX, IDC_LANGUAGE_LIST, m_ctlLangList);
        //}}AFX_DATA_MAP
 }
@@ -127,6 +138,7 @@ void PropGeneral::ReadOptions()
        m_bPreserveFiletime = GetOptionsMgr()->GetBool(OPT_PRESERVE_FILETIMES);
        m_bShowSelectFolderOnStartup = GetOptionsMgr()->GetBool(OPT_SHOW_SELECT_FILES_AT_STARTUP);
        m_bCloseWithOK = GetOptionsMgr()->GetBool(OPT_CLOSE_WITH_OK);
+       m_nFileReloadMode = GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES);
 }
 
 /** 
@@ -144,6 +156,7 @@ void PropGeneral::WriteOptions()
        GetOptionsMgr()->SaveOption(OPT_PRESERVE_FILETIMES, m_bPreserveFiletime);
        GetOptionsMgr()->SaveOption(OPT_SHOW_SELECT_FILES_AT_STARTUP, m_bShowSelectFolderOnStartup);
        GetOptionsMgr()->SaveOption(OPT_CLOSE_WITH_OK, m_bCloseWithOK);
+       GetOptionsMgr()->SaveOption(OPT_AUTO_RELOAD_MODIFIED_FILES, m_nFileReloadMode);
        int index = m_ctlLangList.GetCurSel();
        if (index >= 0)
        {
index 920ba25..e58cc46 100644 (file)
@@ -30,6 +30,7 @@ public:
        bool  m_bScroll;
        bool  m_bScrollToFirstInlineDiff;
        int   m_nSingleInstance;
+       int   m_nFileReloadMode;
        bool  m_bVerifyPaths;
        int   m_nCloseWindowWithEsc;
        bool  m_bAskMultiWindowClose;
index 26c79bf..9160f74 100644 (file)
@@ -166,6 +166,8 @@ CWebPageDiffFrame::CWebPageDiffFrame()
 
 CWebPageDiffFrame::~CWebPageDiffFrame()
 {
+       GetMainFrame()->UnwatchDocuments(this);
+
        if (m_pDirDoc != nullptr)
        {
                m_pDirDoc->MergeDocClosing(this);
@@ -227,6 +229,8 @@ bool CWebPageDiffFrame::OpenDocs(int nFiles, const FileLocation fileloc[], const
 
        GetParent()->ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_DRAWFRAME);
 
+       GetMainFrame()->WatchDocuments(this);
+
        return true;
 }
 
index 730c7d9..f1ff3eb 100644 (file)
 #define IDC_PATH0_READONLY              1606\r
 #define IDC_PATH1_READONLY              1607\r
 #define IDC_PATH2_READONLY              1608\r
+#define IDC_AUTO_RELOAD_MODIFIED_FILES            1609\r
 #define IDC_MARKER0_COLOR_LABEL         1611\r
 #define IDC_MARKER1_COLOR_LABEL         1612\r
 #define IDC_MARKER2_COLOR_LABEL         1613\r
 #define IDS_IGNSUB_STR5                 44178\r
 #define IDS_SINGLEINSTANCE_STR1         44179\r
 #define IDS_SINGLEINSTANCE_STR2         44180\r
+#define IDS_AUTO_RELOAD_MODIFIED_FILES_STR1 44181\r
+#define IDS_AUTO_RELOAD_MODIFIED_FILES_STR2 44182\r
 #define IDS_PLUGIN_ALL                  44200\r
 #define IDS_PLUGIN_PROCESS_TYPE1        44201\r
 #define IDS_PLUGIN_PROCESS_TYPE2        44202\r
diff --git a/Testing/GoogleTest/DirWatcher/DirWatcher_test.cpp b/Testing/GoogleTest/DirWatcher/DirWatcher_test.cpp
new file mode 100644 (file)
index 0000000..78e0795
--- /dev/null
@@ -0,0 +1,73 @@
+#include "pch.h"
+#include <gtest/gtest.h>
+#include <vector>
+#include "UnicodeString.h"
+#include "DirWatcher.h"
+
+using std::vector;
+
+// TODO:
+// - add helper functions for checking the changes in registry
+
+namespace
+{
+       // The fixture for testing command line parsing.
+       class DirWatcherTest : public testing::Test
+       {
+       protected:
+               // You can remove any or all of the following functions if its body
+               // is   empty.
+
+               DirWatcherTest()
+               {
+                       // You can do set-up work for each test here.
+               }
+
+               virtual ~DirWatcherTest()
+               {
+                       // You can do clean-up work     that doesn't throw exceptions here.
+               }
+
+               // If   the     constructor     and     destructor are not enough for setting up
+               // and cleaning up each test, you can define the following methods:
+
+               virtual void SetUp()
+               {
+                       // Code here will be called     immediately     after the constructor (right
+                       // before each test).
+               }
+
+               virtual void TearDown()
+               {
+                       // Code here will be called     immediately     after each test (right
+                       // before the destructor).
+               }
+
+               // Objects declared here can be used by all tests in the test case for Foo.
+       };
+
+       TEST_F(DirWatcherTest, Add)
+       {
+               DirWatcher watcher;
+               int counter = 0;
+               bool completed = false;
+               auto func = [&](const String& path, DirWatcher::ACTION action) {
+                       wprintf(L"path=%s action=%d\n", path.c_str(), action);
+                       counter++;
+                       if (counter >= 10)
+                               completed = true;
+               };
+               EXPECT_TRUE(watcher.Add(1, true,  L"..\\TestData\\DirWatcher\\", func));
+               EXPECT_TRUE(watcher.Add(2, true,  L"..\\TestData\\DirWatcher\\", func));
+               EXPECT_TRUE(watcher.Add(3, false, L"..\\TestData\\DirWatcher\\test.txt", func));
+               EXPECT_TRUE(watcher.Add(4, false, L"..\\TestData\\DirWatcher\\test2.txt", func));
+
+               SetFileAttributes(L"..\\TestData\\DirWatcher\\test2.txt", FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY);
+               SetFileAttributes(L"..\\TestData\\DirWatcher\\test2.txt", FILE_ATTRIBUTE_NORMAL);
+               SetFileAttributes(L"..\\TestData\\DirWatcher\\Subdir1\\test.txt", FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY);
+               SetFileAttributes(L"..\\TestData\\DirWatcher\\Subdir1\\test.txt", FILE_ATTRIBUTE_NORMAL);
+
+               while (!completed)
+                       Sleep(1);
+       }
+}
\ No newline at end of file
index 2a9001f..668f93a 100644 (file)
@@ -198,6 +198,7 @@ namespace
                { OPT_CUSTOM_TEMP_PATH, varprop::VT_STRING, {}, {L"", L"c:\\tmp"}},
                { OPT_SPLIT_HORIZONTALLY, varprop::VT_BOOL, {}, {}},
                { OPT_FILE_SIZE_THRESHOLD, varprop::VT_INT, {0xffff, 0x7fffffff}, {}},
+               { OPT_AUTO_RELOAD_MODIFIED_FILES, varprop::VT_INT, {0, 2}, {}},
                //
                { OPT_DIRCLR_USE_COLORS, varprop::VT_BOOL, {}, {}},
                { OPT_COLOR_SCHEME, varprop::VT_STRING, {}, {L"", L"Default", L"Modern", L"Solarized Dark", L"Solarized Light"}},
diff --git a/Testing/GoogleTest/TestData/DirWatcher/Subdir1/test.txt b/Testing/GoogleTest/TestData/DirWatcher/Subdir1/test.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Testing/GoogleTest/TestData/DirWatcher/Subdir2/test.txt b/Testing/GoogleTest/TestData/DirWatcher/Subdir2/test.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Testing/GoogleTest/TestData/DirWatcher/test.txt b/Testing/GoogleTest/TestData/DirWatcher/test.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Testing/GoogleTest/TestData/DirWatcher/test2.txt b/Testing/GoogleTest/TestData/DirWatcher/test2.txt
new file mode 100644 (file)
index 0000000..e69de29
index b56a2b4..9411842 100644 (file)
       <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
     </ClCompile>
     <ClCompile Include="..\..\..\Src\DirTravel.cpp" />
+    <ClCompile Include="..\..\..\Src\DirWatcher.cpp">
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+      <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
+    </ClCompile>
     <ClCompile Include="..\..\..\Src\Environment.cpp">
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
       <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
       <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
     </ClCompile>
+    <ClCompile Include="..\DirWatcher\DirWatcher_test.cpp" />
     <ClCompile Include="..\PropertySystem\PropertySystem_test.cpp" />
     <ClCompile Include="..\ShellFileOperations\ShellFileOperations_test.cpp">
       <PrecompiledHeader>Use</PrecompiledHeader>
     <ClInclude Include="..\..\..\Src\DiffItemList.h" />
     <ClInclude Include="..\..\..\Src\DirItem.h" />
     <ClInclude Include="..\..\..\Src\DirTravel.h" />
+    <ClInclude Include="..\..\..\Src\DirWatcher.h" />
     <ClInclude Include="..\..\..\Src\Environment.h" />
     <ClInclude Include="..\..\..\Src\Common\ExConverter.h" />
     <ClInclude Include="..\..\..\Src\FileFilter.h" />
index b753bbe..b84447a 100644 (file)
     <ClCompile Include="..\..\..\Src\diffutils\src\context.c">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\DirWatcher\DirWatcher_test.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Src\DirWatcher.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\Src\CompareEngines\ByteComparator.h">
     <ClInclude Include="..\..\..\Src\PropertySystem.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\Src\DirWatcher.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file
index 672fa1d..8f0b8b1 100644 (file)
@@ -1,48 +1,48 @@
 # Translations Status
 
-Status from **2022-12-21**:
+Status from **2022-12-25**:
 
 ## WinMerge
 
 | Language             | Total | Translated | Fuzzy | Untranslated | Complete | Last Update |
 |:---------------------|------:|-----------:|------:|-------------:|---------:|:-----------:|
-| Arabic               |  1237 |        897 |     0 |          340 |     72 % |  2019-12-30 |
-| Basque               |  1237 |        639 |     0 |          598 |     51 % |  2013-02-03 |
-| Brazilian            |  1237 |       1237 |     0 |            0 |    100 % |  2022-11-18 |
-| Bulgarian            |  1237 |       1021 |     0 |          216 |     82 % |  2021-06-28 |
-| Catalan              |  1237 |       1187 |     0 |           50 |     95 % |             |
-| ChineseSimplified    |  1237 |       1235 |     0 |            2 |     99 % |             |
-| ChineseTraditional   |  1237 |       1125 |     0 |          112 |     90 % |  2022-02-19 |
-| Corsican             |  1237 |       1236 |     0 |            1 |     99 % |  2022-10-17 |
-| Croatian             |  1237 |        631 |     1 |          605 |     51 % |  2009-02-13 |
-| Czech                |  1237 |        606 |     0 |          631 |     48 % |             |
-| Danish               |  1237 |        640 |     0 |          597 |     51 % |  2013-01-13 |
-| Dutch                |  1237 |       1197 |     0 |           40 |     96 % |  2018-09-06 |
-| English              |  1237 |       1237 |     0 |            0 |    100 % |  2022-12-18 |
-| Finnish              |  1237 |       1198 |     0 |           39 |     96 % |             |
-| French               |  1237 |       1236 |     0 |            1 |     99 % |  2022-10-26 |
-| Galician             |  1237 |       1236 |     0 |            1 |     99 % |  2022-11-20 |
-| German               |  1237 |       1237 |     0 |            0 |    100 % |  2022-12-18 |
-| Greek                |  1237 |        605 |     0 |          632 |     48 % |             |
-| Hungarian            |  1237 |       1236 |     0 |            1 |     99 % |  2021-03-15 |
-| Italian              |  1237 |       1106 |     0 |          131 |     89 % |  2022-06-01 |
-| Japanese             |  1237 |       1237 |     0 |            0 |    100 % |  2022-09-14 |
-| Korean               |  1237 |       1197 |     0 |           40 |     96 % |  2022-02-02 |
-| Lithuanian           |  1237 |       1193 |     0 |           44 |     96 % |  2022-10-17 |
-| Norwegian            |  1237 |        731 |     0 |          506 |     59 % |             |
-| Persian              |  1237 |        642 |     0 |          595 |     51 % |  2013-08-15 |
-| Polish               |  1237 |       1216 |     0 |           21 |     98 % |  2022-11-10 |
-| Portuguese           |  1237 |       1236 |     0 |            1 |     99 % |  2022-10-17 |
-| Romanian             |  1237 |        561 |    44 |          632 |     48 % |             |
-| Russian              |  1237 |       1235 |     0 |            2 |     99 % |  2022-07-27 |
-| Serbian              |  1237 |        633 |     0 |          604 |     51 % |             |
-| Sinhala              |  1237 |        564 |    58 |          615 |     50 % |  2010-12-12 |
-| Slovak               |  1237 |       1197 |     0 |           40 |     96 % |  2022-02-17 |
-| Slovenian            |  1237 |       1237 |     0 |            0 |    100 % |  2022-12-20 |
-| Spanish              |  1237 |       1174 |     1 |           62 |     94 % |  2022-07-30 |
-| Swedish              |  1237 |       1236 |     0 |            1 |     99 % |  2022-12-02 |
-| Turkish              |  1237 |       1236 |     0 |            1 |     99 % |  2022-11-10 |
-| Ukrainian            |  1237 |        637 |     0 |          600 |     51 % |  2009-06-13 |
+| Arabic               |  1240 |        897 |     0 |          343 |     72 % |  2019-12-30 |
+| Basque               |  1240 |        639 |     0 |          601 |     51 % |  2013-02-03 |
+| Brazilian            |  1240 |       1237 |     0 |            3 |     99 % |  2022-11-18 |
+| Bulgarian            |  1240 |       1021 |     0 |          219 |     82 % |  2021-06-28 |
+| Catalan              |  1240 |       1187 |     0 |           53 |     95 % |             |
+| ChineseSimplified    |  1240 |       1235 |     0 |            5 |     99 % |             |
+| ChineseTraditional   |  1240 |       1125 |     0 |          115 |     90 % |  2022-02-19 |
+| Corsican             |  1240 |       1237 |     0 |            3 |     99 % |  2022-12-24 |
+| Croatian             |  1240 |        631 |     1 |          608 |     50 % |  2009-02-13 |
+| Czech                |  1240 |        606 |     0 |          634 |     48 % |             |
+| Danish               |  1240 |        640 |     0 |          600 |     51 % |  2013-01-13 |
+| Dutch                |  1240 |       1197 |     0 |           43 |     96 % |  2018-09-06 |
+| English              |  1240 |       1240 |     0 |            0 |    100 % |  2022-12-25 |
+| Finnish              |  1240 |       1198 |     0 |           42 |     96 % |             |
+| French               |  1240 |       1236 |     0 |            4 |     99 % |  2022-10-26 |
+| Galician             |  1240 |       1236 |     0 |            4 |     99 % |  2022-11-20 |
+| German               |  1240 |       1237 |     0 |            3 |     99 % |  2022-12-18 |
+| Greek                |  1240 |        605 |     0 |          635 |     48 % |             |
+| Hungarian            |  1240 |       1236 |     0 |            4 |     99 % |  2021-03-15 |
+| Italian              |  1240 |       1106 |     0 |          134 |     89 % |  2022-06-01 |
+| Japanese             |  1240 |       1240 |     0 |            0 |    100 % |  2022-09-14 |
+| Korean               |  1240 |       1197 |     0 |           43 |     96 % |  2022-02-02 |
+| Lithuanian           |  1240 |       1194 |     0 |           46 |     96 % |  2022-12-20 |
+| Norwegian            |  1240 |        731 |     0 |          509 |     58 % |             |
+| Persian              |  1240 |        642 |     0 |          598 |     51 % |  2013-08-15 |
+| Polish               |  1240 |       1216 |     0 |           24 |     98 % |  2022-11-10 |
+| Portuguese           |  1240 |       1236 |     0 |            4 |     99 % |  2022-10-17 |
+| Romanian             |  1240 |        561 |    44 |          635 |     48 % |             |
+| Russian              |  1240 |       1235 |     0 |            5 |     99 % |  2022-07-27 |
+| Serbian              |  1240 |        633 |     0 |          607 |     51 % |             |
+| Sinhala              |  1240 |        564 |    58 |          618 |     50 % |  2010-12-12 |
+| Slovak               |  1240 |       1197 |     0 |           43 |     96 % |  2022-02-17 |
+| Slovenian            |  1240 |       1237 |     0 |            3 |     99 % |  2022-12-20 |
+| Spanish              |  1240 |       1174 |     1 |           65 |     94 % |  2022-07-30 |
+| Swedish              |  1240 |       1236 |     0 |            4 |     99 % |  2022-12-02 |
+| Turkish              |  1240 |       1236 |     0 |            4 |     99 % |  2022-11-10 |
+| Ukrainian            |  1240 |        637 |     0 |          603 |     51 % |  2009-06-13 |
 
 ## ShellExtension
 
index f03bfb8..361309c 100644 (file)
@@ -1164,6 +1164,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "فتح نافذة الإكمال التلقائي:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "اللغة:"
 
@@ -3898,6 +3901,12 @@ msgstr "السماح بتشغيل عنصر واحد فقط"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 026247f..ab8a3ff 100644 (file)
@@ -1422,6 +1422,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Ireki-elkarrizketa Berez-&Osaketa:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4505,6 +4508,12 @@ msgstr "Ahalbidetu ekinbide bat bakarrik "
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 08e80fd..4294fbf 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr "Fechar o Diálogo \"Selecionar Arquivos ou Pastas\" ao clicar no botão
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Au&to-Conclusão do Diálogo-Abrir:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Idioma:"
 
@@ -3580,6 +3583,12 @@ msgstr "Permitir só uma instância a ser executada"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permitir só uma instância a ser executada e esperar a instância encerrar"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Tu&do"
 
index c3dd715..685631e 100644 (file)
@@ -1158,6 +1158,9 @@ msgstr "Затваряне „Избиране на файлове или пап
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Автоматично &довършване в „Избиране на файлове или папки“:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Език:"
 
@@ -3982,6 +3985,12 @@ msgstr "Позволи само едно стартирано копие"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index fe16f96..70b170d 100644 (file)
@@ -1419,6 +1419,9 @@ msgstr "Tanca el diàlec \"Selecciona fitxers o directoris\" al fer clic en comp
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Autocompletar al diàleg d'obrir:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "Idioma:"
@@ -4660,6 +4663,12 @@ msgstr "Permet d'executar només una instància"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permet d'executar només una instància i espera que la instància acabi"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Tot"
 
index f72e3f9..fba3e7d 100644 (file)
@@ -1162,6 +1162,9 @@ msgstr "在点击比较按钮时关闭“选择文件或文件夹”对话框"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "“打开”对话框的自动完成(&E):"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "语言:"
 
@@ -4002,6 +4005,12 @@ msgstr "只允许运行一个实例"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "只允许运行一个实例并等待该实例结束"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "全部(&L)"
 
index 6591ce8..20053db 100644 (file)
@@ -1428,6 +1428,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "「開啟」對話方塊之自動完成 (&E):"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "語言:"
@@ -4659,6 +4662,12 @@ msgstr "不能同時執行一個以上本程式"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "全部 (&L)"
 
index c9a3830..8c10770 100644 (file)
@@ -1163,6 +1163,9 @@ msgstr "Chjode a finestra « Selezziunà schedarii o cartulari » cù u button
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "&Empiimentu autumaticu di a finestra d’apertura :"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Lingua :"
 
@@ -3973,6 +3976,12 @@ msgstr "Permette l’esecuzione d’una instanza unica di u prugramma"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permette l’esecuzione d’una instanza unica di u prugramma è aspettà ch’ella si compii"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "T&utti"
 
index 9caf90c..c5e223c 100644 (file)
@@ -1419,6 +1419,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Otvori dijalog &samodovršenja"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4504,6 +4507,12 @@ msgstr "Samo jedna instanca WinMerge-a"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 2126b8e..78f3c71 100644 (file)
@@ -1419,6 +1419,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Automatické &dokončování:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4437,6 +4440,12 @@ msgstr "Povolit pouze jedno hlavní okno aplikace"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 7335a57..ff40c9a 100644 (file)
@@ -1420,6 +1420,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Å&ben-dialog Auto-fuldførelse:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4542,6 +4545,12 @@ msgstr "Tillad kun et eksempel ad gangen"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index e1fef9e..5ad5048 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr "\"Bestanden of mappen selecteren\" sluiten bij klikken op Vergelijken"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Auto-aanvullen openen-venster:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Language:"
 
@@ -3982,6 +3985,12 @@ msgstr ""
 "Slechts één draaiende instantie toestaan en wachten totdat de instantie "
 "beëindigd is"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Alles"
 
index f1d3576..f83c8bf 100644 (file)
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: WinMerge\n"
 "Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
-"POT-Creation-Date: 2022-12-18 17:41+0000\n"
+"POT-Creation-Date: 2022-12-25 15:41+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
@@ -1155,6 +1155,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr ""
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr ""
 
@@ -3574,6 +3577,12 @@ msgstr ""
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index c142e29..d9263b3 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr ""
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Kieli:"
 
@@ -3994,6 +3997,12 @@ msgstr ""
 "Salli vain yhden instanssin suorittaminen ja odota, että instanssi "
 "lopetetaan"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "K&aikki"
 
index bb62558..cf02529 100644 (file)
@@ -1426,6 +1426,9 @@ msgstr "Fermez la boîte de dialogue \"sélectionner les fichiers ou dossiers\"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Remplissage de la boîte de dialogue d'ouverture :"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "Langage :"
@@ -4687,6 +4690,12 @@ msgstr "Permettre une seule instance en exécution"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Autoriser une seule instance à s'exécuter et attendre que l'instance se termine"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Al&l"
 
index 5b912b8..e4d3ebd 100644 (file)
@@ -1423,6 +1423,9 @@ msgstr "Pechar o diálogo \"Selecciona ficheiros ou carpetas\" ao premer o botó
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "A&utocompletar diálogo de apertura:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "Idioma:"
@@ -4682,6 +4685,12 @@ msgstr "Permitir executar só unha instancia"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permitir só a execución dunha instancia e esperar a que a instancia remate"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Todo&s"
 
index 0b0a38e..2635b04 100644 (file)
@@ -1423,6 +1423,9 @@ msgstr "Öffnen-Dialog beim &Klick auf 'Vergleichen' schließen"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Öffnen-Dialog Auto&vervollständigung:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "&Sprache:"
@@ -4300,6 +4303,12 @@ msgstr "Nur eine Instanz zulassen"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Nur eine Instanz zulassen und warten, bis die Instanz beendet ist"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "A&lle"
 
index 06a0f8d..97545a3 100644 (file)
@@ -1418,6 +1418,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Αυτόματη συμπλήρωση διαλόγου αν&οίγματος"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4482,6 +4485,12 @@ msgstr "Επιτρέπεται μόνο μία υπόσταση του WinMerge
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 8ed2ad1..2367138 100644 (file)
@@ -1421,6 +1421,9 @@ msgstr "\"Fájlok vagy könyvtárak választása\" ablak bezárása az Összehas
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Automatikus kiegészítés fájl megnyitásánál:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "Nyelv:"
@@ -4643,6 +4646,12 @@ msgstr "Csak egy példány futhat egyszerre"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Csak egy példány futhat és megvárja, amíg a példány leáll"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Összes"
 
index 592e4bb..edfb556 100644 (file)
@@ -1159,6 +1159,9 @@ msgstr "Visualizza la finestra “Seleziona file o cartelle” quando si fa clic
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Com&pletamento automatico selezione file:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Lingua:"
 
@@ -3939,6 +3942,12 @@ msgstr "Permetti l'esecuzione di un'unica istanza del programma"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permetti l'esecuzione di un'unica istanza del programma e attendi che termini"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index ed0074c..67b9d4d 100644 (file)
@@ -1160,6 +1160,9 @@ msgstr "[比較] 押下時に [ファイルまたはフォルダーの選択] 
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "[開く] ダイアログのオートコンプリート(&E):"
 
+msgid "Auto-&reload modified files:"
+msgstr "変更されたファイルの自動再読み込み(&R):"
+
 msgid "Language:"
 msgstr "言語:"
 
@@ -3964,6 +3967,12 @@ msgstr "1 つのみインスタンスを起動する"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "1 つのみインスタンスを起動し、既起動インスタンスの終了を待つ"
 
+msgid "Only on window activated"
+msgstr "ウインドウがアクティブになった時のみ"
+
+msgid "Immediately"
+msgstr "即時"
+
 msgid "Al&l"
 msgstr "すべて(&L)"
 
index dec7dca..dce3c5e 100644 (file)
@@ -1427,6 +1427,9 @@ msgstr "비교 버튼 누를 때 \"파일 또는 폴더 선택\" 대화 상자 
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "열기 대화 상자 자동 완성(&E):"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr "언어:"
@@ -4648,6 +4651,12 @@ msgstr "중복 실행 금지하기"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "중복 실행 금지 및 기존 실행 종료 대기"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "전체(&L)"
 
index 02520b7..17fdd22 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr "Užverti „Parinkite failus ar katalogus“ po „Lyginti“ paspaudimo
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Lango „Atv&erti“ automatinis užpildymas:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Kalba:"
 
@@ -3580,6 +3583,12 @@ msgstr "Leisti vykdyti tik vieną programos egzempliorių"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Leisti vykdyti tik vieną programos egzempliorių ir sulaukti, kol jo vykdymas baigsis"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Visi"
 
index 1c47d28..5475ccd 100644 (file)
@@ -1160,6 +1160,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Auto-fullførelse for Å&pne-dialog:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr ""
 
@@ -3967,6 +3970,12 @@ msgstr "Tillat bare en instans å kjøre"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 335b573..8560a67 100644 (file)
@@ -1422,6 +1422,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "&p بازکردن پنجره محاوره اتمام خودکار "
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4551,6 +4554,12 @@ msgstr "اجازه اجراي همزمان تنها يک نسخه از نرم ا
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 95bf391..b1bc352 100644 (file)
@@ -1162,6 +1162,9 @@ msgstr "Zamknij okno \"wybierz pliki lub foldery\" przyciskiem Porównaj"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Otwórz okno automatycznego uzu&pełniania:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Język:"
 
@@ -3581,6 +3584,12 @@ msgstr "Zezwól na uruchomienie tylko jednej instancji programu"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Zezwól na uruchomienie tylko jednej instancji i poczekaj, aż zakończy pracę"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Wszystkie"
 
index da38e49..23d19cc 100644 (file)
@@ -1164,6 +1164,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Abrir janela de auto-conclusão:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Idioma:"
 
@@ -4050,6 +4053,12 @@ msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 "Permitir apenas executar uma instância e esperar que a instância termine"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Tu&do"
 
index 915c4da..77169ea 100644 (file)
@@ -1419,6 +1419,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Auto-completare în dialogul de deschidere:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4487,6 +4490,12 @@ msgstr "Permite rularea unei singure instanţe"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index 340fb56..285a23d 100644 (file)
@@ -1163,6 +1163,9 @@ msgstr "Закрывать диалог \"Выбрать файлы или па
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Автозавершение в диалоге открытия:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Язык:"
 
@@ -3582,6 +3585,12 @@ msgstr "Разрешить запуск только одной копии"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Разрешить запуск только одной копии и дожидаться ее завершения"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Все"
 
index 0b93f8a..59dd00e 100644 (file)
@@ -1406,6 +1406,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Отвори дијалог самодовршења:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4476,6 +4479,12 @@ msgstr "Дозволи само једну покренуту надлежнос
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index a12f7b6..fd244bb 100644 (file)
@@ -1419,6 +1419,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Op&en-dialog Auto-Completion:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4505,6 +4508,12 @@ msgstr "එක් දෘෂ්ටාන්තයක් පමණක් සිද
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index f9b77d3..93d2ede 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr "Kliknutím na tlačidlo Porovnať zatvoriť dialógové okno „Vybrať
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Automatické dopĺňanie v dialógu &Otvoriť:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Jazyk:"
 
@@ -3938,6 +3941,12 @@ msgstr "Povoliť spustenie iba jednej inštancie"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Povolí spustenie iba jednej inštancie a počká, kým sa inštancia ukončí"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "Al&l"
 
index 1b34586..8fc41f9 100644 (file)
@@ -1161,6 +1161,9 @@ msgstr "Zapri okno 'Izberi datoteke ali mape' s klikom na gumb 'Primerjaj'"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Odpri pogovorno okno &Samodejno dokončanje:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Jezik:"
 
@@ -3963,6 +3966,12 @@ msgstr "Dovoli zagon samo enega primerka programa"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Dovoli zagon le enega primerka, in počakaj, da se primerek dokonča"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "V&se"
 
index e9a805f..81fd320 100644 (file)
@@ -1164,6 +1164,9 @@ msgstr "Cerrar \"Seleccione Archivos o Carpetas\" al hacer clic en Comparar"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "A&uto-completar en diálogos de apertura:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Idioma:"
 
@@ -3965,6 +3968,12 @@ msgstr "Permitir solo una instancia en ejecución"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Permitir únicamente una instancia en ejecución y esperar a que termine ejecución"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""
 
index cdc62ef..e1e6714 100644 (file)
@@ -1162,6 +1162,9 @@ msgstr "Stäng \"Välj filer eller mapp\" dialogen då ''Jämför'' klickas"
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Automatisk komplettering för Öppna-dialog:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Språk:"
 
@@ -3963,6 +3966,12 @@ msgstr "Tillåt endast att en instans körs"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Tillåt endast att en instans körs och vänta på den att avsluta"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "AI&I"
 
index c82ed6a..e88fd2d 100644 (file)
@@ -1162,6 +1162,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Aç &penceresi otomatik olarak doldurulsun:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 msgid "Language:"
 msgstr "Dil:"
 
@@ -4033,6 +4036,12 @@ msgstr "Yalnız bir kopya çalışsın"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr "Yalnız bir kopyanın çalışsın ve kopyanın sonlandırılması beklensin"
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr "&Tümü"
 
index d6a7213..b2c0156 100644 (file)
@@ -1420,6 +1420,9 @@ msgstr ""
 msgid "Op&en-dialog Auto-Completion:"
 msgstr "Діалог Автоматичного доповнення:"
 
+msgid "Auto-&reload modified files:"
+msgstr ""
+
 #, c-format
 msgid "Language:"
 msgstr ""
@@ -4508,6 +4511,12 @@ msgstr "Дозволити запуск лише однієї копії"
 msgid "Allow only one instance to run and wait for the instance to terminate"
 msgstr ""
 
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
 msgid "Al&l"
 msgstr ""