Plugins\Commands\q\q.bat = Plugins\Commands\q\q.bat
EndProjectSection
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PluginTests", "PluginTests", "{9738877F-0B01-4C37-855E-7465C5AB7B56}"
+ ProjectSection(SolutionItems) = preProject
+ Testing\PluginTests\PluginTests.vbs = Testing\PluginTests\PluginTests.vbs
+ EndProjectSection
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
Externals\gtest\gtest.vcxitems*{0a3727b1-51e7-4702-ad0c-8aee317ea510}*SharedItemsImports = 4
{BB290B2D-F5B9-4552-AE32-9319C03E41C0} = {AA9C3A4D-4CD6-46BE-A266-A5FE7BE52F65}
{5DADCF29-6A44-4AD1-8E42-DCB162A1907D} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
{E4EF583F-653D-4445-A649-555C8AD730E7} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
+ {9738877F-0B01-4C37-855E-7465C5AB7B56} = {14FC5F77-041C-49BF-B28F-F976EC6F253C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CC2E4F75-FADC-4F44-BD62-47A321828081}
Plugins\Commands\q\q.bat = Plugins\Commands\q\q.bat
EndProjectSection
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PluginTests", "PluginTests", "{9738877F-0B01-4C37-855E-7465C5AB7B56}"
+ ProjectSection(SolutionItems) = preProject
+ Testing\PluginTests\PluginTests.vbs = Testing\PluginTests\PluginTests.vbs
+ EndProjectSection
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
Externals\gtest\gtest.vcxitems*{0a3727b1-51e7-4702-ad0c-8aee317ea510}*SharedItemsImports = 4
{BB290B2D-F5B9-4552-AE32-9319C03E41C0} = {AA9C3A4D-4CD6-46BE-A266-A5FE7BE52F65}
{5DADCF29-6A44-4AD1-8E42-DCB162A1907D} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
{E4EF583F-653D-4445-A649-555C8AD730E7} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
+ {9738877F-0B01-4C37-855E-7465C5AB7B56} = {14FC5F77-041C-49BF-B28F-F976EC6F253C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CC2E4F75-FADC-4F44-BD62-47A321828081}
<get/>
<put/>
</property>
+ <method name="ExecFilterCommand"/>
<method name="MakeUpper"/>
<method name="MakeLower"/>
<method name="RemoveDuplicates"/>
<method name="CountDuplicates"/>
<method name="SortAscending"/>
<method name="SortDescending"/>
- <method name="ExecFilterCommand"/>
- <method name="Tokenize"/>
- <method name="Trim"/>
+ <method name="ReverseColumns"/>
+ <method name="ReverseLines"/>
<method name="SelectColumns"/>
<method name="SelectLines"/>
+ <method name="Replace" internalName="ReplaceText"/>
+ <method name="Tokenize"/>
+ <method name="Trim"/>
</implements>
<script language="VBS">
"SortDescending.MenuCaption=Sort Lines Descending;" & _
"SortDescending.Description=Sort lines descending;" & _
"ExecFilterCommand.MenuCaption=Apply Filter Command...;" & _
- "ExecFilterCommand.Description=Apply filter command. " & vbCrLf & "Arguments: filter command. %1 is replaced with the file name.;" & _
+ "ExecFilterCommand.Description=Apply filter command. " & vbCrLf & _
+ "Arguments: filter command. %1 is replaced with the file name.;" & _
"ExecFilterCommand.ArgumentsRequired;" & _
"Tokenize.MenuCaption=Tokenize...;" & _
- "Tokenize.Description=Tokenize selection. " & vbCrLf & "Arguments: a regular expression for tokenizing. (e.g. [^\w]+);" & _
+ "Tokenize.Description=Tokenize selection. " & vbCrLf & _
+ "Arguments: a regular expression for tokenizing. (e.g. [^\w]+);" & _
"Tokenize.ArgumentsRequired;" & _
"Trim.MenuCaption=Trim Spaces;" & _
"Trim.Description=Trim spaces;" & _
"SelectColumns.MenuCaption=Select Columns...;" & _
- "SelectColumns.Description=Select some columns." & vbCrLf & "Arguments: list of column ranges to select. (e.g. -3,5-10,30-);" & _
+ "SelectColumns.Description=Select some columns." & vbCrLf & _
+ "Arguments: list of column ranges to select. (e.g. -3,5-10,30-) or regular expression;" & _
"SelectColumns.ArgumentsRequired;" & _
"SelectLines.MenuCaption=Select Lines...;" & _
- "SelectLines.Description=Select some lines." & vbCrLf & "Arguments: list of line ranges to select. (e.g. -3,5-10,30-);" & _
- "SelectLines.ArgumentsRequired;"
+ "SelectLines.Description=Select some lines." & vbCrLf & _
+ "Arguments: list of line ranges to select. (e.g. -3,5-10,30-) or regular expression;" & _
+ "SelectLines.ArgumentsRequired;" & _
+ "ReverseColumns.MenuCaption=Reverse Columns;" & _
+ "ReverseColumns.Description=Reverse columns;" & _
+ "ReverseLines.MenuCaption=Reverse Lines;" & _
+ "ReverseLines.Description=Reverse lines;" & _
+ "Replace.MenuCaption=Replace...;" & _
+ "Replace.Description=Replace text with another text." & vbCrLf & _
+ "Arguments: search text and replacement text;" & _
+ "Replace.ArgumentsRequired;"
End Function
Function get_PluginArguments()
End Sub
Function get_PluginVariables()
- get_PluginVariables = Join(ariables, Chr(0))
+ get_PluginVariables = Join(variables, Chr(0))
End Function
Sub put_PluginVariables(NewValue)
IsLangJapanese = (languageId = 1041)
End Function
-' transformation functions
-Function MakeUpper(Text)
- MakeUpper = UCase(Text)
-End Function
-
-Function MakeLower(Text)
- MakeLower = LCase(Text)
-End Function
-
-Function ReplaceVariables(ByVal str)
+Function ReplaceVariables(str)
Dim newstr
Dim pos
Dim foundpos
IsFirstArgumentEmpty = (Trim(arguments) = "")
End Function
+Function SafeUBound(ary)
+ SafeUBound = -1
+ On Error Resume Next
+ SafeUBound = UBound(ary)
+End Function
+
+Function ParseArguments(args)
+ Dim ary()
+ Dim ch
+ Dim inQuotes
+ Dim token
+ Dim argsLen
+ Dim i, j
+ argsLen = Len(args)
+ For i = 1 To argsLen
+ ch = Mid(args, i, 1)
+ If Not inQuotes Then
+ If ch = " " Or ch = vbTab Then
+ If len(token) > 0 Then
+ ReDim Preserve ary(j)
+ ary(j) = token
+ j = j + 1
+ token = ""
+ End If
+ ElseIf ch = """" Then
+ inQuotes = True
+ Else
+ token = token & ch
+ End If
+ Else
+ If ch = """" Then
+ If i + 1 <= argsLen Then
+ If Mid(args, i + 1, 1) = """" Then
+ token = token & ch
+ End if
+ End If
+ inQuotes = False
+ Else
+ token = token & ch
+ End If
+ End If
+ Next
+ If Len(token) > 0 Then
+ ReDim Preserve ary(j)
+ ary(j) = token
+ j = j + 1
+ token = ""
+ End If
+ ParseArguments = ary
+End Function
+
+Function ParseRanges(rangeText)
+ Dim i, j
+ Dim ary, ary2, aryRanges()
+ Dim rangeFrom, rangeTo
+ ary = Split(rangeText, ",")
+ j = 0
+ For i = 0 To SafeUBound(ary)
+ ary2 = Split(ary(i), "-")
+ rangeFrom = ""
+ If SafeUBound(ary2) >= 0 Then
+ rangeFrom = Trim(ary2(0))
+ End If
+ rangeTo = rangeFrom
+ If SafeUBound(ary2) > 0 Then
+ rangeTo = Trim(ary2(1))
+ End If
+ If IsNumeric(rangeFrom) Or IsNumeric(rangeTo) Then
+ If Not IsNumeric(rangeFrom) Then rangeFrom = 1
+ If Not IsNumeric(rangeTo) Then rangeTo = 1000000000
+ If CDbl(rangeFrom) < 1 Or CDbl(rangeFrom) > 1000000000 Then rangeFrom = 1
+ If CDbl(rangeTo) < 1 Or CDbl(rangeTo) > 1000000000 Then rangeTo = 1
+ If CDbl(rangeFrom) > CDbl(rangeTo) Then rangeTo = rangeFrom
+ Redim preserve aryRanges(j)
+ aryRanges(j) = Array(CLng(rangeFrom), CLng(rangeTo))
+ j = j + 1
+ End If
+ Next
+ ParseRanges = aryRanges
+End Function
+
+Function ParseSelectColumnsLinesArguments(args, invert)
+ Dim rangesOrRegExps()
+ Dim argAry
+ Dim i, j
+ Dim re
+ Dim isOption
+ Set re = Nothing
+ argAry = ParseArguments(args)
+ invert = False
+ For i = 0 To SafeUBound(argAry)
+ isOption = False
+ If Len(argAry(i)) >= 2 Then
+ Select Case Left(argAry(i), 1)
+ Case "-", "/"
+ Select Case Mid(argAry(i), 2, 1)
+ Case "e", "i", "g"
+ isOption = True
+ If re Is Nothing Then
+ Set re = New RegExp
+ Redim Preserve rangesOrRegExps(j)
+ Set rangesOrRegExps(j) = re
+ j = j + 1
+ End If
+ If InStr(argAry(i), "i") > 0 Then
+ re.IgnoreCase = True
+ End If
+ If InStr(argAry(i), "g") > 0 Then
+ re.Global = True
+ End If
+ Case "v"
+ isOption = True
+ invert = True
+ End Select
+ End Select
+ End If
+ If Not isOption Then
+ If Not (re Is Nothing) Then
+ re.Pattern = argAry(i)
+ Set re = Nothing
+ Else
+ Redim Preserve rangesOrRegExps(j)
+ rangesOrRegExps(j) = ParseRanges(argAry(i))
+ If SafeUBound(rangesOrRegExps(j)) < 0 Then
+ Set rangesOrRegExps(j) = New RegExp
+ rangesOrRegExps(j).Pattern = argAry(i)
+ End If
+ j = j + 1
+ End If
+ End If
+ Next
+ ParseSelectColumnsLinesArguments = rangesOrRegExps
+End Function
+
+Function ParseReplaceArguments(args, regex, ignoreCase)
+ Dim patterns()
+ Dim argAry
+ Dim i, j
+ Dim re
+ Dim isOption
+ Set re = Nothing
+ argAry = ParseArguments(args)
+ regex = False
+ ignoreCase = False
+ For i = 0 To SafeUBound(argAry)
+ isOption = False
+ If Len(argAry(i)) >= 2 Then
+ Select Case Left(argAry(i), 1)
+ Case "-", "/"
+ Select Case Mid(argAry(i), 2, 1)
+ Case "e", "i"
+ isOption = True
+ regex = True
+ If InStr(argAry(i), "i") > 0 Then
+ ignoreCase = True
+ End If
+ End Select
+ End Select
+ End If
+ If Not isOption Then
+ Redim Preserve patterns(j)
+ patterns(j) = argAry(i)
+ j = j + 1
+ End If
+ Next
+ ParseReplaceArguments = patterns
+End Function
+
+Function SplitLines(text, eol)
+ Dim re, matches
+ Set re = New RegExp
+ re.Global = False
+ re.IgnoreCase = False
+ re.Pattern = "\r\n|\n|\r"
+ Set matches = re.Execute(text)
+ If matches.Count > 0 Then
+ eol = matches(0).Value
+ End If
+ SplitLines = Split(text, eol)
+End Function
+
+' transformation functions
+Function MakeUpper(Text)
+ MakeUpper = UCase(Text)
+End Function
+
+Function MakeLower(Text)
+ MakeLower = LCase(Text)
+End Function
+
Function ExecFilterCommand(Text)
Dim cmd
If IsFirstArgumentEmpty() Then
ts.Close
Dim exe
- Set exe = wsh.Exec("cmd /c type """ & path & """ | " & cmd & " 2>&1")
+ 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
End Function
-Function SafeUBound(ary)
- SafeUBound = -1
- On Error Resume Next
- SafeUBound = UBound(ary)
-End Function
-
-Function ParseRanges(ByVal rangeText)
- Dim i, j
- Dim ary, ary2, aryRanges()
- Dim rangeFrom, rangeTo
- ary = Split(rangeText, ",")
- j = 0
- For i = 0 To SafeUBound(ary)
- ary2 = Split(ary(i), "-")
- rangeFrom = ""
- If SafeUBound(ary2) >= 0 Then
- rangeFrom = Trim(ary2(0))
- End If
- rangeTo = rangeFrom
- If SafeUBound(ary2) > 0 Then
- rangeTo = Trim(ary2(1))
- End If
- If IsNumeric(rangeFrom) Or IsNumeric(rangeTo) Then
- If Not IsNumeric(rangeFrom) Then rangeFrom = 1
- If Not IsNumeric(rangeTo) Then rangeTo = 1000000000
- If CDbl(rangeFrom) < 1 Or CDbl(rangeFrom) > 1000000000 Then rangeFrom = 1
- If CDbl(rangeTo) < 1 Or CDbl(rangeTo) > 1000000000 Then rangeTo = 1
- If CDbl(rangeFrom) > CDbl(rangeTo) Then rangeTo = rangeFrom
- Redim preserve aryRanges(j)
- aryRanges(j) = Array(CLng(rangeFrom), CLng(rangeTo))
- j = j + 1
- End If
- Next
- ParseRanges = aryRanges
-End Function
-
Function SelectColumns(Text)
- Dim rangesStr, ranges
- Dim re
- Dim matches
+ Dim args, ranges, regexpStr
+ Dim matches, m
Dim lines, eol, line
- Dim i, j
+ Dim i, j, k
+ Dim rangesOrRegExps
+ Dim invert
If IsFirstArgumentEmpty() Then
- rangesStr = regRead(PluginRegKeyPath & "SelectColumns", "")
+ args = regRead(PluginRegKeyPath & "SelectColumns", "")
If IsLangJapanese() Then
- rangesStr = InputBox("\92\8a\8fo\82·\82é\97ñ\94Ô\8d\86\82Ü\82½\82Í\97ñ\94Ô\8d\86\82Ì\94Í\88Í\82ð1\82Â\82Ü\82½\82Í\83J\83\93\83}\8bæ\90Ø\82è\82Å\95¡\90\94\8ew\92è\82µ\82Ä\82\82¾\82³\82¢ (\97á: -3,5-10,30-):", "SelectColumns", ranges)
+ args = InputBox("\92\8a\8fo\82·\82é\97ñ\94Ô\8d\86\82Ì\94Í\88Í\82Ü\82½\82Í\90³\8bK\95\\8c»\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
- rangesStr = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-):", "SelectColumns", rangesStr)
+ args = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectColumns", args)
End If
- If rangesStr <> "" Then
- wsh.RegWrite PluginRegKeyPath & "SelectColumns", rangesStr
+ If args <> "" Then
+ wsh.RegWrite PluginRegKeyPath & "SelectColumns", args
End If
Else
- rangesStr = arguments
+ args = arguments
End If
- If rangesStr = "" Then
+ If args = "" Then
If IsLangJapanese() Then
Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
Else
End If
Exit Function
End If
- ranges = ParseRanges(rangesStr)
- Set re = New RegExp
- re.Global = False
- re.IgnoreCase = False
- re.Pattern = "\r\n|\n|\r"
- Set matches = re.Execute(Text)
- If matches.Count > 0 Then
- eol = matches(0).Value
- End If
- lines = Split(Text, eol)
+ lines = SplitLines(Text, eol)
+ rangesOrRegExps = ParseSelectColumnsLinesArguments(args, invert)
For i = 0 To SafeUBound(lines)
line = ""
- For j = 0 To SafeUBound(ranges)
- If ranges(j)(0) <= Len(lines(i)) Then
- line = line & Mid(lines(i), ranges(j)(0), ranges(j)(1) - ranges(j)(0) + 1)
+ For j = 0 To SafeUBound(rangesOrRegExps)
+ If IsArray(rangesOrRegExps(j)) Then
+ For k = 0 To SafeUBound(rangesOrRegExps(j))
+ If rangesOrRegExps(j)(k)(0) <= Len(lines(i)) Then
+ line = line & Mid(lines(i), rangesOrRegExps(j)(k)(0), rangesOrRegExps(j)(k)(1) - rangesOrRegExps(j)(k)(0) + 1)
+ End If
+ Next
+ Else
+ If Not invert Then
+ Set matches = rangesOrRegExps(j).Execute(lines(i))
+ For Each m In matches
+ line = line & m.Value
+ Next
+ Else
+ line = line & rangesOrRegExps(j).Replace(lines(i), "")
+ End If
End If
Next
lines(i) = line
End Function
Function SelectLines(Text)
- Dim rangesStr, ranges
- Dim re
- Dim matches
+ Dim args, ranges
+ Dim matches, rangesOrRegExps
Dim lines, newlines(), eol
- Dim i, j, k
+ Dim i, j, k, l
+ Dim max
+ Dim matched
+ Dim invert
If IsFirstArgumentEmpty() Then
- rangesStr = regRead(PluginRegKeyPath & "SelectLines", "")
+ args = regRead(PluginRegKeyPath & "SelectLines", "")
If IsLangJapanese() Then
- rangesStr = InputBox("\92\8a\8fo\82·\82é\8ds\94Ô\8d\86\82Ü\82½\82Í\8ds\94Ô\8d\86\82Ì\94Í\88Í\82ð1\82Â\82Ü\82½\82Í\83J\83\93\83}\8bæ\90Ø\82è\82Å\95¡\90\94\8ew\92è\82µ\82Ä\82\82¾\82³\82¢ (\97á: -3,5-10,30-):", "SelectLines", ranges)
+ 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
- rangesStr = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-):", "SelectLines", rangesStr)
+ args = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectLines", args)
End If
- If rangesStr <> "" Then
- wsh.RegWrite PluginRegKeyPath & "SelectLines", rangesStr
+ If args <> "" Then
+ wsh.RegWrite PluginRegKeyPath & "SelectLines", args
End If
Else
- rangesStr = arguments
+ args = arguments
End If
- If rangesStr = "" Then
+ If args = "" Then
If IsLangJapanese() Then
Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
Else
End If
Exit Function
End If
- ranges = ParseRanges(rangesStr)
- Set re = New RegExp
- re.Global = False
- re.IgnoreCase = False
- re.Pattern = "\r\n|\n|\r"
- Set matches = re.Execute(Text)
- If matches.Count > 0 Then
- eol = matches(0).Value
- End If
- lines = Split(Text, eol)
- k = 0
- For i = 0 To SafeUBound(ranges)
- For j = ranges(i)(0) - 1 To ranges(i)(1) - 1
- If j < SafeUBound(lines) Then
- ReDim Preserve newlines(k)
- newlines(k) = lines(j)
- k = k + 1
- End If
- Next
+ lines = SplitLines(Text, eol)
+ l = 0
+ rangesOrRegExps = ParseSelectColumnsLinesArguments(args, invert)
+ For i = 0 To SafeUBound(rangesOrRegExps)
+ If IsArray(rangesOrRegExps(i)) Then
+ For j = 0 To SafeUBound(rangesOrRegExps(i))
+ max =rangesOrRegExps(i)(j)(1) - 1
+ If max > SafeUBound(lines) Then max = SafeUBound(lines)
+ For k = rangesOrRegExps(i)(j)(0) - 1 To max
+ If k <= SafeUBound(lines) Then
+ ReDim Preserve newlines(l)
+ newlines(l) = lines(k)
+ l = l + 1
+ End If
+ Next
+ Next
+ Else
+ For j = 0 To SafeUBound(lines)
+ matched = rangesOrRegExps(i).Test(lines(j))
+ If invert Then matched = Not matched
+ If matched Then
+ ReDim Preserve newlines(l)
+ newlines(l) = lines(j)
+ l = l + 1
+ End If
+ Next
+ End If
Next
If SafeUBound(lines) >= 0 Then
- If lines(SafeUBound(lines)) = "" Then
- ReDim Preserve newlines(k)
- newlines(k) = ""
- k = k + 1
+ If lines(UBound(lines)) = "" Then
+ If SafeUBound(newlines) >= 0 Then
+ If newlines(UBound(newlines)) <> "" Then
+ ReDim Preserve newlines(l)
+ newlines(l) = ""
+ l = l + 1
+ End If
+ End If
End If
End If
SelectLines = Join(newlines, eol)
End Function
+Function ReplaceText(Text)
+ Dim args, patterns
+ Dim i
+ Dim re, regex
+ Dim ignoreCase
+ 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", ranges)
+ Else
+ args = InputBox("Enter the search text and replacement text:", "Replace", args)
+ End If
+ If args <> "" Then
+ wsh.RegWrite PluginRegKeyPath & "Replace", args
+ End If
+ Else
+ 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
+ Exit Function
+ End If
+ patterns = ParseReplaceArguments(args, regex, ignoreCase)
+ If regex Then
+ For i = 0 To SafeUBound(patterns) Step 2
+ Set re = New RegExp
+ re.IgnoreCase = ignoreCase
+ re.Global = True
+ re.Multiline = True
+ re.Pattern = patterns(i)
+ If i + 1 <= UBound(patterns) Then
+ ReplaceText = re.Replace(ReplaceText, patterns(i + 1))
+ Else
+ ReplaceText = re.Replace(ReplaceText, "")
+ End If
+ Next
+ Else
+ For i = 0 To SafeUBound(patterns) Step 2
+ If i + 1 <= UBound(patterns) Then
+ ReplaceText = Replace(ReplaceText, patterns(i), patterns(i + 1))
+ Else
+ ReplaceText = Replace(ReplaceText, patterns(i), "")
+ End If
+ Next
+ End If
+End Function
+
' port from WinMerge2011
Function Tokenize(Text)
Dim pattern
}
}
if (lasteol)
- newlines[j] = "";
+ newlines.push("");
return newlines.join(eol);
}
newlines[j] = line + '\t' + dic[line];
j++;
}
- newlines[j] = "";
+ if (eol)
+ newlines[j] = "";
return newlines.join(eol);
}
+function ReverseColumns(Text) {
+ var eol = Text.match(/\r\n|\n|\r/);
+ var lines = Text.split(eol);
+ var lasteol = false;
+ if (!lines[lines.length - 1]) {
+ lines.pop();
+ lasteol = true;
+ }
+ for (var i = 0; i < lines.length; i++) {
+ var line = lines[i];
+ var newline = "";
+ for (var j = 0; j < line.length; j++)
+ newline += line.substr(line.length - j - 1, 1);
+ lines[i] = newline;
+ }
+ if (lasteol)
+ lines.push("");
+ return lines.join(eol);
+}
+
+function ReverseLines(Text) {
+ var eol = Text.match(/\r\n|\n|\r/);
+ var lines = Text.split(eol);
+ var lasteol = false;
+ if (!lines[lines.length - 1]) {
+ lines.pop();
+ lasteol = true;
+ }
+ var m = parseInt(lines.length / 2);
+ for (var i = 0; i < m; i++) {
+ var line = lines[i];
+ lines[i] = lines[lines.length - i - 1]
+ lines[lines.length - i - 1] = line;
+ }
+ if (lasteol)
+ lines.push("");
+ return lines.join(eol);
+}
+
function SortAscending(Text) {
var eol = Text.match(/\r\n|\n|\r/);
var lines = Text.split(eol);
IDS_PLUGIN_MENU_CAPTION4 "Count Duplicate Lines"\r
IDS_PLUGIN_MENU_CAPTION5 "Sort Lines Ascending"\r
IDS_PLUGIN_MENU_CAPTION6 "Sort Lines Descending"\r
- IDS_PLUGIN_MENU_CAPTION7 "Apply Filter Command..."\r
- IDS_PLUGIN_MENU_CAPTION8 "Tokenize..."\r
- IDS_PLUGIN_MENU_CAPTION9 "Trim Spaces"\r
- IDS_PLUGIN_MENU_CAPTION10 "Select Columns..."\r
- IDS_PLUGIN_MENU_CAPTION11 "Select Lines..."\r
- IDS_PLUGIN_MENU_CAPTION12 "Insert Date"\r
- IDS_PLUGIN_MENU_CAPTION13 "Insert Time"\r
- IDS_PLUGIN_MENU_CAPTION14 "Apply Patch..."\r
- IDS_PLUGIN_MENU_CAPTION15 "Ignore Columns"\r
- IDS_PLUGIN_MENU_CAPTION16 "Ignore Comments (C-Family Languages)"\r
- IDS_PLUGIN_MENU_CAPTION17 "Ignore CSV Fields"\r
- IDS_PLUGIN_MENU_CAPTION18 "Ignore TSV Fields"\r
- IDS_PLUGIN_MENU_CAPTION19 "Apply Prediff Substitution Filters"\r
- IDS_PLUGIN_MENU_CAPTION20 "Prettify JSON"\r
- IDS_PLUGIN_MENU_CAPTION21 "Prettify XML"\r
- IDS_PLUGIN_MENU_CAPTION22 "Visualize Graphviz"\r
- IDS_PLUGIN_MENU_CAPTION23 "Query CSV Data..."\r
- IDS_PLUGIN_MENU_CAPTION24 "Query TSV Data..."\r
- IDS_PLUGIN_MENU_CAPTION25 "Query JSON Data..."\r
+ IDS_PLUGIN_MENU_CAPTION7 "Reverse Columns"\r
+ IDS_PLUGIN_MENU_CAPTION8 "Reverse Lines"\r
+ IDS_PLUGIN_MENU_CAPTION9 "Replace..."\r
+ IDS_PLUGIN_MENU_CAPTION10 "Apply Filter Command..."\r
+ IDS_PLUGIN_MENU_CAPTION11 "Tokenize..."\r
+ IDS_PLUGIN_MENU_CAPTION12 "Trim Spaces"\r
+ IDS_PLUGIN_MENU_CAPTION13 "Select Columns..."\r
+ IDS_PLUGIN_MENU_CAPTION14 "Select Lines..."\r
+ IDS_PLUGIN_MENU_CAPTION15 "Insert Date"\r
+ IDS_PLUGIN_MENU_CAPTION16 "Insert Time"\r
+ IDS_PLUGIN_MENU_CAPTION17 "Apply Patch..."\r
+ IDS_PLUGIN_MENU_CAPTION18 "Ignore Columns"\r
+ IDS_PLUGIN_MENU_CAPTION19 "Ignore Comments (C-Family Languages)"\r
+ IDS_PLUGIN_MENU_CAPTION20 "Ignore CSV Fields"\r
+ IDS_PLUGIN_MENU_CAPTION21 "Ignore TSV Fields"\r
+ IDS_PLUGIN_MENU_CAPTION22 "Apply Prediff Substitution Filters"\r
+ IDS_PLUGIN_MENU_CAPTION23 "Prettify JSON"\r
+ IDS_PLUGIN_MENU_CAPTION24 "Prettify XML"\r
+ IDS_PLUGIN_MENU_CAPTION25 "Visualize Graphviz"\r
+ IDS_PLUGIN_MENU_CAPTION26 "Query CSV Data..."\r
+ IDS_PLUGIN_MENU_CAPTION27 "Query TSV Data..."\r
+ IDS_PLUGIN_MENU_CAPTION28 "Query JSON Data..."\r
IDS_PLUGIN_MISSING_PLUGIN_NAME "Missing plugin name in plugin pipeline: %1"\r
IDS_PLUGIN_MISSING_QUOTATION_MARK"Missing quotation mark in plugin pipeline: %1"\r
IDS_PLUGIN_TITLE1 "Specify plugin arguments"\r
Dim FileSys
Dim ScriptFolder
+Dim g_cnt
+Dim g_testname
Set FileSys = CreateObject("Scripting.FileSystemObject")
ScriptFolder = FileSys.getParentFolderName(WScript.ScriptFullName)
-Sub AssertTrue(ByVal value, ByVal msg)
+Sub SetTestName(testname)
+ g_cnt = 0
+ g_testname = testname
+End Sub
+
+Function GetCurrentTestName()
+ GetCurrentTestName = g_testname & g_cnt
+End Function
+
+Sub AssertTrue(value)
+ g_cnt = g_cnt + 1
If Not value Then
- Err.Raise 30001, , msg
+ Err.Raise 30001, , GetCurrentTestName()
+ End If
+End Sub
+
+Sub AssertEquals(expected, actual)
+ g_cnt = g_cnt + 1
+ If expected <> actual Then
+ Err.Raise 30001, , GetCurrentTestName() & vbCrLf & "expected: """ & expected & """" & vbCrLf & "actual: """ & actual & """"
End If
End Sub
Sub EditorAddinTest
Dim p
+ Dim i
+ Dim asciiChars
+ Dim chars
Set p = GetObject("script: " & ScriptFolder & "\..\..\Plugins\dlls\editor addin.sct")
+ For i = 0 To 127
+ asciiChars = asciiChars & Chr(i)
+ Next
+
+ ' MakeUpper
+ SetTestName "MakeUpper"
+ AssertEquals "", p.MakeUpper("")
+ AssertEquals " ~0129ABCZABCZ", p.MakeUpper(" ~0129abczABCZ")
+ AssertEquals Replace(asciiChars, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), p.MakeUpper(asciiChars)
+
+ ' MakeLower
+ SetTestName "MakeLower"
+ AssertEquals "", p.MakeLower("")
+ AssertEquals " ~0129abczabcz", p.MakeLower(" ~0129abczABCZ")
+ AssertEquals Replace(asciiChars, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"), p.MakeLower(asciiChars)
+
+ ' ExecFilterCommand
+ SetTestName "ExecFilterCommand"
+ p.PluginArguments = "sort"
+ AssertEquals "1" & vbCrLf & "2" & vbCrLf, p.ExecFilterCommand("2" & vbCrLf & "1" & vbCrLf)
+ p.PluginArguments = "echo a"
+ AssertEquals "a " & vbCrLf, p.ExecFilterCommand("")
+
+ ' SelectColumns
+ SetTestName "SelectColumns"
+ p.PluginArguments = "1"
+ AssertEquals "a", p.SelectColumns("abc")
+ AssertEquals "a" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "def")
+ AssertEquals "a" & vbCrLf & "d" & vbCrLf, p.SelectColumns("abc" & vbCrLf & "def" & vbCrLf)
+ p.PluginArguments = "3"
+ AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "1,3"
+ AssertEquals "ac" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "de")
+ p.PluginArguments = "1-3"
+ AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-3"
+ AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "1-"
+ AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "2-"
+ AssertEquals "bc" & vbCrLf & "ef", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "3-"
+ AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "4-"
+ AssertEquals "" & vbCrLf & "", p.SelectColumns("abc" & vbCrLf & "def")
+
+ p.PluginArguments = "-e ab"
+ AssertEquals "", p.SelectColumns("")
+ AssertEquals "ab" & vbCrLf & "", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-e ""ab|de"""
+ AssertEquals "ab" & vbCrLf & "de", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-e ^."
+ AssertEquals "a" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-e .*"
+ AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-e -i ""Ab|dE"""
+ AssertEquals "ab" & vbCrLf & "de", p.SelectColumns("abc" & vbCrLf & "def")
+ p.PluginArguments = "-v -e ""ab|de"""
+ AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+
+ p.PluginArguments = "1-3 -e ab 2-3"
+ AssertEquals "abcabbc" & vbCrLf & "defef", p.SelectColumns("abc" & vbCrLf & "def")
+
+ ' SelectLines
+ SetTestName "SelectLines"
+ p.PluginArguments = "1"
+ AssertEquals "", p.SelectLines("")
+ AssertEquals "aaa", p.SelectLines("aaa")
+ p.PluginArguments = "2"
+ AssertEquals "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ p.PluginArguments = "1,2"
+ AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ p.PluginArguments = "1-2"
+ AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "1-"
+ AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ AssertEquals "aaa" & vbCrLf & vbCrLf & vbCrLf, p.SelectLines("aaa" & vbCrLf & vbCrLf & vbCrLf)
+ p.PluginArguments = "-2"
+ AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "4-5"
+ AssertEquals "", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "", p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+ p.PluginArguments = "-e aa"
+ AssertEquals "", p.SelectLines("")
+ AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "-e -i AA"
+ AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "-e .*"
+ AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "^a"
+ AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "a$"
+ AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+ p.PluginArguments = "-v a$"
+ AssertEquals "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+ AssertEquals "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+ p.PluginArguments = "1 -e c$"
+ AssertEquals "aaa" & vbCrLf & "ccc", p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf & "ccc")
+
+ ' Replace
+ SetTestName "Replace"
+ p.PluginArguments = "abc def"
+ AssertEquals "", p.Replace("")
+ AssertEquals "def def def def", p.Replace("abc def abc def")
+ p.PluginArguments = "-e a.c XXX"
+ AssertEquals "", p.Replace("")
+ AssertEquals "XXX def XXX def", p.Replace("abc def abc def")
+ p.PluginArguments = "-e -i A.C XXX"
+ AssertEquals "XXX def XXX def", p.Replace("abc def abc def")
+ p.PluginArguments = "-e ^\d+ XXX"
+ AssertEquals "XXX abc" & vbCrLf & "XXX def", p.Replace("1000 abc" & vbCrLf & "1001 def")
+
+ ' ReverseColumns
+ SetTestName "ReverseColumns"
+ AssertEquals "", p.ReverseColumns("")
+ AssertEquals "a", p.ReverseColumns("a")
+ AssertEquals "a" & vbCrLf & "b", p.ReverseColumns("a" & vbCrLf & "b")
+ AssertEquals "ba", p.ReverseColumns("ab")
+ AssertEquals "ba" & vbCrLf & "dc", p.ReverseColumns("ab" & vbCrLf & "cd")
+ AssertEquals "cba", p.ReverseColumns("abc")
+ AssertEquals "cba" & vbCrLf & "fed", p.ReverseColumns("abc" & vbCrLf & "def")
+ AssertEquals "dcba", p.ReverseColumns("abcd")
+ AssertEquals "dcba" & vbCrLf & "hgfe", p.ReverseColumns("abcd" & vbCrLf & "efgh")
+
+ ' ReverseLines
+ SetTestName "ReverseLines"
+ AssertEquals "", p.ReverseLines("")
+ AssertEquals "a", p.ReverseLines("a")
+ AssertEquals "a" & vbCrLf, p.ReverseLines("a" & vbCrLf)
+ AssertEquals "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b")
+ AssertEquals "b" & vbCrLf & "a" & vbCrLf, p.ReverseLines("a" & vbCrLf & "b" & vbCrLf)
+ AssertEquals "c" & vbCrLf & "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c")
+ AssertEquals "c" & vbCrLf & "b" & vbCrLf & "a" & vbCrLf, p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c" & vbCrLf)
+ AssertEquals "d" & vbCrLf & "c" & vbCrLf & "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c" & vbCrLf & "d")
+
+ ' Tokenize
+ SetTestName "Tokenize"
+ p.PluginArguments = "[^\w]+"
+ AssertEquals "", p.Tokenize("")
+ AssertEquals "aaa", p.Tokenize("aaa")
+ AssertEquals "aaa" & vbCrLf & "abcd", p.Tokenize("aaa abcd")
+
+ ' RemoveDuplicates
+ SetTestName "RemoveDuplicates"
+ AssertEquals "", p.RemoveDuplicates("")
+ AssertEquals "aaa", p.RemoveDuplicates("aaa")
+ AssertEquals "aaa", p.RemoveDuplicates("aaa" & vbCrLf & "aaa")
+ AssertEquals "aaa" & vbCrLf, p.RemoveDuplicates("aaa" & vbCrLf & "aaa" & vbCrLf)
+ AssertEquals "aaa" & vbCrLf & "bbb", p.RemoveDuplicates("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.RemoveDuplicates("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+ ' CountDuplicates
+ SetTestName "CountDuplicates"
+ AssertEquals "", p.CountDuplicates("")
+ AssertEquals "aaa" & vbTab & "1", p.CountDuplicates("aaa")
+ AssertEquals "aaa" & vbTab & "2" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "aaa")
+ AssertEquals "aaa" & vbTab & "2" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "aaa" & vbCrLf)
+ AssertEquals "aaa" & vbTab & "1" & vbCrLf & "bbb" & vbTab & "1" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "bbb")
+ AssertEquals "aaa" & vbTab & "1" & vbCrLf & "bbb" & vbTab & "1" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "bbb" & vbCrLf)
+
' Trim
- AssertTrue ("aaa" = p.Trim("aaa")), "Trim1"
- AssertTrue ("aaa" = p.Trim(" aaa")), "Trim2"
- AssertTrue ("aaa" = p.Trim("aaa ")), "Trim3"
- AssertTrue ("aaa" = p.Trim(" aaa ")), "Trim4"
- AssertTrue ("aaa" = p.Trim(vbTab & " aaa " & vbTab)), "Trim5"
- AssertTrue ("aaa" & vbCrLf & "bbb" = p.Trim(" aaa " & vbCrLf & " bbb ")), "Trim6"
- AssertTrue ("aaa" & vbCrLf & "bbb" & vbCrLf = p.Trim(" aaa " & vbCrLf & " bbb " & vbCrLf)), "Trim7"
+ SetTestName "Trim"
+ AssertEquals "", p.Trim("")
+ AssertEquals "", p.Trim(" ")
+ AssertEquals "aaa", p.Trim("aaa")
+ AssertEquals "aaa", p.Trim(" aaa")
+ AssertEquals "aaa", p.Trim("aaa ")
+ AssertEquals "aaa", p.Trim(" aaa ")
+ AssertEquals "aaa", p.Trim(vbTab & " aaa " & vbTab)
+ AssertEquals "aaa" & vbCrLf & "bbb", p.Trim(" aaa " & vbCrLf & " bbb ")
+ AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.Trim(" aaa " & vbCrLf & " bbb " & vbCrLf)
+
End Sub
EditorAddinTest
-
'CompareMSExcelFilesTest
-
</head>
<body>
<h1>Translations Status</h1>
-<p>Status from <strong>2021-06-24</strong>:</p>
+<p>Status from <strong>2021-06-26</strong>:</p>
<h2>WinMerge</h2>
<table class="status">
<tr>
</tr>
<tr>
<td class="left">Arabic</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">908</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">163</td>
+ <td class="right untranslated">166</td>
<td class="right">85 %</td>
<td class="center">2019-12-30</td>
</tr>
<tr>
<td class="left">Basque</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">644</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">427</td>
+ <td class="right untranslated">430</td>
<td class="right">60 %</td>
<td class="center">2013-02-03</td>
</tr>
<tr>
<td class="left">Brazilian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1024</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">47</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">50</td>
+ <td class="right">95 %</td>
<td class="center">2021-02-14</td>
</tr>
<tr>
<td class="left">Bulgarian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">951</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">120</td>
+ <td class="right untranslated">123</td>
<td class="right">89 %</td>
<td class="center">2021-02-11</td>
</tr>
<tr>
<td class="left">Catalan</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">570</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">501</td>
+ <td class="right untranslated">504</td>
<td class="right">53 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">ChineseSimplified</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">981</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">90</td>
- <td class="right">92 %</td>
+ <td class="right untranslated">93</td>
+ <td class="right">91 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">ChineseTraditional</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">861</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">210</td>
+ <td class="right untranslated">213</td>
<td class="right">80 %</td>
<td class="center">2010-02-19</td>
</tr>
<tr>
<td class="left">Croatian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">635</td>
<td class="right fuzzy">1</td>
- <td class="right untranslated">435</td>
+ <td class="right untranslated">438</td>
<td class="right">59 %</td>
<td class="center">2009-02-13</td>
</tr>
<tr>
<td class="left">Czech</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">610</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">461</td>
+ <td class="right untranslated">464</td>
<td class="right">57 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Danish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">644</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">427</td>
+ <td class="right untranslated">430</td>
<td class="right">60 %</td>
<td class="center">2013-01-13</td>
</tr>
<tr>
<td class="left">Dutch</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1070</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">1</td>
+ <td class="right untranslated">4</td>
<td class="right">100 %</td>
<td class="center">2018-09-06</td>
</tr>
<tr>
<td class="left">English</td>
- <td class="right">1072</td>
- <td class="right translated">1072</td>
+ <td class="right">1075</td>
+ <td class="right translated">1075</td>
<td class="right fuzzy">0</td>
<td class="right untranslated">0</td>
<td class="right">100 %</td>
- <td class="center">2021-06-24</td>
+ <td class="center">2021-06-26</td>
</tr>
<tr>
<td class="left">Finnish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">908</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">163</td>
+ <td class="right untranslated">166</td>
<td class="right">85 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">French</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1025</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">46</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">49</td>
+ <td class="right">95 %</td>
<td class="center">2021-04-29</td>
</tr>
<tr>
<td class="left">Galician</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1025</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">46</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">49</td>
+ <td class="right">95 %</td>
<td class="center">2021-04-18</td>
</tr>
<tr>
<td class="left">German</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1025</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">46</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">49</td>
+ <td class="right">95 %</td>
<td class="center">2021-04-24</td>
</tr>
<tr>
<td class="left">Greek</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">608</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">463</td>
+ <td class="right untranslated">466</td>
<td class="right">57 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Hungarian</td>
- <td class="right">1071</td>
- <td class="right translated">1022</td>
+ <td class="right">1074</td>
+ <td class="right translated">1055</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">49</td>
- <td class="right">95 %</td>
+ <td class="right untranslated">19</td>
+ <td class="right">98 %</td>
<td class="center">2021-03-15</td>
</tr>
<tr>
<td class="left">Italian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">911</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">160</td>
+ <td class="right untranslated">163</td>
<td class="right">85 %</td>
<td class="center">2019-07-12</td>
</tr>
<tr>
<td class="left">Japanese</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1071</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">0</td>
+ <td class="right untranslated">3</td>
<td class="right">100 %</td>
<td class="center">2021-06-24</td>
</tr>
<tr>
<td class="left">Korean</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">993</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">78</td>
- <td class="right">93 %</td>
+ <td class="right untranslated">81</td>
+ <td class="right">92 %</td>
<td class="center">2021-03-30</td>
</tr>
<tr>
<td class="left">Lithuanian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1068</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">3</td>
- <td class="right">100 %</td>
+ <td class="right untranslated">6</td>
+ <td class="right">99 %</td>
<td class="center">2021-06-23</td>
</tr>
<tr>
<td class="left">Norwegian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">636</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">435</td>
+ <td class="right untranslated">438</td>
<td class="right">59 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Persian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">647</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">424</td>
+ <td class="right untranslated">427</td>
<td class="right">60 %</td>
<td class="center">2013-08-15</td>
</tr>
<tr>
<td class="left">Polish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1015</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">56</td>
+ <td class="right untranslated">59</td>
<td class="right">95 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Portuguese</td>
- <td class="right">1071</td>
- <td class="right translated">1024</td>
+ <td class="right">1074</td>
+ <td class="right translated">1071</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">47</td>
- <td class="right">96 %</td>
- <td class="center">2021-04-10</td>
+ <td class="right untranslated">3</td>
+ <td class="right">100 %</td>
+ <td class="center">2021-06-25</td>
</tr>
<tr>
<td class="left">Romanian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">565</td>
<td class="right fuzzy">44</td>
- <td class="right untranslated">462</td>
+ <td class="right untranslated">465</td>
<td class="right">57 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Russian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1007</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">64</td>
+ <td class="right untranslated">67</td>
<td class="right">94 %</td>
<td class="center">2021-04-29</td>
</tr>
<tr>
<td class="left">Serbian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">635</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">436</td>
+ <td class="right untranslated">439</td>
<td class="right">59 %</td>
<td class="center"></td>
</tr>
<tr>
<td class="left">Sinhala</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">569</td>
<td class="right fuzzy">59</td>
- <td class="right untranslated">443</td>
- <td class="right">59 %</td>
+ <td class="right untranslated">446</td>
+ <td class="right">58 %</td>
<td class="center">2010-12-12</td>
</tr>
<tr>
<td class="left">Slovak</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">981</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">90</td>
- <td class="right">92 %</td>
+ <td class="right untranslated">93</td>
+ <td class="right">91 %</td>
<td class="center">2020-11-02</td>
</tr>
<tr>
<td class="left">Slovenian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1025</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">46</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">49</td>
+ <td class="right">95 %</td>
<td class="center">2021-04-24</td>
</tr>
<tr>
<td class="left">Spanish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">877</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">194</td>
+ <td class="right untranslated">197</td>
<td class="right">82 %</td>
<td class="center">2020-04-03</td>
</tr>
<tr>
<td class="left">Swedish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1024</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">47</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">50</td>
+ <td class="right">95 %</td>
<td class="center">2021-04-10</td>
</tr>
<tr>
<td class="left">Turkish</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">1025</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">46</td>
- <td class="right">96 %</td>
+ <td class="right untranslated">49</td>
+ <td class="right">95 %</td>
<td class="center">2021-05-24</td>
</tr>
<tr>
<td class="left">Ukrainian</td>
- <td class="right">1071</td>
+ <td class="right">1074</td>
<td class="right translated">641</td>
<td class="right fuzzy">0</td>
- <td class="right untranslated">430</td>
+ <td class="right untranslated">433</td>
<td class="right">60 %</td>
<td class="center">2009-06-13</td>
</tr>
# Translations Status
-Status from **2021-06-24**:
+Status from **2021-06-26**:
## WinMerge
| Language | Total | Translated | Fuzzy | Untranslated | Complete | Last Update |
|:---------------------|------:|-----------:|------:|-------------:|---------:|:-----------:|
-| Arabic | 1071 | 908 | 0 | 163 | 85 % | 2019-12-30 |
-| Basque | 1071 | 644 | 0 | 427 | 60 % | 2013-02-03 |
-| Brazilian | 1071 | 1024 | 0 | 47 | 96 % | 2021-02-14 |
-| Bulgarian | 1071 | 951 | 0 | 120 | 89 % | 2021-02-11 |
-| Catalan | 1071 | 570 | 0 | 501 | 53 % | |
-| ChineseSimplified | 1071 | 981 | 0 | 90 | 92 % | |
-| ChineseTraditional | 1071 | 861 | 0 | 210 | 80 % | 2010-02-19 |
-| Croatian | 1071 | 635 | 1 | 435 | 59 % | 2009-02-13 |
-| Czech | 1071 | 610 | 0 | 461 | 57 % | |
-| Danish | 1071 | 644 | 0 | 427 | 60 % | 2013-01-13 |
-| Dutch | 1071 | 1070 | 0 | 1 | 100 % | 2018-09-06 |
-| English | 1072 | 1072 | 0 | 0 | 100 % | 2021-06-24 |
-| Finnish | 1071 | 908 | 0 | 163 | 85 % | |
-| French | 1071 | 1025 | 0 | 46 | 96 % | 2021-04-29 |
-| Galician | 1071 | 1025 | 0 | 46 | 96 % | 2021-04-18 |
-| German | 1071 | 1025 | 0 | 46 | 96 % | 2021-04-24 |
-| Greek | 1071 | 608 | 0 | 463 | 57 % | |
-| Hungarian | 1071 | 1022 | 0 | 49 | 95 % | 2021-03-15 |
-| Italian | 1071 | 911 | 0 | 160 | 85 % | 2019-07-12 |
-| Japanese | 1071 | 1071 | 0 | 0 | 100 % | 2021-06-24 |
-| Korean | 1071 | 993 | 0 | 78 | 93 % | 2021-03-30 |
-| Lithuanian | 1071 | 1068 | 0 | 3 | 100 % | 2021-06-23 |
-| Norwegian | 1071 | 636 | 0 | 435 | 59 % | |
-| Persian | 1071 | 647 | 0 | 424 | 60 % | 2013-08-15 |
-| Polish | 1071 | 1015 | 0 | 56 | 95 % | |
-| Portuguese | 1071 | 1024 | 0 | 47 | 96 % | 2021-04-10 |
-| Romanian | 1071 | 565 | 44 | 462 | 57 % | |
-| Russian | 1071 | 1007 | 0 | 64 | 94 % | 2021-04-29 |
-| Serbian | 1071 | 635 | 0 | 436 | 59 % | |
-| Sinhala | 1071 | 569 | 59 | 443 | 59 % | 2010-12-12 |
-| Slovak | 1071 | 981 | 0 | 90 | 92 % | 2020-11-02 |
-| Slovenian | 1071 | 1025 | 0 | 46 | 96 % | 2021-04-24 |
-| Spanish | 1071 | 877 | 0 | 194 | 82 % | 2020-04-03 |
-| Swedish | 1071 | 1024 | 0 | 47 | 96 % | 2021-04-10 |
-| Turkish | 1071 | 1025 | 0 | 46 | 96 % | 2021-05-24 |
-| Ukrainian | 1071 | 641 | 0 | 430 | 60 % | 2009-06-13 |
+| Arabic | 1074 | 908 | 0 | 166 | 85 % | 2019-12-30 |
+| Basque | 1074 | 644 | 0 | 430 | 60 % | 2013-02-03 |
+| Brazilian | 1074 | 1024 | 0 | 50 | 95 % | 2021-02-14 |
+| Bulgarian | 1074 | 951 | 0 | 123 | 89 % | 2021-02-11 |
+| Catalan | 1074 | 570 | 0 | 504 | 53 % | |
+| ChineseSimplified | 1074 | 981 | 0 | 93 | 91 % | |
+| ChineseTraditional | 1074 | 861 | 0 | 213 | 80 % | 2010-02-19 |
+| Croatian | 1074 | 635 | 1 | 438 | 59 % | 2009-02-13 |
+| Czech | 1074 | 610 | 0 | 464 | 57 % | |
+| Danish | 1074 | 644 | 0 | 430 | 60 % | 2013-01-13 |
+| Dutch | 1074 | 1070 | 0 | 4 | 100 % | 2018-09-06 |
+| English | 1075 | 1075 | 0 | 0 | 100 % | 2021-06-26 |
+| Finnish | 1074 | 908 | 0 | 166 | 85 % | |
+| French | 1074 | 1025 | 0 | 49 | 95 % | 2021-04-29 |
+| Galician | 1074 | 1025 | 0 | 49 | 95 % | 2021-04-18 |
+| German | 1074 | 1025 | 0 | 49 | 95 % | 2021-04-24 |
+| Greek | 1074 | 608 | 0 | 466 | 57 % | |
+| Hungarian | 1074 | 1055 | 0 | 19 | 98 % | 2021-03-15 |
+| Italian | 1074 | 911 | 0 | 163 | 85 % | 2019-07-12 |
+| Japanese | 1074 | 1071 | 0 | 3 | 100 % | 2021-06-24 |
+| Korean | 1074 | 993 | 0 | 81 | 92 % | 2021-03-30 |
+| Lithuanian | 1074 | 1068 | 0 | 6 | 99 % | 2021-06-23 |
+| Norwegian | 1074 | 636 | 0 | 438 | 59 % | |
+| Persian | 1074 | 647 | 0 | 427 | 60 % | 2013-08-15 |
+| Polish | 1074 | 1015 | 0 | 59 | 95 % | |
+| Portuguese | 1074 | 1071 | 0 | 3 | 100 % | 2021-06-25 |
+| Romanian | 1074 | 565 | 44 | 465 | 57 % | |
+| Russian | 1074 | 1007 | 0 | 67 | 94 % | 2021-04-29 |
+| Serbian | 1074 | 635 | 0 | 439 | 59 % | |
+| Sinhala | 1074 | 569 | 59 | 446 | 58 % | 2010-12-12 |
+| Slovak | 1074 | 981 | 0 | 93 | 91 % | 2020-11-02 |
+| Slovenian | 1074 | 1025 | 0 | 49 | 95 % | 2021-04-24 |
+| Spanish | 1074 | 877 | 0 | 197 | 82 % | 2020-04-03 |
+| Swedish | 1074 | 1024 | 0 | 50 | 95 % | 2021-04-10 |
+| Turkish | 1074 | 1025 | 0 | 49 | 95 % | 2021-05-24 |
+| Ukrainian | 1074 | 641 | 0 | 433 | 60 % | 2009-06-13 |
## ShellExtension
<?xml version="1.0" encoding="UTF-8"?>
<status>
- <update>2021-06-24</update>
+ <update>2021-06-26</update>
<translations project="WinMerge">
<translation>
<language>Arabic</language>
<file>Arabic.po</file>
<update>2019-12-30</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>908</translated>
<fuzzy>0</fuzzy>
- <untranslated>163</untranslated>
+ <untranslated>166</untranslated>
</strings>
</translation>
<translation>
<file>Basque.po</file>
<update>2013-02-03</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>644</translated>
<fuzzy>0</fuzzy>
- <untranslated>427</untranslated>
+ <untranslated>430</untranslated>
</strings>
<translators>
<translator>
<file>Brazilian.po</file>
<update>2021-02-14</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1024</translated>
<fuzzy>0</fuzzy>
- <untranslated>47</untranslated>
+ <untranslated>50</untranslated>
</strings>
<translators>
<translator>
<file>Bulgarian.po</file>
<update>2021-02-11</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>951</translated>
<fuzzy>0</fuzzy>
- <untranslated>120</untranslated>
+ <untranslated>123</untranslated>
</strings>
<translators>
<translator>
<file>Catalan.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>570</translated>
<fuzzy>0</fuzzy>
- <untranslated>501</untranslated>
+ <untranslated>504</untranslated>
</strings>
<translators>
<translator>
<file>ChineseSimplified.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>981</translated>
<fuzzy>0</fuzzy>
- <untranslated>90</untranslated>
+ <untranslated>93</untranslated>
</strings>
<translators>
<translator>
<file>ChineseTraditional.po</file>
<update>2010-02-19</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>861</translated>
<fuzzy>0</fuzzy>
- <untranslated>210</untranslated>
+ <untranslated>213</untranslated>
</strings>
<translators>
<translator>
<file>Croatian.po</file>
<update>2009-02-13</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>635</translated>
<fuzzy>1</fuzzy>
- <untranslated>435</untranslated>
+ <untranslated>438</untranslated>
</strings>
<translators>
<translator>
<file>Czech.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>610</translated>
<fuzzy>0</fuzzy>
- <untranslated>461</untranslated>
+ <untranslated>464</untranslated>
</strings>
<translators>
<translator>
<file>Danish.po</file>
<update>2013-01-13</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>644</translated>
<fuzzy>0</fuzzy>
- <untranslated>427</untranslated>
+ <untranslated>430</untranslated>
</strings>
<translators>
<translator>
<file>Dutch.po</file>
<update>2018-09-06</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1070</translated>
<fuzzy>0</fuzzy>
- <untranslated>1</untranslated>
+ <untranslated>4</untranslated>
</strings>
<translators>
<translator>
<translation template="1">
<language>English</language>
<file>English.pot</file>
- <update>2021-06-24</update>
+ <update>2021-06-26</update>
<strings>
- <count>1072</count>
- <translated>1072</translated>
+ <count>1075</count>
+ <translated>1075</translated>
<fuzzy>0</fuzzy>
<untranslated>0</untranslated>
</strings>
<file>Finnish.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>908</translated>
<fuzzy>0</fuzzy>
- <untranslated>163</untranslated>
+ <untranslated>166</untranslated>
</strings>
</translation>
<translation>
<file>French.po</file>
<update>2021-04-29</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1025</translated>
<fuzzy>0</fuzzy>
- <untranslated>46</untranslated>
+ <untranslated>49</untranslated>
</strings>
<translators>
<translator maintainer="1">
<file>Galician.po</file>
<update>2021-04-18</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1025</translated>
<fuzzy>0</fuzzy>
- <untranslated>46</untranslated>
+ <untranslated>49</untranslated>
</strings>
<translators>
<translator>
<file>German.po</file>
<update>2021-04-24</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1025</translated>
<fuzzy>0</fuzzy>
- <untranslated>46</untranslated>
+ <untranslated>49</untranslated>
</strings>
<translators>
<translator maintainer="1">
<file>Greek.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>608</translated>
<fuzzy>0</fuzzy>
- <untranslated>463</untranslated>
+ <untranslated>466</untranslated>
</strings>
<translators>
<translator>
<file>Hungarian.po</file>
<update>2021-03-15</update>
<strings>
- <count>1071</count>
- <translated>1022</translated>
+ <count>1074</count>
+ <translated>1055</translated>
<fuzzy>0</fuzzy>
- <untranslated>49</untranslated>
+ <untranslated>19</untranslated>
</strings>
<translators>
<translator>
<file>Italian.po</file>
<update>2019-07-12</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>911</translated>
<fuzzy>0</fuzzy>
- <untranslated>160</untranslated>
+ <untranslated>163</untranslated>
</strings>
<translators>
<translator>
<file>Japanese.po</file>
<update>2021-06-24</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1071</translated>
<fuzzy>0</fuzzy>
- <untranslated>0</untranslated>
+ <untranslated>3</untranslated>
</strings>
<translators>
<translator>
<file>Korean.po</file>
<update>2021-03-30</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>993</translated>
<fuzzy>0</fuzzy>
- <untranslated>78</untranslated>
+ <untranslated>81</untranslated>
</strings>
<translators>
<translator>
<file>Lithuanian.po</file>
<update>2021-06-23</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1068</translated>
<fuzzy>0</fuzzy>
- <untranslated>3</untranslated>
+ <untranslated>6</untranslated>
</strings>
<translators>
<translator>
<file>Norwegian.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>636</translated>
<fuzzy>0</fuzzy>
- <untranslated>435</untranslated>
+ <untranslated>438</untranslated>
</strings>
<translators>
<translator>
<file>Persian.po</file>
<update>2013-08-15</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>647</translated>
<fuzzy>0</fuzzy>
- <untranslated>424</untranslated>
+ <untranslated>427</untranslated>
</strings>
<translators>
<translator>
<file>Polish.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1015</translated>
<fuzzy>0</fuzzy>
- <untranslated>56</untranslated>
+ <untranslated>59</untranslated>
</strings>
<translators>
<translator>
<translation>
<language>Portuguese</language>
<file>Portuguese.po</file>
- <update>2021-04-10</update>
+ <update>2021-06-25</update>
<strings>
- <count>1071</count>
- <translated>1024</translated>
+ <count>1074</count>
+ <translated>1071</translated>
<fuzzy>0</fuzzy>
- <untranslated>47</untranslated>
+ <untranslated>3</untranslated>
</strings>
<translators>
<translator>
<file>Romanian.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>565</translated>
<fuzzy>44</fuzzy>
- <untranslated>462</untranslated>
+ <untranslated>465</untranslated>
</strings>
<translators>
<translator>
<file>Russian.po</file>
<update>2021-04-29</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1007</translated>
<fuzzy>0</fuzzy>
- <untranslated>64</untranslated>
+ <untranslated>67</untranslated>
</strings>
<translators>
<translator>
<file>Serbian.po</file>
<update></update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>635</translated>
<fuzzy>0</fuzzy>
- <untranslated>436</untranslated>
+ <untranslated>439</untranslated>
</strings>
<translators>
<translator>
<file>Sinhala.po</file>
<update>2010-12-12</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>569</translated>
<fuzzy>59</fuzzy>
- <untranslated>443</untranslated>
+ <untranslated>446</untranslated>
</strings>
<translators>
<translator>
<file>Slovak.po</file>
<update>2020-11-02</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>981</translated>
<fuzzy>0</fuzzy>
- <untranslated>90</untranslated>
+ <untranslated>93</untranslated>
</strings>
<translators>
<translator>
<file>Slovenian.po</file>
<update>2021-04-24</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1025</translated>
<fuzzy>0</fuzzy>
- <untranslated>46</untranslated>
+ <untranslated>49</untranslated>
</strings>
<translators>
<translator>
<file>Spanish.po</file>
<update>2020-04-03</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>877</translated>
<fuzzy>0</fuzzy>
- <untranslated>194</untranslated>
+ <untranslated>197</untranslated>
</strings>
<translators>
<translator>
<file>Swedish.po</file>
<update>2021-04-10</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1024</translated>
<fuzzy>0</fuzzy>
- <untranslated>47</untranslated>
+ <untranslated>50</untranslated>
</strings>
<translators>
<translator>
<file>Turkish.po</file>
<update>2021-05-24</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>1025</translated>
<fuzzy>0</fuzzy>
- <untranslated>46</untranslated>
+ <untranslated>49</untranslated>
</strings>
<translators>
<translator>
<file>Ukrainian.po</file>
<update>2009-06-13</update>
<strings>
- <count>1071</count>
+ <count>1074</count>
<translated>641</translated>
<fuzzy>0</fuzzy>
- <untranslated>430</untranslated>
+ <untranslated>433</untranslated>
</strings>
<translators>
<translator>
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
# This file is part from WinMerge <https://winmerge.org/>
# Released under the "GNU General Public License"
-#
+#
# Translators:
# * Ronald Schaap <ronald at schaap.demon.nl>
# * Michel Coene
# Thomas De Rocker, 2021
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: WinMerge\n"
msgid "Sort Lines Descending"
msgstr "Regels aflopend sorteren"
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr "Filteropdracht toepassen..."
msgstr ""
"Project-Id-Version: WinMerge\n"
"Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
-"POT-Creation-Date: 2021-06-24 20:41+0000\n"
+"POT-Creation-Date: 2021-06-26 16:58+0000\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr "Sorok csökkenőő rendezése""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr "Szűrőparancs alkalmazása..."
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
"Project-Id-Version: WinMerge\n"
"Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
"POT-Creation-Date: 2020-12-05 22:07+0000\n"
-"PO-Revision-Date: 2021-06-24 08:54+0900\n"
+"PO-Revision-Date: 2021-06-26 17:03+0900\n"
"Last-Translator: Takashi Sawanaka <sawanaka@d1.dion.ne.jp>\n"
"Language-Team: Japanese <winmerge-translate@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
msgid "Sort Lines Descending"
msgstr "降順にソート"
+msgid "Reverse Columns"
+msgstr "列を逆順"
+
+msgid "Reverse Lines"
+msgstr "行を逆順"
+
+msgid "Replace..."
+msgstr "置換..."
+
msgid "Apply Filter Command..."
msgstr "フィルタコマンドを適用..."
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr "Rikiuoti eilutes mažėjimo tvarka"
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr "Pritaikyti filtro komandą..."
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr "Ordem de linhas descendente"
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr "Aplicar comando de filtro..."
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""
msgid "Sort Lines Descending"
msgstr ""
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
msgid "Apply Filter Command..."
msgstr ""