OSDN Git Service

Improve plugin system (editor script) (#871)
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Thu, 15 Jul 2021 23:35:40 +0000 (08:35 +0900)
committerGitHub <noreply@github.com>
Thu, 15 Jul 2021 23:35:40 +0000 (08:35 +0900)
57 files changed:
Plugins/dlls/editor addin.sct
Src/DirView.cpp
Src/FileTransform.cpp
Src/FileTransform.h
Src/HexMergeDoc.cpp
Src/ImgMergeFrm.cpp
Src/InternalPlugins.cpp
Src/MainFrm.cpp
Src/Merge.rc
Src/MergeDoc.cpp
Src/MergeEditView.cpp
Src/MergeEditView.h
Src/OpenView.cpp
Src/Plugins.cpp
Src/Plugins.h
Src/SelectPluginDlg.cpp
Src/SelectPluginDlg.h
Src/resource.h
Translations/TranslationsStatus.html
Translations/TranslationsStatus.md
Translations/TranslationsStatus.xml
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/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 da41130..a5ba189 100644 (file)
@@ -144,13 +144,6 @@ Function regRead(Key, DefaultValue)
        regRead = wsh.RegRead(Key)
 End Function
 
-Function IsLangJapanese()
-       Dim languageId
-       On Error Resume Next
-       languageId = CLng(regRead(WinMergeRegKeyPath & "Locale\LanguageId", 1033))
-       IsLangJapanese = (languageId = 1041)
-End Function
-
 Function ReplaceVariables(str)
        Dim newstr
        Dim pos
@@ -380,11 +373,7 @@ Function ExecFilterCommand(Text)
        Dim cmd
        If IsFirstArgumentEmpty() Then
                cmd = regRead(PluginRegKeyPath & "ExecFilterCommand", "")
-               If IsLangJapanese() Then
-                       cmd = InputBox("\83t\83B\83\8b\83^\83R\83}\83\93\83h\82ð\93ü\97Í\82µ\82Ä\82­\82¾\82³\82¢", "ExecFilterCommand", cmd)
-               Else
-                       cmd = InputBox("Enter filter command", "ExecFilterCommand", cmd)
-               End If
+               cmd = InputBox("Enter filter command", "ExecFilterCommand", cmd)
                If cmd <> "" Then
                        wsh.RegWrite PluginRegKeyPath & "ExecFilterCommand", cmd
                End If
@@ -393,11 +382,7 @@ Function ExecFilterCommand(Text)
                cmd = arguments
        End If
        If cmd = "" Then
-               If IsLangJapanese() Then
-                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
-               Else
-                       Err.Raise 30001, , "Canceled"
-               End If
+               Err.Raise 30001, , "Canceled"
                Exit Function
        End If
 
@@ -419,11 +404,7 @@ Function ExecFilterCommand(Text)
        Dim exe
        Set exe = wsh.Exec("cmd /c type """ & path & """ | " & cmd & " 2>&1")
        If exe Is Nothing Then
-               If IsLangJapanese() Then
-                       MsgBox "\83R\83}\83\93\83h " & cmd & " \82Ì\8eÀ\8ds\82É\8e¸\94s\82µ\82Ü\82µ\82½:" & Err.Description 
-               Else
-                       MsgBox "Failed to execute the command '" & cmd & "':" & Err.Description 
-               End If
+               MsgBox "Failed to execute the command '" & cmd & "':" & Err.Description 
                fso.DeleteFile path
                Exit Function
        End If
@@ -446,11 +427,7 @@ Function SelectColumns(Text)
        Dim invert
        If IsFirstArgumentEmpty() Then
                args = regRead(PluginRegKeyPath & "SelectColumns", "")
-               If IsLangJapanese() Then
-                       args = InputBox("\92\8a\8fo\82·\82é\97ñ\94Ô\8d\86\82Ì\94Í\88Í\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-)" & vbCrLf & "\82Ü\82½\82Í\92\8a\8fo\82µ\82½\82¢\95\8e\9a\97ñ\82É\83}\83b\83`\82·\82é\90³\8bK\95\\8c»\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "SelectColumns", ranges)
-               Else
-                       args = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectColumns", args)
-               End If
+               args = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectColumns", args)
                If args <> "" Then
                        wsh.RegWrite PluginRegKeyPath & "SelectColumns", args
                End If
@@ -458,11 +435,7 @@ Function SelectColumns(Text)
                args = arguments
        End If
        If args = "" Then
-               If IsLangJapanese() Then
-                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
-               Else
-                       Err.Raise 30001, , "Canceled"
-               End If
+               Err.Raise 30001, , "Canceled"
                Exit Function
        End If
        lines = SplitLines(Text, eol)
@@ -502,11 +475,7 @@ Function SelectLines(Text)
        Dim invert
        If IsFirstArgumentEmpty() Then
                args = regRead(PluginRegKeyPath & "SelectLines", "")
-               If IsLangJapanese() Then
-                       args = InputBox("\92\8a\8fo\82·\82é\8ds\94Ô\8d\86\82Ì\94Í\88Í\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-)" & vbCrLf & "\82Ü\82½\82Í\81A\92\8a\8fo\82µ\82½\82¢\8ds\82É\83}\83b\83`\82·\82é\90³\8bK\95\\8c»\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "SelectLines", ranges)
-               Else
-                       args = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectLines", args)
-               End If
+               args = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectLines", args)
                If args <> "" Then
                        wsh.RegWrite PluginRegKeyPath & "SelectLines", args
                End If
@@ -514,11 +483,7 @@ Function SelectLines(Text)
                args = arguments
        End If
        If args = "" Then
-               If IsLangJapanese() Then
-                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
-               Else
-                       Err.Raise 30001, , "Canceled"
-               End If
+               Err.Raise 30001, , "Canceled"
                Exit Function
        End If
        lines = SplitLines(Text, eol)
@@ -571,11 +536,7 @@ Function ReplaceText(Text)
        ReplaceText = Text
        If IsFirstArgumentEmpty() Then
                args = regRead(PluginRegKeyPath & "Replace", "")
-               If IsLangJapanese() Then
-                       args = InputBox("\8c\9f\8dõ\82·\82é\95\8e\9a\97ñ\82Æ\92u\8a·\82·\82é\95\8e\9a\97ñ\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "Replace", args)
-               Else
-                       args = InputBox("Enter the search text and replacement text:", "Replace", args)
-               End If
+               args = InputBox("Enter the search text and replacement text:", "Replace", args)
                If args <> "" Then
                        wsh.RegWrite PluginRegKeyPath & "Replace", args
                End If
@@ -583,11 +544,7 @@ Function ReplaceText(Text)
                args = arguments
        End If
        If args = "" Then
-               If IsLangJapanese() Then
-                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
-               Else
-                       Err.Raise 30001, , "Canceled"
-               End If
+               Err.Raise 30001, , "Canceled"
                Exit Function
        End If
        patterns = ParseReplaceArguments(args, regex, ignoreCase)
@@ -620,11 +577,7 @@ Function Tokenize(Text)
        Dim pattern
        If IsFirstArgumentEmpty() Then
                pattern = regRead(PluginRegKeyPath & "Tokenize", "")
-               If IsLangJapanese() Then
-                       pattern = InputBox("\83g\81[\83N\83\93\95ª\8a\84\82·\82é\8bæ\90Ø\82è\82ð\90³\8bK\95\\8c»\82Å\93ü\97Í\82µ\82Ä\82­\82¾\82³\82¢ (\97á: [^\w]+):", "Tokenize", pattern)
-               Else
-                       pattern = InputBox("Enter regex to tokenize (e.g. [^\w]+):", "Tokenize", pattern)
-               End If
+               pattern = InputBox("Enter regex to tokenize (e.g. [^\w]+):", "Tokenize", pattern)
                If pattern <> "" Then
                        wsh.RegWrite PluginRegKeyPath & "Tokenize", pattern
                End If
@@ -632,11 +585,7 @@ Function Tokenize(Text)
                pattern = arguments
        End If
        If pattern = "" Then
-               If IsLangJapanese() Then
-                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
-               Else
-                       Err.Raise 30001, , "Canceled"
-               End If
+               Err.Raise 30001, , "Canceled"
                Exit Function
        End If
        Dim re
index f5c8ec4..20990b5 100644 (file)
@@ -2738,7 +2738,8 @@ void CDirView::OnOpenWithUnpacker()
                String filteredFilenames = ctxt.GetFilteredFilenames(GetDiffItem(sel));
                ctxt.FetchPluginInfos(filteredFilenames, &infoUnpacker, &infoPrediffer);
                // let the user choose a handler
-               CSelectPluginDlg dlg(infoUnpacker->GetPluginPipeline(), filteredFilenames, true, false, this);
+               CSelectPluginDlg dlg(infoUnpacker->GetPluginPipeline(), filteredFilenames,
+                       CSelectPluginDlg::PluginType::Unpacker, false, this);
                if (dlg.DoModal() == IDOK)
                {
                        PackingInfo infoUnpackerNew(dlg.GetPluginPipeline());
@@ -3098,7 +3099,8 @@ void CDirView::OnPluginSettings(UINT nID)
                String filteredFilenames = ctxt.GetFilteredFilenames(GetDiffItem(sel));
                ctxt.FetchPluginInfos(filteredFilenames, &infoUnpacker, &infoPrediffer);
                GetDiffContext().FetchPluginInfos(filteredFilenames, &infoUnpacker, &infoPrediffer);
-               CSelectPluginDlg dlg(infoUnpacker->GetPluginPipeline(), filteredFilenames, unpacker, false, this);
+               CSelectPluginDlg dlg(infoUnpacker->GetPluginPipeline(), filteredFilenames,
+                       unpacker ? CSelectPluginDlg::PluginType::Unpacker : CSelectPluginDlg::PluginType::Prediffer, false, this);
                if (dlg.DoModal() != IDOK)
                        return;
                pluginPipeline = dlg.GetPluginPipeline();
index 161dd3c..fbdbf41 100644 (file)
@@ -386,14 +386,6 @@ bool PackingInfo::Unpacking(std::vector<int> * handlerSubcodes, String & filepat
                return false;
        }
 
-       for (auto& [plugin, args, bWithFile] : plugins)
-       {
-               if (plugin->m_argumentsRequired && args.empty())
-               {
-
-               }
-       }
-
        if (handlerSubcodes)
                handlerSubcodes->clear();
 
@@ -613,6 +605,88 @@ bool PrediffingInfo::Prediffing(String & filepath, const String& filteredText, b
        return true;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// transformation text
+
+bool EditorScriptInfo::GetEditorScriptPlugin(std::vector<std::tuple<PluginInfo*, std::vector<String>, int>>& plugins,
+       String& errorMessage) const
+{
+       auto result = ParsePluginPipeline(errorMessage);
+       if (!errorMessage.empty())
+               return false;
+       for (auto& [pluginName, args, quoteChar] : result)
+       {
+               bool found = false;
+               PluginArray *pluginInfoArray = CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"EDITOR_SCRIPT");
+               for (const auto& plugin : *pluginInfoArray)
+               {
+                       std::vector<String> namesArray;
+                       std::vector<int> idArray;
+                       int nFunc = plugin::GetMethodsFromScript(plugin->m_lpDispatch, namesArray, idArray);
+                       for (int i = 0; i < nFunc; ++i)
+                       {
+                               if (namesArray[i] == pluginName)
+                               {
+                                       plugins.push_back({ plugin.get(), args, idArray[i] });
+                                       found = true;
+                                       break;
+                               }
+                       }
+                       if (found)
+                               break;
+               }
+               if (!found)
+               {
+                       errorMessage = strutils::format_string1(_("Plugin not found or invalid: %1"), pluginName);
+                       return false;
+               }
+       }
+       return true;
+}
+
+bool EditorScriptInfo::TransformText(String & text, const std::vector<StringView>& variables, bool& changed)
+{
+       changed = false;
+       // no handler : return true
+       if (m_PluginPipeline.empty())
+               return true;
+
+       // control value
+       bool bHandled = false;
+       String errorMessage;
+       std::vector<std::tuple<PluginInfo*, std::vector<String>, int>> plugins;
+       if (!GetEditorScriptPlugin(plugins, errorMessage))
+       {
+               AppErrorMessageBox(errorMessage);
+               return false;
+       }
+
+       for (const auto& [plugin, args, fncID] : plugins)
+       {
+               LPDISPATCH piScript = plugin->m_lpDispatch;
+               Poco::FastMutex::ScopedLock lock(g_mutex);
+
+               if (plugin->m_hasVariablesProperty)
+               {
+                       if (!plugin::InvokePutPluginVariables(String(variables[0].data(), variables[0].length()), piScript))
+                               return false;
+               }
+               if (plugin->m_hasArgumentsProperty)
+               {
+                       if (!plugin::InvokePutPluginArguments(args.empty() ? plugin->m_arguments : MakeArguments(args, variables), piScript))
+                               return false;
+               }
+
+               // execute the transform operation
+               int nChanged = 0;
+               if (!plugin::InvokeTransformText(text, nChanged, plugin->m_lpDispatch, fncID))
+                       return false;
+               if (!changed)
+                       changed = (nChanged != 0);
+       }
+       return true;
+}
+
 namespace FileTransform
 {
 
@@ -664,86 +738,6 @@ bool AnyCodepageToUTF8(int codepage, String & filepath, bool bMayOverwrite)
        return bSuccess;
 }
 
-
-////////////////////////////////////////////////////////////////////////////////
-// transformation : TextTransform_Interactive (editor scripts)
-
-std::vector<String> GetFreeFunctionsInScripts(const wchar_t *TransformationEvent)
-{
-       std::vector<String> sNamesArray;
-
-       // get an array with the available scripts
-       PluginArray * piScriptArray = 
-               CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(TransformationEvent);
-
-       // fill in these structures
-       int nFnc = 0;   
-       size_t iScript;
-       for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++)
-       {
-               const PluginInfoPtr & plugin = piScriptArray->at(iScript);
-               if (plugin->m_disabled)
-                       continue;
-               LPDISPATCH piScript = plugin->m_lpDispatch;
-               std::vector<String> scriptNamesArray;
-               std::vector<int> scriptIdsArray;
-               int nScriptFnc = plugin::GetMethodsFromScript(piScript, scriptNamesArray, scriptIdsArray);
-               sNamesArray.resize(nFnc+nScriptFnc);
-
-               int iFnc;
-               for (iFnc = 0 ; iFnc < nScriptFnc ; iFnc++)
-                       sNamesArray[nFnc+iFnc] = scriptNamesArray[iFnc];
-
-               nFnc += nScriptFnc;
-       }
-       return sNamesArray;
-}
-
-bool Interactive(String & text, const std::vector<String>& args, const wchar_t *TransformationEvent, int iFncChosen, const std::vector<StringView>& variables)
-{
-       if (iFncChosen < 0)
-               return false;
-
-       // get an array with the available scripts
-       PluginArray * piScriptArray = 
-               CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(TransformationEvent);
-
-       size_t iScript;
-       for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++)
-       {
-               if (iFncChosen < piScriptArray->at(iScript)->m_nFreeFunctions)
-                       // we have found the script file
-                       break;
-               iFncChosen -= piScriptArray->at(iScript)->m_nFreeFunctions;
-       }
-
-       if (iScript >= piScriptArray->size())
-               return false;
-
-       PluginInfo* plugin = piScriptArray->at(iScript).get();
-
-       // iFncChosen is the index of the function in the script file
-       // we must convert it to the function ID
-       int fncID = plugin::GetMethodIDInScript(plugin->m_lpDispatch, iFncChosen);
-
-       if (plugin->m_hasVariablesProperty)
-       {
-               if (!plugin::InvokePutPluginVariables(String(variables[0].data(), variables[0].length()), plugin->m_lpDispatch))
-                       return false;
-       }
-       if (plugin->m_hasArgumentsProperty)
-       {
-               if (!plugin::InvokePutPluginArguments(args.empty() ? plugin->m_arguments : PluginForFile::MakeArguments(args, variables), plugin->m_lpDispatch))
-                       return false;
-       }
-
-       // execute the transform operation
-       int nChanged = 0;
-       plugin::InvokeTransformText(text, nChanged, plugin->m_lpDispatch, fncID);
-
-       return (nChanged != 0);
-}
-
 std::pair<
        std::vector<std::tuple<String, String, unsigned, PluginInfo *>>,
        std::map<String, std::vector<std::tuple<String, String, unsigned, PluginInfo *>>>
@@ -811,10 +805,10 @@ CreatePluginMenuInfos(const String& filteredFilenames, const std::vector<std::ws
                                                const String process = tr(ucr::toUTF8(processType.has_value() ?
                                                        String{ processType->data(), processType->size() } : _T("&Others")));
                                                if (matched)
-                                                       suggestedPlugins.emplace_back(caption, plugin->m_name, id, plugin.get());
+                                                       suggestedPlugins.emplace_back(caption, scriptNamesArray[i], id, plugin.get());
                                                if (allPlugins.find(process) == allPlugins.end())
                                                        allPlugins.insert_or_assign(process, std::vector<std::tuple<String, String, unsigned, PluginInfo *>>());
-                                               allPlugins[process].emplace_back(caption, plugin->m_name, id, plugin.get());
+                                               allPlugins[process].emplace_back(caption, scriptNamesArray[i], id, plugin.get());
                                        }
                                }
                        }
index 1e13256..58883aa 100644 (file)
@@ -162,6 +162,25 @@ public:
        bool Prediffing(String & filepath, const String& filteredText, bool bMayOverwrite, const std::vector<StringView>& variables);
 };
 
+/**
+ * @brief Editor script information
+ *
+ * @note Can be be passed/copied between threads
+ */
+class EditorScriptInfo : public PluginForFile
+{
+public:
+       explicit EditorScriptInfo(const String& pluginPipeline)
+       : PluginForFile(pluginPipeline)
+       {
+       }
+
+       bool GetEditorScriptPlugin(std::vector<std::tuple<PluginInfo*, std::vector<String>, int>>& plugins,
+               String& errorMessage) const;
+
+       bool TransformText(String & text, const std::vector<StringView>& variables, bool& changed);
+};
+
 namespace FileTransform
 {
 /**
@@ -177,38 +196,6 @@ namespace FileTransform
  */
 bool AnyCodepageToUTF8(int codepage, String & filepath, bool bMayOverwrite);
 
-
-/**
- * @brief Get the list of all the free functions in all the scripts for this event :
- * 
- * @note the order is :
- * 1st script file, 1st function name
- * 1st script file, 2nd function name
- * 1st script file, ...
- * 1st script file, last function name
- * 2nd script file, 1st function name
- * 2nd script file, 2nd function name
- * 2nd script file, ...
- * 2nd script file, last function name
- * ... script file
- * last script file, 1st function name
- * last script file, 2nd function name
- * last script file, ...
- * last script file, last function name
- */
-std::vector<String> GetFreeFunctionsInScripts(const wchar_t* TransformationEvent);
-
-/** 
- * @brief : Execute one free function from one script
- *
- * @param iFncChosen : index of the function in the list returned by GetFreeFunctionsInScripts
- *
- * @return Tells if the text has been changed 
- *
- * @note Event EDITOR_SCRIPT, ?
- */
-bool Interactive(String & text, const std::vector<String>& params, const wchar_t *TransformationEvent, int iFncChosen, const std::vector<StringView>& variables);
-
 std::pair<
        std::vector<std::tuple<String, String, unsigned, PluginInfo *>>,
        std::map<String, std::vector<std::tuple<String, String, unsigned, PluginInfo *>>>
@@ -217,5 +204,6 @@ CreatePluginMenuInfos(const String& filteredFilenames, const std::vector<std::ws
 
 inline const std::vector<String> UnpackerEventNames = { L"BUFFER_PACK_UNPACK", L"FILE_PACK_UNPACK", L"FILE_FOLDER_PACK_UNPACK" };
 inline const std::vector<String> PredifferEventNames = { L"BUFFER_PREDIFF", L"FILE_PREDIFF" };
+inline const std::vector<String> EditorScriptEventNames = { L"EDITOR_SCRIPT" };
 
 }
index 547876b..b64c4b4 100644 (file)
@@ -843,7 +843,7 @@ void CHexMergeDoc::OnFileRecompareAs(UINT nID)
 void CHexMergeDoc::OnOpenWithUnpacker()
 {
        CSelectPluginDlg dlg(m_infoUnpacker.GetPluginPipeline(),
-               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")), true, false);
+               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")), CSelectPluginDlg::PluginType::Unpacker, false);
        if (dlg.DoModal() == IDOK)
        {
                PackingInfo infoUnpacker(dlg.GetPluginPipeline());
index 4a771ac..8fb1473 100644 (file)
@@ -976,7 +976,8 @@ void CImgMergeFrame::OnUpdateFileRecompareAs(CCmdUI* pCmdUI)
 void CImgMergeFrame::OnOpenWithUnpacker()
 {
        CSelectPluginDlg dlg(m_infoUnpacker.GetPluginPipeline(),
-               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")), true, false);
+               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")),
+               CSelectPluginDlg::PluginType::Unpacker, false);
        if (dlg.DoModal() == IDOK)
        {
                PackingInfo infoUnpacker(dlg.GetPluginPipeline());
index 3d044d5..0a3a935 100644 (file)
@@ -483,9 +483,16 @@ public:
                : WinMergePluginBase(
                        L"EDITOR_SCRIPT",
                        plugin.m_description,
-                       plugin.m_filtersTextDefault, L"", plugin.m_extendedProperties, plugin.m_arguments)
+                       plugin.m_filtersTextDefault, L"", plugin.m_extendedProperties)
                , m_pDispatch(plugin.m_lpDispatch)
        {
+               auto menuCaption = plugin.GetExtendedPropertyValue(_T("MenuCaption"));
+               if (menuCaption.has_value())
+               {
+                       String menuCaptionStr = { menuCaption.value().data(), menuCaption.value().length() };
+                       m_sExtendedProperties = strutils::format(_T("%s;%s.MenuCaption=%s"),
+                                       plugin.m_extendedProperties, funcname, menuCaptionStr);
+               }
                m_pDispatch->AddRef();
                AddFunction(ucr::toUTF16(funcname), CallUnpackFile);
        }
@@ -617,9 +624,7 @@ struct Loader
                                        if (plugins.find(L"EDITOR_SCRIPT") == plugins.end())
                                                plugins[L"EDITOR_SCRIPT"].reset(new PluginArray);
                                        PluginInfoPtr pluginNew(new PluginInfo());
-                                       auto menuCaption =  plugin->GetExtendedPropertyValue(_T("MenuCaption"));
-                                       String funcname = menuCaption.has_value() ? String{menuCaption->data(), menuCaption->length() } : plugin->m_name;
-                                       IDispatch* pDispatch = new EditorScriptGeneratedFromUnpacker(*plugin, funcname);
+                                       IDispatch* pDispatch = new EditorScriptGeneratedFromUnpacker(*plugin, plugin->m_name);
                                        pDispatch->AddRef();
                                        pluginNew->MakeInfo(plugin->m_name, pDispatch);
                                        plugins[L"EDITOR_SCRIPT"]->push_back(pluginNew);
index 84580d8..40d7575 100644 (file)
@@ -196,6 +196,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
        ON_UPDATE_COMMAND_UI_RANGE(ID_PREDIFFER_MANUAL, ID_PREDIFFER_AUTO, OnUpdatePluginPrediffMode)
        ON_UPDATE_COMMAND_UI(ID_OPEN_WITH_UNPACKER, OnUpdatePluginRelatedMenu)
        ON_UPDATE_COMMAND_UI(ID_APPLY_PREDIFFER, OnUpdatePluginRelatedMenu)
+       ON_UPDATE_COMMAND_UI(ID_TRANSFORM_WITH_SCRIPT, OnUpdatePluginRelatedMenu)
        ON_UPDATE_COMMAND_UI(ID_RELOAD_PLUGINS, OnUpdatePluginRelatedMenu)
        ON_COMMAND(ID_RELOAD_PLUGINS, OnReloadPlugins)
        ON_COMMAND(ID_HELP_GETCONFIG, OnSaveConfigData)
@@ -640,13 +641,13 @@ void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
                                while (i--)
                                        pMenu->DeleteMenu(0, MF_BYPOSITION);
 
-                               CMainFrame::AppendPluginMenus(pMenu, filteredFilenames, { L"EDITOR_SCRIPT" }, false, ID_SCRIPT_FIRST);
+                               CMainFrame::AppendPluginMenus(pMenu, filteredFilenames, FileTransform::EditorScriptEventNames, false, ID_SCRIPT_FIRST);
                        }
                        else if (topMenuId == ID_PLUGINS_LIST)
                        {
                                for (int j = 0; j < 2; j++)
                                {
-                                       CMenu* pMenu = pPopupMenu->GetSubMenu((j == 0) ? 8 : (pPopupMenu->GetMenuItemCount() - 3));
+                                       CMenu* pMenu = pPopupMenu->GetSubMenu((j == 0) ? 8 : (pPopupMenu->GetMenuItemCount() - 4));
                                        ASSERT(pMenu != nullptr);
 
                                        // empty the menu
@@ -657,7 +658,7 @@ void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
                                        if (j == 0)
                                                CMainFrame::AppendPluginMenus(pMenu, filteredFilenames, FileTransform::UnpackerEventNames, false, ID_UNPACKERS_FIRST);
                                        else
-                                               CMainFrame::AppendPluginMenus(pMenu, filteredFilenames, { L"EDITOR_SCRIPT" }, false, ID_SCRIPT_FIRST);
+                                               CMainFrame::AppendPluginMenus(pMenu, filteredFilenames, FileTransform::EditorScriptEventNames, false, ID_SCRIPT_FIRST);
                                }
                        }
                }
@@ -1636,7 +1637,10 @@ void CMainFrame::OnUpdatePluginPrediffMode(CCmdUI* pCmdUI)
  */
 void CMainFrame::OnUpdatePluginRelatedMenu(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable(GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED));
+       bool enabled = GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED);
+       if (enabled && (pCmdUI->m_nID == ID_APPLY_PREDIFFER || pCmdUI->m_nID == ID_TRANSFORM_WITH_SCRIPT))
+               enabled = GetFrameType(GetActiveFrame()) == FRAME_FILE;
+       pCmdUI->Enable(enabled);
 }
 
 void CMainFrame::OnReloadPlugins()
@@ -2959,6 +2963,7 @@ void CMainFrame::AppendPluginMenus(CMenu *pMenu, const String& filteredFilenames
 String CMainFrame::GetPluginPipelineByMenuId(unsigned idSearch, const std::vector<std::wstring>& events, unsigned baseId)
 {
        PluginInfo* pluginFound = nullptr;
+       String pluginName;
        auto [suggestedPlugins, allPlugins] = FileTransform::CreatePluginMenuInfos(_T(""), events, baseId);
        for (const auto& [processType, pluginList] : allPlugins)
        {
@@ -2966,6 +2971,7 @@ String CMainFrame::GetPluginPipelineByMenuId(unsigned idSearch, const std::vecto
                {
                        if (id == idSearch)
                        {
+                               pluginName = name;
                                pluginFound = plugin;
                                break;
                        }
@@ -2973,9 +2979,13 @@ String CMainFrame::GetPluginPipelineByMenuId(unsigned idSearch, const std::vecto
        }
        if (pluginFound)
        {
-               if (!pluginFound->m_argumentsRequired)
-                       return pluginFound->m_name;
-               CSelectPluginDlg dlg(pluginFound->m_name, _T(""), (baseId == ID_UNPACKERS_FIRST), true);
+               if (!pluginFound->GetExtendedPropertyValue(_T("ArgumentsRequired")).has_value() && 
+                   !pluginFound->GetExtendedPropertyValue(pluginName + _T(".ArgumentsRequired")).has_value())
+                       return pluginName;
+               CSelectPluginDlg dlg(pluginName, _T(""), 
+                       (baseId == ID_UNPACKERS_FIRST)  ? CSelectPluginDlg::PluginType::Unpacker    : (
+                       (baseId == ID_PREDIFFERS_FIRST) ? CSelectPluginDlg::PluginType::Prediffer   : 
+                                                         CSelectPluginDlg::PluginType::EditorScript), true);
                if (dlg.DoModal() != IDOK)
                        return {};
                return dlg.GetPluginPipeline();
index 128f791..913e15f 100644 (file)
@@ -692,6 +692,7 @@ BEGIN
         BEGIN\r
             MENUITEM "< Empty >",                   ID_NO_EDIT_SCRIPTS\r
         END\r
+        MENUITEM "&Transform with editor script...",      ID_TRANSFORM_WITH_SCRIPT\r
         MENUITEM SEPARATOR\r
         MENUITEM "&Reload plugins",             ID_RELOAD_PLUGINS\r
     END\r
@@ -1462,7 +1463,7 @@ BEGIN
     EDITTEXT        IDC_PLUGIN_DESCRIPTION,92,38,220,36,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY\r
     LTEXT           "Default arguments:",IDC_STATIC,7,78,83,10\r
     EDITTEXT        IDC_PLUGIN_ARGUMENTS,92,76,220,12,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY\r
-    CONTROL         "Display all unpackers, don't check the extension.",IDC_PLUGIN_ALLOW_ALL,\r
+    CONTROL         "Display all plugins, don't check the extension.",IDC_PLUGIN_ALLOW_ALL,\r
                     "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,92,300,12\r
     CONTROL         "&Open files in the same window type after unpacking.",IDC_PLUGIN_OPEN_IN_SAME_FRAME_TYPE,\r
                     "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,104,300,12\r
index c87ac91..81db278 100644 (file)
@@ -3392,7 +3392,8 @@ void CMergeDoc::OnFileEncoding()
 void CMergeDoc::OnOpenWithUnpacker()
 {
        CSelectPluginDlg dlg(m_infoUnpacker.GetPluginPipeline(),
-               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")), true, false);
+               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")),
+               CSelectPluginDlg::PluginType::Unpacker, false);
        if (dlg.DoModal() != IDOK)
                return;
 
@@ -3416,7 +3417,8 @@ void CMergeDoc::OnApplyPrediffer()
        GetPrediffer(&prediffer);
        // let the user choose a handler
        CSelectPluginDlg dlg(prediffer.GetPluginPipeline(),
-               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")), false, false);
+               strutils::join(m_filePaths.begin(), m_filePaths.end(), _T("|")),
+               CSelectPluginDlg::PluginType::Prediffer, false);
        if (dlg.DoModal() != IDOK)
                return;
        prediffer.SetPluginPipeline(dlg.GetPluginPipeline());
index 3cf9fff..a855fe9 100644 (file)
@@ -31,6 +31,7 @@
 #include "ShellContextMenu.h"
 #include "editcmd.h"
 #include "Shell.h"
+#include "SelectPluginDlg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -197,6 +198,7 @@ BEGIN_MESSAGE_MAP(CMergeEditView, CCrystalEditViewEx)
        ON_COMMAND(ID_FILE_SHELLMENU, OnShellMenu)
        ON_UPDATE_COMMAND_UI(ID_FILE_SHELLMENU, OnUpdateShellMenu)
        ON_COMMAND_RANGE(ID_SCRIPT_FIRST, ID_SCRIPT_LAST, OnScripts)
+       ON_COMMAND(ID_TRANSFORM_WITH_SCRIPT, OnTransformWithScript)
        ON_WM_VSCROLL ()
        ON_WM_HSCROLL ()
        ON_COMMAND(ID_EDIT_COPY_LINENUMBERS, OnEditCopyLineNumbers)
@@ -3362,9 +3364,29 @@ void CMergeEditView::OnScripts(UINT nID)
        CString ctext = GetSelectedText();
        String text{ ctext, static_cast<unsigned>(ctext.GetLength()) };
 
+       EditorScriptInfo scriptInfo(
+               CMainFrame::GetPluginPipelineByMenuId(nID, FileTransform::EditorScriptEventNames, ID_SCRIPT_FIRST));
        // transform the text with a script/ActiveX function, event=EDITOR_SCRIPT
-       bool bChanged = FileTransform::Interactive(text, {}, L"EDITOR_SCRIPT", nID - ID_SCRIPT_FIRST,
-               { GetDocument()->m_filePaths[m_nThisPane] });
+       bool bChanged = false;
+       scriptInfo.TransformText(text, { GetDocument()->m_filePaths[m_nThisPane] }, bChanged);
+       if (bChanged)
+               // now replace the text
+               ReplaceSelection(text.c_str(), text.length(), 0);
+}
+
+void CMergeEditView::OnTransformWithScript() 
+{
+       // let the user choose a handler
+       CSelectPluginDlg dlg(_T(""),
+               strutils::join(GetDocument()->m_filePaths.begin(), GetDocument()->m_filePaths.end(), _T("|")),
+               CSelectPluginDlg::PluginType::EditorScript, false);
+       if (dlg.DoModal() != IDOK)
+               return;
+       EditorScriptInfo scriptInfo(dlg.GetPluginPipeline());
+       CString ctext = GetSelectedText();
+       String text{ ctext, static_cast<unsigned>(ctext.GetLength()) };
+       bool bChanged = false;
+       scriptInfo.TransformText(text, { GetDocument()->m_filePaths[m_nThisPane] }, bChanged);
        if (bChanged)
                // now replace the text
                ReplaceSelection(text.c_str(), text.length(), 0);
index f957143..9eeacf4 100644 (file)
@@ -308,6 +308,7 @@ protected:
        afx_msg void OnShellMenu();
        afx_msg void OnUpdateShellMenu(CCmdUI* pCmdUI);
        afx_msg void OnScripts(UINT nID );
+       afx_msg void OnTransformWithScript();
        afx_msg void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar * pScrollBar);
        afx_msg void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar * pScrollBar);
        afx_msg void OnEditCopyLineNumbers();
index 6e6c700..6d404af 100644 (file)
@@ -670,7 +670,8 @@ void COpenView::OnCompare(UINT nID)
        }
        else if (nID == ID_OPEN_WITH_UNPACKER)
        {
-               CSelectPluginDlg dlg(pDoc->m_strUnpackerPipeline, tmpPathContext[0], true, false, this);
+               CSelectPluginDlg dlg(pDoc->m_strUnpackerPipeline, tmpPathContext[0], 
+                       CSelectPluginDlg::PluginType::Unpacker, false, this);
                if (dlg.DoModal() == IDOK)
                {
                        tmpPackingInfo.SetPluginPipeline(dlg.GetPluginPipeline());
@@ -1165,7 +1166,8 @@ void COpenView::OnSelectUnpacker()
                return;
 
        // let the user select a handler
-       CSelectPluginDlg dlg(m_strUnpackerPipeline, m_files[0], true, false, this);
+       CSelectPluginDlg dlg(m_strUnpackerPipeline, m_files[0], 
+               CSelectPluginDlg::PluginType::Unpacker, false, this);
        if (dlg.DoModal() == IDOK)
        {
                m_strUnpackerPipeline = dlg.GetPluginPipeline();
index 1570211..d8327df 100644 (file)
@@ -540,13 +540,11 @@ int PluginInfo::MakeInfo(const String & scriptletFilepath, IDispatch *lpDispatch
                        return -110; // error (Plugin had PluginExtendedProperties property, but error getting its value)
                }
                m_extendedProperties = ucr::toTString(ret.bstrVal);
-               m_argumentsRequired = GetExtendedPropertyValue(L"ArgumentsRequired").has_value();
 
        }
        else
        {
                m_extendedProperties.clear();
-               m_argumentsRequired = false;
        }
        VariantClear(&ret);
 
index 97be898..446853c 100644 (file)
@@ -83,7 +83,6 @@ public:
        bool        m_disabled;
        bool        m_hasArgumentsProperty;
        bool        m_hasVariablesProperty;
-       bool        m_argumentsRequired;
        std::vector<FileFilterElementPtr> m_filters;
        /// only for plugins with free function names (EDITOR_SCRIPT)
        int         m_nFreeFunctions;
index c962d67..76396c6 100644 (file)
@@ -25,7 +25,7 @@
 /////////////////////////////////////////////////////////////////////////////
 // CSelectPluginDlg dialog
 
-void CSelectPluginDlg::Initialize(bool unpacker)
+void CSelectPluginDlg::Initialize(PluginType pluginType)
 {
        //{{AFX_DATA_INIT(CSelectPluginDlg)
        m_bNoExtensionCheck = false;
@@ -44,20 +44,23 @@ void CSelectPluginDlg::Initialize(bool unpacker)
        automaticPlugin->m_name = _("<Automatic>");
        automaticPlugin->m_description = _T("The adapted unpacker is applied to both files (one file only needs the extension).");
 
-       std::vector<std::wstring> events = unpacker ?  FileTransform::UnpackerEventNames : FileTransform::PredifferEventNames;
+       const std::vector<String> *eventNamesArray[] = {
+                       &FileTransform::UnpackerEventNames,
+                       &FileTransform::PredifferEventNames,
+                       &FileTransform::EditorScriptEventNames };
+       const std::vector<std::wstring>& events = *eventNamesArray[static_cast<int>(pluginType)];
        m_Plugins = FileTransform::CreatePluginMenuInfos(m_filteredFilenames, events, 0).second;
 }
 
-
 CSelectPluginDlg::CSelectPluginDlg(const String& pluginPipeline, const String& filename,
-       bool unpacker /*= true */, bool argumentRequired/*= false  */, CWnd* pParent /*= nullptr*/)
+       PluginType pluginType, bool argumentsRequired/*= false  */, CWnd* pParent /*= nullptr*/)
        : CTrDialog(CSelectPluginDlg::IDD, pParent)
        , m_strPluginPipeline(pluginPipeline)
        , m_filteredFilenames(filename)
-       , m_bUnpacker(unpacker)
-       , m_bArgumentRequired(argumentRequired)
+       , m_pluginType(pluginType)
+       , m_bArgumentsRequired(argumentsRequired)
 {
-       Initialize(unpacker);
+       Initialize(pluginType);
 }
 
 CSelectPluginDlg::~CSelectPluginDlg()
@@ -93,13 +96,15 @@ END_MESSAGE_MAP()
 /////////////////////////////////////////////////////////////////////////////
 // CSelectPluginDlg message handlers
 
-void CSelectPluginDlg::OnOK() 
+void CSelectPluginDlg::OnOK()
 {
        UpdateData(TRUE);
 
        GetOptionsMgr()->SaveOption(OPT_PLUGINS_UNPACK_DONT_CHECK_EXTENSION, m_bNoExtensionCheck);
        GetOptionsMgr()->SaveOption(OPT_PLUGINS_OPEN_IN_SAME_FRAME_TYPE, m_bOpenInSameFrameType);
-       m_ctlPluginPipeline.SaveState(m_bUnpacker ? _T("Files\\Unpacker") : _T("Files\\Prediffer"));
+       m_ctlPluginPipeline.SaveState(
+               std::vector<const TCHAR *>{_T("Files\\Unpacker"), _T("Files\\Prediffer"), _T("Files\\EditorScript") }
+                       [static_cast<int>(m_pluginType)]);
 
        CTrDialog::OnOK();
 }
@@ -113,15 +118,20 @@ BOOL CSelectPluginDlg::OnInitDialog()
 
        prepareListbox();
        m_ctlPluginPipeline.SetFileControlStates(true);
-       m_ctlPluginPipeline.LoadState(m_bUnpacker ? _T("Files\\Unpacker") : _T("Files\\Prediffer"));
+       m_ctlPluginPipeline.LoadState(
+               std::vector<const TCHAR *>{_T("Files\\Unpacker"), _T("Files\\Prediffer"), _T("Files\\EditorScript") }
+                       [static_cast<int>(m_pluginType)]);
 
-       EnableDlgItem(IDC_PLUGIN_OPEN_IN_SAME_FRAME_TYPE, m_bUnpacker);
+       EnableDlgItem(IDC_PLUGIN_OPEN_IN_SAME_FRAME_TYPE, m_pluginType == PluginType::Unpacker);
 
        UpdateData(FALSE);
 
-       if (m_bArgumentRequired)
+       const std::vector<String> pluginTypes = { _("Unpacker"), _("Prediffer"), _("Editor script") };
+       String pluginTypeStr = pluginTypes[static_cast<int>(m_pluginType)];
+
+       if (m_bArgumentsRequired)
        {
-               SetWindowText(_("Specify plugin arguments").c_str());
+               SetWindowText((_("Specify plugin arguments") + _T(" [") + pluginTypeStr + _T("]")).c_str());
                String args;
                CString pipeline;
                GetDlgItemText(IDC_PLUGIN_ARGUMENTS, args);
@@ -131,6 +141,9 @@ BOOL CSelectPluginDlg::OnInitDialog()
                m_ctlPluginPipeline.SetFocus();
                return FALSE;
        }
+       CString title;
+       GetWindowText(title);
+       SetWindowText(title + _T(" [") + pluginTypeStr.c_str() + _T("]"));
 
        return TRUE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
@@ -139,12 +152,17 @@ BOOL CSelectPluginDlg::OnInitDialog()
 void CSelectPluginDlg::prepareListbox() 
 {
        int sel = -1;
+       PluginInfo* pSelPlugin = nullptr;
        int i = 0;
        String errorMessage;
        auto parseResult = PluginForFile::ParsePluginPipeline(m_strPluginPipeline, errorMessage);
        String lastPluginName = parseResult.empty() ? _T("") : parseResult.back().name;
-       m_cboPluginName.AddString(noPlugin->m_name.c_str());
-       m_cboPluginName.AddString(automaticPlugin->m_name.c_str());
+
+       if (m_pluginType != PluginType::EditorScript)
+       {
+               m_cboPluginName.AddString(noPlugin->m_name.c_str());
+               m_cboPluginName.AddString(automaticPlugin->m_name.c_str());
+       }
 
        std::vector<String> processTypes;
        for (const auto& [processType, pluginList] : m_Plugins)
@@ -171,11 +189,23 @@ void CSelectPluginDlg::prepareListbox()
                {
                        if (!name.empty() && name != _T("<Automatic>"))
                        {
-                               if (m_bNoExtensionCheck || plugin->TestAgainstRegList(m_filteredFilenames) || lastPluginName == name)
+                               bool match = plugin->TestAgainstRegList(m_filteredFilenames);
+                               if (m_bNoExtensionCheck || match || lastPluginName == name)
                                {
                                        m_cboPluginName.AddString(name.c_str());
-                                       if (lastPluginName == name)
+                                       if (lastPluginName.empty() && match)
+                                       {
+                                               if (sel == -1 || (!pSelPlugin->m_bAutomatic && plugin->m_bAutomatic))
+                                               {
+                                                       sel = m_cboPluginName.GetCount() - 1;
+                                                       pSelPlugin = plugin;
+                                               }
+                                       }
+                                       else if (lastPluginName == name)
+                                       {
                                                sel = m_cboPluginName.GetCount() - 1;
+                                               pSelPlugin = plugin;
+                                       }
                                }
                        }
                }
@@ -218,13 +248,14 @@ void CSelectPluginDlg::OnChangePipeline()
 void CSelectPluginDlg::OnSelchangeUnpackerName() 
 {
        PluginInfo* pPlugin = nullptr;
+       String pluginName;
        int i = m_cboPluginName.GetCurSel();
-       if (i == 0)
+       if (m_pluginType != PluginType::EditorScript && i == 0)
        {
                pPlugin = noPlugin.get();
                m_strPluginPipeline.clear();
        }
-       else if (i == 1)
+       else if (m_pluginType != PluginType::EditorScript && i == 1)
        {
                pPlugin = automaticPlugin.get();
                m_strPluginPipeline = _T("<Automatic>");
@@ -234,7 +265,7 @@ void CSelectPluginDlg::OnSelchangeUnpackerName()
                // initialize with the default unpacker
                CString cstrPluginName;
                m_cboPluginName.GetWindowText(cstrPluginName);
-               String pluginName = cstrPluginName.Trim();
+               pluginName = cstrPluginName.Trim();
                for (const auto& [processType, pluginList] : m_Plugins)
                {
                        for (const auto& [caption, name, id, plugin] : pluginList)
@@ -260,8 +291,14 @@ void CSelectPluginDlg::OnSelchangeUnpackerName()
        if (pPlugin)
        {
                m_strDescription = tr(ucr::toUTF8(pPlugin->m_description));
+               auto funcDescription = pPlugin->GetExtendedPropertyValue(pluginName + _T(".Description"));
+               if (funcDescription.has_value())
+                       m_strDescription = tr(ucr::toUTF8({ funcDescription.value().data(), funcDescription.value().length() }));
                m_strExtensions = pPlugin->m_filtersText;
                m_strArguments = pPlugin->m_arguments;
+               auto funcArguments = pPlugin->GetExtendedPropertyValue(pluginName + _T(".Arguments"));
+               if (funcArguments.has_value())
+                       m_strArguments = { funcArguments.value().data(), funcArguments.value().length() };
        }
 
        m_bOpenInSameFrameType = IsDlgButtonChecked(IDC_PLUGIN_OPEN_IN_SAME_FRAME_TYPE);
index a245fbb..353308f 100644 (file)
@@ -24,13 +24,15 @@ class PluginInfo;
 
 class CSelectPluginDlg : public CTrDialog
 {
+public:
+       enum class PluginType { Unpacker, Prediffer, EditorScript };
 private:
 // Construction
-       void Initialize(bool unpacker);
+       void Initialize(PluginType pluginType);
 
 public:
 // Construction
-       CSelectPluginDlg(const String& pluginPipeline, const String& filename, bool unpacker = true, bool argumentRequired = false, CWnd* pParent = nullptr);
+       CSelectPluginDlg(const String& pluginPipeline, const String& filename, PluginType pluginType, bool argumentsRequired = false, CWnd* pParent = nullptr);
        ~CSelectPluginDlg();
 
        const String& CSelectPluginDlg::GetPluginPipeline() const { return m_strPluginPipeline; }
@@ -66,8 +68,8 @@ protected:
        std::unique_ptr<PluginInfo> noPlugin;
        // const data "automatic plugin"
        std::unique_ptr<PluginInfo> automaticPlugin;
-       bool m_bUnpacker;
-       bool m_bArgumentRequired;
+       PluginType m_pluginType;
+       bool m_bArgumentsRequired;
 
        // input value
        String m_filteredFilenames;
index dcec60e..c7cbb52 100644 (file)
 #define ID_RELOAD_PLUGINS               32886\r
 #define ID_NO_UNPACKER                  32887\r
 #define ID_APPLY_PREDIFFER              32888\r
+#define ID_TRANSFORM_WITH_SCRIPT        32889\r
 #define ID_WINDOW_CHANGE_PANE           32896\r
 #define ID_WINDOW_CLOSEALL              32897\r
 #define ID_SELECT_PREDIFFER             32898\r
index 920ccbd..b45cee9 100644 (file)
@@ -37,7 +37,7 @@
 </head>
 <body>
 <h1>Translations Status</h1>
-<p>Status from <strong>2021-07-11</strong>:</p>
+<p>Status from <strong>2021-07-13</strong>:</p>
 <h2>WinMerge</h2>
 <table class="status">
   <tr>
   </tr>
   <tr>
     <td class="left">Arabic</td>
-    <td class="right">1085</td>
-    <td class="right translated">906</td>
+    <td class="right">1086</td>
+    <td class="right translated">905</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">179</td>
-    <td class="right">84 %</td>
+    <td class="right untranslated">181</td>
+    <td class="right">83 %</td>
     <td class="center">2019-12-30</td>
   </tr>
   <tr>
     <td class="left">Basque</td>
-    <td class="right">1085</td>
-    <td class="right translated">643</td>
+    <td class="right">1086</td>
+    <td class="right translated">642</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">442</td>
+    <td class="right untranslated">444</td>
     <td class="right">59 %</td>
     <td class="center">2013-02-03</td>
   </tr>
   <tr>
     <td class="left">Brazilian</td>
-    <td class="right">1085</td>
-    <td class="right translated">1022</td>
+    <td class="right">1086</td>
+    <td class="right translated">1021</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">63</td>
+    <td class="right untranslated">65</td>
     <td class="right">94 %</td>
     <td class="center">2021-02-14</td>
   </tr>
   <tr>
     <td class="left">Bulgarian</td>
-    <td class="right">1085</td>
+    <td class="right">1086</td>
     <td class="right translated">970</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">115</td>
+    <td class="right untranslated">116</td>
     <td class="right">89 %</td>
     <td class="center">2021-06-28</td>
   </tr>
   <tr>
     <td class="left">Catalan</td>
-    <td class="right">1085</td>
-    <td class="right translated">569</td>
+    <td class="right">1086</td>
+    <td class="right translated">568</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">516</td>
+    <td class="right untranslated">518</td>
     <td class="right">52 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">ChineseSimplified</td>
-    <td class="right">1085</td>
-    <td class="right translated">979</td>
+    <td class="right">1086</td>
+    <td class="right translated">978</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">106</td>
+    <td class="right untranslated">108</td>
     <td class="right">90 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">ChineseTraditional</td>
-    <td class="right">1085</td>
-    <td class="right translated">859</td>
+    <td class="right">1086</td>
+    <td class="right translated">858</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">226</td>
+    <td class="right untranslated">228</td>
     <td class="right">79 %</td>
     <td class="center">2010-02-19</td>
   </tr>
   <tr>
     <td class="left">Croatian</td>
-    <td class="right">1085</td>
-    <td class="right translated">634</td>
+    <td class="right">1086</td>
+    <td class="right translated">633</td>
     <td class="right fuzzy">1</td>
-    <td class="right untranslated">450</td>
-    <td class="right">59 %</td>
+    <td class="right untranslated">452</td>
+    <td class="right">58 %</td>
     <td class="center">2009-02-13</td>
   </tr>
   <tr>
     <td class="left">Czech</td>
-    <td class="right">1085</td>
-    <td class="right translated">609</td>
+    <td class="right">1086</td>
+    <td class="right translated">608</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">476</td>
+    <td class="right untranslated">478</td>
     <td class="right">56 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Danish</td>
-    <td class="right">1085</td>
-    <td class="right translated">643</td>
+    <td class="right">1086</td>
+    <td class="right translated">642</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">442</td>
+    <td class="right untranslated">444</td>
     <td class="right">59 %</td>
     <td class="center">2013-01-13</td>
   </tr>
   <tr>
     <td class="left">Dutch</td>
-    <td class="right">1085</td>
-    <td class="right translated">1068</td>
+    <td class="right">1086</td>
+    <td class="right translated">1067</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">17</td>
+    <td class="right untranslated">19</td>
     <td class="right">98 %</td>
     <td class="center">2018-09-06</td>
   </tr>
   <tr>
     <td class="left">English</td>
-    <td class="right">1086</td>
-    <td class="right translated">1086</td>
+    <td class="right">1087</td>
+    <td class="right translated">1087</td>
     <td class="right fuzzy">0</td>
     <td class="right untranslated">0</td>
     <td class="right">100 %</td>
-    <td class="center">2021-07-11</td>
+    <td class="center">2021-07-13</td>
   </tr>
   <tr>
     <td class="left">Finnish</td>
-    <td class="right">1085</td>
-    <td class="right translated">906</td>
+    <td class="right">1086</td>
+    <td class="right translated">905</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">179</td>
-    <td class="right">84 %</td>
+    <td class="right untranslated">181</td>
+    <td class="right">83 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">French</td>
-    <td class="right">1085</td>
-    <td class="right translated">1023</td>
+    <td class="right">1086</td>
+    <td class="right translated">1022</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">62</td>
+    <td class="right untranslated">64</td>
     <td class="right">94 %</td>
     <td class="center">2021-04-29</td>
   </tr>
   <tr>
     <td class="left">Galician</td>
-    <td class="right">1085</td>
-    <td class="right translated">1023</td>
+    <td class="right">1086</td>
+    <td class="right translated">1084</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">62</td>
-    <td class="right">94 %</td>
-    <td class="center">2021-04-18</td>
+    <td class="right untranslated">2</td>
+    <td class="right">100 %</td>
+    <td class="center">2021-07-11</td>
   </tr>
   <tr>
     <td class="left">German</td>
-    <td class="right">1085</td>
-    <td class="right translated">1073</td>
+    <td class="right">1086</td>
+    <td class="right translated">1084</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">12</td>
-    <td class="right">99 %</td>
-    <td class="center">2021-07-04</td>
+    <td class="right untranslated">2</td>
+    <td class="right">100 %</td>
+    <td class="center">2021-07-11</td>
   </tr>
   <tr>
     <td class="left">Greek</td>
-    <td class="right">1085</td>
-    <td class="right translated">607</td>
+    <td class="right">1086</td>
+    <td class="right translated">606</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">478</td>
+    <td class="right untranslated">480</td>
     <td class="right">56 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Hungarian</td>
-    <td class="right">1085</td>
-    <td class="right translated">1071</td>
+    <td class="right">1086</td>
+    <td class="right translated">1070</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">14</td>
+    <td class="right untranslated">16</td>
     <td class="right">99 %</td>
     <td class="center">2021-03-15</td>
   </tr>
   <tr>
     <td class="left">Italian</td>
-    <td class="right">1085</td>
-    <td class="right translated">909</td>
+    <td class="right">1086</td>
+    <td class="right translated">908</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">176</td>
+    <td class="right untranslated">178</td>
     <td class="right">84 %</td>
     <td class="center">2019-07-12</td>
   </tr>
   <tr>
     <td class="left">Japanese</td>
-    <td class="right">1085</td>
-    <td class="right translated">1079</td>
+    <td class="right">1086</td>
+    <td class="right translated">1084</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">6</td>
-    <td class="right">99 %</td>
-    <td class="center">2021-07-08</td>
+    <td class="right untranslated">2</td>
+    <td class="right">100 %</td>
+    <td class="center">2021-07-11</td>
   </tr>
   <tr>
     <td class="left">Korean</td>
-    <td class="right">1085</td>
-    <td class="right translated">991</td>
+    <td class="right">1086</td>
+    <td class="right translated">990</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">94</td>
+    <td class="right untranslated">96</td>
     <td class="right">91 %</td>
     <td class="center">2021-03-30</td>
   </tr>
   <tr>
     <td class="left">Lithuanian</td>
-    <td class="right">1085</td>
-    <td class="right translated">1076</td>
+    <td class="right">1086</td>
+    <td class="right translated">1075</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">9</td>
+    <td class="right untranslated">11</td>
     <td class="right">99 %</td>
     <td class="center">2021-07-07</td>
   </tr>
   <tr>
     <td class="left">Norwegian</td>
-    <td class="right">1085</td>
-    <td class="right translated">635</td>
+    <td class="right">1086</td>
+    <td class="right translated">634</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">450</td>
-    <td class="right">59 %</td>
+    <td class="right untranslated">452</td>
+    <td class="right">58 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Persian</td>
-    <td class="right">1085</td>
-    <td class="right translated">646</td>
+    <td class="right">1086</td>
+    <td class="right translated">645</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">439</td>
-    <td class="right">60 %</td>
+    <td class="right untranslated">441</td>
+    <td class="right">59 %</td>
     <td class="center">2013-08-15</td>
   </tr>
   <tr>
     <td class="left">Polish</td>
-    <td class="right">1085</td>
-    <td class="right translated">1013</td>
+    <td class="right">1086</td>
+    <td class="right translated">1012</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">72</td>
+    <td class="right untranslated">74</td>
     <td class="right">93 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Portuguese</td>
-    <td class="right">1085</td>
-    <td class="right translated">1069</td>
+    <td class="right">1086</td>
+    <td class="right translated">1068</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">16</td>
-    <td class="right">99 %</td>
+    <td class="right untranslated">18</td>
+    <td class="right">98 %</td>
     <td class="center">2021-06-25</td>
   </tr>
   <tr>
     <td class="left">Romanian</td>
-    <td class="right">1085</td>
-    <td class="right translated">564</td>
+    <td class="right">1086</td>
+    <td class="right translated">563</td>
     <td class="right fuzzy">44</td>
-    <td class="right untranslated">477</td>
+    <td class="right untranslated">479</td>
     <td class="right">56 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Russian</td>
-    <td class="right">1085</td>
-    <td class="right translated">1049</td>
+    <td class="right">1086</td>
+    <td class="right translated">1048</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">36</td>
+    <td class="right untranslated">38</td>
     <td class="right">97 %</td>
     <td class="center">2021-06-25</td>
   </tr>
   <tr>
     <td class="left">Serbian</td>
-    <td class="right">1085</td>
+    <td class="right">1086</td>
     <td class="right translated">634</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">451</td>
+    <td class="right untranslated">452</td>
     <td class="right">58 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Sinhala</td>
-    <td class="right">1085</td>
+    <td class="right">1086</td>
     <td class="right translated">568</td>
     <td class="right fuzzy">59</td>
-    <td class="right untranslated">458</td>
+    <td class="right untranslated">459</td>
     <td class="right">58 %</td>
     <td class="center">2010-12-12</td>
   </tr>
   <tr>
     <td class="left">Slovak</td>
-    <td class="right">1085</td>
-    <td class="right translated">979</td>
+    <td class="right">1086</td>
+    <td class="right translated">978</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">106</td>
+    <td class="right untranslated">108</td>
     <td class="right">90 %</td>
     <td class="center">2020-11-02</td>
   </tr>
   <tr>
     <td class="left">Slovenian</td>
-    <td class="right">1085</td>
-    <td class="right translated">1073</td>
+    <td class="right">1086</td>
+    <td class="right translated">1072</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">12</td>
+    <td class="right untranslated">14</td>
     <td class="right">99 %</td>
     <td class="center">2021-07-04</td>
   </tr>
   <tr>
     <td class="left">Spanish</td>
-    <td class="right">1085</td>
-    <td class="right translated">875</td>
+    <td class="right">1086</td>
+    <td class="right translated">874</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">210</td>
-    <td class="right">81 %</td>
+    <td class="right untranslated">212</td>
+    <td class="right">80 %</td>
     <td class="center">2020-04-03</td>
   </tr>
   <tr>
     <td class="left">Swedish</td>
-    <td class="right">1085</td>
-    <td class="right translated">1022</td>
+    <td class="right">1086</td>
+    <td class="right translated">1021</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">63</td>
+    <td class="right untranslated">65</td>
     <td class="right">94 %</td>
     <td class="center">2021-04-10</td>
   </tr>
   <tr>
     <td class="left">Turkish</td>
-    <td class="right">1085</td>
-    <td class="right translated">1068</td>
+    <td class="right">1086</td>
+    <td class="right translated">1067</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">17</td>
+    <td class="right untranslated">19</td>
     <td class="right">98 %</td>
     <td class="center">2021-06-25</td>
   </tr>
   <tr>
     <td class="left">Ukrainian</td>
-    <td class="right">1085</td>
-    <td class="right translated">640</td>
+    <td class="right">1086</td>
+    <td class="right translated">639</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">445</td>
+    <td class="right untranslated">447</td>
     <td class="right">59 %</td>
     <td class="center">2009-06-13</td>
   </tr>
index f64b88e..0e454a9 100644 (file)
@@ -1,47 +1,47 @@
 # Translations Status
 
-Status from **2021-07-11**:
+Status from **2021-07-13**:
 
 ## WinMerge
 
 | Language             | Total | Translated | Fuzzy | Untranslated | Complete | Last Update |
 |:---------------------|------:|-----------:|------:|-------------:|---------:|:-----------:|
-| Arabic               |  1085 |        906 |     0 |          179 |     84 % |  2019-12-30 |
-| Basque               |  1085 |        643 |     0 |          442 |     59 % |  2013-02-03 |
-| Brazilian            |  1085 |       1022 |     0 |           63 |     94 % |  2021-02-14 |
-| Bulgarian            |  1085 |        970 |     0 |          115 |     89 % |  2021-06-28 |
-| Catalan              |  1085 |        569 |     0 |          516 |     52 % |             |
-| ChineseSimplified    |  1085 |        979 |     0 |          106 |     90 % |             |
-| ChineseTraditional   |  1085 |        859 |     0 |          226 |     79 % |  2010-02-19 |
-| Croatian             |  1085 |        634 |     1 |          450 |     59 % |  2009-02-13 |
-| Czech                |  1085 |        609 |     0 |          476 |     56 % |             |
-| Danish               |  1085 |        643 |     0 |          442 |     59 % |  2013-01-13 |
-| Dutch                |  1085 |       1068 |     0 |           17 |     98 % |  2018-09-06 |
-| English              |  1086 |       1086 |     0 |            0 |    100 % |  2021-07-11 |
-| Finnish              |  1085 |        906 |     0 |          179 |     84 % |             |
-| French               |  1085 |       1023 |     0 |           62 |     94 % |  2021-04-29 |
-| Galician             |  1085 |       1023 |     0 |           62 |     94 % |  2021-04-18 |
-| German               |  1085 |       1073 |     0 |           12 |     99 % |  2021-07-04 |
-| Greek                |  1085 |        607 |     0 |          478 |     56 % |             |
-| Hungarian            |  1085 |       1071 |     0 |           14 |     99 % |  2021-03-15 |
-| Italian              |  1085 |        909 |     0 |          176 |     84 % |  2019-07-12 |
-| Japanese             |  1085 |       1079 |     0 |            6 |     99 % |  2021-07-08 |
-| Korean               |  1085 |        991 |     0 |           94 |     91 % |  2021-03-30 |
-| Lithuanian           |  1085 |       1076 |     0 |            9 |     99 % |  2021-07-07 |
-| Norwegian            |  1085 |        635 |     0 |          450 |     59 % |             |
-| Persian              |  1085 |        646 |     0 |          439 |     60 % |  2013-08-15 |
-| Polish               |  1085 |       1013 |     0 |           72 |     93 % |             |
-| Portuguese           |  1085 |       1069 |     0 |           16 |     99 % |  2021-06-25 |
-| Romanian             |  1085 |        564 |    44 |          477 |     56 % |             |
-| Russian              |  1085 |       1049 |     0 |           36 |     97 % |  2021-06-25 |
-| Serbian              |  1085 |        634 |     0 |          451 |     58 % |             |
-| Sinhala              |  1085 |        568 |    59 |          458 |     58 % |  2010-12-12 |
-| Slovak               |  1085 |        979 |     0 |          106 |     90 % |  2020-11-02 |
-| Slovenian            |  1085 |       1073 |     0 |           12 |     99 % |  2021-07-04 |
-| Spanish              |  1085 |        875 |     0 |          210 |     81 % |  2020-04-03 |
-| Swedish              |  1085 |       1022 |     0 |           63 |     94 % |  2021-04-10 |
-| Turkish              |  1085 |       1068 |     0 |           17 |     98 % |  2021-06-25 |
-| Ukrainian            |  1085 |        640 |     0 |          445 |     59 % |  2009-06-13 |
+| Arabic               |  1086 |        905 |     0 |          181 |     83 % |  2019-12-30 |
+| Basque               |  1086 |        642 |     0 |          444 |     59 % |  2013-02-03 |
+| Brazilian            |  1086 |       1021 |     0 |           65 |     94 % |  2021-02-14 |
+| Bulgarian            |  1086 |        970 |     0 |          116 |     89 % |  2021-06-28 |
+| Catalan              |  1086 |        568 |     0 |          518 |     52 % |             |
+| ChineseSimplified    |  1086 |        978 |     0 |          108 |     90 % |             |
+| ChineseTraditional   |  1086 |        858 |     0 |          228 |     79 % |  2010-02-19 |
+| Croatian             |  1086 |        633 |     1 |          452 |     58 % |  2009-02-13 |
+| Czech                |  1086 |        608 |     0 |          478 |     56 % |             |
+| Danish               |  1086 |        642 |     0 |          444 |     59 % |  2013-01-13 |
+| Dutch                |  1086 |       1067 |     0 |           19 |     98 % |  2018-09-06 |
+| English              |  1087 |       1087 |     0 |            0 |    100 % |  2021-07-13 |
+| Finnish              |  1086 |        905 |     0 |          181 |     83 % |             |
+| French               |  1086 |       1022 |     0 |           64 |     94 % |  2021-04-29 |
+| Galician             |  1086 |       1084 |     0 |            2 |    100 % |  2021-07-11 |
+| German               |  1086 |       1084 |     0 |            2 |    100 % |  2021-07-11 |
+| Greek                |  1086 |        606 |     0 |          480 |     56 % |             |
+| Hungarian            |  1086 |       1070 |     0 |           16 |     99 % |  2021-03-15 |
+| Italian              |  1086 |        908 |     0 |          178 |     84 % |  2019-07-12 |
+| Japanese             |  1086 |       1084 |     0 |            2 |    100 % |  2021-07-11 |
+| Korean               |  1086 |        990 |     0 |           96 |     91 % |  2021-03-30 |
+| Lithuanian           |  1086 |       1075 |     0 |           11 |     99 % |  2021-07-07 |
+| Norwegian            |  1086 |        634 |     0 |          452 |     58 % |             |
+| Persian              |  1086 |        645 |     0 |          441 |     59 % |  2013-08-15 |
+| Polish               |  1086 |       1012 |     0 |           74 |     93 % |             |
+| Portuguese           |  1086 |       1068 |     0 |           18 |     98 % |  2021-06-25 |
+| Romanian             |  1086 |        563 |    44 |          479 |     56 % |             |
+| Russian              |  1086 |       1048 |     0 |           38 |     97 % |  2021-06-25 |
+| Serbian              |  1086 |        634 |     0 |          452 |     58 % |             |
+| Sinhala              |  1086 |        568 |    59 |          459 |     58 % |  2010-12-12 |
+| Slovak               |  1086 |        978 |     0 |          108 |     90 % |  2020-11-02 |
+| Slovenian            |  1086 |       1072 |     0 |           14 |     99 % |  2021-07-04 |
+| Spanish              |  1086 |        874 |     0 |          212 |     80 % |  2020-04-03 |
+| Swedish              |  1086 |       1021 |     0 |           65 |     94 % |  2021-04-10 |
+| Turkish              |  1086 |       1067 |     0 |           19 |     98 % |  2021-06-25 |
+| Ukrainian            |  1086 |        639 |     0 |          447 |     59 % |  2009-06-13 |
 
 ## ShellExtension
 
index 2ab1373..ac2f386 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <status>
-  <update>2021-07-11</update>
+  <update>2021-07-13</update>
   <translations project="WinMerge">
     <translation>
       <language>Arabic</language>
       <file>Arabic.po</file>
       <update>2019-12-30</update>
       <strings>
-        <count>1085</count>
-        <translated>906</translated>
+        <count>1086</count>
+        <translated>905</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>179</untranslated>
+        <untranslated>181</untranslated>
       </strings>
     </translation>
     <translation>
       <file>Basque.po</file>
       <update>2013-02-03</update>
       <strings>
-        <count>1085</count>
-        <translated>643</translated>
+        <count>1086</count>
+        <translated>642</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>442</untranslated>
+        <untranslated>444</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Brazilian.po</file>
       <update>2021-02-14</update>
       <strings>
-        <count>1085</count>
-        <translated>1022</translated>
+        <count>1086</count>
+        <translated>1021</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>63</untranslated>
+        <untranslated>65</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Bulgarian.po</file>
       <update>2021-06-28</update>
       <strings>
-        <count>1085</count>
+        <count>1086</count>
         <translated>970</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>115</untranslated>
+        <untranslated>116</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Catalan.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>569</translated>
+        <count>1086</count>
+        <translated>568</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>516</untranslated>
+        <untranslated>518</untranslated>
       </strings>
       <translators>
         <translator>
       <file>ChineseSimplified.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>979</translated>
+        <count>1086</count>
+        <translated>978</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>106</untranslated>
+        <untranslated>108</untranslated>
       </strings>
       <translators>
         <translator>
       <file>ChineseTraditional.po</file>
       <update>2010-02-19</update>
       <strings>
-        <count>1085</count>
-        <translated>859</translated>
+        <count>1086</count>
+        <translated>858</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>226</untranslated>
+        <untranslated>228</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Croatian.po</file>
       <update>2009-02-13</update>
       <strings>
-        <count>1085</count>
-        <translated>634</translated>
+        <count>1086</count>
+        <translated>633</translated>
         <fuzzy>1</fuzzy>
-        <untranslated>450</untranslated>
+        <untranslated>452</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Czech.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>609</translated>
+        <count>1086</count>
+        <translated>608</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>476</untranslated>
+        <untranslated>478</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Danish.po</file>
       <update>2013-01-13</update>
       <strings>
-        <count>1085</count>
-        <translated>643</translated>
+        <count>1086</count>
+        <translated>642</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>442</untranslated>
+        <untranslated>444</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Dutch.po</file>
       <update>2018-09-06</update>
       <strings>
-        <count>1085</count>
-        <translated>1068</translated>
+        <count>1086</count>
+        <translated>1067</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>17</untranslated>
+        <untranslated>19</untranslated>
       </strings>
       <translators>
         <translator>
     <translation template="1">
       <language>English</language>
       <file>English.pot</file>
-      <update>2021-07-11</update>
+      <update>2021-07-13</update>
       <strings>
-        <count>1086</count>
-        <translated>1086</translated>
+        <count>1087</count>
+        <translated>1087</translated>
         <fuzzy>0</fuzzy>
         <untranslated>0</untranslated>
       </strings>
       <file>Finnish.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>906</translated>
+        <count>1086</count>
+        <translated>905</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>179</untranslated>
+        <untranslated>181</untranslated>
       </strings>
     </translation>
     <translation>
       <file>French.po</file>
       <update>2021-04-29</update>
       <strings>
-        <count>1085</count>
-        <translated>1023</translated>
+        <count>1086</count>
+        <translated>1022</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>62</untranslated>
+        <untranslated>64</untranslated>
       </strings>
       <translators>
         <translator maintainer="1">
     <translation>
       <language>Galician</language>
       <file>Galician.po</file>
-      <update>2021-04-18</update>
+      <update>2021-07-11</update>
       <strings>
-        <count>1085</count>
-        <translated>1023</translated>
+        <count>1086</count>
+        <translated>1084</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>62</untranslated>
+        <untranslated>2</untranslated>
       </strings>
       <translators>
         <translator>
     <translation>
       <language>German</language>
       <file>German.po</file>
-      <update>2021-07-04</update>
+      <update>2021-07-11</update>
       <strings>
-        <count>1085</count>
-        <translated>1073</translated>
+        <count>1086</count>
+        <translated>1084</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>12</untranslated>
+        <untranslated>2</untranslated>
       </strings>
       <translators>
         <translator maintainer="1">
       <file>Greek.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>607</translated>
+        <count>1086</count>
+        <translated>606</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>478</untranslated>
+        <untranslated>480</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Hungarian.po</file>
       <update>2021-03-15</update>
       <strings>
-        <count>1085</count>
-        <translated>1071</translated>
+        <count>1086</count>
+        <translated>1070</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>14</untranslated>
+        <untranslated>16</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Italian.po</file>
       <update>2019-07-12</update>
       <strings>
-        <count>1085</count>
-        <translated>909</translated>
+        <count>1086</count>
+        <translated>908</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>176</untranslated>
+        <untranslated>178</untranslated>
       </strings>
       <translators>
         <translator>
     <translation>
       <language>Japanese</language>
       <file>Japanese.po</file>
-      <update>2021-07-08</update>
+      <update>2021-07-11</update>
       <strings>
-        <count>1085</count>
-        <translated>1079</translated>
+        <count>1086</count>
+        <translated>1084</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>6</untranslated>
+        <untranslated>2</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Korean.po</file>
       <update>2021-03-30</update>
       <strings>
-        <count>1085</count>
-        <translated>991</translated>
+        <count>1086</count>
+        <translated>990</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>94</untranslated>
+        <untranslated>96</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Lithuanian.po</file>
       <update>2021-07-07</update>
       <strings>
-        <count>1085</count>
-        <translated>1076</translated>
+        <count>1086</count>
+        <translated>1075</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>9</untranslated>
+        <untranslated>11</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Norwegian.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>635</translated>
+        <count>1086</count>
+        <translated>634</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>450</untranslated>
+        <untranslated>452</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Persian.po</file>
       <update>2013-08-15</update>
       <strings>
-        <count>1085</count>
-        <translated>646</translated>
+        <count>1086</count>
+        <translated>645</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>439</untranslated>
+        <untranslated>441</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Polish.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>1013</translated>
+        <count>1086</count>
+        <translated>1012</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>72</untranslated>
+        <untranslated>74</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Portuguese.po</file>
       <update>2021-06-25</update>
       <strings>
-        <count>1085</count>
-        <translated>1069</translated>
+        <count>1086</count>
+        <translated>1068</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>16</untranslated>
+        <untranslated>18</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Romanian.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
-        <translated>564</translated>
+        <count>1086</count>
+        <translated>563</translated>
         <fuzzy>44</fuzzy>
-        <untranslated>477</untranslated>
+        <untranslated>479</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Russian.po</file>
       <update>2021-06-25</update>
       <strings>
-        <count>1085</count>
-        <translated>1049</translated>
+        <count>1086</count>
+        <translated>1048</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>36</untranslated>
+        <untranslated>38</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Serbian.po</file>
       <update></update>
       <strings>
-        <count>1085</count>
+        <count>1086</count>
         <translated>634</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>451</untranslated>
+        <untranslated>452</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Sinhala.po</file>
       <update>2010-12-12</update>
       <strings>
-        <count>1085</count>
+        <count>1086</count>
         <translated>568</translated>
         <fuzzy>59</fuzzy>
-        <untranslated>458</untranslated>
+        <untranslated>459</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Slovak.po</file>
       <update>2020-11-02</update>
       <strings>
-        <count>1085</count>
-        <translated>979</translated>
+        <count>1086</count>
+        <translated>978</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>106</untranslated>
+        <untranslated>108</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Slovenian.po</file>
       <update>2021-07-04</update>
       <strings>
-        <count>1085</count>
-        <translated>1073</translated>
+        <count>1086</count>
+        <translated>1072</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>12</untranslated>
+        <untranslated>14</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Spanish.po</file>
       <update>2020-04-03</update>
       <strings>
-        <count>1085</count>
-        <translated>875</translated>
+        <count>1086</count>
+        <translated>874</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>210</untranslated>
+        <untranslated>212</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Swedish.po</file>
       <update>2021-04-10</update>
       <strings>
-        <count>1085</count>
-        <translated>1022</translated>
+        <count>1086</count>
+        <translated>1021</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>63</untranslated>
+        <untranslated>65</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Turkish.po</file>
       <update>2021-06-25</update>
       <strings>
-        <count>1085</count>
-        <translated>1068</translated>
+        <count>1086</count>
+        <translated>1067</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>17</untranslated>
+        <untranslated>19</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Ukrainian.po</file>
       <update>2009-06-13</update>
       <strings>
-        <count>1085</count>
-        <translated>640</translated>
+        <count>1086</count>
+        <translated>639</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>445</untranslated>
+        <untranslated>447</untranslated>
       </strings>
       <translators>
         <translator>
index be5d154..2cb4da9 100644 (file)
@@ -716,6 +716,9 @@ msgstr "الفروقات المسبقة"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "فصل"
 
@@ -1320,8 +1323,8 @@ msgstr "الوصف:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "عرض كل أدوات فك الحزم، لا تتحقق من امتداد الملف."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 86c6566..126388d 100644 (file)
@@ -903,6 +903,9 @@ msgstr "Au&rrezberdintasuna"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1656,8 +1659,8 @@ msgstr "Azalpena:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Erakutsi despaketatzaile denak, ez egiaztatu luzapena."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index f796711..c1c98f0 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "Di&vidir"
@@ -1654,8 +1657,8 @@ msgstr "Descrição:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Exibir todos os desempacotadores, não verificar a extensão."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 4de495d..e33c228 100644 (file)
@@ -712,6 +712,9 @@ msgstr ""
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Ра&зделяне"
 
@@ -1316,7 +1319,7 @@ msgstr "Описание:"
 msgid "Default arguments:"
 msgstr "Aргументи:"
 
-msgid "Display all unpackers, don't check the extension."
+msgid "Display all plugins, don't check the extension."
 msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
index 2f46496..2d977b6 100644 (file)
@@ -899,6 +899,9 @@ msgstr "&Prediferenciació"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1653,8 +1656,8 @@ msgstr "&Descripció:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "&Visualitza tots els desempaquetadors sense verificar l'extensió."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index bb88dd3..21918b2 100644 (file)
@@ -718,6 +718,9 @@ msgstr "预处理(&P)"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "分隔(&L)"
 
@@ -1320,8 +1323,8 @@ msgstr "描述:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "不检查扩展名,显示所有解包器。"
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 0a5718e..47ea3aa 100644 (file)
@@ -908,6 +908,9 @@ msgstr "先行處理器(&P)"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1664,8 +1667,8 @@ msgstr "描述:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "顯示所有解壓縮程式,不要檢查副檔名"
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index c7b52d1..94428ce 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Dodaci"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1654,8 +1657,8 @@ msgstr "Opis:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Prikaži sve arhivere bez provjere ekstenzije."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 73b70b1..9fa63f3 100644 (file)
@@ -900,6 +900,9 @@ msgstr ""
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1654,8 +1657,8 @@ msgstr "Popis:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "&Zobrazit všechny převaděče (nekontrolovat podle přípony)."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 27190e8..5b3bc08 100644 (file)
@@ -901,6 +901,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1655,8 +1658,8 @@ msgstr "Beskrivelse:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Vis all udpakkerer, tjek ikke extension."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index dea0c5d..eeafab3 100644 (file)
@@ -716,6 +716,9 @@ msgstr "Voorvergelijking"
 msgid "Apply Pre&differ..."
 msgstr "Voorvergelijking toepassen."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Splitsen"
 
@@ -1323,8 +1326,8 @@ msgstr "Beschrijving:"
 msgid "Default arguments:"
 msgstr "Standaard argumenten:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Alle uitpakkers weergeven zonder extensie te controleren."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Bestanden openen in hetzelfde venstertype na uitpakken."
index 78cc3a0..2803ae0 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: 2021-07-11 11:37+0000\n"
+"POT-Creation-Date: 2021-07-13 22:26+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
@@ -709,6 +709,9 @@ msgstr ""
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr ""
 
@@ -1311,7 +1314,7 @@ msgstr ""
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
+msgid "Display all plugins, don't check the extension."
 msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
index 96eda81..7c25549 100644 (file)
@@ -900,6 +900,9 @@ msgstr "Esivertailu"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "J&aa"
@@ -1654,8 +1657,8 @@ msgstr "Kuvaus:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Näytä kaikki purkajat, älä tarkista tiedostopäätettä."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 5e43529..741a036 100644 (file)
@@ -907,6 +907,9 @@ msgstr "&Pré-comparer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "Scinder"
@@ -1661,8 +1664,8 @@ msgstr "Description :"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Afficher tous les décompresseurs, ignorer les extensions."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 5d39f6d..822f089 100644 (file)
@@ -901,6 +901,9 @@ msgstr "Prec&omparación"
 msgid "Apply Pre&differ..."
 msgstr "Aplicar pre&diferenza…"
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "&Separar"
@@ -1655,8 +1658,8 @@ msgstr "Descrición:"
 msgid "Default arguments:"
 msgstr "Argumentos por defecto:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Amosar todos os desempaquetadores, non verificar a extensión."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Abrir arquiv&os no mesmo tipo de ventá despois de desempaquetar."
index 591463e..915d6dd 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr "Pre&differ anwenden..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "&Teilen"
@@ -1654,8 +1657,8 @@ msgstr "Beschreibung:"
 msgid "Default arguments:"
 msgstr "Standardargumente:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Alle Entpacker anzeigen, die Erweiterung nicht überprüfen."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Dateien nach dem Entpacken im gleichen Fenstertyp öffnen."
index 5554918..20b68ca 100644 (file)
@@ -899,6 +899,9 @@ msgstr "Προεπε&ξεργαστής Διαφορών"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1653,8 +1656,8 @@ msgstr "Περιγραφή:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Εμφάνιση όλων των αποσυμπιεστικών, να μην ελέγχεται η επέκταση."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 48de821..744ac4c 100644 (file)
@@ -902,6 +902,9 @@ msgstr "&Elővizsgáló"
 msgid "Apply Pre&differ..."
 msgstr "Elővizsgáló alkalmazása..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "Felosztás"
@@ -1656,8 +1659,8 @@ msgstr "Leírás:"
 msgid "Default arguments:"
 msgstr "Alapértelmezett argumentumok:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Minden kicsomagoló mutatása kiterjesztéstől függetlenül."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Kicsomagolás után a fájlok megnyitása ugyanolyan ablakban"
index 617dd25..1315323 100644 (file)
@@ -715,6 +715,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "&Dividi"
 
@@ -1317,8 +1320,8 @@ msgstr "Descrizione:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Visualizza tutti i decompressori, non verificare l'estensione."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 394595e..7592bea 100644 (file)
@@ -716,6 +716,9 @@ msgstr "比較前処理プラグイン(&P)"
 msgid "Apply Pre&differ..."
 msgstr "比較前処理プラグインを適用(&D)..."
 
+msgid "&Transform with editor script..."
+msgstr "エディタスクリプトで変換(&T)..."
+
 msgid "Sp&lit"
 msgstr "分割(&L)"
 
@@ -1322,8 +1325,8 @@ msgstr "説明:"
 msgid "Default arguments:"
 msgstr "デフォルト引数:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "拡張子を無視してすべての展開プラグインを表示する。"
+msgid "Display all plugins, don't check the extension."
+msgstr "拡張子を無視してすべてのプラグインを表示する。"
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "展開プラグイン適用後、ファイルを同じウインドウタイプで開く。(&O)"
index b5c59df..f8618af 100644 (file)
@@ -905,6 +905,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "분할(&L)"
@@ -1659,8 +1662,8 @@ msgstr "설명:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "모든 언패커를 표시하고, 확장자를 확인하지 않기."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 0aaf45a..6782e84 100644 (file)
@@ -718,6 +718,9 @@ msgstr "&Parengėjas"
 msgid "Apply Pre&differ..."
 msgstr "Taikyti paren&gėją..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Pada&linti"
 
@@ -1320,8 +1323,8 @@ msgstr "Aprašas:"
 msgid "Default arguments:"
 msgstr "Numatytieji argumentai:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Rodyti visus išpakuotojus netikrinant plėtinių."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "P&o išpakavimo atidaryti failus to paties tipo lange."
index 04c4b8a..5b9e57c 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1654,8 +1657,8 @@ msgstr "Beskrivelse:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Vis alle utpakkere, ikke kontroller filtype."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 5f22230..d75d8e3 100644 (file)
@@ -901,6 +901,9 @@ msgstr "&P پيش فرق گذار "
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1657,8 +1660,8 @@ msgstr " توصيف : "
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr " تمام بازکننده هاي بسته را نمايش بده، توسعه را بررسي نکن "
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 7d5e0d4..5f74ad2 100644 (file)
@@ -715,6 +715,9 @@ msgstr "Różnicowanie wstępne"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Podzie&lone"
 
@@ -1317,8 +1320,8 @@ msgstr "Opis:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Pokaż wszystkie programy rozpakowujące, nie sprawdzaj rozszerzenia."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index d907954..c58fb69 100644 (file)
@@ -718,6 +718,9 @@ msgstr "Pré-diferenciar"
 msgid "Apply Pre&differ..."
 msgstr "Aplicar Pré&diferenciar..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Di&vidir"
 
@@ -1326,8 +1329,8 @@ msgstr "Descrição:"
 msgid "Default arguments:"
 msgstr "Argumentos padrão:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Mostrar todos os extratores, não verificar extensões."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "&Abrir ficheiros no mesmo tipo de janela após desempacotar."
index c2d6091..798e4ba 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Prediferenţiator"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1654,8 +1657,8 @@ msgstr "Descriere:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Afişează toate dezarhivatoarele, fară a verifica extensia."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 7a7fb3c..02c5ab2 100644 (file)
@@ -717,6 +717,9 @@ msgstr "&Предсравнение"
 msgid "Apply Pre&differ..."
 msgstr "Применить предсравнение..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Разделить"
 
@@ -1319,8 +1322,8 @@ msgstr "Описание:"
 msgid "Default arguments:"
 msgstr "Аргументы по умолчанию:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Показывать все распаковщики, не проверять расширение."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Открыть файлы в том же типе окна после распаковки."
index 757cc08..097d96b 100644 (file)
@@ -898,6 +898,9 @@ msgstr "&Дефинисано поређење"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr ""
 
@@ -1639,7 +1642,7 @@ msgstr "Опис:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
+msgid "Display all plugins, don't check the extension."
 msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
index 8fec159..0b55a95 100644 (file)
@@ -897,6 +897,9 @@ msgstr "&Prediffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1651,7 +1654,7 @@ msgstr " විස්තරය:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
+msgid "Display all plugins, don't check the extension."
 msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
index 01eed6b..170a8f6 100644 (file)
@@ -718,6 +718,9 @@ msgstr "&Predbežné spracovanie rozdielov"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Od&deliť"
 
@@ -1322,8 +1325,8 @@ msgstr "Popis:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Zobraziť všetky pakovače, nekontrolovať príponu."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index fbe69de..2ffc240 100644 (file)
@@ -900,6 +900,9 @@ msgstr "&Predpregled razlik"
 msgid "Apply Pre&differ..."
 msgstr "Uporabi Prediffer..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "Ra&zdeli"
@@ -1653,8 +1656,8 @@ msgstr "Opis:"
 msgid "Default arguments:"
 msgstr "Privzeti argumenti:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Prikaži vse razpakovalce, ne glede na končnico."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "P&o razpakiranju odpri datoteke v isti vrsti okna."
index 230f9b1..e107441 100644 (file)
@@ -719,6 +719,9 @@ msgstr "&Precomparación"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "&Dividir"
 
@@ -1321,8 +1324,8 @@ msgstr "Descripción:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Mostrar todos los desempaquetadores, no comprobar exts."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index 25f4aeb..b1b5b75 100644 (file)
@@ -902,6 +902,9 @@ msgstr "PreDiffer"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr "Dela"
@@ -1656,8 +1659,8 @@ msgstr "Beskrivning:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Visa alla uppackare, kontrollera inte filsuffixet."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""
index cdb15aa..640cc81 100644 (file)
@@ -716,6 +716,9 @@ msgstr "Ön &farklılaştırıcı"
 msgid "Apply Pre&differ..."
 msgstr "Ön &farklılaştırma uygula..."
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 msgid "Sp&lit"
 msgstr "Bö&l"
 
@@ -1322,8 +1325,8 @@ msgstr "Açıklama:"
 msgid "Default arguments:"
 msgstr "Varsayılan değişkenler:"
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Uzantıya bakılmadan tüm ayıklayıcılar görüntülensin."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr "Dosyalar &ayıklandıktan sonra aynı pencerede açılsın"
index e737058..06e3627 100644 (file)
@@ -901,6 +901,9 @@ msgstr "&Попереднє порівняння"
 msgid "Apply Pre&differ..."
 msgstr ""
 
+msgid "&Transform with editor script..."
+msgstr ""
+
 #, c-format
 msgid "Sp&lit"
 msgstr ""
@@ -1655,8 +1658,8 @@ msgstr "Опис:"
 msgid "Default arguments:"
 msgstr ""
 
-msgid "Display all unpackers, don't check the extension."
-msgstr "Показувати всі розпакувальники, не перевіряючи розширення."
+msgid "Display all plugins, don't check the extension."
+msgstr ""
 
 msgid "&Open files in the same window type after unpacking."
 msgstr ""