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
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
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
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
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
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)
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
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)
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
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)
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
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
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());
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();
return false;
}
- for (auto& [plugin, args, bWithFile] : plugins)
- {
- if (plugin->m_argumentsRequired && args.empty())
- {
-
- }
- }
-
if (handlerSubcodes)
handlerSubcodes->clear();
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
{
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 *>>>
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());
}
}
}
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
{
/**
*/
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 *>>>
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" };
}
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());
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());
: 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);
}
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);
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)
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
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);
}
}
}
*/
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()
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)
{
{
if (id == idSearch)
{
+ pluginName = name;
pluginFound = plugin;
break;
}
}
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();
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
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
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;
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());
#include "ShellContextMenu.h"
#include "editcmd.h"
#include "Shell.h"
+#include "SelectPluginDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
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)
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);
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();
}
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());
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();
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);
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;
/////////////////////////////////////////////////////////////////////////////
// CSelectPluginDlg dialog
-void CSelectPluginDlg::Initialize(bool unpacker)
+void CSelectPluginDlg::Initialize(PluginType pluginType)
{
//{{AFX_DATA_INIT(CSelectPluginDlg)
m_bNoExtensionCheck = false;
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()
/////////////////////////////////////////////////////////////////////////////
// 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();
}
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);
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
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)
{
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;
+ }
}
}
}
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>");
// 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)
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);
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; }
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;
#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
</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>
# 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
<?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>
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "Di&vidir"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "分隔(&L)"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr "Voorvergelijking toepassen."
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Splitsen"
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."
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"
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "J&aa"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "Scinder"
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 ""
msgid "Apply Pre&differ..."
msgstr "Aplicar pre&diferenza…"
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "&Separar"
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."
msgid "Apply Pre&differ..."
msgstr "Pre&differ anwenden..."
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "&Teilen"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
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 ""
msgid "Apply Pre&differ..."
msgstr "Elővizsgáló alkalmazása..."
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "Felosztá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"
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "&Dividi"
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 ""
msgid "Apply Pre&differ..."
msgstr "比較前処理プラグインを適用(&D)..."
+msgid "&Transform with editor script..."
+msgstr "エディタスクリプトで変換(&T)..."
+
msgid "Sp&lit"
msgstr "分割(&L)"
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)"
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "분할(&L)"
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 ""
msgid "Apply Pre&differ..."
msgstr "Taikyti paren&gėją..."
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Pada&linti"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Podzie&lone"
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 ""
msgid "Apply Pre&differ..."
msgstr "Aplicar Pré&diferenciar..."
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Di&vidir"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr ""
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 ""
msgid "Apply Pre&differ..."
msgstr "Применить предсравнение..."
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
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 "Открыть файлы в том же типе окна после распаковки."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Od&deliť"
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 ""
msgid "Apply Pre&differ..."
msgstr "Uporabi Prediffer..."
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "Ra&zdeli"
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."
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "&Dividir"
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 ""
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
msgstr "Dela"
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 ""
msgid "Apply Pre&differ..."
msgstr "Ön &farklılaştırma uygula..."
+msgid "&Transform with editor script..."
+msgstr ""
+
msgid "Sp&lit"
msgstr "Bö&l"
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"
msgid "Apply Pre&differ..."
msgstr ""
+msgid "&Transform with editor script..."
+msgstr ""
+
#, c-format
msgid "Sp&lit"
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 ""