Pārlūkot izejas kodu

Merge pull request #522 from bgrabitmap/dev-lazpaint

Dev lazpaint v7.2.1
circular17 3 gadi atpakaļ
vecāks
revīzija
4db0e86487

+ 13 - 12
.gitignore

@@ -1,38 +1,39 @@
 *.bak
 *.dbg
-lazpaint/release/bin/*.exe
 *.lps
 backup/*
 lib
 debug
 __pycache__
+.DS_Store
 *.res
 *.lrt
 lazpaint/backup/
-vectoredit/vectoredit
-vectoredit/backup/
+lazpaint/dialog/backup/
+lazpaint/dialog/color/backup
+lazpaint/dialog/filter/backup/
+lazpaint/image/backup/
 lazpaint/test_embedded/backup/
 lazpaint/test_embedded/project1
-lazpaint/dialog/filter/backup/
 lazpaint/release/bin/lazpaint
+lazpaint/tablet/backup/
 lazpaint/tools/backup/
-lazpaint/image/backup/
-lazpaint/dialog/backup/
-.DS_Store
+lazpaint/units/
+lazpaint/release/bin/*.exe
 lazpaint/release/bin/lazpaint.app
 lazpaint/release/macOS/*.dmg
 lazpaint/release/windows/lazpaint32
 lazpaint/release/windows/lazpaint64
 lazpaint/release/bin/i18n/lazpaint32.*
 lazpaint/release/bin/i18n/lazpaint_x64.*
-/lazpaint/dialog/color/backup
 resources/createresource/backup/
-lazpaint/units/
+vectoredit/vectoredit
+vectoredit/backup/
 /bgracontrols
 /bgrabitmap
-
 *.deb
 lazpaint/release/debian/lazpaint*_no_install.tar.gz
+lazpaint/release/windows/lazpaint*_no_install.zip
 /web/public/*
-
-lazpaint/tablet/backup/
+lazpaint/release/bin/i18n/lazpaint64.pot
+lazpaint/release/windows/libavif/

+ 1 - 1
lazpaint.logic

@@ -9,4 +9,4 @@ bundle release/macOS/LazPaint.app
 copy ../resources/icon/lazpaint.icns release/macOS/LazPaint.app/Contents/Resources/lazpaint.icns
 text ../web/config.toml "  version = ""$(Version)"""
 echo ">> DON'T FORGET TO UPDATE WEBSITE"
-echo ">> DON'T FORGET TO ADD VERSION IN release/debian/changelog <<"
+echo ">> DON'T FORGET TO ADD VERSION IN lazpaint/release/debian/debian/changelog <<"

+ 2 - 2
lazpaint/dialog/uabout.pas

@@ -49,13 +49,13 @@ type
     { public declarations }
   end;
 
-procedure ShowAboutDlg(AInstance: TLazPaintCustomInstance; {%H-}AText: string);
+procedure ShowAboutDlg(AInstance: TLazPaintCustomInstance);
 
 implementation
 
 uses LCLIntf, BGRABitmap, BGRABitmapTypes;
 
-procedure ShowAboutDlg(AInstance: TLazPaintCustomInstance; {%H-}AText: string);
+procedure ShowAboutDlg(AInstance: TLazPaintCustomInstance);
 var
   About: TFAbout;
 begin

+ 28 - 2
lazpaint/image/uimageaction.pas

@@ -8,7 +8,7 @@ interface
 uses
   Classes, SysUtils, FPimage, LazPaintType, BGRABitmap, UImage, UTool,
   UScripting, ULayerAction, UImageType, BGRABitmapTypes, BGRALayerOriginal,
-  BGRASVGOriginal;
+  BGRASVGOriginal, BGRALayers;
 
 type
 
@@ -59,9 +59,11 @@ type
     function DoEnd: boolean;
     procedure SetCurrentBitmap(bmp: TBGRABitmap; AUndoable: boolean;
       ACaption: string = ''; AOpacity: byte = 255);
+    procedure SetCurrentBitmap(bmp: TBGRACustomLayeredBitmap; AUndoable: boolean);
     procedure CropToSelectionAndLayer;
     procedure CropToSelection;
     procedure Flatten;
+    procedure TakeScreenshot(ARect: TRect);
     procedure HorizontalFlip(AOption: TFlipOption);
     procedure VerticalFlip(AOption: TFlipOption);
     procedure RotateCW;
@@ -109,7 +111,7 @@ implementation
 uses Controls, Dialogs, UResourceStrings, UObject3D,
      ULoadImage, UGraph, UClipboard, Types, BGRAGradientOriginal,
      BGRATransform, ULoading, math, LCVectorClipboard, LCVectorOriginal, LCVectorRectShapes,
-     BGRALayers, BGRAUTF8, UFileSystem, Forms, UTranslation;
+     BGRAUTF8, UFileSystem, Forms, UTranslation;
 
 { TImageActions }
 
@@ -1113,6 +1115,19 @@ begin
   image.Flatten;
 end;
 
+procedure TImageActions.TakeScreenshot(ARect: TRect);
+var
+  bmp: TBGRABitmap;
+begin
+  bmp := TBGRABitmap.Create;
+  try
+    bmp.TakeScreenshot(ARect);
+    SetCurrentBitmap(bmp, false, 'Screenshot');
+  except on ex:Exception do
+    FInstance.ShowError('TakeScreenshot',ex.Message);
+  end;
+end;
+
 procedure TImageActions.SetCurrentBitmap(bmp: TBGRABitmap; AUndoable : boolean;
   ACaption: string; AOpacity: byte);
 begin
@@ -1124,6 +1139,17 @@ begin
   end;
 end;
 
+procedure TImageActions.SetCurrentBitmap(bmp: TBGRACustomLayeredBitmap;
+  AUndoable: boolean);
+begin
+  ToolManager.ToolCloseDontReopen;
+  try
+    image.Assign(bmp,True,AUndoable);
+  finally
+    ToolManager.ToolOpen;
+  end;
+end;
+
 function TImageActions.TryAddLayerFromFile(AFilenameUTF8: string; ALoadedImage: TBGRABitmap = nil): ArrayOfLayerId;
 
   function ComputeStretchMatrix(ASourceWidth, ASourceHeight: single): TAffineMatrix;

+ 3 - 2
lazpaint/lazpaint.lpi

@@ -28,6 +28,7 @@
       <MinorVersionNr Value="2"/>
       <CharSet Value="04B0"/>
       <StringTable CompanyName="http://sourceforge.net/projects/lazpaint/" FileDescription="LazPaint" InternalName="lazpaint" OriginalFilename="lazpaint.exe" ProductName="LazPaint"/>
+      <RevisionNr Value="1"/>
     </VersionInfo>
     <BuildModes Count="10">
       <Item1 Name="Debug" Default="True"/>
@@ -412,7 +413,7 @@
     <RequiredPackages Count="5">
       <Item1>
         <PackageName Value="BGRABitmapPack"/>
-        <MinVersion Major="11" Minor="5" Valid="True"/>
+        <MinVersion Major="11" Minor="5" Release="2" Valid="True"/>
       </Item1>
       <Item2>
         <PackageName Value="bgracontrols"/>
@@ -420,7 +421,7 @@
       </Item2>
       <Item3>
         <PackageName Value="lazpaintcontrols"/>
-        <MinVersion Minor="2" Valid="True"/>
+        <MinVersion Minor="2" Release="1" Valid="True"/>
       </Item3>
       <Item4>
         <PackageName Value="Printer4Lazarus"/>

+ 0 - 6
lazpaint/lazpaint.lpr

@@ -213,12 +213,6 @@ begin
   LazpaintApplication.UseConfig(ActualConfig);
   FillLanguageList(LazpaintApplication.Config);
 
-  {$IFDEF WINDOWS}
-    LazpaintApplication.AboutText := ReadFileToString(SysToUTF8(ExtractFilePath(Application.ExeName))+'readme.txt');
-  {$ELSE}
-    LazpaintApplication.AboutText := ReadFileToString('readme.txt');
-  {$ENDIF}
-
   if not LazpaintApplication.ProcessCommandLine then
   begin
     LazpaintApplication.Show;

+ 1 - 1
lazpaint/lazpaintembeddedpack.lpk

@@ -26,7 +26,7 @@
         </Debugging>
       </Linking>
     </CompilerOptions>
-    <Version Major="7" Minor="2"/>
+    <Version Major="7" Minor="2" Release="1"/>
     <Files Count="94">
       <Item1>
         <Filename Value="lazpaintinstance.pas"/>

+ 77 - 10
lazpaint/lazpaintinstance.pas

@@ -204,7 +204,20 @@ type
     procedure RestoreMainWindowPosition; override;
     procedure UseConfig(ini: TInifile); override;
     procedure AssignBitmap(bmp: TBGRABitmap); override;
-    procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite: boolean = false); override;
+    procedure AssignBitmap(bmp: TBGRALayeredBitmap); override;
+    function InternalEditBitmap(var bmp: TObject; ConfigStream: TStream = nil;
+      ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil;
+      AOnExit: TLazPaintInstanceEvent = nil;
+      ABlackAndWhite: boolean = false): boolean;
+    function EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil;
+      ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil;
+      AOnExit: TLazPaintInstanceEvent = nil;
+      ABlackAndWhite: boolean = false): boolean; override;
+    function EditBitmap(var bmp: TBGRALayeredBitmap;
+      ConfigStream: TStream = nil; ATitle: String = '';
+      AOnRun: TLazPaintInstanceEvent = nil;
+      AOnExit: TLazPaintInstanceEvent = nil;
+      ABlackAndWhite : boolean = false): boolean; override;
     procedure EditSelection; override;
     function EditTexture(ASource: TBGRABitmap): TBGRABitmap; override;
     function ProcessCommandLine: boolean; override;
@@ -518,6 +531,7 @@ end;
 procedure TLazPaintInstance.UseConfig(ini: TInifile);
 begin
   FreeAndNil(FConfig);
+  BlackAndWhite := ini.ReadBool('General','BlackAndWhite',BlackAndWhite);
   FConfig := TLazPaintConfig.Create(ini,LazPaintVersionStr);
   ToolManager.LoadFromConfig;
   FGridVisible := Config.DefaultGridVisible;
@@ -1228,16 +1242,25 @@ end;
 procedure TLazPaintInstance.AssignBitmap(bmp: TBGRABitmap);
 begin
   if Assigned(FImageAction) then
-    FImageAction.SetCurrentBitmap(bmp.Duplicate as TBGRABitmap, False);
+    FImageAction.SetCurrentBitmap(bmp.Duplicate, False);
 end;
 
-procedure TLazPaintInstance.EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream; ATitle: String; AOnRun: TLazPaintInstanceEvent; AOnExit: TLazPaintInstanceEvent; ABlackAndWhite: boolean);
+procedure TLazPaintInstance.AssignBitmap(bmp: TBGRALayeredBitmap);
+begin
+  if Assigned(FImageAction) then
+    FImageAction.SetCurrentBitmap(bmp.Duplicate, False);
+end;
+
+function TLazPaintInstance.InternalEditBitmap(var bmp: TObject;
+  ConfigStream: TStream; ATitle: String; AOnRun: TLazPaintInstanceEvent;
+  AOnExit: TLazPaintInstanceEvent; ABlackAndWhite: boolean): boolean;
 var
   subLaz: TLazPaintInstance;
   ini : TIniFile;
   topmostInfo: TTopMostInfo;
-
+  embeddedImageToBeFreed: boolean;
 begin
+  result := false;
   try
     subLaz := TLazPaintInstance.Create(True);
   except
@@ -1251,6 +1274,7 @@ begin
   if ATitle <> '' then subLaz.Title := ATitle;
   if FMain <> nil then FMain.Enabled := false;
   topmostInfo:= HideTopmost;
+  embeddedImageToBeFreed := false;
   try
     if ConfigStream <> nil then
     begin
@@ -1260,9 +1284,20 @@ begin
       subLaz.UseConfig(ini);
     end;
     subLaz.FormsNeeded;
-    if bmp <> nil then subLaz.AssignBitmap(bmp);
-    subLaz.AboutText := AboutText;
-    subLaz.EmbeddedImageBackup := bmp;
+    if bmp <> nil then
+    begin
+      if bmp is TBGRABitmap then
+      begin
+        subLaz.AssignBitmap(TBGRABitmap(bmp));
+        subLaz.EmbeddedImageBackup := TBGRABitmap(bmp);
+      end else
+      if bmp is TBGRALayeredBitmap then
+      begin
+        subLaz.AssignBitmap(TBGRALayeredBitmap(bmp));
+        subLaz.EmbeddedImageBackup := TBGRALayeredBitmap(bmp).ComputeFlatImage;
+        embeddedImageToBeFreed := true;
+      end;
+    end;
     subLaz.FMain.BorderIcons := subLaz.FMain.BorderIcons - [biMinimize];
     if AOnRun <> nil then
       AOnRun(subLaz);
@@ -1271,8 +1306,17 @@ begin
       AOnExit(subLaz);
     if subLaz.EmbeddedResult = mrOk then
     begin
-      FreeAndNil(bmp);
-      bmp := subLaz.Image.RenderedImage.Duplicate as TBGRABitmap;
+      if bmp is TBGRALayeredBitmap then
+      begin
+        FreeAndNil(bmp);
+        bmp := subLaz.Image.CurrentState.GetLayeredBitmapCopy;
+      end
+      else if bmp is TBGRABitmap then
+      begin
+        FreeAndNil(bmp);
+        bmp := subLaz.Image.RenderedImage.Duplicate;
+      end;
+      result := true;
     end;
     if ConfigStream <> nil then
     begin
@@ -1289,9 +1333,32 @@ begin
     FMain.Enabled := true;
     FMain.BringToFront;
   end;
+  if embeddedImageToBeFreed then
+    subLaz.EmbeddedImageBackup.Free
+    else subLaz.EmbeddedImageBackup := nil;
   subLaz.Free;
 end;
 
+function TLazPaintInstance.EditBitmap(var bmp: TBGRABitmap;
+  ConfigStream: TStream; ATitle: String; AOnRun: TLazPaintInstanceEvent;
+  AOnExit: TLazPaintInstanceEvent; ABlackAndWhite: boolean): boolean;
+var bmpObj: TObject;
+begin
+  bmpObj := bmp;
+  result := InternalEditBitmap(bmpObj, ConfigStream, ATitle, AOnRun, AOnExit, ABlackAndWhite);
+  bmp := bmpObj as TBGRABitmap;
+end;
+
+function TLazPaintInstance.EditBitmap(var bmp: TBGRALayeredBitmap;
+  ConfigStream: TStream; ATitle: String; AOnRun: TLazPaintInstanceEvent;
+  AOnExit: TLazPaintInstanceEvent; ABlackAndWhite: boolean): boolean;
+var bmpObj: TObject;
+begin
+  bmpObj := bmp;
+  result := InternalEditBitmap(bmpObj, ConfigStream, ATitle, AOnRun, AOnExit, ABlackAndWhite);
+  bmp := bmpObj as TBGRALayeredBitmap;
+end;
+
 procedure TLazPaintInstance.EditSelection;
 begin
   try
@@ -1969,7 +2036,7 @@ procedure TLazPaintInstance.ShowAboutDlg;
 var tmi: TTopMostInfo;
 begin
   tmi := HideTopmost;
-  uabout.ShowAboutDlg(self,AboutText);
+  uabout.ShowAboutDlg(self);
   ShowTopmost(tmi);
 end;
 

+ 1 - 0
lazpaint/lazpaintmainform.pas

@@ -1132,6 +1132,7 @@ begin
 
   {$IFDEF DARWIN}
   ImageHorizontalFlip.ShortCut := ShortCut(VK_H, [ssMeta, ssCtrl]);
+  FileQuickSave.ShortCut:= ShortCut(VK_Q, [ssMeta, ssAlt]);
   {$ENDIF}
 
   if not LazPaintInstance.Embedded then

+ 13 - 4
lazpaint/lazpainttype.pas

@@ -11,7 +11,7 @@ uses
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
 
 const
-  LazPaintVersion = 7020000;
+  LazPaintVersion = 7020100;
 
   function LazPaintVersionStr: string;
 
@@ -218,7 +218,7 @@ type
 
     function GetMainFormBounds: TRect; virtual; abstract;
   public
-    Title,AboutText: string;
+    Title: string;
     EmbeddedResult: TModalResult;
     EmbeddedImageBackup: TBGRABitmap;
 
@@ -235,8 +235,17 @@ type
     procedure RestoreMainWindowPosition; virtual; abstract;
     procedure Donate; virtual; abstract;
     procedure UseConfig(ini: TInifile); virtual; abstract;
-    procedure AssignBitmap(bmp: TBGRABitmap); virtual; abstract;
-    procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite : boolean = false); virtual; abstract;
+    procedure AssignBitmap(bmp: TBGRABitmap); virtual; abstract; overload;
+    procedure AssignBitmap(bmp: TBGRALayeredBitmap); virtual; abstract; overload;
+    function EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil;
+      ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil;
+      AOnExit: TLazPaintInstanceEvent = nil;
+      ABlackAndWhite : boolean = false): boolean; virtual; abstract;
+    function EditBitmap(var bmp: TBGRALayeredBitmap;
+      ConfigStream: TStream = nil; ATitle: String = '';
+      AOnRun: TLazPaintInstanceEvent = nil;
+      AOnExit: TLazPaintInstanceEvent = nil;
+      ABlackAndWhite : boolean = false): boolean; virtual; abstract;
     function EditTexture(ASource: TBGRABitmap): TBGRABitmap; virtual; abstract;
     procedure EditSelection; virtual; abstract;
     function ProcessCommandLine: boolean; virtual; abstract;

+ 15 - 15
lazpaint/release/bin/i18n/lazpaint.de.po

@@ -662,11 +662,11 @@ msgstr "Farben tauschen..."
 
 #: tfmain.combobox_arrowend.hint
 msgid "Ending arrow"
-msgstr ""
+msgstr "Endpfeil"
 
 #: tfmain.combobox_arrowstart.hint
 msgid "Starting arrow"
-msgstr ""
+msgstr "Startpfeil"
 
 #: tfmain.combobox_penstyle.hint
 msgid "Pen style"
@@ -861,11 +861,11 @@ msgstr "Drucken..."
 
 #: tfmain.filequicksave.caption
 msgid "Quick save"
-msgstr ""
+msgstr "Schnellspeichern"
 
 #: tfmain.filequicksave.hint
 msgid "Save current file without dialogs"
-msgstr ""
+msgstr "Aktuelle Datei ohne Dialog speichern"
 
 #: tfmain.filequit.hint
 msgctxt "TFMAIN.FILEQUIT.HINT"
@@ -1952,7 +1952,7 @@ msgstr "Progressive Füllung"
 
 #: tfmain.tool_textalignbottom.hint
 msgid "Align bottom"
-msgstr ""
+msgstr "Unten ausrichten"
 
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
@@ -1964,7 +1964,7 @@ msgstr "Links angleichen"
 
 #: tfmain.tool_textalignmiddle.hint
 msgid "Center vertically"
-msgstr ""
+msgstr "Vertikal zentrieren"
 
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
@@ -1972,15 +1972,15 @@ msgstr "Rechts angleichen"
 
 #: tfmain.tool_textaligntop.hint
 msgid "Align top"
-msgstr ""
+msgstr "Oben ausrichten"
 
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
-msgstr ""
+msgstr "Bidirektional"
 
 #: tfmain.tool_textbold.hint
 msgid "Bold"
-msgstr ""
+msgstr "Fett gedruckt"
 
 #: tfmain.tool_textfont.hint
 msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
@@ -1989,11 +1989,11 @@ msgstr "Schriftart auswählen..."
 
 #: tfmain.tool_textitalic.hint
 msgid "Italic"
-msgstr ""
+msgstr "Kursive"
 
 #: tfmain.tool_textltr.hint
 msgid "Left to right"
-msgstr ""
+msgstr "Links nach rechts"
 
 #: tfmain.tool_textoutline.hint
 msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
@@ -2007,7 +2007,7 @@ msgstr "Text Phong-Schattierung"
 
 #: tfmain.tool_textrtl.hint
 msgid "Right to left"
-msgstr ""
+msgstr "Rechts nach links"
 
 #: tfmain.tool_textshadow.hint
 msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
@@ -2016,11 +2016,11 @@ msgstr "Textschatten"
 
 #: tfmain.tool_textstrikeout.hint
 msgid "Strikeout"
-msgstr ""
+msgstr "Durchgestrichen"
 
 #: tfmain.tool_textunderline.hint
 msgid "Underline"
-msgstr ""
+msgstr "Unterstreichen"
 
 #: tfmain.viewcolors.caption
 msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
@@ -3629,7 +3629,7 @@ msgstr "RGB"
 
 #: uresourcestrings.rsrightclickfinishshape
 msgid "Use RIGHT click to finish shape"
-msgstr ""
+msgstr "Verwenden Sie die RECHTE Maustaste, um die Form zu beenden"
 
 #: uresourcestrings.rsrightclickforsource
 msgid "Use RIGHT click to define source"

BIN
lazpaint/release/bin/i18n/lazpaint.es.mo


+ 20 - 42
lazpaint/release/bin/i18n/lazpaint.es.po

@@ -1,15 +1,15 @@
 msgid ""
 msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: \n"
+"Language: es\n"
 "MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.3\n"
-"Language: es\n"
+"X-Generator: Poedit 3.1.1\n"
 
 #: tablet.getprocfailed
 #, object-pascal-format
@@ -385,7 +385,6 @@ msgid "Corrected hue and lightness"
 msgstr "Corregido matiz e iluminación"
 
 #: tffilterfunction.label_aequals.caption
-#, fuzzy
 msgctxt "tffilterfunction.label_aequals.caption"
 msgid "."
 msgstr "."
@@ -396,7 +395,6 @@ msgid "."
 msgstr "."
 
 #: tffilterfunction.label_bequals.caption
-#, fuzzy
 msgctxt "tffilterfunction.label_bequals.caption"
 msgid "."
 msgstr "."
@@ -417,7 +415,6 @@ msgid "."
 msgstr "."
 
 #: tffilterfunction.label_lequals.caption
-#, fuzzy
 msgctxt "tffilterfunction.label_lequals.caption"
 msgid "."
 msgstr "."
@@ -613,7 +610,6 @@ msgid "Remove current brush"
 msgstr "Quitar pincel actual"
 
 #: tfmain.button_donate.caption
-#, fuzzy
 msgctxt "tfmain.button_donate.caption"
 msgid "Donate..."
 msgstr "Donar..."
@@ -852,11 +848,11 @@ msgstr "Imprimir..."
 
 #: tfmain.filequicksave.caption
 msgid "Quick save"
-msgstr ""
+msgstr "Guardado rápido"
 
 #: tfmain.filequicksave.hint
 msgid "Save current file without dialogs"
-msgstr ""
+msgstr "Guardar archivo actual sin diálogos"
 
 #: tfmain.filequit.hint
 msgctxt "TFMAIN.FILEQUIT.HINT"
@@ -1116,16 +1112,12 @@ msgid "Rotate 180°"
 msgstr "Rotar 180º"
 
 #: tfmain.imagerotateccw.caption
-#, fuzzy
-#| msgid "Rotate 90° CCR"
 msgid "Rotate 90° CCW"
-msgstr "Rotar 90º CCR"
+msgstr "Rotar 90º Sentido Antihorario"
 
 #: tfmain.imagerotatecw.caption
-#, fuzzy
-#| msgid "Rotate 90° CR"
 msgid "Rotate 90° CW"
-msgstr "Rotar 90º CR"
+msgstr "Rotar 90º Sentido Horario"
 
 #: tfmain.imagesmartzoom3.caption
 msgid "Smart zoom x3"
@@ -1300,7 +1292,6 @@ msgid "Duplicate selected layer"
 msgstr "Duplicar capa seleccionada"
 
 #: tfmain.layerexport.hint
-#, fuzzy
 msgctxt "tfmain.layerexport.hint"
 msgid "Export..."
 msgstr "Exportar..."
@@ -1426,7 +1417,6 @@ msgid "Render"
 msgstr "Renderizar"
 
 #: tfmain.menuscript.caption
-#, fuzzy
 msgctxt "tfmain.menuscript.caption"
 msgid "Script"
 msgstr "Guión"
@@ -1790,7 +1780,6 @@ msgid "Curve"
 msgstr "Curva"
 
 #: tfmain.toolspline.hint
-#, fuzzy
 msgctxt "tfmain.toolspline.hint"
 msgid "Curve"
 msgstr "Curva"
@@ -1945,7 +1934,7 @@ msgstr "Relleno de flujo progresivo"
 
 #: tfmain.tool_textalignbottom.hint
 msgid "Align bottom"
-msgstr ""
+msgstr "Alinear abajo"
 
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
@@ -1957,7 +1946,7 @@ msgstr "Alinear a la izquierda"
 
 #: tfmain.tool_textalignmiddle.hint
 msgid "Center vertically"
-msgstr ""
+msgstr "Centrar Verticalmente"
 
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
@@ -1965,15 +1954,15 @@ msgstr "Alinear a la derecha"
 
 #: tfmain.tool_textaligntop.hint
 msgid "Align top"
-msgstr ""
+msgstr "Alinear arriba"
 
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
-msgstr ""
+msgstr "Bidireccional"
 
 #: tfmain.tool_textbold.hint
 msgid "Bold"
-msgstr ""
+msgstr "Negrita"
 
 #: tfmain.tool_textfont.hint
 msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
@@ -1982,11 +1971,11 @@ msgstr "Elegir fuente..."
 
 #: tfmain.tool_textitalic.hint
 msgid "Italic"
-msgstr ""
+msgstr "Italica"
 
 #: tfmain.tool_textltr.hint
 msgid "Left to right"
-msgstr ""
+msgstr "Izquierda a derecha"
 
 #: tfmain.tool_textoutline.hint
 msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
@@ -2000,7 +1989,7 @@ msgstr "Texto sombreado Phong"
 
 #: tfmain.tool_textrtl.hint
 msgid "Right to left"
-msgstr ""
+msgstr "Derecha a izquierda"
 
 #: tfmain.tool_textshadow.hint
 msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
@@ -2009,11 +1998,11 @@ msgstr "Sombra de Texto"
 
 #: tfmain.tool_textstrikeout.hint
 msgid "Strikeout"
-msgstr ""
+msgstr "Tachado"
 
 #: tfmain.tool_textunderline.hint
 msgid "Underline"
-msgstr ""
+msgstr "Subrayado"
 
 #: tfmain.viewcolors.caption
 msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
@@ -2831,7 +2820,6 @@ msgid "Autodetect"
 msgstr "Automático"
 
 #: uresourcestrings.rsback
-#, fuzzy
 msgctxt "uresourcestrings.rsback"
 msgid "Back"
 msgstr "Fondo"
@@ -3006,7 +2994,6 @@ msgid "Dither layer using palette"
 msgstr "Entramado de capa usando paleta"
 
 #: uresourcestrings.rsdonate
-#, fuzzy
 msgctxt "uresourcestrings.rsdonate"
 msgid "Donate..."
 msgstr "Donar..."
@@ -3149,7 +3136,6 @@ msgid "Fixed"
 msgstr "Fijo"
 
 #: uresourcestrings.rsflattenimage
-#, fuzzy
 msgctxt "uresourcestrings.rsflattenimage"
 msgid "Flatten image"
 msgstr "Aplanar imágen"
@@ -3237,7 +3223,6 @@ msgid "Icon size"
 msgstr "Tamaño de ícono"
 
 #: uresourcestrings.rsimage
-#, fuzzy
 msgctxt "uresourcestrings.rsimage"
 msgid "Image"
 msgstr "Imágen"
@@ -3547,7 +3532,6 @@ msgid "Palette options"
 msgstr "Opciones de paleta"
 
 #: uresourcestrings.rspen
-#, fuzzy
 msgctxt "uresourcestrings.rspen"
 msgid "Pen"
 msgstr "Pluma"
@@ -3611,7 +3595,6 @@ msgid "Remove color from palette"
 msgstr "Quitar color de la paleta"
 
 #: uresourcestrings.rsrender
-#, fuzzy
 msgctxt "uresourcestrings.rsrender"
 msgid "Render"
 msgstr "Renderizar"
@@ -3677,7 +3660,6 @@ msgid "Script"
 msgstr "Guión"
 
 #: uresourcestrings.rsselectblendoperation
-#, fuzzy
 msgctxt "uresourcestrings.rsselectblendoperation"
 msgid "Select blend operation"
 msgstr "Seleccionar operación de mezcla"
@@ -3721,7 +3703,6 @@ msgid "Stroke"
 msgstr "Trazo"
 
 #: uresourcestrings.rstextoutline
-#, fuzzy
 msgctxt "uresourcestrings.rstextoutline"
 msgid "Text outline"
 msgstr "Contorno de texto"
@@ -3813,7 +3794,7 @@ msgstr "Tamaño vertical"
 
 #: uresourcestrings.rsvisible
 msgid "Visibile"
-msgstr ""
+msgstr "Visible"
 
 #: uresourcestrings.rsyellow
 msgid "Yellow"
@@ -3824,14 +3805,11 @@ msgid "Yes"
 msgstr "Sí"
 
 #: uresourcestrings.rszoomlayerstackin
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackin"
 msgid "Zoom layer stack in"
-msgstr "Hacer zoom en capa"
+msgstr "Hacer zoom en capas"
 
 #: uresourcestrings.rszoomlayerstackout
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
-msgstr "Deshacer zoom en capa"
-
+msgstr "Deshacer zoom en capas"

+ 106 - 127
lazpaint/release/bin/i18n/lazpaint.nl.po

@@ -1,38 +1,18 @@
+# Imanuel Habekotté <.ima_@habekotte_.gmail_com>, 2022.
 msgid ""
 msgstr ""
-"Project-Id-Version: Lazpaint 7.0.4\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-08-20 12:23+0200\n"
-"Last-Translator: fred\n"
-"Language-Team: LazPaint\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: nl\n"
-"X-Generator: Poedit 2.2.3\n"
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-21 16:07+0200\n"
-"PO-Revision-Date: 2014-07-21 16:18+0200\n"
-"Last-Translator: BigChimp <[email protected]>\n"
-"Language-Team: LazPaint\n"
-"Language: nl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Virtaal 0.7.0\n"
 "Project-Id-Version: LazPaint\n"
+"Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2014-03-28 11:18+0200\n"
-"Last-Translator: BigChimp <nowhere@example.com>\n"
+"PO-Revision-Date: 2022-08-16 14:48+0200\n"
+"Last-Translator: Imanuel Habekotté <.ima_@habekotte_.gmail_com>\n"
 "Language-Team: LazPaint\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Virtaal 0.7.0\n"
+"X-Generator: Virtaal 0.7.1\n"
 "X-Poedit-Language: Dutch\n"
 
 #: tablet.getprocfailed
@@ -191,7 +171,9 @@ msgstr "Basale SVG"
 
 #: tfblendop.label_svgover.hint
 msgid "Basic blend operations that are available in virtually all image editors"
-msgstr "Basale mengoperaties die beschikbaar zijn in bijna alle beeldbewerkingssoftware"
+msgstr ""
+"Basale mengoperaties die beschikbaar zijn in bijna alle "
+"beeldbewerkingssoftware"
 
 #: tfbrowseimages.caption
 msgid "Browse images"
@@ -337,11 +319,11 @@ msgstr "Annuleren"
 
 #: tfcustomblur.button_editmask.caption
 msgid "Edit mask..."
-msgstr "Bewerkingsmasker..."
+msgstr "Masker bewerken..."
 
 #: tfcustomblur.button_loadmask.caption
 msgid "Load mask..."
-msgstr "Laad masker..."
+msgstr "Masker laden..."
 
 #: tfcustomblur.button_ok.caption
 msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION"
@@ -355,7 +337,7 @@ msgstr "Aangepaste vervaging"
 
 #: tfcustomblur.openpicturedialog1.title
 msgid "Open grayscale file"
-msgstr "Open grijstinten-bestand"
+msgstr "Zwart-witte afbeelding laden..."
 
 #: tfemboss.button_cancel.caption
 msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION"
@@ -471,7 +453,7 @@ msgstr "HSL"
 
 #: tffilterfunction.tabsheet_lab.caption
 msgid "Lab"
-msgstr ""
+msgstr "Lab"
 
 #: tffilterfunction.tabsheet_rgb.caption
 msgctxt "tffilterfunction.tabsheet_rgb.caption"
@@ -630,14 +612,13 @@ msgstr "Maak een geometrische kwast"
 #: tfmain.brushloadfromfile.hint
 msgctxt "tfmain.brushloadfromfile.hint"
 msgid "Load brush from file..."
-msgstr "Laad kwast van bestand..."
+msgstr "Kwast van bestand laden..."
 
 #: tfmain.brushremovecurrent.hint
 msgid "Remove current brush"
 msgstr "Verwijder huidige kwast"
 
 #: tfmain.button_donate.caption
-#, fuzzy
 msgctxt "tfmain.button_donate.caption"
 msgid "Donate..."
 msgstr "Doneren..."
@@ -678,11 +659,11 @@ msgstr "Kleuren verschuiven..."
 
 #: tfmain.combobox_arrowend.hint
 msgid "Ending arrow"
-msgstr ""
+msgstr "Eindgedeelte pijl"
 
 #: tfmain.combobox_arrowstart.hint
 msgid "Starting arrow"
-msgstr ""
+msgstr "Begingedeelte pijl"
 
 #: tfmain.combobox_penstyle.hint
 msgid "Pen style"
@@ -793,11 +774,11 @@ msgstr "Vorm uitlijnen naar boven"
 
 #: tfmain.editshapecenterhorizontally.hint
 msgid "Center shape horizontally"
-msgstr "Vorm horizontaal midden"
+msgstr "Vorm horizontaal centreren"
 
 #: tfmain.editshapecentervertically.hint
 msgid "Center shape vertically"
-msgstr "Vorm verticaall midden"
+msgstr "Vorm verticaal centreren"
 
 #: tfmain.editshapetocurve.hint
 msgid "Convert shape to curve"
@@ -830,7 +811,7 @@ msgstr "Wijzigingen valideren"
 
 #: tfmain.exportpicturedialog.title
 msgid "Export as..."
-msgstr "Export als..."
+msgstr "Exporteren als..."
 
 #: tfmain.filechooseentry.caption
 msgid "Choose entry..."
@@ -843,7 +824,7 @@ msgstr "Kies invoer in bestand"
 #: tfmain.fileexport.caption
 msgctxt "tfmain.fileexport.caption"
 msgid "Export..."
-msgstr "Export..."
+msgstr "Exporteren..."
 
 #: tfmain.fileimport3d.caption
 msgid "Import 3D object..."
@@ -876,11 +857,11 @@ msgstr "Print..."
 
 #: tfmain.filequicksave.caption
 msgid "Quick save"
-msgstr ""
+msgstr "Snel opslaan"
 
 #: tfmain.filequicksave.hint
 msgid "Save current file without dialogs"
-msgstr ""
+msgstr "Huidig bestand opslaan zonder dialoogvenster"
 
 #: tfmain.filequit.hint
 msgctxt "TFMAIN.FILEQUIT.HINT"
@@ -919,7 +900,7 @@ msgstr "Bestand opslaan als"
 
 #: tfmain.filesaveasinsamefolder.caption
 msgid "Save in same folder..."
-msgstr "Sla op in zelfde folder..."
+msgstr "Opslaan in dezelfde map..."
 
 #: tfmain.filesaveselectionas.caption
 msgctxt "TFMAIN.FILESAVESELECTIONAS.CAPTION"
@@ -933,12 +914,12 @@ msgstr "Gebruik afbeeldingsbrowser"
 
 #: tfmain.filterblurbox.caption
 msgid "Box blur..."
-msgstr "Box vervagen..."
+msgstr "Vierkant-vervaging..."
 
 #: tfmain.filterblurcorona.caption
 msgctxt "tfmain.filterblurcorona.caption"
 msgid "Corona blur..."
-msgstr "Corona vervaging..."
+msgstr "Corona-vervaging..."
 
 #: tfmain.filterblurcustom.caption
 msgctxt "tfmain.filterblurcustom.caption"
@@ -948,7 +929,7 @@ msgstr "Aangepaste vervaging..."
 #: tfmain.filterblurdisk.caption
 msgctxt "tfmain.filterblurdisk.caption"
 msgid "Disk blur..."
-msgstr "Schijf vervaging..."
+msgstr "Schijf-vervaging..."
 
 #: tfmain.filterblurfast.caption
 msgctxt "tfmain.filterblurfast.caption"
@@ -968,7 +949,7 @@ msgstr "Precieze vervaging..."
 #: tfmain.filterblurradial.caption
 msgctxt "tfmain.filterblurradial.caption"
 msgid "Gaussian blur..."
-msgstr "Gaussian vervaging..."
+msgstr "Gaussische vervaging..."
 
 #: tfmain.filtercleartype.caption
 msgid "ClearType"
@@ -1000,7 +981,7 @@ msgstr "Functie toepassen..."
 
 #: tfmain.filtergrayscale.caption
 msgid "Grayscale"
-msgstr "Grijstinten"
+msgstr "Zwart-wit"
 
 #: tfmain.filterlinearnegative.caption
 msgctxt "tfmain.filterlinearnegative.caption"
@@ -1320,10 +1301,9 @@ msgid "Duplicate selected layer"
 msgstr "Geselecteerde laag dupliceren"
 
 #: tfmain.layerexport.hint
-#, fuzzy
 msgctxt "tfmain.layerexport.hint"
 msgid "Export..."
-msgstr "Export..."
+msgstr "Exporteren..."
 
 #: tfmain.layerfromfile.hint
 msgctxt "tfmain.layerfromfile.hint"
@@ -1446,7 +1426,6 @@ msgid "Render"
 msgstr "Renderen"
 
 #: tfmain.menuscript.caption
-#, fuzzy
 msgctxt "tfmain.menuscript.caption"
 msgid "Script"
 msgstr "Script"
@@ -1878,11 +1857,11 @@ msgstr "Maak transparant"
 #: tfmain.tool_eraseblur.hint
 msgctxt "tfmain.tool_eraseblur.hint"
 msgid "Soften"
-msgstr "Soften"
+msgstr "Verzachten"
 
 #: tfmain.tool_erasedarken.hint
 msgid "Darken"
-msgstr "Donkerder"
+msgstr "Donkerder maken"
 
 #: tfmain.tool_eraselighten.hint
 msgid "Lighten"
@@ -1964,7 +1943,7 @@ msgstr "Progressieve vloedvulling"
 
 #: tfmain.tool_textalignbottom.hint
 msgid "Align bottom"
-msgstr ""
+msgstr "Onder uitlijnen"
 
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
@@ -1976,7 +1955,7 @@ msgstr "Links uitlijnen"
 
 #: tfmain.tool_textalignmiddle.hint
 msgid "Center vertically"
-msgstr ""
+msgstr "Verticaal centreren"
 
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
@@ -1984,15 +1963,15 @@ msgstr "Rechts uitlijnen"
 
 #: tfmain.tool_textaligntop.hint
 msgid "Align top"
-msgstr ""
+msgstr "Boven uitlijnen"
 
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
-msgstr ""
+msgstr "Bidirectioneel"
 
 #: tfmain.tool_textbold.hint
 msgid "Bold"
-msgstr ""
+msgstr "Vet"
 
 #: tfmain.tool_textfont.hint
 msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
@@ -2001,11 +1980,11 @@ msgstr "Lettertype kiezen..."
 
 #: tfmain.tool_textitalic.hint
 msgid "Italic"
-msgstr ""
+msgstr "Schuin"
 
 #: tfmain.tool_textltr.hint
 msgid "Left to right"
-msgstr ""
+msgstr "Links-naar-rechts"
 
 #: tfmain.tool_textoutline.hint
 msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
@@ -2019,7 +1998,7 @@ msgstr "Tekst phong shading"
 
 #: tfmain.tool_textrtl.hint
 msgid "Right to left"
-msgstr ""
+msgstr "Rechts-naar-links"
 
 #: tfmain.tool_textshadow.hint
 msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
@@ -2028,11 +2007,11 @@ msgstr "Tekstschaduw"
 
 #: tfmain.tool_textstrikeout.hint
 msgid "Strikeout"
-msgstr ""
+msgstr "Doorgestreept"
 
 #: tfmain.tool_textunderline.hint
 msgid "Underline"
-msgstr ""
+msgstr "Onderstreept"
 
 #: tfmain.viewcolors.caption
 msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
@@ -2167,11 +2146,11 @@ msgstr "Nieuwe afbeelding"
 
 #: tfnewimage.combobox_bitdepth.text
 msgid "32"
-msgstr ""
+msgstr "32"
 
 #: tfnewimage.label_bitdepth.caption
 msgid "Bit depth :"
-msgstr "Bit diepte:"
+msgstr "Kleurendiepte :"
 
 #: tfnewimage.label_height.caption
 msgctxt "tfnewimage.label_height.caption"
@@ -2180,11 +2159,11 @@ msgstr "Hoogte :"
 
 #: tfnewimage.label_height1.caption
 msgid "Ratio :"
-msgstr "Verhouding:"
+msgstr "Verhouding :"
 
 #: tfnewimage.label_memoryrequired.caption
 msgid "Memory required :"
-msgstr "Geheugen vereist:"
+msgstr "Geheugen vereist :"
 
 #: tfnewimage.label_width.caption
 msgctxt "tfnewimage.label_width.caption"
@@ -2211,7 +2190,7 @@ msgstr "Dekking:"
 
 #: tfnoisefilter.radio_grayscalenoise.caption
 msgid "Grayscale noise"
-msgstr "Grijstint ruis"
+msgstr "Zwart-witte ruis"
 
 #: tfnoisefilter.radio_rgbnoise.caption
 msgid "RGB noise"
@@ -2224,7 +2203,7 @@ msgstr "Annuleren"
 
 #: tfobject3d.button_loadtex.caption
 msgid "Texture..."
-msgstr "Tekstuur..."
+msgstr "Textuur..."
 
 #: tfobject3d.button_notex.caption
 msgid "No tex."
@@ -2237,7 +2216,7 @@ msgstr "OK"
 
 #: tfobject3d.caption
 msgid "3D object"
-msgstr "3d object"
+msgstr "3D object"
 
 #: tfobject3d.checkbox_antialiasing.caption
 msgid "Antialiasing"
@@ -2282,7 +2261,7 @@ msgstr "Belichting normalen :"
 
 #: tfobject3d.label_lights.caption
 msgid "Lights :"
-msgstr "Lichten:"
+msgstr "Lichtbronnen :"
 
 #: tfobject3d.label_materials.caption
 msgctxt "tfobject3d.label_materials.caption"
@@ -2311,7 +2290,7 @@ msgstr "Zoomen"
 
 #: tfobject3d.lights.caption
 msgid "Lights"
-msgstr "Lichten"
+msgstr "Lichtbronnen"
 
 #: tfobject3d.materials.caption
 msgid "Materials"
@@ -2360,7 +2339,7 @@ msgstr "Kleur"
 
 #: tfphongfilter.groupbox_color1.caption
 msgid "Altitude map"
-msgstr "Hoogte map"
+msgstr "Hoogtekaart"
 
 #: tfphongfilter.label_altitude.caption
 msgid "Global altitude :"
@@ -2455,7 +2434,7 @@ msgstr "OK"
 #: tfposterize.caption
 msgctxt "tfposterize.caption"
 msgid "Posterize"
-msgstr "Posterize"
+msgstr "Posterizeren"
 
 #: tfposterize.checkbox_bylightness.caption
 msgid "By lightness"
@@ -2577,7 +2556,7 @@ msgstr "Radiale vervaging"
 #: tfradialblur.label_radius.caption
 msgctxt "tfradialblur.label_radius.caption"
 msgid "Radius :"
-msgstr "Radius :"
+msgstr "Straal :"
 
 #: tfrain.button_cancel.caption
 msgctxt "tfrain.button_cancel.caption"
@@ -2657,7 +2636,7 @@ msgstr "Dithering"
 
 #: tfsaveoption.checkbox_lossless.caption
 msgid "Lossless"
-msgstr ""
+msgstr "Zonder verlies"
 
 #: tfsaveoption.label1.caption
 msgid "Quality:"
@@ -2784,7 +2763,7 @@ msgstr "Hoek :"
 #: tftwirl.label_radius.caption
 msgctxt "tftwirl.label_radius.caption"
 msgid "Radius :"
-msgstr "Radius :"
+msgstr "Straal :"
 
 #: tfwavedisplacement.button_cancel.caption
 msgctxt "tfwavedisplacement.button_cancel.caption"
@@ -2849,7 +2828,6 @@ msgid "Autodetect"
 msgstr "Automatische detectie"
 
 #: uresourcestrings.rsback
-#, fuzzy
 msgctxt "uresourcestrings.rsback"
 msgid "Back"
 msgstr "Terug"
@@ -2868,7 +2846,7 @@ msgstr "Bitmap"
 
 #: uresourcestrings.rsblack
 msgid "Black"
-msgstr ""
+msgstr "Zwart"
 
 #: uresourcestrings.rsblendopnotusedforbackground
 msgid "The blend operation is applied only if there is a layer underneath"
@@ -2914,7 +2892,7 @@ msgstr "CD"
 
 #: uresourcestrings.rschannels
 msgid "Channels"
-msgstr ""
+msgstr "Kanalen"
 
 #: uresourcestrings.rsclearpalette
 msgid "Clear palette"
@@ -2930,11 +2908,13 @@ msgstr "CMD"
 
 #: uresourcestrings.rscolordescription
 msgid "Color description: click to type in a color with the keyboard using color names or CSS notation."
-msgstr "Kleurbeschrijving: klik om een kleur in te typen met het toetsenbord middels kleurnamen of CSS notatie."
+msgstr ""
+"Kleurbeschrijving: klik om een kleur in te typen met het toetsenbord middels "
+"kleurnamen of CSS notatie."
 
 #: uresourcestrings.rscoloroverlay
 msgid "Color overlay"
-msgstr ""
+msgstr "Kleur overlay"
 
 #: uresourcestrings.rscolors
 msgctxt "uresourcestrings.rscolors"
@@ -2951,7 +2931,8 @@ msgstr "Weet u zeker dat u deze %1-bestanden uit de container wilt verwijderen?"
 
 #: uresourcestrings.rsconfirmmovemultipletotrash
 msgid "Are you sure you want to move these %1 files to the trash?"
-msgstr "Weet je zeker dat je deze %1-bestanden naar de prullenbak wilt verplaatsen?"
+msgstr ""
+"Weet je zeker dat je deze %1-bestanden naar de prullenbak wilt verplaatsen?"
 
 #: uresourcestrings.rsconfirmmovetotrash
 msgid "Are you sure you want to move this file to the trash?"
@@ -2989,7 +2970,7 @@ msgstr "CTRL"
 
 #: uresourcestrings.rscurrentlayernotsplit
 msgid "Current layer is not split"
-msgstr ""
+msgstr "Huidige laag is niet gesplitst"
 
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
@@ -2997,7 +2978,7 @@ msgstr "Druk S of X om de krommingsmodus van het laatste punt in te stellen"
 
 #: uresourcestrings.rscyan
 msgid "Cyan"
-msgstr ""
+msgstr "Cyaan"
 
 #: uresourcestrings.rsdefaultpalette
 msgid "Default palette"
@@ -3021,7 +3002,6 @@ msgid "Dither layer using palette"
 msgstr "Ditherlaag met palet"
 
 #: uresourcestrings.rsdonate
-#, fuzzy
 msgctxt "uresourcestrings.rsdonate"
 msgid "Donate..."
 msgstr "Doneren..."
@@ -3032,7 +3012,7 @@ msgstr "Downloaden"
 
 #: uresourcestrings.rsdropshadow
 msgid "Drop shadow"
-msgstr ""
+msgstr "Slagschaduw"
 
 #: uresourcestrings.rsduplicateimage
 msgid "Duplicate image"
@@ -3064,7 +3044,8 @@ msgstr "Einde zonder begin"
 
 #: uresourcestrings.rsenterfolderorcontainername
 msgid "Enter name for new folder or container (using RES or LRS extension):"
-msgstr "Voer naam in voor een nieuwe map of container (met extensie RES of LRS):"
+msgstr ""
+"Voer naam in voor een nieuwe map of container (met extensie RES of LRS):"
 
 #: uresourcestrings.rsenterlayername
 msgid "Enter layer name:"
@@ -3159,14 +3140,13 @@ msgid "Fixed"
 msgstr "Vast"
 
 #: uresourcestrings.rsflattenimage
-#, fuzzy
 msgctxt "uresourcestrings.rsflattenimage"
 msgid "Flatten image"
 msgstr "Alle lagen samenvoegen"
 
 #: uresourcestrings.rsfolder
 msgid "Folder"
-msgstr "Folder"
+msgstr "Map"
 
 #: uresourcestrings.rsfolderorcontaineralreadyexists
 msgid "Folder or container already exists."
@@ -3178,7 +3158,7 @@ msgstr "De volgende fouten zijn opgetreden:"
 
 #: uresourcestrings.rsfractaltree
 msgid "Fractal tree"
-msgstr ""
+msgstr "Boomfiguur"
 
 #: uresourcestrings.rsframes
 msgid "Frames"
@@ -3246,7 +3226,6 @@ msgid "Icon size"
 msgstr "Ikoon grootte"
 
 #: uresourcestrings.rsimage
-#, fuzzy
 msgctxt "uresourcestrings.rsimage"
 msgid "Image"
 msgstr "Afbeelding"
@@ -3266,11 +3245,11 @@ msgstr "Informatie"
 
 #: uresourcestrings.rsinnerlight
 msgid "Inner light"
-msgstr ""
+msgstr "Inwendig licht"
 
 #: uresourcestrings.rsinnershadow
 msgid "Inner shadow"
-msgstr ""
+msgstr "Inwendig schaduw"
 
 #: uresourcestrings.rsintensity
 msgctxt "uresourcestrings.rsintensity"
@@ -3283,7 +3262,7 @@ msgstr "Interne fout"
 
 #: uresourcestrings.rsinvalidangle
 msgid "Invalid angle"
-msgstr ""
+msgstr "Ongeldige hoek"
 
 #: uresourcestrings.rsinvalidname
 msgid "Invalid name"
@@ -3327,7 +3306,7 @@ msgstr "De nieuwste online beschikbare LazPaint versie is"
 
 #: uresourcestrings.rslava
 msgid "Lava"
-msgstr ""
+msgstr "Lava"
 
 #: uresourcestrings.rslayer
 msgctxt "uresourcestrings.rslayer"
@@ -3336,7 +3315,7 @@ msgstr "Laag"
 
 #: uresourcestrings.rslayeralreadysplit
 msgid "Layer already split"
-msgstr ""
+msgstr "Laag is al gesplitst"
 
 #: uresourcestrings.rslayeredimage
 msgid "Layered image"
@@ -3344,7 +3323,7 @@ msgstr "Gelaagde afbeelding"
 
 #: uresourcestrings.rslayereffect
 msgid "Layer effect"
-msgstr ""
+msgstr "Laageffect"
 
 #: uresourcestrings.rslayers
 msgctxt "uresourcestrings.rslayers"
@@ -3399,11 +3378,11 @@ msgstr "Aantal herhalingen"
 
 #: uresourcestrings.rsmagenta
 msgid "Magenta"
-msgstr ""
+msgstr "Magenta"
 
 #: uresourcestrings.rsmakemonochromatic
 msgid "Make monochromatic"
-msgstr ""
+msgstr "Omzetten in zwart-wit"
 
 #: uresourcestrings.rsmakencolorspalettefrombitmap
 msgid "Make %1-colors palette from image"
@@ -3411,15 +3390,15 @@ msgstr "Maak %1-kleurenpalet van afbeelding"
 
 #: uresourcestrings.rsmask
 msgid "Mask"
-msgstr ""
+msgstr "Maskeren"
 
 #: uresourcestrings.rsmaskfromalphachannel
 msgid "Mask from alpha channel"
-msgstr ""
+msgstr "Middels alphakanaal maskeren"
 
 #: uresourcestrings.rsmerge
 msgid "Merge"
-msgstr ""
+msgstr "Mengen"
 
 #: uresourcestrings.rsmergeselection
 msgid "Do you want to merge selection?"
@@ -3431,7 +3410,9 @@ msgstr "Mitchell"
 
 #: uresourcestrings.rsmorethanonefile
 msgid "You are trying to open more than one file. How would you like these files to be opened?"
-msgstr "U probeert meer dan een bestand te openen. Hoe wilt u dat deze bestanden worden geopend?"
+msgstr ""
+"U probeert meer dan een bestand te openen. Hoe wilt u dat deze bestanden "
+"worden geopend?"
 
 #: uresourcestrings.rsmovingorrotatingselection
 msgid "Moving or rotating selection"
@@ -3456,7 +3437,7 @@ msgstr "Nieuwe afbeelding"
 
 #: uresourcestrings.rsnewmask
 msgid "New mask"
-msgstr ""
+msgstr "Nieuwe maskerlaag"
 
 #: uresourcestrings.rsno
 msgid "No"
@@ -3484,7 +3465,7 @@ msgstr "Normaal"
 
 #: uresourcestrings.rsnotchromaticchannel
 msgid "This is not a chromatic channel"
-msgstr ""
+msgstr "Huidig kanaal is niet chromatisch"
 
 #: uresourcestrings.rsnothingtobedeformed
 msgid "There is nothing to be deformed"
@@ -3496,7 +3477,9 @@ msgstr "Er is niets om op te halen"
 
 #: uresourcestrings.rsnotreasonableformat
 msgid "It is not reasonable to save such a big image in this file format."
-msgstr "Het is onredelijk om zo'n grote afbeelding in dit bestandsformaat op te slaan."
+msgstr ""
+"Het is onredelijk om zo'n grote afbeelding in dit bestandsformaat op te "
+"slaan."
 
 #: uresourcestrings.rsnumber
 msgid "№"
@@ -3504,7 +3487,7 @@ msgstr "№"
 
 #: uresourcestrings.rsokay
 msgid "Okay"
-msgstr "Okay"
+msgstr "OK"
 
 #: uresourcestrings.rsopacity
 msgid "Opacity"
@@ -3547,7 +3530,6 @@ msgid "Palette options"
 msgstr "Palet opties"
 
 #: uresourcestrings.rspen
-#, fuzzy
 msgctxt "uresourcestrings.rspen"
 msgid "Pen"
 msgstr "Pen"
@@ -3611,7 +3593,6 @@ msgid "Remove color from palette"
 msgstr "Verwijder kleur van palet"
 
 #: uresourcestrings.rsrender
-#, fuzzy
 msgctxt "uresourcestrings.rsrender"
 msgid "Render"
 msgstr "Renderen"
@@ -3640,7 +3621,7 @@ msgstr "RGB"
 
 #: uresourcestrings.rsrightclickfinishshape
 msgid "Use RIGHT click to finish shape"
-msgstr ""
+msgstr "Gebruik RECHTS klikken om de vorm te finaliseren"
 
 #: uresourcestrings.rsrightclickforsource
 msgid "Use RIGHT click to define source"
@@ -3675,7 +3656,6 @@ msgid "Script"
 msgstr "Script"
 
 #: uresourcestrings.rsselectblendoperation
-#, fuzzy
 msgctxt "uresourcestrings.rsselectblendoperation"
 msgid "Select blend operation"
 msgstr "Kies mengoperatie"
@@ -3700,15 +3680,15 @@ msgstr "Spline"
 
 #: uresourcestrings.rssplitcmyk
 msgid "Split CMYK"
-msgstr ""
+msgstr "Splits CMYK"
 
 #: uresourcestrings.rssplithsl
 msgid "Split HSL"
-msgstr ""
+msgstr "Splits HSL"
 
 #: uresourcestrings.rssplitrgb
 msgid "Split RGB"
-msgstr ""
+msgstr "Splits RGB"
 
 #: uresourcestrings.rsstoragedevice
 msgid "Device"
@@ -3716,13 +3696,12 @@ msgstr "Apparaat"
 
 #: uresourcestrings.rsstroke
 msgid "Stroke"
-msgstr ""
+msgstr "Penkleur"
 
 #: uresourcestrings.rstextoutline
-#, fuzzy
 msgctxt "uresourcestrings.rstextoutline"
 msgid "Text outline"
-msgstr "Progressieve vloedvulling"
+msgstr "Tekstomlijning"
 
 #: uresourcestrings.rstexturemapping
 msgctxt "uresourcestrings.rstexturemapping"
@@ -3731,11 +3710,14 @@ msgstr "Texture mapping"
 
 #: uresourcestrings.rstherearenocheckeditems
 msgid "There are no checked items. Check some items or add some new ones."
-msgstr "Er zijn geen aangevinkte items. Controleer enkele items of voeg nieuwe toe."
+msgstr ""
+"Er zijn geen aangevinkte items. Controleer enkele items of voeg nieuwe toe."
 
 #: uresourcestrings.rsthereisnofilenamegivenforthisfileusesaveas
 msgid "There is no file name given for this file. Use \"Save as...\" from the main menu."
-msgstr "Er is geen bestandsnaam gegeven voor dit bestand. Gebruik \"Opslaan als…\" in het hoofdmenu."
+msgstr ""
+"Er is geen bestandsnaam gegeven voor dit bestand. Gebruik \"Opslaan als…\" in "
+"het hoofdmenu."
 
 #: uresourcestrings.rstodo
 msgid "To do"
@@ -3743,7 +3725,7 @@ msgstr "Te doen"
 
 #: uresourcestrings.rstodoimages
 msgid "Images left: %1"
-msgstr "Resterende afbeeldingen:% 1"
+msgstr "Resterende afbeeldingen: %1"
 
 #: uresourcestrings.rstooloninvisiblelayer
 msgid "Tool cannot be used on an invisible layer"
@@ -3763,7 +3745,7 @@ msgstr "Te veel vormen in laag"
 
 #: uresourcestrings.rstotalimages
 msgid "Total images: %1"
-msgstr "Totaal aantal afbeeldingen:% 1"
+msgstr "Totaal aantal afbeeldingen: %1"
 
 #: uresourcestrings.rstransferselectiontootherlayer
 msgid "Transfer selection to other layer?"
@@ -3799,15 +3781,15 @@ msgstr "Onbekend origineel"
 
 #: uresourcestrings.rsvectoriallayer
 msgid "Vectorial layer"
-msgstr "Vector laag"
+msgstr "Vectorlaag"
 
 #: uresourcestrings.rsversion
 msgid "Version"
-msgstr ""
+msgstr "Versie"
 
 #: uresourcestrings.rsverticalsize
 msgid "Vertical size"
-msgstr ""
+msgstr "Verticale afmeting"
 
 #: uresourcestrings.rsvisible
 msgid "Visibile"
@@ -3815,21 +3797,18 @@ msgstr "Zichtbaar"
 
 #: uresourcestrings.rsyellow
 msgid "Yellow"
-msgstr ""
+msgstr "Geel"
 
 #: uresourcestrings.rsyes
 msgid "Yes"
 msgstr "Ja"
 
 #: uresourcestrings.rszoomlayerstackin
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackin"
 msgid "Zoom layer stack in"
 msgstr "Inzoomen in lagenoverzicht"
 
 #: uresourcestrings.rszoomlayerstackout
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgstr "Uitzoomen uit lagenoverzicht"
-

+ 78 - 80
lazpaint/release/bin/i18n/lazpaint.pt_BR.po

@@ -113,12 +113,12 @@ msgstr "Categoria de operação de mesclagem"
 #: tfblendop.label_blendopvalue.caption
 msgctxt "tfblendop.label_blendopvalue.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfblendop.label_kritaover.caption
 msgctxt "TFBLENDOP.LABEL_KRITAOVER.CAPTION"
 msgid "Krita"
-msgstr ""
+msgstr "Krita"
 
 #: tfblendop.label_kritaover.hint
 msgid "Blend operations that are available in Krita"
@@ -180,7 +180,7 @@ msgstr "Use este diretório na inicialização"
 #: tfbrowseimages.label_status.caption
 msgctxt "tfbrowseimages.label_status.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfbrowseimages.toolbutton_createfolderorcontainer.hint
 msgid "Create folder or container"
@@ -387,52 +387,52 @@ msgstr "Corrigida a tonalidade e luminosidade"
 #: tffilterfunction.label_aequals.caption
 msgctxt "tffilterfunction.label_aequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_alphaequals.caption
 msgctxt "tffilterfunction.label_alphaequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_bequals.caption
 msgctxt "tffilterfunction.label_bequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_blueequals.caption
 msgctxt "tffilterfunction.label_blueequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_greenequals.caption
 msgctxt "tffilterfunction.label_greenequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_hueequals.caption
 msgctxt "tffilterfunction.label_hueequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_lequals.caption
 msgctxt "tffilterfunction.label_lequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_lightnessequals.caption
 msgctxt "tffilterfunction.label_lightnessequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_redequals.caption
 msgctxt "tffilterfunction.label_redequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_saturationequals.caption
 msgctxt "tffilterfunction.label_saturationequals.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tffilterfunction.label_variables.caption
 msgid "Variables :"
@@ -444,7 +444,7 @@ msgstr "HSL"
 
 #: tffilterfunction.tabsheet_lab.caption
 msgid "Lab"
-msgstr ""
+msgstr "Lab"
 
 #: tffilterfunction.tabsheet_rgb.caption
 msgctxt "tffilterfunction.tabsheet_rgb.caption"
@@ -504,22 +504,22 @@ msgstr "Desmarque arquivos inexistentes"
 #: tfimagelist.stringgrid1.columns[0].title.caption
 msgctxt "tfimagelist.stringgrid1.columns[0].title.caption"
 msgid "-"
-msgstr ""
+msgstr "-"
 
 #: tfimagelist.stringgrid1.columns[1].title.caption
 msgctxt "tfimagelist.stringgrid1.columns[1].title.caption"
 msgid "-"
-msgstr ""
+msgstr "-"
 
 #: tfimagelist.stringgrid1.columns[2].title.caption
 msgctxt "tfimagelist.stringgrid1.columns[2].title.caption"
 msgid "-"
-msgstr ""
+msgstr "-"
 
 #: tfimagelist.stringgrid1.columns[3].title.caption
 msgctxt "tfimagelist.stringgrid1.columns[3].title.caption"
 msgid "-"
-msgstr ""
+msgstr "-"
 
 #: tfimagelist.tbaddfiles.hint
 msgid "Add images to list"
@@ -651,11 +651,11 @@ msgstr "Mudar as cores..."
 
 #: tfmain.combobox_arrowend.hint
 msgid "Ending arrow"
-msgstr ""
+msgstr "Seta final"
 
 #: tfmain.combobox_arrowstart.hint
 msgid "Starting arrow"
-msgstr ""
+msgstr "Seta inicial"
 
 #: tfmain.combobox_penstyle.hint
 msgid "Pen style"
@@ -850,11 +850,11 @@ msgstr "Imprimir..."
 
 #: tfmain.filequicksave.caption
 msgid "Quick save"
-msgstr ""
+msgstr "Salvamento rapido"
 
 #: tfmain.filequicksave.hint
 msgid "Save current file without dialogs"
-msgstr ""
+msgstr "Salvar arquivo atual sem diálogos"
 
 #: tfmain.filequit.hint
 msgctxt "TFMAIN.FILEQUIT.HINT"
@@ -1204,7 +1204,7 @@ msgstr "Diferença de cor"
 #: tfmain.label_currentzoom.caption
 msgctxt "TFMAIN.LABEL_CURRENTZOOM.CAPTION"
 msgid "%"
-msgstr ""
+msgstr "%"
 
 #: tfmain.label_currentzoom.hint
 msgid "Current zoom"
@@ -1228,7 +1228,7 @@ msgstr "Grade"
 #: tfmain.label_gridx.caption
 msgctxt "TFMAIN.LABEL_GRIDX.CAPTION"
 msgid "x"
-msgstr ""
+msgstr "x"
 
 #: tfmain.label_outlinewidth.caption
 msgctxt "TFMAIN.LABEL_OUTLINEWIDTH.CAPTION"
@@ -1939,7 +1939,7 @@ msgstr "Preenchimento progressivo"
 
 #: tfmain.tool_textalignbottom.hint
 msgid "Align bottom"
-msgstr ""
+msgstr "Alinhar ao fundo"
 
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
@@ -1951,7 +1951,7 @@ msgstr "Alinhar à esquerda"
 
 #: tfmain.tool_textalignmiddle.hint
 msgid "Center vertically"
-msgstr ""
+msgstr "Centralizar verticalmente"
 
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
@@ -1959,15 +1959,15 @@ msgstr "Alinhar à direita"
 
 #: tfmain.tool_textaligntop.hint
 msgid "Align top"
-msgstr ""
+msgstr "Alinhar ao topo"
 
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
-msgstr ""
+msgstr "Bidirecional"
 
 #: tfmain.tool_textbold.hint
 msgid "Bold"
-msgstr ""
+msgstr "Negrito"
 
 #: tfmain.tool_textfont.hint
 msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
@@ -1976,11 +1976,11 @@ msgstr "Escolher tipo de letra..."
 
 #: tfmain.tool_textitalic.hint
 msgid "Italic"
-msgstr ""
+msgstr "Itálico"
 
 #: tfmain.tool_textltr.hint
 msgid "Left to right"
-msgstr ""
+msgstr "Esquerda para direita"
 
 #: tfmain.tool_textoutline.hint
 msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
@@ -1994,7 +1994,7 @@ msgstr "Texto Phong de sombreamento"
 
 #: tfmain.tool_textrtl.hint
 msgid "Right to left"
-msgstr ""
+msgstr "Direita para esquerda"
 
 #: tfmain.tool_textshadow.hint
 msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
@@ -2003,11 +2003,11 @@ msgstr "Sombra do texto"
 
 #: tfmain.tool_textstrikeout.hint
 msgid "Strikeout"
-msgstr ""
+msgstr "Tachado"
 
 #: tfmain.tool_textunderline.hint
 msgid "Underline"
-msgstr ""
+msgstr "Sublinhado"
 
 #: tfmain.viewcolors.caption
 msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
@@ -2146,7 +2146,7 @@ msgstr "Nova imagem"
 
 #: tfnewimage.combobox_bitdepth.text
 msgid "32"
-msgstr ""
+msgstr "32"
 
 #: tfnewimage.label_bitdepth.caption
 msgid "Bit depth :"
@@ -2353,15 +2353,15 @@ msgstr "Posição de luz :"
 
 #: tfphongfilter.radio_mapalpha.caption
 msgid "Alpha"
-msgstr ""
+msgstr "Alpha"
 
 #: tfphongfilter.radio_mapblue.caption
 msgid "B"
-msgstr ""
+msgstr "B"
 
 #: tfphongfilter.radio_mapgreen.caption
 msgid "G"
-msgstr ""
+msgstr "G"
 
 #: tfphongfilter.radio_maplightness.caption
 msgctxt "TFPHONGFILTER.RADIO_MAPLIGHTNESS.CAPTION"
@@ -2374,7 +2374,7 @@ msgstr "Luminosidade linear"
 
 #: tfphongfilter.radio_mapred.caption
 msgid "R"
-msgstr ""
+msgstr "R"
 
 #: tfphongfilter.radio_mapsaturation.caption
 msgctxt "TFPHONGFILTER.RADIO_MAPSATURATION.CAPTION"
@@ -2455,7 +2455,7 @@ msgstr "Prévia"
 #: tfpreviewdialog.lstatus.caption
 msgctxt "tfpreviewdialog.lstatus.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfprint.button_configureprinter.caption
 msgid "Configure..."
@@ -2494,12 +2494,12 @@ msgstr "Botão:"
 #: tfprint.label_dpix.caption
 msgctxt "TFPRINT.LABEL_DPIX.CAPTION"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfprint.label_dpiy.caption
 msgctxt "TFPRINT.LABEL_DPIY.CAPTION"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfprint.label_height.caption
 msgid "Height:"
@@ -2540,7 +2540,7 @@ msgstr "Lembre-se desta escolha"
 #: tfquestion.label_message.caption
 msgctxt "tfquestion.label_message.caption"
 msgid "."
-msgstr ""
+msgstr "."
 
 #: tfradialblur.button_cancel.caption
 msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION"
@@ -2643,7 +2643,7 @@ msgstr "Pontilhamento"
 
 #: tfsaveoption.checkbox_lossless.caption
 msgid "Lossless"
-msgstr ""
+msgstr "Sem perdas"
 
 #: tfsaveoption.label1.caption
 msgid "Quality:"
@@ -2651,15 +2651,15 @@ msgstr "Qualidade:"
 
 #: tfsaveoption.label_0.caption
 msgid "0"
-msgstr ""
+msgstr "0"
 
 #: tfsaveoption.label_1.caption
 msgid "100"
-msgstr ""
+msgstr "100"
 
 #: tfsaveoption.label_50.caption
 msgid "50"
-msgstr ""
+msgstr "50"
 
 #: tfsaveoption.label_colordepth.caption
 msgid "Color depth:"
@@ -2857,7 +2857,7 @@ msgstr "Bitmap"
 
 #: uresourcestrings.rsblack
 msgid "Black"
-msgstr ""
+msgstr "Preto"
 
 #: uresourcestrings.rsblendopnotusedforbackground
 msgid "The blend operation is applied only if there is a layer underneath"
@@ -2903,7 +2903,7 @@ msgstr "CD"
 
 #: uresourcestrings.rschannels
 msgid "Channels"
-msgstr ""
+msgstr "Canais"
 
 #: uresourcestrings.rsclearpalette
 msgid "Clear palette"
@@ -2923,7 +2923,7 @@ msgstr "Descrição cor: clique para digitar uma cor com o teclado usando nomes
 
 #: uresourcestrings.rscoloroverlay
 msgid "Color overlay"
-msgstr ""
+msgstr "Sobreposição de cores"
 
 #: uresourcestrings.rscolors
 msgctxt "uresourcestrings.rscolors"
@@ -2978,7 +2978,7 @@ msgstr "CTRL"
 
 #: uresourcestrings.rscurrentlayernotsplit
 msgid "Current layer is not split"
-msgstr ""
+msgstr "A camada atual não está dividida"
 
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
@@ -2986,7 +2986,7 @@ msgstr "Pressione S ou X para definir o modo de curva do último ponto"
 
 #: uresourcestrings.rscyan
 msgid "Cyan"
-msgstr ""
+msgstr "Ciano"
 
 #: uresourcestrings.rsdefaultpalette
 msgid "Default palette"
@@ -3021,7 +3021,7 @@ msgstr "Baixar"
 
 #: uresourcestrings.rsdropshadow
 msgid "Drop shadow"
-msgstr ""
+msgstr "Sombra projetada"
 
 #: uresourcestrings.rsduplicateimage
 msgid "Duplicate image"
@@ -3167,7 +3167,7 @@ msgstr "Ocorreram os seguintes erros:"
 
 #: uresourcestrings.rsfractaltree
 msgid "Fractal tree"
-msgstr ""
+msgstr "Árvore fractal"
 
 #: uresourcestrings.rsframes
 msgid "Frames"
@@ -3255,11 +3255,11 @@ msgstr "informações"
 
 #: uresourcestrings.rsinnerlight
 msgid "Inner light"
-msgstr ""
+msgstr "Luz interior"
 
 #: uresourcestrings.rsinnershadow
 msgid "Inner shadow"
-msgstr ""
+msgstr "Sombra interior"
 
 #: uresourcestrings.rsintensity
 msgctxt "uresourcestrings.rsintensity"
@@ -3272,7 +3272,7 @@ msgstr "Erro interno"
 
 #: uresourcestrings.rsinvalidangle
 msgid "Invalid angle"
-msgstr ""
+msgstr "Ângulo inválido"
 
 #: uresourcestrings.rsinvalidname
 msgid "Invalid name"
@@ -3316,7 +3316,7 @@ msgstr "A última versão do LazPaint disponível on-line é"
 
 #: uresourcestrings.rslava
 msgid "Lava"
-msgstr ""
+msgstr "Lava"
 
 #: uresourcestrings.rslayer
 msgctxt "uresourcestrings.rslayer"
@@ -3325,7 +3325,7 @@ msgstr "Camada"
 
 #: uresourcestrings.rslayeralreadysplit
 msgid "Layer already split"
-msgstr ""
+msgstr "Camada já dividida"
 
 #: uresourcestrings.rslayeredimage
 msgid "Layered image"
@@ -3333,7 +3333,7 @@ msgstr "Imagem em camadas"
 
 #: uresourcestrings.rslayereffect
 msgid "Layer effect"
-msgstr ""
+msgstr "Efeito de camada"
 
 #: uresourcestrings.rslayers
 msgctxt "uresourcestrings.rslayers"
@@ -3388,11 +3388,11 @@ msgstr "Contagem de ciclo"
 
 #: uresourcestrings.rsmagenta
 msgid "Magenta"
-msgstr ""
+msgstr "Magenta"
 
 #: uresourcestrings.rsmakemonochromatic
 msgid "Make monochromatic"
-msgstr ""
+msgstr "Tornar monocromático"
 
 #: uresourcestrings.rsmakencolorspalettefrombitmap
 msgid "Make %1-colors palette from image"
@@ -3400,15 +3400,15 @@ msgstr "Faça paleta de %1 cores da imagem"
 
 #: uresourcestrings.rsmask
 msgid "Mask"
-msgstr ""
+msgstr "Máscara"
 
 #: uresourcestrings.rsmaskfromalphachannel
 msgid "Mask from alpha channel"
-msgstr ""
+msgstr "Máscara do canal alfa"
 
 #: uresourcestrings.rsmerge
 msgid "Merge"
-msgstr ""
+msgstr "Mesclar"
 
 #: uresourcestrings.rsmergeselection
 msgid "Do you want to merge selection?"
@@ -3445,7 +3445,7 @@ msgstr "Nova imagem"
 
 #: uresourcestrings.rsnewmask
 msgid "New mask"
-msgstr ""
+msgstr "Nova máscara"
 
 #: uresourcestrings.rsno
 msgid "No"
@@ -3473,7 +3473,7 @@ msgstr "Normal"
 
 #: uresourcestrings.rsnotchromaticchannel
 msgid "This is not a chromatic channel"
-msgstr ""
+msgstr "Este não é um canal cromático"
 
 #: uresourcestrings.rsnothingtobedeformed
 msgid "There is nothing to be deformed"
@@ -3542,9 +3542,10 @@ msgid "Pen"
 msgstr "Caneta"
 
 #: uresourcestrings.rspercent
+#, fuzzy
 msgctxt "uresourcestrings.rspercent"
 msgid "%"
-msgstr ""
+msgstr "%"
 
 #: uresourcestrings.rsportait
 msgid "Portrait"
@@ -3560,7 +3561,7 @@ msgstr "Nome predefinido"
 
 #: uresourcestrings.rspx
 msgid "px"
-msgstr ""
+msgstr "px"
 
 #: uresourcestrings.rspythonunexpectedversion
 msgid "Expected Python version %1 but %2 found."
@@ -3630,7 +3631,7 @@ msgstr "RGB"
 
 #: uresourcestrings.rsrightclickfinishshape
 msgid "Use RIGHT click to finish shape"
-msgstr ""
+msgstr "Use o botão DIREITO para finalizar a forma"
 
 #: uresourcestrings.rsrightclickforsource
 msgid "Use RIGHT click to define source"
@@ -3690,15 +3691,15 @@ msgstr "Ranhura"
 
 #: uresourcestrings.rssplitcmyk
 msgid "Split CMYK"
-msgstr ""
+msgstr "Dividir CMYK"
 
 #: uresourcestrings.rssplithsl
 msgid "Split HSL"
-msgstr ""
+msgstr "Dividir HSL"
 
 #: uresourcestrings.rssplitrgb
 msgid "Split RGB"
-msgstr ""
+msgstr "Dividir RGB"
 
 #: uresourcestrings.rsstoragedevice
 msgid "Device"
@@ -3706,10 +3707,9 @@ msgstr "Dispositivo"
 
 #: uresourcestrings.rsstroke
 msgid "Stroke"
-msgstr ""
+msgstr "Traçado"
 
 #: uresourcestrings.rstextoutline
-#, fuzzy
 msgctxt "uresourcestrings.rstextoutline"
 msgid "Text outline"
 msgstr "Contorno de texto"
@@ -3793,11 +3793,11 @@ msgstr "Camada de vetor"
 
 #: uresourcestrings.rsversion
 msgid "Version"
-msgstr ""
+msgstr "Versão"
 
 #: uresourcestrings.rsverticalsize
 msgid "Vertical size"
-msgstr ""
+msgstr "Tamanho vertical"
 
 #: uresourcestrings.rsvisible
 msgid "Visibile"
@@ -3805,20 +3805,18 @@ msgstr "Visível"
 
 #: uresourcestrings.rsyellow
 msgid "Yellow"
-msgstr ""
+msgstr "Amarelo"
 
 #: uresourcestrings.rsyes
 msgid "Yes"
 msgstr "Sim"
 
 #: uresourcestrings.rszoomlayerstackin
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackin"
 msgid "Zoom layer stack in"
 msgstr "Aumentar Zoom na camada"
 
 #: uresourcestrings.rszoomlayerstackout
-#, fuzzy
 msgctxt "uresourcestrings.rszoomlayerstackout"
 msgid "Zoom layer stack out"
 msgstr "Diminuir Zoom na Camada"

+ 33 - 33
lazpaint/release/bin/i18n/lazpaint.zh_CN.po

@@ -447,7 +447,7 @@ msgstr "HSL"
 
 #: tffilterfunction.tabsheet_lab.caption
 msgid "Lab"
-msgstr ""
+msgstr "Lab"
 
 #: tffilterfunction.tabsheet_rgb.caption
 msgctxt "tffilterfunction.tabsheet_rgb.caption"
@@ -654,11 +654,11 @@ msgstr "转移颜色..."
 
 #: tfmain.combobox_arrowend.hint
 msgid "Ending arrow"
-msgstr ""
+msgstr "结束箭头"
 
 #: tfmain.combobox_arrowstart.hint
 msgid "Starting arrow"
-msgstr ""
+msgstr "开始箭头"
 
 #: tfmain.combobox_penstyle.hint
 msgid "Pen style"
@@ -852,7 +852,7 @@ msgstr "打印..."
 
 #: tfmain.filequicksave.caption
 msgid "Quick save"
-msgstr ""
+msgstr "快速保存"
 
 #: tfmain.filequicksave.hint
 msgid "Save current file without dialogs"
@@ -1940,7 +1940,7 @@ msgstr "渐进式填充"
 
 #: tfmain.tool_textalignbottom.hint
 msgid "Align bottom"
-msgstr ""
+msgstr "对齐底部"
 
 #: tfmain.tool_textaligncenter.hint
 msgid "Center"
@@ -1952,7 +1952,7 @@ msgstr "向左对齐"
 
 #: tfmain.tool_textalignmiddle.hint
 msgid "Center vertically"
-msgstr ""
+msgstr "垂直居中"
 
 #: tfmain.tool_textalignright.hint
 msgid "Align right"
@@ -1960,15 +1960,15 @@ msgstr "向右对齐"
 
 #: tfmain.tool_textaligntop.hint
 msgid "Align top"
-msgstr ""
+msgstr "对齐顶部"
 
 #: tfmain.tool_textbidirectional.hint
 msgid "Bidirectional"
-msgstr ""
+msgstr "双向"
 
 #: tfmain.tool_textbold.hint
 msgid "Bold"
-msgstr ""
+msgstr "粗体"
 
 #: tfmain.tool_textfont.hint
 msgctxt "TFMAIN.TOOL_TEXTFONT.HINT"
@@ -1977,11 +1977,11 @@ msgstr "选择字体..."
 
 #: tfmain.tool_textitalic.hint
 msgid "Italic"
-msgstr ""
+msgstr "斜体"
 
 #: tfmain.tool_textltr.hint
 msgid "Left to right"
-msgstr ""
+msgstr "左到右"
 
 #: tfmain.tool_textoutline.hint
 msgctxt "TFMAIN.TOOL_TEXTOUTLINE.HINT"
@@ -1995,7 +1995,7 @@ msgstr "文本高光渲染"
 
 #: tfmain.tool_textrtl.hint
 msgid "Right to left"
-msgstr ""
+msgstr "右到左"
 
 #: tfmain.tool_textshadow.hint
 msgctxt "TFMAIN.TOOL_TEXTSHADOW.HINT"
@@ -2004,11 +2004,11 @@ msgstr "文本阴影"
 
 #: tfmain.tool_textstrikeout.hint
 msgid "Strikeout"
-msgstr ""
+msgstr "删除线"
 
 #: tfmain.tool_textunderline.hint
 msgid "Underline"
-msgstr ""
+msgstr "下划线"
 
 #: tfmain.viewcolors.caption
 msgctxt "TFMAIN.VIEWCOLORS.CAPTION"
@@ -2634,7 +2634,7 @@ msgstr "抖动"
 
 #: tfsaveoption.checkbox_lossless.caption
 msgid "Lossless"
-msgstr ""
+msgstr "无损"
 
 #: tfsaveoption.label1.caption
 msgid "Quality:"
@@ -2846,7 +2846,7 @@ msgstr "位图"
 
 #: uresourcestrings.rsblack
 msgid "Black"
-msgstr ""
+msgstr "黑色的"
 
 #: uresourcestrings.rsblendopnotusedforbackground
 msgid "The blend operation is applied only if there is a layer underneath"
@@ -2892,7 +2892,7 @@ msgstr "光盘"
 
 #: uresourcestrings.rschannels
 msgid "Channels"
-msgstr ""
+msgstr "渠道"
 
 #: uresourcestrings.rsclearpalette
 msgid "Clear palette"
@@ -2913,7 +2913,7 @@ msgstr "颜色说明:单击以键入颜色名称或 CSS 表示。"
 
 #: uresourcestrings.rscoloroverlay
 msgid "Color overlay"
-msgstr ""
+msgstr "颜色叠加"
 
 #: uresourcestrings.rscolors
 msgctxt "uresourcestrings.rscolors"
@@ -2969,7 +2969,7 @@ msgstr "CTRL"
 
 #: uresourcestrings.rscurrentlayernotsplit
 msgid "Current layer is not split"
-msgstr ""
+msgstr "当前层未拆分"
 
 #: uresourcestrings.rscurvemodehint
 msgid "Press S or X to set the curve mode of the last point"
@@ -2977,7 +2977,7 @@ msgstr "按 ENTER 设置曲线最后一个点"
 
 #: uresourcestrings.rscyan
 msgid "Cyan"
-msgstr ""
+msgstr "青色"
 
 #: uresourcestrings.rsdefaultpalette
 msgid "Default palette"
@@ -3012,7 +3012,7 @@ msgstr "下载"
 
 #: uresourcestrings.rsdropshadow
 msgid "Drop shadow"
-msgstr ""
+msgstr "阴影"
 
 #: uresourcestrings.rsduplicateimage
 msgid "Duplicate image"
@@ -3163,7 +3163,7 @@ msgstr "发生以下错误:"
 
 #: uresourcestrings.rsfractaltree
 msgid "Fractal tree"
-msgstr ""
+msgstr "分形树"
 
 #: uresourcestrings.rsframes
 msgid "Frames"
@@ -3314,7 +3314,7 @@ msgstr "最新 LazPaint 版本是"
 
 #: uresourcestrings.rslava
 msgid "Lava"
-msgstr ""
+msgstr "岩浆"
 
 #: uresourcestrings.rslayer
 msgctxt "uresourcestrings.rslayer"
@@ -3331,7 +3331,7 @@ msgstr "分层图像"
 
 #: uresourcestrings.rslayereffect
 msgid "Layer effect"
-msgstr ""
+msgstr "图层效果"
 
 #: uresourcestrings.rslayers
 msgctxt "uresourcestrings.rslayers"
@@ -3388,11 +3388,11 @@ msgstr "循环数量"
 
 #: uresourcestrings.rsmagenta
 msgid "Magenta"
-msgstr ""
+msgstr "品红"
 
 #: uresourcestrings.rsmakemonochromatic
 msgid "Make monochromatic"
-msgstr ""
+msgstr "制作单色"
 
 #: uresourcestrings.rsmakencolorspalettefrombitmap
 msgid "Make %1-colors palette from image"
@@ -3400,7 +3400,7 @@ msgstr "从图像生成 %1 颜色调色板"
 
 #: uresourcestrings.rsmask
 msgid "Mask"
-msgstr ""
+msgstr "图层蒙版"
 
 #: uresourcestrings.rsmaskfromalphachannel
 msgid "Mask from alpha channel"
@@ -3408,7 +3408,7 @@ msgstr ""
 
 #: uresourcestrings.rsmerge
 msgid "Merge"
-msgstr ""
+msgstr "合并"
 
 #: uresourcestrings.rsmergeselection
 msgid "Do you want to merge selection?"
@@ -3447,7 +3447,7 @@ msgstr "新图像"
 
 #: uresourcestrings.rsnewmask
 msgid "New mask"
-msgstr ""
+msgstr "新图层蒙版"
 
 #: uresourcestrings.rsno
 msgid "No"
@@ -3712,7 +3712,7 @@ msgstr "设备"
 
 #: uresourcestrings.rsstroke
 msgid "Stroke"
-msgstr ""
+msgstr "描边效果"
 
 #: uresourcestrings.rstextoutline
 #, fuzzy
@@ -3799,7 +3799,7 @@ msgstr "矢量图层"
 
 #: uresourcestrings.rsversion
 msgid "Version"
-msgstr ""
+msgstr "版本"
 
 #: uresourcestrings.rsverticalsize
 msgid "Vertical size"
@@ -3807,11 +3807,11 @@ msgstr ""
 
 #: uresourcestrings.rsvisible
 msgid "Visibile"
-msgstr ""
+msgstr "可见的"
 
 #: uresourcestrings.rsyellow
 msgid "Yellow"
-msgstr ""
+msgstr "黄色"
 
 #: uresourcestrings.rsyes
 msgid "Yes"

+ 15 - 4
lazpaint/release/debian/debian/changelog

@@ -1,3 +1,14 @@
+lazpaint (7.2.1) stable; urgency=low
+
+  * MacOS: adapt quick save shortcut on MacOS
+  * translations: competed German, Portuguese, Chinese, Dutch, Spanish
+  * command line: added "screenshot" command
+  * command line: added "editor" command
+  * text tool: multi click to select word / paragraph
+  * script: fix in Python scripting (dialog.py)
+
+ -- circular <[email protected]>  Sat, 21 Aug 2022 18:50:00 +0100
+
 lazpaint (7.2) stable; urgency=low
 
   * MacOS: handle right-click on layerstack
@@ -5,7 +16,7 @@ lazpaint (7.2) stable; urgency=low
   * MacOS: avoid key binding conflict with CMD-H
   * interface: handle cancel language or icon size change
   * interface: restore main form after embedded editor
-  * interface: rester selection tool after delete
+  * interface: restore selection tool after delete
   * interface: fix shift-arrows in file list
   * interface: handle right click on switch color button
   * interface: remember docked toolbox visibility
@@ -24,9 +35,9 @@ lazpaint (7.2) stable; urgency=low
   * language: translation of color description
   * language: completed Russian translation
   * file: prevent saving incorrect filename
-  * file: handle path in file textbook
+  * file: handle path in file textbox
   * file: generate new filename with number
-  * file: added quick save action (Ctlr-Q shortcut)
+  * file: added quick save action (Ctrl-Q shortcut)
   * file: overwrite prompt when saving palette
   * file: experimental support for AVIF format
   * file: show save prompt when drag'n'drop image to the program
@@ -41,7 +52,7 @@ lazpaint (7.2) stable; urgency=low
   * tools: improved hints timing
   * tools: disambiguation of shortcut keys (Y, K, F and R)
   * deformation grid tool: handle extreme deformation
-  * déformation grid tool: ESCAPE to exit tool
+  * deformation grid tool: ESCAPE to exit tool
   * layer perspective tool: change cursor when hovering points
   * layer tools: delete current layer with DELETE key
   * rectangle tool: fixed bug when changing join type

+ 1 - 1
lazpaint/release/debian/debian/control

@@ -5,7 +5,7 @@ Maintainer: circular <[email protected]>
 Homepage: https://wiki.freepascal.org/LazPaint
 Package: lazpaint
 Architecture: any
-Version: 7.2
+Version: 7.2.1
 Depends: ${shlibs:Depends}
 Conflicts: lazpaint-gtk2, lazpaint-gtk3, lazpaint-qt4, lazpaint-qt5
 Description: Image editor with raster and vector layers

+ 2 - 2
lazpaint/release/macOS/LazPaint.app/Contents/Info.plist

@@ -19,9 +19,9 @@
     <key>CFBundleSignature</key>
     <string>lazp</string>
     <key>CFBundleShortVersionString</key>
-    <string>7.2</string>
+    <string>7.2.1</string>
     <key>CFBundleVersion</key>
-    <string>7.2</string>
+    <string>7.2.1</string>
     <key>CSResourcesFileMapped</key>
     <true/>
     <key>CFBundleDocumentTypes</key>

+ 1 - 1
lazpaint/release/macOS/makedmg.sh

@@ -8,7 +8,7 @@ if ! [ ${OSTYPE:0:6} = "darwin" ]; then
 fi
 
 appname=LazPaint
-appversion=7.2
+appversion=7.2.1
 pkgversion=0
 appnamenospaces=lazpaint
 appbundle="$appname.app"

+ 1 - 1
lazpaint/release/windows/lazpaint.iss

@@ -1,7 +1,7 @@
 #define MyAppName "LazPaint"
 #define MyAppOutputName "lazpaint"
 #define MyInstallerSuffix "_setup_win32_win64"
-#define MyAppVersion "7.2"
+#define MyAppVersion "7.2.1"
 #define MyAppPublisher "Circular, Fabien Wang, Lainz and others"
 #define MyAppURL "http://sourceforge.net/projects/lazpaint/"
 #define MyAppExeName "lazpaint.exe"

BIN
lazpaint/release/windows/libavif.zip


+ 1 - 1
lazpaint/tools/utoolvectorial.pas

@@ -2093,7 +2093,7 @@ begin
     begin
       shapePt := AffineMatrixInverse(VectorTransform(true))*FLastPos;
       If Editor.GridActive then shapePt := Editor.SnapToGrid(shapePt, false);
-      FShape.MouseDown(rightBtn, ShiftState, shapePt.X,shapePt.Y, cur, handled);
+      FShape.MouseDown(rightBtn, Editor.ConsecutiveClickCount, ShiftState, shapePt.X,shapePt.Y, cur, handled);
     end;
     UpdateCursor(cur);
     if handled then exit

+ 159 - 5
lazpaint/ucommandline.pas

@@ -5,13 +5,13 @@ unit UCommandline;
 
 interface
 
-uses classes, LazpaintType, uresourcestrings;
+uses classes, LazpaintType, uresourcestrings, LCLStrConsts;
 
 {$IFDEF WINDOWS}
   {$DEFINE SHOW_MANUAL_IN_WINDOW}
 {$ENDIF}
 
-const Manual: array[0..64] of string = (
+const Manual: array[0..79] of string = (
 'NAME',
 '       LazPaint - Image editor',
 '',
@@ -38,6 +38,17 @@ const Manual: array[0..64] of string = (
 '       -script FILENAME',
 '              runs the specified Python script. It must have  a  ".py"  exten‐',
 '              sion.',
+'',
+'       -editor default|CONFIGFILE|OPTION1,OPTION2...',
+'              shows the image editor with validate and cancel buttons.  If the',
+'              validate button is used,  the rest of the commands are executed.',
+'              Otherwise the program stops.',
+'',
+'              Examples:',
+'              -editor default',
+'              -editor /Users/me/lazpaintCustom.cfg',
+'              -editor [Window]ColorWindowVisible=0,LayerWindowVisible=0',
+'',
 '       -quit',
 '              quits the program even if no output file was  provided.  Can  be',
 '              useful when only running scripts.',
@@ -45,6 +56,10 @@ const Manual: array[0..64] of string = (
 '       -new WIDTH,HEIGHT',
 '              creates an empty image of size WIDTH x HEIGHT.',
 '',
+'       -screenshot SCREEN|X1,Y1,X2,Y2',
+'              takes a screenshot of the screen of index SCREEN  (0 for primary',
+'              monitor) or of specified coordinates.',
+'',
 '       -resample WIDTH,HEIGHT',
 '              resamples the image to the size WIDTH x HEIGHT.',
 '',
@@ -84,9 +99,10 @@ function ParamStrUTF8(AIndex: integer): string;
 implementation
 
 uses
-  SysUtils, BGRAUTF8, LazFileUtils, BGRABitmap, BGRABitmapTypes, Dialogs, uparse,
-  UImage, UImageAction, ULayerAction, UScripting, UPython, Forms, StdCtrls, Controls,
-  UFileSystem, BGRAIconCursor;
+  SysUtils, BGRAUTF8, LazFileUtils, BGRABitmap, BGRABitmapTypes, BGRALayers, Dialogs, uparse,
+  UImage, UImageAction, ULayerAction, UScripting, UPython, Forms, Controls,
+  UFileSystem, BGRAIconCursor, UGraph
+  {$IFDEF SHOW_MANUAL_IN_WINDOW},StdCtrls{$ENDIF};
 
 function ParamStrUTF8(AIndex: integer): string;
 begin
@@ -217,6 +233,140 @@ var
     result := true;
   end;
 
+  function DoScreenshot: boolean;
+  var r: TRect;
+    screenIndex,errPos: integer;
+    invalid: boolean;
+  begin
+    funcParams := SimpleParseFuncParam(CommandStr);
+    if length(funcParams)=1 then
+    begin
+      val(funcParams[0],screenIndex,errPos);
+      if errPos <> 0 then
+      begin
+        instance.ShowError('Screenshot', '"Screenshot" ' + rsExpect1Parameter+CommandStr);
+        errorEncountered := true;
+        exit(false);
+      end;
+      if (screenIndex < 0) or (screenIndex >= Screen.MonitorCount) then
+      begin
+        instance.ShowError('Screenshot', '"Screenshot" ' +
+                                         lclstrconsts.rsListIndexExceedsBounds.Replace('%d', inttostr(screenIndex)));
+        errorEncountered := true;
+        exit(false);
+      end;
+      r := Screen.Monitors[screenIndex].BoundsRect;
+      r := rect(r.Left*CanvasScale, r.Top*CanvasScale,
+                r.Right*CanvasScale, r.Bottom*CanvasScale);
+    end else
+    if length(funcParams)=4 then
+    begin
+      r := rect(0,0,0,0);
+      invalid := false;
+      val(funcParams[0],r.Left,errPos);
+      if errPos <> 0 then invalid := true;
+      val(funcParams[1],r.Top,errPos);
+      if errPos <> 0 then invalid := true;
+      val(funcParams[2],r.Right,errPos);
+      if errPos <> 0 then invalid := true;
+      val(funcParams[3],r.Bottom,errPos);
+      if errPos <> 0 then invalid := true;
+      if invalid then
+      begin
+        instance.ShowError('Screenshot', '"Screenshot" ' + StringReplace(rsExpectNParameters,'N','4',[])+CommandStr);
+        errorEncountered := true;
+        exit(false);
+      end;
+      if (errPos <> 0) or (r.Width <= 0) or (r.Height <= 0) then
+      begin
+        instance.ShowError('New',rsInvalidSizeForNew+IntToStr(r.Width)+'x'+IntToStr(r.Height));
+        errorEncountered := true;
+        exit(false);
+      end;
+    end else
+    begin
+      instance.ShowError('Screenshot', '"Screenshot" ' + StringReplace(rsExpectNParameters,'N','4',[])+CommandStr);
+      errorEncountered := true;
+      exit(false);
+    end;
+    AImageActions.TakeScreenshot(r);
+    result := true;
+  end;
+
+  function MakeConfigFromFuncParam: string;
+  var
+    cfg: TStringList;
+    curSection, newSection, p, param: string;
+  begin
+    cfg := TStringList.Create;
+    curSection := '[General]';
+    cfg.Add(curSection);
+    try
+      for p in funcParams do
+      begin
+        param := p;
+        if param.StartsWith('[') then
+        begin
+          if param.IndexOf(']') <> -1 then
+          begin
+            newSection := param.Substring(0, param.IndexOf(']')+1);
+            param := param.Substring(length(newSection));
+          end else
+          begin
+            newSection := param;
+            param := '';
+          end;
+          if newSection <> curSection then
+          begin
+            curSection := newSection;
+            cfg.Add(curSection);
+          end;
+        end;
+        if param<>'' then
+        begin
+          if param.IndexOf('=') = -1 then
+            raise Exception.Create(SParExpected.Replace('%s', '"="'));
+          cfg.Add(param);
+        end;
+      end;
+    finally
+      result := cfg.Text;
+      cfg.Free;
+    end;
+  end;
+
+  function DoEditor: boolean;
+  var
+    iniStream: TStream;
+    bmp: TBGRALayeredBitmap;
+  begin
+    result := false;
+    funcParams := SimpleParseFuncParam(CommandStr);
+    if (length(funcParams) = 1) and
+       ((ExtractFileExt(funcParams[0])='.ini') or (ExtractFileExt(funcParams[0])='.cfg')) then
+      iniStream := FileManager.CreateFileStream(funcParams[0], fmOpenRead)
+    else if (length(funcParams) = 1) and (funcParams[0] = 'default') then
+      iniStream := TMemoryStream.Create
+    else
+      iniStream := TStringStream.Create(MakeConfigFromFuncParam);
+
+    bmp := instance.Image.CurrentState.GetLayeredBitmapCopy;
+    try
+      if instance.EditBitmap(bmp, iniStream) then
+      begin
+        instance.Image.CurrentState.Assign(bmp, true);
+        result := true;
+      end
+      else
+      begin
+        bmp.Free;
+        quitQuery := true;
+      end;
+    finally
+      FileManager.CancelStreamAndFree(iniStream);
+    end;
+  end;
+
   function NextAsFuncParam: boolean;
   begin
     inc(i);
@@ -374,6 +524,10 @@ begin
         if lowerCmd = 'resample' then begin if not NextAsFuncParam or not DoResample then exit end else
         if copy(lowerCmd,1,4)='new(' then begin if not DoNew then exit end else
         if lowerCmd = 'new' then begin if not NextAsFuncParam or not DoNew then exit end else
+        if lowerCmd.StartsWith('screenshot(') then begin if not DoScreenShot then exit end else
+        if lowerCmd = 'screenshot' then begin if not NextAsFuncParam or not DoScreenShot then exit end else
+        if lowerCmd.StartsWith('editor(') then begin if not DoEditor then exit end else
+        if lowerCmd = 'editor' then begin if not NextAsFuncParam or not DoEditor then exit end else
         if lowerCmd = 'script' then
         begin
           enableScript := true;

+ 4 - 1
lazpaint/uparse.pas

@@ -18,7 +18,7 @@ function SimpleParseFuncParam(str: string): arrayOfString;
 implementation
 
 function SimpleParseFuncParam(str: string): arrayOfString;
-var idxOpen,start,cur: integer;
+var idxOpen,start,cur,bracketDepth: integer;
 begin
     result := nil;
     idxOpen := pos('(',str);
@@ -27,8 +27,11 @@ begin
     else
       start := idxOpen+1;
     cur := start;
+    bracketDepth := 0;
     while cur <= length(str) do
     begin
+       if str[cur] = '(' then inc(bracketDepth) else
+       if (str[cur] = ')') and (bracketDepth > 0) then dec(bracketDepth) else
        if str[cur] in[',',')'] then
        begin
          setlength(result,length(result)+1);

+ 1 - 1
lazpaintcontrols/lazpaintcontrols.lpk

@@ -20,7 +20,7 @@
         </Debugging>
       </Linking>
     </CompilerOptions>
-    <Version Minor="2"/>
+    <Version Minor="2" Release="1"/>
     <Files Count="13">
       <Item1>
         <Filename Value="lctoolbars.pas"/>

+ 4 - 3
lazpaintcontrols/lcvectororiginal.pas

@@ -281,7 +281,7 @@ type
     procedure LoadFromStorage(AStorage: TBGRACustomOriginalStorage); virtual;
     procedure SaveToStorage(AStorage: TBGRACustomOriginalStorage); virtual;
     procedure MouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); virtual;
-    procedure MouseDown({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); virtual;
+    procedure MouseDown({%H-}RightButton: boolean; {%H-}ClickCount: integer; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); virtual;
     procedure MouseUp({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); virtual;
     procedure KeyDown({%H-}Shift: TShiftState; {%H-}Key: TSpecialKey; var {%H-}AHandled: boolean); virtual;
     procedure KeyUp({%H-}Shift: TShiftState; {%H-}Key: TSpecialKey; var {%H-}AHandled: boolean); virtual;
@@ -1409,7 +1409,8 @@ begin
   begin
     ptF := ViewCoordToOriginal(PointF(ViewX,ViewY));
     if GridActive then ptF := SnapToGrid(ptF, False);
-    with ptF do FOriginal.SelectedShape.MouseDown(RightButton, Shift, X,Y, ACursor, AHandled);
+    with ptF do FOriginal.SelectedShape.MouseDown(RightButton,
+      ConsecutiveClickCount, Shift, X,Y, ACursor, AHandled);
   end;
 end;
 
@@ -2469,7 +2470,7 @@ begin
   //nothing
 end;
 
-procedure TVectorShape.MouseDown(RightButton: boolean; Shift: TShiftState; X,
+procedure TVectorShape.MouseDown(RightButton: boolean; ClickCount: integer; Shift: TShiftState; X,
   Y: single; var ACursor: TOriginalEditorCursor; var AHandled: boolean);
 begin
   //nothing

+ 2 - 2
lazpaintcontrols/lcvectorpolyshapes.pas

@@ -117,7 +117,7 @@ type
     procedure InsertPoint(AIndex: integer; APoint: TPointF);
     function GetPointBounds(AMatrix: TAffineMatrix): TRectF;
     procedure MouseMove({%H-}Shift: TShiftState; X, Y: single; var {%H-}ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
-    procedure MouseDown(RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
+    procedure MouseDown(RightButton: boolean; {%H-}ClickCount: integer; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
     procedure KeyDown({%H-}Shift: TShiftState; Key: TSpecialKey; var AHandled: boolean); override;
     procedure KeyUp(Shift: TShiftState; Key: TSpecialKey; var AHandled: boolean); override;
     procedure QuickDefine(constref APoint1,APoint2: TPointF); override;
@@ -979,7 +979,7 @@ begin
 end;
 
 procedure TCustomPolypointShape.MouseDown(RightButton: boolean;
-  Shift: TShiftState; X, Y: single; var ACursor: TOriginalEditorCursor; var
+  ClickCount: integer; Shift: TShiftState; X, Y: single; var ACursor: TOriginalEditorCursor; var
   AHandled: boolean);
 begin
   FMousePos := PointF(X,Y);

+ 3 - 3
lazpaintcontrols/lcvectorrectshapes.pas

@@ -184,7 +184,7 @@ type
     function AppendToSVG(AContent: TSVGContent; ADefs: TSVGDefine): TSVGElement; override;
     function GetAlignBounds(const ALayoutRect: TRect; const AMatrix: TAffineMatrix): TRectF; override;
     procedure ConfigureCustomEditor(AEditor: TBGRAOriginalEditor); override;
-    procedure MouseDown(RightButton: boolean; Shift: TShiftState; X, Y: single; var ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
+    procedure MouseDown(RightButton: boolean; {%H-}ClickCount: integer; Shift: TShiftState; X, Y: single; var ACursor: TOriginalEditorCursor; var AHandled: boolean); override;
     procedure LoadFromStorage(AStorage: TBGRACustomOriginalStorage); override;
     procedure SaveToStorage(AStorage: TBGRACustomOriginalStorage); override;
     procedure Render(ADest: TBGRABitmap; AMatrix: TAffineMatrix; ADraft: boolean); overload; override;
@@ -1676,10 +1676,10 @@ begin
     TVectorOriginalEditor(AEditor).AddLabel(idxLight, rsLightPosition, taCenter, tlTop);
 end;
 
-procedure TPhongShape.MouseDown(RightButton: boolean; Shift: TShiftState; X,
+procedure TPhongShape.MouseDown(RightButton: boolean; ClickCount: integer; Shift: TShiftState; X,
   Y: single; var ACursor: TOriginalEditorCursor; var AHandled: boolean);
 begin
-  inherited MouseDown(RightButton, Shift, X, Y, ACursor, AHandled);
+  inherited MouseDown(RightButton, ClickCount, Shift, X, Y, ACursor, AHandled);
   if not AHandled then
   begin
     if RightButton then

+ 96 - 9
lazpaintcontrols/lcvectortextshapes.pas

@@ -149,6 +149,8 @@ type
     procedure DeleteTextAfter(ACount: integer);
     procedure InsertText(ATextUTF8: string);
     procedure SelectWithMouse(X,Y: single; AExtend: boolean);
+    procedure SelectWordWithMouse(X,Y: single);
+    procedure SelectParagraphWithMouse(X,Y: single);
     function HasOutline: boolean;
     procedure InsertUnicodeValue;
     procedure FillChange(ASender: TObject; var ADiff: TCustomVectorialFillDiff); override;
@@ -178,7 +180,7 @@ type
     function GetIsSlow(const {%H-}AMatrix: TAffineMatrix): boolean; override;
     function GetGenericCost: integer; override;
     procedure MouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
-    procedure MouseDown({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
+    procedure MouseDown({%H-}RightButton: boolean; {%H-}ClickCount: integer; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure MouseUp({%H-}RightButton: boolean; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: single; var {%H-}ACursor: TOriginalEditorCursor; var {%H-}AHandled: boolean); override;
     procedure KeyDown({%H-}Shift: TShiftState; {%H-}Key: TSpecialKey; var {%H-}AHandled: boolean); override;
     procedure KeyPress({%H-}UTF8Key: string; var {%H-}AHandled: boolean); override;
@@ -188,6 +190,7 @@ type
     function CutSelection: boolean;
     function PasteSelection: boolean;
     function DeleteSelection: boolean;
+    procedure SelectAll;
     function GetAlignBounds(const {%H-}ALayoutRect: TRect; const AMatrix: TAffineMatrix): TRectF; override;
     procedure Transform(const AMatrix: TAffineMatrix); override;
     function AllowShearTransform: boolean; override;
@@ -999,6 +1002,14 @@ begin
     result := false;
 end;
 
+procedure TTextShape.SelectAll;
+begin
+  BeginEditingUpdate;
+  FSelStart:= 0;
+  FSelEnd:= GetTextLayout.CharCount;
+  EndEditingUpdate;
+end;
+
 function TTextShape.GetAlignBounds(const ALayoutRect: TRect;
   const AMatrix: TAffineMatrix): TRectF;
 var
@@ -1048,6 +1059,79 @@ begin
   end;
 end;
 
+procedure TTextShape.SelectWordWithMouse(X, Y: single);
+const letterClasses = [ubcLeftToRight, ubcEuropeanNumber, ubcRightToLeft, ubcArabicLetter, ubcArabicNumber];
+var
+  tl: TBidiTextLayout;
+  function IsInWord(AIndex: integer): boolean;
+  var c: TUTF8Char;
+  begin
+    c := tl.UTF8Char[AIndex];
+    result := GetBidiClassUTF8(@c[1]) in letterClasses;
+  end;
+
+var
+  newPos, paraIndex, startIndex, endIndex: Integer;
+  zoom: Single;
+  untransformed: TAffineMatrix;
+  inWord: boolean;
+begin
+  if UserMode <> vsuEditText then exit;
+  tl := GetTextLayout;
+  zoom := GetTextRenderZoom;
+  untransformed := GetUntransformedMatrix;
+  if not IsAffineMatrixInversible(untransformed) then exit;
+  newPos := tl.GetCharIndexAt(AffineMatrixScale(zoom,zoom)*AffineMatrixInverse(untransformed)*PointF(X,Y), false);
+  if newPos<>-1 then
+  begin
+    paraIndex := tl.GetParagraphAt(newPos);
+    if (newPos < tl.ParagraphStartIndex[paraIndex]) or
+       (newPos >= tl.ParagraphEndIndex[paraIndex]) then exit;
+    startIndex := newPos;
+    endIndex := newPos+1;
+    inWord := IsInWord(newPos);
+    while (startIndex > tl.ParagraphStartIndex[paraIndex])
+      and (IsInWord(startIndex-1) = inWord) do dec(startIndex);
+    while (endIndex < tl.ParagraphEndIndex[paraIndex])
+      and (IsInWord(endIndex) = inWord) do inc(endIndex);
+    if (FSelStart <> startIndex) or
+       (FSelEnd <> endIndex) then
+    begin
+      BeginEditingUpdate;
+      FSelStart := startIndex;
+      FSelEnd:= endIndex;
+      EndEditingUpdate;
+    end;
+  end;
+end;
+
+procedure TTextShape.SelectParagraphWithMouse(X, Y: single);
+var
+  newPos, paraIndex: Integer;
+  tl: TBidiTextLayout;
+  zoom: Single;
+  untransformed: TAffineMatrix;
+begin
+  if UserMode <> vsuEditText then exit;
+  tl := GetTextLayout;
+  zoom := GetTextRenderZoom;
+  untransformed := GetUntransformedMatrix;
+  if not IsAffineMatrixInversible(untransformed) then exit;
+  newPos := tl.GetCharIndexAt(AffineMatrixScale(zoom,zoom)*AffineMatrixInverse(untransformed)*PointF(X,Y), false);
+  if newPos<>-1 then
+  begin
+    paraIndex := tl.GetParagraphAt(newPos);
+    if (FSelStart <> tl.ParagraphStartIndex[paraIndex]) or
+       (FSelEnd <> tl.ParagraphEndIndex[paraIndex]) then
+    begin
+      BeginEditingUpdate;
+      FSelStart := tl.ParagraphStartIndex[paraIndex];
+      FSelEnd:= tl.ParagraphEndIndex[paraIndex];
+      EndEditingUpdate;
+    end;
+  end;
+end;
+
 function TTextShape.HasOutline: boolean;
 begin
   result := not OutlineFill.IsFullyTransparent and (OutlineWidth > 0);
@@ -2126,14 +2210,20 @@ begin
   end;
 end;
 
-procedure TTextShape.MouseDown(RightButton: boolean; Shift: TShiftState; X,
+procedure TTextShape.MouseDown(RightButton: boolean; ClickCount: integer; Shift: TShiftState; X,
   Y: single; var ACursor: TOriginalEditorCursor; var AHandled: boolean);
 begin
-  inherited MouseDown(RightButton, Shift, X, Y, ACursor, AHandled);
+  inherited MouseDown(RightButton, ClickCount, Shift, X, Y, ACursor, AHandled);
   if not AHandled and not RightButton and PointInShape(PointF(X,Y)) then
   begin
-    FMouseSelecting:= true;
-    SelectWithMouse(X,Y, ssShift in Shift);
+    case ClickCount mod 3 of
+    1: begin
+         FMouseSelecting:= true;
+         SelectWithMouse(X,Y, ssShift in Shift);
+       end;
+    2: SelectWordWithMouse(X, Y);
+    0 {3}: SelectParagraphWithMouse(X, Y)
+    end;
     AHandled:= true;
   end;
   if (ACursor = oecDefault) and PointInShape(PointF(X,Y)) then ACursor := oecText;
@@ -2286,10 +2376,7 @@ begin
   end else
   if (Key = skA) and (ssCtrl in Shift) then
   begin
-    BeginEditingUpdate;
-    FSelStart:= 0;
-    FSelEnd:= GetTextLayout.CharCount;
-    EndEditingUpdate;
+    SelectAll;
     AHandled := true;
   end;
 end;

+ 1 - 1
resources/scripts/lazpaint/dialog.py

@@ -21,7 +21,7 @@ def translate_text(text) -> str:
   return command.send('TranslateText?', Text=text)
 
 def translate_dict(texts) -> dict:
-  return dict(zip(texts, dialog.translate_text(texts)))
+  return dict(zip(texts, translate_text(texts)))
 
 def get_language() -> str:
   return command.send('TranslateGetLanguage?')

+ 1 - 1
web/config.toml

@@ -5,7 +5,7 @@ disableKinds = ["taxonomyTerm"]
 
 [params]
   repo = "https://github.com/bgrabitmap/lazpaint/releases/download/"
-  version = "7.2"
+  version = "7.2.1"
 
 [languages]
   [languages.de]