Bläddra i källkod

Merge branch 'master' into avalonia-rewrite

Krzysztof Krysiński 2 år sedan
förälder
incheckning
30b223ba57
100 ändrade filer med 7103 tillägg och 1052 borttagningar
  1. 1 1
      incompatible.json
  2. 10 4
      src/ChunkyImageLib/Chunk.cs
  3. 57 12
      src/ChunkyImageLib/ChunkyImage.cs
  4. 27 2
      src/ChunkyImageLib/ChunkyImageLib.csproj
  5. 15 0
      src/ChunkyImageLib/DataHolders/ChunkResolutionEx.cs
  6. 46 1
      src/ChunkyImageLib/DataHolders/ShapeCorners.cs
  7. 3 1
      src/ChunkyImageLib/IReadOnlyChunkyImage.cs
  8. 2 2
      src/ChunkyImageLib/Operations/ApplyMaskOperation.cs
  9. 4 4
      src/ChunkyImageLib/Operations/BresenhamLineOperation.cs
  10. 21 21
      src/ChunkyImageLib/Operations/ChunkyImageOperation.cs
  11. 6 6
      src/ChunkyImageLib/Operations/ClearPathOperation.cs
  12. 7 7
      src/ChunkyImageLib/Operations/ClearRegionOperation.cs
  13. 4 4
      src/ChunkyImageLib/Operations/DrawingSurfaceLineOperation.cs
  14. 4 4
      src/ChunkyImageLib/Operations/EllipseOperation.cs
  15. 1 1
      src/ChunkyImageLib/Operations/IDrawOperation.cs
  16. 6 6
      src/ChunkyImageLib/Operations/ImageOperation.cs
  17. 4 4
      src/ChunkyImageLib/Operations/PathOperation.cs
  18. 15 12
      src/ChunkyImageLib/Operations/PixelOperation.cs
  19. 4 4
      src/ChunkyImageLib/Operations/PixelsOperation.cs
  20. 4 4
      src/ChunkyImageLib/Operations/RectangleOperation.cs
  21. 2 2
      src/ChunkyImageLib/Operations/ReplaceColorOperation.cs
  22. 27 1
      src/PixiEditor.ChangeableDocument.Gen/PixiEditor.ChangeableDocument.Gen.csproj
  23. 3 3
      src/PixiEditor.ChangeableDocument/Changeables/Document.cs
  24. 1 1
      src/PixiEditor.ChangeableDocument/Changeables/Interfaces/IReadOnlyDocument.cs
  25. 7 25
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ChangeBrightness_UpdateableChange.cs
  26. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Drawing/TransformSelectedArea_UpdateableChange.cs
  27. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Root/CenterContent_Change.cs
  28. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs
  29. 48 0
      src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs
  30. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs
  31. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs
  32. 8 2
      src/PixiEditor.ChangeableDocument/Changes/Selection/SelectEllipse_UpdateableChange.cs
  33. 6 2
      src/PixiEditor.ChangeableDocument/Changes/Selection/SelectLasso_UpdateableChange.cs
  34. 5 4
      src/PixiEditor.ChangeableDocument/Changes/Selection/SelectRectangle_UpdateableChange.cs
  35. 27 2
      src/PixiEditor.ChangeableDocument/PixiEditor.ChangeableDocument.csproj
  36. 12 0
      src/PixiEditor.DrawingApi.Core/Numerics/RectI.cs
  37. 3 0
      src/PixiEditor.DrawingApi.Core/Numerics/VecD.cs
  38. 25 0
      src/PixiEditor.DrawingApi.Core/Numerics/VecI.cs
  39. 27 2
      src/PixiEditor.DrawingApi.Core/PixiEditor.DrawingApi.Core.csproj
  40. 27 2
      src/PixiEditor.DrawingApi.Skia/PixiEditor.DrawingApi.Skia.csproj
  41. 9 5
      src/PixiEditor.Extensions/Common/Localization/ILocalizationProvider.cs
  42. 4 2
      src/PixiEditor.Extensions/Common/Localization/Language.cs
  43. 36 0
      src/PixiEditor.Extensions/Common/Localization/LanguageData.cs
  44. 28 0
      src/PixiEditor.Extensions/Common/Localization/LocalizationData.cs
  45. 2 2
      src/PixiEditor.Extensions/Common/Localization/LocalizationKeyShowMode.cs
  46. 3 5
      src/PixiEditor.Extensions/Common/Localization/LocalizedString.cs
  47. 11 5
      src/PixiEditor.Extensions/Common/UserPreferences/IPreferences.cs
  48. 13 0
      src/PixiEditor.Extensions/Common/UserPreferences/PreferencesConstants.cs
  49. 51 0
      src/PixiEditor.Extensions/Extension.cs
  50. 17 0
      src/PixiEditor.Extensions/ExtensionServices.cs
  51. 24 2
      src/PixiEditor.Extensions/Helpers/EnumHelpers.cs
  52. 8 0
      src/PixiEditor.Extensions/Metadata/Author.cs
  53. 17 0
      src/PixiEditor.Extensions/Metadata/ExtensionMetadata.cs
  54. 0 0
      src/PixiEditor.Extensions/Palettes/ColorsNumberMode.cs
  55. 17 0
      src/PixiEditor.Extensions/Palettes/ExtensionPalette.cs
  56. 7 6
      src/PixiEditor.Extensions/Palettes/FilteringSettings.cs
  57. 10 0
      src/PixiEditor.Extensions/Palettes/IPalette.cs
  58. 27 0
      src/PixiEditor.Extensions/Palettes/IPaletteProvider.cs
  59. 56 0
      src/PixiEditor.Extensions/Palettes/PaletteColor.cs
  60. 27 0
      src/PixiEditor.Extensions/Palettes/PaletteListDataSource.cs
  61. 46 0
      src/PixiEditor.Extensions/Palettes/Parsers/PaletteFileData.cs
  62. 3 2
      src/PixiEditor.Extensions/Palettes/Parsers/PaletteFileParser.cs
  63. 21 0
      src/PixiEditor.Extensions/PixiEditor.Extensions.csproj
  64. 38 0
      src/PixiEditor.Extensions/UI/ExternalProperty.cs
  65. 10 0
      src/PixiEditor.Extensions/UI/ICustomTranslatorElement.cs
  66. 67 9
      src/PixiEditor.Extensions/UI/Translator.cs
  67. 12 0
      src/PixiEditor.Extensions/Windowing/IPopupWindow.cs
  68. 15 0
      src/PixiEditor.Extensions/Windowing/IWindowProvider.cs
  69. 34 0
      src/PixiEditor.Extensions/Windowing/PopupWindow.cs
  70. 1 1
      src/PixiEditor.MSIX/PixiEditor.MSIX.wapproj
  71. 24 0
      src/PixiEditor.Platform.MSStore/MSAdditionalContentProvider.cs
  72. 14 0
      src/PixiEditor.Platform.MSStore/MicrosoftStorePlatform.cs
  73. 13 0
      src/PixiEditor.Platform.MSStore/PixiEditor.Platform.MSStore.csproj
  74. 13 0
      src/PixiEditor.Platform.Standalone/PixiEditor.Platform.Standalone.csproj
  75. 15 0
      src/PixiEditor.Platform.Standalone/StandaloneAdditionalContentProvider.cs
  76. 14 0
      src/PixiEditor.Platform.Standalone/StandalonePlatform.cs
  77. 38 0
      src/PixiEditor.Platform.Steam/PixiEditor.Platform.Steam.csproj
  78. 24 0
      src/PixiEditor.Platform.Steam/SteamAdditionalContentProvider.cs
  79. 24 0
      src/PixiEditor.Platform.Steam/SteamPlatform.cs
  80. BIN
      src/PixiEditor.Platform.Steam/steam_api.dll
  81. BIN
      src/PixiEditor.Platform.Steam/steam_api64.dll
  82. 12 0
      src/PixiEditor.Platform/IAdditionalContentProvider.cs
  83. 20 0
      src/PixiEditor.Platform/IPlatform.cs
  84. 13 0
      src/PixiEditor.Platform/PixiEditor.Platform.csproj
  85. 19 0
      src/PixiEditor.Platform/PlatformServiceCollection.cs
  86. 0 1
      src/PixiEditor.UpdateModule/PixiEditor.UpdateModule.csproj
  87. 38 8
      src/PixiEditor.UpdateModule/UpdateInstaller.cs
  88. 27 2
      src/PixiEditor.Zoombox/PixiEditor.Zoombox.csproj
  89. 479 307
      src/PixiEditor.sln
  90. 70 6
      src/PixiEditor/App.xaml.cs
  91. 562 0
      src/PixiEditor/Data/Localization/Languages/ar.json
  92. 562 0
      src/PixiEditor/Data/Localization/Languages/cs.json
  93. 562 0
      src/PixiEditor/Data/Localization/Languages/de.json
  94. 587 527
      src/PixiEditor/Data/Localization/Languages/en.json
  95. 562 0
      src/PixiEditor/Data/Localization/Languages/es.json
  96. 564 0
      src/PixiEditor/Data/Localization/Languages/hu.json
  97. 71 11
      src/PixiEditor/Data/Localization/Languages/pl.json
  98. 564 0
      src/PixiEditor/Data/Localization/Languages/pt-br.json
  99. 562 0
      src/PixiEditor/Data/Localization/Languages/ru.json
  100. 562 0
      src/PixiEditor/Data/Localization/Languages/uk.json

+ 1 - 1
incompatible.json

@@ -1 +1 @@
-["0.1.3.0", "0.1.3.1", "0.1.3.2", "0.1.3.3", "0.1.3.4", "0.1.3.5", "0.1.3.6", "0.1.4.0", "0.1.5.0", "0.1.6.0", "0.1.7.0", "0.1.8.0", "0.1.9.0", "0.1.9.1", "0.1.9.2"]
+["0.1.3.0", "0.1.3.1", "0.1.3.2", "0.1.3.3", "0.1.3.4", "0.1.3.5", "0.1.3.6", "0.1.4.0", "0.1.5.0", "0.1.6.0", "0.1.7.0", "0.1.8.0", "0.1.9.0", "0.1.9.1", "0.1.9.2", "1.0.0.0", "1.0.0.1", "1.0.1.0"]

+ 10 - 4
src/ChunkyImageLib/Chunk.cs

@@ -61,15 +61,21 @@ public class Chunk : IDisposable
         surface.Canvas.DrawSurface(Surface.DrawingSurface, pos.X, pos.Y, paint);
     }
     
-    public unsafe RectI? FindPreciseBounds()
+    public unsafe RectI? FindPreciseBounds(RectI? passedSearchRegion = null)
     {
         RectI? bounds = null;
-        if(returned) return bounds;
+        if (returned) 
+            return bounds;
+
+        if (passedSearchRegion is not null && !new RectI(VecI.Zero, Surface.Size).ContainsInclusive(passedSearchRegion.Value))
+            throw new ArgumentException("Passed search region lies outside of the chunk's surface", nameof(passedSearchRegion));
+
+        RectI searchRegion = passedSearchRegion ?? new RectI(VecI.Zero, Surface.Size);
         
         ulong* ptr = (ulong*)Surface.PixelBuffer;
-        for (int y = 0; y < Surface.Size.Y; y++)
+        for (int y = searchRegion.Top; y < searchRegion.Bottom; y++)
         {
-            for (int x = 0; x < Surface.Size.X; x++)
+            for (int x = searchRegion.Left; x < searchRegion.Right; x++)
             {
                 int i = y * Surface.Size.X + x;
                 // ptr[i] actually contains 4 16-bit floats. We only care about the first one which is alpha.

+ 57 - 12
src/ChunkyImageLib/ChunkyImage.cs

@@ -37,7 +37,7 @@ namespace ChunkyImageLib;
 ///     - BlendMode.Src: default mode, the latest chunks are the same as committed ones but with some or all queued operations applied. 
 ///         This means that operations can work with the existing pixels.
 ///     - Any other blend mode: the latest chunks contain only the things drawn by the queued operations.
-///         They need to be drawn over the committed chunks to obtain the final image. In this case, operations won't have access to the existing pixels.
+///         They need to be drawn over the committed chunks to obtain the final image. In this case, operations won't have access to the existing pixels. 
 /// </summary>
 public class ChunkyImage : IReadOnlyChunkyImage, IDisposable
 {
@@ -117,7 +117,7 @@ public class ChunkyImage : IReadOnlyChunkyImage, IDisposable
     }
 
     /// <exception cref="ObjectDisposedException">This image is disposed</exception>
-    public RectI? FindLatestBounds()
+    public RectI? FindChunkAlignedMostUpToDateBounds()
     {
         lock (lockObject)
         {
@@ -129,7 +129,27 @@ public class ChunkyImage : IReadOnlyChunkyImage, IDisposable
                 rect ??= chunkBounds;
                 rect = rect.Value.Union(chunkBounds);
             }
-            foreach (var (pos, _) in latestChunks[ChunkResolution.Full])
+            foreach (var operation in queuedOperations)
+            {
+                foreach (var pos in operation.affectedArea.Chunks)
+                {
+                    RectI chunkBounds = new RectI(pos * FullChunkSize, new VecI(FullChunkSize));
+                    rect ??= chunkBounds;
+                    rect = rect.Value.Union(chunkBounds);
+                }
+            }
+            return rect;
+        }
+    }
+
+    /// <exception cref="ObjectDisposedException">This image is disposed</exception>
+    public RectI? FindChunkAlignedCommittedBounds()
+    {
+        lock (lockObject)
+        {
+            ThrowIfDisposed();
+            RectI? rect = null;
+            foreach (var (pos, _) in committedChunks[ChunkResolution.Full])
             {
                 RectI chunkBounds = new RectI(pos * FullChunkSize, new VecI(FullChunkSize));
                 rect ??= chunkBounds;
@@ -139,24 +159,49 @@ public class ChunkyImage : IReadOnlyChunkyImage, IDisposable
         }
     }
 
+    /// <summary>
+    /// Finds the precise bounds in <paramref name="suggestedResolution"/>. If there are no chunks rendered for that resolution, full res chunks are used instead.
+    /// </summary>
     /// <exception cref="ObjectDisposedException">This image is disposed</exception>
-    public RectI? FindPreciseCommittedBounds()
+    public RectI? FindTightCommittedBounds(ChunkResolution suggestedResolution = ChunkResolution.Full)
     {
         lock (lockObject)
         {
             ThrowIfDisposed();
 
+            var chunkSize = suggestedResolution.PixelSize();
+            var multiplier = suggestedResolution.Multiplier();
+            RectI scaledCommittedSize = (RectI)(new RectD(VecI.Zero, CommittedSize * multiplier)).RoundOutwards();
+
             RectI? preciseBounds = null;
-            foreach (var (chunkPos, chunk) in committedChunks[ChunkResolution.Full])
+            foreach (var (chunkPos, fullResChunk) in committedChunks[ChunkResolution.Full])
             {
-                RectI? chunkPreciseBounds = chunk.FindPreciseBounds();
-                if(chunkPreciseBounds is null) 
-                    continue;
-                RectI globalChunkBounds = chunkPreciseBounds.Value.Offset(chunkPos * FullChunkSize);
+                if (committedChunks[suggestedResolution].TryGetValue(chunkPos, out Chunk? requestedResChunk))
+                {
+                    RectI visibleArea = new RectI(chunkPos * chunkSize, new VecI(chunkSize)).Intersect(scaledCommittedSize).Translate(-chunkPos * chunkSize);
+
+                    RectI? chunkPreciseBounds = requestedResChunk.FindPreciseBounds(visibleArea);
+                    if (chunkPreciseBounds is null)
+                        continue;
+                    RectI globalChunkBounds = chunkPreciseBounds.Value.Offset(chunkPos * chunkSize);
 
-                preciseBounds ??= globalChunkBounds;
-                preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
+                    preciseBounds ??= globalChunkBounds;
+                    preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
+                }
+                else
+                {
+                    RectI visibleArea = new RectI(chunkPos * FullChunkSize, new VecI(FullChunkSize)).Intersect(new RectI(VecI.Zero, CommittedSize)).Translate(-chunkPos * FullChunkSize);
+
+                    RectI? chunkPreciseBounds = fullResChunk.FindPreciseBounds(visibleArea);
+                    if (chunkPreciseBounds is null)
+                        continue;
+                    RectI globalChunkBounds = (RectI)chunkPreciseBounds.Value.Scale(multiplier).Offset(chunkPos * chunkSize).RoundOutwards();
+
+                    preciseBounds ??= globalChunkBounds;
+                    preciseBounds = preciseBounds.Value.Union(globalChunkBounds);
+                }
             }
+            preciseBounds = (RectI?)preciseBounds?.Scale(suggestedResolution.InvertedMultiplier()).RoundOutwards();
             preciseBounds = preciseBounds?.Intersect(new RectI(preciseBounds.Value.Pos, CommittedSize));
 
             return preciseBounds;
@@ -612,7 +657,7 @@ public class ChunkyImage : IReadOnlyChunkyImage, IDisposable
         lock (lockObject)
         {
             ThrowIfDisposed();
-            PixelOperation operation = new(pos, pixelProcessor, blendMode);
+            PixelOperation operation = new(pos, pixelProcessor, GetCommittedPixel, blendMode);
             EnqueueOperation(operation);
         }
     }

+ 27 - 2
src/ChunkyImageLib/ChunkyImageLib.csproj

@@ -7,8 +7,7 @@
     <WarningsAsErrors>Nullable</WarningsAsErrors>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
     <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-    <Platforms>AnyCPU;x64;x86</Platforms>
-    <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
+    <Platforms>AnyCPU</Platforms>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -17,10 +16,36 @@
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <ItemGroup>

+ 15 - 0
src/ChunkyImageLib/DataHolders/ChunkResolutionEx.cs

@@ -17,6 +17,21 @@ public static class ChunkResolutionEx
         };
     }
 
+    /// <summary>
+    /// Returns the inverted multiplier of the <paramref name="resolution"/>.
+    /// </summary>
+    public static double InvertedMultiplier(this ChunkResolution resolution)
+    {
+        return resolution switch
+        {
+            ChunkResolution.Full => 1,
+            ChunkResolution.Half => 2,
+            ChunkResolution.Quarter => 4,
+            ChunkResolution.Eighth => 8,
+            _ => 1,
+        };
+    }
+
     /// <summary>
     /// Returns the size of a chunk of the resolution <paramref name="resolution"/>
     /// </summary>

+ 46 - 1
src/ChunkyImageLib/DataHolders/ShapeCorners.cs

@@ -1,6 +1,9 @@
-using PixiEditor.DrawingApi.Core.Numerics;
+using System.Diagnostics;
+using PixiEditor.DrawingApi.Core.Numerics;
 
 namespace ChunkyImageLib.DataHolders;
+
+[DebuggerDisplay("TL: {TopLeft}, TR: {TopRight}, BL: {BottomLeft}, BR: {BottomRight}")]
 public struct ShapeCorners
 {
     private const double epsilon = 0.001;
@@ -177,4 +180,46 @@ public struct ShapeCorners
             BottomLeft.AlmostEquals(other.BottomLeft, epsilon) &&
             BottomRight.AlmostEquals(other.BottomRight, epsilon);
     }
+    
+    public bool Intersects(RectD rect)
+    {
+        // Get all corners
+        VecD[] corners1 = { TopLeft, TopRight, BottomRight, BottomLeft };
+        VecD[] corners2 = { rect.TopLeft, rect.TopRight, rect.BottomRight, rect.BottomLeft };
+
+        // For each pair of corners
+        for (int i = 0; i < 4; i++)
+        {
+            VecD axis = corners1[i] - corners1[(i + 1) % 4]; // Create an edge
+            axis = new VecD(-axis.Y, axis.X); // Get perpendicular axis
+
+            // Project corners of first shape onto axis
+            double min1 = double.MaxValue, max1 = double.MinValue;
+            foreach (VecD corner in corners1)
+            {
+                double projection = corner.Dot(axis);
+                min1 = Math.Min(min1, projection);
+                max1 = Math.Max(max1, projection);
+            }
+
+            // Project corners of second shape onto axis
+            double min2 = double.MaxValue, max2 = double.MinValue;
+            foreach (VecD corner in corners2)
+            {
+                double projection = corner.Dot(axis);
+                min2 = Math.Min(min2, projection);
+                max2 = Math.Max(max2, projection);
+            }
+
+            // Check for overlap
+            if (max1 < min2 || max2 < min1)
+            {
+                // The projections do not overlap, so the shapes do not intersect
+                return false;
+            }
+        }
+
+        // All projections overlap, so the shapes intersect
+        return true;
+    }
 }

+ 3 - 1
src/ChunkyImageLib/IReadOnlyChunkyImage.cs

@@ -10,7 +10,9 @@ public interface IReadOnlyChunkyImage
 {
     bool DrawMostUpToDateChunkOn(VecI chunkPos, ChunkResolution resolution, DrawingSurface surface, VecI pos, Paint? paint = null);
     bool DrawCommittedChunkOn(VecI chunkPos, ChunkResolution resolution, DrawingSurface surface, VecI pos, Paint? paint = null);
-    RectI? FindLatestBounds();
+    RectI? FindChunkAlignedMostUpToDateBounds();
+    RectI? FindChunkAlignedCommittedBounds();
+    RectI? FindTightCommittedBounds(ChunkResolution precision = ChunkResolution.Full);
     Color GetCommittedPixel(VecI posOnImage);
     Color GetMostUpToDatePixel(VecI posOnImage);
     bool LatestOrCommittedChunkExists(VecI chunkPos);

+ 2 - 2
src/ChunkyImageLib/Operations/ApplyMaskOperation.cs

@@ -22,9 +22,9 @@ internal class ApplyMaskOperation : IDrawOperation
         return new AffectedArea(mask.FindCommittedChunks());
     }
     
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        mask.DrawCommittedChunkOn(chunkPos, chunk.Resolution, chunk.Surface.DrawingSurface, VecI.Zero, clippingPaint);
+        mask.DrawCommittedChunkOn(chunkPos, targetChunk.Resolution, targetChunk.Surface.DrawingSurface, VecI.Zero, clippingPaint);
     }
 
     public void Dispose()

+ 4 - 4
src/ChunkyImageLib/Operations/BresenhamLineOperation.cs

@@ -25,14 +25,14 @@ internal class BresenhamLineOperation : IMirroredDrawOperation
         points = BresenhamLineHelper.GetBresenhamLine(from, to);
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
         // a hacky way to make the lines look slightly better on non full res chunks
-        paint.Color = new Color(color.R, color.G, color.B, (byte)(color.A * chunk.Resolution.Multiplier()));
+        paint.Color = new Color(color.R, color.G, color.B, (byte)(color.A * targetChunk.Resolution.Multiplier()));
 
-        var surf = chunk.Surface.DrawingSurface;
+        var surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.DrawPoints(PointMode.Points, points, paint);
         surf.Canvas.Restore();

+ 21 - 21
src/ChunkyImageLib/Operations/ChunkyImageOperation.cs

@@ -19,16 +19,16 @@ internal class ChunkyImageOperation : IMirroredDrawOperation
         this.mirrorVertical = mirrorVertical;
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        chunk.Surface.DrawingSurface.Canvas.Save();
+        targetChunk.Surface.DrawingSurface.Canvas.Save();
         {
             VecI pixelPos = chunkPos * ChunkyImage.FullChunkSize;
             VecI topLeftImageCorner = GetTopLeft();
             RectD clippingRect = RectD.Create(
-                OperationHelper.ConvertForResolution(topLeftImageCorner - pixelPos, chunk.Resolution),
-                OperationHelper.ConvertForResolution(imageToDraw.CommittedSize, chunk.Resolution));
-            chunk.Surface.DrawingSurface.Canvas.ClipRect(clippingRect);
+                OperationHelper.ConvertForResolution(topLeftImageCorner - pixelPos, targetChunk.Resolution),
+                OperationHelper.ConvertForResolution(imageToDraw.CommittedSize, targetChunk.Resolution));
+            targetChunk.Surface.DrawingSurface.Canvas.ClipRect(clippingRect);
         }
 
         VecI chunkPixelCenter = chunkPos * ChunkyImage.FullChunkSize;
@@ -36,15 +36,15 @@ internal class ChunkyImageOperation : IMirroredDrawOperation
         chunkPixelCenter.Y += ChunkyImage.FullChunkSize / 2;
 
         VecI chunkCenterOnImage = chunkPixelCenter - targetPos;
-        VecI chunkSize = chunk.PixelSize;
+        VecI chunkSize = targetChunk.PixelSize;
         if (mirrorHorizontal)
         {
-            chunk.Surface.DrawingSurface.Canvas.Scale(-1, 1, chunkSize.X / 2f, chunkSize.Y / 2f);
+            targetChunk.Surface.DrawingSurface.Canvas.Scale(-1, 1, chunkSize.X / 2f, chunkSize.Y / 2f);
             chunkCenterOnImage.X = -chunkCenterOnImage.X;
         }
         if (mirrorVertical)
         {
-            chunk.Surface.DrawingSurface.Canvas.Scale(1, -1, chunkSize.X / 2f, chunkSize.Y / 2f);
+            targetChunk.Surface.DrawingSurface.Canvas.Scale(1, -1, chunkSize.X / 2f, chunkSize.Y / 2f);
             chunkCenterOnImage.Y = -chunkCenterOnImage.Y;
         }
 
@@ -59,37 +59,37 @@ internal class ChunkyImageOperation : IMirroredDrawOperation
 
         imageToDraw.DrawCommittedChunkOn(
             topLeft,
-            chunk.Resolution,
-            chunk.Surface.DrawingSurface,
-            (VecI)((topLeft * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * chunk.Resolution.Multiplier()));
+            targetChunk.Resolution,
+            targetChunk.Surface.DrawingSurface,
+            (VecI)((topLeft * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * targetChunk.Resolution.Multiplier()));
 
         VecI gridShift = targetPos % ChunkyImage.FullChunkSize;
         if (gridShift.X != 0)
         {
             imageToDraw.DrawCommittedChunkOn(
             topRight,
-            chunk.Resolution,
-            chunk.Surface.DrawingSurface,
-            (VecI)((topRight * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * chunk.Resolution.Multiplier()));
+            targetChunk.Resolution,
+            targetChunk.Surface.DrawingSurface,
+            (VecI)((topRight * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * targetChunk.Resolution.Multiplier()));
         }
         if (gridShift.Y != 0)
         {
             imageToDraw.DrawCommittedChunkOn(
             bottomLeft,
-            chunk.Resolution,
-            chunk.Surface.DrawingSurface,
-            (VecI)((bottomLeft * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * chunk.Resolution.Multiplier()));
+            targetChunk.Resolution,
+            targetChunk.Surface.DrawingSurface,
+            (VecI)((bottomLeft * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * targetChunk.Resolution.Multiplier()));
         }
         if (gridShift.X != 0 && gridShift.Y != 0)
         {
             imageToDraw.DrawCommittedChunkOn(
             bottomRight,
-            chunk.Resolution,
-            chunk.Surface.DrawingSurface,
-            (VecI)((bottomRight * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * chunk.Resolution.Multiplier()));
+            targetChunk.Resolution,
+            targetChunk.Surface.DrawingSurface,
+            (VecI)((bottomRight * ChunkyImage.FullChunkSize - chunkCenterOnImage).Add(ChunkyImage.FullChunkSize / 2) * targetChunk.Resolution.Multiplier()));
         }
 
-        chunk.Surface.DrawingSurface.Canvas.Restore();
+        targetChunk.Surface.DrawingSurface.Canvas.Restore();
     }
 
     public AffectedArea FindAffectedArea(VecI imageSize)

+ 6 - 6
src/ChunkyImageLib/Operations/ClearPathOperation.cs

@@ -16,17 +16,17 @@ internal class ClearPathOperation : IMirroredDrawOperation
         this.pathTightBounds = (pathTightBounds ?? (RectI)path.TightBounds);
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        chunk.Surface.DrawingSurface.Canvas.Save();
+        targetChunk.Surface.DrawingSurface.Canvas.Save();
 
         using VectorPath transformedPath = new(path);
-        float scale = (float)chunk.Resolution.Multiplier();
+        float scale = (float)targetChunk.Resolution.Multiplier();
         VecD trans = -chunkPos * ChunkyImage.FullChunkSize * scale;
         transformedPath.Transform(Matrix3X3.CreateScaleTranslation(scale, scale, (float)trans.X, (float)trans.Y));
-        chunk.Surface.DrawingSurface.Canvas.ClipPath(transformedPath);
-        chunk.Surface.DrawingSurface.Canvas.Clear();
-        chunk.Surface.DrawingSurface.Canvas.Restore();
+        targetChunk.Surface.DrawingSurface.Canvas.ClipPath(transformedPath);
+        targetChunk.Surface.DrawingSurface.Canvas.Clear();
+        targetChunk.Surface.DrawingSurface.Canvas.Restore();
     }
 
     public AffectedArea FindAffectedArea(VecI imageSize)

+ 7 - 7
src/ChunkyImageLib/Operations/ClearRegionOperation.cs

@@ -14,15 +14,15 @@ internal class ClearRegionOperation : IMirroredDrawOperation
         this.rect = rect;
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        VecI convPos = OperationHelper.ConvertForResolution(rect.Pos, chunk.Resolution);
-        VecI convSize = OperationHelper.ConvertForResolution(rect.Size, chunk.Resolution);
+        VecI convPos = OperationHelper.ConvertForResolution(rect.Pos, targetChunk.Resolution);
+        VecI convSize = OperationHelper.ConvertForResolution(rect.Size, targetChunk.Resolution);
 
-        chunk.Surface.DrawingSurface.Canvas.Save();
-        chunk.Surface.DrawingSurface.Canvas.ClipRect(RectD.Create(convPos - chunkPos.Multiply(chunk.PixelSize), convSize));
-        chunk.Surface.DrawingSurface.Canvas.Clear();
-        chunk.Surface.DrawingSurface.Canvas.Restore();
+        targetChunk.Surface.DrawingSurface.Canvas.Save();
+        targetChunk.Surface.DrawingSurface.Canvas.ClipRect(RectD.Create(convPos - chunkPos.Multiply(targetChunk.PixelSize), convSize));
+        targetChunk.Surface.DrawingSurface.Canvas.Clear();
+        targetChunk.Surface.DrawingSurface.Canvas.Restore();
     }
 
     public AffectedArea FindAffectedArea(VecI imageSize)

+ 4 - 4
src/ChunkyImageLib/Operations/DrawingSurfaceLineOperation.cs

@@ -27,12 +27,12 @@ internal class DrawingSurfaceLineOperation : IMirroredDrawOperation
         this.to = to;
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        paint.IsAntiAliased = chunk.Resolution != ChunkResolution.Full;
-        var surf = chunk.Surface.DrawingSurface;
+        paint.IsAntiAliased = targetChunk.Resolution != ChunkResolution.Full;
+        var surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.DrawLine(from, to, paint);
         surf.Canvas.Restore();

+ 4 - 4
src/ChunkyImageLib/Operations/EllipseOperation.cs

@@ -53,16 +53,16 @@ internal class EllipseOperation : IMirroredDrawOperation
         }
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
         if (!init)
             Init();
-        var surf = chunk.Surface.DrawingSurface;
+        var surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
 
-        paint.IsAntiAliased = chunk.Resolution != ChunkResolution.Full;
+        paint.IsAntiAliased = targetChunk.Resolution != ChunkResolution.Full;
 
         if (strokeWidth == 1)
         {

+ 1 - 1
src/ChunkyImageLib/Operations/IDrawOperation.cs

@@ -6,6 +6,6 @@ namespace ChunkyImageLib.Operations;
 internal interface IDrawOperation : IOperation
 {
     bool IgnoreEmptyChunks { get; }
-    void DrawOnChunk(Chunk chunk, VecI chunkPos);
+    void DrawOnChunk(Chunk targetChunk, VecI chunkPos);
     AffectedArea FindAffectedArea(VecI imageSize);
 }

+ 6 - 6
src/ChunkyImageLib/Operations/ImageOperation.cs

@@ -79,19 +79,19 @@ internal class ImageOperation : IMirroredDrawOperation
 
 
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
         //customPaint.FilterQuality = chunk.Resolution != ChunkResolution.Full;
-        float scaleMult = (float)chunk.Resolution.Multiplier();
+        float scaleMult = (float)targetChunk.Resolution.Multiplier();
         VecD trans = -chunkPos * ChunkPool.FullChunkSize;
 
         var scaleTrans = Matrix3X3.CreateScaleTranslation(scaleMult, scaleMult, (float)trans.X * scaleMult, (float)trans.Y * scaleMult);
         var finalMatrix = Matrix3X3.Concat(scaleTrans, transformMatrix);
 
-        chunk.Surface.DrawingSurface.Canvas.Save();
-        chunk.Surface.DrawingSurface.Canvas.SetMatrix(finalMatrix);
-        chunk.Surface.DrawingSurface.Canvas.DrawSurface(toPaint.DrawingSurface, 0, 0, customPaint);
-        chunk.Surface.DrawingSurface.Canvas.Restore();
+        targetChunk.Surface.DrawingSurface.Canvas.Save();
+        targetChunk.Surface.DrawingSurface.Canvas.SetMatrix(finalMatrix);
+        targetChunk.Surface.DrawingSurface.Canvas.DrawSurface(toPaint.DrawingSurface, 0, 0, customPaint);
+        targetChunk.Surface.DrawingSurface.Canvas.Restore();
     }
 
     public AffectedArea FindAffectedArea(VecI imageSize)

+ 4 - 4
src/ChunkyImageLib/Operations/PathOperation.cs

@@ -24,12 +24,12 @@ internal class PathOperation : IMirroredDrawOperation
         bounds = floatBounds.Inflate((int)Math.Ceiling(strokeWidth) + 1);
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        paint.IsAntiAliased = chunk.Resolution != ChunkResolution.Full;
-        var surf = chunk.Surface.DrawingSurface;
+        paint.IsAntiAliased = targetChunk.Resolution != ChunkResolution.Full;
+        var surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.DrawPath(path, paint);
         surf.Canvas.Restore();

+ 15 - 12
src/ChunkyImageLib/Operations/PixelOperation.cs

@@ -6,7 +6,7 @@ using PixiEditor.DrawingApi.Core.Surface.PaintImpl;
 
 namespace ChunkyImageLib.Operations;
 
-public delegate Color PixelProcessor(Color input);
+public delegate Color PixelProcessor(Color commited, Color upToDate);
 internal class PixelOperation : IMirroredDrawOperation
 {
     public bool IgnoreEmptyChunks => false;
@@ -14,8 +14,9 @@ internal class PixelOperation : IMirroredDrawOperation
     private readonly Color color;
     private readonly BlendMode blendMode;
     private readonly Paint paint;
+    private readonly Func<VecI, Color>? getCommitedPixelFunc = null;
 
-    private readonly PixelProcessor? _colorProcessor = null;
+    private readonly PixelProcessor? colorProcessor = null;
 
     public PixelOperation(VecI pixel, Color color, BlendMode blendMode)
     {
@@ -25,22 +26,23 @@ internal class PixelOperation : IMirroredDrawOperation
         paint = new Paint() { BlendMode = blendMode };
     }
 
-    public PixelOperation(VecI pixel, PixelProcessor colorProcessor, BlendMode blendMode)
+    public PixelOperation(VecI pixel, PixelProcessor colorProcessor, Func<VecI, Color> getCommitedPixelFunc, BlendMode blendMode)
     {
         this.pixel = pixel;
-        this._colorProcessor = colorProcessor;
+        this.colorProcessor = colorProcessor;
         this.blendMode = blendMode;
+        this.getCommitedPixelFunc = getCommitedPixelFunc;
         paint = new Paint() { BlendMode = blendMode };
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
         // a hacky way to make the lines look slightly better on non full res chunks
-        paint.Color = GetColor(chunk, chunkPos);
+        paint.Color = GetColor(targetChunk, chunkPos);
 
-        DrawingSurface surf = chunk.Surface.DrawingSurface;
+        DrawingSurface surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.DrawPoint(pixel, paint);
         surf.Canvas.Restore();
@@ -49,9 +51,10 @@ internal class PixelOperation : IMirroredDrawOperation
     private Color GetColor(Chunk chunk, VecI chunkPos)
     {
         Color pixelColor = color;
-        if (_colorProcessor != null)
+        if (colorProcessor != null && getCommitedPixelFunc != null)
         {
-            pixelColor = _colorProcessor(chunk.Surface.GetSRGBPixel(pixel - chunkPos * ChunkyImage.FullChunkSize));
+            var pos = pixel - chunkPos * ChunkyImage.FullChunkSize;
+            pixelColor = colorProcessor(getCommitedPixelFunc(pixel), chunk.Surface.GetSRGBPixel(pos));
         }
 
         return new Color(pixelColor.R, pixelColor.G, pixelColor.B, (byte)(pixelColor.A * chunk.Resolution.Multiplier()));
@@ -69,9 +72,9 @@ internal class PixelOperation : IMirroredDrawOperation
             pixelRect = (RectI)pixelRect.ReflectX((double)verAxisX).Round();
         if (horAxisY is not null)
             pixelRect = (RectI)pixelRect.ReflectY((double)horAxisY);
-        if (_colorProcessor != null)
+        if (colorProcessor != null && getCommitedPixelFunc != null)
         {
-            return new PixelOperation(pixelRect.Pos, _colorProcessor, blendMode);
+            return new PixelOperation(pixelRect.Pos, colorProcessor, getCommitedPixelFunc, blendMode);
         }
 
         return new PixelOperation(pixelRect.Pos, color, blendMode);

+ 4 - 4
src/ChunkyImageLib/Operations/PixelsOperation.cs

@@ -24,14 +24,14 @@ internal class PixelsOperation : IMirroredDrawOperation
         paint = new Paint() { BlendMode = blendMode };
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
         // a hacky way to make the lines look slightly better on non full res chunks
-        paint.Color = new Color(color.R, color.G, color.B, (byte)(color.A * chunk.Resolution.Multiplier()));
+        paint.Color = new Color(color.R, color.G, color.B, (byte)(color.A * targetChunk.Resolution.Multiplier()));
 
-        DrawingSurface surf = chunk.Surface.DrawingSurface;
+        DrawingSurface surf = targetChunk.Surface.DrawingSurface;
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.DrawPoints(PointMode.Points, pixels, paint);
         surf.Canvas.Restore();

+ 4 - 4
src/ChunkyImageLib/Operations/RectangleOperation.cs

@@ -15,11 +15,11 @@ internal class RectangleOperation : IMirroredDrawOperation
 
     public bool IgnoreEmptyChunks => false;
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        var skiaSurf = chunk.Surface.DrawingSurface;
+        var skiaSurf = targetChunk.Surface.DrawingSurface;
 
-        var surf = chunk.Surface.DrawingSurface;
+        var surf = targetChunk.Surface.DrawingSurface;
 
         var rect = RectD.FromCenterAndSize(Data.Center, Data.Size.Abs());
         var innerRect = rect.Inflate(-Data.StrokeWidth);
@@ -27,7 +27,7 @@ internal class RectangleOperation : IMirroredDrawOperation
             innerRect = RectD.Empty;
 
         surf.Canvas.Save();
-        surf.Canvas.Scale((float)chunk.Resolution.Multiplier());
+        surf.Canvas.Scale((float)targetChunk.Resolution.Multiplier());
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         skiaSurf.Canvas.RotateRadians((float)Data.Angle, (float)rect.Center.X, (float)rect.Center.Y);
 

+ 2 - 2
src/ChunkyImageLib/Operations/ReplaceColorOperation.cs

@@ -22,9 +22,9 @@ internal class ReplaceColorOperation : IDrawOperation
         newColorBits = newColor.ToULong();
     }
 
-    public void DrawOnChunk(Chunk chunk, VecI chunkPos)
+    public void DrawOnChunk(Chunk targetChunk, VecI chunkPos)
     {
-        ReplaceColor(oldColorBounds, newColorBits, chunk);
+        ReplaceColor(oldColorBounds, newColorBits, targetChunk);
     }
 
     private static unsafe void ReplaceColor(ColorBounds oldColorBounds, ulong newColorBits, Chunk chunk)

+ 27 - 1
src/PixiEditor.ChangeableDocument.Gen/PixiEditor.ChangeableDocument.Gen.csproj

@@ -7,7 +7,7 @@
     <ImplicitUsings>true</ImplicitUsings>
     <LangVersion>Latest</LangVersion>
     <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-    <Platforms>AnyCPU;x64;x86</Platforms>
+    <Platforms>AnyCPU</Platforms>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -16,10 +16,36 @@
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <ItemGroup>

+ 3 - 3
src/PixiEditor.ChangeableDocument/Changeables/Document.cs

@@ -52,7 +52,7 @@ internal class Document : IChangeable, IReadOnlyDocument, IDisposable
             throw new ArgumentException(@"The given guid does not belong to a layer.", nameof(layerGuid));
 
 
-        RectI? tightBounds = layer.LayerImage.FindLatestBounds();
+        RectI? tightBounds = layer.LayerImage.FindChunkAlignedMostUpToDateBounds();
 
         if (tightBounds is null)
             return null;
@@ -69,7 +69,7 @@ internal class Document : IChangeable, IReadOnlyDocument, IDisposable
         return surface;
     }
 
-    public RectI? GetLayerTightBounds(Guid layerGuid)
+    public RectI? GetChunkAlignedLayerBounds(Guid layerGuid)
     {
         var layer = (IReadOnlyLayer?)FindMember(layerGuid);
 
@@ -77,7 +77,7 @@ internal class Document : IChangeable, IReadOnlyDocument, IDisposable
             throw new ArgumentException(@"The given guid does not belong to a layer.", nameof(layerGuid));
 
 
-        return layer.LayerImage.FindLatestBounds();
+        return layer.LayerImage.FindChunkAlignedMostUpToDateBounds();
     }
     
     public void ForEveryReadonlyMember(Action<IReadOnlyStructureMember> action) => ForEveryReadonlyMember(StructureRoot, action);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Interfaces/IReadOnlyDocument.cs

@@ -46,7 +46,7 @@ public interface IReadOnlyDocument
     void ForEveryReadonlyMember(Action<IReadOnlyStructureMember> action);
     
     public Surface? GetLayerImage(Guid layerGuid);
-    public RectI? GetLayerTightBounds(Guid layerGuid);
+    public RectI? GetChunkAlignedLayerBounds(Guid layerGuid);
 
     /// <summary>
     /// Finds the member with the <paramref name="guid"/> or returns null if not found

+ 7 - 25
src/PixiEditor.ChangeableDocument/Changes/Drawing/ChangeBrightness_UpdateableChange.cs

@@ -14,8 +14,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
     private readonly List<VecI> positions = new();
     private bool ignoreUpdate = false;
     private readonly bool repeat;
-    
-    private Surface tempSurface;
+
     private List<VecI> ellipseLines;
     
     private CommittedChunkStorage? savedChunks;
@@ -29,7 +28,6 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
         this.repeat = repeat;
 
         ellipseLines = EllipseHelper.SplitEllipseIntoLines((EllipseHelper.GenerateEllipseFromRect(new RectI(0, 0, strokeWidth, strokeWidth))));
-        tempSurface = new Surface(new VecI(strokeWidth, strokeWidth));
     }
 
     [UpdateChangeMethod]
@@ -58,7 +56,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
 
         int queueLength = layer.LayerImage.QueueLength;
         
-        ChangeBrightness(ellipseLines, strokeWidth, pos + new VecI(-strokeWidth / 2), correctionFactor, repeat, tempSurface, layer.LayerImage);
+        ChangeBrightness(ellipseLines, strokeWidth, pos + new VecI(-strokeWidth / 2), correctionFactor, repeat, layer.LayerImage);
         
         var affected = layer.LayerImage.FindAffectedArea(queueLength);
         
@@ -66,20 +64,9 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
     }
     
     private static void ChangeBrightness(
-        List<VecI> circleLines, int circleDiameter, VecI offset, float correctionFactor, bool repeat, Surface tempSurface, ChunkyImage layerImage)
+        List<VecI> circleLines, int circleDiameter, VecI offset, float correctionFactor, bool repeat, ChunkyImage layerImage)
     {
-        tempSurface.DrawingSurface.Canvas.Clear();
-        if (repeat)
-        {
-            layerImage.DrawMostUpToDateRegionOn
-                (new RectI(offset, new(circleDiameter, circleDiameter)), ChunkResolution.Full, tempSurface.DrawingSurface, new VecI(0));
-        }
-        else
-        {
-            layerImage.DrawCommittedRegionOn
-                (new RectI(offset, new(circleDiameter, circleDiameter)), ChunkResolution.Full, tempSurface.DrawingSurface, new VecI(0));
-        }
-        
+
         for (var i = 0; i < circleLines.Count - 1; i++)
         {
             VecI left = circleLines[i];
@@ -90,9 +77,9 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
             {
                 layerImage.EnqueueDrawPixel(
                     pos + offset,
-                    (pixel) =>
+                    (commitedColor, upToDateColor) =>
                     {
-                        Color newColor = ColorHelper.ChangeColorBrightness(pixel, correctionFactor);
+                        Color newColor = ColorHelper.ChangeColorBrightness(repeat ? upToDateColor : commitedColor, correctionFactor);
                         return ColorHelper.ChangeColorBrightness(newColor, correctionFactor);
                     },
                     BlendMode.Src);
@@ -113,7 +100,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
             DrawingChangeHelper.ApplyClipsSymmetriesEtc(target, layer.LayerImage, layerGuid, false);
             foreach (VecI pos in positions)
             {
-                ChangeBrightness(ellipseLines, strokeWidth, pos + new VecI(-strokeWidth / 2), correctionFactor, repeat, tempSurface, layer.LayerImage);
+                ChangeBrightness(ellipseLines, strokeWidth, pos + new VecI(-strokeWidth / 2), correctionFactor, repeat, layer.LayerImage);
             }
         }
 
@@ -130,9 +117,4 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
         var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(target, layerGuid, false, ref savedChunks);
         return new LayerImageArea_ChangeInfo(layerGuid, affected);
     }
-
-    public override void Dispose()
-    {
-        tempSurface.Dispose();
-    }
 }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Drawing/TransformSelectedArea_UpdateableChange.cs

@@ -72,7 +72,7 @@ internal class TransformSelectedArea_UpdateableChange : UpdateableChange
     public OneOf<None, (Surface image, RectI extractedRect)> ExtractArea(ChunkyImage image, VectorPath path, RectI pathBounds)
     {
         // get rid of transparent areas on edges
-        var memberImageBounds = image.FindLatestBounds();
+        var memberImageBounds = image.FindChunkAlignedMostUpToDateBounds();
         if (memberImageBounds is null)
             return new None();
         pathBounds = pathBounds.Intersect(memberImageBounds.Value);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/CenterContent_Change.cs

@@ -41,7 +41,7 @@ internal class CenterContent_Change : Change
         foreach (var layerGuid in affectedLayers)
         {
             Layer layer = document.FindMemberOrThrow<Layer>(layerGuid);
-            RectI? tightBounds = layer.LayerImage.FindPreciseCommittedBounds();
+            RectI? tightBounds = layer.LayerImage.FindTightCommittedBounds();
             if (tightBounds.HasValue)
             {
                 currentBounds = currentBounds.HasValue ? currentBounds.Value.Union(tightBounds.Value) : tightBounds;

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs

@@ -15,7 +15,7 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
         {
             if (member is Layer layer)
             {
-                var layerBounds = layer.LayerImage.FindPreciseCommittedBounds();
+                var layerBounds = layer.LayerImage.FindTightCommittedBounds();
                 if (layerBounds.HasValue)
                 {
                     bounds ??= layerBounds.Value;

+ 48 - 0
src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs

@@ -0,0 +1,48 @@
+using PixiEditor.ChangeableDocument.ChangeInfos.Root;
+using PixiEditor.DrawingApi.Core.Numerics;
+
+namespace PixiEditor.ChangeableDocument.Changes.Root;
+
+internal class Crop_Change : ResizeBasedChangeBase
+{
+    private RectI rect;
+    
+    [GenerateMakeChangeAction]
+    public Crop_Change(RectI rect)
+    {
+        this.rect = rect;
+    }
+
+    public override bool InitializeAndValidate(Document target)
+    {
+        return base.InitializeAndValidate(target) && rect is { Width: > 0, Height: > 0 };
+    }
+
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
+    {
+        if (_originalSize == rect.Size)
+        {
+            ignoreInUndo = true;
+            return new None();
+        }
+
+        target.Size = rect.Size;
+        target.VerticalSymmetryAxisX = Math.Clamp(_originalVerAxisX - rect.Pos.X, 0, rect.Size.X);
+        target.HorizontalSymmetryAxisY = Math.Clamp(_originalHorAxisY - rect.Pos.Y, 0, rect.Size.Y);
+
+        target.ForEveryMember((member) =>
+        {
+            if (member is Layer layer)
+            {
+                Resize(layer.LayerImage, layer.GuidValue, rect.Size, rect.Pos * -1, deletedChunks);
+            }
+            if (member.Mask is null)
+                return;
+
+            Resize(member.Mask, member.GuidValue, rect.Size, rect.Pos * -1, deletedMaskChunks);
+        });
+        
+        ignoreInUndo = false;
+        return new Size_ChangeInfo(rect.Size, target.VerticalSymmetryAxisX, target.HorizontalSymmetryAxisY);
+    }
+}

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs

@@ -54,7 +54,7 @@ internal sealed class FlipImage_Change : Change
         RectI bounds = new RectI(VecI.Zero, img.LatestSize);
         if (membersToFlip.Count > 0)
         {
-            var preciseBounds = img.FindPreciseCommittedBounds();
+            var preciseBounds = img.FindTightCommittedBounds();
             if (preciseBounds.HasValue)
             {
                 bounds = preciseBounds.Value;

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs

@@ -59,7 +59,7 @@ internal sealed class RotateImage_Change : Change
         RectI bounds = new RectI(VecI.Zero, img.CommittedSize);
         if (membersToRotate.Count > 0)
         {
-            var preciseBounds = img.FindPreciseCommittedBounds();
+            var preciseBounds = img.FindTightCommittedBounds();
             if (preciseBounds.HasValue)
             {
                 bounds = preciseBounds.Value;

+ 8 - 2
src/PixiEditor.ChangeableDocument/Changes/Selection/SelectEllipse_UpdateableChange.cs

@@ -7,6 +7,7 @@ namespace PixiEditor.ChangeableDocument.Changes.Selection;
 internal class SelectEllipse_UpdateableChange : UpdateableChange
 {
     private RectI borders;
+    private VectorPath? documentConstraint;
     private readonly SelectionMode mode;
     private VectorPath? originalPath;
 
@@ -26,6 +27,8 @@ internal class SelectEllipse_UpdateableChange : UpdateableChange
     public override bool InitializeAndValidate(Document target)
     {
         originalPath = new VectorPath(target.Selection.SelectionPath);
+        documentConstraint = new VectorPath();
+        documentConstraint.AddRect(new RectI(VecI.Zero, target.Size));
         return true;
     }
 
@@ -35,11 +38,13 @@ internal class SelectEllipse_UpdateableChange : UpdateableChange
         if (!borders.IsZeroArea)
             ellipsePath.AddOval(borders);
 
+        using var inConstraint = ellipsePath.Op(documentConstraint!, VectorPathOp.Intersect);
+
         var toDispose = target.Selection.SelectionPath;
         if (mode == SelectionMode.New)
-            target.Selection.SelectionPath = new(ellipsePath);
+            target.Selection.SelectionPath = new(inConstraint);
         else
-            target.Selection.SelectionPath = originalPath!.Op(ellipsePath, mode.ToVectorPathOp());
+            target.Selection.SelectionPath = originalPath!.Op(inConstraint, mode.ToVectorPathOp());
         toDispose.Dispose();
 
         return new Selection_ChangeInfo(new VectorPath(target.Selection.SelectionPath));
@@ -67,5 +72,6 @@ internal class SelectEllipse_UpdateableChange : UpdateableChange
     public override void Dispose()
     {
         originalPath?.Dispose();
+        documentConstraint?.Dispose();
     }
 }

+ 6 - 2
src/PixiEditor.ChangeableDocument/Changes/Selection/SelectLasso_UpdateableChange.cs

@@ -5,6 +5,8 @@ using PixiEditor.DrawingApi.Core.Surface.Vector;
 namespace PixiEditor.ChangeableDocument.Changes.Selection;
 internal class SelectLasso_UpdateableChange : UpdateableChange
 {
+    private RectI constraint;
+    private VecI initialPoint;
     private VectorPath? originalPath;
     private VectorPath path = new() { FillType = PathFillType.EvenOdd };
     private readonly SelectionMode mode;
@@ -12,18 +14,20 @@ internal class SelectLasso_UpdateableChange : UpdateableChange
     [GenerateUpdateableChangeActions]
     public SelectLasso_UpdateableChange(VecI point, SelectionMode mode)
     {
-        path.MoveTo(point);
+        initialPoint = point;
         this.mode = mode;
     }
 
     [UpdateChangeMethod]
     public void Update(VecI point)
     {
-        path.LineTo(point);
+        path.LineTo(point.KeepInside(constraint));
     }
 
     public override bool InitializeAndValidate(Document target)
     {
+        constraint = new RectI(VecI.Zero, target.Size);
+        path.MoveTo(initialPoint.KeepInside(constraint));
         originalPath = new VectorPath(target.Selection.SelectionPath);
         return true;
     }

+ 5 - 4
src/PixiEditor.ChangeableDocument/Changes/Selection/SelectRectangle_UpdateableChange.cs

@@ -33,10 +33,11 @@ internal class SelectRectangle_UpdateableChange : UpdateableChange
         using var rectPath = new VectorPath() { FillType = PathFillType.EvenOdd };
         if (!rect.IsZeroArea)
         {
-            rectPath.MoveTo(rect.TopLeft);
-            rectPath.LineTo(rect.TopRight);
-            rectPath.LineTo(rect.BottomRight);
-            rectPath.LineTo(rect.BottomLeft);
+            var constrained = rect.Intersect(new RectI(VecI.Zero, target.Size));
+            rectPath.MoveTo(constrained.TopLeft);
+            rectPath.LineTo(constrained.TopRight);
+            rectPath.LineTo(constrained.BottomRight);
+            rectPath.LineTo(constrained.BottomLeft);
             rectPath.Close();
         }
 

+ 27 - 2
src/PixiEditor.ChangeableDocument/PixiEditor.ChangeableDocument.csproj

@@ -7,8 +7,7 @@
     <WarningsAsErrors>Nullable</WarningsAsErrors>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-    <Platforms>AnyCPU;x64;x86</Platforms>
-    <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
+    <Platforms>AnyCPU</Platforms>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -17,10 +16,36 @@
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <ItemGroup>

+ 12 - 0
src/PixiEditor.DrawingApi.Core/Numerics/RectI.cs

@@ -271,6 +271,18 @@ public struct RectI : IEquatable<RectI>
         return x > left && x < right && y > top && y < bottom;
     }
 
+    public readonly bool ContainsInclusive(RectI rect)
+    {
+        return ContainsInclusive(rect.TopLeft) && ContainsInclusive(rect.BottomRight);
+    }
+
+
+    public readonly bool ContainsExclusive(RectI rect)
+    {
+        return ContainsExclusive(rect.TopLeft) && ContainsExclusive(rect.BottomRight);
+    }
+
+
     public readonly bool ContainsPixel(VecI pixelTopLeft) => ContainsPixel(pixelTopLeft.X, pixelTopLeft.Y);
     public readonly bool ContainsPixel(int pixelTopLeftX, int pixelTopLeftY)
     {

+ 3 - 0
src/PixiEditor.DrawingApi.Core/Numerics/VecD.cs

@@ -134,6 +134,9 @@ public struct VecD : IEquatable<VecD>
     {
         return (X * other.Y) - (Y * other.X);
     }
+
+    public double Dot(VecD other) => (X * other.X) + (Y * other.Y);
+    
     public VecD Multiply(VecD other)
     {
         return new VecD(X * other.X, Y * other.Y);

+ 25 - 0
src/PixiEditor.DrawingApi.Core/Numerics/VecI.cs

@@ -16,6 +16,7 @@ public struct VecI : IEquatable<VecI>
 
     public static VecI Zero { get; } = new(0, 0);
     public static VecI One { get; } = new(1, 1);
+    public static VecI NegativeOne { get; } = new(-1, -1);
 
     public VecI(int x, int y)
     {
@@ -67,6 +68,30 @@ public struct VecI : IEquatable<VecI>
     {
         return new(X, 2 * lineY - Y);
     }
+
+    public VecI KeepInside(RectI rect)
+    {
+        return new VecI(Math.Clamp(X, rect.Left, rect.Right), Math.Clamp(Y, rect.Top, rect.Bottom));
+    }
+
+    public byte[] ToByteArray()
+    {
+        var data = new byte[sizeof(int) * 2];
+
+        BitConverter.TryWriteBytes(data, X);
+        BitConverter.TryWriteBytes(data.AsSpan(4), Y);
+
+        return data;
+    }
+
+    public static VecI FromBytes(ReadOnlySpan<byte> value)
+    {
+        var x = BitConverter.ToInt32(value);
+        var y = BitConverter.ToInt32(value[4..]);
+
+        return new VecI(x, y);
+    }
+    
     public static VecI operator +(VecI a, VecI b)
     {
         return new VecI(a.X + b.X, a.Y + b.Y);

+ 27 - 2
src/PixiEditor.DrawingApi.Core/PixiEditor.DrawingApi.Core.csproj

@@ -6,8 +6,7 @@
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <LangVersion>10</LangVersion>
         <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-        <Platforms>AnyCPU;x64;x86</Platforms>
-      <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
+        <Platforms>AnyCPU</Platforms>
     </PropertyGroup>
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -16,9 +15,35 @@
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
       <Optimize>True</Optimize>
+      <PlatformTarget>AnyCPU</PlatformTarget>
     </PropertyGroup>
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
       <Optimize>True</Optimize>
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
     </PropertyGroup>
 </Project>

+ 27 - 2
src/PixiEditor.DrawingApi.Skia/PixiEditor.DrawingApi.Skia.csproj

@@ -5,8 +5,7 @@
         <Nullable>enable</Nullable>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-        <Platforms>AnyCPU;x64;x86</Platforms>
-      <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
+        <Platforms>AnyCPU</Platforms>
     </PropertyGroup>
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -15,10 +14,36 @@
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
       <Optimize>True</Optimize>
+      <PlatformTarget>AnyCPU</PlatformTarget>
     </PropertyGroup>
 
     <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
       <Optimize>True</Optimize>
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+      <PlatformTarget>AnyCPU</PlatformTarget>
     </PropertyGroup>
 
     <ItemGroup>

+ 9 - 5
src/PixiEditor/Localization/ILocalizationProvider.cs → src/PixiEditor.Extensions/Common/Localization/ILocalizationProvider.cs

@@ -1,14 +1,13 @@
-using System.IO;
-
-namespace PixiEditor.Localization;
+namespace PixiEditor.Extensions.Common.Localization;
 
 public interface ILocalizationProvider
 {
-    public static ILocalizationProvider Current => ViewModelMain.Current.LocalizationProvider;
-    
+    public static ILocalizationProvider Current { get; private set; }
     public string LocalizationDataPath { get; }
     public LocalizationData LocalizationData { get; }
     public Language CurrentLanguage { get; set; }
+    public LanguageData SelectedLanguage { get; }
+    public LanguageData FollowSystem { get; }
     public event Action<Language> OnLanguageChanged;
 
     /// <summary>
@@ -19,4 +18,9 @@ public interface ILocalizationProvider
     public void LoadDebugKeys(Dictionary<string, string> languageKeys, bool rightToLeft);
     public void ReloadLanguage();
     public Language DefaultLanguage { get; }
+
+    protected static void SetAsCurrent(ILocalizationProvider provider)
+    {
+        Current = provider;
+    }
 }

+ 4 - 2
src/PixiEditor/Localization/Language.cs → src/PixiEditor.Extensions/Common/Localization/Language.cs

@@ -1,11 +1,13 @@
 using System.Diagnostics;
 using System.Windows;
 
-namespace PixiEditor.Localization;
+namespace PixiEditor.Extensions.Common.Localization;
 
 [DebuggerDisplay("{LanguageData.Name}, strings: {Locale.Count}")]
 public class Language
 {
+    public static bool FlipFlowDirection { get; set; } = false;
+
     private FlowDirection flowDirection;
     
     public LanguageData LanguageData { get; }
@@ -15,7 +17,7 @@ public class Language
     {
         get
         {
-            if (ViewModelMain.Current.DebugSubViewModel.ForceOtherFlowDirection)
+            if (FlipFlowDirection)
             {
                 return flowDirection switch
                 {

+ 36 - 0
src/PixiEditor.Extensions/Common/Localization/LanguageData.cs

@@ -0,0 +1,36 @@
+using System.Globalization;
+using Newtonsoft.Json;
+
+namespace PixiEditor.Extensions.Common.Localization;
+
+public class LanguageData
+{
+    public string Name { get; set; }
+    public string Code { get; set; }
+    public string LocaleFileName { get; set; }
+    
+    // https://icons8.com/icon/set/flags/color
+    public string IconFileName { get; set; }
+    public string IconPath = $"pack://application:,,,/PixiEditor;component/Images/LanguageFlags/";
+
+    [JsonIgnore]
+    public List<string> AdditionalLocalePaths { get; set; }
+
+    [JsonIgnore]
+    public string IconFullPath => $"{IconPath}{IconFileName}";
+    public bool RightToLeft { get; set; }
+    
+    [JsonIgnore]
+    public DateTimeOffset LastUpdated => LastUpdatedString == null ? DateTimeOffset.MinValue : DateTimeOffset.Parse(LastUpdatedString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
+    
+    [JsonProperty(nameof(LastUpdated))]
+    private string LastUpdatedString { get; set; }
+
+    [JsonIgnore]
+    public string? CustomLocaleAssemblyPath { get; set; }
+    
+    public override string ToString()
+    {
+        return Name;
+    }
+}

+ 28 - 0
src/PixiEditor.Extensions/Common/Localization/LocalizationData.cs

@@ -0,0 +1,28 @@
+using System.Diagnostics;
+using System.IO;
+
+namespace PixiEditor.Extensions.Common.Localization;
+
+[DebuggerDisplay("{Languages.Count} Language(s)")]
+public class LocalizationData
+{
+    public List<LanguageData> Languages { get; set; } = new();
+
+    public void MergeWith(List<LanguageData> toMerge, string assemblyLocation)
+    {
+        foreach (LanguageData language in toMerge)
+        {
+            LanguageData existing = Languages.Find(x => x.Code == language.Code);
+            if (existing is null)
+            {
+                language.CustomLocaleAssemblyPath = assemblyLocation;
+                Languages.Add(language);
+            }
+            else
+            {
+                existing.AdditionalLocalePaths ??= new List<string>();
+                existing.AdditionalLocalePaths.Add(Path.Combine(assemblyLocation, language.LocaleFileName));
+            }
+        }
+    }
+}

+ 2 - 2
src/PixiEditor/Models/Enums/LocalizationKeyShowMode.cs → src/PixiEditor.Extensions/Common/Localization/LocalizationKeyShowMode.cs

@@ -1,6 +1,6 @@
-namespace PixiEditor.Models.Enums;
+namespace PixiEditor.Extensions.Common.Localization;
 
-internal enum LocalizationKeyShowMode
+public enum LocalizationKeyShowMode
 {
     /// <summary>
     /// Shows just the value e.g. Open

+ 3 - 5
src/PixiEditor/Localization/LocalizedString.cs → src/PixiEditor.Extensions/Common/Localization/LocalizedString.cs

@@ -1,10 +1,8 @@
-using System.Text;
-using PixiEditor.Models.Enums;
-
-namespace PixiEditor.Localization;
+namespace PixiEditor.Extensions.Common.Localization;
 
 public struct LocalizedString
 {
+    public static LocalizationKeyShowMode? OverridenKeyFlowMode { get; set; } = null;
     private string key;
 
     public string Key
@@ -16,7 +14,7 @@ public struct LocalizedString
             #if DEBUG_LOCALIZATION
             Value = key;
             #else
-            Value = ViewModelMain.Current.DebugSubViewModel?.LocalizationKeyShowMode switch
+            Value = OverridenKeyFlowMode switch
             {
                 LocalizationKeyShowMode.Key => Key,
                 LocalizationKeyShowMode.ValueKey => $"{GetValue(value)} ({Key})",

+ 11 - 5
src/PixiEditor/Models/UserPreferences/IPreferences.cs → src/PixiEditor.Extensions/Common/UserPreferences/IPreferences.cs

@@ -1,10 +1,8 @@
-using PixiEditor.ViewModels;
+namespace PixiEditor.Extensions.Common.UserPreferences;
 
-namespace PixiEditor.Models.UserPreferences;
-
-internal interface IPreferences
+public interface IPreferences
 {
-    public static IPreferences Current => ViewModelMain.Current.Preferences;
+    public static IPreferences Current { get; private set; }
 
     /// <summary>
     /// Saves the preferences to be stored permanently.
@@ -26,6 +24,9 @@ internal interface IPreferences
     /// <param name="action">The action that will be executed when the setting changes</param>
     public void AddCallback<T>(string name, Action<T> action);
 
+    public void RemoveCallback(string name, Action<object> action);
+    public void RemoveCallback<T>(string name, Action<T> action);
+
     /// <summary>
     /// Initializes the preferences.
     /// </summary>
@@ -85,4 +86,9 @@ internal interface IPreferences
     /// <param name="name">The name of the setting</param>
     /// <returns>The editor setting or the <paramref name="fallbackValue"/> if it has not been set yet</returns>
     public T? GetLocalPreference<T>(string name, T? fallbackValue);
+
+    protected static void SetAsCurrent(IPreferences provider)
+    {
+        Current = provider;
+    }
 }

+ 13 - 0
src/PixiEditor.Extensions/Common/UserPreferences/PreferencesConstants.cs

@@ -0,0 +1,13 @@
+namespace PixiEditor.Extensions.Common.UserPreferences;
+
+public static class PreferencesConstants
+{
+    public const string FavouritePalettes = "FavouritePalettes";
+    public const string RecentlyOpened = "RecentlyOpened";
+
+    public const string MaxOpenedRecently = "MaxOpenedRecently";
+    public const int MaxOpenedRecentlyDefault = 8;
+    public const string DisableNewsPanel = "DisableNewsPanel";
+    public const string LastCheckedNewsIds = "LastCheckedNewsIds";
+    public const string NewsPanelCollapsed = "NewsPanelCollapsed";
+}

+ 51 - 0
src/PixiEditor.Extensions/Extension.cs

@@ -0,0 +1,51 @@
+using System.Reflection;
+using Microsoft.Extensions.DependencyInjection;
+using PixiEditor.Extensions.Metadata;
+
+namespace PixiEditor.Extensions;
+
+/// <summary>
+///     This class is used to extend the functionality of the PixiEditor.
+/// </summary>
+public abstract class Extension
+{
+    public ExtensionServices Api { get; private set; }
+    public ExtensionMetadata Metadata { get; private set; }
+    public Assembly Assembly => GetType().Assembly;
+
+    public void ProvideMetadata(ExtensionMetadata metadata)
+    {
+        if (Metadata != null)
+        {
+            return;
+        }
+
+        Metadata = metadata;
+    }
+
+    public void Load()
+    {
+        OnLoaded();
+    }
+
+    public void Initialize(ExtensionServices api)
+    {
+        Api = api;
+        OnInitialized();
+    }
+
+    /// <summary>
+    ///     Called right after the extension is loaded. Not all extensions are initialized at this point. PixiEditor API at this point is not available.
+    ///     Use this method to load resources, patch language files, etc.
+    /// </summary>
+    protected virtual void OnLoaded()
+    {
+    }
+
+    /// <summary>
+    ///     Called after all extensions and PixiEditor is loaded. All extensions are initialized at this point.
+    /// </summary>
+    protected virtual void OnInitialized()
+    {
+    }
+}

+ 17 - 0
src/PixiEditor.Extensions/ExtensionServices.cs

@@ -0,0 +1,17 @@
+using Microsoft.Extensions.DependencyInjection;
+using PixiEditor.Extensions.Palettes;
+using PixiEditor.Extensions.Windowing;
+
+namespace PixiEditor.Extensions;
+
+public class ExtensionServices
+{
+    public IServiceProvider Services { get; private set; }
+    public IWindowProvider WindowProvider => Services.GetRequiredService<IWindowProvider>();
+    public IPaletteProvider PaletteProvider => Services.GetRequiredService<IPaletteProvider>();
+
+    public ExtensionServices(IServiceProvider services)
+    {
+        Services = services;
+    }
+}

+ 24 - 2
src/PixiEditor/Helpers/Extensions/EnumHelpers.cs → src/PixiEditor.Extensions/Helpers/EnumHelpers.cs

@@ -1,8 +1,8 @@
 using System.ComponentModel;
 
-namespace PixiEditor.Helpers.Extensions;
+namespace PixiEditor.Extensions.Helpers;
 
-internal static class EnumHelpers
+public static class EnumHelpers
 {
     public static IEnumerable<T> GetFlags<T>(this T e)
         where T : Enum
@@ -27,4 +27,26 @@ internal static class EnumHelpers
 
         return description;
     }
+    
+    public static string GetDescription(object enumValue)
+    {
+        if (!enumValue.GetType().IsEnum)
+        {
+            throw new ArgumentException("enumValue must be a enum", nameof(enumValue));
+        }
+        
+        var description = enumValue.ToString();
+        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
+
+        if (fieldInfo != null)
+        {
+            var attrs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
+            if (attrs != null && attrs.Length > 0)
+            {
+                description = ((DescriptionAttribute)attrs[0]).Description;
+            }
+        }
+
+        return description;
+    }
 }

+ 8 - 0
src/PixiEditor.Extensions/Metadata/Author.cs

@@ -0,0 +1,8 @@
+namespace PixiEditor.Extensions.Metadata;
+
+public class Author
+{
+    public string Name { get; init; }
+    public string Email { get; init; }
+    public string Website { get; init; }
+}

+ 17 - 0
src/PixiEditor.Extensions/Metadata/ExtensionMetadata.cs

@@ -0,0 +1,17 @@
+using PixiEditor.Extensions.Common.Localization;
+
+namespace PixiEditor.Extensions.Metadata;
+
+public class ExtensionMetadata
+{
+    public string UniqueName { get; init; }
+    public string DisplayName { get; init; }
+    public string Description { get; init; }
+    public Author? Author { get; init; }
+    public Author? Publisher { get; init; }
+    public Author[]? Contributors { get; init; }
+    public string Version { get; init; }
+    public string? License { get; init; }
+    public string[]? Categories { get; init; }
+    public LocalizationData? Localization { get; init; }
+}

+ 0 - 0
src/PixiEditor/Models/Enums/ColorsNumberMode.cs → src/PixiEditor.Extensions/Palettes/ColorsNumberMode.cs


+ 17 - 0
src/PixiEditor.Extensions/Palettes/ExtensionPalette.cs

@@ -0,0 +1,17 @@
+namespace PixiEditor.Extensions.Palettes;
+
+public class ExtensionPalette : IPalette
+{
+    public string Name { get; }
+    public List<PaletteColor> Colors { get; }
+    public bool IsFavourite { get; set; }
+    public string FileName { get; set; }
+    public PaletteListDataSource Source { get; }
+
+    public ExtensionPalette(string name, List<PaletteColor> colors, PaletteListDataSource source)
+    {
+        Name = name;
+        Colors = colors;
+        Source = source;
+    }
+}

+ 7 - 6
src/PixiEditor/Models/DataHolders/Palettes/FilteringSettings.cs → src/PixiEditor.Extensions/Palettes/FilteringSettings.cs

@@ -1,24 +1,25 @@
 using PixiEditor.Models.Enums;
 
-namespace PixiEditor.Models.DataHolders.Palettes;
+namespace PixiEditor.Extensions.Palettes;
 
-internal class FilteringSettings
+public sealed class FilteringSettings
 {
     public ColorsNumberMode ColorsNumberMode { get; set; }
     public int ColorsCount { get; set; }
     public string Name { get; set; }
-
     public bool ShowOnlyFavourites { get; set; }
+    public List<string> Favourites { get; set; }
 
-    public FilteringSettings(ColorsNumberMode colorsNumberMode, int colorsCount, string name, bool showOnlyFavourites)
+    public FilteringSettings(ColorsNumberMode colorsNumberMode, int colorsCount, string name, bool showOnlyFavourites, List<string> favourites)
     {
         ColorsNumberMode = colorsNumberMode;
         ColorsCount = colorsCount;
         Name = name;
         ShowOnlyFavourites = showOnlyFavourites;
+        Favourites = favourites;
     }
 
-    public bool Filter(Palette palette)
+    public bool Filter(IPalette palette)
     {
         // Lexical comparison
         bool result = string.IsNullOrWhiteSpace(Name) || palette.Name.Contains(Name, StringComparison.OrdinalIgnoreCase);
@@ -28,7 +29,7 @@ internal class FilteringSettings
             return false;
         }
 
-        result = (ShowOnlyFavourites && palette.IsFavourite) || !ShowOnlyFavourites;
+        result = (ShowOnlyFavourites && Favourites != null && Favourites.Contains(palette.Name)) || !ShowOnlyFavourites;
 
         if (!result)
         {

+ 10 - 0
src/PixiEditor.Extensions/Palettes/IPalette.cs

@@ -0,0 +1,10 @@
+namespace PixiEditor.Extensions.Palettes;
+
+public interface IPalette
+{
+    public string Name { get; }
+    public List<PaletteColor> Colors { get; }
+    public bool IsFavourite { get; }
+    public string FileName { get; set; }
+    public PaletteListDataSource Source { get; }
+}

+ 27 - 0
src/PixiEditor.Extensions/Palettes/IPaletteProvider.cs

@@ -0,0 +1,27 @@
+namespace PixiEditor.Extensions.Palettes;
+
+public interface IPaletteProvider
+{
+    /// <summary>
+    ///     Fetches palettes from the provider.
+    /// </summary>
+    /// <param name="startIndex">Starting fetch index. Palettes before said index won't be fetched.</param>
+    /// <param name="items">Max amount of palettes to fetch.</param>
+    /// <param name="filtering">Filtering settings for fetching.</param>
+    /// <returns>List of palettes.</returns>
+    public Task<List<IPalette>> FetchPalettes(int startIndex, int items, FilteringSettings filtering);
+
+    /// <summary>
+    ///     Adds a palette to the provider. This means that the palette will be saved in local storage.
+    /// </summary>
+    /// <param name="palette">Palette to save.</param>
+    /// <param name="overwrite">If true and palette with the same name exists, it will be overwritten. If false and palette with the same name exists, it will not be added.</param>
+    /// <returns>True if adding palette was successful.</returns>
+    public Task<bool> AddPalette(IPalette palette, bool overwrite = false);
+
+    /// <summary>
+    ///     Registers a palette list data source. This means that the provider will use the data source to fetch palettes.
+    /// </summary>
+    /// <param name="dataSource">Data source to register.</param>
+    public void RegisterDataSource(PaletteListDataSource dataSource);
+}

+ 56 - 0
src/PixiEditor.Extensions/Palettes/PaletteColor.cs

@@ -0,0 +1,56 @@
+namespace PixiEditor.Extensions.Palettes;
+
+public struct PaletteColor
+{
+    public static PaletteColor Empty => new(0, 0, 0);
+    public static PaletteColor Black => new(0, 0, 0);
+    public static PaletteColor White => new(255, 255, 255);
+    public byte R { get; set; }
+    public byte G { get; set; }
+    public byte B { get; set; }
+
+    public string Hex => $"#{R:X2}{G:X2}{B:X2}";
+
+    public PaletteColor(byte r, byte g, byte b)
+    {
+        R = r;
+        G = g;
+        B = b;
+    }
+
+    public override string ToString()
+    {
+        return Hex;
+    }
+
+    public static bool operator ==(PaletteColor left, PaletteColor right)
+    {
+        return left.R == right.R && left.G == right.G && left.B == right.B;
+    }
+
+    public static bool operator !=(PaletteColor left, PaletteColor right)
+    {
+        return !(left == right);
+    }
+
+    public static PaletteColor Parse(string hexString)
+    {
+        string hex = hexString.Replace("#", string.Empty);
+
+        if (hex.Length == 3)
+        {
+            hex = $"{hex[0]}{hex[0]}{hex[1]}{hex[1]}{hex[2]}{hex[2]}";
+        }
+
+        if (hex.Length != 6)
+        {
+            throw new ArgumentException("Invalid hex string. Expected format: RRGGBB");
+        }
+
+        byte r = Convert.ToByte(hex.Substring(0, 2), 16);
+        byte g = Convert.ToByte(hex.Substring(2, 2), 16);
+        byte b = Convert.ToByte(hex.Substring(4, 2), 16);
+
+        return new PaletteColor(r, g, b);
+    }
+}

+ 27 - 0
src/PixiEditor.Extensions/Palettes/PaletteListDataSource.cs

@@ -0,0 +1,27 @@
+using PixiEditor.Extensions.Common.Localization;
+using PixiEditor.Extensions.Palettes.Parsers;
+
+namespace PixiEditor.Extensions.Palettes;
+
+public abstract class PaletteListDataSource
+{
+    public LocalizedString Name { get; set; }
+
+    public PaletteListDataSource(LocalizedString name)
+    {
+        Name = name;
+        AvailableParsers = new List<PaletteFileParser>();
+    }
+
+    public virtual void Initialize() { }
+
+    /// <summary>
+    ///     Fetches palettes from the provider.
+    /// </summary>
+    /// <param name="startIndex">Starting fetch index. Palettes before said index won't be fetched.</param>
+    /// <param name="items">Max amount of palettes to fetch.</param>
+    /// <param name="filtering">Filtering settings for fetching.</param>
+    /// <returns>A List of palettes. Null if fetch wasn't successful.</returns>
+    public abstract Task<List<IPalette>> FetchPaletteList(int startIndex, int items, FilteringSettings filtering);
+    public List<PaletteFileParser> AvailableParsers { get; set; }
+}

+ 46 - 0
src/PixiEditor.Extensions/Palettes/Parsers/PaletteFileData.cs

@@ -0,0 +1,46 @@
+using PixiEditor.Extensions.Palettes;
+
+namespace PixiEditor.Models.IO;
+
+public class PaletteFileData
+{
+    public string Title { get; set; }
+    public PaletteColor[] Colors { get; set; }
+    public bool IsCorrupted { get; set; } = false;
+    public static PaletteFileData Corrupted => new ("Corrupted", Array.Empty<PaletteColor>()) { IsCorrupted = true };
+
+    public PaletteFileData(PaletteColor[] colors)
+    {
+        Colors = colors;
+        Title = "";
+    }
+
+    public PaletteFileData(List<string> colors)
+    {
+        Colors = new PaletteColor[colors.Count];
+        for (int i = 0; i < colors.Count; i++)
+        {
+            Colors[i] = PaletteColor.Parse(colors[i]);
+        }
+
+        Title = "";
+    }
+
+    public PaletteFileData(string title, PaletteColor[] colors)
+    {
+        Title = title;
+        Colors = colors;
+    }
+
+    public PaletteColor[] GetPaletteColors()
+    {
+        PaletteColor[] colors = new PaletteColor[Colors.Length];
+        for (int i = 0; i < Colors.Length; i++)
+        {
+            PaletteColor color = Colors[i];
+            colors[i] = new PaletteColor(color.R, color.G, color.B);
+        }
+
+        return colors;
+    }
+}

+ 3 - 2
src/PixiEditor/Models/IO/PaletteFileParser.cs → src/PixiEditor.Extensions/Palettes/Parsers/PaletteFileParser.cs

@@ -1,8 +1,9 @@
 using System.IO;
+using PixiEditor.Models.IO;
 
-namespace PixiEditor.Models.IO;
+namespace PixiEditor.Extensions.Palettes.Parsers;
 
-internal abstract class PaletteFileParser
+public abstract class PaletteFileParser
 {
     public abstract Task<PaletteFileData> Parse(string path);
     public abstract Task<bool> Save(string path, PaletteFileData data);

+ 21 - 0
src/PixiEditor.Extensions/PixiEditor.Extensions.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net7.0-windows</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+      <UseWPF>true</UseWPF>
+      <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
+      <Version>0.0.3</Version>
+      <Title>PixiEditor Extensions</Title>
+      <Authors>PixiEditor Organization</Authors>
+      <Copyright>PixiEditor Organization</Copyright>
+      <Description>Package for creating custom extensions for pixel art editor PixiEditor</Description>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+      <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
+      <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+    </ItemGroup>
+</Project>

+ 38 - 0
src/PixiEditor.Extensions/UI/ExternalProperty.cs

@@ -0,0 +1,38 @@
+using System.Windows;
+using System.Windows.Data;
+using PixiEditor.Extensions.Common.Localization;
+
+namespace PixiEditor.Views;
+
+public abstract class ExternalProperty
+{
+    public Type PropertyType { get; set; }
+
+    public Action<DependencyObject, Binding>? SetTranslationBinding { get; set; }
+    public Action<DependencyObject, LocalizedString>? SetTranslation { get; set; }
+
+    public ExternalProperty(Type propertyType, Action<DependencyObject, Binding> setTranslationBinding)
+    {
+        PropertyType = propertyType;
+        SetTranslationBinding = setTranslationBinding;
+    }
+
+    public ExternalProperty(Type propertyType, Action<DependencyObject, LocalizedString> translationAction)
+    {
+        PropertyType = propertyType;
+        SetTranslation = translationAction;
+    }
+}
+
+public class ExternalProperty<T> : ExternalProperty
+{
+    public ExternalProperty(Action<DependencyObject, Binding> setTranslationBinding) : base(typeof(T), setTranslationBinding)
+    {
+    }
+
+    public ExternalProperty(Action<DependencyObject, LocalizedString> translationAction) : base(typeof(T), translationAction)
+    {
+    }
+}
+
+

+ 10 - 0
src/PixiEditor.Extensions/UI/ICustomTranslatorElement.cs

@@ -0,0 +1,10 @@
+using System.Windows;
+using System.Windows.Data;
+
+namespace PixiEditor.Views;
+
+public interface ICustomTranslatorElement
+{
+    public void SetTranslationBinding(DependencyProperty dependencyProperty, Binding binding);
+    public DependencyProperty GetDependencyProperty();
+}

+ 67 - 9
src/PixiEditor/Views/Translator.cs → src/PixiEditor.Extensions/UI/Translator.cs

@@ -2,14 +2,16 @@
 using System.Windows.Controls;
 using System.Windows.Data;
 using System.Windows.Documents;
-using AvalonDock.Layout;
-using PixiEditor.Localization;
-using PixiEditor.Views.Dialogs;
+using PixiEditor.Extensions.Common.Localization;
+using PixiEditor.Extensions.Helpers;
+using PixiEditor.Views;
 
-namespace PixiEditor.Views;
+namespace PixiEditor.Extensions.UI;
 
 public class Translator : UIElement
 {
+    public static List<ExternalProperty> ExternalProperties { get; } = new();
+
     public static readonly DependencyProperty KeyProperty = DependencyProperty.RegisterAttached(
         "Key",
         typeof(string),
@@ -22,6 +24,12 @@ public class Translator : UIElement
         typeof(Translator),
         new FrameworkPropertyMetadata(default(LocalizedString), FrameworkPropertyMetadataOptions.AffectsRender, LocalizedStringPropertyChangedCallback));
 
+    public static readonly DependencyProperty EnumProperty = DependencyProperty.RegisterAttached(
+        "Enum",
+        typeof(object),
+        typeof(Translator),
+        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, EnumPropertyChangedCallback));
+
     public static readonly DependencyProperty TooltipKeyProperty = DependencyProperty.RegisterAttached(
         "TooltipKey", typeof(string), typeof(Translator), 
         new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.AffectsRender, TooltipKeyPropertyChangedCallback));
@@ -51,11 +59,16 @@ public class Translator : UIElement
 
         dependencyObject.SetValue(FrameworkElement.ToolTipProperty, newLocalizedString.Value);
     }
-
-
+    
     private static void TooltipKeyPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         d.SetValue(FrameworkElement.ToolTipProperty, new LocalizedString(GetTooltipKey(d)).Value);
+
+        if (ILocalizationProvider.Current == null)
+        {
+            return;
+        }
+        
         ILocalizationProvider.Current.OnLanguageChanged += (lang) => OnLanguageChangedTooltipKey(d, lang);
     }
 
@@ -92,6 +105,12 @@ public class Translator : UIElement
         if (e.NewValue is string key)
         {
             UpdateKey(d, key);
+            
+            if (ILocalizationProvider.Current == null)
+            {
+                return;
+            }
+
             ILocalizationProvider.Current.OnLanguageChanged += (lang) => OnLanguageChangedKey(d, lang);
         }
     }
@@ -101,6 +120,17 @@ public class Translator : UIElement
         d.SetValue(KeyProperty, ((LocalizedString)e.NewValue).Key);
     }
 
+    private static void EnumPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
+    {
+        if (e.NewValue == null)
+        {
+            d.SetValue(KeyProperty, null);
+            return;
+        }
+        
+        d.SetValue(KeyProperty, EnumHelpers.GetDescription(e.NewValue));
+    }
+
     private static void UpdateKey(DependencyObject d, string key)
     {
         var parameters = GetLocalizedString(d).Parameters;
@@ -111,7 +141,24 @@ public class Translator : UIElement
             RelativeSource = new RelativeSource(RelativeSourceMode.Self)
         };
 
-        if (d is TextBox textBox)
+        ExternalProperty externalProperty = ExternalProperties.FirstOrDefault(x => x.PropertyType.IsAssignableFrom(d.GetType()));
+
+        if (d is ICustomTranslatorElement customTranslatorElement)
+        {
+            customTranslatorElement.SetTranslationBinding(customTranslatorElement.GetDependencyProperty(), binding);
+        }
+        else if (externalProperty != null)
+        {
+            if (externalProperty.SetTranslationBinding != null)
+            {
+                externalProperty.SetTranslationBinding(d, binding);
+            }
+            else
+            {
+                externalProperty.SetTranslation(d, localizedString);
+            }
+        }
+        else if (d is TextBox textBox)
         {
             textBox.SetBinding(TextBox.TextProperty, binding);
         }
@@ -123,6 +170,10 @@ public class Translator : UIElement
         {
             run.SetBinding(Run.TextProperty, binding);
         }
+        else if (d is Window window)
+        {
+            window.SetBinding(Window.TitleProperty, binding);
+        }
         else if (d is ContentControl contentControl)
         {
             contentControl.SetBinding(ContentControl.ContentProperty, binding);
@@ -131,10 +182,12 @@ public class Translator : UIElement
         {
             menuItem.SetBinding(HeaderedItemsControl.HeaderProperty, binding);
         }
-        else if (d is LayoutContent layoutContent)
+#if DEBUG
+        else
         {
-            layoutContent.SetValue(LayoutContent.TitleProperty, localizedString.Value);
+            throw new ArgumentException($"'{d.GetType().Name}' does not support {nameof(Translator)}.Key");
         }
+        #endif
 
         d.SetValue(ValueProperty, localizedString.Value);
     }
@@ -154,6 +207,11 @@ public class Translator : UIElement
         element.SetValue(LocalizedStringProperty, value);
     }
 
+    public static void SetEnum(DependencyObject element, object value)
+    {
+        element.SetValue(EnumProperty, value);
+    }
+
     public static LocalizedString GetLocalizedString(DependencyObject element)
     {
         return (LocalizedString)element.GetValue(LocalizedStringProperty);

+ 12 - 0
src/PixiEditor.Extensions/Windowing/IPopupWindow.cs

@@ -0,0 +1,12 @@
+namespace PixiEditor.Extensions;
+
+public interface IPopupWindow
+{
+    public string UniqueId { get; }
+    public string Title { get; set; }
+    public void Show();
+    public void Close();
+    public bool? ShowDialog();
+    public double Width { get; set; }
+    public double Height { get; set; }
+}

+ 15 - 0
src/PixiEditor.Extensions/Windowing/IWindowProvider.cs

@@ -0,0 +1,15 @@
+using System.Windows.Controls;
+
+namespace PixiEditor.Extensions.Windowing;
+
+public interface IWindowProvider
+{
+    public PopupWindow CreatePopupWindow(string title, object body);
+    public PopupWindow OpenWindow(WindowType type);
+    public PopupWindow OpenWindow(string windowId);
+}
+
+public enum WindowType
+{
+    BrowserPalette
+}

+ 34 - 0
src/PixiEditor.Extensions/Windowing/PopupWindow.cs

@@ -0,0 +1,34 @@
+namespace PixiEditor.Extensions.Windowing;
+
+public class PopupWindow : IPopupWindow
+{
+    public string UniqueId => _underlyingWindow.UniqueId;
+
+    private IPopupWindow _underlyingWindow;
+
+    public PopupWindow(IPopupWindow basicPopup)
+    {
+        _underlyingWindow = basicPopup;
+    }
+
+    public string Title
+    {
+        get => _underlyingWindow.Title;
+        set => _underlyingWindow.Title = value;
+    }
+
+    public void Show() => _underlyingWindow.Show();
+    public void Close() => _underlyingWindow.Close();
+
+    public bool? ShowDialog() => _underlyingWindow.ShowDialog();
+    public double Width
+    {
+        get => _underlyingWindow.Width;
+        set => _underlyingWindow.Width = value;
+    }
+    public double Height
+    {
+        get => _underlyingWindow.Height;
+        set => _underlyingWindow.Height = value;
+    }
+}

+ 1 - 1
src/PixiEditor.MSIX/PixiEditor.MSIX.wapproj

@@ -56,7 +56,6 @@
     <DefaultLanguage>en-US</DefaultLanguage>
     <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
     <EntryPointProjectUniqueName>..\PixiEditor\PixiEditor.csproj</EntryPointProjectUniqueName>
-    <PackageCertificateKeyFile>PixiEditor.MSIX_TemporaryKey.pfx</PackageCertificateKeyFile>
     <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
     <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
     <AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
@@ -64,6 +63,7 @@
     <AppxBundlePlatforms>x86|x64</AppxBundlePlatforms>
     <GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>
     <HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
+    <PackageCertificateThumbprint>22A93FB097222C16145701D346AE19000A37094E</PackageCertificateThumbprint>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <OutputPath>bin\Debug\</OutputPath>

+ 24 - 0
src/PixiEditor.Platform.MSStore/MSAdditionalContentProvider.cs

@@ -0,0 +1,24 @@
+namespace PixiEditor.Platform.MSStore;
+
+public sealed class MSAdditionalContentProvider : IAdditionalContentProvider
+{
+    public bool IsContentInstalled(AdditionalContentProduct product)
+    {
+        if(!PlatformHasContent(product)) return false;
+
+        return product switch
+        {
+            AdditionalContentProduct.SupporterPack => false,
+            _ => false
+        };
+    }
+
+    public bool PlatformHasContent(AdditionalContentProduct product)
+    {
+        return product switch
+        {
+            AdditionalContentProduct.SupporterPack => false,
+            _ => false
+        };
+    }
+}

+ 14 - 0
src/PixiEditor.Platform.MSStore/MicrosoftStorePlatform.cs

@@ -0,0 +1,14 @@
+namespace PixiEditor.Platform.MSStore;
+
+public sealed class MicrosoftStorePlatform : IPlatform
+{
+    public string Id { get; } = "ms-store";
+    public string Name => "Microsoft Store";
+
+    public bool PerformHandshake()
+    {
+        return true;
+    }
+
+    public IAdditionalContentProvider? AdditionalContentProvider { get; } = new MSAdditionalContentProvider();
+}

+ 13 - 0
src/PixiEditor.Platform.MSStore/PixiEditor.Platform.MSStore.csproj

@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net7.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.Platform\PixiEditor.Platform.csproj" />
+    </ItemGroup>
+
+</Project>

+ 13 - 0
src/PixiEditor.Platform.Standalone/PixiEditor.Platform.Standalone.csproj

@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net7.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.Platform\PixiEditor.Platform.csproj" />
+    </ItemGroup>
+
+</Project>

+ 15 - 0
src/PixiEditor.Platform.Standalone/StandaloneAdditionalContentProvider.cs

@@ -0,0 +1,15 @@
+namespace PixiEditor.Platform.Standalone;
+
+public sealed class StandaloneAdditionalContentProvider : IAdditionalContentProvider
+{
+    public bool IsContentInstalled(AdditionalContentProduct product)
+    {
+        //if(!PlatformHasContent(product)) return false;
+        return false;
+    }
+
+    public bool PlatformHasContent(AdditionalContentProduct product)
+    {
+        return false;
+    }
+}

+ 14 - 0
src/PixiEditor.Platform.Standalone/StandalonePlatform.cs

@@ -0,0 +1,14 @@
+namespace PixiEditor.Platform.Standalone;
+
+public sealed class StandalonePlatform : IPlatform
+{
+    public string Id { get; } = "standalone";
+    public string Name => "Standalone";
+
+    public bool PerformHandshake()
+    {
+        return true;
+    }
+
+    public IAdditionalContentProvider? AdditionalContentProvider { get; } = new StandaloneAdditionalContentProvider();
+}

+ 38 - 0
src/PixiEditor.Platform.Steam/PixiEditor.Platform.Steam.csproj

@@ -0,0 +1,38 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net7.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.Platform\PixiEditor.Platform.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Steamworks.NET" Version="20.1.0" />
+    </ItemGroup>
+
+  <ItemGroup Condition="'$(Platform)' == 'x86'">
+    <None Update="steam_api.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(Platform)' == 'AnyCPU'">
+    <None Update="steam_api.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Update="steam_api64.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(Platform)' == 'x64'">
+    <None Update="steam_api64.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>

+ 24 - 0
src/PixiEditor.Platform.Steam/SteamAdditionalContentProvider.cs

@@ -0,0 +1,24 @@
+using Steamworks;
+
+namespace PixiEditor.Platform.Steam;
+
+public sealed class SteamAdditionalContentProvider : IAdditionalContentProvider
+{
+    private Dictionary<AdditionalContentProduct, AppId_t> productIds = new()
+    {
+        { AdditionalContentProduct.SupporterPack, new AppId_t(2435860) }
+    };
+
+    public bool IsContentInstalled(AdditionalContentProduct product)
+    {
+        if(!PlatformHasContent(product)) return false;
+
+        AppId_t appId = productIds[product];
+        return SteamApps.BIsDlcInstalled(appId);
+    }
+
+    public bool PlatformHasContent(AdditionalContentProduct product)
+    {
+        return productIds.ContainsKey(product);
+    }
+}

+ 24 - 0
src/PixiEditor.Platform.Steam/SteamPlatform.cs

@@ -0,0 +1,24 @@
+using Steamworks;
+
+namespace PixiEditor.Platform.Steam;
+
+public class SteamPlatform : IPlatform
+{
+    public string Id { get; } = "steam";
+    public string Name => "Steam";
+
+    public bool PerformHandshake()
+    {
+        try
+        {
+            SteamAPI.Init();
+            return true;
+        }
+        catch
+        {
+            return false;
+        }
+    }
+
+    public IAdditionalContentProvider? AdditionalContentProvider { get; } = new SteamAdditionalContentProvider();
+}

BIN
src/PixiEditor.Platform.Steam/steam_api.dll


BIN
src/PixiEditor.Platform.Steam/steam_api64.dll


+ 12 - 0
src/PixiEditor.Platform/IAdditionalContentProvider.cs

@@ -0,0 +1,12 @@
+namespace PixiEditor.Platform;
+
+public enum AdditionalContentProduct
+{
+    SupporterPack
+}
+
+public interface IAdditionalContentProvider
+{
+    public bool IsContentInstalled(AdditionalContentProduct product);
+    public bool PlatformHasContent(AdditionalContentProduct product);
+}

+ 20 - 0
src/PixiEditor.Platform/IPlatform.cs

@@ -0,0 +1,20 @@
+namespace PixiEditor.Platform;
+
+public interface IPlatform
+{
+    public static IPlatform Current { get; private set; }
+    public abstract string Id { get; }
+    public abstract string Name { get; }
+    public bool PerformHandshake();
+    public IAdditionalContentProvider? AdditionalContentProvider { get; }
+
+    public static void RegisterPlatform(IPlatform platform)
+    {
+        if (Current != null)
+        {
+            throw new InvalidOperationException("Platform already initialized.");
+        }
+
+        Current = platform;
+    }
+}

+ 13 - 0
src/PixiEditor.Platform/PixiEditor.Platform.csproj

@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net7.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
+    </ItemGroup>
+
+</Project>

+ 19 - 0
src/PixiEditor.Platform/PlatformServiceCollection.cs

@@ -0,0 +1,19 @@
+using System.Reflection;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace PixiEditor.Platform;
+
+public static class PlatformServiceCollection
+{
+    public static IServiceCollection AddPlatform(this IServiceCollection services)
+    {
+        if(IPlatform.Current == null)
+            throw new InvalidOperationException("No platform was found");
+
+        services.AddSingleton(IPlatform.Current);
+
+        if (IPlatform.Current.AdditionalContentProvider != null)
+            services.AddSingleton(IPlatform.Current.AdditionalContentProvider);
+        return services;
+    }
+}

+ 0 - 1
src/PixiEditor.UpdateModule/PixiEditor.UpdateModule.csproj

@@ -5,7 +5,6 @@
     <Platforms>AnyCPU;x64;x86</Platforms>
     <Configurations>Debug;Release;Steam;DevRelease</Configurations>
     <PlatformTarget>AnyCPU</PlatformTarget>
-    <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">

+ 38 - 8
src/PixiEditor.UpdateModule/UpdateInstaller.cs

@@ -2,7 +2,6 @@
 using System.Diagnostics;
 using System.IO;
 using System.IO.Compression;
-using System.Threading;
 
 namespace PixiEditor.UpdateModule;
 
@@ -47,8 +46,7 @@ public class UpdateInstaller
         ZipFile.ExtractToDirectory(ArchiveFileName, UpdateFilesPath, true);
         Progress = 25; // 25% for unzip
         string dirWithFiles = Directory.GetDirectories(UpdateFilesPath)[0];
-        string[] files = Directory.GetFiles(dirWithFiles);
-        CopyFilesToDestination(files);
+        CopyFilesToDestination(dirWithFiles);
         DeleteArchive();
         Progress = 100;
     }
@@ -59,16 +57,48 @@ public class UpdateInstaller
         Directory.Delete(UpdateFilesPath, true);
     }
 
-    private void CopyFilesToDestination(string[] files)
+    private void CopyFilesToDestination(string sourceDirectory)
     {
-        float fileCopiedVal = 74f / files.Length; // 74% is reserved for copying
-        string destinationDir = TargetDirectory;
+        int totalFiles = Directory.GetFiles(UpdateFilesPath, "*", SearchOption.AllDirectories).Length;
+
+        string[] files = Directory.GetFiles(sourceDirectory);
+        float fileCopiedVal = 74f / totalFiles; // 74% is reserved for copying
+
         foreach (string file in files)
         {
             string targetFileName = Path.GetFileName(file);
-            File.Copy(file, Path.Join(destinationDir, targetFileName), true);
+            File.Copy(file, Path.Join(TargetDirectory, targetFileName), true);
             Progress += fileCopiedVal;
-            Thread.Sleep(1000);
+        }
+
+        CopySubDirectories(sourceDirectory, TargetDirectory, fileCopiedVal);
+    }
+
+    private void CopySubDirectories(string originDirectory, string targetDirectory, float percentPerFile)
+    {
+        string[] subDirs = Directory.GetDirectories(originDirectory);
+        if(subDirs.Length == 0) return;
+
+        foreach (string subDir in subDirs)
+        {
+            string targetDirPath = Path.Join(targetDirectory, Path.GetFileName(subDir));
+
+            CopySubDirectories(subDir, targetDirPath, percentPerFile);
+
+            string[] files = Directory.GetFiles(subDir);
+
+            if (!Directory.Exists(targetDirPath))
+            {
+                Directory.CreateDirectory(targetDirPath);
+            }
+
+            foreach (string file in files)
+            {
+                string targetFileName = Path.GetFileName(file);
+                File.Copy(file, Path.Join(targetDirPath, targetFileName), true);
+            }
+
+            Progress += percentPerFile;
         }
     }
 }

+ 27 - 2
src/PixiEditor.Zoombox/PixiEditor.Zoombox.csproj

@@ -6,8 +6,7 @@
     <UseWPF>true</UseWPF>
     <WarningsAsErrors>Nullable</WarningsAsErrors>
     <Configurations>Debug;Release;Steam;DevRelease</Configurations>
-    <Platforms>AnyCPU;x64;x86</Platforms>
-    <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
+    <Platforms>AnyCPU</Platforms>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|AnyCPU'">
@@ -16,10 +15,36 @@
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x64'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Steam|x86'">
     <Optimize>True</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DevRelease|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <ItemGroup>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 479 - 307
src/PixiEditor.sln


+ 70 - 6
src/PixiEditor/App.xaml.cs

@@ -1,11 +1,15 @@
 using System.IO;
 using System.Text.RegularExpressions;
 using System.Windows;
-using PixiEditor.Localization;
+using System.Windows.Media;
+using PixiEditor.Extensions.Common.Localization;
+using PixiEditor.Models.AppExtensions;
+using PixiEditor.Helpers.UI;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Dialogs;
 using PixiEditor.Models.Enums;
+using PixiEditor.Platform;
 using PixiEditor.Views;
 using PixiEditor.Views.Dialogs;
 
@@ -40,11 +44,49 @@ internal partial class App : Application
             return;
         }
 
-        if (HandleNewInstance())
+        #if !STEAM
+        if (!HandleNewInstance())
         {
-            MainWindow = new MainWindow();
-            MainWindow.Show();
+            return;
         }
+        #endif
+
+        AddNativeAssets();
+
+        InitPlatform();
+
+        ExtensionLoader extensionLoader = new ExtensionLoader();
+        extensionLoader.LoadExtensions();
+
+        MainWindow = new MainWindow(extensionLoader);
+        MainWindow.Show();
+    }
+
+    private void InitPlatform()
+    {
+        var platform = GetActivePlatform();
+        IPlatform.RegisterPlatform(platform);
+        platform.PerformHandshake();
+    }
+
+    private IPlatform GetActivePlatform()
+    {
+#if STEAM
+        return new PixiEditor.Platform.Steam.SteamPlatform();
+#elif MSIX || MSIX_DEBUG
+        return new PixiEditor.Platform.MSStore.MicrosoftStorePlatform();
+#else
+        return new PixiEditor.Platform.Standalone.StandalonePlatform();
+#endif
+    }
+
+    private void AddNativeAssets()
+    {
+        var iconFont = OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000)
+            ? "Segoe Fluent Icons"
+            : "Segoe MDL2 Assets";
+        
+        Resources.Add("NativeIconFont", new FontFamily(iconFont));
     }
 
     private bool HandleNewInstance()
@@ -55,6 +97,9 @@ internal partial class App : Application
 
         GC.KeepAlive(_mutex);
 
+        if (Current?.Dispatcher == null)
+            return true;
+
         if (isOwned)
         {
             var thread = new Thread(
@@ -72,7 +117,7 @@ internal partial class App : Application
                                     List<string> args = new List<string>();
                                     if (File.Exists(passedArgsFile))
                                     {
-                                        args = File.ReadAllText(passedArgsFile).Split(' ').ToList();
+                                        args = CommandLineHelpers.SplitCommandLine(File.ReadAllText(passedArgsFile)).ToList();
                                         File.Delete(passedArgsFile);
                                     }
                                     
@@ -93,7 +138,7 @@ internal partial class App : Application
         }
 
         // Notify other instance so it could bring itself to foreground.
-        File.WriteAllText(passedArgsFile, string.Join(' ', Environment.GetCommandLineArgs()));
+        File.WriteAllText(passedArgsFile, string.Join(' ', WrapSpaces(Environment.GetCommandLineArgs())));
         _eventWaitHandle.Set();
 
         // Terminate this instance.
@@ -101,6 +146,25 @@ internal partial class App : Application
         return false;
     }
 
+    private string?[] WrapSpaces(string[] args)
+    {
+        string?[] wrappedArgs = new string?[args.Length];
+        for (int i = 0; i < args.Length; i++)
+        {
+            string arg = args[i];
+            if (arg.Contains(' '))
+            {
+                wrappedArgs[i] = $"\"{arg}\"";
+            }
+            else
+            {
+                wrappedArgs[i] = arg;
+            }
+        }
+
+        return wrappedArgs;
+    }
+
     protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
     {
         base.OnSessionEnding(e);

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/ar.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "الملفات الاخيرة",
+  "OPEN_FILE": "فتح ملف",
+  "NEW_FILE": "جديد",
+  "RECENT_EMPTY_TEXT": "الكثير من المساحات الفارغة",
+  "LANGUAGE": "اللغة",
+  "GENERAL": "العامة",
+  "DISCORD": "ديسكورد",
+  "KEY_BINDINGS": "ارتباطات المفاتيح",
+  "MISC": "متنوع",
+  "SHOW_STARTUP_WINDOW": "عرض نافذة بدء التشغيل",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "عرض معاينة الصورة في شريط المهام",
+  "RECENT_FILE_LENGTH": "طول قائمة الملفات الاخيرة",
+  "RECENT_FILE_LENGTH_TOOLTIP": "كم عدد المستندات التي يتم اضهارها في ملف > الملفات الاخيرة. الافتراضي: 8",
+  "DEFAULT_NEW_SIZE": "الحجم الافتراضي للملف الجديد",
+  "WIDTH": "العرض",
+  "HEIGHT": "الطول",
+  "TOOLS": "ألادوات",
+  "ENABLE_SHARED_TOOLBAR": "تمكين شريط الادوات المشترك",
+  "AUTOMATIC_UPDATES": "التحديثات التلقائية",
+  "CHECK_FOR_UPDATES": "تحقق من التحديثات عند بدء التشغيل",
+  "UPDATE_STREAM": "مصدر التحديث",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "لا يمكن تغيير قنوات التحديث إلا في إصدار مستقل (يتم تنزيله من https://pixieditor.net).\nتتعامل إصدارات Steam و Microsoft Store مع التحديثات بشكل منفصل.",
+  "DEBUG": "معالجة",
+  "ENABLE_DEBUG_MODE": "تفعيل وضع المعالجة",
+  "OPEN_CRASH_REPORTS_DIR": "افتح دليل تقارير الاعطال",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "مفعل",
+  "SHOW_IMAGE_NAME": "اضهار اسم الصورة",
+  "SHOW_IMAGE_SIZE": "اضهار حجم الصورة",
+  "SHOW_LAYER_COUNT": "اضهار عدد الطبقات",
+  "FILE": "ملف",
+  "RECENT": "مؤخرًا",
+  "OPEN": "فتح",
+  "SAVE_PIXI": "حفض ( .pixi )",
+  "SAVE_AS_PIXI": "حفض جديد ك ( .pixi )",
+  "EXPORT_IMG": "تصدير (png, .jpg., الخ.)",
+  "EDIT": "تعديل",
+  "EXIT": "خروج",
+  "PERCENTAGE": "نسبة مئوية",
+  "ABSOLUTE": "مطلق",
+  "PRESERVE_ASPECT_RATIO": "الإحتفاظ بنسبة العرض للإرتفاع",
+  "ANCHOR_POINT": "نقاط الربط",
+  "RESIZE_IMAGE": "تغيير حجم الصورة",
+  "RESIZE": "تغيير الحجم",
+  "DOCUMENTATION": "التعليمات",
+  "WEBSITE": "الموقع",
+  "OPEN_WEBSITE": "فتح الموقع",
+  "REPOSITORY": "Repository",
+  "OPEN_REPOSITORY": "فتح Repository",
+  "LICENSE": "رخصة",
+  "OPEN_LICENSE": "فتح الترخيص",
+  "THIRD_PARTY_LICENSES": "تراخيص الطرف الثالث",
+  "OPEN_THIRD_PARTY_LICENSES": "فتح تراخيص الطرف الثالث",
+  "APPLY_TRANSFORM": "تطبيق التحويل",
+  "INCREASE_TOOL_SIZE": "زيادة حجم الأداة",
+  "DECREASE_TOOL_SIZE": "تقليل حجم الأداة",
+  "TO_INSTALL_UPDATE": "لتنزيل التحديث {0}",
+  "DOWNLOADING_UPDATE": "تحميل التحديث...",
+  "UPDATE_READY": "التحديث جاهز للتثبيت. هل تريد تثبيته الآن؟",
+  "NEW_UPDATE": "تحديث جديد",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "تعذر التحديث بدون امتيازات المسؤول. الرجاء تشغيل PixiEditor كمسؤول.",
+  "INSUFFICIENT_PERMISSIONS": "أذونات غير كافية",
+  "UPDATE_CHECK_FAILED": "فشل التحقق من التحديث",
+  "COULD_NOT_CHECK_FOR_UPDATES": "تعذر التحقق مما إذا كان هناك تحديث متوفر.",
+  "VERSION": "الاصدار {0}",
+  "OPEN_TEMP_DIR": "افتح الدليل temp",
+  "OPEN_LOCAL_APPDATA_DIR": "افتح دليل Local AppData",
+  "OPEN_ROAMING_APPDATA_DIR": "افتح دليل Roaming AppData",
+  "OPEN_INSTALLATION_DIR": "افتح دليل التثبيت",
+  "DUMP_ALL_COMMANDS": "تفريغ كل الأوامر",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "تفريغ كل الأوامر في ملف نصي",
+  "CRASH": "توقيف",
+  "CRASH_APP": "توقيف البرنامج",
+  "DELETE_USR_PREFS": "حذف تفضيلات المستخدم (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "حذف ملف الاختصار (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "حذف بيانات البرنامج (Roaming AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "إنشاء قالب روابط المفاتيح",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "إنشاء قالب json لربط المفاتيح",
+  "VALIDATE_SHORTCUT_MAP": "تحقق من صحة الاختصار",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "تحقق من صحة الاختصار",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "مفاتيح فارغة: {0}\nأوامر غير معروفة: {1}",
+  "RESULT": "نتيجة",
+  "CLEAR_RECENT_DOCUMENTS": "مسح المستندات الأخيرة",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "مسح المستندات التي تم فتحها مؤخرًا",
+  "OPEN_CMD_DEBUG_WINDOW": "افتح نافذة تصحيح أخطاء الأمر",
+  "PATH_DOES_NOT_EXIST": "{0} غير موجود.",
+  "LOCATION_DOES_NOT_EXIST": "الموقع غير موجود.",
+  "FILE_NOT_FOUND": "لم يتم العثور على الملف.",
+  "ARE_YOU_SURE": "هل انت متاكد؟",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "هل أنت متأكد أنك تريد حذف {0}؟\nستفقد هذه البيانات لجميع التركيبات.\n(مسار كامل: {1})",
+  "FAILED_TO_OPEN_FILE": "فشل في فتح الملف",
+  "OLD_FILE_FORMAT": "تنسيق الملف القديم",
+  "OLD_FILE_FORMAT_DESCRIPTION": "يستخدم ملف pixi هذا التنسيق القديم ،\n  التي لم تعد مدعومة ولا يمكن فتحها.",
+  "NOTHING_FOUND": "لم يتم العثور على شيء",
+  "EXPORT": "تصدير",
+  "EXPORT_IMAGE": "تصدير الصورة",
+  "IMPORT": "اضافة",
+  "SHORTCUT_TEMPLATES": "اختصارات القوالب",
+  "RESET_ALL": "إعادة ضبط الكل",
+  "LAYER": "طبقة",
+  "LAYER_DELETE_SELECTED": "حذف الطبقة/المجلد النشط",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "حذف الطبقة أو المجلد النشط",
+  "LAYER_DELETE_ALL_SELECTED": "احذف جميع الطبقات / المجلدات المحددة",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "احذف كل الطبقات و / أو المجلدات المحددة",
+  "DELETE_SELECTED_PIXELS": "حذف البكسلات المحددة",
+  "NEW_FOLDER": "مجلد جديد",
+  "CREATE_NEW_FOLDER": "انشاء مجلد جديد",
+  "NEW_LAYER": "طبقة جديدة",
+  "CREATE_NEW_LAYER": "انشاء طبقة جديدة",
+  "NEW_IMAGE": "صورة جديدة",
+  "CREATE_NEW_IMAGE": "انشاء صورة جديدة",
+  "SAVE": "حفض",
+  "SAVE_AS": "حفض جديد...",
+  "IMAGE": "صورة",
+  "SAVE_IMAGE": "حفض الصورة",
+  "SAVE_IMAGE_AS": "حفض الصورة كجديدة",
+  "DUPLICATE": "تكرار",
+  "DUPLICATE_SELECTED_LAYER": "تكرار الطبقة المجددة",
+  "CREATE_MASK": "انشاء قناع",
+  "DELETE_MASK": "حذف قناع",
+  "TOGGLE_MASK": "تبديل القناع",
+  "APPLY_MASK": "تطبيق القناع",
+  "TOGGLE_VISIBILITY": "تبديل الرؤية",
+  "MOVE_MEMBER_UP": "حرك العضو لأعلى",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "انقل الطبقة أو المجلد المحدد لأعلى",
+  "MOVE_MEMBER_DOWN": "حرك العضو لأسفل",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "انقل الطبقة أو المجلد المحدد لأسفل",
+  "MERGE_ALL_SELECTED_LAYERS": "دمج كل الطبقات المحددة",
+  "MERGE_WITH_ABOVE": "دمج الطبقة المحددة أعلاه",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "دمج الطبقة المحددة مع الطبقة التي فوقها",
+  "MERGE_WITH_BELOW": "دمج الطبقة المحددة أدناه",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "دمج الطبقة المحددة مع الطبقة الموجودة تحتها",
+  "ADD_REFERENCE_LAYER": "أضف طبقة مرجعية",
+  "DELETE_REFERENCE_LAYER": "احذف الطبقة المرجعية",
+  "TRANSFORM_REFERENCE_LAYER": "تحويل الطبقة المرجعية",
+  "TOGGLE_REFERENCE_LAYER_POS": "تبديل موضع الطبقة المرجعية",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "تبديل الطبقة المرجعية بين الأعلى أو الأكثر أدناه",
+  "RESET_REFERENCE_LAYER_POS": "إعادة تعيين موضع الطبقة المرجعية",
+  "CLIP_CANVAS": "Clip Canvas",
+  "FLIP_IMG_VERTICALLY": "قلب الصورة عموديًا",
+  "FLIP_IMG_HORIZONTALLY": "قلب الصورة أفقيًا",
+  "FLIP_LAYERS_VERTICALLY": "قلب الطبقات المحددة عموديًا",
+  "FLIP_LAYERS_HORIZONTALLY": "قلب الطبقات المحددة أفقيًا",
+  "ROT_IMG_90": "تدوير الصورة 90 درجة",
+  "ROT_IMG_180": "تدوير الصورة 180 درجة",
+  "ROT_IMG_-90": "تدوير الصورة -90 درجة",
+  "ROT_LAYERS_90": "تدوير الطبقات المحددة 90 درجة",
+  "ROT_LAYERS_180": "تدوير الطبقات المحددة 180 درجة",
+  "ROT_LAYERS_-90": "تدوير الطبقات المحددة -90 درجة",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "تبديل محور التناظر العمودي",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "تبديل محور التناظر الأفقي",
+  "DELETE_PIXELS": "حذف pixels",
+  "DELETE_PIXELS_DESCRIPTIVE": "حذف pixels المحددة",
+  "RESIZE_DOCUMENT": "تغيير حجم العنصر",
+  "RESIZE_CANVAS": "تغيير حجم الصورة",
+  "CENTER_CONTENT": "توسيط المحتوى",
+  "CUT": "قص",
+  "CUT_DESCRIPTIVE": "قص المنطقة/الطبقات المحددة",
+  "PASTE": "لصق",
+  "PASTE_DESCRIPTIVE": "لصق محتويات الحافظة",
+  "PASTE_AS_NEW_LAYER": "لصق كطبقة جديدة",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "لصق من الحافضةكطبقة جديدة",
+  "PASTE_REFERENCE_LAYER": "لصق الطبقة المرجعية",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "لصق محتويات الحافظة كطبقة مرجعية",
+  "PASTE_COLOR": "لصق اللون",
+  "PASTE_COLOR_DESCRIPTIVE": "لصق اللون من الحافظة",
+  "PASTE_COLOR_SECONDARY": "لصق اللون على أنه ثانوي",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "الصق اللون من الحافظة كلون ثانوي",
+  "CLIPBOARD": "الحافظة",
+  "COPY": "نسخ",
+  "COPY_DESCRIPTIVE": "نسخ الي الحافضة",
+  "COPY_COLOR_HEX": "نسخ اللون الاساسي (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "نسخ اللون الاساسي ك HEX",
+  "COPY_COLOR_RGB": "نسخ اللون الاساسي (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "نسخ اللون الاساسي ك RGB",
+  "COPY_COLOR_SECONDARY_HEX": "نسخ اللون الثانوي (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "نسخ اللون الثانوي ك HEX",
+  "COPY_COLOR_SECONDARY_RGB": "نسخ اللون الثانوي (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "نسخ اللون الثانوي ك RGB",
+  "PALETTE_COLORS": "لوحة الالوان",
+  "REPLACE_SECONDARY_BY_PRIMARY": "استبدل اللون الثانوي باللون الأساسي",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "استبدل اللون الثانوي باللون الأساسي",
+  "REPLACE_PRIMARY_BY_SECONDARY": "استبدل اللون الأساسي باللون الثانوي",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "استبدل اللون الأساسي باللون الثانوي",
+  "OPEN_PALETTE_BROWSER": "افتح متصفح لوحة الألوان",
+  "OVERWRITE_PALETTE_CONSENT": "اللوحة '{0}' موجودة بالفعل ، هل تريد استبدالها؟",
+  "PALETTE_EXISTS": "لوح الألوان موجود بالفعل",
+  "REPLACE_PALETTE_CONSENT": "هل تريد استبدال اللوحة الحالية باللوحة المحددة؟",
+  "REPLACE_PALETTE": "استبدال اللوحة الحالية",
+  "SELECT_COLOR_1": "حدد اللون 1",
+  "SELECT_COLOR_2": "حدد اللون 2",
+  "SELECT_COLOR_3": "حدد اللون 3",
+  "SELECT_COLOR_4": "حدد اللون 4",
+  "SELECT_COLOR_5": "حدد اللون 5",
+  "SELECT_COLOR_6": "حدد اللون 6",
+  "SELECT_COLOR_7": "حدد اللون 7",
+  "SELECT_COLOR_8": "حدد اللون 8",
+  "SELECT_COLOR_9": "حدد اللون 9",
+  "SELECT_COLOR_10": "حدد اللون 10",
+  "SELECT_TOOL": "حدد الاداة {0}",
+  "SELECT_COLOR_1_DESCRIPTIVE": "حدد اللون الأول في اللوحة",
+  "SELECT_COLOR_2_DESCRIPTIVE": "حدد اللون الثاني في اللوحة",
+  "SELECT_COLOR_3_DESCRIPTIVE": "حدد اللون الثالث في اللوحة",
+  "SELECT_COLOR_4_DESCRIPTIVE": "حدد اللون الرابع في اللوحة",
+  "SELECT_COLOR_5_DESCRIPTIVE": "حدد اللون الخامس في اللوحة",
+  "SELECT_COLOR_6_DESCRIPTIVE": "حدد اللون السادس في اللوحة",
+  "SELECT_COLOR_7_DESCRIPTIVE": "حدد اللون السابع في اللوحة",
+  "SELECT_COLOR_8_DESCRIPTIVE": "حدد اللون الثامن في اللوحة",
+  "SELECT_COLOR_9_DESCRIPTIVE": "حدد اللون التاسع في اللوحة",
+  "SELECT_COLOR_10_DESCRIPTIVE": "حدد اللون العاشر في اللوحة",
+  "SWAP_COLORS": "تبديل الألوان",
+  "SWAP_COLORS_DESCRIPTIVE": "تبديل الألوان الأساسية والثانوية",
+  "SEARCH": "بحث",
+  "COMMAND_SEARCH": "اوامر البحث",
+  "OPEN_COMMAND_SEARCH": "فتح نافذة اوامر البحث",
+  "SELECT": "حدد",
+  "DESELECT": "الغاء التحديد",
+  "INVERT": "عكس",
+  "SELECTION": "اختيار",
+  "SELECT_ALL": "حدد الكل",
+  "SELECT_ALL_DESCRIPTIVE": "حدد كل شيء",
+  "CLEAR_SELECTION": "حذف المحدد",
+  "INVERT_SELECTION": "اقلب المحدد",
+  "INVERT_SELECTION_DESCRIPTIVE": "اقلب المنطقة المحددة",
+  "TRANSFORM_SELECTED_AREA": "تحويل المنطقة المحددة",
+  "NUDGE_SELECTED_LEFT": "دفع العنصر المحدد لليسار",
+  "NUDGE_SELECTED_RIGHT": "دفع العنصر المحدد لليمين",
+  "NUDGE_SELECTED_UP": "دفع العنصر المحدد لأعلى",
+  "NUDGE_SELECTED_DOWN": "دفع العنصر المحدد لأسفل",
+  "MASK_FROM_SELECTION": "قناع جديد من الاختيار",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "التحديد لقناع جديد",
+  "ADD_SELECTION_TO_MASK": "إضافة التحديد إلى القناع",
+  "SUBTRACT_SELECTION_FROM_MASK": "قطع التحديد من القناع",
+  "INTERSECT_SELECTION_MASK": "تقاطع التحديد مع القناع",
+  "SELECTION_TO_MASK": "التحديد للقناع",
+  "TO_NEW_MASK": "إلى قناع جديد",
+  "ADD_TO_MASK": "أضف إلى القناع",
+  "SUBTRACT_FROM_MASK": "قص من القناع",
+  "INTERSECT_WITH_MASK": "تتقاطع مع القناع",
+  "STYLUS": "قلم",
+  "TOGGLE_PEN_MODE": "تبديل وضع القلم",
+  "UNDO": "تراجع",
+  "UNDO_DESCRIPTIVE": "تراجع عن الإجراء الأخير",
+  "REDO": "إعادة",
+  "REDO_DESCRIPTIVE": "إعادة الإجراء الأخير",
+  "WINDOWS": "النوافذ",
+  "TOGGLE_GRIDLINES": "تبديل خطوط الشبكة",
+  "ZOOM_IN": "تكبير",
+  "ZOOM_OUT": "تصغير",
+  "NEW_WINDOW_FOR_IMG": "نافذة جديدة للصورة الحالية",
+  "CENTER_ACTIVE_VIEWPORT": "توسيط إطار العرض النشط",
+  "FLIP_VIEWPORT_HORIZONTALLY": "قلب إطار العرض أفقيًا",
+  "FLIP_VIEWPORT_VERTICALLY": "قلب إطار العرض رأسيًا",
+  "SETTINGS": "الاعدادات",
+  "OPEN_SETTINGS": "فتح الاعدادات",
+  "OPEN_SETTINGS_DESCRIPTIVE": "فتح نافذة الاعدادات",
+  "OPEN_STARTUP_WINDOW": "فتح نافذة التشغيل",
+  "OPEN_SHORTCUT_WINDOW": "افتح نافذة الاختصارات",
+  "OPEN_ABOUT_WINDOW": "فتح نافذة المعلومات",
+  "OPEN_NAVIGATION_WINDOW": "افتح نافذة التنقل",
+  "ERROR": "خطأ",
+  "INTERNAL_ERROR": "خطأ داخلي",
+  "ERROR_SAVE_LOCATION": "تعذر حفظ الملف في الموقع المحدد",
+  "ERROR_WHILE_SAVING": "حدث خطأ داخلي أثناء الحفظ. حاول مرة اخرى.",
+  "UNKNOWN_ERROR_SAVING": "حدث خطأ أثناء الحفظ.",
+  "FAILED_ASSOCIATE_LOSPEC": "فشل إقتران بروتوكول Lospec Palette.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "تبرع",
+  "YES": "نعم",
+  "NO": "لا",
+  "CANCEL": "الغاء",
+  "UNNAMED": "بدون اسم",
+  "OPEN_COMMAND_DEBUG_WINDOW": "افتح نافذة تصحيح أخطاء الأمر",
+  "DELETE": "حذف",
+  "USER_PREFS": "تفضيلات المستخدم (Roaming)",
+  "SHORTCUT_FILE": "اختصار الملف (Roaming)",
+  "EDITOR_DATA": "بيانات البرنامج (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "ينقل إطار العرض. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "انقر وانتقل لتحريك منفذ العرض",
+  "MOVE_TOOL_TOOLTIP": "ينقل وحدات البكسل المحددة ({0}). اضغط مع الاستمرار على Ctrl لتحريك كل الطبقات.",
+  "MOVE_TOOL_ACTION_DISPLAY": "استمر في الضغط على الماوس لتحريك وحدات البكسل المحددة. اضغط مع الاستمرار على Ctrl لتحريك كل الطبقات.",
+  "PEN_TOOL_TOOLTIP": "قلم. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "اضغط وحرك للرسم.",
+  "PIXEL_PERFECT_SETTING": "بكسل مثالي",
+  "RECTANGLE_TOOL_TOOLTIP": "رسم مستطيل على الصورة ({0}). اضغط مع الاستمرار على Shift لرسم مربع.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وتحرك لرسم مستطيل. اضغط مع الاستمرار على Shift لرسم مربع.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "انقر وحرك لرسم مربع.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "احتفظ بالصورة الأصلية",
+  "ROTATE_VIEWPORT_TOOLTIP": "يدور منفذ العرض. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "انقر وحرك لتدوير منفذ العرض",
+  "SELECT_TOOL_TOOLTIP": "يختار المنطقة. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وتحرك لتحديد منطقة. اضغط مع الاستمرار على Shift للإضافة إلى التحديد الحالي. استمر في الضغط على Ctrl لقصها منه.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "انقر وانتقل للإضافة إلى التحديد الحالي.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "انقر وانتقل للقص من التحديد الحالي.",
+  "ZOOM_TOOL_TOOLTIP": "تكبير / تصغير منفذ العرض ({0}). انقر للتكبير ، او مع الاستمرار في الضغط على مفتاح alt وانقر للتصغير.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وتحرك للتكبير. انقر للتكبير ، واضغط باستمرار على ctrl وانقر للتصغير.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "انقر وتحرك للتكبير. انقر للتصغير ، وحرر مفتاح التحكم وانقر للتكبير.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "جعل وحدات البكسل أفتح أو أغمق ({0}). اضغط باستمرار على مفتاح Ctrl لجعل البكسل أغمق.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "ارسم على وحدات البكسل لجعلها أكثر إشراقًا. اضغط باستمرار على Ctrl للتغميق.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "ارسم بالبكسل لجعلها أكثر قتامة. اترك Ctrl لتفتيح.",
+  "COLOR_PICKER_TOOLTIP": "يختار اللون الأساسي من الصورة. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "انقر لاختيار الألوان. اضغط باستمرار على Ctrl لإخفاء الصورة. اضغط مع الاستمرار على Shift لإخفاء الطبقة المرجعية",
+  "ELLIPSE_TOOL_TOOLTIP": "رسم قطع ناقص على الصورة ({0}). اضغط مع الاستمرار على Shift لرسم دائرة.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وحرك الماوس لرسم شكل بيضاوي. اضغط مع الاستمرار على Shift لرسم دائرة.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "انقر وحرك الماوس لرسم دائرة.",
+  "ERASER_TOOL_TOOLTIP": "يمحو اللون من البكسل. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "انقر وحرك للمسح.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "املأ المنطقة باللون. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "اضغط على منطقة لملئها. اضغط باستمرار على مفتاح Ctrl للتطبيق على جميع الطبقات.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "اضغط على منطقة لملئها. حرر Ctrl للنظر في الطبقات الحالية فقط.",
+  "LASSO_TOOL_TOOLTIP": "لاسو. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وتحرك لتحديد وحدات البكسل داخل لاسو. اضغط مع الاستمرار على Shift للإضافة إلى التحديد الحالي. استمر في الضغط على Ctrl للحذف منه.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "انقر وتحرك لإضافة وحدات بكسل داخل لاسو إلى التحديد.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "انقر وتحرك لحذف وحدات البكسل داخل لاسو من التحديد.",
+  "LINE_TOOL_TOOLTIP": "رسم خط على الصورة ({0}). اضغط مع الاستمرار على Shift لتمكين الالتقاط.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وتحرك لرسم خط. اضغط مع الاستمرار على Shift لتمكين الالتقاط.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "انقر وحرك الماوس لرسم خط مع تمكين الالتقاط.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "العصا السحرية ({0}). ملء المحدد",
+  "MAGIC_WAND_ACTION_DISPLAY": "أنقر لملء التحديد.",
+  "PEN_TOOL": "قلم",
+  "BRIGHTNESS_TOOL": "السطوع",
+  "COLOR_PICKER_TOOL": "أداة انتقاء اللون",
+  "ELLIPSE_TOOL": "القطع الناقص",
+  "ERASER_TOOL": "ممحاة",
+  "FLOOD_FILL_TOOL": "ملء الفيضانات",
+  "LASSO_TOOL": "لاسو",
+  "LINE_TOOL": "خط",
+  "MAGIC_WAND_TOOL": "العصا السحرية",
+  "MOVE_TOOL": "تحريك",
+  "MOVE_VIEWPORT_TOOL": "تحريك منفذ العرض",
+  "RECTANGLE_TOOL": "مستطيل",
+  "ROTATE_VIEWPORT_TOOL": "تدوير منفذ العرض",
+  "SELECT_TOOL_NAME": "حدد",
+  "ZOOM_TOOL": "تكبير",
+  "SHAPE_LABEL": "شكل",
+  "MODE_LABEL": "الوضع",
+  "SCOPE_LABEL": "نطاق",
+  "FILL_SHAPE_LABEL": "ملء الشكل",
+  "FILL_COLOR_LABEL": "ملء اللون",
+  "TOOL_SIZE_LABEL": "حجم الأداة",
+  "STRENGTH_LABEL": "قوة",
+  "NEW": "جديد",
+  "ADD": "اضافة",
+  "SUBTRACT": "قص",
+  "INTERSECT": "تتقاطع",
+  "RECTANGLE": "مستطيل",
+  "CIRCLE": "دائرة",
+  "ABOUT": "حول البرنامج",
+  "MINIMIZE": "تصغير",
+  "RESTORE": "اعادة",
+  "MAXIMIZE": "تكبير",
+  "CLOSE": "اغلق",
+  "EXPORT_SIZE_HINT": "إذا كنت ترغب في مشاركة الصورة ، فجرّب {0}٪ للحصول على أفضل وضوح",
+  "CREATE": "انشاء",
+  "BASE_LAYER_NAME": "الطبقة الرئيسية",
+  "ENABLE_MASK": "تمكين القناع",
+  "SELECTED_AREA_EMPTY": "المنطقة المحددة فارغة",
+  "NOTHING_TO_COPY": "لا يوجد شي لنسخه",
+  "REFERENCE_LAYER_PATH": "مسار الطبقة المرجعية",
+  "FLIP": "توجيه",
+  "ROTATION": "دوران",
+  "ROT_IMG_90_D": "تدوير الصورة 90 درجة",
+  "ROT_IMG_180_D": "تدوير الصورة 180 درجة",
+  "ROT_IMG_-90_D": "تدوير الصورة -90 درجة",
+  "ROT_LAYERS_90_D": "تدوير الطبقات المحددة 90 درجة",
+  "ROT_LAYERS_180_D": "تدوير الطبقات المحددة 180 درجة",
+  "ROT_LAYERS_-90_D": "تدوير الطبقات المحددة -90 درجة",
+  "UNNAMED_PALETTE": "لوح غير مسمى",
+  "CLICK_SELECT_PRIMARY": "انقر لتحديد اللون الرئيسي.",
+  "PEN_MODE": "وضع القلم",
+  "VIEW": "منظر",
+  "HORIZONTAL_LINE_SYMMETRY": "تناظر الخط الأفقي",
+  "VERTICAL_LINE_SYMMETRY": "تناظر الخط العمودي",
+  "COLOR_PICKER_TITLE": "أداة اختيار اللون",
+  "COLOR_SLIDERS_TITLE": "لوحة الالوان",
+  "PALETTE_TITLE": "اللوحة",
+  "SWATCHES_TITLE": "حوامل",
+  "LAYERS_TITLE": "الطبقات",
+  "NAVIGATION_TITLE": "التنقل",
+  "NORMAL_BLEND_MODE": "عادي",
+  "DARKEN_BLEND_MODE": "أغمق",
+  "MULTIPLY_BLEND_MODE": "تضاعف",
+  "COLOR_BURN_BLEND_MODE": "احتراق الالوان",
+  "LIGHTEN_BLEND_MODE": "فاتح",
+  "SCREEN_BLEND_MODE": "شاشة",
+  "COLOR_DODGE_BLEND_MODE": "انقاص كثافة اللون",
+  "OVERLAY_BLEND_MODE": "تراكب",
+  "SOFT_LIGHT_BLEND_MODE": "ضوء خافت",
+  "HARD_LIGHT_BLEND_MODE": "ضوء غامق",
+  "DIFFERENCE_BLEND_MODE": "اختلاف",
+  "EXCLUSION_BLEND_MODE": "استبعاد",
+  "HUE_BLEND_MODE": "مسحة",
+  "SATURATION_BLEND_MODE": "التشبع",
+  "LUMINOSITY_BLEND_MODE": "لمعان",
+  "COLOR_BLEND_MODE": "اللون",
+  "NOT_SUPPORTED_BLEND_MODE": "غير مدعوم",
+  "RESTART": "اعد تشغيل",
+  "SORT_BY": "ترتيب حسب",
+  "NAME": "الاسم",
+  "COLORS": "الالوان",
+  "DEFAULT": "الافتراضي",
+  "ALPHABETICAL": "مرتب حسب الحروف الأبجدية",
+  "COLOR_COUNT": "عدد الألوان",
+  "ANY": "اي",
+  "MAX": "الاقصى",
+  "MIN": "الاقل",
+  "EXACT": "بالضبط",
+  "ASCENDING": "تصاعدي",
+  "DESCENDING": "تنازلي",
+  "NAME_IS_TOO_LONG": "الاسم طويل جدا",
+  "STOP_IT_TEXT1": "هذا يكفي. رتب أسماء ملفاتك.",
+  "STOP_IT_TEXT2": "هل يمكنك التوقف عن نسخ هذه الأسماء من فضلك؟",
+  "REPLACER_TOOLTIP": "انقر بزر الماوس الأيمن على لوحة الألوان واختر 'استبدال' أو أسقطها هنا.",
+  "CLICK_TO_CHOOSE_COLOR": "انقر لاختيار اللون",
+  "REPLACE_COLOR": "استبدل اللون",
+  "PALETTE_COLOR_TOOLTIP": "انقر لتحديد اللون الرئيسي. قم بالسحب والإفلات على لون لوح آخر لتبديلها.",
+  "ADD_FROM_SWATCHES": "أضف من العينات",
+  "ADD_COLOR_TO_PALETTE": "أضف اللون إلى لوح الألوان",
+  "USE_IN_CURRENT_IMAGE": "استخدم في الصورة الحالية",
+  "ADD_TO_FAVORITES": "اضافة الى المفضلة",
+  "BROWSE_PALETTES": "تصفح اللوحات",
+  "LOAD_PALETTE": "تحميل لوحة",
+  "SAVE_PALETTE": "حفض اللوحة",
+  "FAVORITES": "المفضلة",
+  "ADD_FROM_CURRENT_PALETTE": "أضف من اللوحة الحالية",
+  "OPEN_PALETTES_DIR_TOOLTIP": "افتح دليل اللوحات في المستكشف",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "تصفح اللوحات على Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "اضافة من ملف",
+  "TOP_LEFT": "أعلى اليسار",
+  "TOP_CENTER": "اعلى الوسط",
+  "TOP_RIGHT": "اعلى اليمين",
+  "MIDDLE_LEFT": "اليسار الأوسط",
+  "MIDDLE_CENTER": "منتصف الوسط",
+  "MIDDLE_RIGHT": "وسط اليمين",
+  "BOTTOM_LEFT": "أسفل اليسار",
+  "BOTTOM_CENTER": "اسفل الوسط",
+  "BOTTOM_RIGHT": "أسفل اليمين",
+  "CLIP_TO_BELOW": "مقطع للطبقة أدناه",
+  "MOVE_UPWARDS": "تحرك لأعلى",
+  "MOVE_DOWNWARDS": "تحريك للاسفل",
+  "MERGE_SELECTED": "دمج المحدد",
+  "LOCK_TRANSPARENCY": "قفل الشفافية",
+  "COULD_NOT_LOAD_PALETTE": "تعذر إحضار اللوحات",
+  "NO_PALETTES_FOUND": "لم يتم العثور على لوحات.",
+  "LOSPEC_LINK_TEXT": "سمعت أنه يمكنك العثور على بعضها هنا: lospec.com/palette-list",
+  "PALETTE_BROWSER": "متصفح لوح الألوان",
+  "DELETE_PALETTE_CONFIRMATION": "هل أنت متأكد أنك تريد حذف هذه اللوحة؟ هذا لا يمكن التراجع عنها.",
+  "SHORTCUTS_IMPORTED": "تم اضافة الاختصارات من {0} بنجاح.",
+  "SHORTCUT_PROVIDER_DETECTED": "لقد اكتشفنا أنك قمت بتثبيت {0}. هل تريد اضافة الاختصارات منه؟",
+  "IMPORT_FROM_INSTALLATION": "اضافة من التثبيت",
+  "IMPORT_INSTALLATION_OPTION1": "اضافة من التنزيلات",
+  "IMPORT_INSTALLATION_OPTION2": "استخدام الافتراضي",
+  "IMPORT_FROM_TEMPLATE": "اضافة من قالب",
+  "SHORTCUTS_IMPORTED_SUCCESS": "تم اضافة الاختصارات بنجاح.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "هل أنت متأكد من أنك تريد إعادة تعيين جميع الاختصارات إلى قيمتها الافتراضية؟",
+  "SUCCESS": "نجاح",
+  "WARNING": "تحذير",
+  "ERROR_IMPORTING_IMAGE": "حدث خطأ أثناء استيراد الصورة.",
+  "SHORTCUTS_CORRUPTED_TITLE": "ملف الاختصارات تالف",
+  "SHORTCUTS_CORRUPTED": "تعرض ملف الاختصارات للتلف ، اعادة التعيين إلى الوضع الافتراضي.",
+  "FAILED_DOWNLOAD_PALETTE": "فشل تحميل لوح الألوان",
+  "FILE_INCORRECT_FORMAT": "لم يكن الملف بتنسيق صحيح",
+  "INVALID_FILE": "ملف غير صالح",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "تنسيق ملف الاختصارات ليس صحيحًا",
+  "UNSUPPORTED_FILE_FORMAT": "تنسيق الملف هذا غير مدعوم",
+  "ALREADY_ASSIGNED": "تم تعيينه بالفعل",
+  "REPLACE": "استبدال",
+  "SWAP": "تبديل",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "تم بالفعل تعيين هذا الاختصار لـ '{0}'\nهل تريد استبدال الاختصار الحالي أم تبديل الاختصارين؟",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "تم بالفعل تعيين هذا الاختصار لـ '{0}'\nهل تريد استبدال الاختصار الموجود؟",
+  "UNSAVED_CHANGES": "تغييرات غير محفوضة",
+  "DOCUMENT_MODIFIED_SAVE": "تم تعديل العنصر. هل تريد ان تحفظ التغييرات؟",
+  "SESSION_UNSAVED_DATA": "{0} ببيانات غير محفوظة. هل أنت متأكد؟",
+  "PROJECT_MAINTAINERS": "مشرفو المشروع",
+  "OTHER_AWESOME_CONTRIBUTORS": "وغيرهم من المساهمين الرائعين",
+  "HELP": "مساعد",
+  "STOP_IT_TEXT3": "لا ، حقًا ، توقف عن ذلك.",
+  "STOP_IT_TEXT4": "أليس لديك أي شيء أفضل لتفعله؟",
+  "LINEAR_DODGE_BLEND_MODE": "مراوغة خطية (إضافة)",
+  "PRESS_ANY_KEY": "اضغط اي مفتاح",
+  "NONE_SHORTCUT": "غير محدد",
+  "REFERENCE": "مرجع",
+  "PUT_REFERENCE_LAYER_ABOVE": "ضع طبقة مرجعية أعلاه",
+  "PUT_REFERENCE_LAYER_BELOW": "ضع طبقة مرجعية أدناه",
+  "TOGGLE_VERTICAL_SYMMETRY": "تبديل التناظر العمودي",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "تبديل التناظر الأفقي",
+  "RESET_VIEWPORT": "إعادة تعيين منفذ العرض",
+  "VIEWPORT_SETTINGS": "إعدادات منفذ العرض",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "انقر بالماوس مع الاستمرار لتحريك وحدات البكسل في الطبقات المحددة.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "انقر بالماوس مع الاستمرار لتحريك جميع الطبقات.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "إعادة تسمية",
+  "PIXEL_UNIT": "بكسل",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "افتح نافذة تصحيح أخطاء الترجمة",
+  "FORCE_OTHER_FLOW_DIRECTION": "فرض اتجاه تدفق آخر",
+  "API_KEY": "مفتاح API",
+  "LOCALIZATION_VIEW_TYPE": "نوع عرض الترجمة",
+  "LOAD_LANGUAGE_FROM_FILE": "تحميل اللغة من ملف",
+  "LOG_IN": "تسجيل دخول",
+  "SYNC": "مزامنة",
+  "NOT_LOGGED_IN": "لم تقم بتسجيل الدخول",
+  "POE_EDITOR_ERROR": "خطأ POEditor: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "خطأ HTTP: {0} {1}",
+  "LOGGED_IN": "تم التسجيل",
+  "SYNCED_SUCCESSFULLY": "تمت المزامنة بنجاح",
+  "EXCEPTION_ERROR": "استثناء: {0}",
+  "DROP_PALETTE": "قم بإسقاط اللوحة هنا",
+  "SECURITY_ERROR": "خطآ امني",
+  "SECURITY_ERROR_MSG": "لا توجد حقوق للكتابة إلى الموقع المحدد.",
+  "IO_ERROR": "خطأ IO",
+  "IO_ERROR_MSG": "خطأ أثناء الكتابة على القرص.",
+  "FAILED_ASSOCIATE_PIXI": "فشل إقران ملف .pixi بـ PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "حدث خطأ أثناء حفظ اللوحة.",
+  "NO_COLORS_TO_SAVE": "لا توجد ألوان للحفظ.",
+  "ALL_LAYERS": "جميع الطبقات",
+  "SINGLE_LAYER": "طبقة واحدة",
+  "CHOOSE": "اختيار",
+  "REMOVE": "ازالة",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "الملف ليس ملف \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "يحتوي الملف على اختصار غير صالح",
+  "FILE_EXTENSION_NOT_SUPPORTED": "نوع الملف '{0}' غير مدعوم",
+  "ERROR_READING_FILE": "خطأ أثناء قراءة الملف",
+  "DISCARD_PALETTE": "تجاهل لوح الألوان",
+  "DISCARD_PALETTE_CONFIRMATION": "هل أنت متأكد أنك تريد تجاهل لوحة الألوان الحالية؟ هذا لا يمكن التراجع عنها.",
+  "IMPORT_AS_NEW_LAYER": "اضافة كطبقة جديدة",
+  "PASTE_AS_PRIMARY_COLOR": "لصق كلون أساسي",
+  "IMPORT_AS_NEW_FILE": "اضافة كملف جديد",
+  "IMPORT_PALETTE_FILE": "اضافة ملف لوح الألوان",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "اضافة الألوان إلى لوح الألوان",
+  "IMPORT_SINGLE_PALETTE_COLOR": "اضافة اللون إلى لوح الألوان",
+  "IMPORT_AS_REFERENCE_LAYER": "اضافة كطبقة مرجعية",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "انقر بزر الماوس الأيمن لاختيار اللون ، وانقر بزر الماوس الأيمن مع الاستمرار بالضغط على Shift لنسخ اللون إلى الحافظة",
+  "OPEN_FILE_FROM_CLIPBOARD": "فتح من الحافظة",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "فتح من الحافظة",
+  "OPEN_LOCALIZATION_DATA": "هل تريد فتح LocalizationData.json؟\nتم وضع البيانات المحدثة في الحافظة.\nلاحظ أنه لن يتم تطبيق التغييرات حتى إعادة تشغيل البرنامج",
+  "DOWNLOADING_LANGUAGE_FAILED": "فشل تحميل اللغة.\nربما تم الإفراط في استخدام مفتاح API.",
+  "LOCALIZATION_DATA_NOT_FOUND": "مسار بيانات الترجمة غير موجود",
+  "APPLY": "حفض",
+  "UPDATE_SOURCE": "تحديث المصدر",
+  "COPY_TO_CLIPBOARD": "نسخ للحافضة",
+  "LANGUAGE_FILE_NOT_FOUND": "ملف اللغة غير موجود.\nالبحث عن {0}",
+  "PROJECT_ROOT_NOT_FOUND": "لم يتم العثور على جذر مشروع PixiEditor.\nأبحث عن PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "مجلد الترجمة غير موجود.\nأبحث عن/البيانات/التعريب",
+  "SELECT_A_LANGUAGE": "اختار لغة",
+  "DONE": "انتهاء",
+  "SOURCE_UNSET_OR_MISSING": "المصدر مفقود/غير محدد",
+  "SOURCE_NEWER": "مصدر أحدث",
+  "SOURCE_UP_TO_DATE": "تم تحديث المصدر",
+  "SOURCE_OLDER": "سحابة احدث",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/cs.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "Poslední soubory",
+  "OPEN_FILE": "Otevřít soubor",
+  "NEW_FILE": "Nový",
+  "RECENT_EMPTY_TEXT": "Hodně prázdného místa",
+  "LANGUAGE": "Jazyk",
+  "GENERAL": "Obecný",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Klávesové zkratky",
+  "MISC": "Různé",
+  "SHOW_STARTUP_WINDOW": "Ukazovat spouštěcí okno",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Zobrazit náhled obrázku na hlavním panelu",
+  "RECENT_FILE_LENGTH": "Délka seznamu posledních souborů",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Kolik dokumentů se objeví pod \"File > Recent\".\nNormálně: 8",
+  "DEFAULT_NEW_SIZE": "Standartní velikost nového souboru",
+  "WIDTH": "Šířka",
+  "HEIGHT": "Výška",
+  "TOOLS": "Nástroje",
+  "ENABLE_SHARED_TOOLBAR": "Zapnout sdílený panel nástrojů",
+  "AUTOMATIC_UPDATES": "Automatické aktualizace",
+  "CHECK_FOR_UPDATES": "Vyhledávat aktualizace při spuštění",
+  "UPDATE_STREAM": "Druh verze",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Aktualizační  kanály mohou být aktualizovány jen v samostatných verzích aplikace (stáhnutých z https://pixieditor.net/) Steam a Microsoft Store verze zacházejí s jednotlivými verzemi odlišně.",
+  "DEBUG": "Debug",
+  "ENABLE_DEBUG_MODE": "Aktivovat Debug mód",
+  "OPEN_CRASH_REPORTS_DIR": "Otevřít složku crash reportů",
+  "DISCORD_RICH_PRESENCE": "Bohatá přítomnost",
+  "ENABLED": "Povoleno",
+  "SHOW_IMAGE_NAME": "Ukázat jméno obrázku",
+  "SHOW_IMAGE_SIZE": "Ukázat název obrázku",
+  "SHOW_LAYER_COUNT": "Zobrazit počet vrstev",
+  "FILE": "Soubor",
+  "RECENT": "Poslední",
+  "OPEN": "Otevřít",
+  "SAVE_PIXI": "Uložit (.pixi)",
+  "SAVE_AS_PIXI": "Uložit jako... (.pixi)",
+  "EXPORT_IMG": "Exportovat (.png, .jpg, etc.)",
+  "EDIT": "Editovat",
+  "EXIT": "Odejít",
+  "PERCENTAGE": "Procentuální ",
+  "ABSOLUTE": "Absolutní",
+  "PRESERVE_ASPECT_RATIO": "Zachování poměru stran",
+  "ANCHOR_POINT": "Upevněný bod",
+  "RESIZE_IMAGE": "Změnit velikost obrázku",
+  "RESIZE": "Upravit velikost",
+  "DOCUMENTATION": "Dokumentace",
+  "WEBSITE": "Web",
+  "OPEN_WEBSITE": "Otevřít web",
+  "REPOSITORY": "Úložiště",
+  "OPEN_REPOSITORY": "Otevřít úložiště",
+  "LICENSE": "Licence",
+  "OPEN_LICENSE": "Otevřít licenci",
+  "THIRD_PARTY_LICENSES": "Licence třetí strany",
+  "OPEN_THIRD_PARTY_LICENSES": "Otevřít licenci třetí strany",
+  "APPLY_TRANSFORM": "Použít transformaci",
+  "INCREASE_TOOL_SIZE": "Zvětšit velikost nástroje",
+  "DECREASE_TOOL_SIZE": "Zmenšit velikost nástroje",
+  "TO_INSTALL_UPDATE": "Nainstalovat aktualizaci {0}",
+  "DOWNLOADING_UPDATE": "Stahování aktualizace...",
+  "UPDATE_READY": "Je tu nová aktualizace. Chceš aby jsme jí pro tebe nainstalovali teď nebo až později?",
+  "NEW_UPDATE": "Nová aktualizace",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Potřebujeme pro dokončení aktualizace povolení od Admina. Spusť tedy PixiEditor jako administrátor.",
+  "INSUFFICIENT_PERMISSIONS": "Nedostatečná oprávnění",
+  "UPDATE_CHECK_FAILED": "Při hledání aktualizací se něco pokazilo",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Z nějakého důvodu nejsme schopni zjistit jestli je nějaká nová aktualizace.",
+  "VERSION": "Verze {0}",
+  "OPEN_TEMP_DIR": "Otevřít složku \"temp\"",
+  "OPEN_LOCAL_APPDATA_DIR": "Otevřít složku \"Local AppData\"",
+  "OPEN_ROAMING_APPDATA_DIR": "Otevřít složku \"Roaming AppData\"",
+  "OPEN_INSTALLATION_DIR": "Otevřít instalační složku",
+  "DUMP_ALL_COMMANDS": "Vypsat všechny příkazy",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Vypsat všechny příkazy do textového souboru",
+  "CRASH": "Crash",
+  "CRASH_APP": "Shodit aplikaci",
+  "DELETE_USR_PREFS": "Smazat uživatelské předvolby (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Odstranit složkus",
+  "DELETE_EDITOR_DATA": "Odstranit data editoru (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Vytvořit šablonu pro klávesové zkratky",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Vytvořit \"json\" šablonu pro klávesové zkratky",
+  "VALIDATE_SHORTCUT_MAP": "Ověřit mapu klávesových zkratek",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Ověřuje mapu klávesových zkratek",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Empty keys: {0}\nUnknown Commands: {1}",
+  "RESULT": "Výsledek",
+  "CLEAR_RECENT_DOCUMENTS": "Vyčistit poslední dokumenty",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Vyčistit nedávno otevřené dokumenty",
+  "OPEN_CMD_DEBUG_WINDOW": "Otevřít okno Command debug",
+  "PATH_DOES_NOT_EXIST": "{0} neexistuje.",
+  "LOCATION_DOES_NOT_EXIST": "Umístění neexistuje.",
+  "FILE_NOT_FOUND": "Soubor nebyl nalezen.",
+  "ARE_YOU_SURE": "Jsi si opravdu jist, že tuto akci chceš udělat? Promysli to ještě jednou či dvakrát ať toho pak nelituješ.",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Jsi si jist že chceš smazat {0}?\nTahle data budou ztracena na všech instalací.\n(Celá cesta k souboru: {1})",
+  "FAILED_TO_OPEN_FILE": "Nepodařilo se otevřít soubor",
+  "OLD_FILE_FORMAT": "Starý formát souboru",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Tenhle .pixi soubor používá starý formát,\nkterý již bohužel není podporován a nemůže být otevřen.",
+  "NOTHING_FOUND": "Nic se nenašlo",
+  "EXPORT": "Exportovat",
+  "EXPORT_IMAGE": "Exportovat obrázek",
+  "IMPORT": "Importovat",
+  "SHORTCUT_TEMPLATES": "Šablony klávesových zkratek",
+  "RESET_ALL": "Resetovat vše",
+  "LAYER": "Vrstva",
+  "LAYER_DELETE_SELECTED": "Smazat aktivní vrstvu/složku",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Smazat aktivní vrstvu nebo složku",
+  "LAYER_DELETE_ALL_SELECTED": "Smazat všechny vybrané vrstvy/složky",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Smazat všechny vybrané vrstvy a/nebo složky",
+  "DELETE_SELECTED_PIXELS": "Odstranit vybrané pixely",
+  "NEW_FOLDER": "Nová složka",
+  "CREATE_NEW_FOLDER": "Vytvořit složku",
+  "NEW_LAYER": "Nová vrstva",
+  "CREATE_NEW_LAYER": "Vytvořit novou vrstvu",
+  "NEW_IMAGE": "Nový obrázek",
+  "CREATE_NEW_IMAGE": "Vytvořit nový obrázek",
+  "SAVE": "Uložit",
+  "SAVE_AS": "Uložit jako...",
+  "IMAGE": "Obrázek",
+  "SAVE_IMAGE": "Uložit obrázek",
+  "SAVE_IMAGE_AS": "Uložit obrázek jako nový",
+  "DUPLICATE": "Duplikovat",
+  "DUPLICATE_SELECTED_LAYER": "Duplikovat vybranou vrstvu",
+  "CREATE_MASK": "Vytvořit masku",
+  "DELETE_MASK": "Odstranit masku",
+  "TOGGLE_MASK": "Přepnout masku",
+  "APPLY_MASK": "Použit masku",
+  "TOGGLE_VISIBILITY": "Přepnout viditelnost",
+  "MOVE_MEMBER_UP": "Posunout člena nahoru",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Pohnout vybranou vrstvu nebo složku nahoru",
+  "MOVE_MEMBER_DOWN": "Posunout člena dolů",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Pohnout vybranou vrstvu nebo složku dolů",
+  "MERGE_ALL_SELECTED_LAYERS": "Spojit všechny vybrané vrstvy",
+  "MERGE_WITH_ABOVE": "Spojit vybranou vrstvu s vrstvou nad",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Spojit vybranou vrstvu s vrstvou nad ní",
+  "MERGE_WITH_BELOW": "Spojit vybranou vrstvu s vrstvou pod ní",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Spojit vybranou vrstvu s vrstvou pod ní",
+  "ADD_REFERENCE_LAYER": "Přidat referenční vrstvu",
+  "DELETE_REFERENCE_LAYER": "Odstranit referenční vrstvu",
+  "TRANSFORM_REFERENCE_LAYER": "Transformovat referenční vrstvu",
+  "TOGGLE_REFERENCE_LAYER_POS": "Přepnout pozici referenční vrstvy",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Přepnout referenční vrstvu mezi nejvyšší nebo nejnižší",
+  "RESET_REFERENCE_LAYER_POS": "Z resetovat pozici referenční vrstvy",
+  "CLIP_CANVAS": "Připni Canvas",
+  "FLIP_IMG_VERTICALLY": "Překlopit obrázek svisle",
+  "FLIP_IMG_HORIZONTALLY": "Překlopit obrázek vodorovně",
+  "FLIP_LAYERS_VERTICALLY": "Svisle překlopit vybrané vrstvy",
+  "FLIP_LAYERS_HORIZONTALLY": "Vodorovně překlopit vybrané vrstvy",
+  "ROT_IMG_90": "Otočit obrázek o 90 stupňů",
+  "ROT_IMG_180": "Otočit obrázek o 180 stupňů",
+  "ROT_IMG_-90": "Otočit obrázek o -90 stupňů",
+  "ROT_LAYERS_90": "Otočit vybrané vrstvy o 90 stupňů",
+  "ROT_LAYERS_180": "Otočit vybrané vrstvy o 180 stupňů",
+  "ROT_LAYERS_-90": "Otočit vybrané vrstvy o -90 stupňů",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Přepnout vertikální osu symetrie",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Zapnout osu vodorovné symetrie",
+  "DELETE_PIXELS": "Odstranit pixely",
+  "DELETE_PIXELS_DESCRIPTIVE": "Odstranit vybrané pixely",
+  "RESIZE_DOCUMENT": "Změnit velikost dokumentu",
+  "RESIZE_CANVAS": "Změnit velikost canvasu",
+  "CENTER_CONTENT": "Vycentrovat obsah",
+  "CUT": "Oříznout",
+  "CUT_DESCRIPTIVE": "Oříznout vybranou oblast/vrstvy",
+  "PASTE": "Vložit",
+  "PASTE_DESCRIPTIVE": "Vložit obsah schránky",
+  "PASTE_AS_NEW_LAYER": "Vložit jako novou vrstvu",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Vložit ze schránky jako novou vrstvu",
+  "PASTE_REFERENCE_LAYER": "Vložit referenční vrstvu",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Vložit obsah schránky jako referenční vrstvu",
+  "PASTE_COLOR": "Vložit barvu",
+  "PASTE_COLOR_DESCRIPTIVE": "Vložit barvu ze schránky",
+  "PASTE_COLOR_SECONDARY": "Vložit barvu jako vedlejší",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Vložit barvu ze schránky jako vedlejší barvu",
+  "CLIPBOARD": "Schránka",
+  "COPY": "Kopírovat",
+  "COPY_DESCRIPTIVE": "Zkopírovat do schránky",
+  "COPY_COLOR_HEX": "Zkopírovat hlavní barvu (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Zkopírovat hlavní barvu jako HEX kód",
+  "COPY_COLOR_RGB": "Zkopírovat hlavní barvu (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Zkopíruj hlavní barvu jako RGB kód",
+  "COPY_COLOR_SECONDARY_HEX": "Zkopíruj vedlejší barvu (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Zkopíruj vedlejší barvu jako HEX kód",
+  "COPY_COLOR_SECONDARY_RGB": "Zkopírovat vedlejší barvu (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Zkopírovat vedlejší barvu jako RGB kód",
+  "PALETTE_COLORS": "Barvy palety",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Nahradit vedlejší barvu barvou vedlejší",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Nahradit vedlejší barvu barvou vedlejší",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Nahradit hlavní barvu barvou vedlejší",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Nahradit hlavní barvu barvou vedlejší",
+  "OPEN_PALETTE_BROWSER": "Otevřít prohlížeč palet",
+  "OVERWRITE_PALETTE_CONSENT": "Paleta \"{0}\" již existuje, chcete ji přepsat?",
+  "PALETTE_EXISTS": "Paleta již existuje",
+  "REPLACE_PALETTE_CONSENT": "Nahradit současnou paletu s",
+  "REPLACE_PALETTE": "Nahradit současnou paletu",
+  "SELECT_COLOR_1": "Vybrat barvu 1",
+  "SELECT_COLOR_2": "Vybrat barvu 2",
+  "SELECT_COLOR_3": "Vybrat barvu 3",
+  "SELECT_COLOR_4": "Vybrat barvu 4",
+  "SELECT_COLOR_5": "Vybrat barvu 5",
+  "SELECT_COLOR_6": "Vybrat barvu 6",
+  "SELECT_COLOR_7": "Vybrat barvu 7",
+  "SELECT_COLOR_8": "Vybrat barvu 8",
+  "SELECT_COLOR_9": "Vybrat barvu 9",
+  "SELECT_COLOR_10": "Vybrat barvu 10",
+  "SELECT_TOOL": "Vybrat {0} Nástroj",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Vybrat první barvu z palety",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Vybrat druhou barvu z palety",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Vybrat třetí barvu z palety",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Vybrat čtvrtou barvu z palety",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Vybrat pátou barvu z palety",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Vybrat šestou barvu z palety",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Vybrat sedmou barvu z palety",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Vybrat osmou barvu z palety",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Vybrat devátou barvu z palety",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Vybrat desátou barvu z palety",
+  "SWAP_COLORS": "Přepnout barvy",
+  "SWAP_COLORS_DESCRIPTIVE": "Přepnout mezi hlavní a vedlejší barvou",
+  "SEARCH": "Hledat",
+  "COMMAND_SEARCH": "Vyhledávač příkazů",
+  "OPEN_COMMAND_SEARCH": "Otevřít okno vyhledávač příkazů",
+  "SELECT": "Vybrat",
+  "DESELECT": "Zrušit výběr",
+  "INVERT": "Invertovat",
+  "SELECTION": "Výběr",
+  "SELECT_ALL": "Vybrat vše",
+  "SELECT_ALL_DESCRIPTIVE": "Vybrat vše",
+  "CLEAR_SELECTION": "Vyčistit vybrané",
+  "INVERT_SELECTION": "Invertovat výběr",
+  "INVERT_SELECTION_DESCRIPTIVE": "Invertovat vybranou oblast",
+  "TRANSFORM_SELECTED_AREA": "Transformovat vybrané pole",
+  "NUDGE_SELECTED_LEFT": "Posunout vybraný objekt doleva",
+  "NUDGE_SELECTED_RIGHT": "Posunout vybraný objekt doprava",
+  "NUDGE_SELECTED_UP": "Posunout vybraný objekt nahoru",
+  "NUDGE_SELECTED_DOWN": "Posunout vybraný objekt dolů",
+  "MASK_FROM_SELECTION": "Nová maska z výběru",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Výběr pro novou masku",
+  "ADD_SELECTION_TO_MASK": "Přidat výběr k masce",
+  "SUBTRACT_SELECTION_FROM_MASK": "Odebrat výběr z masky",
+  "INTERSECT_SELECTION_MASK": "Výběr průsečíku s maskou",
+  "SELECTION_TO_MASK": "Výběr pro masku",
+  "TO_NEW_MASK": "Na novou masku",
+  "ADD_TO_MASK": "Přidat do masky",
+  "SUBTRACT_FROM_MASK": "Odebrat z masky",
+  "INTERSECT_WITH_MASK": "průsečík s maskou",
+  "STYLUS": "Stylus",
+  "TOGGLE_PEN_MODE": "Přepnout režim pera",
+  "UNDO": "Zpět",
+  "UNDO_DESCRIPTIVE": "Poslední akce zpět",
+  "REDO": "Znovu",
+  "REDO_DESCRIPTIVE": "Udělat znovu poslední akci",
+  "WINDOWS": "Okna",
+  "TOGGLE_GRIDLINES": "Zapnout mřížku",
+  "ZOOM_IN": "Přiblížit",
+  "ZOOM_OUT": "Oddálit",
+  "NEW_WINDOW_FOR_IMG": "Nové okno pro aktuální obrázek",
+  "CENTER_ACTIVE_VIEWPORT": "Vycentrovat aktivní okna zobrazení",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Vodorovně překlopit pole zobrazení",
+  "FLIP_VIEWPORT_VERTICALLY": "Svisle překlopit pole zobrazení",
+  "SETTINGS": "Nastavení",
+  "OPEN_SETTINGS": "Otevřít nastavení",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Otevřít okno nastavení",
+  "OPEN_STARTUP_WINDOW": "Otevřít spouštěcí okno",
+  "OPEN_SHORTCUT_WINDOW": "Otevřít okno klávesových zkratek",
+  "OPEN_ABOUT_WINDOW": "Otevřít okno s informacemi",
+  "OPEN_NAVIGATION_WINDOW": "Otevřít okno navigace",
+  "ERROR": "Chyba",
+  "INTERNAL_ERROR": "Interní error",
+  "ERROR_SAVE_LOCATION": "Soubor se nepodařilo uložit do zadaného umístění",
+  "ERROR_WHILE_SAVING": "Při ukládání došlo k interní chybě. Zkuste to prosím znovu.",
+  "UNKNOWN_ERROR_SAVING": "Něco se nepovedlo při ukládání.",
+  "FAILED_ASSOCIATE_LOSPEC": "Nepodařilo se spojit protokolem Lospec Palette.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Přispět",
+  "YES": "ANO",
+  "NO": "Ne",
+  "CANCEL": "Zrušit",
+  "UNNAMED": "Bez jména",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Otevřít okno Command debug",
+  "DELETE": "Odstranit",
+  "USER_PREFS": "Předvolby uživatele (Roaming)",
+  "SHORTCUT_FILE": "Složka s klávesovými zkratky (Roaming)",
+  "EDITOR_DATA": "Data editoru (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "Posunout pole zobrazení. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Klikni a posuň myší pro přesunutí pole zobrazení.",
+  "MOVE_TOOL_TOOLTIP": "Pohnout vybrané pixely ({0}). Drž \"Ctrl\" pro pohnutí se všemi vrstvy.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Podržením myši přesunete vybrané pixely. Podržením klávesy Ctrl přesunete všechny vrstvy.",
+  "PEN_TOOL_TOOLTIP": "Pero. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Klikni a posuň myší pro malování.",
+  "PIXEL_PERFECT_SETTING": "Perfektní pixely",
+  "RECTANGLE_TOOL_TOOLTIP": "Nakreslí obdélník na canvas ({0}). Podržením klávesy Shift nakreslíte čtverec.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vytvoření Obdélníku. Drž \"Shift\" pro vytvoření čtverce.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro vytvoření čtverce.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Ponechat originální obrázek",
+  "ROTATE_VIEWPORT_TOOLTIP": "Otáčí pohled. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Klikni a posuň myší pro otočení pohledu.",
+  "SELECT_TOOL_TOOLTIP": "Vybrána oblast. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vybrání oblasti. Podrž \"Shift\" pro přidání do existujícího výběru. Podrž \"Ctrl\" pro odebrání z něj.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro přidání do současného výběru.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Klikni a posuň myší pro odebrání ze současného výběru.",
+  "ZOOM_TOOL_TOOLTIP": "Přiblížení pohledu ({0}). Klikni pro přiblížení, podrž \"ctrl\" a klikni pro oddálení.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro přiblížení. Klikni pro přiblížení, podrž \"Ctrl\" a klikni pro oddálení.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Klikni a posuň myší pro přiblížení. Klikni pro oddálení, pusť \"Ctrl\" a klikni pro přiblížení.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Udělá pixely tmavší nebo světlejší. ({0}). Drž \"Ctrl\" aby dělal ty pixely tmavší.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Kreslením na pixely je zesvětlíš. Podrž \"Ctrl\" pro jejich ztmavnutí.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Kreslením na pixely je ztmavíš. Pusť \"Ctrl\" pro jejich zesvětlení.",
+  "COLOR_PICKER_TOOLTIP": "Vybere hlavní barvu z canvasu. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Klikni pro výběr barev. Podrž \"Ctrl\" abys schoval canvas. Podrž \"Shift\" pro schování referenční vrstvy.",
+  "ELLIPSE_TOOL_TOOLTIP": "Vytvoří elipsu na canvas ({0}). Podrž \"Shift\" pro přidání kružnice.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vytvoření elipsy. Podrž \"Shift\" pro vytvoření kružnice.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro vytvoření kružnice.",
+  "ERASER_TOOL_TOOLTIP": "Vygumuje barvu z pixelu. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Klikni a posuň myší pro gumování.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Vyplní oblast barvou. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni na oblast pro zaplnění. Podrž \"Ctrl\" pro ovlivnění všech vrstev.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Klikni na oblast pro zaplnění. Pusť \"Ctrl\" pro ovlivnění jen současných vrstev.",
+  "LASSO_TOOL_TOOLTIP": "Laso. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vybrání pixelů uvnitř vybrané oblasti lasa. Podrž \"Shift\" pro přidání do existujícího výběru. Podrž \"Ctrl\" pro odebraní z něj.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro přidání pixelů dovnitř vybrané oblasti lasa.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Klikni a posuň myší pro odebrání pixelů uvnitř vybrané oblasti lasa.",
+  "LINE_TOOL_TOOLTIP": "Nakreslí čáru na canvas ({0}). Podržením klávesy Shift povolíte přichytávání.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vytvoření čáry. Podrž \"Shift\" pro rovnoměrné čáry.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro vytvoření rovnoměrné čáry.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Kouzelná hůlka ({0}). Vyplní výběr",
+  "MAGIC_WAND_ACTION_DISPLAY": "Klikni pro vyplnění výběru.",
+  "PEN_TOOL": "Pero",
+  "BRIGHTNESS_TOOL": "Zesvětlovač",
+  "COLOR_PICKER_TOOL": "Kapátko",
+  "ELLIPSE_TOOL": "Elipsa",
+  "ERASER_TOOL": "Guma",
+  "FLOOD_FILL_TOOL": "Kyblík",
+  "LASSO_TOOL": "Laso",
+  "LINE_TOOL": "Čára",
+  "MAGIC_WAND_TOOL": "Kouzelná hůlka",
+  "MOVE_TOOL": "Pohnout",
+  "MOVE_VIEWPORT_TOOL": "Posunout pole zobrazení",
+  "RECTANGLE_TOOL": "Obdélník",
+  "ROTATE_VIEWPORT_TOOL": "Otočit pohled",
+  "SELECT_TOOL_NAME": "Vybrat",
+  "ZOOM_TOOL": "Lupa",
+  "SHAPE_LABEL": "Tvar",
+  "MODE_LABEL": "Mód",
+  "SCOPE_LABEL": "Rozsah působnosti",
+  "FILL_SHAPE_LABEL": "Vyplnit obrazec barvou",
+  "FILL_COLOR_LABEL": "Vyplnit barvou",
+  "TOOL_SIZE_LABEL": "Velikost nástroje",
+  "STRENGTH_LABEL": "Síla",
+  "NEW": "Nový",
+  "ADD": "Přidat",
+  "SUBTRACT": "Odebrat",
+  "INTERSECT": "Průsečík",
+  "RECTANGLE": "Obdélník",
+  "CIRCLE": "Kruh",
+  "ABOUT": "O",
+  "MINIMIZE": "Minimalizovat",
+  "RESTORE": "Obnovit",
+  "MAXIMIZE": "Maximalizovat",
+  "CLOSE": "Zavřít",
+  "EXPORT_SIZE_HINT": "Pokud chceš sdílet obrázek, zkus {0}% pro nejlepší zobrazení",
+  "CREATE": "Vytvořit",
+  "BASE_LAYER_NAME": "Základní vrstva",
+  "ENABLE_MASK": "Zapnout masku",
+  "SELECTED_AREA_EMPTY": "Vybraná oblast je prázdná",
+  "NOTHING_TO_COPY": "Nic k zkopírování",
+  "REFERENCE_LAYER_PATH": "Cesta referenční vrstvy",
+  "FLIP": "Překlopit",
+  "ROTATION": "Rotace",
+  "ROT_IMG_90_D": "Otočit obrázek o 90°",
+  "ROT_IMG_180_D": "Otočit obrázek o 180°",
+  "ROT_IMG_-90_D": "Otočit obrázek o -90°",
+  "ROT_LAYERS_90_D": "Otočit vybrané vrstvy o 90°",
+  "ROT_LAYERS_180_D": "Otočit vybrané vrstvy o 180°",
+  "ROT_LAYERS_-90_D": "Otočit vybrané vrstvy o -90°",
+  "UNNAMED_PALETTE": "Nepojmenovaná paleta",
+  "CLICK_SELECT_PRIMARY": "Klikni pro vybrání jako hlavní barvu",
+  "PEN_MODE": "Režim pera",
+  "VIEW": "Zobrazení",
+  "HORIZONTAL_LINE_SYMMETRY": "Symetrie vodorovné čáry",
+  "VERTICAL_LINE_SYMMETRY": "Symetrie svislých čar",
+  "COLOR_PICKER_TITLE": "Kapátko",
+  "COLOR_SLIDERS_TITLE": "Vyběrač barev",
+  "PALETTE_TITLE": "Paleta",
+  "SWATCHES_TITLE": "Vzorky",
+  "LAYERS_TITLE": "Vrstvy",
+  "NAVIGATION_TITLE": "Navigace",
+  "NORMAL_BLEND_MODE": "Normální",
+  "DARKEN_BLEND_MODE": "Ztmavit",
+  "MULTIPLY_BLEND_MODE": "Násobit",
+  "COLOR_BURN_BLEND_MODE": "Ztmavit barvy",
+  "LIGHTEN_BLEND_MODE": "Zesvětlit",
+  "SCREEN_BLEND_MODE": "Závoj",
+  "COLOR_DODGE_BLEND_MODE": "Zesvětlit barvy",
+  "OVERLAY_BLEND_MODE": "Překrýt",
+  "SOFT_LIGHT_BLEND_MODE": "Měkké světlo",
+  "HARD_LIGHT_BLEND_MODE": "Tvrdé světlo",
+  "DIFFERENCE_BLEND_MODE": "Rozdíl",
+  "EXCLUSION_BLEND_MODE": "Vyloučit",
+  "HUE_BLEND_MODE": "Odstín",
+  "SATURATION_BLEND_MODE": "Sytost",
+  "LUMINOSITY_BLEND_MODE": "Světlost",
+  "COLOR_BLEND_MODE": "Barva",
+  "NOT_SUPPORTED_BLEND_MODE": "Není podporováno",
+  "RESTART": "Restartovat",
+  "SORT_BY": "Řazeno podle",
+  "NAME": "Jméno",
+  "COLORS": "Barvy",
+  "DEFAULT": "Standartně",
+  "ALPHABETICAL": "Abecední",
+  "COLOR_COUNT": "Počet barev",
+  "ANY": "Jakýkoliv",
+  "MAX": "Max",
+  "MIN": "Min",
+  "EXACT": "Přesně",
+  "ASCENDING": "Vzestupně",
+  "DESCENDING": "Sestupně",
+  "NAME_IS_TOO_LONG": "Název je moc dlouhý",
+  "STOP_IT_TEXT1": "Dost. Udělej pořádek v názvech souborů.",
+  "STOP_IT_TEXT2": "Můžeš přestat kopírovat tyhle jména prosím?",
+  "REPLACER_TOOLTIP": "Klikni pravým tlačítkem na barvu palety a vyber \"Nahradit\" nebo ji sem přeneste.",
+  "CLICK_TO_CHOOSE_COLOR": "Klikni pro vybrání barvy",
+  "REPLACE_COLOR": "Nahradit barvu",
+  "PALETTE_COLOR_TOOLTIP": "Kliknutím vyberte jako hlavní barvu. Přetažením na jinou paletu je vyměníte.",
+  "ADD_FROM_SWATCHES": "Přidat ze vzorků",
+  "ADD_COLOR_TO_PALETTE": "Přidat barvu na paletu",
+  "USE_IN_CURRENT_IMAGE": "Použít v tomhle obrázku",
+  "ADD_TO_FAVORITES": "Přidat do oblíbených",
+  "BROWSE_PALETTES": "Procházet palety",
+  "LOAD_PALETTE": "Načíst paletu",
+  "SAVE_PALETTE": "Uložit paletu",
+  "FAVORITES": "Oblíbené",
+  "ADD_FROM_CURRENT_PALETTE": "Přidat ze současné palety",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Otevření adresáře palet v Průzkumníku souborů",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Procházet palety na \"Lospec\"",
+  "IMPORT_FROM_FILE_TOOLTIP": "Nahrát ze složky",
+  "TOP_LEFT": "V levo nahoře",
+  "TOP_CENTER": "Ve středu nahoře",
+  "TOP_RIGHT": "V pravo nahoře",
+  "MIDDLE_LEFT": "Prostřední vlevo",
+  "MIDDLE_CENTER": "Prostřední uprostřed",
+  "MIDDLE_RIGHT": "Prostřední pravo",
+  "BOTTOM_LEFT": "Nalevo dole",
+  "BOTTOM_CENTER": "Střed dole",
+  "BOTTOM_RIGHT": "Vpravo dole",
+  "CLIP_TO_BELOW": "Spoj do vrstvy níže",
+  "MOVE_UPWARDS": "Pohnout nahoru",
+  "MOVE_DOWNWARDS": "Pohnout dolů",
+  "MERGE_SELECTED": "Spojit vybrané",
+  "LOCK_TRANSPARENCY": "Uzamknout transparentnost",
+  "COULD_NOT_LOAD_PALETTE": "Nepodařilo se načíst palety",
+  "NO_PALETTES_FOUND": "Žádná paleta nebyla nalezena.",
+  "LOSPEC_LINK_TEXT": "Slyšel jsem, že můžeš najít nějaké tady: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Prohlížeč palet",
+  "DELETE_PALETTE_CONFIRMATION": "Chceš opravdu odstranit tuhle paletu? Odstranění je na vždy tak pozor.",
+  "SHORTCUTS_IMPORTED": "Klávesové zkratky z {0} byly importované úspěšně.",
+  "SHORTCUT_PROVIDER_DETECTED": "Zjistili jsme, že máš nainstalovaný {0}. Chceš aby jsme z toho importovali klávesové zkratky?",
+  "IMPORT_FROM_INSTALLATION": "Importovat z instalace",
+  "IMPORT_INSTALLATION_OPTION1": "Importovat z instalace",
+  "IMPORT_INSTALLATION_OPTION2": "Použít výchozí nastavení",
+  "IMPORT_FROM_TEMPLATE": "Importovat z šablony",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Klávesové zkratky byly importované úspěšně.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Jsi si jist toho co se právě chystáš udělat? Opravdu chceš přenastavit všechny klávesové zkratky zase do normálu? ",
+  "SUCCESS": "Us",
+  "WARNING": "VAROVÁNÍ",
+  "ERROR_IMPORTING_IMAGE": "Při importu obrázku došlo k chybě.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Poškozený soubor s klávesovýma zkratkama",
+  "SHORTCUTS_CORRUPTED": "Složka s klávesovýma zkratkami byla poškozena, resetování do výchozího nastavení.",
+  "FAILED_DOWNLOAD_PALETTE": "Nepodařilo se stáhnout paletu",
+  "FILE_INCORRECT_FORMAT": "Soubor je ve špatném formátu",
+  "INVALID_FILE": "Neplatný soubor",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "Soubor s klávesovýma zkratkami není ve správném formátu",
+  "UNSUPPORTED_FILE_FORMAT": "Tenhle formát souboru není podporován",
+  "ALREADY_ASSIGNED": "Už přidělený",
+  "REPLACE": "Nahradit",
+  "SWAP": "Přepnout",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Tahle klávesová zkratka je již použita u '{0}'\nPřejete si nahradit existující klávesovou zkratku, nebo je vzájemně prohodit?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Tahle klávesová zkratka je již použita u '{0}'\nPřejete si nahradit existující klávesovou zkratku?",
+  "UNSAVED_CHANGES": "Neuložené změny",
+  "DOCUMENT_MODIFIED_SAVE": "Dokument byl upraven. Chcete změny uložit?",
+  "SESSION_UNSAVED_DATA": "{0} s neuloženými daty. Jste si jisti?",
+  "PROJECT_MAINTAINERS": "Správci projektu",
+  "OTHER_AWESOME_CONTRIBUTORS": "A další úžasní přispěvatelé",
+  "HELP": "Pomoc",
+  "STOP_IT_TEXT3": "Hele opravdu přestaň.",
+  "STOP_IT_TEXT4": "Vážně nemáš nic lepšího na práci?",
+  "LINEAR_DODGE_BLEND_MODE": "Lineárně zesvětlit (Přidat)",
+  "PRESS_ANY_KEY": "Zmáčkni jakoukoliv klávesu",
+  "NONE_SHORTCUT": "Žádná",
+  "REFERENCE": "Referenční",
+  "PUT_REFERENCE_LAYER_ABOVE": "Dát referenční vrstvu pod",
+  "PUT_REFERENCE_LAYER_BELOW": "Dát referenční vrstvu nad",
+  "TOGGLE_VERTICAL_SYMMETRY": "Přepnout vertikální symetrii",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Zapnout vodorovnou symetrii",
+  "RESET_VIEWPORT": "Resetovat pole pohledu",
+  "VIEWPORT_SETTINGS": "Nastavení pohledu",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Klikni a drž tlačítko myši pro přesouvání pixelů ve vybraných vrstvách.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Podržením myši přesunete všechny vrstvy.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Přejmenovat",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Otevřít okno Localization Debug",
+  "FORCE_OTHER_FLOW_DIRECTION": "Vynutit jiný směr toku",
+  "API_KEY": "API Klíč",
+  "LOCALIZATION_VIEW_TYPE": "Typ zobrazení lokalizace",
+  "LOAD_LANGUAGE_FROM_FILE": "Načíst jazyk ze složky",
+  "LOG_IN": "Přihlásit se",
+  "SYNC": "Synchronizace",
+  "NOT_LOGGED_IN": "Nepřihlášeno",
+  "POE_EDITOR_ERROR": "POEditor Error: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP Error\" {0} {1}",
+  "LOGGED_IN": "Přihlášeno",
+  "SYNCED_SUCCESSFULLY": "Úspěšně synchronizováno",
+  "EXCEPTION_ERROR": "Výjimka: {0}",
+  "DROP_PALETTE": "Sem přesuňte paletu",
+  "SECURITY_ERROR": "Bezpečnostní chyba",
+  "SECURITY_ERROR_MSG": "Nejsou práva do této určené lokace",
+  "IO_ERROR": "IO chyba",
+  "IO_ERROR_MSG": "Chyba při zápisu a disk.",
+  "FAILED_ASSOCIATE_PIXI": "Nepodařilo se spojit .pixi soubor s PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Nastala chyba při ukládání palety.",
+  "NO_COLORS_TO_SAVE": "Nejsou žádné barvy k uložení",
+  "ALL_LAYERS": "Všechny vrstvy",
+  "SINGLE_LAYER": "Jediná vrstva",
+  "CHOOSE": "Vybrat",
+  "REMOVE": "Odstranit",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "Soubor není typu \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "Soubor obsahuje klávesovou zkratku",
+  "FILE_EXTENSION_NOT_SUPPORTED": "Typ souboru \"{0} není podporován",
+  "ERROR_READING_FILE": "Chyba při čtení souboru",
+  "DISCARD_PALETTE": "Smazat paletu",
+  "DISCARD_PALETTE_CONFIRMATION": "Jsi si jist že chceš smazat současnou paletu? Tahle akce nejde vrátit.",
+  "IMPORT_AS_NEW_LAYER": "Importovat jako novou vrstvu",
+  "PASTE_AS_PRIMARY_COLOR": "Vložit jako hlavní barvu",
+  "IMPORT_AS_NEW_FILE": "Importovat jako nový soubor",
+  "IMPORT_PALETTE_FILE": "Importovat soubor palety",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Importovat barvy do palety",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Importovat barvu do palety",
+  "IMPORT_AS_REFERENCE_LAYER": "Importovat jako referenční vrstvu",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Pravím tlačítkem myši vybereš barvu, když budeš držet \"Shift\" a zmáčkneš pravé tlačítko myší, zkopíruješ barvu do schránky",
+  "OPEN_FILE_FROM_CLIPBOARD": "Otevřít ze schránky",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Otevřít ze schránky",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Downloading language failed.\nAPI Key might have been overused.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Localization data path not found",
+  "APPLY": "Apply",
+  "UPDATE_SOURCE": "Update source",
+  "COPY_TO_CLIPBOARD": "Copy to clipboard",
+  "LANGUAGE_FILE_NOT_FOUND": "Language file not found.\nLooking for {0}",
+  "PROJECT_ROOT_NOT_FOUND": "PixiEditor Project root not found.\nLooking for PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Localization folder not found.\nLooking for /Data/Localization",
+  "SELECT_A_LANGUAGE": "Select a language",
+  "DONE": "Done",
+  "SOURCE_UNSET_OR_MISSING": "Source missing/unset",
+  "SOURCE_NEWER": "Source newer",
+  "SOURCE_UP_TO_DATE": "Source is up to date",
+  "SOURCE_OLDER": "Cloud newer",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/de.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "Zuletzt geöffnete Dateien",
+  "OPEN_FILE": "Datei öffnen",
+  "NEW_FILE": "Neu",
+  "RECENT_EMPTY_TEXT": "So viel Platz hier, den sollte mal jemand füllen",
+  "LANGUAGE": "Sprache",
+  "GENERAL": "Generell",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Tastenkürzel",
+  "MISC": "Sonstige",
+  "SHOW_STARTUP_WINDOW": "Startfenster beim Start öffnen",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Bildvorschau in der Taskbar anzeigen",
+  "RECENT_FILE_LENGTH": "Anzahl an gezeigten zuletzt geöffneten datein",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Wie viele zuletzt geöffnete Dateien in der Datei > Zuletzt geöffnet liste angezeigt werden. Standard: 8",
+  "DEFAULT_NEW_SIZE": "Standardgröße neuer Datein",
+  "WIDTH": "Breite",
+  "HEIGHT": "Höhe",
+  "TOOLS": "Werkzeuge",
+  "ENABLE_SHARED_TOOLBAR": "Werkzeugeinstellungen teilen",
+  "AUTOMATIC_UPDATES": "Automatische Updates",
+  "CHECK_FOR_UPDATES": "Nach Updates beim Start suchen",
+  "UPDATE_STREAM": "Updatequelle",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Update quelle kann nur in der standalone version geändert werden (Verfügbar unter https://pixieditor.net).\nSteam und Microsoft Store hat ihr eigenes Update System.",
+  "DEBUG": "Debug",
+  "ENABLE_DEBUG_MODE": "Debug Modus aktivieren",
+  "OPEN_CRASH_REPORTS_DIR": "Fehlerberichtverzeichnis öffnen",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Aktiv",
+  "SHOW_IMAGE_NAME": "Dateinamen zeigen",
+  "SHOW_IMAGE_SIZE": "Dateigröße zeigen",
+  "SHOW_LAYER_COUNT": "Anzahl an Ebenen zeigen",
+  "FILE": "Datei",
+  "RECENT": "Zuletzt geöffnet",
+  "OPEN": "Öffnen",
+  "SAVE_PIXI": "Speichern (.pixi)",
+  "SAVE_AS_PIXI": "Speichern als... (.pixi)",
+  "EXPORT_IMG": "Exportieren (.png, .jpg, etc.)",
+  "EDIT": "Bearbeiten",
+  "EXIT": "Beenden",
+  "PERCENTAGE": "Prozent",
+  "ABSOLUTE": "Absolut",
+  "PRESERVE_ASPECT_RATIO": "Seitenverhältnis beibehalten",
+  "ANCHOR_POINT": "Ankerpunkt",
+  "RESIZE_IMAGE": "Bild skalieren",
+  "RESIZE": "Skalieren",
+  "DOCUMENTATION": "Dokumentation",
+  "WEBSITE": "Website",
+  "OPEN_WEBSITE": "Website öffnen",
+  "REPOSITORY": "Repository",
+  "OPEN_REPOSITORY": "Repository öffnen",
+  "LICENSE": "Lizenz",
+  "OPEN_LICENSE": "Lizenz öffnen",
+  "THIRD_PARTY_LICENSES": "Drittanbieter Lizensen",
+  "OPEN_THIRD_PARTY_LICENSES": "Drittanbieter Lizensen öffnen",
+  "APPLY_TRANSFORM": "Transformation anwenden",
+  "INCREASE_TOOL_SIZE": "Werkzeug vergrößern",
+  "DECREASE_TOOL_SIZE": "Werkzeug verkleinern",
+  "TO_INSTALL_UPDATE": "um Update {0} zu installieren",
+  "DOWNLOADING_UPDATE": "Lade Update herunter...",
+  "UPDATE_READY": "Update ist bereit zum installieren. Möchtest du es jetzt installieren?",
+  "NEW_UPDATE": "Neues update",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Konnte ohne Administartor Berechtigungen nicht updaten. Bitte start PixiEditor als Administrator.",
+  "INSUFFICIENT_PERMISSIONS": "Fehlende Berechtigungen",
+  "UPDATE_CHECK_FAILED": "Updateprüfung fehlgeschlagen",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Konnte nicht überprüfen, ob ein Update verfügbar ist.",
+  "VERSION": "Version {0}",
+  "OPEN_TEMP_DIR": "temp Ordner öffnen",
+  "OPEN_LOCAL_APPDATA_DIR": "Lokalen AppData Ordner öffnen",
+  "OPEN_ROAMING_APPDATA_DIR": "Roaming AppData Ordner öffnen",
+  "OPEN_INSTALLATION_DIR": "Installations Ordner öffnen",
+  "DUMP_ALL_COMMANDS": "Alle Befehle ausgeben",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Alle Befehle als Textdatei ausgeben",
+  "CRASH": "Abstürzen",
+  "CRASH_APP": "App abstürzen",
+  "DELETE_USR_PREFS": "Benutzereinstellungen löschen (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Tastenbelegung löschen (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Editordaten löschen (Lokale AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Tastenbelegungsvorlage erstellen",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Json Tastenbelegungsvorlage erstellen",
+  "VALIDATE_SHORTCUT_MAP": "Tastenbelegung überprüfen",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Tastenbelegung überprüfen",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Leere Keys: {0}\nUnbekannte Befehle: {1}",
+  "RESULT": "Ergebnis",
+  "CLEAR_RECENT_DOCUMENTS": "Zuletzt geöffnete leeren",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Liste an zuletzt geöffneten Datein leeren",
+  "OPEN_CMD_DEBUG_WINDOW": "Befehldebug Fenster öffnen",
+  "PATH_DOES_NOT_EXIST": "{0} existiert nicht.",
+  "LOCATION_DOES_NOT_EXIST": "Pfad existiert nicht.",
+  "FILE_NOT_FOUND": "Datei nicht gefunden.",
+  "ARE_YOU_SURE": "Bist du sicher?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Bist du sicher das du {0} löschen möchtest?\nDie daten gehen für alle installationen verloren.\n(Ganzer Pfad: {1})",
+  "FAILED_TO_OPEN_FILE": "Fehler beim öffnen der Datei",
+  "OLD_FILE_FORMAT": "Altes Dateiformat",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Diese .pixi Datei nutzt das alte Dateiformat,\nwelches nicht mehr geöffnet werden kann.",
+  "NOTHING_FOUND": "Nichts gefunden",
+  "EXPORT": "Exportieren",
+  "EXPORT_IMAGE": "Bild exportieren",
+  "IMPORT": "Importieren",
+  "SHORTCUT_TEMPLATES": "Vorlagen",
+  "RESET_ALL": "Alle zurücksetzten",
+  "LAYER": "Ebene",
+  "LAYER_DELETE_SELECTED": "Ausgewählte Ebene/Ordner löschen",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Ausgewählte Ebene oder Ordner löschen",
+  "LAYER_DELETE_ALL_SELECTED": "Alle ausgewählte Ebenen/Ordner löschen",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Alle ausgewählte Ebenen oder Ordner löschen",
+  "DELETE_SELECTED_PIXELS": "Alle ausgewählten Pixel löschen",
+  "NEW_FOLDER": "Neuer Ordner",
+  "CREATE_NEW_FOLDER": "Neuen Ordner erstellen",
+  "NEW_LAYER": "Neue Ebene",
+  "CREATE_NEW_LAYER": "Neue Ebene erstellen",
+  "NEW_IMAGE": "Neues Bild",
+  "CREATE_NEW_IMAGE": "Neues Bild erstellen",
+  "SAVE": "Speichern",
+  "SAVE_AS": "Speichern als...",
+  "IMAGE": "Bild",
+  "SAVE_IMAGE": "Bild speichern",
+  "SAVE_IMAGE_AS": "Bild speichern als neue Datei",
+  "DUPLICATE": "Duplizieren",
+  "DUPLICATE_SELECTED_LAYER": "Ausgewählte Ebene löschen",
+  "CREATE_MASK": "Maske erstellen",
+  "DELETE_MASK": "Maske löschen",
+  "TOGGLE_MASK": "Maske umschalten",
+  "APPLY_MASK": "Maske anwenden",
+  "TOGGLE_VISIBILITY": "Sichtbarkeit umschalten",
+  "MOVE_MEMBER_UP": "Element nach oben bewegen",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Ausgewählte Ebene oder ausgewählten Ordner nach oben bewegen",
+  "MOVE_MEMBER_DOWN": "Element nach unten bewegen",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Ausgewählte Ebene oder ausgewählten Ordner nach unten bewegen",
+  "MERGE_ALL_SELECTED_LAYERS": "Alle ausgewählten Ebenen zusammenführen",
+  "MERGE_WITH_ABOVE": "Ebene mit der oberen zusammenführen",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Ausgewählte Ebene mit der Ebene darüber zusammenführen",
+  "MERGE_WITH_BELOW": "Ebene mit der unteren zusammenführen",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Ausgewählte Ebene mit der Ebene darunter zusammenführen",
+  "ADD_REFERENCE_LAYER": "Referenz Ebene hinzufügen",
+  "DELETE_REFERENCE_LAYER": "Referenz Ebene löschen",
+  "TRANSFORM_REFERENCE_LAYER": "Referenzebene transformieren",
+  "TOGGLE_REFERENCE_LAYER_POS": "Referenz Ebene",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Wechseln zwischen Referenzebene ganz oben oder unten",
+  "RESET_REFERENCE_LAYER_POS": "Position der Referenzebene zurücksetzten",
+  "CLIP_CANVAS": "Leinwand anpassen",
+  "FLIP_IMG_VERTICALLY": "Bild Vertikal spiegeln",
+  "FLIP_IMG_HORIZONTALLY": "Bild Horizontal spiegeln",
+  "FLIP_LAYERS_VERTICALLY": "Ausgewählte Ebenen Vertikal spiegeln",
+  "FLIP_LAYERS_HORIZONTALLY": "Ausgewählte Ebenen Horizontal spiegeln",
+  "ROT_IMG_90": "Bild um 90° drehen",
+  "ROT_IMG_180": "Bild um 180° drehen",
+  "ROT_IMG_-90": "Bild um -90° drehen",
+  "ROT_LAYERS_90": "Ausgewählte Ebene 90° drehen",
+  "ROT_LAYERS_180": "Ausgewählte Ebene 180° drehen",
+  "ROT_LAYERS_-90": "Ausgewählte Ebene -90° drehen",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Vertikale Symmetrieachse umschalten",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Horizontale Symmetrieachse umschalten",
+  "DELETE_PIXELS": "Pixel löschen",
+  "DELETE_PIXELS_DESCRIPTIVE": "Ausgewählte Pixel löschen",
+  "RESIZE_DOCUMENT": "Bild skalieren",
+  "RESIZE_CANVAS": "Leinwand skalieren",
+  "CENTER_CONTENT": "Inhalt zentrieren",
+  "CUT": "Ausschneiden",
+  "CUT_DESCRIPTIVE": "Ausgewählten Bereich oder Ausgewählte Elemente ausschneiden",
+  "PASTE": "Einfügen",
+  "PASTE_DESCRIPTIVE": "Aus Zwischenablage einfügen",
+  "PASTE_AS_NEW_LAYER": "Einfügen als neue Ebene",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Aus Zwischenablage als neue Ebene einfügen",
+  "PASTE_REFERENCE_LAYER": "Referenzebene einfügen",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Referenzebene aus Zwischenablage einfügen",
+  "PASTE_COLOR": "Farbe einfügen",
+  "PASTE_COLOR_DESCRIPTIVE": "Farbe aus Zwischenablage einfügen",
+  "PASTE_COLOR_SECONDARY": "Zeitfarbe einfügen",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Zweitfarbe aus Zwischenablage einfügen",
+  "CLIPBOARD": "Zwischenablage",
+  "COPY": "Kopieren",
+  "COPY_DESCRIPTIVE": "In Zwischenablage kopieren",
+  "COPY_COLOR_HEX": "Farbe kopieren (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Farbe als HEX-Code kopieren",
+  "COPY_COLOR_RGB": "Farbe kopieren (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Farbe als RGB-Code kopieren",
+  "COPY_COLOR_SECONDARY_HEX": "Zweitfarbe kopieren (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Zweitfarbe als HEX-Code kopieren",
+  "COPY_COLOR_SECONDARY_RGB": "Zweitfarbe kopieren (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Zweitfarbe als RGB-Code kopieren",
+  "PALETTE_COLORS": "Palette Farben",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Ersetzte Zweitfarbe mit Primärfarbe",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Ersetzte Zweitfarbe mit Primärfarbe",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Farbe mit Zweitfarbe ersetzen",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Primärfarbe mit Zweitfarbe ersetzen",
+  "OPEN_PALETTE_BROWSER": "Palette Browser öffnen",
+  "OVERWRITE_PALETTE_CONSENT": "Palette '{0}' existiert bereits, möchtest du sie ersetzten?",
+  "PALETTE_EXISTS": "Palette existiert bereits",
+  "REPLACE_PALETTE_CONSENT": "Aktuelle Palette mit anderer ersetzten?",
+  "REPLACE_PALETTE": "Aktuelle Palette ersetzen",
+  "SELECT_COLOR_1": "1. Farbe auswählen",
+  "SELECT_COLOR_2": "2. Farbe auswählen",
+  "SELECT_COLOR_3": "3. Farbe auswählen",
+  "SELECT_COLOR_4": "4. Farbe auswählen",
+  "SELECT_COLOR_5": "5. Farbe auswählen",
+  "SELECT_COLOR_6": "6. Farbe auswählen",
+  "SELECT_COLOR_7": "7. Farbe auswählen",
+  "SELECT_COLOR_8": "8. Farbe auswählen",
+  "SELECT_COLOR_9": "9. Farbe auswählen",
+  "SELECT_COLOR_10": "10. Farbe auswählen",
+  "SELECT_TOOL": "{0} auswählen",
+  "SELECT_COLOR_1_DESCRIPTIVE": "1. Farbe der Palette auswählen",
+  "SELECT_COLOR_2_DESCRIPTIVE": "2. Farbe der Palette auswählen",
+  "SELECT_COLOR_3_DESCRIPTIVE": "3. Farbe der Palette auswählen",
+  "SELECT_COLOR_4_DESCRIPTIVE": "4. Farbe der Palette auswählen",
+  "SELECT_COLOR_5_DESCRIPTIVE": "5. Farbe der Palette auswählen",
+  "SELECT_COLOR_6_DESCRIPTIVE": "6. Farbe der Palette auswählen",
+  "SELECT_COLOR_7_DESCRIPTIVE": "7. Farbe der Palette auswählen",
+  "SELECT_COLOR_8_DESCRIPTIVE": "8. Farbe der Palette auswählen",
+  "SELECT_COLOR_9_DESCRIPTIVE": "9. Farbe der Palette auswählen",
+  "SELECT_COLOR_10_DESCRIPTIVE": "10. Farbe der Palette auswählen",
+  "SWAP_COLORS": "Farben tauschen",
+  "SWAP_COLORS_DESCRIPTIVE": "Primärfarbe und Zweitfarbe wechseln",
+  "SEARCH": "Suchen",
+  "COMMAND_SEARCH": "Suche öffnen",
+  "OPEN_COMMAND_SEARCH": "Suche öffnen",
+  "SELECT": "Auswahl",
+  "DESELECT": "Nichts",
+  "INVERT": "Invertieren",
+  "SELECTION": "Auswahl",
+  "SELECT_ALL": "Alles",
+  "SELECT_ALL_DESCRIPTIVE": "Alles auswählen",
+  "CLEAR_SELECTION": "Auswahl löschen",
+  "INVERT_SELECTION": "Auswahl invertieren",
+  "INVERT_SELECTION_DESCRIPTIVE": "Auswahl invertieren",
+  "TRANSFORM_SELECTED_AREA": "Auswahl transformieren",
+  "NUDGE_SELECTED_LEFT": "Ausgewähltes Objekt nach links bewegen",
+  "NUDGE_SELECTED_RIGHT": "Ausgewähltes Objekt nach rechts bewegen",
+  "NUDGE_SELECTED_UP": "Ausgewähltes Objekt nach oben bewegen",
+  "NUDGE_SELECTED_DOWN": "Ausgewähltes Objekt nach unten bewegen",
+  "MASK_FROM_SELECTION": "Neue Maske aus Auswahl",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Maske aus Auswahl erstellen",
+  "ADD_SELECTION_TO_MASK": "Auswahl zu Maske hinzufügen",
+  "SUBTRACT_SELECTION_FROM_MASK": "Auswahl von Maske entfernen",
+  "INTERSECT_SELECTION_MASK": "Auswahl mit Maske schneiden",
+  "SELECTION_TO_MASK": "Maske aus Auswahl",
+  "TO_NEW_MASK": "Auswahl als neue Maske",
+  "ADD_TO_MASK": "Auswahl zu Maske hinzufügen",
+  "SUBTRACT_FROM_MASK": "Auswahl von Maske entferenen",
+  "INTERSECT_WITH_MASK": "Auswahl mit Maske schneiden",
+  "STYLUS": "Eingabestift",
+  "TOGGLE_PEN_MODE": "Stiftmodus umschalten",
+  "UNDO": "Rückgängig",
+  "UNDO_DESCRIPTIVE": "Rückgängig machen",
+  "REDO": "Wiederherstellen",
+  "REDO_DESCRIPTIVE": "Letzte Aktion wiederherstellen",
+  "WINDOWS": "Fenster",
+  "TOGGLE_GRIDLINES": "Raster umschalten",
+  "ZOOM_IN": "Reinzommen",
+  "ZOOM_OUT": "Rauszoomen",
+  "NEW_WINDOW_FOR_IMG": "Neues Fenster für Bild",
+  "CENTER_ACTIVE_VIEWPORT": "Anzeigebereich zentrieren",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Anzeigebereich Horizontal spiegeln",
+  "FLIP_VIEWPORT_VERTICALLY": "Anzeigebereich Vertikal spiegeln",
+  "SETTINGS": "Preferenzen",
+  "OPEN_SETTINGS": "Preferenzen öffnen",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Präferenzfenster öffnen",
+  "OPEN_STARTUP_WINDOW": "Startfenster öffnen",
+  "OPEN_SHORTCUT_WINDOW": "Tastenkürzelfenster öffnen",
+  "OPEN_ABOUT_WINDOW": "Info über PixiEditor öffnen",
+  "OPEN_NAVIGATION_WINDOW": "Navigationsfenster öffnen",
+  "ERROR": "Fehler",
+  "INTERNAL_ERROR": "Interner Fehler",
+  "ERROR_SAVE_LOCATION": "Konnte die Datei nicht unter diesem Pfad speichern",
+  "ERROR_WHILE_SAVING": "Ein internet Fehler ist beim speichern passiert. Bitte versuche es erneut.",
+  "UNKNOWN_ERROR_SAVING": "Ein Fehler ist beim speichern passiert.",
+  "FAILED_ASSOCIATE_LOSPEC": "Konnte das Lospec Protokoll nicht einstellen.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Spenden",
+  "YES": "Ja",
+  "NO": "Nein",
+  "CANCEL": "Abbrechen",
+  "UNNAMED": "Unbenannt",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Befehldebug Fenster öffnen",
+  "DELETE": "Löschen",
+  "USER_PREFS": "Nutzerpräferenzen (Roaming)",
+  "SHORTCUT_FILE": "Tastenbelegung (Roaming)",
+  "EDITOR_DATA": "Editordaten (Lokal)",
+  "MOVE_VIEWPORT_TOOLTIP": "Bewegt Anzeigebereich. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Klicke and bewege die Maus um den Anzeigebereich zu bewegen",
+  "MOVE_TOOL_TOOLTIP": "Bewegt die ausgewählten Pixel ({0}). Halte Strg um alle Ebenen zu bewegen.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Halte die Maus um die ausgewählten Pixel zu bewegen. Halte Strg um alle Ebenen zu bewegen.",
+  "PEN_TOOL_TOOLTIP": "Stift. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Klick und halte die Maus um zu zeichnen.",
+  "PIXEL_PERFECT_SETTING": "Pixel Perfekt",
+  "RECTANGLE_TOOL_TOOLTIP": "Zeichnet Rechteck auf Leinwand ({0])",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und bewegen die Maus um ein Rechteck zu zeichnen. Halte die Umschalttaste/Shift um ein Quadrat zu zeichnen.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und halte um ein Quadrat zu zeichnen.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Originalbild beibehalten",
+  "ROTATE_VIEWPORT_TOOLTIP": "Rotiert den Anzeigebereich. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Klicke und bewege die Maus um den Anzeigebereich zu rotieren",
+  "SELECT_TOOL_TOOLTIP": "Wählt Bereich aus. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und bewegen die Maus um einen Bereich auszuwählen. Halte die Umschalttaste/Shift um zu der existierenden Auswahl hinzuzufügen. Halte Strg um von ihr zu entfernen.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und bewegen die Maus um den Bereich zur aktuellen Auswahl hinzuzufügen.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Clicke und Bewege die Maus um den Bereich von der aktuellen Auswahl zu löschen.",
+  "ZOOM_TOOL_TOOLTIP": "Zoomt Anzeigebereich ({0}). Klicke um rein zu zoomen, halte Strg und Klicke um raus zu zoomen.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und bewegen die Maus um zu zoomen. Klicke nur, um rein zu zoomen. Halte Strg und Klicke um raus zu zoomen.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Klicke und bewegen die Maus um zu zoomen. Klicke nur, um raus zu zoomen. Lasse Strg los, um Klicke nur, um rein zu zoomen",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Macht Pixel heller oder dunkler ({0}). Halte Strg um Pixel dunkler zu machen.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Zeichne auf Pixel um sie heller zu machen. Halte Strg um sie zu dunkler zu machen.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Zeichne auf Pixel um sie dunkler zu machen. Lasse Strg los um sie zu heller zu machen.",
+  "COLOR_PICKER_TOOLTIP": "Pickt die Farbe von der Leinwand. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Klick um eine Farbe zu picken. Halte Strg um die Referenzebene zu verstecken.",
+  "ELLIPSE_TOOL_TOOLTIP": "Zeichnet eine Ellipse auf die Leinwand ({0}). Halte die Umschalttaste/Shift um einen Kreis zu zeichnen.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und halte die Maus um eine Ellipse zu zeichnen. Halte die Umschalttaste/Shift um einen Kreis zu zeichnen.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und bewege die Maus um einen Kreis zu zeichnen.",
+  "ERASER_TOOL_TOOLTIP": "Radierer. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Klicke und bewege die Maus zum radieren.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Füllte den Bereich mit Farbe. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Drücke auf einen Bereich, um ihn zu füllen. Halte Strg um alle Ebenen zu berücksichtigen.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Drücke auf einen Bereich, um ihn zu füllen. Lasse Strg los, um nur die ausgewählte Ebene zu berücksichtigen.",
+  "LASSO_TOOL_TOOLTIP": "Lasso. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und bewege die Maus um den Bereich im Lasso auszuwählen. Halte die Umschalttaste/Shift um zu der aktuellen Auswahl hinzuzufügen. Halte Strg um von ihr zu entfernen.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und bewege die Maus um den Bereich im Lasso der aktuellen Auswahl hinzuzufügen.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Klicke und bewege die Maus um den Bereich im Lasso von der aktuellen Auswahl zu entfernen.",
+  "LINE_TOOL_TOOLTIP": "Zeichnet Linien auf die Leinwand ({0}). Halte die Umschalttaste/Shift um diagonale Linien zu zeichnen.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und bewege die Maus um eine Linie zu zeichnen. Halte die Umschalttaste/Shift um eine diagonale Linie zu zeichnen.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und bewege die Maus um eine diagonale Linie zu zeichnen.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Zauberstab ({0}). Füllte die Auswahl",
+  "MAGIC_WAND_ACTION_DISPLAY": "Klicke um die Auswahl zu füllen.",
+  "PEN_TOOL": "Stift",
+  "BRIGHTNESS_TOOL": "Helligkeitswerkzeug",
+  "COLOR_PICKER_TOOL": "Pipette",
+  "ELLIPSE_TOOL": "Ellipse",
+  "ERASER_TOOL": "Radierer",
+  "FLOOD_FILL_TOOL": "Füllwerkzeug",
+  "LASSO_TOOL": "Lasso",
+  "LINE_TOOL": "Linie",
+  "MAGIC_WAND_TOOL": "Zauberstab",
+  "MOVE_TOOL": "Verschiebungswerkzeug",
+  "MOVE_VIEWPORT_TOOL": "Ansichtswerkzeug",
+  "RECTANGLE_TOOL": "Rechteck",
+  "ROTATE_VIEWPORT_TOOL": "Anzeigebereichrotierer",
+  "SELECT_TOOL_NAME": "Auswahlrahmen",
+  "ZOOM_TOOL": "Zoomwerkzeug",
+  "SHAPE_LABEL": "Form",
+  "MODE_LABEL": "Modus",
+  "SCOPE_LABEL": "Bereich",
+  "FILL_SHAPE_LABEL": "Form füllen",
+  "FILL_COLOR_LABEL": "Füllfarbe",
+  "TOOL_SIZE_LABEL": "Werkzeuggröße",
+  "STRENGTH_LABEL": "Stärke",
+  "NEW": "Neu",
+  "ADD": "Addieren",
+  "SUBTRACT": "Subtrahieren",
+  "INTERSECT": "Schneiden",
+  "RECTANGLE": "Rechteck",
+  "CIRCLE": "Kreis",
+  "ABOUT": "Über PixiEditor",
+  "MINIMIZE": "Minimieren",
+  "RESTORE": "Widerherstellen",
+  "MAXIMIZE": "Maximieren",
+  "CLOSE": "Schließen",
+  "EXPORT_SIZE_HINT": "Falls du das Bild teilen möchtest, benutz {0}% um es scharf zu halten",
+  "CREATE": "Erstellen",
+  "BASE_LAYER_NAME": "Standard Ebene",
+  "ENABLE_MASK": "Maske aktivieren",
+  "SELECTED_AREA_EMPTY": "Ausgewählter Bereich ist leer",
+  "NOTHING_TO_COPY": "Nichts zu kopieren",
+  "REFERENCE_LAYER_PATH": "Referenzebenen Pfad",
+  "FLIP": "Spiegeln",
+  "ROTATION": "Rotieren",
+  "ROT_IMG_90_D": "Bild um 90° drehen",
+  "ROT_IMG_180_D": "Bild um 180° drehen",
+  "ROT_IMG_-90_D": "Bild um -90° drehen",
+  "ROT_LAYERS_90_D": "Ausgewählte Ebenen um 90° drehen",
+  "ROT_LAYERS_180_D": "Ausgewählte Ebenen um 180° drehen",
+  "ROT_LAYERS_-90_D": "Ausgewählte Ebenen um -90° drehen",
+  "UNNAMED_PALETTE": "Unbenannte Palette",
+  "CLICK_SELECT_PRIMARY": "Klicke um als Hauptfarbe auszuwählen.",
+  "PEN_MODE": "Stift Modus",
+  "VIEW": "Ansicht",
+  "HORIZONTAL_LINE_SYMMETRY": "Horizontale Symterrie Linie",
+  "VERTICAL_LINE_SYMMETRY": "Vertikale Symterrie Linie",
+  "COLOR_PICKER_TITLE": "Farbauswahl",
+  "COLOR_SLIDERS_TITLE": "Farbregler",
+  "PALETTE_TITLE": "Palette",
+  "SWATCHES_TITLE": "Farbfelder",
+  "LAYERS_TITLE": "Ebenen",
+  "NAVIGATION_TITLE": "Navigation",
+  "NORMAL_BLEND_MODE": "Normal",
+  "DARKEN_BLEND_MODE": "Abdunkeln",
+  "MULTIPLY_BLEND_MODE": "Multiplizieren",
+  "COLOR_BURN_BLEND_MODE": "Farben nachbelichten",
+  "LIGHTEN_BLEND_MODE": "Aufhellen",
+  "SCREEN_BLEND_MODE": "Negativ multiplizieren",
+  "COLOR_DODGE_BLEND_MODE": "Farben abwedeln",
+  "OVERLAY_BLEND_MODE": "Ineinanderkopieren",
+  "SOFT_LIGHT_BLEND_MODE": "Weiches Licht",
+  "HARD_LIGHT_BLEND_MODE": "Hartes Licht",
+  "DIFFERENCE_BLEND_MODE": "Differenz",
+  "EXCLUSION_BLEND_MODE": "Ausschluss",
+  "HUE_BLEND_MODE": "Farbton",
+  "SATURATION_BLEND_MODE": "Sättigung",
+  "LUMINOSITY_BLEND_MODE": "Luminanz",
+  "COLOR_BLEND_MODE": "Farbe",
+  "NOT_SUPPORTED_BLEND_MODE": "Nicht unterstützt",
+  "RESTART": "Neustarten",
+  "SORT_BY": "Sortieren nach",
+  "NAME": "Name",
+  "COLORS": "Farben",
+  "DEFAULT": "Standard",
+  "ALPHABETICAL": "Alphabetisch",
+  "COLOR_COUNT": "Anzahl an Farben",
+  "ANY": "Alle",
+  "MAX": "Max",
+  "MIN": "Min",
+  "EXACT": "Exakt",
+  "ASCENDING": "Aufsteigend",
+  "DESCENDING": "Absteigend",
+  "NAME_IS_TOO_LONG": "Der Name ist zu lang",
+  "STOP_IT_TEXT1": "Dat isch a bissle lang",
+  "STOP_IT_TEXT2": "Reicht dann auch mal wieder",
+  "REPLACER_TOOLTIP": "Rechts klick auf die Palette und auf 'Ersetzten' oder Drag-n-drop sie hier.",
+  "CLICK_TO_CHOOSE_COLOR": "Klicke um Farbe auszuwählen",
+  "REPLACE_COLOR": "Farbe ersetzten",
+  "PALETTE_COLOR_TOOLTIP": "Klicke um Hauptfarbe auszuwählen. Drag-n-drop eine andere palette um sie zu wechseln.",
+  "ADD_FROM_SWATCHES": "Fügt Farbfelder hinzu",
+  "ADD_COLOR_TO_PALETTE": "Fügt Farbe der Palette zu",
+  "USE_IN_CURRENT_IMAGE": "In aktuellen Bild benutzten",
+  "ADD_TO_FAVORITES": "Zu Favoriten hinzufügen",
+  "BROWSE_PALETTES": "Palettes browsen",
+  "LOAD_PALETTE": "Palette laden",
+  "SAVE_PALETTE": "Palette speichern",
+  "FAVORITES": "Favoriten",
+  "ADD_FROM_CURRENT_PALETTE": "Aus aktueller Palette hinzufügen",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Öffnet Palettenverzeichnis in Explorer",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Palettes auf Lospec browsen",
+  "IMPORT_FROM_FILE_TOOLTIP": "Aus Datei importieren",
+  "TOP_LEFT": "Oben links",
+  "TOP_CENTER": "Oben zentral",
+  "TOP_RIGHT": "Oben rechts",
+  "MIDDLE_LEFT": "Mitte Links",
+  "MIDDLE_CENTER": "Zentrale Mitte",
+  "MIDDLE_RIGHT": "Mitte Rechts",
+  "BOTTOM_LEFT": "Unten Links",
+  "BOTTOM_CENTER": "Unten Zentral",
+  "BOTTOM_RIGHT": "Unten Rechts",
+  "CLIP_TO_BELOW": "Auf Ebene darunter zuschneiden",
+  "MOVE_UPWARDS": "Nach oben bewegen",
+  "MOVE_DOWNWARDS": "Nach unten bewegen",
+  "MERGE_SELECTED": "Ausgewählte zusammenführen",
+  "LOCK_TRANSPARENCY": "Transparenz behalten",
+  "COULD_NOT_LOAD_PALETTE": "Konnte Paletten nicht laden",
+  "NO_PALETTES_FOUND": "Es wurden keine Paletten gefunden.",
+  "LOSPEC_LINK_TEXT": "Vielleicht findest du ja welche hier: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Paletten Browser",
+  "DELETE_PALETTE_CONFIRMATION": "Soll diese Palette wirklich gelöscht werden? Dies kann nicht rückgängig gemacht werden.",
+  "SHORTCUTS_IMPORTED": "Tastenbelegung von {0} importiert.",
+  "SHORTCUT_PROVIDER_DETECTED": "Es scheint, als hättest du {0} installiert. Möchtest du die Tastenbelegung von {0} benutzten?",
+  "IMPORT_FROM_INSTALLATION": "Aus Installation importieren",
+  "IMPORT_INSTALLATION_OPTION1": "Aus Installation importieren",
+  "IMPORT_INSTALLATION_OPTION2": "Standardvorlage benutzten",
+  "IMPORT_FROM_TEMPLATE": "Aus Vorlage importieren",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Tastenbelegung wurde erfolgreich importiert.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Bist du sicher das du deine Tastenbelegung auf den standard zurücksetzten möchtest?",
+  "SUCCESS": "Erfolg",
+  "WARNING": "Warnung",
+  "ERROR_IMPORTING_IMAGE": "Ein Fehler ist beim importieren des Bildes passiert.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Korruptierte Tastenbelegung",
+  "SHORTCUTS_CORRUPTED": "Tastenbelegungsdatei ist korrupt. Tastenbelegung wurde auf den standard zurück gesetzt.",
+  "FAILED_DOWNLOAD_PALETTE": "Downloaded der Palette fehlgeschlagen",
+  "FILE_INCORRECT_FORMAT": "Die Datei war nicht in einem korrekten Format",
+  "INVALID_FILE": "Invalide Datei",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "Tastenbelegungsdatei war nicht in einem korrekten Format.",
+  "UNSUPPORTED_FILE_FORMAT": "Das Datei Format ist nicht unterstüzt",
+  "ALREADY_ASSIGNED": "Bereits benutzt",
+  "REPLACE": "Ersetzten",
+  "SWAP": "Wechseln",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Dieses Tastenkürzel ist schon für '{0}' zugewiesen\nSoll es ersetzt oder mit dem aktuellen getauscht werden?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Dieses Tastenkürzel ist schon für '{0}' zugewiesen\nSoll es mit dem aktuellen ersetzt werden?",
+  "UNSAVED_CHANGES": "Ungespeicherte änderungen",
+  "DOCUMENT_MODIFIED_SAVE": "Das Bild wurde verändert. Möchtest du die Änderungen speichern?",
+  "SESSION_UNSAVED_DATA": "{0} mit ungespeicherten Dateien. Bist du sicher?",
+  "PROJECT_MAINTAINERS": "Projektverwalter",
+  "OTHER_AWESOME_CONTRIBUTORS": "Und andere tolle Mitwirkende",
+  "HELP": "Hilfe",
+  "STOP_IT_TEXT3": "Des isch dann gnua.",
+  "STOP_IT_TEXT4": "Bittschön nicht so lang.",
+  "LINEAR_DODGE_BLEND_MODE": "Linear abwedeln",
+  "PRESS_ANY_KEY": "Drücke eine Taste",
+  "NONE_SHORTCUT": "Nichts",
+  "REFERENCE": "Referenz",
+  "PUT_REFERENCE_LAYER_ABOVE": "Zeige Referenz Ebene als erste",
+  "PUT_REFERENCE_LAYER_BELOW": "Zeige Referenz Ebene als letzte",
+  "TOGGLE_VERTICAL_SYMMETRY": "Vertikale Symmetrie umschalten",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Horizontale Symmetrie umschalten",
+  "RESET_VIEWPORT": "Anzeigebereich zurücksetzten",
+  "VIEWPORT_SETTINGS": "Anzeigebereich Einstellungen",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Klicke und bewege die Maus um alle Pixel in den Ausgewählten Ebenen zu bewegen.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Halte und bewege die Maus, um alle Ebenen zu bewegen.",
+  "CTRL_KEY": "Strg",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Umbenennen",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Lokalisierungsdebug Fenster öffnen",
+  "FORCE_OTHER_FLOW_DIRECTION": "Andere Layoutrichtung erzwingen",
+  "API_KEY": "API Schlüssel",
+  "LOCALIZATION_VIEW_TYPE": "Lokalisierungs Ansicht",
+  "LOAD_LANGUAGE_FROM_FILE": "Sprache aus Datei laden",
+  "LOG_IN": "Einloggen",
+  "SYNC": "Sync",
+  "NOT_LOGGED_IN": "Nicht eingeloggt",
+  "POE_EDITOR_ERROR": "POEditor Fehler: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP Fehler: {0} {1}",
+  "LOGGED_IN": "Eingeloggt",
+  "SYNCED_SUCCESSFULLY": "Erfolgreich synchronisiert",
+  "EXCEPTION_ERROR": "Exception: {0}",
+  "DROP_PALETTE": "Palette hier fallen lassen",
+  "SECURITY_ERROR": "Berechtigungsfehler",
+  "SECURITY_ERROR_MSG": "Keine Berechtigungen um an dem Ort zu speichern.",
+  "IO_ERROR": "IO Fehler",
+  "IO_ERROR_MSG": "Fehler beim schreiben der Datei.",
+  "FAILED_ASSOCIATE_PIXI": "Fehler beim assoziieren von .pixi mit PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Es gab einen Fehler beim speichern der Palette.",
+  "NO_COLORS_TO_SAVE": "Es gibt keine Farben zum speichern.",
+  "ALL_LAYERS": "Alle Ebenen",
+  "SINGLE_LAYER": "Ausgewählte Ebene",
+  "CHOOSE": "Auswählen",
+  "REMOVE": "Entfernen",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "Datei ist keine \".aseprite-keys\" Datei",
+  "FILE_HAS_INVALID_SHORTCUT": "Die Datei beinhaltet nicht valide Tastenkürzel",
+  "FILE_EXTENSION_NOT_SUPPORTED": "Der Dateitype '{0}' ist nicht unterstützt",
+  "ERROR_READING_FILE": "Fehler beim Lesen der Datei",
+  "DISCARD_PALETTE": "Palette löschen",
+  "DISCARD_PALETTE_CONFIRMATION": "Bist du sicher, das du die aktuelle palette löschen möchtest? Dies kann nicht rückgängig gemacht werden.",
+  "IMPORT_AS_NEW_LAYER": "Als neue Ebene importieren",
+  "PASTE_AS_PRIMARY_COLOR": "Als Primärfarbe einfügen",
+  "IMPORT_AS_NEW_FILE": "Als neue Datei importieren",
+  "IMPORT_PALETTE_FILE": "Palettedatei importieren",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Farben in Palette importieren",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Farbe in Palette importieren",
+  "IMPORT_AS_REFERENCE_LAYER": "Als Referenzebene importieren",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Rechtsklick um farbe zu picken, Shift + Rechtsklick um sie in die Zwischenablage zu kopieren",
+  "OPEN_FILE_FROM_CLIPBOARD": "Aus Zwischenablage öffnen",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Datei aus Zwischenablage öffnen",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Downloading language failed.\nAPI Key might have been overused.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Localization data path not found",
+  "APPLY": "Apply",
+  "UPDATE_SOURCE": "Update source",
+  "COPY_TO_CLIPBOARD": "Copy to clipboard",
+  "LANGUAGE_FILE_NOT_FOUND": "Language file not found.\nLooking for {0}",
+  "PROJECT_ROOT_NOT_FOUND": "PixiEditor Project root not found.\nLooking for PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Localization folder not found.\nLooking for /Data/Localization",
+  "SELECT_A_LANGUAGE": "Select a language",
+  "DONE": "Done",
+  "SOURCE_UNSET_OR_MISSING": "Source missing/unset",
+  "SOURCE_NEWER": "Source newer",
+  "SOURCE_UP_TO_DATE": "Source is up to date",
+  "SOURCE_OLDER": "Cloud newer",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

+ 587 - 527
src/PixiEditor/Data/Localization/Languages/en.json

@@ -1,528 +1,588 @@
 {
-    "RECENT_FILES": "Recent Files",
-    "OPEN_FILE": "Open file",
-    "NEW_FILE": "New",
-    "RECENT_EMPTY_TEXT": "So much empty space",
-    "LANGUAGE": "Language",
-    "GENERAL": "General",
-    "DISCORD": "Discord",
-    "KEY_BINDINGS": "Key Bindings",
-    "MISC": "Misc",
-    "SHOW_STARTUP_WINDOW": "Show Startup Window",
-    "SHOW_IMAGE_PREVIEW_TASKBAR": "Show image preview in taskbar",
-    "RECENT_FILE_LENGTH": "Recent file list length",
-    "RECENT_FILE_LENGTH_TOOLTIP": "How many documents are shown under File > Recent. Default: 8",
-    "DEFAULT_NEW_SIZE": "Default new file size",
-    "WIDTH": "Width",
-    "HEIGHT": "Height",
-    "TOOLS": "Tools",
-    "ENABLE_SHARED_TOOLBAR": "Enable shared toolbar",
-    "AUTOMATIC_UPDATES": "Automatic Updates",
-    "CHECK_FOR_UPDATES": "Check updates on startup",
-    "UPDATE_STREAM": "Update stream",
-    "UPDATE_CHANNEL_HELP_TOOLTIP": "Update channels can only be changed in standalone version (downloaded from https://pixieditor.net).\nSteam and Microsoft Store versions handle updates separately.",
-    "DEBUG": "Debug",
-    "ENABLE_DEBUG_MODE": "Enable Debug mode",
-    "OPEN_CRASH_REPORTS_DIR": "Open crash reports directory",
-    "DISCORD_RICH_PRESENCE": "Rich Presence",
-    "ENABLED": "Enabled",
-    "SHOW_IMAGE_NAME": "Show image name",
-    "SHOW_IMAGE_SIZE": "Show image size",
-    "SHOW_LAYER_COUNT": "Show layer count",
-    "FILE": "File",
-    "RECENT": "Recent",
-    "OPEN": "Open",
-    "SAVE_PIXI": "Save (.pixi)",
-    "SAVE_AS_PIXI": "Save as... (.pixi)",
-    "EXPORT_IMG": "Export (.png, .jpg, etc.)",
-    "EDIT": "Edit",
-    "EXIT": "Exit",
-    "PERCENTAGE": "Percentage",
-    "ABSOLUTE": "Absolute",
-    "PRESERVE_ASPECT_RATIO": "Preserve aspect ratio",
-    "ANCHOR_POINT": "Anchor point",
-    "RESIZE_IMAGE": "Resize image",
-    "RESIZE": "Resize",
-    "DOCUMENTATION": "Documentation",
-    "WEBSITE": "Website",
-    "OPEN_WEBSITE": "Open website",
-    "REPOSITORY": "Repository",
-    "OPEN_REPOSITORY": "Open repository",
-    "LICENSE": "License",
-    "OPEN_LICENSE": "Open license",
-    "THIRD_PARTY_LICENSES": "Third party licenses",
-    "OPEN_THIRD_PARTY_LICENSES": "Open third party licenses",
-    "APPLY_TRANSFORM": "Apply transform",
-    "INCREASE_TOOL_SIZE": "Increase tool size",
-    "DECREASE_TOOL_SIZE": "Decrease tool size",
-    "TO_INSTALL_UPDATE": "to install update {0}",
-    "DOWNLOADING_UPDATE": "Downloading update...",
-    "UPDATE_READY": "Update is ready to be installed. Do you want to install it now?",
-    "NEW_UPDATE": "New update",
-    "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Couldn't update without admin privileges. Please run PixiEditor as administrator.",
-    "INSUFFICIENT_PERMISSIONS": "Insufficient permissions",
-    "UPDATE_CHECK_FAILED": "Update check failed",
-    "COULD_NOT_CHECK_FOR_UPDATES": "Could not check if there is an update available.",
-    "VERSION": "Version {0}",
-    "OPEN_TEMP_DIR": "Open temp directory",
-    "OPEN_LOCAL_APPDATA_DIR": "Open Local AppData directory",
-    "OPEN_ROAMING_APPDATA_DIR": "Open Roaming AppData directory",
-    "OPEN_INSTALLATION_DIR": "Open installation directory",
-    "DUMP_ALL_COMMANDS": "Dump all commands",
-    "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Dump all commands to a text file",
-    "CRASH": "Crash",
-    "CRASH_APP": "Crash application",
-    "DELETE_USR_PREFS": "Delete user preferences (Roaming AppData)",
-    "DELETE_SHORTCUT_FILE": "Delete shortcut file (Roaming AppData)",
-    "DELETE_EDITOR_DATA": "Delete editor data (Local AppData)",
-    "GENERATE_KEY_BINDINGS_TEMPLATE": "Generate key bindings template",
-    "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Generate key bindings json template",
-    "VALIDATE_SHORTCUT_MAP": "Validate shortcut map",
-    "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Validates shortcut map",
-    "VALIDATION_KEYS_NOTICE_DIALOG": "Empty keys: {0}\nUnknown Commands: {1}",
-    "RESULT": "Result",
-    "CLEAR_RECENT_DOCUMENTS": "Clear recent documents",
-    "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Clear recently opened documents",
-    "OPEN_CMD_DEBUG_WINDOW": "Open command debug window",
-    "PATH_DOES_NOT_EXIST": "{0} does not exist.",
-    "LOCATION_DOES_NOT_EXIST": "Location does not exist.",
-    "FILE_NOT_FOUND": "File not found.",
-    "ARE_YOU_SURE": "Are you sure?",
-    "ARE_YOU_SURE_PATH_FULL_PATH": "Are you sure you want to delete {0}?\nThis data will be lost for all installations.\n(Full Path: {1})",
-    "FAILED_TO_OPEN_FILE": "Failed to open the file",
-    "OLD_FILE_FORMAT": "Old file format",
-    "OLD_FILE_FORMAT_DESCRIPTION": "This .pixi file uses the old format,\n which is no longer supported and can't be opened.",
-    "NOTHING_FOUND": "Nothing found",
-    "EXPORT": "Export",
-    "EXPORT_IMAGE": "Export image",
-    "IMPORT": "Import",
-    "SHORTCUT_TEMPLATES": "Shortcut templates",
-    "RESET_ALL": "Reset all",
-    "LAYER": "Layer",
-    "LAYER_DELETE_SELECTED": "Delete active layer/folder",
-    "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Delete active layer or folder",
-    "LAYER_DELETE_ALL_SELECTED": "Delete all selected layers/folders",
-    "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Delete all selected layers and/or folders",
-    "DELETE_SELECTED_PIXELS": "Delete selected pixels",
-    "NEW_FOLDER": "New folder",
-    "CREATE_NEW_FOLDER": "Create new folder",
-    "NEW_LAYER": "New layer",
-    "CREATE_NEW_LAYER": "Create new layer",
-    "NEW_IMAGE": "New image",
-    "CREATE_NEW_IMAGE": "Create new image",
-    "SAVE": "Save",
-    "SAVE_AS": "Save as...",
-    "IMAGE": "Image",
-    "SAVE_IMAGE": "Save image",
-    "SAVE_IMAGE_AS": "Save image as new",
-    "DUPLICATE": "Duplicate",
-    "DUPLICATE_SELECTED_LAYER": "Duplicate selected layer",
-    "CREATE_MASK": "Create mask",
-    "DELETE_MASK": "Delete mask",
-    "TOGGLE_MASK": "Toggle mask",
-    "APPLY_MASK": "Apply mask",
-    "TOGGLE_VISIBILITY": "Toggle visibility",
-    "MOVE_MEMBER_UP": "Move member upwards",
-    "MOVE_MEMBER_UP_DESCRIPTIVE": "Move selected layer or folder upwards",
-    "MOVE_MEMBER_DOWN": "Move member downwards",
-    "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Move selected layer or folder downwards",
-    "MERGE_ALL_SELECTED_LAYERS": "Merge all selected layers",
-    "MERGE_WITH_ABOVE": "Merge selected layer with above",
-    "MERGE_WITH_ABOVE_DESCRIPTIVE": "Merge selected layer with the one above it",
-    "MERGE_WITH_BELOW": "Merge selected layer with below",
-    "MERGE_WITH_BELOW_DESCRIPTIVE": "Merge selected layer with the one below it",
-    "ADD_REFERENCE_LAYER": "Add Reference Layer",
-    "DELETE_REFERENCE_LAYER": "Delete reference layer",
-    "TRANSFORM_REFERENCE_LAYER": "Transform reference layer",
-    "TOGGLE_REFERENCE_LAYER_POS": "Toggle reference layer position",
-    "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Toggle reference layer between topmost or most below",
-    "RESET_REFERENCE_LAYER_POS": "Reset reference layer position",
-    "CLIP_CANVAS": "Clip Canvas",
-    "FLIP_IMG_VERTICALLY": "Flip Image Vertically",
-    "FLIP_IMG_HORIZONTALLY": "Flip Image Horizontally",
-    "FLIP_LAYERS_VERTICALLY": "Flip Selected Layers Vertically",
-    "FLIP_LAYERS_HORIZONTALLY": "Flip Selected Layers Horizontally",
-    "ROT_IMG_90": "Rotate Image 90 degrees",
-    "ROT_IMG_180": "Rotate Image 180 degrees",
-    "ROT_IMG_-90": "Rotate Image -90 degrees",
-    "ROT_LAYERS_90": "Rotate Selected Layers 90 degrees",
-    "ROT_LAYERS_180": "Rotate Selected Layers 180 degrees",
-    "ROT_LAYERS_-90": "Rotate Selected Layers -90 degrees",
-    "TOGGLE_VERT_SYMMETRY_AXIS": "Toggle vertical symmetry axis",
-    "TOGGLE_HOR_SYMMETRY_AXIS": "Toggle horizontal symmetry axis",
-    "DELETE_PIXELS": "Delete pixels",
-    "DELETE_PIXELS_DESCRIPTIVE": "Delete selected pixels",
-    "RESIZE_DOCUMENT": "Resize document",
-    "RESIZE_CANVAS": "Resize canvas",
-    "CENTER_CONTENT": "Center content",
-    "CUT": "Cut",
-    "CUT_DESCRIPTIVE": "Cut selected area/layers",
-    "PASTE": "Paste",
-    "PASTE_DESCRIPTIVE": "Paste clipboard contents",
-    "PASTE_AS_NEW_LAYER": "Paste as new layer",
-    "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Paste from clipboard as new layer",
-    "PASTE_REFERENCE_LAYER": "Paste reference layer",
-    "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Paste clipboard contents as reference layer",
-    "PASTE_COLOR": "Paste color",
-    "PASTE_COLOR_DESCRIPTIVE": "Paste color from clipboard",
-    "PASTE_COLOR_SECONDARY": "Paste color as secondary",
-    "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Paste color from clipboard as secondary color",
-    "CLIPBOARD": "Clipboard",
-    "COPY": "Copy",
-    "COPY_DESCRIPTIVE": "Copy to clipboard",
-    "COPY_COLOR_HEX": "Copy primary color (HEX)",
-    "COPY_COLOR_HEX_DESCRIPTIVE": "Copy primary color as HEX code",
-    "COPY_COLOR_RGB": "Copy primary color (RGB)",
-    "COPY_COLOR_RGB_DESCRIPTIVE": "Copy primary color as RGB code",
-    "COPY_COLOR_SECONDARY_HEX": "Copy secondary color (HEX)",
-    "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Copy secondary color as HEX code",
-    "COPY_COLOR_SECONDARY_RGB": "Copy secondary color (RGB)",
-    "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Copy secondary color as RGB code",
-    "PALETTE_COLORS": "Palette Colors",
-    "REPLACE_SECONDARY_BY_PRIMARY": "Replace secondary color by primary",
-    "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Replace the secondary color by the primary color",
-    "REPLACE_PRIMARY_BY_SECONDARY": "Replace primary color by secondary",
-    "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Replace the primary color by the secondary color",
-    "OPEN_PALETTE_BROWSER": "Open palette browser",
-    "OVERWRITE_PALETTE_CONSENT": "Palette '{0}' already exists, do you want to overwrite it?",
-    "PALETTE_EXISTS": "Palette already exists",
-    "REPLACE_PALETTE_CONSENT": "Replace current palette with selected one?",
-    "REPLACE_PALETTE": "Replace current palette",
-    "SELECT_COLOR_1": "Select color 1",
-    "SELECT_COLOR_2": "Select color 2",
-    "SELECT_COLOR_3": "Select color 3",
-    "SELECT_COLOR_4": "Select color 4",
-    "SELECT_COLOR_5": "Select color 5",
-    "SELECT_COLOR_6": "Select color 6",
-    "SELECT_COLOR_7": "Select color 7",
-    "SELECT_COLOR_8": "Select color 8",
-    "SELECT_COLOR_9": "Select color 9",
-    "SELECT_COLOR_10": "Select color 10",
-    "SELECT_TOOL": "Select {0} Tool",
-    "SELECT_COLOR_1_DESCRIPTIVE": "Select the first color in the palette",
-    "SELECT_COLOR_2_DESCRIPTIVE": "Select the second color in the palette",
-    "SELECT_COLOR_3_DESCRIPTIVE": "Select the third color in the palette",
-    "SELECT_COLOR_4_DESCRIPTIVE": "Select the fourth color in the palette",
-    "SELECT_COLOR_5_DESCRIPTIVE": "Select the fifth color in the palette",
-    "SELECT_COLOR_6_DESCRIPTIVE": "Select the sixth color in the palette",
-    "SELECT_COLOR_7_DESCRIPTIVE": "Select the seventh color in the palette",
-    "SELECT_COLOR_8_DESCRIPTIVE": "Select the eighth color in the palette",
-    "SELECT_COLOR_9_DESCRIPTIVE": "Select the ninth color in the palette",
-    "SELECT_COLOR_10_DESCRIPTIVE": "Select the tenth color in the palette",
-    "SWAP_COLORS": "Swap colors",
-    "SWAP_COLORS_DESCRIPTIVE": "Swap primary and secondary colors",
-    "SEARCH": "Search",
-    "COMMAND_SEARCH": "Command search",
-    "OPEN_COMMAND_SEARCH": "Open command search window",
-    "SELECT": "Select",
-    "DESELECT": "Deselect",
-    "INVERT": "Invert",
-    "SELECTION": "Selection",
-    "SELECT_ALL": "Select all",
-    "SELECT_ALL_DESCRIPTIVE": "Select everything",
-    "CLEAR_SELECTION": "Clear selection",
-    "INVERT_SELECTION": "Invert selection",
-    "INVERT_SELECTION_DESCRIPTIVE": "Invert the selection",
-    "TRANSFORM_SELECTED_AREA": "Transform selected area",
-    "NUDGE_SELECTED_LEFT": "Nudge selected object left",
-    "NUDGE_SELECTED_RIGHT": "Nudge selected object right",
-    "NUDGE_SELECTED_UP": "Nudge selected object up",
-    "NUDGE_SELECTED_DOWN": "Nudge selected object down",
-    "MASK_FROM_SELECTION": "New mask from selection",
-    "MASK_FROM_SELECTION_DESCRIPTIVE": "Selection to new mask",
-    "ADD_SELECTION_TO_MASK": "Add selection to mask",
-    "SUBTRACT_SELECTION_FROM_MASK": "Subtract selection from mask",
-    "INTERSECT_SELECTION_MASK": "Intersect selection with mask",
-    "SELECTION_TO_MASK": "Selection to mask",
-    "TO_NEW_MASK": "to new mask",
-    "ADD_TO_MASK": "add to mask",
-    "SUBTRACT_FROM_MASK": "subtract from mask",
-    "INTERSECT_WITH_MASK": "intersect with mask",
-    "STYLUS": "Stylus",
-    "TOGGLE_PEN_MODE": "Toggle pen mode",
-    "UNDO": "Undo",
-    "UNDO_DESCRIPTIVE": "Undo last action",
-    "REDO": "Redo",
-    "REDO_DESCRIPTIVE": "Redo last action",
-    "WINDOWS": "Windows",
-    "TOGGLE_GRIDLINES": "Toggle gridlines",
-    "ZOOM_IN": "Zoom in",
-    "ZOOM_OUT": "Zoom out",
-    "NEW_WINDOW_FOR_IMG": "New window for current image",
-    "CENTER_ACTIVE_VIEWPORT": "Center active viewport",
-    "FLIP_VIEWPORT_HORIZONTALLY": "Flip viewport horizontally",
-    "FLIP_VIEWPORT_VERTICALLY": "Flip viewport vertically",
-    "SETTINGS": "Settings",
-    "OPEN_SETTINGS": "Open settings",
-    "OPEN_SETTINGS_DESCRIPTIVE": "Open settings window",
-    "OPEN_STARTUP_WINDOW": "Open startup window",
-    "OPEN_SHORTCUT_WINDOW": "Open shortcuts window",
-    "OPEN_ABOUT_WINDOW": "Open about window",
-    "OPEN_NAVIGATION_WINDOW": "Open navigation window",
-    "ERROR": "Error",
-    "INTERNAL_ERROR": "Internal error",
-    "ERROR_SAVE_LOCATION": "Couldn't save the file to the specified location",
-    "ERROR_WHILE_SAVING": "An internal error occured while saving. Please try again.",
-    "UNKNOWN_ERROR_SAVING": "An error occured while saving.",
-    "FAILED_ASSOCIATE_LOSPEC": "Failed to associate Lospec Palette protocol.",
-    "REDDIT": "Reddit",
-    "GITHUB": "GitHub",
-    "YOUTUBE": "YouTube",
-    "DONATE": "Donate",
-    "YES": "Yes",
-    "NO": "No",
-    "CANCEL": "Cancel",
-    "UNNAMED": "Unnamed",
-    "OPEN_COMMAND_DEBUG_WINDOW": "Open command debug window",
-    "DELETE": "Delete",
-    "USER_PREFS": "User preferences (Roaming)",
-    "SHORTCUT_FILE": "Shortcut file (Roaming)",
-    "EDITOR_DATA": "Editor data (Local)",
-    "MOVE_VIEWPORT_TOOLTIP": "Moves viewport. ({0})",
-    "MOVE_VIEWPORT_ACTION_DISPLAY": "Click and move to pan the viewport",
-    "MOVE_TOOL_TOOLTIP": "Moves selected pixels ({0}). Hold Ctrl to move all layers.",
-    "MOVE_TOOL_ACTION_DISPLAY": "Hold mouse to move selected pixels. Hold Ctrl to move all layers.",
-    "PEN_TOOL_TOOLTIP": "Pen. ({0})",
-    "PEN_TOOL_ACTION_DISPLAY": "Click and move to draw.",
-    "PIXEL_PERFECT_SETTING": "Pixel perfect",
-    "RECTANGLE_TOOL_TOOLTIP": "Draws rectangle on canvas ({0}). Hold Shift to draw a square.",
-    "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to draw a rectangle. Hold Shift to draw a square.",
-    "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to draw a square.",
-    "KEEP_ORIGINAL_IMAGE_SETTING": "Keep original image",
-    "ROTATE_VIEWPORT_TOOLTIP": "Rotates viewport. ({0})",
-    "ROTATE_VIEWPORT_ACTION_DISPLAY": "Click and move to rotate the viewport",
-    "SELECT_TOOL_TOOLTIP": "Selects area. ({0})",
-    "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to select an area. Hold Shift to add to existing selection. Hold Ctrl to subtract from it.",
-    "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to add to the current selection.",
-    "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Click and move to subtract from the current selection.",
-    "ZOOM_TOOL_TOOLTIP": "Zooms viewport ({0}). Click to zoom in, hold alt and click to zoom out.",
-    "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to zoom. Click to zoom in, hold ctrl and click to zoom out.",
-    "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Click and move to zoom. Click to zoom out, release ctrl and click to zoom in.",
-    "BRIGHTNESS_TOOL_TOOLTIP": "Makes pixels brighter or darker ({0}). Hold Ctrl to make pixels darker.",
-    "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Draw on pixels to make them brighter. Hold Ctrl to darken.",
-    "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Draw on pixels to make them darker. Release Ctrl to brighten.",
-    "COLOR_PICKER_TOOLTIP": "Picks the primary color from the canvas. ({0})",
-    "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Click to pick colors. Hold Ctrl to hide the canvas. Hold Shift to hide the reference layer",
-    "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Click to pick colors from the reference layer.",
-    "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Click to pick colors from the canvas.",
-    "ELLIPSE_TOOL_TOOLTIP": "Draws an ellipse on canvas ({0}). Hold Shift to draw a circle.",
-    "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move mouse to draw an ellipse. Hold Shift to draw a circle.",
-    "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move mouse to draw a circle.",
-    "ERASER_TOOL_TOOLTIP": "Erases color from pixel. ({0})",
-    "ERASER_TOOL_ACTION_DISPLAY": "Click and move to erase.",
-    "FLOOD_FILL_TOOL_TOOLTIP": "Fills area with color. ({0})",
-    "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Press on an area to fill it. Hold down Ctrl to consider all layers.",
-    "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Press on an area to fill it. Release Ctrl to only consider the current layers.",
-    "LASSO_TOOL_TOOLTIP": "Lasso. ({0})",
-    "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to select pixels inside of the lasso. Hold Shift to add to existing selection. Hold Ctrl to subtract from it.",
-    "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to add pixels inside of the lasso to the selection.",
-    "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Click and move to subtract pixels inside of the lasso from the selection.",
-    "LINE_TOOL_TOOLTIP": "Draws line on canvas ({0}). Hold Shift to enable snapping.",
-    "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to draw a line. Hold Shift to enable snapping.",
-    "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move mouse to draw a line with snapping enabled.",
-    "MAGIC_WAND_TOOL_TOOLTIP": "Magic Wand ({0}). Flood's the selection",
-    "MAGIC_WAND_ACTION_DISPLAY": "Click to flood the selection.",
-    "PEN_TOOL": "Pen",
-    "BRIGHTNESS_TOOL": "Brightness",
-    "COLOR_PICKER_TOOL": "Color Picker",
-    "ELLIPSE_TOOL": "Ellipse",
-    "ERASER_TOOL": "Eraser",
-    "FLOOD_FILL_TOOL": "Flood Fill",
-    "LASSO_TOOL": "Lasso",
-    "LINE_TOOL": "Line",
-    "MAGIC_WAND_TOOL": "Magic Wand",
-    "MOVE_TOOL": "Move",
-    "MOVE_VIEWPORT_TOOL": "Move Viewport",
-    "RECTANGLE_TOOL": "Rectangle",
-    "ROTATE_VIEWPORT_TOOL": "Rotate Viewport",
-    "SELECT_TOOL_NAME": "Select",
-    "ZOOM_TOOL": "Zoom",
-    "SHAPE_LABEL": "Shape",
-    "MODE_LABEL": "Mode",
-    "SCOPE_LABEL": "Scope",
-    "FILL_SHAPE_LABEL": "Fill shape",
-    "FILL_COLOR_LABEL": "Fill color",
-    "TOOL_SIZE_LABEL": "Tool size",
-    "STRENGTH_LABEL": "Strength",
-    "NEW": "New",
-    "ADD": "Add",
-    "SUBTRACT": "Subtract",
-    "INTERSECT": "Intersect",
-    "RECTANGLE": "Rectangle",
-    "CIRCLE": "Circle",
-    "ABOUT": "About",
-    "MINIMIZE": "Minimize",
-    "RESTORE": "Restore",
-    "MAXIMIZE": "Maximize",
-    "CLOSE": "Close",
-    "EXPORT_SIZE_HINT": "If you want to share the image, try {0}% for the best clarity",
-    "CREATE": "Create",
-    "BASE_LAYER_NAME": "Base layer",
-    "ENABLE_MASK": "Enable mask",
-    "SELECTED_AREA_EMPTY": "Selected area is empty",
-    "NOTHING_TO_COPY": "Nothing to copy",
-    "REFERENCE_LAYER_PATH": "Reference layer path",
-    "FLIP": "Flip",
-    "ROTATION": "Rotation",
-    "ROT_IMG_90_D": "Rotate Image 90°",
-    "ROT_IMG_180_D": "Rotate Image 180°",
-    "ROT_IMG_-90_D": "Rotate Image -90°",
-    "ROT_LAYERS_90_D": "Rotate Selected Layers 90°",
-    "ROT_LAYERS_180_D": "Rotate Selected Layers 180°",
-    "ROT_LAYERS_-90_D": "Rotate Selected Layers -90°",
-    "UNNAMED_PALETTE": "Unnamed Palette",
-    "CLICK_SELECT_PRIMARY": "Click to select as main color.",
-    "PEN_MODE": "Pen mode",
-    "VIEW": "View",
-    "HORIZONTAL_LINE_SYMMETRY": "Horizontal line symmetry",
-    "VERTICAL_LINE_SYMMETRY": "Vertical line symmetry",
-    "COLOR_PICKER_TITLE": "Color Picker",
-    "COLOR_SLIDERS_TITLE": "Color Sliders",
-    "PALETTE_TITLE": "Palette",
-    "SWATCHES_TITLE": "Swatches",
-    "LAYERS_TITLE": "Layers",
-    "NAVIGATION_TITLE": "Navigation",
-    "NORMAL_BLEND_MODE": "Normal",
-    "DARKEN_BLEND_MODE": "Darken",
-    "MULTIPLY_BLEND_MODE": "Multiply",
-    "COLOR_BURN_BLEND_MODE": "Color burn",
-    "LIGHTEN_BLEND_MODE": "Lighten",
-    "SCREEN_BLEND_MODE": "Screen",
-    "COLOR_DODGE_BLEND_MODE": "Color dodge",
-    "OVERLAY_BLEND_MODE": "Overlay",
-    "SOFT_LIGHT_BLEND_MODE": "Soft light",
-    "HARD_LIGHT_BLEND_MODE": "Hard light",
-    "DIFFERENCE_BLEND_MODE": "Difference",
-    "EXCLUSION_BLEND_MODE": "Exclusion",
-    "HUE_BLEND_MODE": "Hue",
-    "SATURATION_BLEND_MODE": "Saturation",
-    "LUMINOSITY_BLEND_MODE": "Luminosity",
-    "COLOR_BLEND_MODE": "Color",
-    "NOT_SUPPORTED_BLEND_MODE": "Not supported",
-    "RESTART": "Restart",
-    "SORT_BY": "Sort by",
-    "NAME": "Name",
-    "COLORS": "Colors",
-    "DEFAULT": "Default",
-    "ALPHABETICAL": "Alphabetical",
-    "COLOR_COUNT": "Color count",
-    "ANY": "Any",
-    "MAX": "Max",
-    "MIN": "Min",
-    "EXACT": "Exact",
-    "ASCENDING": "Ascending",
-    "DESCENDING": "Descending",
-    "NAME_IS_TOO_LONG": "The name is too long",
-    "STOP_IT_TEXT1": "That's enough. Tidy up your file names.",
-    "STOP_IT_TEXT2": "Can you stop copying these names please?",
-    "REPLACER_TOOLTIP": "Right click on palette color and choose 'Replace' or drop it here.",
-    "CLICK_TO_CHOOSE_COLOR": "Click to choose the color",
-    "REPLACE_COLOR": "Replace color",
-    "PALETTE_COLOR_TOOLTIP": "Click to select as main color. Drag and drop onto another palette color to swap them.",
-    "ADD_FROM_SWATCHES": "Add from swatches",
-    "ADD_COLOR_TO_PALETTE": "Add color to palette",
-    "USE_IN_CURRENT_IMAGE": "Use in current image",
-    "ADD_TO_FAVORITES": "Add to favorites",
-    "BROWSE_PALETTES": "Browse palettes",
-    "LOAD_PALETTE": "Load palette",
-    "SAVE_PALETTE": "Save palette",
-    "DISCARD_PALETTE": "Discard palette",
-    "DISCARD_PALETTE_CONFIRMATION": "Are you sure you want to discard current palette? This cannot be undone.",
-    "FAVORITES": "Favorites",
-    "ADD_FROM_CURRENT_PALETTE": "Add from current palette",
-    "OPEN_PALETTES_DIR_TOOLTIP": "Open palettes directory in explorer",
-    "BROWSE_ON_LOSPEC_TOOLTIP": "Browse palettes on Lospec",
-    "IMPORT_FROM_FILE_TOOLTIP": "Import from file",
-    "TOP_LEFT": "Top left",
-    "TOP_CENTER": "Top center",
-    "TOP_RIGHT": "Top right",
-    "MIDDLE_LEFT": "Middle left",
-    "MIDDLE_CENTER": "Middle center",
-    "MIDDLE_RIGHT": "Middle right",
-    "BOTTOM_LEFT": "Bottom left",
-    "BOTTOM_CENTER": "Bottom center",
-    "BOTTOM_RIGHT": "Bottom right",
-    "CLIP_TO_BELOW": "Clip to layer below",
-    "MOVE_UPWARDS": "Move upwards",
-    "MOVE_DOWNWARDS": "Move downwards",
-    "MERGE_SELECTED": "Merge selected",
-    "LOCK_TRANSPARENCY": "Lock transparency",
-    "COULD_NOT_LOAD_PALETTE": "Couldn't fetch palettes",
-    "NO_PALETTES_FOUND": "No palettes found.",
-    "LOSPEC_LINK_TEXT": "I heard you can find some here: lospec.com/palette-list",
-    "PALETTE_BROWSER": "Palette Browser",
-    "DELETE_PALETTE_CONFIRMATION": "Are you sure you want to delete this palette? This cannot be undone.",
-    "SHORTCUTS_IMPORTED": "Shortcuts from {0} were imported successfully.",
-    "SHORTCUT_PROVIDER_DETECTED": "We've detected, that you have {0} installed. Do you want to import shortcuts from it?",
-    "IMPORT_FROM_INSTALLATION": "Import from installation",
-    "IMPORT_INSTALLATION_OPTION1": "Import from installation",
-    "IMPORT_INSTALLATION_OPTION2": "Use defaults",
-    "IMPORT_FROM_TEMPLATE": "Import from template",
-    "SHORTCUTS_IMPORTED_SUCCESS": "Shortcuts were imported successfully.",
-    "WARNING_RESET_SHORTCUTS_DEFAULT": "Are you sure you want to reset all shortcuts to their default value?",
-    "SUCCESS": "Success",
-    "WARNING": "Warning",
-    "ERROR_IMPORTING_IMAGE": "An error occured while importing the image.",
-    "SHORTCUTS_CORRUPTED_TITLE": "Corrupted shortcuts file",
-    "SHORTCUTS_CORRUPTED": "Shortcuts file was corrupted, resetting to default.",
-    "FAILED_DOWNLOAD_PALETTE": "Failed to download palette",
-    "FILE_INCORRECT_FORMAT": "The file was not in a correct format",
-    "INVALID_FILE": "Invalid file",
-    "SHORTCUTS_FILE_INCORRECT_FORMAT": "Shortcuts file was not in a correct format",
-    "UNSUPPORTED_FILE_FORMAT": "This file format is unsupported",
-    "ALREADY_ASSIGNED": "Already assigned",
-    "REPLACE": "Replace",
-    "SWAP": "Swap",
-    "SHORTCUT_ALREADY_ASSIGNED_SWAP": "This shortcut is already assigned to '{0}'\nDo you want to replace the existing shortcut or swap the two?",
-    "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "This shortcut is already assigned to '{0}'\nDo you want to replace the existing shortcut?",
-    "UNSAVED_CHANGES": "Unsaved changes",
-    "DOCUMENT_MODIFIED_SAVE": "The document has been modified. Do you want to save changes?",
-    "SESSION_UNSAVED_DATA": "{0} with unsaved data. Are you sure?",
-    "PROJECT_MAINTAINERS": "Project Maintainers",
-    "OTHER_AWESOME_CONTRIBUTORS": "And other awesome contributors",
-    "HELP": "Help",
-    "STOP_IT_TEXT3": "No, really, stop it.",
-    "STOP_IT_TEXT4": "Don't you have anything better to do?",
-    "LINEAR_DODGE_BLEND_MODE": "Linear dodge (Add)",
-    "PRESS_ANY_KEY": "Press any key",
-    "NONE_SHORTCUT": "None",
-    "REFERENCE": "Reference",
-    "PUT_REFERENCE_LAYER_ABOVE": "Put reference layer above",
-    "PUT_REFERENCE_LAYER_BELOW": "Put reference layer below",
-    "TOGGLE_VERTICAL_SYMMETRY": "Toggle vertical symmetry",
-    "TOGGLE_HORIZONTAL_SYMMETRY": "Toggle horizontal symmetry",
-    "RESET_VIEWPORT": "Reset viewport",
-    "VIEWPORT_SETTINGS": "Viewport settings",
-    "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Click and hold mouse to move pixels in selected layers.",
-    "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Hold mouse to move all layers.",
-    "CTRL_KEY": "Ctrl",
-    "SHIFT_KEY": "Shift",
-    "ALT_KEY": "Alt",
-    "RENAME": "Rename",
-    "PIXEL_UNIT": "px",
-    "OPEN_LOCALIZATION_DEBUG_WINDOW": "Open Localization Debug Window",
-    "FORCE_OTHER_FLOW_DIRECTION": "Force other flow direction",
-    "API_KEY": "API Key",
-    "LOCALIZATION_VIEW_TYPE": "Localization View Type",
-    "LOAD_LANGUAGE_FROM_FILE": "Load language from file",
-    "LOG_IN": "Log in",
-    "SYNC": "Sync",
-    "NOT_LOGGED_IN": "Not logged in",
-    "POE_EDITOR_ERROR": "POEditor Error: {0} {1}",
-    "HTTP_ERROR_MESSAGE": "HTTP Error: {0} {1}",
-    "LOGGED_IN": "Logged in",
-    "SYNCED_SUCCESSFULLY": "Synced successfully",
-    "EXCEPTION_ERROR": "Exception: {0}",
-    "DROP_PALETTE": "Drop palette here",
-    "SECURITY_ERROR": "Security error",
-    "SECURITY_ERROR_MSG": "No rights to write to the specified location.",
-    "IO_ERROR": "IO error",
-    "IO_ERROR_MSG": "Error while writing to disk.",
-    "FAILED_ASSOCIATE_PIXI": "Failed to associate .pixi file with PixiEditor.",
-    "COULD_NOT_SAVE_PALETTE": "There was an error while saving the palette.",
-    "NO_COLORS_TO_SAVE": "There are no colors to save.",
-    "ALL_LAYERS": "All Layers",
-    "SINGLE_LAYER": "Single Layer",
-    "CHOOSE": "Choose",
-    "REMOVE": "Remove"
-}
+  "RECENT_FILES": "Recent Files",
+  "OPEN_FILE": "Open file",
+  "NEW_FILE": "New",
+  "RECENT_EMPTY_TEXT": "So much empty space",
+  "LANGUAGE": "Language",
+  "GENERAL": "General",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Key Bindings",
+  "MISC": "Misc",
+  "SHOW_STARTUP_WINDOW": "Show Startup Window",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Show image preview in taskbar",
+  "RECENT_FILE_LENGTH": "Recent file list length",
+  "RECENT_FILE_LENGTH_TOOLTIP": "How many documents are shown under File > Recent. Default: 8",
+  "DEFAULT_NEW_SIZE": "Default new file size",
+  "WIDTH": "Width",
+  "HEIGHT": "Height",
+  "TOOLS": "Tools",
+  "ENABLE_SHARED_TOOLBAR": "Enable shared toolbar",
+  "AUTOMATIC_UPDATES": "Automatic Updates",
+  "CHECK_FOR_UPDATES": "Check updates on startup",
+  "UPDATE_STREAM": "Update stream",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Update channels can only be changed in standalone version (downloaded from https://pixieditor.net).\nSteam and Microsoft Store versions handle updates separately.",
+  "DEBUG": "Debug",
+  "ENABLE_DEBUG_MODE": "Enable Debug mode",
+  "OPEN_CRASH_REPORTS_DIR": "Open crash reports directory",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Enabled",
+  "SHOW_IMAGE_NAME": "Show image name",
+  "SHOW_IMAGE_SIZE": "Show image size",
+  "SHOW_LAYER_COUNT": "Show layer count",
+  "FILE": "File",
+  "RECENT": "Recent",
+  "OPEN": "Open",
+  "SAVE_PIXI": "Save (.pixi)",
+  "SAVE_AS_PIXI": "Save as... (.pixi)",
+  "EXPORT_IMG": "Export (.png, .jpg, etc.)",
+  "EDIT": "Edit",
+  "EXIT": "Exit",
+  "PERCENTAGE": "Percentage",
+  "ABSOLUTE": "Absolute",
+  "PRESERVE_ASPECT_RATIO": "Preserve aspect ratio",
+  "ANCHOR_POINT": "Anchor point",
+  "RESIZE_IMAGE": "Resize image",
+  "RESIZE": "Resize",
+  "DOCUMENTATION": "Documentation",
+  "WEBSITE": "Website",
+  "OPEN_WEBSITE": "Open website",
+  "REPOSITORY": "Repository",
+  "OPEN_REPOSITORY": "Open repository",
+  "OPEN_DOCUMENTATION": "Open documentation",
+  "LICENSE": "License",
+  "OPEN_LICENSE": "Open license",
+  "THIRD_PARTY_LICENSES": "Third party licenses",
+  "OPEN_THIRD_PARTY_LICENSES": "Open third party licenses",
+  "APPLY_TRANSFORM": "Apply transform",
+  "INCREASE_TOOL_SIZE": "Increase tool size",
+  "DECREASE_TOOL_SIZE": "Decrease tool size",
+  "TO_INSTALL_UPDATE": "to install update {0}",
+  "DOWNLOADING_UPDATE": "Downloading update...",
+  "UPDATE_READY": "Update is ready to be installed. Do you want to install it now?",
+  "NEW_UPDATE": "New update",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Couldn't update without admin privileges. Please run PixiEditor as administrator.",
+  "INSUFFICIENT_PERMISSIONS": "Insufficient permissions",
+  "UPDATE_CHECK_FAILED": "Update check failed",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Could not check if there is an update available.",
+  "VERSION": "Version {0}",
+  "OPEN_TEMP_DIR": "Open temp directory",
+  "OPEN_LOCAL_APPDATA_DIR": "Open Local AppData directory",
+  "OPEN_ROAMING_APPDATA_DIR": "Open Roaming AppData directory",
+  "OPEN_INSTALLATION_DIR": "Open installation directory",
+  "DUMP_ALL_COMMANDS": "Dump all commands",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Dump all commands to a text file",
+  "CRASH": "Crash",
+  "CRASH_APP": "Crash application",
+  "DELETE_USR_PREFS": "Delete user preferences (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Delete shortcut file (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Delete editor data (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Generate key bindings template",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Generate key bindings json template",
+  "VALIDATE_SHORTCUT_MAP": "Validate shortcut map",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Validates shortcut map",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Empty keys: {0}\nUnknown Commands: {1}",
+  "RESULT": "Result",
+  "CLEAR_RECENT_DOCUMENTS": "Clear recent documents",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Clear recently opened documents",
+  "OPEN_CMD_DEBUG_WINDOW": "Open command debug window",
+  "PATH_DOES_NOT_EXIST": "{0} does not exist.",
+  "LOCATION_DOES_NOT_EXIST": "Location does not exist.",
+  "FILE_NOT_FOUND": "File not found.",
+  "ARE_YOU_SURE": "Are you sure?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Are you sure you want to delete {0}?\nThis data will be lost for all installations.\n(Full Path: {1})",
+  "FAILED_TO_OPEN_FILE": "Failed to open the file",
+  "OLD_FILE_FORMAT": "Old file format",
+  "OLD_FILE_FORMAT_DESCRIPTION": "This .pixi file uses the old format,\n which is no longer supported and can't be opened.",
+  "NOTHING_FOUND": "Nothing found",
+  "EXPORT": "Export",
+  "EXPORT_IMAGE": "Export image",
+  "IMPORT": "Import",
+  "SHORTCUT_TEMPLATES": "Shortcut templates",
+  "RESET_ALL": "Reset all",
+  "LAYER": "Layer",
+  "LAYER_DELETE_SELECTED": "Delete active layer/folder",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Delete active layer or folder",
+  "LAYER_DELETE_ALL_SELECTED": "Delete all selected layers/folders",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Delete all selected layers and/or folders",
+  "DELETE_SELECTED_PIXELS": "Delete selected pixels",
+  "NEW_FOLDER": "New folder",
+  "CREATE_NEW_FOLDER": "Create new folder",
+  "NEW_LAYER": "New layer",
+  "CREATE_NEW_LAYER": "Create new layer",
+  "NEW_IMAGE": "New image",
+  "CREATE_NEW_IMAGE": "Create new image",
+  "SAVE": "Save",
+  "SAVE_AS": "Save as...",
+  "IMAGE": "Image",
+  "SAVE_IMAGE": "Save image",
+  "SAVE_IMAGE_AS": "Save image as new",
+  "DUPLICATE": "Duplicate",
+  "DUPLICATE_SELECTED_LAYER": "Duplicate selected layer",
+  "CREATE_MASK": "Create mask",
+  "DELETE_MASK": "Delete mask",
+  "TOGGLE_MASK": "Toggle mask",
+  "APPLY_MASK": "Apply mask",
+  "TOGGLE_VISIBILITY": "Toggle visibility",
+  "MOVE_MEMBER_UP": "Move member upwards",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Move selected layer or folder upwards",
+  "MOVE_MEMBER_DOWN": "Move member downwards",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Move selected layer or folder downwards",
+  "MERGE_ALL_SELECTED_LAYERS": "Merge all selected layers",
+  "MERGE_WITH_ABOVE": "Merge selected layer with above",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Merge selected layer with the one above it",
+  "MERGE_WITH_BELOW": "Merge selected layer with below",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Merge selected layer with the one below it",
+  "ADD_REFERENCE_LAYER": "Add Reference Layer",
+  "DELETE_REFERENCE_LAYER": "Delete reference layer",
+  "TRANSFORM_REFERENCE_LAYER": "Transform reference layer",
+  "TOGGLE_REFERENCE_LAYER_POS": "Toggle reference layer position",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Toggle reference layer between topmost or most below",
+  "RESET_REFERENCE_LAYER_POS": "Reset reference layer position",
+  "CLIP_CANVAS": "Clip Canvas",
+  "FLIP_IMG_VERTICALLY": "Flip Image Vertically",
+  "FLIP_IMG_HORIZONTALLY": "Flip Image Horizontally",
+  "FLIP_LAYERS_VERTICALLY": "Flip Selected Layers Vertically",
+  "FLIP_LAYERS_HORIZONTALLY": "Flip Selected Layers Horizontally",
+  "ROT_IMG_90": "Rotate Image 90 degrees",
+  "ROT_IMG_180": "Rotate Image 180 degrees",
+  "ROT_IMG_-90": "Rotate Image -90 degrees",
+  "ROT_LAYERS_90": "Rotate Selected Layers 90 degrees",
+  "ROT_LAYERS_180": "Rotate Selected Layers 180 degrees",
+  "ROT_LAYERS_-90": "Rotate Selected Layers -90 degrees",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Toggle vertical symmetry axis",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Toggle horizontal symmetry axis",
+  "DELETE_PIXELS": "Delete pixels",
+  "DELETE_PIXELS_DESCRIPTIVE": "Delete selected pixels",
+  "RESIZE_DOCUMENT": "Resize document",
+  "RESIZE_CANVAS": "Resize canvas",
+  "CENTER_CONTENT": "Center content",
+  "CUT": "Cut",
+  "CUT_DESCRIPTIVE": "Cut selected area/layers",
+  "PASTE": "Paste",
+  "PASTE_DESCRIPTIVE": "Paste clipboard contents",
+  "PASTE_AS_NEW_LAYER": "Paste as new layer",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Paste from clipboard as new layer",
+  "PASTE_REFERENCE_LAYER": "Paste reference layer",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Paste clipboard contents as reference layer",
+  "PASTE_COLOR": "Paste color",
+  "PASTE_COLOR_DESCRIPTIVE": "Paste color from clipboard",
+  "PASTE_COLOR_SECONDARY": "Paste color as secondary",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Paste color from clipboard as secondary color",
+  "CLIPBOARD": "Clipboard",
+  "COPY": "Copy",
+  "COPY_DESCRIPTIVE": "Copy to clipboard",
+  "COPY_COLOR_HEX": "Copy primary color (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Copy primary color as HEX code",
+  "COPY_COLOR_RGB": "Copy primary color (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Copy primary color as RGB code",
+  "COPY_COLOR_SECONDARY_HEX": "Copy secondary color (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Copy secondary color as HEX code",
+  "COPY_COLOR_SECONDARY_RGB": "Copy secondary color (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Copy secondary color as RGB code",
+  "PALETTE_COLORS": "Palette Colors",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Replace secondary color by primary",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Replace the secondary color by the primary color",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Replace primary color by secondary",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Replace the primary color by the secondary color",
+  "OPEN_PALETTE_BROWSER": "Open palette browser",
+  "OVERWRITE_PALETTE_CONSENT": "Palette '{0}' already exists, do you want to overwrite it?",
+  "PALETTE_EXISTS": "Palette already exists",
+  "REPLACE_PALETTE_CONSENT": "Replace current palette with selected one?",
+  "REPLACE_PALETTE": "Replace current palette",
+  "SELECT_COLOR_1": "Select color 1",
+  "SELECT_COLOR_2": "Select color 2",
+  "SELECT_COLOR_3": "Select color 3",
+  "SELECT_COLOR_4": "Select color 4",
+  "SELECT_COLOR_5": "Select color 5",
+  "SELECT_COLOR_6": "Select color 6",
+  "SELECT_COLOR_7": "Select color 7",
+  "SELECT_COLOR_8": "Select color 8",
+  "SELECT_COLOR_9": "Select color 9",
+  "SELECT_COLOR_10": "Select color 10",
+  "SELECT_TOOL": "Select {0} Tool",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Select the first color in the palette",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Select the second color in the palette",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Select the third color in the palette",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Select the fourth color in the palette",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Select the fifth color in the palette",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Select the sixth color in the palette",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Select the seventh color in the palette",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Select the eighth color in the palette",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Select the ninth color in the palette",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Select the tenth color in the palette",
+  "SWAP_COLORS": "Swap colors",
+  "SWAP_COLORS_DESCRIPTIVE": "Swap primary and secondary colors",
+  "SEARCH": "Search",
+  "COMMAND_SEARCH": "Command search",
+  "OPEN_COMMAND_SEARCH": "Open command search window",
+  "SELECT": "Select",
+  "DESELECT": "Deselect",
+  "INVERT": "Invert",
+  "SELECTION": "Selection",
+  "SELECT_ALL": "Select all",
+  "SELECT_ALL_DESCRIPTIVE": "Select everything",
+  "CLEAR_SELECTION": "Clear selection",
+  "INVERT_SELECTION": "Invert selection",
+  "INVERT_SELECTION_DESCRIPTIVE": "Invert the selection",
+  "TRANSFORM_SELECTED_AREA": "Transform selected area",
+  "NUDGE_SELECTED_LEFT": "Nudge selected object left",
+  "NUDGE_SELECTED_RIGHT": "Nudge selected object right",
+  "NUDGE_SELECTED_UP": "Nudge selected object up",
+  "NUDGE_SELECTED_DOWN": "Nudge selected object down",
+  "MASK_FROM_SELECTION": "New mask from selection",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Selection to new mask",
+  "ADD_SELECTION_TO_MASK": "Add selection to mask",
+  "SUBTRACT_SELECTION_FROM_MASK": "Subtract selection from mask",
+  "INTERSECT_SELECTION_MASK": "Intersect selection with mask",
+  "SELECTION_TO_MASK": "Selection to mask",
+  "TO_NEW_MASK": "to new mask",
+  "ADD_TO_MASK": "add to mask",
+  "SUBTRACT_FROM_MASK": "subtract from mask",
+  "INTERSECT_WITH_MASK": "intersect with mask",
+  "STYLUS": "Stylus",
+  "TOGGLE_PEN_MODE": "Toggle pen mode",
+  "UNDO": "Undo",
+  "UNDO_DESCRIPTIVE": "Undo last action",
+  "REDO": "Redo",
+  "REDO_DESCRIPTIVE": "Redo last action",
+  "WINDOWS": "Windows",
+  "TOGGLE_GRIDLINES": "Toggle gridlines",
+  "ZOOM_IN": "Zoom in",
+  "ZOOM_OUT": "Zoom out",
+  "NEW_WINDOW_FOR_IMG": "New window for current image",
+  "CENTER_ACTIVE_VIEWPORT": "Center active viewport",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Flip viewport horizontally",
+  "FLIP_VIEWPORT_VERTICALLY": "Flip viewport vertically",
+  "SETTINGS": "Settings",
+  "OPEN_SETTINGS": "Open settings",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Open settings window",
+  "OPEN_STARTUP_WINDOW": "Open startup window",
+  "OPEN_SHORTCUT_WINDOW": "Open shortcuts window",
+  "OPEN_ABOUT_WINDOW": "Open about window",
+  "OPEN_NAVIGATION_WINDOW": "Open navigation window",
+  "ERROR": "Error",
+  "INTERNAL_ERROR": "Internal error",
+  "ERROR_SAVE_LOCATION": "Couldn't save the file to the specified location",
+  "ERROR_WHILE_SAVING": "An internal error occured while saving. Please try again.",
+  "UNKNOWN_ERROR_SAVING": "An error occured while saving.",
+  "FAILED_ASSOCIATE_LOSPEC": "Failed to associate Lospec Palette protocol.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Donate",
+  "YES": "Yes",
+  "NO": "No",
+  "CANCEL": "Cancel",
+  "UNNAMED": "Unnamed",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Open command debug window",
+  "DELETE": "Delete",
+  "USER_PREFS": "User preferences (Roaming)",
+  "SHORTCUT_FILE": "Shortcut file (Roaming)",
+  "EDITOR_DATA": "Editor data (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "Moves viewport. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Click and move to pan the viewport",
+  "MOVE_TOOL_TOOLTIP": "Moves selected pixels ({0}). Hold Ctrl to move all layers.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Hold mouse to move selected pixels. Hold Ctrl to move all layers.",
+  "PEN_TOOL_TOOLTIP": "Pen. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Click and move to draw.",
+  "PIXEL_PERFECT_SETTING": "Pixel perfect",
+  "RECTANGLE_TOOL_TOOLTIP": "Draws rectangle on canvas ({0}). Hold Shift to draw a square.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to draw a rectangle. Hold Shift to draw a square.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to draw a square.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Keep original image",
+  "ROTATE_VIEWPORT_TOOLTIP": "Rotates viewport. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Click and move to rotate the viewport",
+  "SELECT_TOOL_TOOLTIP": "Selects area. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to select an area. Hold Shift to add to existing selection. Hold Ctrl to subtract from it.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to add to the current selection.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Click and move to subtract from the current selection.",
+  "ZOOM_TOOL_TOOLTIP": "Zooms viewport ({0}). Click to zoom in, hold alt and click to zoom out.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to zoom. Click to zoom in, hold ctrl and click to zoom out.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Click and move to zoom. Click to zoom out, release ctrl and click to zoom in.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Makes pixels brighter or darker ({0}). Hold Ctrl to make pixels darker.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Draw on pixels to make them brighter. Hold Ctrl to darken.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Draw on pixels to make them darker. Release Ctrl to brighten.",
+  "COLOR_PICKER_TOOLTIP": "Picks the primary color from the canvas. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Click to pick colors. Hold Ctrl to hide the canvas. Hold Shift to hide the reference layer",
+  "ELLIPSE_TOOL_TOOLTIP": "Draws an ellipse on canvas ({0}). Hold Shift to draw a circle.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move mouse to draw an ellipse. Hold Shift to draw a circle.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move mouse to draw a circle.",
+  "ERASER_TOOL_TOOLTIP": "Erases color from pixel. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Click and move to erase.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Fills area with color. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Press on an area to fill it. Hold down Ctrl to consider all layers.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Press on an area to fill it. Release Ctrl to only consider the current layers.",
+  "LASSO_TOOL_TOOLTIP": "Lasso. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to select pixels inside of the lasso. Hold Shift to add to existing selection. Hold Ctrl to subtract from it.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Click and move to add pixels inside of the lasso to the selection.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Click and move to subtract pixels inside of the lasso from the selection.",
+  "LINE_TOOL_TOOLTIP": "Draws line on canvas ({0}). Hold Shift to enable snapping.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move to draw a line. Hold Shift to enable snapping.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move mouse to draw a line with snapping enabled.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Magic Wand ({0}). Flood's the selection",
+  "MAGIC_WAND_ACTION_DISPLAY": "Click to flood the selection.",
+  "PEN_TOOL": "Pen",
+  "BRIGHTNESS_TOOL": "Brightness",
+  "COLOR_PICKER_TOOL": "Color Picker",
+  "ELLIPSE_TOOL": "Ellipse",
+  "ERASER_TOOL": "Eraser",
+  "FLOOD_FILL_TOOL": "Flood Fill",
+  "LASSO_TOOL": "Lasso",
+  "LINE_TOOL": "Line",
+  "MAGIC_WAND_TOOL": "Magic Wand",
+  "MOVE_TOOL": "Move",
+  "MOVE_VIEWPORT_TOOL": "Move Viewport",
+  "RECTANGLE_TOOL": "Rectangle",
+  "ROTATE_VIEWPORT_TOOL": "Rotate Viewport",
+  "SELECT_TOOL_NAME": "Select",
+  "ZOOM_TOOL": "Zoom",
+  "SHAPE_LABEL": "Shape",
+  "MODE_LABEL": "Mode",
+  "SCOPE_LABEL": "Scope",
+  "FILL_SHAPE_LABEL": "Fill shape",
+  "FILL_COLOR_LABEL": "Fill color",
+  "TOOL_SIZE_LABEL": "Tool size",
+  "STRENGTH_LABEL": "Strength",
+  "NEW": "New",
+  "ADD": "Add",
+  "SUBTRACT": "Subtract",
+  "INTERSECT": "Intersect",
+  "RECTANGLE": "Rectangle",
+  "CIRCLE": "Circle",
+  "ABOUT": "About",
+  "MINIMIZE": "Minimize",
+  "RESTORE": "Restore",
+  "MAXIMIZE": "Maximize",
+  "CLOSE": "Close",
+  "EXPORT_SIZE_HINT": "If you want to share the image, try {0}% for the best clarity",
+  "CREATE": "Create",
+  "BASE_LAYER_NAME": "Base layer",
+  "ENABLE_MASK": "Enable mask",
+  "SELECTED_AREA_EMPTY": "Selected area is empty",
+  "NOTHING_TO_COPY": "Nothing to copy",
+  "REFERENCE_LAYER_PATH": "Reference layer path",
+  "FLIP": "Flip",
+  "ROTATION": "Rotation",
+  "ROT_IMG_90_D": "Rotate Image 90°",
+  "ROT_IMG_180_D": "Rotate Image 180°",
+  "ROT_IMG_-90_D": "Rotate Image -90°",
+  "ROT_LAYERS_90_D": "Rotate Selected Layers 90°",
+  "ROT_LAYERS_180_D": "Rotate Selected Layers 180°",
+  "ROT_LAYERS_-90_D": "Rotate Selected Layers -90°",
+  "UNNAMED_PALETTE": "Unnamed Palette",
+  "CLICK_SELECT_PRIMARY": "Click to select as main color.",
+  "PEN_MODE": "Pen mode",
+  "VIEW": "View",
+  "HORIZONTAL_LINE_SYMMETRY": "Horizontal line symmetry",
+  "VERTICAL_LINE_SYMMETRY": "Vertical line symmetry",
+  "COLOR_PICKER_TITLE": "Color Picker",
+  "COLOR_SLIDERS_TITLE": "Color Sliders",
+  "PALETTE_TITLE": "Palette",
+  "SWATCHES_TITLE": "Swatches",
+  "LAYERS_TITLE": "Layers",
+  "NAVIGATION_TITLE": "Navigation",
+  "NORMAL_BLEND_MODE": "Normal",
+  "DARKEN_BLEND_MODE": "Darken",
+  "MULTIPLY_BLEND_MODE": "Multiply",
+  "COLOR_BURN_BLEND_MODE": "Color burn",
+  "LIGHTEN_BLEND_MODE": "Lighten",
+  "SCREEN_BLEND_MODE": "Screen",
+  "COLOR_DODGE_BLEND_MODE": "Color dodge",
+  "OVERLAY_BLEND_MODE": "Overlay",
+  "SOFT_LIGHT_BLEND_MODE": "Soft light",
+  "HARD_LIGHT_BLEND_MODE": "Hard light",
+  "DIFFERENCE_BLEND_MODE": "Difference",
+  "EXCLUSION_BLEND_MODE": "Exclusion",
+  "HUE_BLEND_MODE": "Hue",
+  "SATURATION_BLEND_MODE": "Saturation",
+  "LUMINOSITY_BLEND_MODE": "Luminosity",
+  "COLOR_BLEND_MODE": "Color",
+  "NOT_SUPPORTED_BLEND_MODE": "Not supported",
+  "RESTART": "Restart",
+  "SORT_BY": "Sort by",
+  "NAME": "Name",
+  "COLORS": "Colors",
+  "DEFAULT": "Default",
+  "ALPHABETICAL": "Alphabetical",
+  "COLOR_COUNT": "Color count",
+  "ANY": "Any",
+  "MAX": "Max",
+  "MIN": "Min",
+  "EXACT": "Exact",
+  "ASCENDING": "Ascending",
+  "DESCENDING": "Descending",
+  "NAME_IS_TOO_LONG": "The name is too long",
+  "STOP_IT_TEXT1": "That's enough. Tidy up your file names.",
+  "STOP_IT_TEXT2": "Can you stop copying these names please?",
+  "REPLACER_TOOLTIP": "Right click on palette color and choose 'Replace' or drop it here.",
+  "CLICK_TO_CHOOSE_COLOR": "Click to choose the color",
+  "REPLACE_COLOR": "Replace color",
+  "PALETTE_COLOR_TOOLTIP": "Click to select as main color. Drag and drop onto another palette color to swap them.",
+  "ADD_FROM_SWATCHES": "Add from swatches",
+  "ADD_COLOR_TO_PALETTE": "Add color to palette",
+  "USE_IN_CURRENT_IMAGE": "Use in current image",
+  "ADD_TO_FAVORITES": "Add to favorites",
+  "BROWSE_PALETTES": "Browse palettes",
+  "LOAD_PALETTE": "Load palette",
+  "SAVE_PALETTE": "Save palette",
+  "FAVORITES": "Favorites",
+  "ADD_FROM_CURRENT_PALETTE": "Add from current palette",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Open palettes directory in explorer",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Browse palettes on Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "Import from file",
+  "TOP_LEFT": "Top left",
+  "TOP_CENTER": "Top center",
+  "TOP_RIGHT": "Top right",
+  "MIDDLE_LEFT": "Middle left",
+  "MIDDLE_CENTER": "Middle center",
+  "MIDDLE_RIGHT": "Middle right",
+  "BOTTOM_LEFT": "Bottom left",
+  "BOTTOM_CENTER": "Bottom center",
+  "BOTTOM_RIGHT": "Bottom right",
+  "CLIP_TO_BELOW": "Clip to layer below",
+  "MOVE_UPWARDS": "Move upwards",
+  "MOVE_DOWNWARDS": "Move downwards",
+  "MERGE_SELECTED": "Merge selected",
+  "LOCK_TRANSPARENCY": "Lock transparency",
+  "COULD_NOT_LOAD_PALETTE": "Couldn't fetch palettes",
+  "NO_PALETTES_FOUND": "No palettes found.",
+  "LOSPEC_LINK_TEXT": "I heard you can find some here: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Palette Browser",
+  "DELETE_PALETTE_CONFIRMATION": "Are you sure you want to delete this palette? This cannot be undone.",
+  "SHORTCUTS_IMPORTED": "Shortcuts from {0} were imported successfully.",
+  "SHORTCUT_PROVIDER_DETECTED": "We've detected, that you have {0} installed. Do you want to import shortcuts from it?",
+  "IMPORT_FROM_INSTALLATION": "Import from installation",
+  "IMPORT_INSTALLATION_OPTION1": "Import from installation",
+  "IMPORT_INSTALLATION_OPTION2": "Use defaults",
+  "IMPORT_FROM_TEMPLATE": "Import from template",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Shortcuts were imported successfully.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Are you sure you want to reset all shortcuts to their default value?",
+  "SUCCESS": "Success",
+  "WARNING": "Warning",
+  "ERROR_IMPORTING_IMAGE": "An error occured while importing the image.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Corrupted shortcuts file",
+  "SHORTCUTS_CORRUPTED": "Shortcuts file was corrupted, resetting to default.",
+  "FAILED_DOWNLOAD_PALETTE": "Failed to download palette",
+  "FILE_INCORRECT_FORMAT": "The file was not in a correct format",
+  "INVALID_FILE": "Invalid file",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "Shortcuts file was not in a correct format",
+  "UNSUPPORTED_FILE_FORMAT": "This file format is unsupported",
+  "ALREADY_ASSIGNED": "Already assigned",
+  "REPLACE": "Replace",
+  "SWAP": "Swap",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "This shortcut is already assigned to '{0}'\nDo you want to replace the existing shortcut or swap the two?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "This shortcut is already assigned to '{0}'\nDo you want to replace the existing shortcut?",
+  "UNSAVED_CHANGES": "Unsaved changes",
+  "DOCUMENT_MODIFIED_SAVE": "The document has been modified. Do you want to save changes?",
+  "SESSION_UNSAVED_DATA": "{0} with unsaved data. Are you sure?",
+  "PROJECT_MAINTAINERS": "Project Maintainers",
+  "OTHER_AWESOME_CONTRIBUTORS": "And other awesome contributors",
+  "HELP": "Help",
+  "STOP_IT_TEXT3": "No, really, stop it.",
+  "STOP_IT_TEXT4": "Don't you have anything better to do?",
+  "LINEAR_DODGE_BLEND_MODE": "Linear dodge (Add)",
+  "PRESS_ANY_KEY": "Press any key",
+  "NONE_SHORTCUT": "None",
+  "REFERENCE": "Reference",
+  "PUT_REFERENCE_LAYER_ABOVE": "Put reference layer above",
+  "PUT_REFERENCE_LAYER_BELOW": "Put reference layer below",
+  "TOGGLE_VERTICAL_SYMMETRY": "Toggle vertical symmetry",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Toggle horizontal symmetry",
+  "RESET_VIEWPORT": "Reset viewport",
+  "VIEWPORT_SETTINGS": "Viewport settings",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Click and hold mouse to move pixels in selected layers.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Hold mouse to move all layers.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Rename",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Open Localization Debug Window",
+  "FORCE_OTHER_FLOW_DIRECTION": "Force other flow direction",
+  "API_KEY": "API Key",
+  "LOCALIZATION_VIEW_TYPE": "Localization View Type",
+  "LOAD_LANGUAGE_FROM_FILE": "Load language from file",
+  "LOG_IN": "Log in",
+  "SYNC": "Sync",
+  "NOT_LOGGED_IN": "Not logged in",
+  "POE_EDITOR_ERROR": "POEditor Error: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP Error: {0} {1}",
+  "LOGGED_IN": "Logged in",
+  "SYNCED_SUCCESSFULLY": "Synced successfully",
+  "EXCEPTION_ERROR": "Exception: {0}",
+  "DROP_PALETTE": "Drop palette here",
+  "SECURITY_ERROR": "Security error",
+  "SECURITY_ERROR_MSG": "No rights to write to the specified location.",
+  "IO_ERROR": "IO error",
+  "IO_ERROR_MSG": "Error while writing to disk.",
+  "FAILED_ASSOCIATE_PIXI": "Failed to associate .pixi file with PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "There was an error while saving the palette.",
+  "NO_COLORS_TO_SAVE": "There are no colors to save.",
+  "ALL_LAYERS": "All Layers",
+  "SINGLE_LAYER": "Single Layer",
+  "CHOOSE": "Choose",
+  "REMOVE": "Remove",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "File is not a \".aseprite-keys\" file",
+  "FILE_HAS_INVALID_SHORTCUT": "The file contains an invalid shortcut",
+  "FILE_EXTENSION_NOT_SUPPORTED": "The file type '{0}' is not supported",
+  "ERROR_READING_FILE": "Error while reading the file",
+  "DISCARD_PALETTE": "Discard palette",
+  "DISCARD_PALETTE_CONFIRMATION": "Are you sure you want to discard current palette? This cannot be undone.",
+  "IMPORT_AS_NEW_LAYER": "Import as new layer",
+  "PASTE_AS_PRIMARY_COLOR": "Paste as primary color",
+  "IMPORT_AS_NEW_FILE": "Import as new file",
+  "IMPORT_PALETTE_FILE": "Import palette file",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Import colors into palette",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Import color into palette",
+  "IMPORT_AS_REFERENCE_LAYER": "Import as reference layer",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Right-click to pick color, Shift-right-click to copy color to clipboard",
+  "OPEN_FILE_FROM_CLIPBOARD": "Open from clipboard",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Open from clipboard",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Downloading language failed.\nAPI Key might have been overused.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Localization data path not found",
+  "APPLY": "Apply",
+  "UPDATE_SOURCE": "Update source",
+  "COPY_TO_CLIPBOARD": "Copy to clipboard",
+  "LANGUAGE_FILE_NOT_FOUND": "Language file not found.\nLooking for {0}",
+  "PROJECT_ROOT_NOT_FOUND": "PixiEditor Project root not found.\nLooking for PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Localization folder not found.\nLooking for /Data/Localization",
+  "SELECT_A_LANGUAGE": "Select a language",
+  "DONE": "Done",
+  "SOURCE_UNSET_OR_MISSING": "Source missing/unset",
+  "SOURCE_NEWER": "Source newer",
+  "SOURCE_UP_TO_DATE": "Source is up to date",
+  "SOURCE_OLDER": "Cloud newer",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally.",
+
+  "LOCAL_PALETTE_SOURCE_NAME": "Local",
+
+  "ERROR_FORBIDDEN_UNIQUE_NAME": "Extension unique name cannot start with 'pixieditor'.",
+  "ERROR_MISSING_METADATA": "Extension metadata key '{0}' is missing.",
+  "ERROR_NO_CLASS_ENTRY": "Extension class entry is missing on path '{0}'.",
+  "ERROR_NO_ENTRY_ASSEMBLY": "Extension entry assembly is missing on path '{0}'.",
+  "ERROR_MISSING_ADDITIONAL_CONTENT": "Your current setup doesn't allow loading this extension. Perhaps you don't own it or don't have it installed. You can purchase it here '{0}'.",
+
+  "BUY_SUPPORTER_PACK": "Buy Supporter Pack",
+
+  "NEWS": "News",
+  "DISABLE_NEWS_PANEL": "Disable News panel in startup window",
+  "FAILED_FETCH_NEWS": "Failed to fetch news",
+  
+  "CROP_TO_SELECTION": "Crop to selection",
+  "CROP_TO_SELECTION_DESCRIPTIVE": "Crop image to selection",
+  "SHOW_CONTEXT_MENU": "Show context menu",
+  "ERASE": "Erase",
+  "USE_SECONDARY_COLOR": "Use secondary color",
+  "RIGHT_CLICK_MODE": "Right click mode",
+  "ADD_PRIMARY_COLOR_TO_PALETTE": "Add primary color to palette",
+  "ADD_PRIMARY_COLOR_TO_PALETTE_DESCRIPTIVE": "Add primary color to current palette"
+}

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/es.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "Archivo Reciente",
+  "OPEN_FILE": "Abrir Archivo",
+  "NEW_FILE": "Nuevo",
+  "RECENT_EMPTY_TEXT": "Demasiado espacio vacio",
+  "LANGUAGE": "Idioma",
+  "GENERAL": "General",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Fijaciones de teclas",
+  "MISC": "Otros",
+  "SHOW_STARTUP_WINDOW": "Abrir Al Iniciar Windows",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Mostrar imagen en la barra de tareas",
+  "RECENT_FILE_LENGTH": "Longitud de la lista de archivos reciente",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Cuántos documentos se muestran en Archivo > Recientes. Por defecto: 8",
+  "DEFAULT_NEW_SIZE": "Nuevo archivo por defecto",
+  "WIDTH": "Anchura",
+  "HEIGHT": "Altura",
+  "TOOLS": "Herramientas",
+  "ENABLE_SHARED_TOOLBAR": "Activar la barra de herramientas compartida",
+  "AUTOMATIC_UPDATES": "Actualizaciones Automáticas",
+  "CHECK_FOR_UPDATES": "Buscar actualizaciones al iniciar",
+  "UPDATE_STREAM": "Actualizar stream",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Los canales de actualización sólo se pueden cambiar en la versión independiente (descargada de https://pixieditor.net).\nLas versiones de Steam y Microsoft Store gestionan las actualizaciones por separado.",
+  "DEBUG": "Debug",
+  "ENABLE_DEBUG_MODE": "Activar modo Debug",
+  "OPEN_CRASH_REPORTS_DIR": "Abrir lista de reportes",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Activado",
+  "SHOW_IMAGE_NAME": "Mostrar nombre del archivo",
+  "SHOW_IMAGE_SIZE": "Mostrar tamaño del archivo",
+  "SHOW_LAYER_COUNT": "Mostrar recuento de capas",
+  "FILE": "Archivo",
+  "RECENT": "Reciente",
+  "OPEN": "Abrir",
+  "SAVE_PIXI": "Guardar (.pixi)",
+  "SAVE_AS_PIXI": "Guardar como... (.pixi)",
+  "EXPORT_IMG": "Exportar (.png, .jpg, etc.)",
+  "EDIT": "Editar",
+  "EXIT": "Salir",
+  "PERCENTAGE": "Porcentaje",
+  "ABSOLUTE": "Absoluto",
+  "PRESERVE_ASPECT_RATIO": "Conservar la relación de aspecto",
+  "ANCHOR_POINT": "Punto de anclaje",
+  "RESIZE_IMAGE": "Cambiar el tamaño de la imagen",
+  "RESIZE": "Cambie el tamaño de",
+  "DOCUMENTATION": "Documentacion",
+  "WEBSITE": "Pagina Web",
+  "OPEN_WEBSITE": "Abrir Pagina Web",
+  "REPOSITORY": "Repositorio",
+  "OPEN_REPOSITORY": "Abrir Repositorio",
+  "LICENSE": "Licencia",
+  "OPEN_LICENSE": "Abrir Licencia",
+  "THIRD_PARTY_LICENSES": "Licencias de terceros",
+  "OPEN_THIRD_PARTY_LICENSES": "Abrir licencias de terceros",
+  "APPLY_TRANSFORM": "Aplicar transformacion",
+  "INCREASE_TOOL_SIZE": "Aumentar el tamaño de la herramienta",
+  "DECREASE_TOOL_SIZE": "Disminuir el tamaño de la herramienta",
+  "TO_INSTALL_UPDATE": "instalar actualización {0}",
+  "DOWNLOADING_UPDATE": "Instalando actualizacion...",
+  "UPDATE_READY": "Actualización listo para instalar. ¿Desea instalarlo ahora?",
+  "NEW_UPDATE": "Nueva actualizacion",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "No se ha podido actualizar sin privilegios de administrador. Por favor, ejecute PixiEditor como administrador.",
+  "INSUFFICIENT_PERMISSIONS": "Permisos insuficientes",
+  "UPDATE_CHECK_FAILED": "Error en la comprobación de la actualización",
+  "COULD_NOT_CHECK_FOR_UPDATES": "No se ha podido comprobar si hay una actualización disponible.",
+  "VERSION": "Version {0}",
+  "OPEN_TEMP_DIR": "Abrir directorio temporal",
+  "OPEN_LOCAL_APPDATA_DIR": "Abra el directorio local AppData",
+  "OPEN_ROAMING_APPDATA_DIR": "Abrir el directorio Roaming AppData",
+  "OPEN_INSTALLATION_DIR": "Abrir el directorio de instalación",
+  "DUMP_ALL_COMMANDS": "Volcar todos los comandos",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Volcar todos los comandos a un archivo de texto",
+  "CRASH": "Error",
+  "CRASH_APP": "Error en la aplicacion",
+  "DELETE_USR_PREFS": "Eliminar las preferencias del usuario (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Eliminar el archivo de acceso directo (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Eliminar datos del editor (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Generar plantilla de enlaces de teclas",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Generar plantilla json de enlaces de claves",
+  "VALIDATE_SHORTCUT_MAP": "Validar dirección de accesos directos",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Validados dirección de accesos directos",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Llaves vacías: {0}\nComandos desconocidos: {1}",
+  "RESULT": "Resultado",
+  "CLEAR_RECENT_DOCUMENTS": "Limpiar archivos recientes",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Limpiar documentos recientemente abiertos",
+  "OPEN_CMD_DEBUG_WINDOW": "Abrir caja de comandos debug de windows",
+  "PATH_DOES_NOT_EXIST": "{0} no existe.",
+  "LOCATION_DOES_NOT_EXIST": "La ubicación no existe.",
+  "FILE_NOT_FOUND": "Archivo no encontrado.",
+  "ARE_YOU_SURE": "¿Estas seguro?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "¿Está seguro de que desea borrar {0}?\nEstos datos se perderán para todas las instalaciones.\n(Ruta completa: {1})",
+  "FAILED_TO_OPEN_FILE": "Error al abrir el archivo",
+  "OLD_FILE_FORMAT": "Formato de archivo viejo",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Este archivo .pixi utiliza el formato antiguo,\nque ya no es compatible y no puede abrirse.",
+  "NOTHING_FOUND": "Nada encontrado",
+  "EXPORT": "Exportar",
+  "EXPORT_IMAGE": "Exportar imagen",
+  "IMPORT": "Importar",
+  "SHORTCUT_TEMPLATES": "Plantillas de acceso directo",
+  "RESET_ALL": "Reiniciar todo",
+  "LAYER": "Capa",
+  "LAYER_DELETE_SELECTED": "Borrar capa/carpeta activa",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Borrar capa o carpeta activa",
+  "LAYER_DELETE_ALL_SELECTED": "Eliminar todas las capas/carpetas seleccionadas",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Eliminar todas las capas y/o carpetas seleccionadas",
+  "DELETE_SELECTED_PIXELS": "Borrar píxeles seleccionados",
+  "NEW_FOLDER": "Nueva carpeta",
+  "CREATE_NEW_FOLDER": "Crear nueva carpeta",
+  "NEW_LAYER": "Nueva capa",
+  "CREATE_NEW_LAYER": "Crear nueva capa",
+  "NEW_IMAGE": "Imagen nueva",
+  "CREATE_NEW_IMAGE": "Crear imagen nueva",
+  "SAVE": "Guardar",
+  "SAVE_AS": "Guardar como...",
+  "IMAGE": "Imagen",
+  "SAVE_IMAGE": "Guardar imagen",
+  "SAVE_IMAGE_AS": "Guardar imagen como nuevo",
+  "DUPLICATE": "Duplicar",
+  "DUPLICATE_SELECTED_LAYER": "Duplicar capa selecionada",
+  "CREATE_MASK": "Crear mascara",
+  "DELETE_MASK": "Borrar mascara",
+  "TOGGLE_MASK": "Máscara de conmutación",
+  "APPLY_MASK": "Aplicar mascara",
+  "TOGGLE_VISIBILITY": "Alternar visibilidad",
+  "MOVE_MEMBER_UP": "Desplazar al miembro hacia arriba",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Mover hacia arriba la capa o carpeta seleccionada",
+  "MOVE_MEMBER_DOWN": "Desplazar el miembro hacia abajo",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Mover hacia abajo la capa o carpeta seleccionada",
+  "MERGE_ALL_SELECTED_LAYERS": "Fusionar todas las capas seleccionadas",
+  "MERGE_WITH_ABOVE": "Fusionar la capa seleccionada con la anterior",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Fusionar la capa seleccionada con la superior",
+  "MERGE_WITH_BELOW": "Fusionar la capa seleccionada con la de abajo",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Fusionar la capa seleccionada con la inferior",
+  "ADD_REFERENCE_LAYER": "Añadir capa de referencia",
+  "DELETE_REFERENCE_LAYER": "Eliminar capa de referencia",
+  "TRANSFORM_REFERENCE_LAYER": "Transformar capa de referencia",
+  "TOGGLE_REFERENCE_LAYER_POS": "Conmutar la posición de la capa de referencia",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Conmutar la capa de referencia entre la superior o la inferior",
+  "RESET_REFERENCE_LAYER_POS": "Restablecer la posición de la capa de referencia",
+  "CLIP_CANVAS": "Adjuntar Canvas",
+  "FLIP_IMG_VERTICALLY": "Voltear imagen verticalmente",
+  "FLIP_IMG_HORIZONTALLY": "Voltear imagen horizontalmente",
+  "FLIP_LAYERS_VERTICALLY": "Voltear verticalmente las capas seleccionadas",
+  "FLIP_LAYERS_HORIZONTALLY": "Voltear horizontalmente las capas seleccionadas",
+  "ROT_IMG_90": "Girar la imagen 90 grados",
+  "ROT_IMG_180": "Girar la imagen 180 grados",
+  "ROT_IMG_-90": "Girar la imagen -90 grados",
+  "ROT_LAYERS_90": "Girar 90 grados las capas seleccionadas",
+  "ROT_LAYERS_180": "Girar 180 grados las capas seleccionadas",
+  "ROT_LAYERS_-90": "Girar -90 grados las capas seleccionadas",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Conmutar el eje de simetría vertical",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Conmutar el eje de simetría horizontal",
+  "DELETE_PIXELS": "Borrar píxeles",
+  "DELETE_PIXELS_DESCRIPTIVE": "Borrar píxeles seleccionados",
+  "RESIZE_DOCUMENT": "Cambiar el tamaño del documento",
+  "RESIZE_CANVAS": "Cambiar el tamaño del canvas",
+  "CENTER_CONTENT": "Contenido central",
+  "CUT": "Cortar",
+  "CUT_DESCRIPTIVE": "Cortar el área o las capas seleccionadas",
+  "PASTE": "Pegar",
+  "PASTE_DESCRIPTIVE": "Pegar el contenido del portapapeles",
+  "PASTE_AS_NEW_LAYER": "Pegar como nueva capa",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Pegar desde el portapapeles como nueva capa",
+  "PASTE_REFERENCE_LAYER": "Pegar capa de referencia",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Pegar el contenido del portapapeles como capa de referencia",
+  "PASTE_COLOR": "Pegar color",
+  "PASTE_COLOR_DESCRIPTIVE": "Pegar color desde el portapapeles",
+  "PASTE_COLOR_SECONDARY": "Pegar color como secundario",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Pegar color del portapapeles como color secundario",
+  "CLIPBOARD": "Portapapeles",
+  "COPY": "Copiar",
+  "COPY_DESCRIPTIVE": "Copiar al portapapeles",
+  "COPY_COLOR_HEX": "Copiar color primario (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Copiar color primario como código HEX",
+  "COPY_COLOR_RGB": "Copiar color primario (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Copiar color primario como código RGB",
+  "COPY_COLOR_SECONDARY_HEX": "Copiar color secundario (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Copiar color secundario como código HEX",
+  "COPY_COLOR_SECONDARY_RGB": "Copiar color secundario (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Copiar color secundario como código RGB",
+  "PALETTE_COLORS": "Colores de la paleta",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Sustituir el color secundario por el primario",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Sustituye el color secundario por el primario",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Sustituir el color primario por el secundario",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Sustituir el color primario por el secundario",
+  "OPEN_PALETTE_BROWSER": "Abrir el navegador de paletas",
+  "OVERWRITE_PALETTE_CONSENT": "La paleta '{0}' ya existe, ¿desea sobrescribirla?",
+  "PALETTE_EXISTS": "La paleta ya existe",
+  "REPLACE_PALETTE_CONSENT": "¿Reemplazar la paleta actual por la seleccionada?",
+  "REPLACE_PALETTE": "Sustituir la paleta actual",
+  "SELECT_COLOR_1": "Seleccionar color 1",
+  "SELECT_COLOR_2": "Seleccionar color 2",
+  "SELECT_COLOR_3": "Seleccionar color 3",
+  "SELECT_COLOR_4": "Seleccionar color 4",
+  "SELECT_COLOR_5": "Seleccionar color 5",
+  "SELECT_COLOR_6": "Seleccionar color 6",
+  "SELECT_COLOR_7": "Seleccionar color 7",
+  "SELECT_COLOR_8": "Seleccionar color  8",
+  "SELECT_COLOR_9": "Seleccionar color 9",
+  "SELECT_COLOR_10": "Seleccionar color 10",
+  "SELECT_TOOL": "Seleccionar {0} Herramienta",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Seleccione el primer color de la paleta",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Seleccione el segundo color de la paleta",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Seleccione el tercero color de la paleta",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Seleccione el cuarto color de la paleta",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Seleccione el quinto color de la paleta",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Seleccione el sexto color de la paleta",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Seleccione el séptimo color de la paleta",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Seleccione el octavo color de la paleta",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Seleccione el noveno color de la paleta",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Seleccione el decimo color de la paleta",
+  "SWAP_COLORS": "Intercambiar colores",
+  "SWAP_COLORS_DESCRIPTIVE": "Intercambiar colores primarios y secundarios",
+  "SEARCH": "Buscar",
+  "COMMAND_SEARCH": "Buscar comandos",
+  "OPEN_COMMAND_SEARCH": "Abrir buscador de comandos",
+  "SELECT": "Seleccionar",
+  "DESELECT": "Deseleccionar",
+  "INVERT": "Invertir",
+  "SELECTION": "Seleccionar",
+  "SELECT_ALL": "Seleccionar todo",
+  "SELECT_ALL_DESCRIPTIVE": "Seleccionar todo",
+  "CLEAR_SELECTION": "Limpiar seleccionado",
+  "INVERT_SELECTION": "Invertir seleccionado",
+  "INVERT_SELECTION_DESCRIPTIVE": "Invertir zona seleccionada",
+  "TRANSFORM_SELECTED_AREA": "Transformar zona seleccionada",
+  "NUDGE_SELECTED_LEFT": "Desplazar el objeto seleccionado hacia la izquierda",
+  "NUDGE_SELECTED_RIGHT": "Desplazar el objeto seleccionado hacia la derecha",
+  "NUDGE_SELECTED_UP": "Desplazar hacia arriba el objeto seleccionado",
+  "NUDGE_SELECTED_DOWN": "Desplazar hacia abajo el objeto seleccionado",
+  "MASK_FROM_SELECTION": "Nueva máscara a partir de la selección",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Seleccionar nueva mascara",
+  "ADD_SELECTION_TO_MASK": "Agregar mascara seleccionada",
+  "SUBTRACT_SELECTION_FROM_MASK": "Restar la selección de la máscara",
+  "INTERSECT_SELECTION_MASK": "Selección de intersección con máscara",
+  "SELECTION_TO_MASK": "Selección para enmascarar",
+  "TO_NEW_MASK": "a la nueva máscara",
+  "ADD_TO_MASK": "agregar mascara",
+  "SUBTRACT_FROM_MASK": "restar de la máscara",
+  "INTERSECT_WITH_MASK": "intersecar con máscara",
+  "STYLUS": "Stylus",
+  "TOGGLE_PEN_MODE": "Activar el modo lápiz",
+  "UNDO": "Deshacer",
+  "UNDO_DESCRIPTIVE": "Deshacer la última acción",
+  "REDO": "Rehacer",
+  "REDO_DESCRIPTIVE": "Rehacer la última acción",
+  "WINDOWS": "Windows",
+  "TOGGLE_GRIDLINES": "Activar cuadrículas",
+  "ZOOM_IN": "Ampliar",
+  "ZOOM_OUT": "Alejar",
+  "NEW_WINDOW_FOR_IMG": "Nueva ventana para la imagen actual",
+  "CENTER_ACTIVE_VIEWPORT": "Centrar la ventana activa",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Voltear horizontalmente la ventana gráfica",
+  "FLIP_VIEWPORT_VERTICALLY": "Voltear la ventana verticalmente",
+  "SETTINGS": "Ajustes",
+  "OPEN_SETTINGS": "Abrir ajustes",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Abrir la ventana de configuración",
+  "OPEN_STARTUP_WINDOW": "Abrir la ventana de inicio",
+  "OPEN_SHORTCUT_WINDOW": "Abrir la ventana de accesos directos",
+  "OPEN_ABOUT_WINDOW": "Abrir la ventana Acerca de",
+  "OPEN_NAVIGATION_WINDOW": "Abrir la ventana de navegación",
+  "ERROR": "Error",
+  "INTERNAL_ERROR": "Error interno",
+  "ERROR_SAVE_LOCATION": "No se ha podido guardar el archivo en la ubicación especificada",
+  "ERROR_WHILE_SAVING": "Se ha producido un error interno al guardar. Por favor, inténtelo de nuevo.",
+  "UNKNOWN_ERROR_SAVING": "Se ha producido un error al guardar.",
+  "FAILED_ASSOCIATE_LOSPEC": "Fallo al asociar el protocolo Lospec Palette.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Donar",
+  "YES": "Si",
+  "NO": "No",
+  "CANCEL": "Cancelar",
+  "UNNAMED": "SinNombre",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Abrir ventana de comandos debug",
+  "DELETE": "Eliminar",
+  "USER_PREFS": "Preferencias del usuario (Roaming)",
+  "SHORTCUT_FILE": "Archivo de acceso directo (Roaming)",
+  "EDITOR_DATA": "Editor de datos (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "Mueve la ventana gráfica. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Haz clic y desplázate para desplazar la ventana gráfica",
+  "MOVE_TOOL_TOOLTIP": "Mueve los píxeles seleccionados ({0}). Mantenga pulsada la tecla Ctrl para mover todas las capas.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Mantenga pulsado el ratón para mover los píxeles seleccionados. Mantenga pulsada la tecla Ctrl para mover todas las capas.",
+  "PEN_TOOL_TOOLTIP": "Lapiz. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Haz clic y muévete para dibujar.",
+  "PIXEL_PERFECT_SETTING": "Pixel perfecto",
+  "RECTANGLE_TOOL_TOOLTIP": "Dibuja un rectángulo en el canvas ({0}). Mantenga pulsada la tecla Mayús para dibujar un cuadrado.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Haga clic y mueva para dibujar un rectángulo. Mantenga pulsada la tecla Mayús para dibujar un cuadrado.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Haz clic y mueve para dibujar un cuadrado.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Mantener archivo original",
+  "ROTATE_VIEWPORT_TOOLTIP": "Rotar la vista. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Haga clic y mueva para girar la ventana gráfica",
+  "SELECT_TOOL_TOOLTIP": "Seleccionar area. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Haga clic y mueva para seleccionar un área. Mantenga pulsada la tecla Mayús para añadir a la selección existente. Mantenga pulsada la tecla Ctrl para restar.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Pulse y mueva para añadir a la selección actual.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Haga clic y mueva para restar de la selección actual.",
+  "ZOOM_TOOL_TOOLTIP": "Amplía la vista ({0}). Haz clic para acercar, mantén pulsado alt y haz clic para alejar.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Haz clic y muévete para ampliar. Haz clic para acercar, mantén pulsada la tecla ctrl y haz clic para alejar.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Haz clic y muévete para ampliar. Haz clic para alejar, suelta ctrl y haz clic para acercar.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Aclara u oscurece los píxeles ({0}). Mantenga pulsada la tecla Ctrl para oscurecer los píxeles.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Dibuja sobre los píxeles para hacerlos más brillantes. Mantenga pulsada la tecla Ctrl para oscurecer.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Dibuja sobre los píxeles para oscurecerlos. Suelte Ctrl para aclarar.",
+  "COLOR_PICKER_TOOLTIP": "Elige el color primario del canvas. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Haz clic para elegir colores. Mantenga pulsada la tecla Ctrl para ocultar el canvas. Mantenga pulsada la tecla Shift para ocultar la referencia.",
+  "ELLIPSE_TOOL_TOOLTIP": "Dibuja una elipse en el canvas ({0}). Mantenga pulsada la tecla Shift para dibujar un círculo.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Haz clic y mueve el ratón para dibujar una elipse. Mantenga pulsada la tecla Shift para dibujar un círculo.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Haz clic y mueve el ratón para dibujar un círculo.",
+  "ERASER_TOOL_TOOLTIP": "Color del borrador del píxel. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Pulse y mueva para borrar.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Rellena el área con color. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Pulse sobre un área para rellenarla. Mantenga pulsada la tecla Ctrl para considerar todas las capas.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Pulse sobre un área para rellenarla. Suelte Ctrl para considerar sólo las capas actuales.",
+  "LASSO_TOOL_TOOLTIP": "Lazo. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Haga clic y mueva para seleccionar píxeles dentro del lazo. Mantenga pulsada la tecla Shift para añadir a la selección existente. Mantenga pulsada la tecla Ctrl para restar de ella.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Haga clic y mueva para añadir píxeles dentro del lazo a la selección.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Haga clic y mueva para restar píxeles dentro del lazo de la selección.",
+  "LINE_TOOL_TOOLTIP": "Dibuja una línea en el lienzo ({0}). Mantenga pulsada la tecla Shift para activar el ajuste.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Haga clic y mueva para dibujar una línea. Mantenga pulsada la tecla Shift para activar el ajuste.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Haga clic y mueva el ratón para dibujar una línea con el ajuste activado.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Varita Mágica ({0}). Inundar es la selección",
+  "MAGIC_WAND_ACTION_DISPLAY": "Haga clic para inundar la selección.",
+  "PEN_TOOL": "Lapiz",
+  "BRIGHTNESS_TOOL": "Oscuridad",
+  "COLOR_PICKER_TOOL": "Selector de color",
+  "ELLIPSE_TOOL": "Elipse",
+  "ERASER_TOOL": "Borrador",
+  "FLOOD_FILL_TOOL": "Relleno de inundación",
+  "LASSO_TOOL": "Lazo",
+  "LINE_TOOL": "Linea",
+  "MAGIC_WAND_TOOL": "Varita mágica",
+  "MOVE_TOOL": "Mover",
+  "MOVE_VIEWPORT_TOOL": "Mover la ventana gráfica",
+  "RECTANGLE_TOOL": "Rectangulo",
+  "ROTATE_VIEWPORT_TOOL": "Rotar la ventana gráfica",
+  "SELECT_TOOL_NAME": "Seleccionar",
+  "ZOOM_TOOL": "Zoom",
+  "SHAPE_LABEL": "Forma",
+  "MODE_LABEL": "Forma",
+  "SCOPE_LABEL": "Alcance",
+  "FILL_SHAPE_LABEL": "Forma de relleno",
+  "FILL_COLOR_LABEL": "Forma de color",
+  "TOOL_SIZE_LABEL": "Herramienta de tamaño",
+  "STRENGTH_LABEL": "Fuerza",
+  "NEW": "Nuevo",
+  "ADD": "Agregar",
+  "SUBTRACT": "Resta",
+  "INTERSECT": "Intersect",
+  "RECTANGLE": "Rectangulo",
+  "CIRCLE": "Circulo",
+  "ABOUT": "Sobre",
+  "MINIMIZE": "Minimizar",
+  "RESTORE": "Restaurar",
+  "MAXIMIZE": "Maximizar",
+  "CLOSE": "Cerrar",
+  "EXPORT_SIZE_HINT": "Si quieres compartir la imagen, prueba {0}% para obtener la mejor claridad",
+  "CREATE": "Crear",
+  "BASE_LAYER_NAME": "Capa base",
+  "ENABLE_MASK": "Activar máscara",
+  "SELECTED_AREA_EMPTY": "El área seleccionada está vacía",
+  "NOTHING_TO_COPY": "Nada para copiar",
+  "REFERENCE_LAYER_PATH": "Trayectoria de la capa de referencia",
+  "FLIP": "Voltear",
+  "ROTATION": "Rotacion",
+  "ROT_IMG_90_D": "Girar la imagen 90",
+  "ROT_IMG_180_D": "Girar la imagen 180",
+  "ROT_IMG_-90_D": "Girar la imagen -90",
+  "ROT_LAYERS_90_D": "Girar la imagen seleccionada 90",
+  "ROT_LAYERS_180_D": "Girar la imagen seleccionada 180",
+  "ROT_LAYERS_-90_D": "Girar la imagen seleccionada -90",
+  "UNNAMED_PALETTE": "Paleta sin nombre",
+  "CLICK_SELECT_PRIMARY": "Haga clic para seleccionar como color principal.",
+  "PEN_MODE": "Modo lapiz",
+  "VIEW": "Mirar",
+  "HORIZONTAL_LINE_SYMMETRY": "Simetría de línea horizontal",
+  "VERTICAL_LINE_SYMMETRY": "Simetría de línea vertical",
+  "COLOR_PICKER_TITLE": "Selector de color",
+  "COLOR_SLIDERS_TITLE": "Deslizadores de color",
+  "PALETTE_TITLE": "Paleta",
+  "SWATCHES_TITLE": "Muestras",
+  "LAYERS_TITLE": "Capas",
+  "NAVIGATION_TITLE": "Navegación",
+  "NORMAL_BLEND_MODE": "Normal",
+  "DARKEN_BLEND_MODE": "Oscurecer",
+  "MULTIPLY_BLEND_MODE": "Multpilicar",
+  "COLOR_BURN_BLEND_MODE": "Quemadura de color",
+  "LIGHTEN_BLEND_MODE": "Aclarar",
+  "SCREEN_BLEND_MODE": "Pantalla",
+  "COLOR_DODGE_BLEND_MODE": "Esquivar el color",
+  "OVERLAY_BLEND_MODE": "Superposición",
+  "SOFT_LIGHT_BLEND_MODE": "Luz suave",
+  "HARD_LIGHT_BLEND_MODE": "Luz dura",
+  "DIFFERENCE_BLEND_MODE": "Diferencia",
+  "EXCLUSION_BLEND_MODE": "Exclusion",
+  "HUE_BLEND_MODE": "Tono",
+  "SATURATION_BLEND_MODE": "Saturacion",
+  "LUMINOSITY_BLEND_MODE": "Luminosidad",
+  "COLOR_BLEND_MODE": "Color",
+  "NOT_SUPPORTED_BLEND_MODE": "No compatible",
+  "RESTART": "Reiniciar",
+  "SORT_BY": "Ordenar por",
+  "NAME": "Nombre",
+  "COLORS": "Colores",
+  "DEFAULT": "Defecto",
+  "ALPHABETICAL": "Alfabético",
+  "COLOR_COUNT": "Recuento de colores",
+  "ANY": "Cualquier",
+  "MAX": "Max",
+  "MIN": "Min",
+  "EXACT": "Exacto",
+  "ASCENDING": "Ascendente",
+  "DESCENDING": "Descendente",
+  "NAME_IS_TOO_LONG": "El nombre es demasiado largo",
+  "STOP_IT_TEXT1": "Es suficiente. Ordena los nombres de tus archivos.",
+  "STOP_IT_TEXT2": "¿Puedes dejar de copiar estos nombres, por favor?",
+  "REPLACER_TOOLTIP": "Haga clic con el botón derecho en el color de la paleta y elija 'Reemplazar' o suéltelo aquí.",
+  "CLICK_TO_CHOOSE_COLOR": "Haga clic para elegir el color",
+  "REPLACE_COLOR": "Sustituir color",
+  "PALETTE_COLOR_TOOLTIP": "Haga clic para seleccionarlo como color principal. Arrastre y suelte sobre otro color de la paleta para intercambiarlos.",
+  "ADD_FROM_SWATCHES": "Agregar a partir de muestras",
+  "ADD_COLOR_TO_PALETTE": "Agregar color a la paleta",
+  "USE_IN_CURRENT_IMAGE": "Uso en la imagen actual",
+  "ADD_TO_FAVORITES": "Agregar a favoritos",
+  "BROWSE_PALETTES": "Explorar paletas",
+  "LOAD_PALETTE": "Cargar paleta",
+  "SAVE_PALETTE": "Guardar paleta",
+  "FAVORITES": "Favoritos",
+  "ADD_FROM_CURRENT_PALETTE": "Añadir desde la paleta actual",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Abrir el directorio de paletas en el explorador",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Buscar paletas en Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "Importar desde archivo",
+  "TOP_LEFT": "Arriba a la izquierda",
+  "TOP_CENTER": "Centro superior",
+  "TOP_RIGHT": "Arriba a la derecha",
+  "MIDDLE_LEFT": "Centro izquierda",
+  "MIDDLE_CENTER": "Centro",
+  "MIDDLE_RIGHT": "Centro derecha",
+  "BOTTOM_LEFT": "Abajo a la izquierda",
+  "BOTTOM_CENTER": "Abajo al centro",
+  "BOTTOM_RIGHT": "Abajo a la derecha",
+  "CLIP_TO_BELOW": "Recorte a la capa inferior",
+  "MOVE_UPWARDS": "Moverse hacia arriba",
+  "MOVE_DOWNWARDS": "Desplazarse hacia abajo",
+  "MERGE_SELECTED": "Fusión seleccionada",
+  "LOCK_TRANSPARENCY": "Bloquear la transparencia",
+  "COULD_NOT_LOAD_PALETTE": "No se pueden obtener paletas",
+  "NO_PALETTES_FOUND": "No se han encontrado paletas.",
+  "LOSPEC_LINK_TEXT": "He oído que puedes encontrar algunos aquí: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Navegador de paletas",
+  "DELETE_PALETTE_CONFIRMATION": "¿Está seguro de que desea eliminar esta paleta? Esto no se puede deshacer.",
+  "SHORTCUTS_IMPORTED": "Los accesos directos de {0} se han importado correctamente.",
+  "SHORTCUT_PROVIDER_DETECTED": "Hemos detectado que tiene {0} instalado. ¿Desea importar accesos directos desde él?",
+  "IMPORT_FROM_INSTALLATION": "Importar desde la instalación",
+  "IMPORT_INSTALLATION_OPTION1": "Importar desde la instalación",
+  "IMPORT_INSTALLATION_OPTION2": "Utilizar valores por defecto",
+  "IMPORT_FROM_TEMPLATE": "Importar desde plantilla",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Los accesos directos se han importado correctamente.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "¿Estás seguro de que quieres restablecer todos los accesos directos a su valor por defecto?",
+  "SUCCESS": "Éxito",
+  "WARNING": "Aviso",
+  "ERROR_IMPORTING_IMAGE": "Se ha producido un error al importar la imagen.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Archivo de accesos directos dañado",
+  "SHORTCUTS_CORRUPTED": "El archivo de accesos directos estaba dañado, restableciendo el valor por defecto.",
+  "FAILED_DOWNLOAD_PALETTE": "No se ha podido descargar la paleta",
+  "FILE_INCORRECT_FORMAT": "El archivo no tenía el formato correcto",
+  "INVALID_FILE": "Archivo no válido",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "El archivo de accesos directos no tenía el formato correcto",
+  "UNSUPPORTED_FILE_FORMAT": "Este formato de archivo no es compatible",
+  "ALREADY_ASSIGNED": "Ya asignado",
+  "REPLACE": "Sustituir",
+  "SWAP": "Intercambiar",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Este acceso directo ya está asignado a '{0}'.\n¿Quieres reemplazar el acceso directo existente o intercambiar los dos?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Este acceso directo ya está asignado a '{0}'.\n¿Desea sustituir el acceso directo existente?",
+  "UNSAVED_CHANGES": "Cambios no guardados",
+  "DOCUMENT_MODIFIED_SAVE": "El documento ha sido modificado. ¿Desea guardar los cambios?",
+  "SESSION_UNSAVED_DATA": "{0} con datos sin guardar. ¿Está seguro?",
+  "PROJECT_MAINTAINERS": "Mantenedores de proyectos",
+  "OTHER_AWESOME_CONTRIBUTORS": "Y otros increíbles colaboradores",
+  "HELP": "Ayuda",
+  "STOP_IT_TEXT3": "No, en serio, basta.",
+  "STOP_IT_TEXT4": "¿No tienes nada mejor que hacer?",
+  "LINEAR_DODGE_BLEND_MODE": "Esquiva lineal (Añadir)",
+  "PRESS_ANY_KEY": "Pulsar cualquier tecla",
+  "NONE_SHORTCUT": "Ninguno",
+  "REFERENCE": "Referencia",
+  "PUT_REFERENCE_LAYER_ABOVE": "Poner capa de referencia encima",
+  "PUT_REFERENCE_LAYER_BELOW": "Poner capa de referencia debajo",
+  "TOGGLE_VERTICAL_SYMMETRY": "Alternar simetría vertical",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Alternar simetría horizontal",
+  "RESET_VIEWPORT": "Restablecer vista",
+  "VIEWPORT_SETTINGS": "Viewport settings",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Mantenga pulsado el ratón para mover los píxeles de las capas seleccionadas.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Mantenga pulsado el ratón para mover todas las capas.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Renombrar",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Abrir la ventana de depuración de localización",
+  "FORCE_OTHER_FLOW_DIRECTION": "Forzar otra dirección de flujo",
+  "API_KEY": "Clave API",
+  "LOCALIZATION_VIEW_TYPE": "Localización tipo de vista",
+  "LOAD_LANGUAGE_FROM_FILE": "Cargar idioma desde archivo",
+  "LOG_IN": "Iniciar sesion",
+  "SYNC": "Sincronización",
+  "NOT_LOGGED_IN": "No ha iniciado sesión",
+  "POE_EDITOR_ERROR": "POEditor Error: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP Error: {0} {1}",
+  "LOGGED_IN": "Iniciado sesion",
+  "SYNCED_SUCCESSFULLY": "Sincronizado correctamente",
+  "EXCEPTION_ERROR": "Exception: {0}",
+  "DROP_PALETTE": "Suelte la paleta aquí",
+  "SECURITY_ERROR": "Error de seguridad",
+  "SECURITY_ERROR_MSG": "No hay derechos para escribir en la ubicación especificada.",
+  "IO_ERROR": "IO error",
+  "IO_ERROR_MSG": "Error al escribir en disco.",
+  "FAILED_ASSOCIATE_PIXI": "Error al asociar el archivo .pixi con PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Se ha producido un error al guardar la paleta.",
+  "NO_COLORS_TO_SAVE": "No hay colores que guardar.",
+  "ALL_LAYERS": "Todas las capas",
+  "SINGLE_LAYER": "Unica capa",
+  "CHOOSE": "Elija",
+  "REMOVE": "Eliminar",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "El archivo no es un archivo \".aseprite-keys",
+  "FILE_HAS_INVALID_SHORTCUT": "El archivo contiene un acceso directo no válido",
+  "FILE_EXTENSION_NOT_SUPPORTED": "No se admite el tipo de archivo '{0}",
+  "ERROR_READING_FILE": "Error al leer el archivo",
+  "DISCARD_PALETTE": "Descartar paleta",
+  "DISCARD_PALETTE_CONFIRMATION": "¿Está seguro de que desea descartar la paleta actual? Esto no se puede deshacer.",
+  "IMPORT_AS_NEW_LAYER": "Importar como nueva capa",
+  "PASTE_AS_PRIMARY_COLOR": "Pegar como color primario",
+  "IMPORT_AS_NEW_FILE": "Importar como archivo nuevo",
+  "IMPORT_PALETTE_FILE": "Importar archivo de paleta",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Importar colores a la paleta",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Importar color a la paleta",
+  "IMPORT_AS_REFERENCE_LAYER": "Importar como capa de referencia",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Haga clic con el botón derecho del ratón para seleccionar el color y pulse Mayús y haga clic con el botón derecho para copiar el color en el portapapeles",
+  "OPEN_FILE_FROM_CLIPBOARD": "Abrir desde el portapapeles",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Abrir desde el portapapeles",
+  "OPEN_LOCALIZATION_DATA": "¿Quiere abrir el archivo LocalizationData.json? La fecha actualizada se ha puesto en el portapapeles.\nTenga en cuenta que los cambios no se aplicarán hasta que se reinicie el sistema",
+  "DOWNLOADING_LANGUAGE_FAILED": "Error al descargar el idioma.\nEs posible que la clave API se haya utilizado en exceso.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Ruta de datos de localización no encontrada",
+  "APPLY": "Aplicar",
+  "UPDATE_SOURCE": "Actualizar source",
+  "COPY_TO_CLIPBOARD": "Copiar al portapapeles",
+  "LANGUAGE_FILE_NOT_FOUND": "Archivo de idioma no encontrado.\nBuscando {0}",
+  "PROJECT_ROOT_NOT_FOUND": "No se ha encontrado la raíz del proyecto PixiEditor.\nBuscando PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "No se ha encontrado la carpeta de localización.\nBuscando /Data/Localization",
+  "SELECT_A_LANGUAGE": "Seleccione un idioma",
+  "DONE": "Hecho",
+  "SOURCE_UNSET_OR_MISSING": "Fuente ausente/desactivada",
+  "SOURCE_NEWER": "Fuente más reciente",
+  "SOURCE_UP_TO_DATE": "La fuente está actualizada",
+  "SOURCE_OLDER": "Nube más reciente",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

+ 564 - 0
src/PixiEditor/Data/Localization/Languages/hu.json

@@ -0,0 +1,564 @@
+{
+  "RECENT_FILES": "Legutóbbi",
+  "OPEN_FILE": "Megnyitás",
+  "NEW_FILE": "Új",
+  "RECENT_EMPTY_TEXT": "Halló? Van itt valaki?",
+  "LANGUAGE": "Nyelv",
+  "GENERAL": "Általános",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Billentyűparancsok",
+  "MISC": "Egyéb",
+  "SHOW_STARTUP_WINDOW": "Indítási ablak megjelenítése",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Képek előnézetének megjelenítése a feladatlistában",
+  "RECENT_FILE_LENGTH": "Legutóbbi fájlok listájának hossza",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Ezzel beállíthatod, hogy hány dokumentum jelenjen meg a Fájl > Legutóbbi menüpont alatt. Alapértelmezett: 8",
+  "DEFAULT_NEW_SIZE": "Az új fájlok alapértelmezett méretei",
+  "WIDTH": "Szélesség",
+  "HEIGHT": "Magasság",
+  "TOOLS": "Eszközök",
+  "ENABLE_SHARED_TOOLBAR": "Megosztott eszköztár engedélyezése",
+  "AUTOMATIC_UPDATES": "Automatikus frissítések",
+  "CHECK_FOR_UPDATES": "Frissítések keresése indításkor",
+  "UPDATE_STREAM": "Frissítési csatorna",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "A frissítési csatornákat csak a telepített, önálló változatban (letölthető a https://pixieditor.net oldalról) lehet módosítani.\nA Steam és Microsoft Store verziók külön kezelik a frissítéseket.",
+  "DEBUG": "Debugolás",
+  "ENABLE_DEBUG_MODE": "Debug mód bekapcsolása",
+  "OPEN_CRASH_REPORTS_DIR": "Összeomlási jelentések könyvtárának megnyitása",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Engedélyezve",
+  "SHOW_IMAGE_NAME": "Szerkesztett kép nevének megjelenítése",
+  "SHOW_IMAGE_SIZE": "Szerkesztett kép méretének megjelenítése",
+  "SHOW_LAYER_COUNT": "Szerkesztett kép rétegszámának megjelenítése",
+  "FILE": "Fájl",
+  "RECENT": "Legutóbbi",
+  "OPEN": "Megnyitás",
+  "SAVE_PIXI": "Mentés (.pixi)",
+  "SAVE_AS_PIXI": "Mentés másként... (.pixi)",
+  "EXPORT_IMG": "Exportálás (.png, .jpg, stb.)",
+  "EDIT": "Szerkesztés",
+  "EXIT": "Kilépés",
+  "PERCENTAGE": "Átméretezés százalék alapján",
+  "ABSOLUTE": "Abszolút átméretezés",
+  "PRESERVE_ASPECT_RATIO": "Oldalarány megőrzése",
+  "ANCHOR_POINT": "Horgonyzópont",
+  "RESIZE_IMAGE": "Kép átméretezése",
+  "RESIZE": "Átméretezés",
+  "DOCUMENTATION": "Dokumentáció",
+  "WEBSITE": "Weboldal",
+  "OPEN_WEBSITE": "Weboldal megnyitása",
+  "REPOSITORY": "Repository",
+  "OPEN_REPOSITORY": "Repository megnyitása",
+  "LICENSE": "Licensz",
+  "OPEN_LICENSE": "Licensz megnyitása",
+  "THIRD_PARTY_LICENSES": "Harmadik féltől származó licenszek",
+  "OPEN_THIRD_PARTY_LICENSES": "Harmadik féltől származó licenszek megnyitása",
+  "APPLY_TRANSFORM": "Átalakítás alkalmazása",
+  "INCREASE_TOOL_SIZE": "Eszközméret növelése",
+  "DECREASE_TOOL_SIZE": "Eszközméret csökkentése",
+  "TO_INSTALL_UPDATE": "a {0} frissítés telepítéséhez",
+  "DOWNLOADING_UPDATE": "Frissítés letöltése folyamatban...",
+  "UPDATE_READY": "A frissítés telepítésre kész. Szeretnéd most telepíteni?",
+  "NEW_UPDATE": "Új frissítés",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Az adminisztrátori jogosultságok nélkül nem lehet frissíteni. Kérlek, futtassd a PixiEditort rendszergazdaként.",
+  "INSUFFICIENT_PERMISSIONS": "Elégtelen jogosultságok",
+  "UPDATE_CHECK_FAILED": "Frissítés ellenőrzése sikertelen volt",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Nem sikerült ellenőrizni, hogy elérhető-e frissítés.",
+  "VERSION": "{0} verzió",
+  "OPEN_TEMP_DIR": "Temp mappa megnyitása",
+  "OPEN_LOCAL_APPDATA_DIR": "Local AppData mappa megnyitása",
+  "OPEN_ROAMING_APPDATA_DIR": "Roaming AppData mappa megnyitása",
+  "OPEN_INSTALLATION_DIR": "Telepítési mappa megnyitása",
+  "DUMP_ALL_COMMANDS": "Összes parancs dumpolása",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Összes parancs dumpolása (textfájlba)",
+  "CRASH": "Összeomlás",
+  "CRASH_APP": "Az alkalmazás összeomlasztása",
+  "DELETE_USR_PREFS": "Felhasználói beállítások törlése (Roaming AppData-ban)",
+  "DELETE_SHORTCUT_FILE": "Parancsikon fájl törlése (Roaming AppData-ban)",
+  "DELETE_EDITOR_DATA": "Editor adatok törlése (Local AppData-ban)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Billentyűkiosztás sablon generálása",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Billentyűkiosztás JSON sablon generálása",
+  "VALIDATE_SHORTCUT_MAP": "Parancsikontérkép ellenőrzése",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Ellenőrzi a parancsikontérképet",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Üres billentyűk: {0}\nIsmeretlen parancsok: {1}",
+  "RESULT": "Eredmény",
+  "CLEAR_RECENT_DOCUMENTS": "Legutóbbi dokumentumok törlése",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Törli a legutóbbi dokumentumokat",
+  "OPEN_CMD_DEBUG_WINDOW": "Debug ablak megnyitása",
+  "PATH_DOES_NOT_EXIST": "{0} nem létezik",
+  "LOCATION_DOES_NOT_EXIST": "A hely nem létezik.",
+  "FILE_NOT_FOUND": "Fájl nem található.",
+  "ARE_YOU_SURE": "Biztos vagy ebben?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Biztos, hogy törölni szeretnéd a(z) {0} fájlt?\nEz az adat véglegesen elveszik az összes telepítésről.\n(Teljes path: {1})",
+  "FAILED_TO_OPEN_FILE": "A fájl megnyitása sikertelen volt.",
+  "OLD_FILE_FORMAT": "Elavult fájlformátum",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Ez a .pixi fájl a régi, már elavult fájlformátumot használja, \nami már nem támogatott és nem megnyitható.",
+  "NOTHING_FOUND": "Nem találtunk semmit",
+  "EXPORT": "Exportálás",
+  "EXPORT_IMAGE": "Kép exportálása",
+  "IMPORT": "Importálás",
+  "SHORTCUT_TEMPLATES": "Shortcut sablonok",
+  "RESET_ALL": "Minden visszaállítása",
+  "LAYER": "Réteg",
+  "LAYER_DELETE_SELECTED": "Aktív réteg/mappa törlése",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Aktív réteg vagy mappa törlése",
+  "LAYER_DELETE_ALL_SELECTED": "Az összes kijelölt réteg/mappa törlése",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Az összes kijelölt réteg és/vagy mappa törlése",
+  "DELETE_SELECTED_PIXELS": "Kijelölt pixelek törlése",
+  "NEW_FOLDER": "Új mappa",
+  "CREATE_NEW_FOLDER": "Új mappa létrehozása",
+  "NEW_LAYER": "Új réteg",
+  "CREATE_NEW_LAYER": "Új réteg létrehozása",
+  "NEW_IMAGE": "Új kép",
+  "CREATE_NEW_IMAGE": "Új kép létrehozása",
+  "SAVE": "Mentés",
+  "SAVE_AS": "Mentés másként...",
+  "IMAGE": "Kép",
+  "SAVE_IMAGE": "Kép mentése",
+  "SAVE_IMAGE_AS": "Kép mentése másként",
+  "DUPLICATE": "Duplikálás",
+  "DUPLICATE_SELECTED_LAYER": "Kijelölt réteg duplikálása",
+  "CREATE_MASK": "Maszk létrehozása",
+  "DELETE_MASK": "Maszk törlése",
+  "TOGGLE_MASK": "Maszk váltása",
+  "APPLY_MASK": "Maszk alkalmazása",
+  "TOGGLE_VISIBILITY": "Láthatóság átkapcsolása",
+  "MOVE_MEMBER_UP": "Réteg felfelé mozgatása",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "A kijelölt réteg vagy mappa felfelé mozgatása",
+  "MOVE_MEMBER_DOWN": "Réteg lefelé mozgatása",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "A kijelölt réteg vagy mappa lefelé mozgatása",
+  "MERGE_ALL_SELECTED_LAYERS": "Az összes kijelölt réteg egyesítése",
+  "MERGE_WITH_ABOVE": "A kiválasztott réteg egyesítése a feljebbi réteggel",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "A kiválasztott réteg egyesítése a felette lévővel",
+  "MERGE_WITH_BELOW": "A kiválasztott réteg egyesítése az alábbi réteggel",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "A kijelölt réteg egyesítése az alatta lévővel",
+  "ADD_REFERENCE_LAYER": "Referenciaréteg hozzáadása",
+  "DELETE_REFERENCE_LAYER": "Referenciaréteg törlése",
+  "TRANSFORM_REFERENCE_LAYER": "Referenciaréteg átalakítása",
+  "TOGGLE_REFERENCE_LAYER_POS": "Referenciaréteg pozíciójának váltása",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Referenciaréteg váltása a legfelső vagy a legalsó pozíció között",
+  "RESET_REFERENCE_LAYER_POS": "Referenciaréteg pozíciójának visszaállítása",
+  "CLIP_CANVAS": "Clip vászon",
+  "FLIP_IMG_VERTICALLY": "Kép függőlegesen történő átfordítása",
+  "FLIP_IMG_HORIZONTALLY": "Kép vízszintes átfordítása",
+  "FLIP_LAYERS_VERTICALLY": "Kijelölt rétegek függőlegesen történő átfordítása",
+  "FLIP_LAYERS_HORIZONTALLY": "Kijelölt rétegek vízszintes átfordítása",
+  "ROT_IMG_90": "Kép elforgatása 90 fokkal",
+  "ROT_IMG_180": "Kép elforgatása 180 fokban",
+  "ROT_IMG_-90": "Kép elforgatása -90 fokban",
+  "ROT_LAYERS_90": "Kijelölt rétegek elforgatása 90 fokkal",
+  "ROT_LAYERS_180": "Kijelölt rétegek elforgatása 180 fokban",
+  "ROT_LAYERS_-90": "Kijelölt rétegek elforgatása -90 fokban",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Függőleges szimmetriatengely átkapcsolása",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Vízszintes szimmetriatengely átkapcsolása",
+  "DELETE_PIXELS": "Pixelek törlése",
+  "DELETE_PIXELS_DESCRIPTIVE": "Kijelölt pixelek törlése",
+  "RESIZE_DOCUMENT": "A dokumentum átméretezése",
+  "RESIZE_CANVAS": "Vászon átméretezése",
+  "CENTER_CONTENT": "Tartalom középre állítása",
+  "CUT": "Kivágás",
+  "CUT_DESCRIPTIVE": "Kiválasztott terület/rétegek kivágása",
+  "PASTE": "Beillesztés",
+  "PASTE_DESCRIPTIVE": "A vágólap tartalmának beillesztése",
+  "PASTE_AS_NEW_LAYER": "Beillesztés új rétegként",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Beillesztés a vágólapról új rétegként",
+  "PASTE_REFERENCE_LAYER": "Referenciaréteg beillesztése",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "A vágólap tartalmának beillesztése referenciarétegként",
+  "PASTE_COLOR": "Szín beillesztése",
+  "PASTE_COLOR_DESCRIPTIVE": "Szín beillesztése a vágólapról",
+  "PASTE_COLOR_SECONDARY": "Szín beillesztése másodlagosként",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Szín beillesztése a vágólapról másodlagos színként",
+  "CLIPBOARD": "Vágólap",
+  "COPY": "Másolás",
+  "COPY_DESCRIPTIVE": "Másolás a vágólapra",
+  "COPY_COLOR_HEX": "Elsődleges szín másolása (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Elsődleges szín másolása HEX-kódként",
+  "COPY_COLOR_RGB": "Elsődleges szín másolása (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Elsődleges szín másolása RGB kódként",
+  "COPY_COLOR_SECONDARY_HEX": "Másodlagos szín másolása (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Másodlagos szín másolása HEX kódként",
+  "COPY_COLOR_SECONDARY_RGB": "Másodlagos szín másolása (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Másodlagos szín másolása RGB kódként",
+  "PALETTE_COLORS": "Paletta színei",
+  "REPLACE_SECONDARY_BY_PRIMARY": "A másodlagos szín elsődleges színnel cserélése",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "A másodlagos színt az elsődleges színre cseréli",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Az elsődleges szín másodlagos színnel cserélése",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Az elsődleges színt a másodlagos színre cseréli",
+  "OPEN_PALETTE_BROWSER": "Paletta böngésző megnyitása",
+  "OVERWRITE_PALETTE_CONSENT": "A '{0}' paletta már létezik, felül akarja írni?",
+  "PALETTE_EXISTS": "Paletta már létezik",
+  "REPLACE_PALETTE_CONSENT": "Szeretnéd az aktuális palettát kicserélni a kiválasztott palettára?",
+  "REPLACE_PALETTE": "Jelenlegi paletta cseréje",
+  "SELECT_COLOR_1": "Szín 1 kiválasztása",
+  "SELECT_COLOR_2": "Szín 2 kiválasztása",
+  "SELECT_COLOR_3": "Szín 3 kiválasztása",
+  "SELECT_COLOR_4": "Szín 4 kiválasztása",
+  "SELECT_COLOR_5": "Szín 5 kiválasztása",
+  "SELECT_COLOR_6": "Szín 6 kiválasztása",
+  "SELECT_COLOR_7": "Szín 7 kiválasztása",
+  "SELECT_COLOR_8": "Szín 8 kiválasztása",
+  "SELECT_COLOR_9": "Szín 9 kiválasztása",
+  "SELECT_COLOR_10": "Szín 10 kiválasztása",
+  "SELECT_TOOL": "A {0} eszköz kiválasztása",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Kiválasztja az első színt a palettán",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Kiválasztja a második színt a palettán",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Kiválasztja a harmadik színt a palettán",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Kiválasztja a negyedik színt a palettán",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Kiválasztja az ötödik színt a palettán",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Kiválasztja a hatodik színt a palettán",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Kiválasztja a hetedik színt a palettán",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Kiválasztja a nyolcadik színt a palettán",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Kiválasztja a kilencedik színt a palettán",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Kiválasztja a tizedik színt a palettán",
+  "SWAP_COLORS": "Színek cseréje",
+  "SWAP_COLORS_DESCRIPTIVE": "Elsődleges és másodlagos színek cseréje",
+  "SEARCH": "Keresés",
+  "COMMAND_SEARCH": "Parancskeresés",
+  "OPEN_COMMAND_SEARCH": "Parancskereső ablak megnyitása",
+  "SELECT": "Kijelöl",
+  "DESELECT": "Kijelölés megszüntetése",
+  "INVERT": "Invertálás",
+  "SELECTION": "Kijelölés",
+  "SELECT_ALL": "Összes kijelölése",
+  "SELECT_ALL_DESCRIPTIVE": "Mindent kijelöl",
+  "CLEAR_SELECTION": "Kijelölés törlése",
+  "INVERT_SELECTION": "Kijelölés inverzálása",
+  "INVERT_SELECTION_DESCRIPTIVE": "Kijelölés inverzének készítése",
+  "TRANSFORM_SELECTED_AREA": "Kijelölt terület átalakítása",
+  "NUDGE_SELECTED_LEFT": "Kijelölt objektum elmozdítása balra",
+  "NUDGE_SELECTED_RIGHT": "Kijelölt objektum elmozdítása jobbra",
+  "NUDGE_SELECTED_UP": "Kijelölt objektum elmozdítása felfelé",
+  "NUDGE_SELECTED_DOWN": "Kijelölt objektum elmozdítása lefelé",
+  "MASK_FROM_SELECTION": "Új maszk a kijelölésből",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Kijelölés új maszkká konvertálása",
+  "ADD_SELECTION_TO_MASK": "Kijelölés hozzáadása a maszkhoz",
+  "SUBTRACT_SELECTION_FROM_MASK": "Kijelölés kivonása a maszkból",
+  "INTERSECT_SELECTION_MASK": "Kijelölés metszése a maszkkal",
+  "SELECTION_TO_MASK": "Kijelölés maszkká konvertálása",
+  "TO_NEW_MASK": "új maszkba",
+  "ADD_TO_MASK": "hozzáadás a maszkhoz",
+  "SUBTRACT_FROM_MASK": "kivonás a maszkból",
+  "INTERSECT_WITH_MASK": "metszet a maszkkal",
+  "STYLUS": "Stylus",
+  "TOGGLE_PEN_MODE": "Toll üzemmód váltása",
+  "UNDO": "Visszavonás",
+  "UNDO_DESCRIPTIVE": "Utolsó művelet visszavonása",
+  "REDO": "Újra",
+  "REDO_DESCRIPTIVE": "Utolsó művelet megismétlése",
+  "WINDOWS": "Ablakok",
+  "TOGGLE_GRIDLINES": "Rácsvonalak kapcsolása",
+  "ZOOM_IN": "Nagyítás",
+  "ZOOM_OUT": "Kicsinyítés",
+  "NEW_WINDOW_FOR_IMG": "Új ablak az aktuális képhez",
+  "CENTER_ACTIVE_VIEWPORT": "Aktív nézetablak központosítása",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Nézetablak vízszintesen átfordítása",
+  "FLIP_VIEWPORT_VERTICALLY": "Nézetablak függőlegesen történő átfordítása",
+  "SETTINGS": "Beállítások",
+  "OPEN_SETTINGS": "Beállítások megnyitása",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Beállítások ablak megnyitása",
+  "OPEN_STARTUP_WINDOW": "Indítási ablak megnyitása",
+  "OPEN_SHORTCUT_WINDOW": "Shortcuts ablak megnyitása",
+  "OPEN_ABOUT_WINDOW": "Névjegy ablak megnyitása",
+  "OPEN_NAVIGATION_WINDOW": "Navigációs ablak megnyitása",
+  "ERROR": "Hiba",
+  "INTERNAL_ERROR": "Belső hiba",
+  "ERROR_SAVE_LOCATION": "Nem sikerült a fájlt a megadott helyre menteni",
+  "ERROR_WHILE_SAVING": "Belső hiba történt a mentés közben. Kérlek próbáld meg újra.",
+  "UNKNOWN_ERROR_SAVING": "Hiba történt mentés közben.",
+  "FAILED_ASSOCIATE_LOSPEC": "Nem sikerült társítani a Lospec Palette protokollt.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Adományozás",
+  "YES": "Igen",
+  "NO": "Nem",
+  "CANCEL": "Mégse",
+  "UNNAMED": "Névtelen",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Debug parancsablak megnyitása",
+  "DELETE": "Törlés",
+  "USER_PREFS": "Felhasználói beállítások (Roaming)",
+  "SHORTCUT_FILE": "Shortcut fájl (Roaming)",
+  "EDITOR_DATA": "Szerkesztői adatok (Helyi)",
+  "MOVE_VIEWPORT_TOOLTIP": "Nézetpont mozgatása. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Kattints és húzz a nézetablak pásztázásához",
+  "MOVE_TOOL_TOOLTIP": "Kiválasztott pixelek mozgatása ({0}). Tartsd lenyomva a Ctrl-t az összes réteg mozgatásához.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Tartsd lenyomva az egeret a kijelölt pixelek mozgatásához. Tartsd lenyomva a Ctrl billentyűt az összes réteg mozgatásához.",
+  "PEN_TOOL_TOOLTIP": "Toll. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Kattints és húzd a rajzoláshoz.",
+  "PIXEL_PERFECT_SETTING": "Pixel pontos",
+  "RECTANGLE_TOOL_TOOLTIP": "Téglalap rajzolása a vásznon ({0}). Tartsd lenyomva a Shift-et egy négyzet rajzolásához.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Kattints és húzd a téglalap rajzolásához. Tartsd lenyomva a Shift-et egy négyzet rajzolásához.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Kattints és húzd az egyenlő oldalú négyzet rajzolásához.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Eredeti kép megtartása",
+  "ROTATE_VIEWPORT_TOOLTIP": "Nézetpont forgatása. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Kattints és húzd a nézetpont forgatásához.",
+  "SELECT_TOOL_TOOLTIP": "Terület kijelölése. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Kattints és húzd az egy terület kijelöléséhez. Tartsd lenyomva a Shift-et a meglévő kijelöléshez adáshoz. Tartsd lenyomva a Ctrl-t az eltávolításhoz.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Kattints és húzd a jelenlegi kijelölés kiegészítéséhez.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Kattints és húzd a jelenlegi kijelölés eltávolításához.",
+  "ZOOM_TOOL_TOOLTIP": "Nagyítás ({0}). Kattints a nagyításhoz, tartsd lenyomva az Alt-ot és kattints a kicsinyítéshez.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Kattints és húzd a nagyításhoz. Kattints a nagyításhoz, tartsd lenyomva a Ctrl-t és kattints a kicsinyítéshez.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Kattints és húzd a nagyításhoz. Kattints a kicsinyítéshez, engedd fel a Ctrl-t, majd kattints a nagyításhoz.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Pixel világosítása/sötétítése ({0}). Tartsd lenyomva a Ctrl-t a sötétítéshez.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Rajzolj a pixelekre, hogy világosabbá tedd őket. Sötétítéshez tartsd lenyomva a Ctrl billentyűt.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Rajzolj a pixelekre, hogy sötétebbé tegye őket. A Ctrl felengedésével világosabbá teheted őket.",
+  "COLOR_PICKER_TOOLTIP": "Kiválasztja az elsődleges színt a vászonról. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Kattintson a színek kiválasztásához. Tartsa lenyomva a Ctrl billentyűt a vászon elrejtéséhez. Tartsa lenyomva a Shift billentyűt a referenciaréteg elrejtéséhez",
+  "ELLIPSE_TOOL_TOOLTIP": "Ellipszis rajzolása ({0}). Tartsa lenyomva a Shift billentyűt kör rajzolásához.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Kattintson és húzza az egeret az ellipszis rajzolásához. Tartsa lenyomva a Shift billentyűt a kör rajzolásához.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Kattintson és húzza az egeret egy kör rajzolásához.",
+  "ERASER_TOOL_TOOLTIP": "Törli a színt a pixelből. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Kattintson és húzza az egérrel a törléshez.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Színnel tölti ki a területet. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Kattintson a terület kiszínezéséhez. Tartsa lenyomva a Ctrl billentyűt az összes réteg figyelembevételéhez. Engedje fel a Ctrl billentyűt csak az aktuális rétegek figyelembevételéhez.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Kattintson a terület kiszínezéséhez. Engedje fel a Ctrl billentyűt csak az aktuális rétegek figyelembevételéhez.",
+  "LASSO_TOOL_TOOLTIP": "Lasszó. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Kattintson és húzza az egérrel a kívánt pixelek kijelöléséhez. Tartsa lenyomva a Shift billentyűt a meglévő kijelöléshez adáshoz. Tartsa lenyomva a Ctrl billentyűt a kijelölésből való kivonáshoz.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Kattintson és húzza az egéret, hogy a lasszón belüli pixeleket hozzáadja a kijelöléshez.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Kattintson és húzza az egéret, hogy kivonja a kijelölésből a lasszón belüli pixeleket.",
+  "LINE_TOOL_TOOLTIP": "Vonalat rajzol a vászonra ({0}). Tartsa lenyomva a Shift billentyűt a vonal igazításhoz.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Kattintson és húzza az egeret a vonal rajzolásához. Tartsa lenyomva a Shift billentyűt a vonal igazításhoz.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Kattintson és húzza az egeret egy igazított vonal rajzolásához.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Varázspálca ({0}). Kiönti a kijelölést",
+  "MAGIC_WAND_ACTION_DISPLAY": "Kattintson a kijelölés kiöntéséhez.",
+  "PEN_TOOL": "Toll",
+  "BRIGHTNESS_TOOL": "Fényerő",
+  "COLOR_PICKER_TOOL": "Színválasztó",
+  "ELLIPSE_TOOL": "Ellipszis",
+  "ERASER_TOOL": "Radír",
+  "FLOOD_FILL_TOOL": "Kitöltés",
+  "LASSO_TOOL": "Lasszó",
+  "LINE_TOOL": "Vonal",
+  "MAGIC_WAND_TOOL": "Varázspálca",
+  "MOVE_TOOL": "Mozgatás",
+  "MOVE_VIEWPORT_TOOL": "Nézetablak mozgatása",
+  "RECTANGLE_TOOL": "Téglalap",
+  "ROTATE_VIEWPORT_TOOL": "Nézetablak elforgatása",
+  "SELECT_TOOL_NAME": "Kijelölés",
+  "ZOOM_TOOL": "Nagyítás",
+  "SHAPE_LABEL": "Alakzat",
+  "MODE_LABEL": "Mód",
+  "SCOPE_LABEL": "Hatósugár",
+  "FILL_SHAPE_LABEL": "Alakzat kitöltése",
+  "FILL_COLOR_LABEL": "Szín kitöltése",
+  "TOOL_SIZE_LABEL": "Eszközméret",
+  "STRENGTH_LABEL": "Erősség",
+  "NEW": "Új",
+  "ADD": "Hozzáadás",
+  "SUBTRACT": "Kivonás",
+  "INTERSECT": "Metszet",
+  "RECTANGLE": "Téglalap",
+  "CIRCLE": "Kör",
+  "ABOUT": "Névjegy",
+  "MINIMIZE": "Kis méret",
+  "RESTORE": "Visszaállítás",
+  "MAXIMIZE": "Teljes képernyő",
+  "CLOSE": "Bezárás",
+  "EXPORT_SIZE_HINT": "Ha meg szeretné osztani a képet, próbálja ki a {0}%-ot a legjobb tisztaság érdekében",
+  "CREATE": "Létrehozás",
+  "BASE_LAYER_NAME": "Alapréteg",
+  "ENABLE_MASK": "Maszk engedélyezése",
+  "SELECTED_AREA_EMPTY": "A kiválasztott terület üres",
+  "NOTHING_TO_COPY": "Semmi másolnivaló",
+  "REFERENCE_LAYER_PATH": "Referenciaréteg útvonala",
+  "FLIP": "Tükrözés",
+  "ROTATION": "Forgatás",
+  "ROT_IMG_90_D": "Kép elforgatása 90°-kal",
+  "ROT_IMG_180_D": "Kép elforgatása 180°-kal",
+  "ROT_IMG_-90_D": "Kép elforgatása -90°-kal",
+  "ROT_LAYERS_90_D": "Kijelölt rétegek elforgatása 90°-kal",
+  "ROT_LAYERS_180_D": "Kijelölt rétegek elforgatása 180°-kal",
+  "ROT_LAYERS_-90_D": "Kijelölt rétegek elforgatása -90°-kal",
+  "UNNAMED_PALETTE": "Névtelen paletta",
+  "CLICK_SELECT_PRIMARY": "Kattintson a főszín kiválasztásához.",
+  "PEN_MODE": "Toll mód",
+  "VIEW": "Nézet",
+  "HORIZONTAL_LINE_SYMMETRY": "Vízszintes vonalszimmetria",
+  "VERTICAL_LINE_SYMMETRY": "Függőleges vonalszimmetria",
+  "COLOR_PICKER_TITLE": "Színválasztó",
+  "COLOR_SLIDERS_TITLE": "Szín csúszkák",
+  "PALETTE_TITLE": "Paletta",
+  "SWATCHES_TITLE": "Minták",
+  "LAYERS_TITLE": "Rétegek",
+  "NAVIGATION_TITLE": "Navigáció",
+  "NORMAL_BLEND_MODE": "Normál",
+  "DARKEN_BLEND_MODE": "Sötétítés",
+  "MULTIPLY_BLEND_MODE": "Szorzás",
+  "COLOR_BURN_BLEND_MODE": "Színtüzelés",
+  "LIGHTEN_BLEND_MODE": "Világosítás",
+  "SCREEN_BLEND_MODE": "Képernyő",
+  "COLOR_DODGE_BLEND_MODE": "Szín kioltás",
+  "OVERLAY_BLEND_MODE": "Átfedés",
+  "SOFT_LIGHT_BLEND_MODE": "Lágy fény",
+  "HARD_LIGHT_BLEND_MODE": "Kemény fény",
+  "DIFFERENCE_BLEND_MODE": "Különbség",
+  "EXCLUSION_BLEND_MODE": "Kizárás",
+  "HUE_BLEND_MODE": "Színárnyalat",
+  "SATURATION_BLEND_MODE": "Telítettség",
+  "LUMINOSITY_BLEND_MODE": "Fényesség",
+  "COLOR_BLEND_MODE": "Szín",
+  "NOT_SUPPORTED_BLEND_MODE": "Nem támogatott",
+  "RESTART": "Újraindítás",
+  "SORT_BY": "Rendezés",
+  "NAME": "Név",
+  "COLORS": "Színek",
+  "DEFAULT": "Alapértelmezett",
+  "ALPHABETICAL": "Betűrendes",
+  "COLOR_COUNT": "Színszám",
+  "ANY": "Bármelyik",
+  "MAX": "Max",
+  "MIN": "Min",
+  "EXACT": "Exact",
+  "ASCENDING": "Növekvő",
+  "DESCENDING": "Csökkenő",
+  "NAME_IS_TOO_LONG": "A név túl hosszú",
+  "STOP_IT_TEXT1": "Ennyi elég. Tedd már rendbe a fájlneveidet!",
+  "STOP_IT_TEXT2": "Abbahagynád a nevek másolását, kérlek?",
+  "REPLACER_TOOLTIP": "Kattintson a jobb gombbal a paletta színére, és válassza a 'Csere' lehetőséget, vagy húzza ide.",
+  "CLICK_TO_CHOOSE_COLOR": "Kattintson a szín kiválasztásához",
+  "REPLACE_COLOR": "Szín cseréje",
+  "PALETTE_COLOR_TOOLTIP": "Kattintson a főszín kiválasztásához. Húzza és ejtse egy másik paletta színre a cseréhez.",
+  "ADD_FROM_SWATCHES": "Hozzáadás a mintákból",
+  "ADD_COLOR_TO_PALETTE": "Szín hozzáadása a palettához",
+  "USE_IN_CURRENT_IMAGE": "Használja az aktuális képen",
+  "ADD_TO_FAVORITES": "Hozzáadás a kedvencekhez",
+  "BROWSE_PALETTES": "Paletták böngészése",
+  "LOAD_PALETTE": "Paletta betöltése",
+  "SAVE_PALETTE": "Paletta mentése",
+  "FAVORITES": "Kedvencek",
+  "ADD_FROM_CURRENT_PALETTE": "Hozzáadás az aktuális palettáról",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Paletták mappa megnyitása a fájlkezelőben",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Paletták böngészése a Lospec oldalon",
+  "IMPORT_FROM_FILE_TOOLTIP": "Importálás fájlból",
+  "TOP_LEFT": "Bal felső",
+  "TOP_CENTER": "Felső közép",
+  "TOP_RIGHT": "Jobb felső",
+  "MIDDLE_LEFT": "Bal közép",
+  "MIDDLE_CENTER": "Közép",
+  "MIDDLE_RIGHT": "Jobb közép",
+  "BOTTOM_LEFT": "Balra lent",
+  "BOTTOM_CENTER": "Alsó közép",
+  "BOTTOM_RIGHT": "Jobbra lent",
+  "CLIP_TO_BELOW": "Illesztés az alábbi rétegre",
+  "MOVE_UPWARDS": "Mozgatás felfelé",
+  "MOVE_DOWNWARDS": "Mozgatás lefelé",
+  "MERGE_SELECTED": "Kijelölt rétegek egyesítése",
+  "LOCK_TRANSPARENCY": "Átlátszóság zárolása",
+  "COULD_NOT_LOAD_PALETTE": "Nem sikerült lekérni a palettákat",
+  "NO_PALETTES_FOUND": "Nem találtunk palettákat.",
+  "LOSPEC_LINK_TEXT": "Úgy hallottam, hogy itt találsz néhányat: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Paletta böngésző",
+  "DELETE_PALETTE_CONFIRMATION": "Biztosan törölni szeretné ezt a palettát? Ez nem visszavonható.",
+  "SHORTCUTS_IMPORTED": "A(z) {0} gyorsbillentyűi sikeresen importálva lettek.",
+  "SHORTCUT_PROVIDER_DETECTED": "Az észleltük, hogy van telepítve a(z) {0}. Szeretné importálni az abból származó gyorsbillentyűket?",
+  "IMPORT_FROM_INSTALLATION": "Importálás telepítésből",
+  "IMPORT_INSTALLATION_OPTION1": "Importálás telepítésből",
+  "IMPORT_INSTALLATION_OPTION2": "Alapértelmezett értékek használata",
+  "IMPORT_FROM_TEMPLATE": "Importálás sablonból",
+  "SHORTCUTS_IMPORTED_SUCCESS": "A gyorsbillentyűk sikeresen importálva lettek.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Biztos, hogy vissza akarja állítani az összes gyorsbillenytű alapértelmezett értékét?",
+  "SUCCESS": "Siker",
+  "WARNING": "Figyelmeztetés",
+  "ERROR_IMPORTING_IMAGE": "Hiba történt a kép importálása során.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Sérült gyorsbillentyű fájl",
+  "SHORTCUTS_CORRUPTED": "A gyorsbillentyű fájl megsérült, visszaállítás az alapértelmezett értékre.",
+  "FAILED_DOWNLOAD_PALETTE": "Nem sikerült letölteni a palettát",
+  "FILE_INCORRECT_FORMAT": "A fájl nem megfelelő formátumú volt",
+  "INVALID_FILE": "Érvénytelen fájl",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "A gyorsbillentyű fájl helytelen formátumban van.",
+  "UNSUPPORTED_FILE_FORMAT": "Ez a fájlformátum nem támogatott",
+  "ALREADY_ASSIGNED": "Már hozzárendelve",
+  "REPLACE": "Felülírás",
+  "SWAP": "Felcserélés",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Ez a parancsikon már a '{0}'-hoz van rendelve.\nA meglévő parancsikont szeretné felülírni, vagy felcserélni a kettőt?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Ez a gyorsbillentyű már hozzá van rendelve '{0}'-hoz. \nSzeretné lecserélni a meglévő gyorsbillentyűt?",
+  "UNSAVED_CHANGES": "Nem mentett módosítások",
+  "DOCUMENT_MODIFIED_SAVE": "A dokumentum módosítva lett. Szeretné menteni a változtatásokat?",
+  "SESSION_UNSAVED_DATA": "{0} nem mentett adatokkal rendelkezik. Biztos benne, hogy folytatni szeretné?",
+  "PROJECT_MAINTAINERS": "Projektkarbantartók",
+  "OTHER_AWESOME_CONTRIBUTORS": "És más fantasztikus közreműködők",
+  "HELP": "Súgó",
+  "STOP_IT_TEXT3": "Nem, tényleg, hagyd abba.",
+  "STOP_IT_TEXT4": "Nincs jobb dolgod?",
+  "LINEAR_DODGE_BLEND_MODE": "Lineáris világosítás (Hozzáadás)",
+  "PRESS_ANY_KEY": "Nyomjon meg bármilyen billentyűt",
+  "NONE_SHORTCUT": "Nincs hozzárendelve",
+  "REFERENCE": "Referencia",
+  "PUT_REFERENCE_LAYER_ABOVE": "Helyezze a referencia réteget az előtte lévő réteg fölé",
+  "PUT_REFERENCE_LAYER_BELOW": "Helyezze a referencia réteget az alatta lévő réteg alá",
+  "TOGGLE_VERTICAL_SYMMETRY": "Függőleges szimmetria kapcsolása",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Vízszintes szimmetria kapcsolása",
+  "RESET_VIEWPORT": "Nézetablak visszaállítása",
+  "VIEWPORT_SETTINGS": "Nézetablak beállítások",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Kattintson és tartsa lenyomva az egeret a pixelek mozgatásához a kijelölt rétegekben.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Tartsa lenyomva az egeret az összes réteg mozgatásához.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Átnevezés",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Lokalizációs hibakeresési ablak megnyitása",
+  "FORCE_OTHER_FLOW_DIRECTION": "Kényszerített másik irányú folyás",
+  "API_KEY": "API kulcs",
+  "LOCALIZATION_VIEW_TYPE": "Nyelvi nézet típusa",
+  "LOAD_LANGUAGE_FROM_FILE": "Nyelvi beállítások betöltése fájlból",
+  "LOG_IN": "Bejelentkezés",
+  "SYNC": "Szinkronizálás",
+  "NOT_LOGGED_IN": "Nincs bejelentkezve",
+  "POE_EDITOR_ERROR": "POEditor hiba: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP-hiba: {0} {1}",
+  "LOGGED_IN": "Bejelentkezett",
+  "SYNCED_SUCCESSFULLY": "Sikeresen szinkronizálva",
+  "EXCEPTION_ERROR": "HIba: {0}",
+  "DROP_PALETTE": "Húzza ide a palettát",
+  "SECURITY_ERROR": "Biztonsági hiba",
+  "SECURITY_ERROR_MSG": "Nincs jogosultsága a megadott helyre írni.",
+  "IO_ERROR": "IO hiba",
+  "IO_ERROR_MSG": "Hiba a lemezre írás közben.",
+  "FAILED_ASSOCIATE_PIXI": "Nem sikerült társítani a .pixi fájlt a PixiEditorral.",
+  "COULD_NOT_SAVE_PALETTE": "Hiba történt a paletta mentése közben.",
+  "NO_COLORS_TO_SAVE": "Nincsenek menthető színek.",
+  "ALL_LAYERS": "Minden réteg",
+  "SINGLE_LAYER": "Egyetlen réteg",
+  "CHOOSE": "Választás",
+  "REMOVE": "Eltávolítás",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "A fájl nem \".aseprite-keys\" fájl",
+  "FILE_HAS_INVALID_SHORTCUT": "A fájl érvénytelen gyorsbillentyűt tartalmaz",
+  "FILE_EXTENSION_NOT_SUPPORTED": "A '{0}' fájltípus nem támogatott",
+  "ERROR_READING_FILE": "Hiba a fájl olvasása közben",
+  "DISCARD_PALETTE": "Paletta elvetése",
+  "DISCARD_PALETTE_CONFIRMATION": "Biztos benne, hogy el akarja vetni az aktuális palettát? Ezt nem lehet visszavonni.",
+  "IMPORT_AS_NEW_LAYER": "Importálás új rétegként",
+  "PASTE_AS_PRIMARY_COLOR": "Beillesztés elsődleges színként",
+  "IMPORT_AS_NEW_FILE": "Importálás új fájlként",
+  "IMPORT_PALETTE_FILE": "Palettafájl importálása",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Színek importálása a palettába",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Szín importálása a palettába",
+  "IMPORT_AS_REFERENCE_LAYER": "Importálás referenciarétegként",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "A szín kiválasztásához kattintson jobb egérgombbal, a szín vágólapra másolásához Shift + jobb egérgombbal kattintson.",
+  "OPEN_FILE_FROM_CLIPBOARD": "Megnyitás a vágólapról",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Megnyitás a vágólapról",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Downloading language failed.\nAPI Key might have been overused.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Localization data path not found",
+  "APPLY": "Apply",
+  "UPDATE_SOURCE": "Update source",
+  "COPY_TO_CLIPBOARD": "Copy to clipboard",
+  "LANGUAGE_FILE_NOT_FOUND": "Language file not found.\nLooking for {0}",
+  "PROJECT_ROOT_NOT_FOUND": "PixiEditor Project root not found.\nLooking for PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Localization folder not found.\nLooking for /Data/Localization",
+  "SELECT_A_LANGUAGE": "Select a language",
+  "DONE": "Done",
+  "SOURCE_UNSET_OR_MISSING": "Source missing/unset",
+  "SOURCE_NEWER": "Source newer",
+  "SOURCE_UP_TO_DATE": "Source is up to date",
+  "SOURCE_OLDER": "Cloud newer",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
+}

+ 71 - 11
src/PixiEditor/Data/Localization/Languages/pl.json

@@ -43,10 +43,6 @@
   "ANCHOR_POINT": "Punkt zaczepienia",
   "RESIZE_IMAGE": "Zmień rozmiar obrazu",
   "RESIZE": "Zmień rozmiar",
-  "EDITING_IMG": "Edytuje obraz",
-  "EDITING_IMG_DETAIL": "Edytuje {0}",
-  "ONE_LAYER": "1 warstwa",
-  "LAYERS": "{0} warstw",
   "DOCUMENTATION": "Dokumentacja",
   "WEBSITE": "Strona internetowa",
   "OPEN_WEBSITE": "Otwórz stronę internetową",
@@ -91,7 +87,6 @@
   "PATH_DOES_NOT_EXIST": "{0} nie istnieje.",
   "LOCATION_DOES_NOT_EXIST": "Lokalizacja nie istnieje.",
   "FILE_NOT_FOUND": "Plik nie znaleziony.",
-  "FILE_NOT_FOUND_PATH_FULL_PATH": "Plik {0} nie istnieje\n(Pełna ścieżka: {1})",
   "ARE_YOU_SURE": "Jesteś pewien?",
   "ARE_YOU_SURE_PATH_FULL_PATH": "Czy na pewno chcesz usunąć {0}?\nDane zostaną utracone dla wszystkich instalacji.\n(Pełna ścieżka: {1})",
   "FAILED_TO_OPEN_FILE": "Nie udało się otworzyć pliku",
@@ -308,8 +303,6 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Rysuj po pikselach aby je przyciemnić. Puść Ctrl aby rozjaśnić.",
   "COLOR_PICKER_TOOLTIP": "Pobiera kolor z płótna i ustawia go jako pierwszorzędny. ({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Kliknij aby pobrać kolor. Przytrzymaj Ctrl aby ukryć płótno. Przytrzymaj Shift aby ukryć warstwę referencyjną.",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Kliknij aby pobrać kolory z warstwy referencyjnej.",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Kliknij aby pobrać kolory z płótna.",
   "ELLIPSE_TOOL_TOOLTIP": "Rysuje elipsę na płótnie ({0}). Przytrzymaj Shift aby narysować koło.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Kliknij i porusz myszką aby narysować elipsę. Przytrzymaj Shift aby narysować koło.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Kliknij i porusz myszką aby narysować koło.",
@@ -367,7 +360,6 @@
   "SELECTED_AREA_EMPTY": "Zaznaczony obszar jest pusty",
   "NOTHING_TO_COPY": "Nie ma nic do skopiowania",
   "REFERENCE_LAYER_PATH": "Ścieżka warstwy referencyjnej",
-  "CLIP_LAYER_BELOW": "Dopasuj do warstwy niżej",
   "FLIP": "Przerzuć",
   "ROTATION": "Obrót",
   "ROT_IMG_90_D": "Obróć obraz 90°",
@@ -485,8 +477,6 @@
   "PROJECT_MAINTAINERS": "Opiekunowie Projektu",
   "OTHER_AWESOME_CONTRIBUTORS": "I inni świetni współtwórcy",
   "HELP": "Pomoc",
-  "ALL LAYERS": "Wszystkie warstwy",
-  "SINGLE LAYER": "Pojedyńcza warstwa",
   "STOP_IT_TEXT3": "Nie no, serio, przestań.",
   "STOP_IT_TEXT4": "Nie masz nic lepszego do roboty?",
   "LINEAR_DODGE_BLEND_MODE": "Liniowe unikanie (Dodatnie)",
@@ -500,5 +490,75 @@
   "RESET_VIEWPORT": "Resetuj widok",
   "VIEWPORT_SETTINGS": "Ustawienia widoku",
   "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Kliknij i przytrzymaj myszkę, aby poruszyć piksele w zaznaczonej warstwie.",
-  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Przytrzymaj myszkę aby poruszyć wszystkie warstwy."
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Przytrzymaj myszkę aby poruszyć wszystkie warstwy.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Zmień nazwę",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Otwórz okno debugowania lokalizacji",
+  "FORCE_OTHER_FLOW_DIRECTION": "Odwróć kierunek interfejsu",
+  "API_KEY": "Klucz API",
+  "LOCALIZATION_VIEW_TYPE": "Typ wyświetlania lokalizacji",
+  "LOAD_LANGUAGE_FROM_FILE": "Załaduj język z pliku",
+  "LOG_IN": "Zaloguj",
+  "SYNC": "Synchronizuj",
+  "NOT_LOGGED_IN": "Nie zalogowano",
+  "POE_EDITOR_ERROR": "Błąd POEditora: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "Błąd HTTP: {0} {1}",
+  "LOGGED_IN": "Zalogowano",
+  "SYNCED_SUCCESSFULLY": "Zsynchronizowano poprawnie",
+  "EXCEPTION_ERROR": "Błąd: {0}",
+  "DROP_PALETTE": "Upuść paletę tutaj",
+  "SECURITY_ERROR": "Błąd bezpieczeństwa",
+  "SECURITY_ERROR_MSG": "Brak uprawnień do zapisu w tej lokalizacji.",
+  "IO_ERROR": "Błąd I/O",
+  "IO_ERROR_MSG": "Błąd podczas zapisu na dysku.",
+  "FAILED_ASSOCIATE_PIXI": "Nie udało się powiązać pliku .pixi z PixiEditorem.",
+  "COULD_NOT_SAVE_PALETTE": "Wysąpił błąd poczas zapisu palety kolorów.",
+  "NO_COLORS_TO_SAVE": "Brak kolorów do zapisu.",
+  "ALL_LAYERS": "Wszystkie warstwy",
+  "SINGLE_LAYER": "Pojedyńcza warstwa",
+  "CHOOSE": "Wybierz",
+  "REMOVE": "Usuń",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "Plik nie jest typu \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "Ten plik zawiera niewłaściwe skróty klawiszowe",
+  "FILE_EXTENSION_NOT_SUPPORTED": "Plik '{0}' nie jest wspierany",
+  "ERROR_READING_FILE": "Błąd podczas czytania pliku",
+  "DISCARD_PALETTE": "Odrzuć paletę",
+  "DISCARD_PALETTE_CONFIRMATION": "Czy na pewno chcesz odrzucić aktywną paletę? Nie można tego cofnąć.",
+  "IMPORT_AS_NEW_LAYER": "Importuj jako nowa warstwa",
+  "PASTE_AS_PRIMARY_COLOR": "Wklej jako kolor podstawowy",
+  "IMPORT_AS_NEW_FILE": "Importuj jako nowy plik",
+  "IMPORT_PALETTE_FILE": "Importuj paletę kolorów",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Importuj kolory do palety",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Importuj kolor do palety",
+  "IMPORT_AS_REFERENCE_LAYER": "Importuj jako warstwa referencyjna",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Kilknij prawy przycisk myszy aby pobrać kolor, kliknij z Shiftem aby skopiować kolor do schowka",
+  "OPEN_FILE_FROM_CLIPBOARD": "Otwórz ze schowka",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Otwórz ze schowka",
+  "OPEN_LOCALIZATION_DATA": "Czy chcesz otworzyć plik LocalizationData.json? \nZaktualizowane dane zostały skopiowane do schowka. Zmiany zostaną zaaplikowane dopiero po restarcie aplikacji",
+  "DOWNLOADING_LANGUAGE_FAILED": "Nie udało się pobrać języka. \nMożliwe że klucz API został użyty zbyt wiele razy.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Ścieżka z danymi lokalizacji nie została odnaleziona",
+  "APPLY": "Zastosuj",
+  "UPDATE_SOURCE": "Zaktualizuj źródło",
+  "COPY_TO_CLIPBOARD": "Kopiuj do schowka",
+  "LANGUAGE_FILE_NOT_FOUND": "Język nie znaleziony.\nSzukanie {0}",
+  "PROJECT_ROOT_NOT_FOUND": "Źródło projektu PixiEditor nie zostało odnalezione.\nSzukanie PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Folder z danymi lokalizacji nie został odnaleziony.\nSzukanie /Data/Localization",
+  "SELECT_A_LANGUAGE": "Wybierz język",
+  "DONE": "Zrobione",
+  "SOURCE_UNSET_OR_MISSING": "Brakujące/Nie ustawione źródło",
+  "SOURCE_NEWER": "Źródło jest nowsze",
+  "SOURCE_UP_TO_DATE": "Źródło jest aktualne",
+  "SOURCE_OLDER": "Chmura jest nowsza",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Kliknij aby pobrać kolory z warstwy referencyjnej.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Kliknij aby pobrać kolory z płótna.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Okno debugowania lokalizacji",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Okno debugowania komend",
+  "SHORTCUTS_TITLE": "Skróty klawiszowe",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Przeciągnij uchwyty aby skalować transformację. Przytrzymaj Ctrl i przeciągnij aby przemieścić uchwyt swobodnie. Przytrzymaj Shify aby skalować proporcjonalnie. Przytrzymaj Alt i przeciągnij boczny uchwyt aby ściąć. Porusz zewnętrzne uchwyty aby obracać.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Przeciągnij uchwyty aby skalować transformację. Przytrzymaj Shify aby zrobić to proporcjonalnie. Przytrzymaj Alt i przeciągnij aby ściąć. Przeciągnij zewnętrzne uchwyty aby obracać.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Przeciągnij uchwyty aby skalować transformację. Przytrzymaj Shify aby skalować proporcjonalnie. Przeciągnij zewnętrzne uchwyty aby obracać.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Przeciągnij uchwyty aby skalować transformację. Przytrzymaj Shift aby skalować proporcjonalnie."
 }

+ 564 - 0
src/PixiEditor/Data/Localization/Languages/pt-br.json

@@ -0,0 +1,564 @@
+{
+  "RECENT_FILES": "Arquivos Recentes",
+  "OPEN_FILE": "Abrir Arquivo",
+  "NEW_FILE": "Novo",
+  "RECENT_EMPTY_TEXT": "Sem arquivos recentes",
+  "LANGUAGE": "Linguagem",
+  "GENERAL": "Geral",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Atalhos de Teclado",
+  "MISC": "Diversos",
+  "SHOW_STARTUP_WINDOW": "Mostrar janela de inicialização",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Mostrar prévia da imagem na barra de tarefas",
+  "RECENT_FILE_LENGTH": "Número de arquivos recentes exibidos",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Quantos documentos são exibidos em Arquivo > Recentes. Padrão: 8",
+  "DEFAULT_NEW_SIZE": "Novo tamanho padrão de arquivo",
+  "WIDTH": "Largura",
+  "HEIGHT": "Altura",
+  "TOOLS": "Ferramentas",
+  "ENABLE_SHARED_TOOLBAR": "Habilitar barra de ferramentas compartilhada",
+  "AUTOMATIC_UPDATES": "Atualizações Automáticas",
+  "CHECK_FOR_UPDATES": "Verificar as atualizações na inicialização",
+  "UPDATE_STREAM": "Atualizar stream",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Os canais de atualização só podem ser alterados na versão standalone (baixada de https://pixieditor.net).\nAs versões do Steam e da Microsoft Store tratam as atualizações de forma separada.",
+  "DEBUG": "Depurar",
+  "ENABLE_DEBUG_MODE": "Habilitar o modo de depuração",
+  "OPEN_CRASH_REPORTS_DIR": "Abrir o diretório de relatórios de falhas",
+  "DISCORD_RICH_PRESENCE": "Estado de Presença",
+  "ENABLED": "Habilitado",
+  "SHOW_IMAGE_NAME": "Mostrar o nome da imagem",
+  "SHOW_IMAGE_SIZE": "Mostrar o tamanho da imagem",
+  "SHOW_LAYER_COUNT": "Mostrar a contagem de camadas",
+  "FILE": "Arquivo",
+  "RECENT": "Recente",
+  "OPEN": "Abrir",
+  "SAVE_PIXI": "Salvar (.pixi)",
+  "SAVE_AS_PIXI": "Salvar como... (.pixi)",
+  "EXPORT_IMG": "Exportar (.png, .jpg, etc.)",
+  "EDIT": "Editar",
+  "EXIT": "Sair",
+  "PERCENTAGE": "Porcentagem",
+  "ABSOLUTE": "Absoluto",
+  "PRESERVE_ASPECT_RATIO": "Preservar a relação de aspecto",
+  "ANCHOR_POINT": "Ponto de ancoragem",
+  "RESIZE_IMAGE": "Redimensionar imagem",
+  "RESIZE": "Redimensionar",
+  "DOCUMENTATION": "Documentação",
+  "WEBSITE": "Website",
+  "OPEN_WEBSITE": "Abrir website",
+  "REPOSITORY": "Repositório",
+  "OPEN_REPOSITORY": "Abrir repositório",
+  "LICENSE": "Licença",
+  "OPEN_LICENSE": "Abrir licença",
+  "THIRD_PARTY_LICENSES": "Licenças de terceiros",
+  "OPEN_THIRD_PARTY_LICENSES": "Abrir licenças de terceiros",
+  "APPLY_TRANSFORM": "Aplicar a transformação",
+  "INCREASE_TOOL_SIZE": "Aumentar o tamanho da ferramenta",
+  "DECREASE_TOOL_SIZE": "Diminuir o tamanho da ferramenta",
+  "TO_INSTALL_UPDATE": "para instalar a atualização {0}",
+  "DOWNLOADING_UPDATE": "Download da atualização...",
+  "UPDATE_READY": "A atualização está pronta para ser instalada. Deseja instalá-la agora?",
+  "NEW_UPDATE": "Nova atualização",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Não foi possível atualizar sem privilégios de administrador. Execute o PixiEditor como administrador.",
+  "INSUFFICIENT_PERMISSIONS": "Permissões insuficientes",
+  "UPDATE_CHECK_FAILED": "Falha na verificação da atualização",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Não foi possível verificar se há uma atualização disponível.",
+  "VERSION": "Versão {0}",
+  "OPEN_TEMP_DIR": "Abrir o diretório temporário",
+  "OPEN_LOCAL_APPDATA_DIR": "Abra o diretório local AppData",
+  "OPEN_ROAMING_APPDATA_DIR": "Abrir o diretório AppData do Roaming",
+  "OPEN_INSTALLATION_DIR": "Abrir o diretório de instalação",
+  "DUMP_ALL_COMMANDS": "Exportar o arquivo de despejo de todos os comandos",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Exportar o arquivo de despejo de todos os comandos para txt",
+  "CRASH": "Falha",
+  "CRASH_APP": "Falha no aplicativo",
+  "DELETE_USR_PREFS": "Excluir as preferências do usuário (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Excluir arquivo de atalho (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Excluir dados do editor (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Gerar modelo de associações de teclas de atalho",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Gerar modelo json de associações de teclas de atalho",
+  "VALIDATE_SHORTCUT_MAP": "Validar mapa de atalhos",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Valida o mapa de atalhos",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Chaves vazias: {0}\nComandos desconhecidos: {1}",
+  "RESULT": "Resultado",
+  "CLEAR_RECENT_DOCUMENTS": "Limpar documentos recentes",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Limpar os documentos abertos recentemente",
+  "OPEN_CMD_DEBUG_WINDOW": "Abrir a janela de depuração de comandos",
+  "PATH_DOES_NOT_EXIST": "{0} não existe.",
+  "LOCATION_DOES_NOT_EXIST": "A localização não existe.",
+  "FILE_NOT_FOUND": "Arquivo não encontrado.",
+  "ARE_YOU_SURE": "Você tem certeza?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Tem certeza de que deseja excluir {0}?\nEsses dados serão perdidos em todas as instalações.\n(Caminho completo: {1})",
+  "FAILED_TO_OPEN_FILE": "Falha ao abrir o arquivo",
+  "OLD_FILE_FORMAT": "Formato de arquivo antigo",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Esse arquivo .pixi usa o formato antigo,\n que não é mais suportado e não pode ser aberto.",
+  "NOTHING_FOUND": "Nada encontrado",
+  "EXPORT": "Exportar",
+  "EXPORT_IMAGE": "Exportar imagem",
+  "IMPORT": "Importar",
+  "SHORTCUT_TEMPLATES": "Modelos de atalho",
+  "RESET_ALL": "Redefinir tudo",
+  "LAYER": "Camada",
+  "LAYER_DELETE_SELECTED": "Excluir a camada/pasta ativa",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Excluir camada ou pasta ativa",
+  "LAYER_DELETE_ALL_SELECTED": "Excluir todas as camadas/pastas selecionadas",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Excluir todas as camadas e/ou pastas selecionadas",
+  "DELETE_SELECTED_PIXELS": "Excluir pixels selecionados",
+  "NEW_FOLDER": "Nova pasta",
+  "CREATE_NEW_FOLDER": "Criar nova pasta",
+  "NEW_LAYER": "Nova camada",
+  "CREATE_NEW_LAYER": "Criar uma nova camada",
+  "NEW_IMAGE": "Nova imagem",
+  "CREATE_NEW_IMAGE": "Criar uma nova imagem",
+  "SAVE": "Salvar",
+  "SAVE_AS": "Salvar como...",
+  "IMAGE": "Imagem",
+  "SAVE_IMAGE": "Salvar a imagem",
+  "SAVE_IMAGE_AS": "Salvar a imagem como nova",
+  "DUPLICATE": "Duplicar",
+  "DUPLICATE_SELECTED_LAYER": "Duplicar camada selecionada",
+  "CREATE_MASK": "Criar máscara",
+  "DELETE_MASK": "Deletar máscara",
+  "TOGGLE_MASK": "Alternar a visibilidade da máscara",
+  "APPLY_MASK": "Aplicar máscara",
+  "TOGGLE_VISIBILITY": "Alternar a visibilidade",
+  "MOVE_MEMBER_UP": "Mova a barra para cima",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Mover para cima a camada ou pasta selecionada",
+  "MOVE_MEMBER_DOWN": "Mova a barra para baixo",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Mover a camada ou pasta selecionada para baixo",
+  "MERGE_ALL_SELECTED_LAYERS": "Mesclar todas as camadas selecionadas",
+  "MERGE_WITH_ABOVE": "Mesclar a camada com a camada acima",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Mesclar a camada selecionada com a camada acima",
+  "MERGE_WITH_BELOW": "Mesclar a camada com a camada abaixo",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Mesclar a camada selecionada com a camada abaixo",
+  "ADD_REFERENCE_LAYER": "Adicionar camada de referência",
+  "DELETE_REFERENCE_LAYER": "Deletar camada de referência",
+  "TRANSFORM_REFERENCE_LAYER": "Transformar a camada de referência",
+  "TOGGLE_REFERENCE_LAYER_POS": "Alternar posição da camada de referência",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Alternar a camada de referência entre a mais alta ou a mais baixa",
+  "RESET_REFERENCE_LAYER_POS": "Redefinir posição da camada de referência",
+  "CLIP_CANVAS": "Cortar tela",
+  "FLIP_IMG_VERTICALLY": "Virar a imagem verticalmente",
+  "FLIP_IMG_HORIZONTALLY": "Virar a imagem horizontalmente",
+  "FLIP_LAYERS_VERTICALLY": "Virar Camadas Selecionadas Verticalmente",
+  "FLIP_LAYERS_HORIZONTALLY": "Virar Camadas Selecionadas Horizontalmente",
+  "ROT_IMG_90": "Girar imagem 90 graus",
+  "ROT_IMG_180": "Girar imagem 180 graus",
+  "ROT_IMG_-90": "Girar imagem -90 graus",
+  "ROT_LAYERS_90": "Girar imagens selecionadas 90 graus",
+  "ROT_LAYERS_180": "Girar imagens selecionadas 180 graus",
+  "ROT_LAYERS_-90": "Girar imagens selecionadas -90 graus",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Alternar a visibilidade de simetria vertical",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Alternar a visibilidade de simetria horizontal",
+  "DELETE_PIXELS": "Deletar pixels",
+  "DELETE_PIXELS_DESCRIPTIVE": "Deletar pixels selecionados",
+  "RESIZE_DOCUMENT": "Redimensionar documento",
+  "RESIZE_CANVAS": "Redimensionar tela",
+  "CENTER_CONTENT": "Centralizar conteúdo",
+  "CUT": "Cortar",
+  "CUT_DESCRIPTIVE": "Cortar área/camadas selecionadas",
+  "PASTE": "Colar",
+  "PASTE_DESCRIPTIVE": "Colar área/camadas selecionadas",
+  "PASTE_AS_NEW_LAYER": "Colar como nova camada",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Colar da área de transferência como nova camada",
+  "PASTE_REFERENCE_LAYER": "Colar para a camada de referência",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Colar o conteúdo da área de transferência como camada de referência",
+  "PASTE_COLOR": "Colar Cor",
+  "PASTE_COLOR_DESCRIPTIVE": "Colar cor da área de transferência",
+  "PASTE_COLOR_SECONDARY": "Colar cor secundária",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Colar a cor da área de transferência como cor secundária",
+  "CLIPBOARD": "Área de transferência",
+  "COPY": "Copiar",
+  "COPY_DESCRIPTIVE": "Copiar para a área de transferência",
+  "COPY_COLOR_HEX": "Copiar cor primária (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Copiar a cor primária como código HEX",
+  "COPY_COLOR_RGB": "Copiar cor primária (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Copiar a cor primária como código RGB",
+  "COPY_COLOR_SECONDARY_HEX": "Copiar cor secundária (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Copiar a cor secundária como código HEX",
+  "COPY_COLOR_SECONDARY_RGB": "Copiar cor secundária (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Copiar a cor secundária como código RGB",
+  "PALETTE_COLORS": "Cores da paleta",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Substituir a cor secundária pela primária",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Substitua a cor secundária pela cor primária",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Substitua a cor primária pela secundária",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Substitua a cor primária pela cor secundária",
+  "OPEN_PALETTE_BROWSER": "Abrir o navegador da paleta",
+  "OVERWRITE_PALETTE_CONSENT": "A paleta '{0}' já existe, você deseja substituí-la?",
+  "PALETTE_EXISTS": "A paleta já existe",
+  "REPLACE_PALETTE_CONSENT": "Substituir a paleta atual pela selecionada?",
+  "REPLACE_PALETTE": "Substituir a paleta atual",
+  "SELECT_COLOR_1": "Selecione a cor 1",
+  "SELECT_COLOR_2": "Selecione a cor 2",
+  "SELECT_COLOR_3": "Selecione a cor 3",
+  "SELECT_COLOR_4": "Selecione a cor 4",
+  "SELECT_COLOR_5": "Selecione a cor 5",
+  "SELECT_COLOR_6": "Selecione a cor 6",
+  "SELECT_COLOR_7": "Selecione a cor 7",
+  "SELECT_COLOR_8": "Selecione a cor 8",
+  "SELECT_COLOR_9": "Selecione a cor 9",
+  "SELECT_COLOR_10": "Selecione a cor 10",
+  "SELECT_TOOL": "Selecionar {0} Ferramenta",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Selecione a primeira cor na paleta",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Selecione a segunda cor na paleta",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Selecione a terceira cor na paleta",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Selecione a quarta cor na paleta",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Selecione a quinta cor na paleta",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Selecione a sexta cor na paleta",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Selecione a sétima cor na paleta",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Selecione a oitava cor na paleta",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Selecione a nona cor na paleta",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Selecione a décima cor na paleta",
+  "SWAP_COLORS": "Trocar cores",
+  "SWAP_COLORS_DESCRIPTIVE": "Trocar cores primárias e secundárias",
+  "SEARCH": "Pesquisar",
+  "COMMAND_SEARCH": "Pesquisa de comandos",
+  "OPEN_COMMAND_SEARCH": "Abrir a janela de pesquisa de comandos",
+  "SELECT": "Selecionar",
+  "DESELECT": "Desselecionar",
+  "INVERT": "Inverter",
+  "SELECTION": "Seleção",
+  "SELECT_ALL": "Selecionar tudo",
+  "SELECT_ALL_DESCRIPTIVE": "Selecione tudo",
+  "CLEAR_SELECTION": "Limpar seleção",
+  "INVERT_SELECTION": "Inverter seleção",
+  "INVERT_SELECTION_DESCRIPTIVE": "Inverter a seleção",
+  "TRANSFORM_SELECTED_AREA": "Transformar área selecionada",
+  "NUDGE_SELECTED_LEFT": "Deslocar o objeto selecionado para a esquerda",
+  "NUDGE_SELECTED_RIGHT": "Deslocar o objeto selecionado para a direita",
+  "NUDGE_SELECTED_UP": "Deslocar o objeto selecionado para acima",
+  "NUDGE_SELECTED_DOWN": "Deslocar o objeto selecionado para abaixo",
+  "MASK_FROM_SELECTION": "Nova máscara a partir da seleção",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Seleção para nova máscara",
+  "ADD_SELECTION_TO_MASK": "Adicionar seleção à máscara",
+  "SUBTRACT_SELECTION_FROM_MASK": "Subtrair a seleção da máscara",
+  "INTERSECT_SELECTION_MASK": "Seleção de interseção com máscara",
+  "SELECTION_TO_MASK": "Seleção para máscara",
+  "TO_NEW_MASK": "Para a nova máscara",
+  "ADD_TO_MASK": "Adicionar à máscara",
+  "SUBTRACT_FROM_MASK": "Subtrair da máscara",
+  "INTERSECT_WITH_MASK": "Interseção com máscara",
+  "STYLUS": "Caneta",
+  "TOGGLE_PEN_MODE": "Alternar o modo de caneta",
+  "UNDO": "Desfazer",
+  "UNDO_DESCRIPTIVE": "Desfazer a última ação",
+  "REDO": "Refazer",
+  "REDO_DESCRIPTIVE": "Refazer a última ação",
+  "WINDOWS": "Janelas",
+  "TOGGLE_GRIDLINES": "Alternar linhas guia",
+  "ZOOM_IN": "Aumentar o zoom",
+  "ZOOM_OUT": "Diminuir o zoom",
+  "NEW_WINDOW_FOR_IMG": "Nova janela para a imagem atual",
+  "CENTER_ACTIVE_VIEWPORT": "Centralizar a janela de exibição ativa",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Inverter a janela de exibição horizontalmente",
+  "FLIP_VIEWPORT_VERTICALLY": "Inverter a janela de visualização verticalmente",
+  "SETTINGS": "Configurações",
+  "OPEN_SETTINGS": "Abrir configurações",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Abrir a janela de configurações",
+  "OPEN_STARTUP_WINDOW": "Abrir a janela de inicialização",
+  "OPEN_SHORTCUT_WINDOW": "Abrir a janela de atalhos",
+  "OPEN_ABOUT_WINDOW": "Abrir a janela sobre",
+  "OPEN_NAVIGATION_WINDOW": "Abrir a janela de navegação",
+  "ERROR": "Erro",
+  "INTERNAL_ERROR": "Erro interno",
+  "ERROR_SAVE_LOCATION": "Não foi possível salvar o arquivo no local especificado",
+  "ERROR_WHILE_SAVING": "Ocorreu um erro interno ao salvar. Tente novamente.",
+  "UNKNOWN_ERROR_SAVING": "Ocorreu um erro ao salvar.",
+  "FAILED_ASSOCIATE_LOSPEC": "Falha ao associar o protocolo da paleta Lospec.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Doação",
+  "YES": "Sim",
+  "NO": "Não",
+  "CANCEL": "Cancelar",
+  "UNNAMED": "Sem nome",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Abrir a janela de depuração de comandos",
+  "DELETE": "Deletar",
+  "USER_PREFS": "Preferências do usuário (Roaming)",
+  "SHORTCUT_FILE": "Arquivo de atalho (Roaming)",
+  "EDITOR_DATA": "Dados do editor (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "Move a janela de visualização. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Clique e mova para deslocar a janela de visualização",
+  "MOVE_TOOL_TOOLTIP": "Move os pixels selecionados ({0}). Mantenha pressionada a tecla Ctrl para mover todas as camadas.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Mantenha o mouse pressionado para mover os pixels selecionados. Mantenha pressionada a tecla Ctrl para mover todas as camadas.",
+  "PEN_TOOL_TOOLTIP": "Caneta. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Clique e movimente para desenhar.",
+  "PIXEL_PERFECT_SETTING": "Pixel perfeito",
+  "RECTANGLE_TOOL_TOOLTIP": "Desenha um retângulo na tela ({0}). Mantenha pressionada a tecla Shift para desenhar um quadrado.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova para desenhar um retângulo. Mantenha pressionada a tecla Shift para desenhar um quadrado.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Clique e movimente para desenhar um quadrado.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Manter imagem original",
+  "ROTATE_VIEWPORT_TOOLTIP": "Gira a janela de visualização. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Clique e mova para girar a janela de visualização",
+  "SELECT_TOOL_TOOLTIP": "Seleciona a área. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova para selecionar uma área. Mantenha pressionada a tecla Shift para adicionar à seleção existente. Mantenha pressionada a tecla Ctrl para subtraí-la.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Clique e mova para adicionar à seleção atual.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Clique e mova para subtrair da seleção atual.",
+  "ZOOM_TOOL_TOOLTIP": "Amplia a janela de visualização ({0}). Clique para aumentar o zoom, mantenha pressionada a tecla Alt e clique para diminuir o zoom.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova para dar zoom. Clique para aumentar o zoom, mantenha pressionada a tecla Ctrl e clique para diminuir o zoom.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Clique e mova para dar zoom. Clique para diminuir o zoom, solte a tecla Ctrl e clique para aumentar o zoom.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Torna os pixels mais claros ou mais escuros ({0}). Mantenha pressionada a tecla Ctrl para tornar os pixels mais escuros.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Desenhe nos pixels para torná-los mais brilhantes. Mantenha pressionada a tecla Ctrl para escurecer.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Desenhe nos pixels para torná-los mais escuros. Solte a tecla Ctrl para clarear.",
+  "COLOR_PICKER_TOOLTIP": "Seleciona a cor primária da tela. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Clique para escolher as cores. Mantenha pressionada a tecla Ctrl para ocultar a tela. Mantenha pressionada a tecla Shift para ocultar a camada de referência",
+  "ELLIPSE_TOOL_TOOLTIP": "Desenha uma elipse na tela ({0}). Mantenha pressionada a tecla Shift para desenhar um círculo.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova o mouse para desenhar uma elipse. Mantenha pressionada a tecla Shift para desenhar um círculo.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Clique e mova o mouse para desenhar um círculo.",
+  "ERASER_TOOL_TOOLTIP": "Apaga a cor do pixel. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Clique e movimente para apagar.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Preenche a área com cor. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Pressione em uma área para preenchê-la. Mantenha pressionada a tecla Ctrl para considerar todas as camadas.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Pressione em uma área para preenchê-la. Solte a tecla Ctrl para considerar apenas as camadas atuais.",
+  "LASSO_TOOL_TOOLTIP": "Laço. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova para selecionar pixels dentro do laço. Mantenha pressionada a tecla Shift para adicionar à seleção existente. Mantenha pressionada a tecla Ctrl para subtraí-la.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Clique e mova para adicionar pixels dentro do laço à seleção.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Clique e mova para subtrair da seleção os pixels dentro do laço.",
+  "LINE_TOOL_TOOLTIP": "Desenha uma linha na tela ({0}). Mantenha pressionada a tecla Shift para ativar o encaixe.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Clique e mova para desenhar uma linha. Mantenha pressionada a tecla Shift para ativar o encaixe.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Clique e mova o mouse para desenhar uma linha com o encaixe ativado.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Varinha mágica ({0}). Ferramenta de seleção contígua",
+  "MAGIC_WAND_ACTION_DISPLAY": "Clique para preencher a seleção.",
+  "PEN_TOOL": "Caneta",
+  "BRIGHTNESS_TOOL": "Brilho",
+  "COLOR_PICKER_TOOL": "Seletor de cores",
+  "ELLIPSE_TOOL": "Elipse",
+  "ERASER_TOOL": "Borracha",
+  "FLOOD_FILL_TOOL": "Preenchimento",
+  "LASSO_TOOL": "Laço",
+  "LINE_TOOL": "Linha",
+  "MAGIC_WAND_TOOL": "Varinha mágica",
+  "MOVE_TOOL": "Mover",
+  "MOVE_VIEWPORT_TOOL": "Mover a tela",
+  "RECTANGLE_TOOL": "Retângulo",
+  "ROTATE_VIEWPORT_TOOL": "Girar a tela",
+  "SELECT_TOOL_NAME": "Selecionar",
+  "ZOOM_TOOL": "Zoom",
+  "SHAPE_LABEL": "Forma",
+  "MODE_LABEL": "Modo",
+  "SCOPE_LABEL": "Referência",
+  "FILL_SHAPE_LABEL": "Preencher forma",
+  "FILL_COLOR_LABEL": "Cor de preenchimento",
+  "TOOL_SIZE_LABEL": "Tamanho da ferramenta",
+  "STRENGTH_LABEL": "Força",
+  "NEW": "novo",
+  "ADD": "Adicionar",
+  "SUBTRACT": "Subtrair",
+  "INTERSECT": "Intersectar",
+  "RECTANGLE": "Retângulo",
+  "CIRCLE": "Círculo",
+  "ABOUT": "Sobre",
+  "MINIMIZE": "Minimizar",
+  "RESTORE": "Restaurar",
+  "MAXIMIZE": "Maximizar",
+  "CLOSE": "Fechar",
+  "EXPORT_SIZE_HINT": "Se quiser compartilhar a imagem, tente {0}% para obter a melhor nitidez",
+  "CREATE": "Criar",
+  "BASE_LAYER_NAME": "Camada base",
+  "ENABLE_MASK": "Habilitar máscara",
+  "SELECTED_AREA_EMPTY": "A área selecionada está vazia",
+  "NOTHING_TO_COPY": "Não há nada para copiar",
+  "REFERENCE_LAYER_PATH": "Caminho de camada de referência",
+  "FLIP": "Virar",
+  "ROTATION": "Girar",
+  "ROT_IMG_90_D": "Girar a imagem 90°",
+  "ROT_IMG_180_D": "Girar a imagem 180°",
+  "ROT_IMG_-90_D": "Girar a imagem -90°",
+  "ROT_LAYERS_90_D": "Girar a imagem selecionada a 90°",
+  "ROT_LAYERS_180_D": "Girar a imagem selecionada a 180°",
+  "ROT_LAYERS_-90_D": "Girar a imagem selecionada a -90°",
+  "UNNAMED_PALETTE": "Paleta sem nome",
+  "CLICK_SELECT_PRIMARY": "Clique para selecionar a cor principal.",
+  "PEN_MODE": "Modo caneta",
+  "VIEW": "Exibir",
+  "HORIZONTAL_LINE_SYMMETRY": "Simetria de linha horizontal",
+  "VERTICAL_LINE_SYMMETRY": "Simetria de linha vertical",
+  "COLOR_PICKER_TITLE": "Seletor de cor",
+  "COLOR_SLIDERS_TITLE": "Controle deslizante de cores",
+  "PALETTE_TITLE": "Paleta",
+  "SWATCHES_TITLE": "Amostras",
+  "LAYERS_TITLE": "Camadas",
+  "NAVIGATION_TITLE": "Navegador",
+  "NORMAL_BLEND_MODE": "Normal",
+  "DARKEN_BLEND_MODE": "Escurecer",
+  "MULTIPLY_BLEND_MODE": "Multiplicar",
+  "COLOR_BURN_BLEND_MODE": "Queimar",
+  "LIGHTEN_BLEND_MODE": "Clarear",
+  "SCREEN_BLEND_MODE": "Tela",
+  "COLOR_DODGE_BLEND_MODE": "Subexposição",
+  "OVERLAY_BLEND_MODE": "Sobreposição",
+  "SOFT_LIGHT_BLEND_MODE": "Luz suave",
+  "HARD_LIGHT_BLEND_MODE": "Luz forte",
+  "DIFFERENCE_BLEND_MODE": "Diferença",
+  "EXCLUSION_BLEND_MODE": "Exclusão",
+  "HUE_BLEND_MODE": "Matiz",
+  "SATURATION_BLEND_MODE": "Saturação",
+  "LUMINOSITY_BLEND_MODE": "Luminosidade",
+  "COLOR_BLEND_MODE": "Cor",
+  "NOT_SUPPORTED_BLEND_MODE": "Não suportado",
+  "RESTART": "Reiniciar",
+  "SORT_BY": "Ordenar por",
+  "NAME": "Nome",
+  "COLORS": "Cores",
+  "DEFAULT": "Padrão",
+  "ALPHABETICAL": "Alfabético",
+  "COLOR_COUNT": "Contagem de cores",
+  "ANY": "Qualquer",
+  "MAX": "Máx",
+  "MIN": "Min",
+  "EXACT": "Exato",
+  "ASCENDING": "Crescente",
+  "DESCENDING": "Decrescente",
+  "NAME_IS_TOO_LONG": "O nome é muito longo",
+  "STOP_IT_TEXT1": "É o bastante. Arrume seus nomes de arquivo.",
+  "STOP_IT_TEXT2": "Você pode parar de copiar esses nomes, por favor?",
+  "REPLACER_TOOLTIP": "Clique com o botão direito na cor da paleta e escolha 'Substituir' ou solte-a aqui.",
+  "CLICK_TO_CHOOSE_COLOR": "Clique para escolher a cor",
+  "REPLACE_COLOR": "Substituir cor",
+  "PALETTE_COLOR_TOOLTIP": "Clique para selecionar como cor principal. Arraste e solte em outra cor da paleta para trocá-los.",
+  "ADD_FROM_SWATCHES": "Adicionar de amostras",
+  "ADD_COLOR_TO_PALETTE": "Adicionar cor à paleta",
+  "USE_IN_CURRENT_IMAGE": "Usar na imagem atual",
+  "ADD_TO_FAVORITES": "Adicionar aos favoritos",
+  "BROWSE_PALETTES": "Procurar paletas",
+  "LOAD_PALETTE": "Carregar paleta",
+  "SAVE_PALETTE": "Salvar paleta",
+  "FAVORITES": "Favoritos",
+  "ADD_FROM_CURRENT_PALETTE": "Adicionar da paleta atual",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Abrir o diretório de paletas no Explorer",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Procure paletas na Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "Importar de um arquivo",
+  "TOP_LEFT": "Superior esquerdo",
+  "TOP_CENTER": "Centro superior",
+  "TOP_RIGHT": "Superior direito",
+  "MIDDLE_LEFT": "Meio à esquerda",
+  "MIDDLE_CENTER": "Centro médio",
+  "MIDDLE_RIGHT": "Meio à direita",
+  "BOTTOM_LEFT": "Inferior esquerdo",
+  "BOTTOM_CENTER": "Centro inferior",
+  "BOTTOM_RIGHT": "Inferior direito",
+  "CLIP_TO_BELOW": "Clipar para a camada abaixo",
+  "MOVE_UPWARDS": "Mover para acima",
+  "MOVE_DOWNWARDS": "Mover para abaixo",
+  "MERGE_SELECTED": "Mesclar selecionados",
+  "LOCK_TRANSPARENCY": "Bloquear transparência",
+  "COULD_NOT_LOAD_PALETTE": "Não foi possível obter paletas",
+  "NO_PALETTES_FOUND": "Nenhuma paleta encontrada.",
+  "LOSPEC_LINK_TEXT": "Ouvi dizer que você pode encontrar algumas aqui: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Navegador de paleta",
+  "DELETE_PALETTE_CONFIRMATION": "Tem certeza de que deseja excluir essa paleta? Isso não pode ser desfeito.",
+  "SHORTCUTS_IMPORTED": "Os atalhos de {0} foram importados com êxito.",
+  "SHORTCUT_PROVIDER_DETECTED": "Detectamos que você tem o {0} instalado. Deseja importar atalhos dele?",
+  "IMPORT_FROM_INSTALLATION": "Importar a partir da instalação",
+  "IMPORT_INSTALLATION_OPTION1": "Importar da instalação",
+  "IMPORT_INSTALLATION_OPTION2": "Usar padrões",
+  "IMPORT_FROM_TEMPLATE": "Importar do modelo",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Os atalhos foram importados com sucesso.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Tem certeza de que deseja redefinir todos os atalhos para o valor padrão?",
+  "SUCCESS": "Sucesso",
+  "WARNING": "Atenção",
+  "ERROR_IMPORTING_IMAGE": "Ocorreu um erro ao importar a imagem.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Arquivo de atalhos corrompido",
+  "SHORTCUTS_CORRUPTED": "O arquivo de atalhos foi corrompido, sendo redefinido para o padrão.",
+  "FAILED_DOWNLOAD_PALETTE": "Falha no download da paleta",
+  "FILE_INCORRECT_FORMAT": "O arquivo não estava no formato correto",
+  "INVALID_FILE": "Arquivo inválido",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "O arquivo de atalhos não estava em um formato correto",
+  "UNSUPPORTED_FILE_FORMAT": "Este formato de arquivo não é suportado",
+  "ALREADY_ASSIGNED": "Já atribuído",
+  "REPLACE": "Substituir",
+  "SWAP": "Trocar",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Esse atalho já está atribuído a '{0}'\nVocê deseja substituir o atalho existente ou trocar os dois?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Esse atalho já está atribuído a '{0}'\nDeseja substituir o atalho existente?",
+  "UNSAVED_CHANGES": "Alterações não salvas",
+  "DOCUMENT_MODIFIED_SAVE": "O documento foi modificado. Deseja salvar as alterações?",
+  "SESSION_UNSAVED_DATA": "{0} com dados não salvos. Tem certeza?",
+  "PROJECT_MAINTAINERS": "Mantenedores do Projeto",
+  "OTHER_AWESOME_CONTRIBUTORS": "E outros colaboradores incríveis",
+  "HELP": "Ajuda",
+  "STOP_IT_TEXT3": "Não, sério, pare com isso.",
+  "STOP_IT_TEXT4": "Não tem nada melhor para fazer?",
+  "LINEAR_DODGE_BLEND_MODE": "Subexposição linear (Adicionar)",
+  "PRESS_ANY_KEY": "Pressione qualquer tecla",
+  "NONE_SHORTCUT": "Nenhum",
+  "REFERENCE": "Referência",
+  "PUT_REFERENCE_LAYER_ABOVE": "Coloque a camada de referência acima",
+  "PUT_REFERENCE_LAYER_BELOW": "Coloque a camada de referência abaixo",
+  "TOGGLE_VERTICAL_SYMMETRY": "Alternar simetria vertical",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Alternar simetria horizontal",
+  "RESET_VIEWPORT": "Redefinir a janela de exibição",
+  "VIEWPORT_SETTINGS": "Configurações de janela de visualização",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Clique e mantenha o mouse pressionado para mover os pixels nas camadas selecionadas.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Mantenha o mouse pressionado para mover todas as camadas.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Renomear",
+  "PIXEL_UNIT": "px",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Abrir janela de depuração de localização",
+  "FORCE_OTHER_FLOW_DIRECTION": "Forçar outra direção de fluxo",
+  "API_KEY": "Chave API",
+  "LOCALIZATION_VIEW_TYPE": "Tipo de visualização da localização",
+  "LOAD_LANGUAGE_FROM_FILE": "Carregar idioma de um arquivo",
+  "LOG_IN": "Fazer login",
+  "SYNC": "Sincronizar",
+  "NOT_LOGGED_IN": "Não conectado",
+  "POE_EDITOR_ERROR": "POEditor Error: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "HTTP Error: {0} {1}",
+  "LOGGED_IN": "Conectado",
+  "SYNCED_SUCCESSFULLY": "Sincronização bem-sucedida",
+  "EXCEPTION_ERROR": "Exceção: {0}",
+  "DROP_PALETTE": "Solte a paleta aqui",
+  "SECURITY_ERROR": "Erro de segurança",
+  "SECURITY_ERROR_MSG": "Sem permissão para gravação no local especificado.",
+  "IO_ERROR": "Erro de IO",
+  "IO_ERROR_MSG": "Erro ao gravar no disco.",
+  "FAILED_ASSOCIATE_PIXI": "Falha ao associar o arquivo .pixi ao PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Ocorreu um erro ao salvar a paleta.",
+  "NO_COLORS_TO_SAVE": "Não há cores para salvar.",
+  "ALL_LAYERS": "Todas as camadas",
+  "SINGLE_LAYER": "Camada única",
+  "CHOOSE": "Selecionar",
+  "REMOVE": "Remover",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "O arquivo não é um arquivo \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "O arquivo contém um atalho inválido",
+  "FILE_EXTENSION_NOT_SUPPORTED": "O tipo de arquivo '{0}' não é compatível",
+  "ERROR_READING_FILE": "Erro ao ler o arquivo",
+  "DISCARD_PALETTE": "Descartar paleta",
+  "DISCARD_PALETTE_CONFIRMATION": "Tem certeza de que deseja descartar a paleta atual? Isso não pode ser desfeito.",
+  "IMPORT_AS_NEW_LAYER": "Importar como uma nova camada",
+  "PASTE_AS_PRIMARY_COLOR": "Colar como cor primária",
+  "IMPORT_AS_NEW_FILE": "Importar como novo arquivo",
+  "IMPORT_PALETTE_FILE": "Importar arquivo da paleta",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Importar cores para a paleta",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Importar cor para a paleta",
+  "IMPORT_AS_REFERENCE_LAYER": "Importar como camada de referência",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Clique com o botão direito do mouse para escolher a cor, Shift e clique com o botão direito do mouse para copiar a cor para a área de transferência",
+  "OPEN_FILE_FROM_CLIPBOARD": "Abrir da área de transferência",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Abrir a partir da área de transferência",
+  "OPEN_LOCALIZATION_DATA": "Deseja abrir o LocalizationData.json? A data atualizada foi colocada na área de transferência.\nObserve que as alterações não serão aplicadas até a reinicialização",
+  "DOWNLOADING_LANGUAGE_FAILED": "O download do idioma falhou.\nA chave da API pode ter sido usada em excesso.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Caminho de dados de localização não encontrado",
+  "APPLY": "Aplicar",
+  "UPDATE_SOURCE": "Atualizar fonte",
+  "COPY_TO_CLIPBOARD": "Copiar para a área de transferência",
+  "LANGUAGE_FILE_NOT_FOUND": "Arquivo de idioma não encontrado.\nProcurando por {0}",
+  "PROJECT_ROOT_NOT_FOUND": "Raiz do projeto PixiEditor não encontrada.\nProcurando por PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Pasta de localização não encontrada.\nProcurando por /Data/Localization",
+  "SELECT_A_LANGUAGE": "Selecione um idioma",
+  "DONE": "Concluído",
+  "SOURCE_UNSET_OR_MISSING": "Fonte ausente/não definida",
+  "SOURCE_NEWER": "Fonte mais recente",
+  "SOURCE_UP_TO_DATE": "A fonte está atualizada",
+  "SOURCE_OLDER": "Mais recente na nuvem",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
+}

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/ru.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "Недавние файлы",
+  "OPEN_FILE": "Открыть файл",
+  "NEW_FILE": "Новый",
+  "RECENT_EMPTY_TEXT": "Чего-то тут пустовато",
+  "LANGUAGE": "Язык",
+  "GENERAL": "Общие",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Сочетания клавиш",
+  "MISC": "Разное",
+  "SHOW_STARTUP_WINDOW": "Показывать окно приветствия",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Отображать редактируемую картинку на иконке на панели задач",
+  "RECENT_FILE_LENGTH": "Длина списка недавних файлов",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Сколько файлов показывать в списке Файл > Недавние. По умолчанию - 8.",
+  "DEFAULT_NEW_SIZE": "Размер нового файла по умолчанию",
+  "WIDTH": "Ширина",
+  "HEIGHT": "Высота",
+  "TOOLS": "Инструменты",
+  "ENABLE_SHARED_TOOLBAR": "Использовать одни и те же настройки для всех инструментов",
+  "AUTOMATIC_UPDATES": "Автообновление",
+  "CHECK_FOR_UPDATES": "Проверять наличие обновлений при запуске",
+  "UPDATE_STREAM": "Поток обновлений",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Потоки обновлений можно выбирать только в версии PixiEditor, скачанной с сайта https://pixieditor.net.\nВерсии из Steam и Microsoft Store обновляются сами через соответствующие площадки.",
+  "DEBUG": "Отладка",
+  "ENABLE_DEBUG_MODE": "Включить режим отладки",
+  "OPEN_CRASH_REPORTS_DIR": "Открыть папку с отчетами об ошибках",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Включить",
+  "SHOW_IMAGE_NAME": "Показывать имя файла",
+  "SHOW_IMAGE_SIZE": "Показывать размер холста",
+  "SHOW_LAYER_COUNT": "Показывать кол-во слоев",
+  "FILE": "Файл",
+  "RECENT": "Недавнее",
+  "OPEN": "Открыть",
+  "SAVE_PIXI": "Сохранить (.pixi)",
+  "SAVE_AS_PIXI": "Сохранить как... (.pixi)",
+  "EXPORT_IMG": "Экспорт (.png, .jpg, и т.п.)",
+  "EDIT": "Редактирование",
+  "EXIT": "Выход",
+  "PERCENTAGE": "Процент",
+  "ABSOLUTE": "Абсолютный размер",
+  "PRESERVE_ASPECT_RATIO": "Сохранять пропорции",
+  "ANCHOR_POINT": "Расположение",
+  "RESIZE_IMAGE": "Размер изображения...",
+  "RESIZE": "Изменить размер",
+  "DOCUMENTATION": "Документация",
+  "WEBSITE": "Сайт",
+  "OPEN_WEBSITE": "Открыть сайт",
+  "REPOSITORY": "Репозиторий",
+  "OPEN_REPOSITORY": "Открыть репозиторий",
+  "LICENSE": "Лицензия",
+  "OPEN_LICENSE": "Открыть лицензию",
+  "THIRD_PARTY_LICENSES": "Лицензии третьих сторон",
+  "OPEN_THIRD_PARTY_LICENSES": "Открыть лицензии третьих сторон",
+  "APPLY_TRANSFORM": "Применить трансформирование",
+  "INCREASE_TOOL_SIZE": "Увеличить размер кисти",
+  "DECREASE_TOOL_SIZE": "Уменьшить размер кисти",
+  "TO_INSTALL_UPDATE": "для установки обновления {0}",
+  "DOWNLOADING_UPDATE": "Скачивается обновление...",
+  "UPDATE_READY": "Обновление готово к установке. Установить его сейчас?",
+  "NEW_UPDATE": "Обновление",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Для обновления нужны права администратора. Пожалуйста, запустите PixiEditor от имени администратора.",
+  "INSUFFICIENT_PERMISSIONS": "Недостаточно прав",
+  "UPDATE_CHECK_FAILED": "Проверка обновлений не удалась",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Не удалось проверить наличие обновлений",
+  "VERSION": "Версия {0}",
+  "OPEN_TEMP_DIR": "Открыть папку Temp",
+  "OPEN_LOCAL_APPDATA_DIR": "Открыть папку Local AppData",
+  "OPEN_ROAMING_APPDATA_DIR": "Открыть папку Roaming AppData",
+  "OPEN_INSTALLATION_DIR": "Открыть папку установки",
+  "DUMP_ALL_COMMANDS": "Выгрузить команды",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Выгрузить все команды в файл",
+  "CRASH": "Крашнуть",
+  "CRASH_APP": "Крашнуть",
+  "DELETE_USR_PREFS": "Удалить файл с настройками пользователя (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Удалить файл с сочетаниями клавиш (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Удалить данные редактора (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Сгенерировать шаблон файла с сочетаниями клавиш",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Сгенерировать шаблон json-файла с сочетаниями клавиш",
+  "VALIDATE_SHORTCUT_MAP": "Проверить файл с сочетаниями клавиш",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Проверить файл с сочетаниями клавиш",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Пустые ключи: {0}\nНеизвестные команды: {1}",
+  "RESULT": "Итог",
+  "CLEAR_RECENT_DOCUMENTS": "Очистить недавнее",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Очистить список недавно открытых файлов",
+  "OPEN_CMD_DEBUG_WINDOW": "Открыть окно для отладки команд",
+  "PATH_DOES_NOT_EXIST": "Папки или файла {0} не существует.",
+  "LOCATION_DOES_NOT_EXIST": "Неверный путь.",
+  "FILE_NOT_FOUND": "Файл не найден.",
+  "ARE_YOU_SURE": "Точно?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Вы точно хотите удалить {0}? Данные будут стерты из всех установленных версий PixiEditor.\n(Полный путь: {1})",
+  "FAILED_TO_OPEN_FILE": "Не удалось открыть файл",
+  "OLD_FILE_FORMAT": "Файл устаревшего формата",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Этот файл .pixi был создан в старой версии PixiEditor и имеет формат, который больше не поддерживается.",
+  "NOTHING_FOUND": "Ничего не найдено",
+  "EXPORT": "Экспорт",
+  "EXPORT_IMAGE": "Экспорт изображения",
+  "IMPORT": "Импорт",
+  "SHORTCUT_TEMPLATES": "Шаблоны сочетаний клавиш",
+  "RESET_ALL": "Сбросить",
+  "LAYER": "Слои",
+  "LAYER_DELETE_SELECTED": "Удалить активный слой/папку",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Удалить активный слой или папку",
+  "LAYER_DELETE_ALL_SELECTED": "Удалить все выбранные слои/папки",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Удалить все выбранные слои и/или папки",
+  "DELETE_SELECTED_PIXELS": "Очистить выделенную область",
+  "NEW_FOLDER": "Новая папка",
+  "CREATE_NEW_FOLDER": "Создать новую папку",
+  "NEW_LAYER": "Новый слой",
+  "CREATE_NEW_LAYER": "Создать новый слой",
+  "NEW_IMAGE": "Новый файл",
+  "CREATE_NEW_IMAGE": "Создать новый файл",
+  "SAVE": "Сохранить",
+  "SAVE_AS": "Сохранить как...",
+  "IMAGE": "Изображение",
+  "SAVE_IMAGE": "Сохранить файл",
+  "SAVE_IMAGE_AS": "Сохранить в новый файл",
+  "DUPLICATE": "Создать дубликат слоя",
+  "DUPLICATE_SELECTED_LAYER": "Дублировать выбранный слой",
+  "CREATE_MASK": "Создать маску",
+  "DELETE_MASK": "Удалить маску",
+  "TOGGLE_MASK": "Вкл/выкл маску",
+  "APPLY_MASK": "Применить маску",
+  "TOGGLE_VISIBILITY": "Вкл/выкл видимость слоя",
+  "MOVE_MEMBER_UP": "Переместить выше",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Переместить выбранные слои или папки выше",
+  "MOVE_MEMBER_DOWN": "Переместить ниже",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Переместить выбранные слои или папки ниже",
+  "MERGE_ALL_SELECTED_LAYERS": "Объединить выбранные слои",
+  "MERGE_WITH_ABOVE": "Объединить со слоем выше",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Объединить выбранный слой со слоем выше от него",
+  "MERGE_WITH_BELOW": "Объединить со слоем ниже",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Объединить выбранный слой со слоем ниже от него",
+  "ADD_REFERENCE_LAYER": "Добавить референс",
+  "DELETE_REFERENCE_LAYER": "Удалить референс",
+  "TRANSFORM_REFERENCE_LAYER": "Трансформировать референс",
+  "TOGGLE_REFERENCE_LAYER_POS": "Изменить позицию референса",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Переключение между двумя положениями референса: поверх рисунка и ниже рисунка",
+  "RESET_REFERENCE_LAYER_POS": "Сбросить положение референса",
+  "CLIP_CANVAS": "Обрезать прозрачные края",
+  "FLIP_IMG_VERTICALLY": "Отразить по вертикали",
+  "FLIP_IMG_HORIZONTALLY": "Отразить по горизонтали",
+  "FLIP_LAYERS_VERTICALLY": "Отразить выбранные слои по вертикали",
+  "FLIP_LAYERS_HORIZONTALLY": "Отразить выбранные слои по горизонтали",
+  "ROT_IMG_90": "Повернуть холст на 90 градусов",
+  "ROT_IMG_180": "Повернуть холст на 180 градусов",
+  "ROT_IMG_-90": "Повернуть холст на -90 градусов",
+  "ROT_LAYERS_90": "Повернуть выбранные слои на 90 градусов",
+  "ROT_LAYERS_180": "Повернуть выбранные слои на 180 градусов",
+  "ROT_LAYERS_-90": "Повернуть выбранные слои на -90 градусов",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Вкл/выкл вертикальную ось симметрии",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Вкл/выкл горизонтальную ось симметрии",
+  "DELETE_PIXELS": "Очистить",
+  "DELETE_PIXELS_DESCRIPTIVE": "Очистить выделенную область",
+  "RESIZE_DOCUMENT": "Изменить размер изображения",
+  "RESIZE_CANVAS": "Изменить размер холста",
+  "CENTER_CONTENT": "Выровнять содержимое по центру",
+  "CUT": "Вырезать",
+  "CUT_DESCRIPTIVE": "Вырезать выбранную область или слои",
+  "PASTE": "Вставить",
+  "PASTE_DESCRIPTIVE": "Вставить из буфера обмена",
+  "PASTE_AS_NEW_LAYER": "Вставить в новый слой",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Вставить изображение из буфера обмена в новый слой",
+  "PASTE_REFERENCE_LAYER": "Вставить референс",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Вставить изображение-референс из буфера обмена",
+  "PASTE_COLOR": "Вставить цвет",
+  "PASTE_COLOR_DESCRIPTIVE": "Вставить HEX-код цвета из буфера обмена",
+  "PASTE_COLOR_SECONDARY": "Вставить цвет как дополнительный",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Вставить HEX-код цвета из буфера обмена как дополнительный цвет",
+  "CLIPBOARD": "Буфер обмена",
+  "COPY": "Копировать",
+  "COPY_DESCRIPTIVE": "Копировать в буфер обмена",
+  "COPY_COLOR_HEX": "Копировать основной цвет (HEX-код)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Копировать HEX-код основного цвета",
+  "COPY_COLOR_RGB": "Копировать основной цвет (RBG)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Копировать RGB-код основного цвета",
+  "COPY_COLOR_SECONDARY_HEX": "Копировать дополнительный цвет (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Копировать HEX-код дополнительного цвета",
+  "COPY_COLOR_SECONDARY_RGB": "Копировать дополнительный цвет (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Копировать RGB-код дополнительного цвета",
+  "PALETTE_COLORS": "Цвета палитры",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Перекрасить области дополнительного цвета в основной",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Выбирает на картинке все пиксели дополнительного цвета, и перекрашивает их в основной цвет",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Перекрасить области основного цвета в дополнительный",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Выбирает на картинке все пиксели основного цвета, и перекрашивает их в дополнительный цвет",
+  "OPEN_PALETTE_BROWSER": "Открыть библиотеку палитр",
+  "OVERWRITE_PALETTE_CONSENT": "Палитра с именем '{0}' уже существует, перезаписать?",
+  "PALETTE_EXISTS": "Такая палитра уже есть",
+  "REPLACE_PALETTE_CONSENT": "Заменить текущую палитру выбранной?",
+  "REPLACE_PALETTE": "Заменить палитру",
+  "SELECT_COLOR_1": "Выбрать цвет 1",
+  "SELECT_COLOR_2": "Выбрать цвет 2",
+  "SELECT_COLOR_3": "Выбрать цвет 3",
+  "SELECT_COLOR_4": "Выбрать цвет 4",
+  "SELECT_COLOR_5": "Выбрать цвет 5",
+  "SELECT_COLOR_6": "Выбрать цвет 6",
+  "SELECT_COLOR_7": "Выбрать цвет 7",
+  "SELECT_COLOR_8": "Выбрать цвет 8",
+  "SELECT_COLOR_9": "Выбрать цвет 9",
+  "SELECT_COLOR_10": "Выбрать цвет 10",
+  "SELECT_TOOL": "Выбрать инструмент \"{0}\"",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Взять первый цвет из палитры",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Взять второй цвет из палитры",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Взять третий цвет из палитры",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Взять четвертый цвет из палитры",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Взять пятый цвет из палитры",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Взять шестой цвет из палитры",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Взять седьмой цвет из палитры",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Взять восьмой цвет из палитры",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Взять девятый цвет из палитры",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Взять десятый цвет из палитры",
+  "SWAP_COLORS": "Поменять цвета местами",
+  "SWAP_COLORS_DESCRIPTIVE": "Меняет местами основной и дополнительный цвета",
+  "SEARCH": "Поиск",
+  "COMMAND_SEARCH": "Поиск действий",
+  "OPEN_COMMAND_SEARCH": "Открыть окно поиска действий",
+  "SELECT": "Выделение",
+  "DESELECT": "Снять выделение",
+  "INVERT": "Инвертировать выделение",
+  "SELECTION": "Выделение",
+  "SELECT_ALL": "Выделить всё",
+  "SELECT_ALL_DESCRIPTIVE": "Выделить весь холст",
+  "CLEAR_SELECTION": "Снять выделение",
+  "INVERT_SELECTION": "Инвертировать выделение",
+  "INVERT_SELECTION_DESCRIPTIVE": "Инвертировать выделенную область",
+  "TRANSFORM_SELECTED_AREA": "Трансформировать выбранную область",
+  "NUDGE_SELECTED_LEFT": "Сдвинуть выделение влево",
+  "NUDGE_SELECTED_RIGHT": "Сдвинуть выделение вправо",
+  "NUDGE_SELECTED_UP": "Сдвинуть выделение вверх",
+  "NUDGE_SELECTED_DOWN": "Сдвинуть выделение вниз",
+  "MASK_FROM_SELECTION": "Создать маску из выделения",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Создать маску из выделения",
+  "ADD_SELECTION_TO_MASK": "Добавить выделение к маске",
+  "SUBTRACT_SELECTION_FROM_MASK": "Вычесть выделение из маски",
+  "INTERSECT_SELECTION_MASK": "Пересечь выделение с маской",
+  "SELECTION_TO_MASK": "Выделение в маску...",
+  "TO_NEW_MASK": "создать маску",
+  "ADD_TO_MASK": "добавить к маске",
+  "SUBTRACT_FROM_MASK": "вычесть из маски",
+  "INTERSECT_WITH_MASK": "пересечь с маской",
+  "STYLUS": "Перо",
+  "TOGGLE_PEN_MODE": "Включить/выключить режим пера",
+  "UNDO": "Отменить",
+  "UNDO_DESCRIPTIVE": "Отменить последнее действие",
+  "REDO": "Вернуть",
+  "REDO_DESCRIPTIVE": "Вернуть последнее действие",
+  "WINDOWS": "Окна",
+  "TOGGLE_GRIDLINES": "Отобразить/скрыть сетку",
+  "ZOOM_IN": "Приблизить",
+  "ZOOM_OUT": "Отдалить",
+  "NEW_WINDOW_FOR_IMG": "Новое окно для данного изображения",
+  "CENTER_ACTIVE_VIEWPORT": "Центрировать область просмотра",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Отразить область просмотра по горизонтали",
+  "FLIP_VIEWPORT_VERTICALLY": "Отразить область просмотра по вертикали",
+  "SETTINGS": "Настройки",
+  "OPEN_SETTINGS": "Открыть настройки",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Открыть окно настроек",
+  "OPEN_STARTUP_WINDOW": "Открыть окно запуска",
+  "OPEN_SHORTCUT_WINDOW": "Открыть окно сочетаний клавиш",
+  "OPEN_ABOUT_WINDOW": "Открыть окно \"о программе\"",
+  "OPEN_NAVIGATION_WINDOW": "Открыть окно навигации",
+  "ERROR": "Ошибка",
+  "INTERNAL_ERROR": "Внутренняя ошибка",
+  "ERROR_SAVE_LOCATION": "Невозможно сохранить файл в выбранную папку",
+  "ERROR_WHILE_SAVING": "Произошла внутренняя ошибка при сохранении. Пожалуйста, попробуйте заново.",
+  "UNKNOWN_ERROR_SAVING": "Произошла ошибка при сохранении.",
+  "FAILED_ASSOCIATE_LOSPEC": "Не удалось связать протокол Lospec Palette.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Задонатить",
+  "YES": "Да",
+  "NO": "Нет",
+  "CANCEL": "Отмена",
+  "UNNAMED": "Безымянный",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Открыть окно отладки команд",
+  "DELETE": "Удалить",
+  "USER_PREFS": "Предпочтения пользователя (Локальные)",
+  "SHORTCUT_FILE": "Сочетания клавиш (Локальные)",
+  "EDITOR_DATA": "Данные редактора (Локальные)",
+  "MOVE_VIEWPORT_TOOLTIP": "Передвигает область просмотра.",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Нажмите и двигайте чтобы изменить область просмотра",
+  "MOVE_TOOL_TOOLTIP": "Двигает выделенные пиксели ({0}). Удерживайте Ctrl чтобы двигать все слои.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Удерживайте мышь чтобы двигать выделенные пиксели. Удерживайте Ctrl чтобы двигать все слои.",
+  "PEN_TOOL_TOOLTIP": "Карандаш. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Нажмите и двигайте чтобы рисовать.",
+  "PIXEL_PERFECT_SETTING": "Сглаживание зубчатости",
+  "RECTANGLE_TOOL_TOOLTIP": "Рисуйте прямоугольники на холсте ({0}). Удерживайте Shift чтобы нарисовать квадрат.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте чтобы нарисовать прямоугольник. Удерживайте Shift чтобы нарисовать квадрат.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Нажмите и двигайте чтобы нарисовать квадрат.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Оставлять изначальное изображение",
+  "ROTATE_VIEWPORT_TOOLTIP": "Вращает область просмотра. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Нажмите и двигайте чтобы повернуть область просмотра",
+  "SELECT_TOOL_TOOLTIP": "Выделяет область. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте чтобы выделить область. Удерживайте Shift чтобы добавить к выделенной области. Удерживайте Ctrl чтобы вычесть из выделенной области.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Нажмите и двигайте чтобы добавить к выделенной области.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Нажмите и двигайте чтобы вычесть из выделенной области.",
+  "ZOOM_TOOL_TOOLTIP": "Изменяет масштаб области просмотра ({0}). Нажмите чтобы приблизить, удерживайте alt и нажмите чтобы отдалить.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте чтобы изменить масштаб. Нажмите чтобы приблизить, удерживайте alt и нажмите чтобы отдалить.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Нажмите и двигайте изменить масштаб. Нажмите чтобы отдалить, отпустите ctrl и нажмите чтобы приблизить.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Делает пиксели более светлыми или тёмными ({0}). Удерживайте Ctrl для затемнения.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Рисуйте на пикселях чтобы сделать их ярче. Удерживайте Ctrl чтобы сделать их темнее.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Рисуйте на пикселях чтобы сделать их темнее. Отпустите Ctrl чтобы сделать их светлее.",
+  "COLOR_PICKER_TOOLTIP": "Берёт главный цвет с холста. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Нажмите чтобы взять цвет. Удерживайте Ctrl чтобы спрятать холст. Удерживайте Shift чтобы спрятать слой референса",
+  "ELLIPSE_TOOL_TOOLTIP": "Рисует эллипс на холсте({0}). Удерживайте Shift чтобы нарисовать круг.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте мышью чтобы нарисовать эллипс. Удерживайте Shift чтобы нарисовать круг.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Нажмите и двигайте мышью чтобы нарисовать круг.",
+  "ERASER_TOOL_TOOLTIP": "Стирает пиксели. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Нажмите и двигайте чтобы стереть.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Заполняет область цветом. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите на область чтобы заполнить её. Удерживайте Ctrl чтобы заполнить все слои.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Нажмите на область чтобы заполнить её. Отпустите Ctrl чтобы выбрать один слой.",
+  "LASSO_TOOL_TOOLTIP": "Лассо. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте чтобы выделить пиксели внутри лассо. Удерживайте Shift чтобы добавить их в выделенной области. Удерживайте Ctrl чтобы убрать из выделенной области.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Нажмите и двигайте чтобы добавить пиксели внутри лассо к выделенной области.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Нажмите и двигайте чтобы убрать пиксели внутри лассо из выделенной области.",
+  "LINE_TOOL_TOOLTIP": "Рисует линии на холсте ({0}). Удерживайте Shift чтобы включить привязку.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Нажмите и двигайте чтобы нарисовать линию. Удерживайте Shift чтобы включить привязку.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Нажмите и двигайте мышь чтобы нарисовать линию с привязкой.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Волшебная палочка ({0}). Выделяет область.",
+  "MAGIC_WAND_ACTION_DISPLAY": "Нажмите чтобы выделить область.",
+  "PEN_TOOL": "Карандаш",
+  "BRIGHTNESS_TOOL": "Яркость",
+  "COLOR_PICKER_TOOL": "Пипетка",
+  "ELLIPSE_TOOL": "Эллипс",
+  "ERASER_TOOL": "Ластик",
+  "FLOOD_FILL_TOOL": "Заливка",
+  "LASSO_TOOL": "Лассо",
+  "LINE_TOOL": "Линия",
+  "MAGIC_WAND_TOOL": "Волшебная Палочка",
+  "MOVE_TOOL": "Передвинуть",
+  "MOVE_VIEWPORT_TOOL": "Передвинуть область просмотра",
+  "RECTANGLE_TOOL": "Прямоугольник",
+  "ROTATE_VIEWPORT_TOOL": "Повернуть область просмотра",
+  "SELECT_TOOL_NAME": "Выбрать",
+  "ZOOM_TOOL": "Масштаб",
+  "SHAPE_LABEL": "Форма",
+  "MODE_LABEL": "Режим",
+  "SCOPE_LABEL": "Выделение",
+  "FILL_SHAPE_LABEL": "Заливка",
+  "FILL_COLOR_LABEL": "Цвет заливки",
+  "TOOL_SIZE_LABEL": "Размер",
+  "STRENGTH_LABEL": "Сила",
+  "NEW": "Новое",
+  "ADD": "Добавить",
+  "SUBTRACT": "Убрать",
+  "INTERSECT": "Пересечение",
+  "RECTANGLE": "Прямоугольник",
+  "CIRCLE": "Круг",
+  "ABOUT": "О программе",
+  "MINIMIZE": "Свернуть",
+  "RESTORE": "Свернуть в окно",
+  "MAXIMIZE": "Развернуть",
+  "CLOSE": "Закрыть",
+  "EXPORT_SIZE_HINT": "Если хотите поделиться изображением, попробуйте {0}% для лучшего качества",
+  "CREATE": "Создать",
+  "BASE_LAYER_NAME": "Основной слой",
+  "ENABLE_MASK": "Включить маску",
+  "SELECTED_AREA_EMPTY": "Выбранная область пуста",
+  "NOTHING_TO_COPY": "Нечего копировать",
+  "REFERENCE_LAYER_PATH": "Путь к референс слою",
+  "FLIP": "Отразить",
+  "ROTATION": "Поворот",
+  "ROT_IMG_90_D": "Повернуть изображение на 90°",
+  "ROT_IMG_180_D": "Повернуть изображение на 180°",
+  "ROT_IMG_-90_D": "Повернуть изображение на -90°",
+  "ROT_LAYERS_90_D": "Повернуть выделенные слои на 90°",
+  "ROT_LAYERS_180_D": "Повернуть выделенные слои на 180°",
+  "ROT_LAYERS_-90_D": "Повернуть выделенные слои на -90°",
+  "UNNAMED_PALETTE": "Безымянная палитра",
+  "CLICK_SELECT_PRIMARY": "Нажмите чтобы выбрать как главный цвет.",
+  "PEN_MODE": "Режим пера",
+  "VIEW": "Просмотр",
+  "HORIZONTAL_LINE_SYMMETRY": "Горизонтальная ось симметрии",
+  "VERTICAL_LINE_SYMMETRY": "Вертикальная ось симметрии",
+  "COLOR_PICKER_TITLE": "Выбор цвета",
+  "COLOR_SLIDERS_TITLE": "Ползунки цвета",
+  "PALETTE_TITLE": "Палитра",
+  "SWATCHES_TITLE": "Образцы",
+  "LAYERS_TITLE": "Слои",
+  "NAVIGATION_TITLE": "Навигация",
+  "NORMAL_BLEND_MODE": "Нормальный",
+  "DARKEN_BLEND_MODE": "Затемнение",
+  "MULTIPLY_BLEND_MODE": "Умножение",
+  "COLOR_BURN_BLEND_MODE": "Затемнение основы",
+  "LIGHTEN_BLEND_MODE": "Замена светлым",
+  "SCREEN_BLEND_MODE": "Экран",
+  "COLOR_DODGE_BLEND_MODE": "Осветление основы",
+  "OVERLAY_BLEND_MODE": "Перекрытие",
+  "SOFT_LIGHT_BLEND_MODE": "Мягкий свет",
+  "HARD_LIGHT_BLEND_MODE": "Жесткий свет",
+  "DIFFERENCE_BLEND_MODE": "Разница",
+  "EXCLUSION_BLEND_MODE": "Исключение",
+  "HUE_BLEND_MODE": "Цветовой тон",
+  "SATURATION_BLEND_MODE": "Насыщенность",
+  "LUMINOSITY_BLEND_MODE": "Яркость",
+  "COLOR_BLEND_MODE": "Цветность",
+  "NOT_SUPPORTED_BLEND_MODE": "Не поддерживается",
+  "RESTART": "Перезапустите",
+  "SORT_BY": "Сортировать по",
+  "NAME": "Название",
+  "COLORS": "Цвета",
+  "DEFAULT": "Умолчанию",
+  "ALPHABETICAL": "Алфавиту",
+  "COLOR_COUNT": "Количеству цветов",
+  "ANY": "Не важно",
+  "MAX": "Больше",
+  "MIN": "Меньше",
+  "EXACT": "Ровно",
+  "ASCENDING": "Возрастание",
+  "DESCENDING": "Убывание",
+  "NAME_IS_TOO_LONG": "Имя слишком длинное",
+  "STOP_IT_TEXT1": "Достаточно. Разберись со своими названиями палитр.",
+  "STOP_IT_TEXT2": "чел.",
+  "REPLACER_TOOLTIP": "Нажмите ПКМ на цвете в палитре и выберите 'Заметить' или перетащите его сюда.",
+  "CLICK_TO_CHOOSE_COLOR": "Нажмите чтобы выбрать цвет",
+  "REPLACE_COLOR": "Заменить цвет",
+  "PALETTE_COLOR_TOOLTIP": "Нажмите чтобы выбрать как главный цвет. перетащите на другой цвет палитры чтобы поменять их местами.",
+  "ADD_FROM_SWATCHES": "Добавить из образцов",
+  "ADD_COLOR_TO_PALETTE": "Добавить цвет к палитре",
+  "USE_IN_CURRENT_IMAGE": "Использовать в данном изображении",
+  "ADD_TO_FAVORITES": "Добавить в избранное",
+  "BROWSE_PALETTES": "Смотреть палитры",
+  "LOAD_PALETTE": "Загрузить палитру",
+  "SAVE_PALETTE": "Сохранить палитру",
+  "FAVORITES": "Избранное",
+  "ADD_FROM_CURRENT_PALETTE": "Добавить из текущей палитры",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Открыть папку палитр",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Открыть палитры на Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "Импортировать из файла",
+  "TOP_LEFT": "Вверху слева",
+  "TOP_CENTER": "Вверху по центру",
+  "TOP_RIGHT": "Вверху справа",
+  "MIDDLE_LEFT": "Середина слева",
+  "MIDDLE_CENTER": "Середина по центру",
+  "MIDDLE_RIGHT": "Середина справа",
+  "BOTTOM_LEFT": "Снизу слева",
+  "BOTTOM_CENTER": "Снизу по центру",
+  "BOTTOM_RIGHT": "Снизу справа",
+  "CLIP_TO_BELOW": "Обтравочная маска",
+  "MOVE_UPWARDS": "Подвинуть вверх",
+  "MOVE_DOWNWARDS": "Подвинуть вниз",
+  "MERGE_SELECTED": "Объединить выделенные",
+  "LOCK_TRANSPARENCY": "Заблокировать прозрачность",
+  "COULD_NOT_LOAD_PALETTE": "Невозможно загрузить палитры",
+  "NO_PALETTES_FOUND": "Палитры не найдены.",
+  "LOSPEC_LINK_TEXT": "Слышал, тут можно найти палитры: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Палитры",
+  "DELETE_PALETTE_CONFIRMATION": "Вы уверены что хотите удалить это изображение? Это действие необратимо.",
+  "SHORTCUTS_IMPORTED": "Сочетания клавиш были успешно импортированы из {0}.",
+  "SHORTCUT_PROVIDER_DETECTED": "Мы заметили что у вас установлен {0}. Хотите импортировать сочетания клавиш оттуда?",
+  "IMPORT_FROM_INSTALLATION": "Импортировать из другой программы",
+  "IMPORT_INSTALLATION_OPTION1": "Импортировать",
+  "IMPORT_INSTALLATION_OPTION2": "Использовать стандартные",
+  "IMPORT_FROM_TEMPLATE": "Импортировать из шаблона",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Сочетания клавиш были успешно импортированы.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Вы уверены что хотите сбросить все сочетания клавиш?",
+  "SUCCESS": "Успех",
+  "WARNING": "Внимание",
+  "ERROR_IMPORTING_IMAGE": "Произошла ошибка при импорте изображения.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Повреждённый путь к сочетаниям клавиш",
+  "SHORTCUTS_CORRUPTED": "Не удалось загрузить сочетания клавиш из файла. Был произведен сброс к стандартным.",
+  "FAILED_DOWNLOAD_PALETTE": "Ошибка при скачивании палитры",
+  "FILE_INCORRECT_FORMAT": "Файл был в некорректном формате",
+  "INVALID_FILE": "Некорректный файл",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "Неправильный формат файла сочетаний клавиш",
+  "UNSUPPORTED_FILE_FORMAT": "Этот тип файла не поддерживается",
+  "ALREADY_ASSIGNED": "Уже присвоен",
+  "REPLACE": "Заменить",
+  "SWAP": "Поменять местами",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Это сочетание клавиш уже присвоен к '{0}'\nХотите заменить существующее сочетание или поменять их местами?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Это сочетание клавиш уже присвоен к '{0}'\nХотите заменить существующее сочетание?",
+  "UNSAVED_CHANGES": "Несохранённые изменения",
+  "DOCUMENT_MODIFIED_SAVE": "Этот файл был изменён. Вы хотите сохранить изменения?",
+  "SESSION_UNSAVED_DATA": "В {0} есть несохранённые данные. Вы уверены?",
+  "PROJECT_MAINTAINERS": "Авторы проекта",
+  "OTHER_AWESOME_CONTRIBUTORS": "И другие участники проекта",
+  "HELP": "Помощь",
+  "STOP_IT_TEXT3": "НЕНАДО ДЯДЯ",
+  "STOP_IT_TEXT4": "sans undertale reference omg so cool",
+  "LINEAR_DODGE_BLEND_MODE": "Линейный осветлитель (добавить)",
+  "PRESS_ANY_KEY": "Нажмите любую клавишу",
+  "NONE_SHORTCUT": "Ничего",
+  "REFERENCE": "Референс",
+  "PUT_REFERENCE_LAYER_ABOVE": "Показать слой референса",
+  "PUT_REFERENCE_LAYER_BELOW": "Спрятать слой референса",
+  "TOGGLE_VERTICAL_SYMMETRY": "Переключить вертикальную ось симметрии",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Переключить горизонтальную ось симметрии",
+  "RESET_VIEWPORT": "Сбросить область просмотра",
+  "VIEWPORT_SETTINGS": "Настройки области просмотра",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Нажмите и двигайте мышь чтобы двигать пиксели в выбранных слоях.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Удерживайте мышь чтобы подвинуть все слои.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Переименовать",
+  "PIXEL_UNIT": "пикс",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Открыть окно отладки локализации",
+  "FORCE_OTHER_FLOW_DIRECTION": "Инвертировать направление письма",
+  "API_KEY": "Ключ API",
+  "LOCALIZATION_VIEW_TYPE": "Отображение локализации",
+  "LOAD_LANGUAGE_FROM_FILE": "Загрузить язык из файла",
+  "LOG_IN": "Войти",
+  "SYNC": "Синхронизировать",
+  "NOT_LOGGED_IN": "Не авторизован",
+  "POE_EDITOR_ERROR": "Ошибка POEditor: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "Ошибка HTTP: {0} {1}",
+  "LOGGED_IN": "Авторизован",
+  "SYNCED_SUCCESSFULLY": "Успешная синхронизация",
+  "EXCEPTION_ERROR": "Исключение: {0}",
+  "DROP_PALETTE": "Перетащите палитру сюда",
+  "SECURITY_ERROR": "Ошибка безопасности",
+  "SECURITY_ERROR_MSG": "Отсутствуют права для записи в данной локации.",
+  "IO_ERROR": "Ошибка IO",
+  "IO_ERROR_MSG": "Ошибка записи на диск.",
+  "FAILED_ASSOCIATE_PIXI": "Не удалось связать расширение файлов .pixi с PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Произошла ошибка при сохранении палитры.",
+  "NO_COLORS_TO_SAVE": "Нет цветов для сохранения.",
+  "ALL_LAYERS": "Все слои",
+  "SINGLE_LAYER": "Один слой",
+  "CHOOSE": "Выбрать",
+  "REMOVE": "Убрать",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "Файл не в формате \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "Файл содержит недействительные сочетания клавиш",
+  "FILE_EXTENSION_NOT_SUPPORTED": "Файлы типа '{0}' не поддерживаются",
+  "ERROR_READING_FILE": "Ошибка при чтении файла",
+  "DISCARD_PALETTE": "Очистить палитру",
+  "DISCARD_PALETTE_CONFIRMATION": "Вы уверены что вы хотите очистить палитру? Это действие необратимо.",
+  "IMPORT_AS_NEW_LAYER": "Импортировать как новый слой",
+  "PASTE_AS_PRIMARY_COLOR": "Вставить как главный цвет",
+  "IMPORT_AS_NEW_FILE": "Импортировать как новый файл",
+  "IMPORT_PALETTE_FILE": "Импортировать файл палитры",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Импортировать цвета в палитру",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Импортировать цвет в палитру",
+  "IMPORT_AS_REFERENCE_LAYER": "Импортировать как слой референса",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "ПКМ чтобы взять цвет, Shift + ПКМ чтобы скопировать цвет в буфер обмена",
+  "OPEN_FILE_FROM_CLIPBOARD": "Открыть из буфера обмена",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Открыть из буфера обмена",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Downloading language failed.\nAPI Key might have been overused.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Localization data path not found",
+  "APPLY": "Apply",
+  "UPDATE_SOURCE": "Update source",
+  "COPY_TO_CLIPBOARD": "Copy to clipboard",
+  "LANGUAGE_FILE_NOT_FOUND": "Language file not found.\nLooking for {0}",
+  "PROJECT_ROOT_NOT_FOUND": "PixiEditor Project root not found.\nLooking for PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Localization folder not found.\nLooking for /Data/Localization",
+  "SELECT_A_LANGUAGE": "Select a language",
+  "DONE": "Done",
+  "SOURCE_UNSET_OR_MISSING": "Source missing/unset",
+  "SOURCE_NEWER": "Source newer",
+  "SOURCE_UP_TO_DATE": "Source is up to date",
+  "SOURCE_OLDER": "Cloud newer",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

+ 562 - 0
src/PixiEditor/Data/Localization/Languages/uk.json

@@ -1,2 +1,564 @@
 {
+  "RECENT_FILES": "Недавні файли",
+  "OPEN_FILE": "Відкрити файл",
+  "NEW_FILE": "Новий",
+  "RECENT_EMPTY_TEXT": "Так багато порожнього місця",
+  "LANGUAGE": "Мова",
+  "GENERAL": "Головна",
+  "DISCORD": "Discord",
+  "KEY_BINDINGS": "Прив'язки клавіш",
+  "MISC": "Різне",
+  "SHOW_STARTUP_WINDOW": "Показати вікно запуску",
+  "SHOW_IMAGE_PREVIEW_TASKBAR": "Показати попередній перегляд зображення на панелі завдань",
+  "RECENT_FILE_LENGTH": "Довжина списку останніх файлів",
+  "RECENT_FILE_LENGTH_TOOLTIP": "Скільки документів показано в розділі «Файл» > «Останні». Типове значення: 8",
+  "DEFAULT_NEW_SIZE": "Новий розмір файлу за замовчуванням",
+  "WIDTH": "Ширина",
+  "HEIGHT": "Висота",
+  "TOOLS": "Інструменти",
+  "ENABLE_SHARED_TOOLBAR": "Увімкнути спільну панель інструментів",
+  "AUTOMATIC_UPDATES": "Автооновлення",
+  "CHECK_FOR_UPDATES": "Перевіряти оновлення під час запуску",
+  "UPDATE_STREAM": "Канал оновлення",
+  "UPDATE_CHANNEL_HELP_TOOLTIP": "Канали оновлення можна змінити лише в автономній версії (що завантажена з https://pixieditor.net).\nВерсії для Steam і Microsoft Store оновлюються іншим чином.",
+  "DEBUG": "Налагодження",
+  "ENABLE_DEBUG_MODE": "Увімкнути режим налагодження",
+  "OPEN_CRASH_REPORTS_DIR": "Відкрити каталог звітів про збої",
+  "DISCORD_RICH_PRESENCE": "Rich Presence",
+  "ENABLED": "Увімкнено",
+  "SHOW_IMAGE_NAME": "Показати назву зображення",
+  "SHOW_IMAGE_SIZE": "Показати розмір зображення",
+  "SHOW_LAYER_COUNT": "Показати кількість шарів",
+  "FILE": "Файл",
+  "RECENT": "Останні",
+  "OPEN": "Відкрити",
+  "SAVE_PIXI": "Зберегти (.pixi)",
+  "SAVE_AS_PIXI": "Зберегти як... (.pixi)",
+  "EXPORT_IMG": "Експортувати (.png, .jpg, etc.)",
+  "EDIT": "Редагувати",
+  "EXIT": "Вийти",
+  "PERCENTAGE": "У відсотках",
+  "ABSOLUTE": "Абсолютне значення",
+  "PRESERVE_ASPECT_RATIO": "Зберегти співвідношення сторін",
+  "ANCHOR_POINT": "Точка прив’язки",
+  "RESIZE_IMAGE": "Змінити розмір зображення",
+  "RESIZE": "Змінити розмір",
+  "DOCUMENTATION": "Документація",
+  "WEBSITE": "Веб-сайт",
+  "OPEN_WEBSITE": "Відкрити веб-сайт",
+  "REPOSITORY": "Репозиторій",
+  "OPEN_REPOSITORY": "Відкрити репозиторій",
+  "LICENSE": "Ліцензія",
+  "OPEN_LICENSE": "Відкрити ліцензію",
+  "THIRD_PARTY_LICENSES": "Ліцензії третіх осіб",
+  "OPEN_THIRD_PARTY_LICENSES": "Відкрити ліцензії третіх осіб",
+  "APPLY_TRANSFORM": "Застосувати трансформацію",
+  "INCREASE_TOOL_SIZE": "Збільшити розмір інструменту",
+  "DECREASE_TOOL_SIZE": "Зменшити розмір інструменту",
+  "TO_INSTALL_UPDATE": "для встановлення оновлення {0}",
+  "DOWNLOADING_UPDATE": "Завантаження оновлення...",
+  "UPDATE_READY": "Оновлення готове до встановлення. Ви хочете встановити його зараз?",
+  "NEW_UPDATE": "Нове оновлення",
+  "COULD_NOT_UPDATE_WITHOUT_ADMIN": "Не вдалося оновити без прав адміністратора. Запустіть PixiEditor від імені адміністратора.",
+  "INSUFFICIENT_PERMISSIONS": "Недостатньо дозволів",
+  "UPDATE_CHECK_FAILED": "Не вдалося перевірити оновлення",
+  "COULD_NOT_CHECK_FOR_UPDATES": "Не вдалося перевірити, чи є доступне оновлення.",
+  "VERSION": "Версія {0}",
+  "OPEN_TEMP_DIR": "Відкрити тимчасовий каталог",
+  "OPEN_LOCAL_APPDATA_DIR": "Відкрити каталог Local AppData",
+  "OPEN_ROAMING_APPDATA_DIR": "Відкрити каталог Roaming AppData",
+  "OPEN_INSTALLATION_DIR": "Відкрити каталог встановлення",
+  "DUMP_ALL_COMMANDS": "Скинути всі команди",
+  "DUMP_ALL_COMMANDS_DESCRIPTIVE": "Скинути всі команди до текстового файлу",
+  "CRASH": "Збій",
+  "CRASH_APP": "Збій програми",
+  "DELETE_USR_PREFS": "Видалити налаштування користувача (Roaming AppData)",
+  "DELETE_SHORTCUT_FILE": "Видалити файл комбінацій клавіш (Roaming AppData)",
+  "DELETE_EDITOR_DATA": "Видалити дані редактора (Local AppData)",
+  "GENERATE_KEY_BINDINGS_TEMPLATE": "Створити шаблон прив'язки клавіш",
+  "GENERATE_KEY_BINDINGS_TEMPLATE_DESCRIPTIVE": "Створити шаблон json прив’язки клавіш",
+  "VALIDATE_SHORTCUT_MAP": "Перевірити мару комбінацій клавіш",
+  "VALIDATE_SHORTCUT_MAP_DESCRIPTIVE": "Перевірка мапи комбінацій клавіш",
+  "VALIDATION_KEYS_NOTICE_DIALOG": "Порожні ключі: {0}\nНевідомі команди: {1}",
+  "RESULT": "Результат",
+  "CLEAR_RECENT_DOCUMENTS": "Очистити останні документи",
+  "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Очистити нещодавно відкриті документи",
+  "OPEN_CMD_DEBUG_WINDOW": "Відкрити вікно команд налагодження",
+  "PATH_DOES_NOT_EXIST": "{0} не існує.",
+  "LOCATION_DOES_NOT_EXIST": "Розташування не існує.",
+  "FILE_NOT_FOUND": "Файл не знайдено.",
+  "ARE_YOU_SURE": "Ви впевнені?",
+  "ARE_YOU_SURE_PATH_FULL_PATH": "Ви впевнені, що хочете видалити {0}?\nЦі дані буде втрачено для всіх установок.\n(Повний шлях: {1})",
+  "FAILED_TO_OPEN_FILE": "Не вдалося відкрити файл",
+  "OLD_FILE_FORMAT": "Старий формат файлу",
+  "OLD_FILE_FORMAT_DESCRIPTION": "Цей файл .pixi використовує старий формат,\n  який більше не підтримується та не може бути відкритий.",
+  "NOTHING_FOUND": "Нічого не знайдено",
+  "EXPORT": "Експорт",
+  "EXPORT_IMAGE": "Експорт зображення",
+  "IMPORT": "Імпорт",
+  "SHORTCUT_TEMPLATES": "Шаблони комбінацій клавіш",
+  "RESET_ALL": "Скинути все",
+  "LAYER": "Шар",
+  "LAYER_DELETE_SELECTED": "Видалити активний шар/папку",
+  "LAYER_DELETE_SELECTED_DESCRIPTIVE": "Видалити активний шар або папку",
+  "LAYER_DELETE_ALL_SELECTED": "Видалити всі вибрані шари/папки",
+  "LAYER_DELETE_ALL_SELECTED_DESCRIPTIVE": "Видалити всі вибрані шари та/або папки",
+  "DELETE_SELECTED_PIXELS": "Видалити вибрані пікселі",
+  "NEW_FOLDER": "Нова папка",
+  "CREATE_NEW_FOLDER": "Створити нову папку",
+  "NEW_LAYER": "Новий шар",
+  "CREATE_NEW_LAYER": "Створити новий шар",
+  "NEW_IMAGE": "Нове зображення",
+  "CREATE_NEW_IMAGE": "Створити нове зображення",
+  "SAVE": "Зберегти",
+  "SAVE_AS": "Зберегти як...",
+  "IMAGE": "Зображення",
+  "SAVE_IMAGE": "Зберегти зображення",
+  "SAVE_IMAGE_AS": "Зберегти зображення як нове",
+  "DUPLICATE": "Дублікат",
+  "DUPLICATE_SELECTED_LAYER": "Дублювати виділений шар",
+  "CREATE_MASK": "Створити маску",
+  "DELETE_MASK": "Видалити маску",
+  "TOGGLE_MASK": "Перемкнути маску",
+  "APPLY_MASK": "Застосувати маску",
+  "TOGGLE_VISIBILITY": "Перемкнути видимість",
+  "MOVE_MEMBER_UP": "Перемістити вгору",
+  "MOVE_MEMBER_UP_DESCRIPTIVE": "Перемістити вибраний шар або папку вгору",
+  "MOVE_MEMBER_DOWN": "Перемістити вниз",
+  "MOVE_MEMBER_DOWN_DESCRIPTIVE": "Перемістити вибраний шар або папку вниз",
+  "MERGE_ALL_SELECTED_LAYERS": "Об’єднати всі виділені шари",
+  "MERGE_WITH_ABOVE": "Об’єднати вибраний шар із верхнім",
+  "MERGE_WITH_ABOVE_DESCRIPTIVE": "Об’єднати вибраний шар із шаром над ним",
+  "MERGE_WITH_BELOW": "Об’єднати вибраний шар із нижнім",
+  "MERGE_WITH_BELOW_DESCRIPTIVE": "Об’єднати вибраний шар із шаром під ним",
+  "ADD_REFERENCE_LAYER": "Додати опорний шар",
+  "DELETE_REFERENCE_LAYER": "Видалити опорний шар",
+  "TRANSFORM_REFERENCE_LAYER": "Трансформувати опорний шар",
+  "TOGGLE_REFERENCE_LAYER_POS": "Перемкнути положення опорного шару",
+  "TOGGLE_REFERENCE_LAYER_POS_DESCRIPTIVE": "Перемикання опорного шару між верхнім і нижнім",
+  "RESET_REFERENCE_LAYER_POS": "Скинути положення опорного шару",
+  "CLIP_CANVAS": "Обрізати полотно",
+  "FLIP_IMG_VERTICALLY": "Перевернути зображення по вертикалі",
+  "FLIP_IMG_HORIZONTALLY": "Перевернути зображення по горизонталі",
+  "FLIP_LAYERS_VERTICALLY": "Перевернути вибрані шари по вертикалі",
+  "FLIP_LAYERS_HORIZONTALLY": "Перевернути вибрані шари по горизонталі",
+  "ROT_IMG_90": "Повернути зображення на 90 градусів",
+  "ROT_IMG_180": "Повернути зображення на 180 градусів",
+  "ROT_IMG_-90": "Повернути зображення на -90 градусів",
+  "ROT_LAYERS_90": "Повернути виділені шари на 90 градусів",
+  "ROT_LAYERS_180": "Повернути виділені шари на 180 градусів",
+  "ROT_LAYERS_-90": "Повернути виділені шари на -90 градусів",
+  "TOGGLE_VERT_SYMMETRY_AXIS": "Перемкнути вертикальну вісь симетрії",
+  "TOGGLE_HOR_SYMMETRY_AXIS": "Перемкнути горизонтальну вісь симетрії",
+  "DELETE_PIXELS": "Видалити пікселі",
+  "DELETE_PIXELS_DESCRIPTIVE": "Видалити вибрані пікселі",
+  "RESIZE_DOCUMENT": "Змінити розмір документа",
+  "RESIZE_CANVAS": "Змінити розмір полотна",
+  "CENTER_CONTENT": "Центр вмісту",
+  "CUT": "Вирізати",
+  "CUT_DESCRIPTIVE": "Вирізати вибрану область/шари",
+  "PASTE": "Вставити",
+  "PASTE_DESCRIPTIVE": "Вставити вміст буфера обміну",
+  "PASTE_AS_NEW_LAYER": "Вставити як новий шар",
+  "PASTE_AS_NEW_LAYER_DESCRIPTIVE": "Вставити з буфера обміну як новий шар",
+  "PASTE_REFERENCE_LAYER": "Вставити опорний шар",
+  "PASTE_REFERENCE_LAYER_DESCRIPTIVE": "Вставити вміст буфера обміну як опорний шар",
+  "PASTE_COLOR": "Вставити колір",
+  "PASTE_COLOR_DESCRIPTIVE": "Вставити колір із буфера обміну",
+  "PASTE_COLOR_SECONDARY": "Вставте колір як додатковий",
+  "PASTE_COLOR_SECONDARY_DESCRIPTIVE": "Вставити колір із буфера обміну як додатковий колір",
+  "CLIPBOARD": "Буфер обміну",
+  "COPY": "Копіювати",
+  "COPY_DESCRIPTIVE": "Копіювати в буфер обміну",
+  "COPY_COLOR_HEX": "Копіювати основний колір (HEX)",
+  "COPY_COLOR_HEX_DESCRIPTIVE": "Скопіювати основний колір як шістнадцятковий код",
+  "COPY_COLOR_RGB": "Копіювати основний колір (RGB)",
+  "COPY_COLOR_RGB_DESCRIPTIVE": "Копіювати основний колір як код RGB",
+  "COPY_COLOR_SECONDARY_HEX": "Копіювати додатковий колір (HEX)",
+  "COPY_COLOR_SECONDARY_HEX_DESCRIPTIVE": "Скопіювати допоміжний колір як шістнадцятковий код",
+  "COPY_COLOR_SECONDARY_RGB": "Копіювати додатковий колір (RGB)",
+  "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE": "Скопіювати додатковий колір як код RGB",
+  "PALETTE_COLORS": "Палітра кольорів",
+  "REPLACE_SECONDARY_BY_PRIMARY": "Замінити додатковий колір основним",
+  "REPLACE_SECONDARY_BY_PRIMARY_DESCRIPTIVE": "Замінити додатковий колір на основний",
+  "REPLACE_PRIMARY_BY_SECONDARY": "Замінити основний колір додатковим",
+  "REPLACE_PRIMARY_BY_SECONDARY_DESCRIPTIVE": "Замінити основний колір додатковим",
+  "OPEN_PALETTE_BROWSER": "Відкрити браузер палітри",
+  "OVERWRITE_PALETTE_CONSENT": "Палітра '{0}' уже існує, перезаписати її?",
+  "PALETTE_EXISTS": "Палітра вже існує",
+  "REPLACE_PALETTE_CONSENT": "Замінити поточну палітру вибраною?",
+  "REPLACE_PALETTE": "Замінити поточну палітру",
+  "SELECT_COLOR_1": "Виберіть колір 1",
+  "SELECT_COLOR_2": "Виберіть колір 2",
+  "SELECT_COLOR_3": "Виберіть колір 3",
+  "SELECT_COLOR_4": "Виберіть колір 4",
+  "SELECT_COLOR_5": "Виберіть колір 5",
+  "SELECT_COLOR_6": "Виберіть колір 6",
+  "SELECT_COLOR_7": "Виберіть колір 7",
+  "SELECT_COLOR_8": "Виберіть колір 8",
+  "SELECT_COLOR_9": "Виберіть колір 9",
+  "SELECT_COLOR_10": "Виберіть колір 10",
+  "SELECT_TOOL": "Виберіть інструмент {0}",
+  "SELECT_COLOR_1_DESCRIPTIVE": "Виберіть перший колір у палітрі",
+  "SELECT_COLOR_2_DESCRIPTIVE": "Виберіть другий колір у палітрі",
+  "SELECT_COLOR_3_DESCRIPTIVE": "Виберіть третій колір у палітрі",
+  "SELECT_COLOR_4_DESCRIPTIVE": "Виберіть четвертий колір у палітрі",
+  "SELECT_COLOR_5_DESCRIPTIVE": "Виберіть п'ятий колір у палітрі",
+  "SELECT_COLOR_6_DESCRIPTIVE": "Виберіть шостий колір на палітрі",
+  "SELECT_COLOR_7_DESCRIPTIVE": "Виберіть сьомий колір на палітрі",
+  "SELECT_COLOR_8_DESCRIPTIVE": "Виберіть восьмий колір на палітрі",
+  "SELECT_COLOR_9_DESCRIPTIVE": "Виберіть дев'ятий колір на палітрі",
+  "SELECT_COLOR_10_DESCRIPTIVE": "Виберіть десятий колір на палітрі",
+  "SWAP_COLORS": "Поміняти місцями кольори",
+  "SWAP_COLORS_DESCRIPTIVE": "Поміняти основний і додатковий кольори",
+  "SEARCH": "Пошук",
+  "COMMAND_SEARCH": "Пошук команди",
+  "OPEN_COMMAND_SEARCH": "Відкрити вікно пошуку команд",
+  "SELECT": "Обрати",
+  "DESELECT": "Зняти вибір",
+  "INVERT": "Інвертувати",
+  "SELECTION": "Вибране",
+  "SELECT_ALL": "Вибрати все",
+  "SELECT_ALL_DESCRIPTIVE": "Вибрати все",
+  "CLEAR_SELECTION": "Очистити вибір",
+  "INVERT_SELECTION": "Інвертувати виділення",
+  "INVERT_SELECTION_DESCRIPTIVE": "Інвертувати виділену область",
+  "TRANSFORM_SELECTED_AREA": "Трансформувати виділену область",
+  "NUDGE_SELECTED_LEFT": "Зсунути вибраний об’єкт ліворуч",
+  "NUDGE_SELECTED_RIGHT": "Зсунути вибраний об’єкт праворуч",
+  "NUDGE_SELECTED_UP": "Зсунути вибраний об’єкт угору",
+  "NUDGE_SELECTED_DOWN": "Зсунути вибраний об’єкт вниз",
+  "MASK_FROM_SELECTION": "Нова маска з виділення",
+  "MASK_FROM_SELECTION_DESCRIPTIVE": "Виділення до нової маски",
+  "ADD_SELECTION_TO_MASK": "Додати виділення до маски",
+  "SUBTRACT_SELECTION_FROM_MASK": "Відняти виділення від маски",
+  "INTERSECT_SELECTION_MASK": "Перетин виділення маскою",
+  "SELECTION_TO_MASK": "Виділення до маски",
+  "TO_NEW_MASK": "до нової маски",
+  "ADD_TO_MASK": "додати до маски",
+  "SUBTRACT_FROM_MASK": "відняти від маски",
+  "INTERSECT_WITH_MASK": "перетин з маскою",
+  "STYLUS": "Стилус",
+  "TOGGLE_PEN_MODE": "Перемикання режиму пера",
+  "UNDO": "Скасувати",
+  "UNDO_DESCRIPTIVE": "Скасувати останню дію",
+  "REDO": "Повторити",
+  "REDO_DESCRIPTIVE": "Повторити останню дію",
+  "WINDOWS": "Вікна",
+  "TOGGLE_GRIDLINES": "Перемкнути лінії сітки",
+  "ZOOM_IN": "Збільшити масштаб",
+  "ZOOM_OUT": "Зменшити масштаб",
+  "NEW_WINDOW_FOR_IMG": "Нове вікно для поточного зображення",
+  "CENTER_ACTIVE_VIEWPORT": "Центр активного вікна перегляду",
+  "FLIP_VIEWPORT_HORIZONTALLY": "Перевернути вікно перегляду горизонтально",
+  "FLIP_VIEWPORT_VERTICALLY": "Перевернути вікно перегляду вертикально",
+  "SETTINGS": "Налаштування",
+  "OPEN_SETTINGS": "Відкрити налаштування",
+  "OPEN_SETTINGS_DESCRIPTIVE": "Відкрити вікно налаштувань",
+  "OPEN_STARTUP_WINDOW": "Відкрити вікно запуску",
+  "OPEN_SHORTCUT_WINDOW": "Відкрити вікно комбінацій клавіш",
+  "OPEN_ABOUT_WINDOW": "Відкрийте вікно з інформацією",
+  "OPEN_NAVIGATION_WINDOW": "Відкрити вікно навігації",
+  "ERROR": "Помилка",
+  "INTERNAL_ERROR": "Внутрішня помилка",
+  "ERROR_SAVE_LOCATION": "Не вдалося зберегти файл у вказаному розташуванні",
+  "ERROR_WHILE_SAVING": "Під час збереження сталася внутрішня помилка. Будь ласка спробуйте ще раз.",
+  "UNKNOWN_ERROR_SAVING": "Під час збереження сталася помилка.",
+  "FAILED_ASSOCIATE_LOSPEC": "Не вдалося зв’язати протокол Lospec Palette.",
+  "REDDIT": "Reddit",
+  "GITHUB": "GitHub",
+  "YOUTUBE": "YouTube",
+  "DONATE": "Пожертвувати",
+  "YES": "Так",
+  "NO": "Ні",
+  "CANCEL": "Скасувати",
+  "UNNAMED": "Без_назви",
+  "OPEN_COMMAND_DEBUG_WINDOW": "Відкрити вікно команд налагодження",
+  "DELETE": "Видалити",
+  "USER_PREFS": "Налаштування користувача (Roaming)",
+  "SHORTCUT_FILE": "Файл комбінацій клавіш (Roaming)",
+  "EDITOR_DATA": "Дані редактора (Local)",
+  "MOVE_VIEWPORT_TOOLTIP": "Перемістити вікно перегляду. ({0})",
+  "MOVE_VIEWPORT_ACTION_DISPLAY": "Натисніть і перемістіть, щоб панорамувати вікно перегляду",
+  "MOVE_TOOL_TOOLTIP": "Перемістити вибрані пікселі ({0}). Утримуйте Ctrl, щоб перемістити всі шари.",
+  "MOVE_TOOL_ACTION_DISPLAY": "Утримуйте мишу, щоб перемістити вибрані пікселі. Утримуйте Ctrl, щоб перемістити всі шари.",
+  "PEN_TOOL_TOOLTIP": "Перо. ({0})",
+  "PEN_TOOL_ACTION_DISPLAY": "Натисніть і перемістіть, щоб намалювати.",
+  "PIXEL_PERFECT_SETTING": "Ідеальний піксель",
+  "RECTANGLE_TOOL_TOOLTIP": "Малювати прямокутник на полотні ({0}). Утримуйте Shift, щоб намалювати квадрат.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть, щоб намалювати прямокутник. Утримуйте Shift, щоб намалювати квадрат.",
+  "RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT": "Натисніть і перемістіть, щоб намалювати квадрат.",
+  "KEEP_ORIGINAL_IMAGE_SETTING": "Зберегти оригінальне зображення",
+  "ROTATE_VIEWPORT_TOOLTIP": "Поворот вікна перегляду. ({0})",
+  "ROTATE_VIEWPORT_ACTION_DISPLAY": "Натисніть і перемістіть, щоб повернути вікно перегляду",
+  "SELECT_TOOL_TOOLTIP": "Вибирати область. ({0})",
+  "SELECT_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть, щоб вибрати область. Утримуйте Shift, щоб додати до наявного виділення. Утримуйте Ctrl, щоб відняти від нього.",
+  "SELECT_TOOL_ACTION_DISPLAY_SHIFT": "Натисніть і перемістіть, щоб додати до поточного виділення.",
+  "SELECT_TOOL_ACTION_DISPLAY_CTRL": "Натисніть і перемістіть, щоб відняти з поточного виділення.",
+  "ZOOM_TOOL_TOOLTIP": "Масштабування області перегляду ({0}). Натисніть, щоб збільшити, утримуйте клавішу Alt і натисніть, щоб зменшити.",
+  "ZOOM_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть для збільшення. Клацніть, щоб збільшити, утримуйте ctrl і натисніть, щоб зменшити.",
+  "ZOOM_TOOL_ACTION_DISPLAY_CTRL": "Натисніть і перемістіть для збільшення. Клацніть, щоб зменшити, відпустіть ctrl і натисніть, щоб збільшити.",
+  "BRIGHTNESS_TOOL_TOOLTIP": "Робить пікселі яскравішими або темнішими ({0}). Утримуйте Ctrl, щоб зробити пікселі темнішими.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_DEFAULT": "Малюйте на пікселях, щоб зробити їх яскравішими. Утримуйте Ctrl, щоб затемнити.",
+  "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Малюйте на пікселях, щоб зробити їх темнішими. Відпустіть Ctrl, щоб зробити яскравішими.",
+  "COLOR_PICKER_TOOLTIP": "Вибір основного кольору з полотна. ({0})",
+  "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Натисніть, щоб вибрати кольори. Утримуйте Ctrl, щоб приховати полотно. Утримуйте Shift, щоб приховати опорний шар",
+  "ELLIPSE_TOOL_TOOLTIP": "Малювати еліпс на полотні ({0}). Утримуйте Shift, щоб намалювати коло.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть мишу, щоб намалювати еліпс. Утримуйте Shift, щоб намалювати коло.",
+  "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Натисніть і перемістіть мишу, щоб намалювати коло.",
+  "ERASER_TOOL_TOOLTIP": "Гумки забарвлюють з пікселя. ({0})",
+  "ERASER_TOOL_ACTION_DISPLAY": "Натисніть і перемістіть, щоб стерти.",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Заповнити область кольором. ({0})",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть на область, щоб заповнити її. Утримуйте Ctrl, щоб розглянути всі шари.",
+  "FLOOD_FILL_TOOL_ACTION_DISPLAY_CTRL": "Натисніть на область, щоб заповнити її. Відпустіть Ctrl, щоб розглянути лише поточні шари.",
+  "LASSO_TOOL_TOOLTIP": "Ласо. ({0})",
+  "LASSO_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть, щоб вибрати пікселі всередині ласо. Утримуйте Shift, щоб додати до наявного виділення. Утримуйте Ctrl, щоб відняти від нього.",
+  "LASSO_TOOL_ACTION_DISPLAY_SHIFT": "Натисніть і перемістіть, щоб додати до виділення пікселі всередині ласо.",
+  "LASSO_TOOL_ACTION_DISPLAY_CTRL": "Натисніть і перемістіть, щоб відняти пікселі всередині ласо з виділення.",
+  "LINE_TOOL_TOOLTIP": "Малювати лінію на полотні ({0}). Утримуйте Shift, щоб увімкнути прив’язку.",
+  "LINE_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть, щоб намалювати лінію. Утримуйте Shift, щоб увімкнути прив’язку.",
+  "LINE_TOOL_ACTION_DISPLAY_SHIFT": "Клацніть і перемістіть мишу, щоб намалювати лінію з увімкненою прив’язкою.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Чарівна паличка ({0}).",
+  "MAGIC_WAND_ACTION_DISPLAY": "Натисніть, щоб залити виділення.",
+  "PEN_TOOL": "Перо",
+  "BRIGHTNESS_TOOL": "Яскравість",
+  "COLOR_PICKER_TOOL": "Палітра кольорів",
+  "ELLIPSE_TOOL": "Еліпс",
+  "ERASER_TOOL": "Гумка",
+  "FLOOD_FILL_TOOL": "Заливка",
+  "LASSO_TOOL": "Ласо",
+  "LINE_TOOL": "Лінія",
+  "MAGIC_WAND_TOOL": "Чарівна паличка",
+  "MOVE_TOOL": "Переміщення",
+  "MOVE_VIEWPORT_TOOL": "Переміщення вікна перегляду",
+  "RECTANGLE_TOOL": "Прямокутник",
+  "ROTATE_VIEWPORT_TOOL": "Обернути вікно перегляду",
+  "SELECT_TOOL_NAME": "Вибір",
+  "ZOOM_TOOL": "Масштабування",
+  "SHAPE_LABEL": "Форма",
+  "MODE_LABEL": "Режим",
+  "SCOPE_LABEL": "Область застосування",
+  "FILL_SHAPE_LABEL": "Залити форму",
+  "FILL_COLOR_LABEL": "Колір заливки",
+  "TOOL_SIZE_LABEL": "Розмір інструменту",
+  "STRENGTH_LABEL": "Сила",
+  "NEW": "Новий",
+  "ADD": "Додати",
+  "SUBTRACT": "Відняти",
+  "INTERSECT": "Перетин",
+  "RECTANGLE": "Прямокутник",
+  "CIRCLE": "Коло",
+  "ABOUT": "Про програму",
+  "MINIMIZE": "Згорнути",
+  "RESTORE": "Відновити",
+  "MAXIMIZE": "Розгорнути",
+  "CLOSE": "Закрити",
+  "EXPORT_SIZE_HINT": "Якщо ви хочете поділитися зображенням, спробуйте {0}% для найкращої чіткості",
+  "CREATE": "Створити",
+  "BASE_LAYER_NAME": "Базовий шар",
+  "ENABLE_MASK": "Увімкнути маску",
+  "SELECTED_AREA_EMPTY": "Вибрана область порожня",
+  "NOTHING_TO_COPY": "Копіювати нічого",
+  "REFERENCE_LAYER_PATH": "Шлях опорного шару",
+  "FLIP": "Перевернути",
+  "ROTATION": "Обертання",
+  "ROT_IMG_90_D": "Повернути зображення на 90°",
+  "ROT_IMG_180_D": "Повернути зображення на 180°",
+  "ROT_IMG_-90_D": "Повернути зображення на -90°",
+  "ROT_LAYERS_90_D": "Повернути виділені шари на 90°",
+  "ROT_LAYERS_180_D": "Повернути вибрані шари на 180°",
+  "ROT_LAYERS_-90_D": "Повернути виділені шари на -90°",
+  "UNNAMED_PALETTE": "Безіменна палітра",
+  "CLICK_SELECT_PRIMARY": "Натисніть, щоб вибрати основний колір.",
+  "PEN_MODE": "Режим пера",
+  "VIEW": "Переглянути",
+  "HORIZONTAL_LINE_SYMMETRY": "Симетрія горизонтальних ліній",
+  "VERTICAL_LINE_SYMMETRY": "Симетрія вертикальної лінії",
+  "COLOR_PICKER_TITLE": "Палітра кольорів",
+  "COLOR_SLIDERS_TITLE": "Кольорові повзунки",
+  "PALETTE_TITLE": "Палітра",
+  "SWATCHES_TITLE": "Зразки",
+  "LAYERS_TITLE": "Шари",
+  "NAVIGATION_TITLE": "Навігація",
+  "NORMAL_BLEND_MODE": "Нормальний",
+  "DARKEN_BLEND_MODE": "Затемнений",
+  "MULTIPLY_BLEND_MODE": "Помножити",
+  "COLOR_BURN_BLEND_MODE": "Випалювання кольору",
+  "LIGHTEN_BLEND_MODE": "Освітлений",
+  "SCREEN_BLEND_MODE": "Екран",
+  "COLOR_DODGE_BLEND_MODE": "Кольорове ухилення",
+  "OVERLAY_BLEND_MODE": "Накладання",
+  "SOFT_LIGHT_BLEND_MODE": "М'яке світло",
+  "HARD_LIGHT_BLEND_MODE": "Жорстке світло",
+  "DIFFERENCE_BLEND_MODE": "Різниця",
+  "EXCLUSION_BLEND_MODE": "Виключення",
+  "HUE_BLEND_MODE": "Відтінок",
+  "SATURATION_BLEND_MODE": "Насиченість",
+  "LUMINOSITY_BLEND_MODE": "Освітленість",
+  "COLOR_BLEND_MODE": "Колір",
+  "NOT_SUPPORTED_BLEND_MODE": "Не підтримується",
+  "RESTART": "Перезапустити",
+  "SORT_BY": "Сортувати за",
+  "NAME": "Назвою",
+  "COLORS": "Кольори",
+  "DEFAULT": "За замовчуванням",
+  "ALPHABETICAL": "Алфавітом",
+  "COLOR_COUNT": "Кількістю кольорів",
+  "ANY": "Будь-яке",
+  "MAX": "Макс",
+  "MIN": "Мін",
+  "EXACT": "Точний",
+  "ASCENDING": "Висхідний",
+  "DESCENDING": "Спадний",
+  "NAME_IS_TOO_LONG": "Назва занадто довга",
+  "STOP_IT_TEXT1": "Цього достатньо. Приведіть у порядок свої імена файлів.",
+  "STOP_IT_TEXT2": "Чи можете ви припинити копіювати ці імена, будь ласка?",
+  "REPLACER_TOOLTIP": "Клацніть правою кнопкою миші колір палітри та виберіть 'Замінити' або перемістіть його сюди.",
+  "CLICK_TO_CHOOSE_COLOR": "Натисніть, щоб вибрати колір",
+  "REPLACE_COLOR": "Замінити колір",
+  "PALETTE_COLOR_TOOLTIP": "Натисніть, щоб вибрати основний колір. Перетягніть на інший колір палітри, щоб поміняти їх місцями.",
+  "ADD_FROM_SWATCHES": "Додати зі зразків",
+  "ADD_COLOR_TO_PALETTE": "Додати колір до палітри",
+  "USE_IN_CURRENT_IMAGE": "Використовувати в поточному зображенні",
+  "ADD_TO_FAVORITES": "Додайте до обраних",
+  "BROWSE_PALETTES": "Огляд палітр",
+  "LOAD_PALETTE": "Завантажити палітру",
+  "SAVE_PALETTE": "Зберегти палітру",
+  "FAVORITES": "Вибране",
+  "ADD_FROM_CURRENT_PALETTE": "Додати з поточної палітри",
+  "OPEN_PALETTES_DIR_TOOLTIP": "Відкрити каталог палітр у Провіднику",
+  "BROWSE_ON_LOSPEC_TOOLTIP": "Огляд палітр на Lospec",
+  "IMPORT_FROM_FILE_TOOLTIP": "Імпортувати з файлу",
+  "TOP_LEFT": "Вгорі ліворуч",
+  "TOP_CENTER": "Вгорі центр",
+  "TOP_RIGHT": "Вгорі праворуч",
+  "MIDDLE_LEFT": "Середина Ліворуч",
+  "MIDDLE_CENTER": "Середина Центр",
+  "MIDDLE_RIGHT": "Середина праворуч",
+  "BOTTOM_LEFT": "Внизу зліва",
+  "BOTTOM_CENTER": "Внизу центр",
+  "BOTTOM_RIGHT": "Внизу праворуч",
+  "CLIP_TO_BELOW": "Обрізати до шару нижче",
+  "MOVE_UPWARDS": "Перемістити вгору",
+  "MOVE_DOWNWARDS": "Перемістити вниз",
+  "MERGE_SELECTED": "Об’єднати вибрані",
+  "LOCK_TRANSPARENCY": "Заблокувати прозорість",
+  "COULD_NOT_LOAD_PALETTE": "Не вдалося отримати палітри",
+  "NO_PALETTES_FOUND": "Палітри не знайдено.",
+  "LOSPEC_LINK_TEXT": "Я чув, що ви можете знайти їх тут: lospec.com/palette-list",
+  "PALETTE_BROWSER": "Переглядач палітр",
+  "DELETE_PALETTE_CONFIRMATION": "Ви впевнені, що хочете видалити цю палітру? Це не може бути скасоване.",
+  "SHORTCUTS_IMPORTED": "Комбінації клавіш успішно імпортовано з {0}.",
+  "SHORTCUT_PROVIDER_DETECTED": "Ми виявили, що ви встановили {0}. Ви хочете імпортувати комбінації клавіш з нього?",
+  "IMPORT_FROM_INSTALLATION": "Імпорт з установки",
+  "IMPORT_INSTALLATION_OPTION1": "Імпорт з установки",
+  "IMPORT_INSTALLATION_OPTION2": "Використовувати значення за замовчуванням",
+  "IMPORT_FROM_TEMPLATE": "Імпорт із шаблону",
+  "SHORTCUTS_IMPORTED_SUCCESS": "Комбінації клавіш успішно імпортовано.",
+  "WARNING_RESET_SHORTCUTS_DEFAULT": "Ви впевнені, що бажаєте скинути всі комбінації клавіш до стандартних значень?",
+  "SUCCESS": "Успіх",
+  "WARNING": "Увага",
+  "ERROR_IMPORTING_IMAGE": "Під час імпортування зображення сталася помилка.",
+  "SHORTCUTS_CORRUPTED_TITLE": "Пошкоджений файл комбінацій клавіш",
+  "SHORTCUTS_CORRUPTED": "Файл комбінацій клавіш пошкоджено, скидання до замовчування.",
+  "FAILED_DOWNLOAD_PALETTE": "Не вдалося завантажити палітру",
+  "FILE_INCORRECT_FORMAT": "Файл був у неправильному форматі",
+  "INVALID_FILE": "Неправильний файл",
+  "SHORTCUTS_FILE_INCORRECT_FORMAT": "Файл комбінацій клавіш був у неправильному форматі",
+  "UNSUPPORTED_FILE_FORMAT": "Цей формат файлу не підтримується",
+  "ALREADY_ASSIGNED": "Вже призначено",
+  "REPLACE": "Замінити",
+  "SWAP": "Обмін",
+  "SHORTCUT_ALREADY_ASSIGNED_SWAP": "Цю комбінацію клавіш уже призначено для '{0}'\nБажаєте замінити наявну комбінацію чи поміняти їх місцями?",
+  "SHORTCUT_ALREADY_ASSIGNED_OVERWRITE": "Цю комбінацію клавіш уже призначено для '{0}'\nБажаєте замінити існуючу комбінацію?",
+  "UNSAVED_CHANGES": "Незбережені зміни",
+  "DOCUMENT_MODIFIED_SAVE": "Документ змінено. Ви хочете зберегти зміни?",
+  "SESSION_UNSAVED_DATA": "{0} містить незбережені дані. Ви впевнені?",
+  "PROJECT_MAINTAINERS": "Супроводжувачі проекту",
+  "OTHER_AWESOME_CONTRIBUTORS": "Та інші чудові учасники",
+  "HELP": "Довідка",
+  "STOP_IT_TEXT3": "Ні, справді, перестаньте.",
+  "STOP_IT_TEXT4": "Невже у вас немає нічого кращого?",
+  "LINEAR_DODGE_BLEND_MODE": "Лінійне ухилення (Додати)",
+  "PRESS_ANY_KEY": "Натисніть будь-яку клавішу",
+  "NONE_SHORTCUT": "Нічого",
+  "REFERENCE": "Опорний",
+  "PUT_REFERENCE_LAYER_ABOVE": "Помістити опорний шар вище",
+  "PUT_REFERENCE_LAYER_BELOW": "Помістити опорний шар нижче",
+  "TOGGLE_VERTICAL_SYMMETRY": "Перемкнути вертикальну симетрію",
+  "TOGGLE_HORIZONTAL_SYMMETRY": "Перемкнути горизонтальну симетрію",
+  "RESET_VIEWPORT": "Скинути вікно перегляду",
+  "VIEWPORT_SETTINGS": "Налаштування вікна перегляду",
+  "MOVE_TOOL_ACTION_DISPLAY_TRANSFORMING": "Натисніть і утримуйте мишу, щоб перемістити пікселі у вибраних шарах.",
+  "MOVE_TOOL_ACTION_DISPLAY_CTRL": "Утримуйте мишу, щоб перемістити всі шари.",
+  "CTRL_KEY": "Ctrl",
+  "SHIFT_KEY": "Shift",
+  "ALT_KEY": "Alt",
+  "RENAME": "Перейменувати",
+  "PIXEL_UNIT": "пікс",
+  "OPEN_LOCALIZATION_DEBUG_WINDOW": "Відкрити вікно Налагодження локалізації",
+  "FORCE_OTHER_FLOW_DIRECTION": "Примусово змінити напрямок потоку",
+  "API_KEY": "Ключ API",
+  "LOCALIZATION_VIEW_TYPE": "Тип перегляду локалізації",
+  "LOAD_LANGUAGE_FROM_FILE": "Завантажити мову з файлу",
+  "LOG_IN": "Увійти",
+  "SYNC": "Синхр.",
+  "NOT_LOGGED_IN": "Не ввійшли в систему",
+  "POE_EDITOR_ERROR": "Помилка POEditor: {0} {1}",
+  "HTTP_ERROR_MESSAGE": "Помилка HTTP: {0} {1}",
+  "LOGGED_IN": "Вхід виконано",
+  "SYNCED_SUCCESSFULLY": "Успішно синхронізовано",
+  "EXCEPTION_ERROR": "Виключення: {0}",
+  "DROP_PALETTE": "Опустіть палітру сюди",
+  "SECURITY_ERROR": "Помилка безпеки",
+  "SECURITY_ERROR_MSG": "Немає прав на запис у вказане місце.",
+  "IO_ERROR": "Помилка вводу-виводу",
+  "IO_ERROR_MSG": "Помилка під час запису на диск.",
+  "FAILED_ASSOCIATE_PIXI": "Не вдалося пов’язати файл .pixi із PixiEditor.",
+  "COULD_NOT_SAVE_PALETTE": "Під час збереження палітри сталася помилка.",
+  "NO_COLORS_TO_SAVE": "Немає кольорів для збереження.",
+  "ALL_LAYERS": "Всі шари",
+  "SINGLE_LAYER": "Один шар",
+  "CHOOSE": "Обрати",
+  "REMOVE": "Видалити",
+  "FILE_FORMAT_NOT_ASEPRITE_KEYS": "Файл не є файлом \".aseprite-keys\"",
+  "FILE_HAS_INVALID_SHORTCUT": "Файл містить недійсні дані",
+  "FILE_EXTENSION_NOT_SUPPORTED": "Тип файлу '{0}' не підтримується",
+  "ERROR_READING_FILE": "Помилка під час читання файлу",
+  "DISCARD_PALETTE": "Видалити палітру",
+  "DISCARD_PALETTE_CONFIRMATION": "Ви впевнені, що бажаєте видалити поточну палітру? Це не може бути скасоване.",
+  "IMPORT_AS_NEW_LAYER": "Імпортувати як новий шар",
+  "PASTE_AS_PRIMARY_COLOR": "Вставити як основний колір",
+  "IMPORT_AS_NEW_FILE": "Імпортувати як новий файл",
+  "IMPORT_PALETTE_FILE": "Імпорт файлу палітри",
+  "IMPORT_MULTIPLE_PALETTE_COLORS": "Імпорт кольорів до палітри",
+  "IMPORT_SINGLE_PALETTE_COLOR": "Імпорт кольору до палітри",
+  "IMPORT_AS_REFERENCE_LAYER": "Імпортувати як опорний шар",
+  "NAVIGATOR_PICK_ACTION_DISPLAY": "Клацніть правою кнопкою миші, щоб вибрати колір, клацніть правою кнопкою миші, утримуючи Shift, щоб скопіювати колір до буфера обміну",
+  "OPEN_FILE_FROM_CLIPBOARD": "Відкрити з буфера обміну",
+  "OPEN_FILE_FROM_CLIPBOARD_DESCRIPTIVE": "Відкрити з буфера обміну",
+  "OPEN_LOCALIZATION_DATA": "Do you want to open the LocalizationData.json?\nThe updated date has been put in the clipboard.\nNote that changes wont be applied until a restart",
+  "DOWNLOADING_LANGUAGE_FAILED": "Помилка завантаження мови.\nМожливо, було зловживано ключем API.",
+  "LOCALIZATION_DATA_NOT_FOUND": "Шлях до даних локалізації не знайдено",
+  "APPLY": "Застосувати",
+  "UPDATE_SOURCE": "Джерело оновлення",
+  "COPY_TO_CLIPBOARD": "Копіювати в буфер обміну",
+  "LANGUAGE_FILE_NOT_FOUND": "Мовний файл не знайдено.\nОчікувалось {0}",
+  "PROJECT_ROOT_NOT_FOUND": "Кореневу папку проекту PixiEditor не знайдено.\nШукаємо PixiEditor.csproj",
+  "LOCALIZATION_FOLDER_NOT_FOUND": "Папка локалізації не знайдена.\nОчікувалось за адресою /Data/Localization",
+  "SELECT_A_LANGUAGE": "Виберіть мову",
+  "DONE": "Готово",
+  "SOURCE_UNSET_OR_MISSING": "Джерело відсутнє/не встановлено",
+  "SOURCE_NEWER": "Джерело новіше",
+  "SOURCE_UP_TO_DATE": "Джерело актуальне",
+  "SOURCE_OLDER": "Хмара новіше",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
+  "LOCALIZATION_DEBUG_WINDOW_TITLE": "Localization Debug Window",
+  "COMMAND_DEBUG_WINDOW_TITLE": "Command Debug Window",
+  "SHORTCUTS_TITLE": "Shortcuts",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_PERSPECTIVE": "Drag handles to scale transform. Hold Ctrl and drag a handle to move the handle freely. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_SHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Hold Alt and drag a side handle to shear. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_ROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally. Drag outside handles to rotate.",
+  "TRANSFORM_ACTION_DISPLAY_SCALE_NOROTATE_NOSHEAR_NOPERSPECTIVE": "Drag handles to scale transform. Hold Shift to scale proportionally."
 }

Vissa filer visades inte eftersom för många filer har ändrats