소스 검색

Some tool stuff localized

Krzysztof Krysiński 2 년 전
부모
커밋
b3a1b2e138
28개의 변경된 파일125개의 추가작업 그리고 60개의 파일을 삭제
  1. 37 0
      src/PixiEditor/Data/Localization/Languages/en.json
  2. 7 0
      src/PixiEditor/Localization/LocalizedString.cs
  3. 1 0
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/BoolSetting.cs
  4. 1 0
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/ColorSetting.cs
  5. 1 0
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/EnumSetting.cs
  6. 1 0
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/FloatSetting.cs
  7. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/Setting.cs
  8. 2 2
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/BasicShapeToolbar.cs
  9. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/BasicToolbar.cs
  10. 15 15
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/SettingAttributes.cs
  11. 3 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/ToolbarFactory.cs
  12. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/ToolViewModel.cs
  13. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/BrightnessToolViewModel.cs
  14. 3 2
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ColorPickerToolViewModel.cs
  15. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/EllipseToolViewModel.cs
  16. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/EraserToolViewModel.cs
  17. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/FloodFillToolViewModel.cs
  18. 3 2
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/LassoToolViewModel.cs
  19. 2 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/LineToolViewModel.cs
  20. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MagicWandToolViewModel.cs
  21. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MoveToolViewModel.cs
  22. 3 2
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MoveViewportToolViewModel.cs
  23. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/PenToolViewModel.cs
  24. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/RectangleToolViewModel.cs
  25. 3 2
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/RotateViewportToolViewModel.cs
  26. 7 6
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/SelectToolViewModel.cs
  27. 4 3
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ZoomToolViewModel.cs
  28. 1 1
      src/PixiEditor/Views/MainWindow.xaml

+ 37 - 0
src/PixiEditor/Data/Localization/Languages/en.json

@@ -101,6 +101,43 @@
   "CLEAR_RECENTLY_OPENED_DOCUMENTS": "Clear recently opened documents",
   "OPEN_CMD_DEBUG_WINDOW": "Open command debug window",
 
+  "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_ALT": "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.",
+  "COLOR_PICKER_TOOLTIP": "Picks the primary color from the canvas. ({0})",
+  "ELLIPSE_TOOL_TOOLTIP": "Draws an ellipse on canvas ({0}). Hold Shift to draw a circle.",
+  "ERASER_TOOL_TOOLTIP": "Erasers color from pixel. ({0})",
+  "FLOOD_FILL_TOOL_TOOLTIP": "Fills area with color. ({0})",
+  "LASSO_TOOL_TOOLTIP": "Lasso. ({0})",
+  "LINE_TOOL_TOOLTIP": "Draws line on canvas ({0}). Hold Shift to enable snapping.",
+  "MAGIC_WAND_TOOL_TOOLTIP": "Magic Wand ({0}). Flood's the selection",
+
+  "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",
+
   "PATH_DOES_NOT_EXIST": "{0} does not exist.",
   "LOCATION_DOES_NOT_EXIST": "Location does not exist.",
   "FILE_NOT_FOUND": "File not found.",

+ 7 - 0
src/PixiEditor/Localization/LocalizedString.cs

@@ -24,12 +24,19 @@ public struct LocalizedString
     public LocalizedString(string key)
     {
         Key = key;
+        ILocalizationProvider.Current.OnLanguageChanged += OnLanguageChanged;
     }
 
     public LocalizedString(string key, params object[] parameters)
     {
         Parameters = parameters;
         Key = key;
+        ILocalizationProvider.Current.OnLanguageChanged += OnLanguageChanged;
+    }
+
+    private void OnLanguageChanged(Language lang)
+    {
+        Value = GetValue(Key);
     }
 
     public override string ToString()

+ 1 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/BoolSetting.cs

@@ -2,6 +2,7 @@
 using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
 using System.Windows.Data;
+using PixiEditor.Localization;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;
 

+ 1 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/ColorSetting.cs

@@ -4,6 +4,7 @@ using System.Windows.Data;
 using System.Windows.Media;
 using Microsoft.Xaml.Behaviors;
 using PixiEditor.Helpers.Behaviours;
+using PixiEditor.Localization;
 using PixiEditor.Views.UserControls;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;

+ 1 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/EnumSetting.cs

@@ -3,6 +3,7 @@ using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
 using System.Windows.Data;
 using PixiEditor.Helpers.Extensions;
+using PixiEditor.Localization;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;
 

+ 1 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/FloatSetting.cs

@@ -1,5 +1,6 @@
 using System.Windows.Controls;
 using System.Windows.Data;
+using PixiEditor.Localization;
 using PixiEditor.Views.UserControls;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Settings/Setting.cs

@@ -1,4 +1,5 @@
 using System.Windows.Controls;
+using PixiEditor.Localization;
 
 #pragma warning disable SA1402 // File may only contain a single type, Justification: "Same class with generic value"
 
@@ -59,7 +60,7 @@ internal abstract class Setting : NotifyableObject
 
     public string Name { get; }
 
-    public string Label { get; set; }
+    public LocalizedString Label { get; set; }
 
     public bool HasLabel => !string.IsNullOrEmpty(Label);
 

+ 2 - 2
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/BasicShapeToolbar.cs

@@ -10,7 +10,7 @@ internal class BasicShapeToolbar : BasicToolbar
 
     public BasicShapeToolbar()
     {
-        Settings.Add(new BoolSetting(nameof(Fill), "Fill shape: "));
-        Settings.Add(new ColorSetting(nameof(FillColor), "Fill color"));
+        Settings.Add(new BoolSetting(nameof(Fill), "FILL_SHAPE_LABEL"));
+        Settings.Add(new ColorSetting(nameof(FillColor), "FILL_COLOR_LABEL"));
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/BasicToolbar.cs

@@ -14,7 +14,7 @@ internal class BasicToolbar : Toolbar
     }
     public BasicToolbar()
     {
-        var setting = new SizeSetting(nameof(ToolSize), "Tool size:");
+        var setting = new SizeSetting(nameof(ToolSize), "TOOL_SIZE_LABEL");
         setting.ValueChanged += (_, _) => RaisePropertyChanged(nameof(ToolSize));
         Settings.Add(setting);
 

+ 15 - 15
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/SettingAttributes.cs

@@ -10,9 +10,9 @@ public static class Settings
     /// </summary>
     public class BoolAttribute : SettingsAttribute
     {
-        public BoolAttribute(string label) : base(label) { }
+        public BoolAttribute(string labelKey) : base(labelKey) { }
 
-        public BoolAttribute(string label, object defaultValue) : base(label, defaultValue) { }
+        public BoolAttribute(string labelKey, object defaultValue) : base(labelKey, defaultValue) { }
     }
 
     /// <summary>
@@ -20,9 +20,9 @@ public static class Settings
     /// </summary>
     public class EnumAttribute : SettingsAttribute
     {
-        public EnumAttribute(string label) : base(label) { }
+        public EnumAttribute(string labelKey) : base(labelKey) { }
 
-        public EnumAttribute(string label, object defaultValue) : base(label, defaultValue) { }
+        public EnumAttribute(string labelKey, object defaultValue) : base(labelKey, defaultValue) { }
     }
 
     /// <summary>
@@ -30,11 +30,11 @@ public static class Settings
     /// </summary>
     public class ColorAttribute : SettingsAttribute
     {
-        public ColorAttribute(string label) : base(label) { }
+        public ColorAttribute(string labelKey) : base(labelKey) { }
 
-        public ColorAttribute(string label, byte r, byte g, byte b) : base(label, new Color(r, g, b)) { }
+        public ColorAttribute(string labelKey, byte r, byte g, byte b) : base(labelKey, new Color(r, g, b)) { }
         
-        public ColorAttribute(string label, byte r, byte g, byte b, byte a) : base(label, new Color(r, g, b, a)) { }
+        public ColorAttribute(string labelKey, byte r, byte g, byte b, byte a) : base(labelKey, new Color(r, g, b, a)) { }
     }
 
     /// <summary>
@@ -42,9 +42,9 @@ public static class Settings
     /// </summary>
     public class FloatAttribute : SettingsAttribute
     {
-        public FloatAttribute(string label) : base(label) { }
+        public FloatAttribute(string labelKey) : base(labelKey) { }
 
-        public FloatAttribute(string label, float defaultValue) : base(label, defaultValue) { }
+        public FloatAttribute(string labelKey, float defaultValue) : base(labelKey, defaultValue) { }
     }
 
     /// <summary>
@@ -52,7 +52,7 @@ public static class Settings
     /// </summary>
     public class SizeAttribute : SettingsAttribute
     {
-        public SizeAttribute(string label) : base(label) { }
+        public SizeAttribute(string labelKey) : base(labelKey) { }
     }
 
     /// <summary>
@@ -67,18 +67,18 @@ public static class Settings
 
         public SettingsAttribute() { }
         
-        public SettingsAttribute(string label)
+        public SettingsAttribute(string labelKey)
         {
-            Label = label;
+            LabelKey = labelKey;
         }
 
-        public SettingsAttribute(string label, object defaultValue)
+        public SettingsAttribute(string labelKey, object defaultValue)
         {
-            Label = label;
+            LabelKey = labelKey;
             DefaultValue = defaultValue;
         }
         
-        public readonly string Label;
+        public readonly string LabelKey;
 
         public readonly object DefaultValue;
     }

+ 3 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolSettings/Toolbars/ToolbarFactory.cs

@@ -39,14 +39,14 @@ internal static class ToolbarFactory
                 continue;
             }
             
-            var label = attribute.Label ?? name;
+            var label = attribute.LabelKey ?? name;
 
             var setting = attribute switch
             {
                 Settings.BoolAttribute => new BoolSetting(name, (bool)(attribute.DefaultValue ?? false), label),
                 Settings.ColorAttribute => new ColorSetting(name, ((Color)(attribute.DefaultValue ?? Colors.White)).ToColor(), label),
                 Settings.EnumAttribute => GetEnumSetting(property.PropertyType, name, attribute),
-                Settings.FloatAttribute => new FloatSetting(name, (float)(attribute.DefaultValue ?? 0f), attribute.Label),
+                Settings.FloatAttribute => new FloatSetting(name, (float)(attribute.DefaultValue ?? 0f), attribute.LabelKey),
                 Settings.SizeAttribute => new SizeSetting(name, label),
                 _ => throw new NotImplementedException($"SettingsAttribute of type '{attribute.GetType().FullName}' has not been implemented")
             };
@@ -67,6 +67,6 @@ internal static class ToolbarFactory
         return (Setting)typeof(EnumSetting<>)
             .MakeGenericType(enumType)
             .GetConstructor(new[] { typeof(string), typeof(string), enumType })!
-            .Invoke(new[] { name, attribute.Label ?? name, attribute.DefaultValue });
+            .Invoke(new[] { name, attribute.LabelKey ?? name, attribute.DefaultValue });
     }
 }

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/ToolViewModel.cs

@@ -3,6 +3,7 @@ using System.Runtime.CompilerServices;
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
@@ -25,7 +26,7 @@ internal abstract class ToolViewModel : NotifyableObject
 
     public virtual bool HideHighlight { get; }
 
-    public abstract string Tooltip { get; }
+    public abstract LocalizedString Tooltip { get; }
 
     private string actionDisplay = string.Empty;
     public string ActionDisplay

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/BrightnessToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;
@@ -20,17 +21,17 @@ internal class BrightnessToolViewModel : ToolViewModel
         Toolbar = ToolbarFactory.Create<BrightnessToolViewModel, BasicToolbar>();
     }
 
-    public override string Tooltip => $"Makes pixels brighter or darker ({Shortcut}). Hold Ctrl to make pixels darker.";
+    public override LocalizedString Tooltip => new LocalizedString("BRIGHTNESS_TOOL_TOOLTIP", Shortcut);
 
     public override BrushShape BrushShape => BrushShape.Circle;
 
     [Settings.Inherited]
     public int ToolSize => GetValue<int>();
     
-    [Settings.Float("Strength", 5)]
+    [Settings.Float("STRENGTH_LABEL", 5)]
     public float CorrectionFactor => GetValue<float>();
 
-    [Settings.Enum("Mode")]
+    [Settings.Enum("MODE_LABEL")]
     public BrightnessMode BrightnessMode => GetValue<BrightnessMode>();
     
     public bool Darken { get; private set; } = false;

+ 3 - 2
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ColorPickerToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
@@ -17,7 +18,7 @@ internal class ColorPickerToolViewModel : ToolViewModel
 
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    public override string Tooltip => $"Picks the primary color from the canvas. ({Shortcut})";
+    public override LocalizedString Tooltip => new("COLOR_PICKER_TOOLTIP", Shortcut);
 
     private bool pickFromCanvas = true;
     public bool PickFromCanvas
@@ -33,7 +34,7 @@ internal class ColorPickerToolViewModel : ToolViewModel
         private set => SetProperty(ref pickFromReferenceLayer, value);
     }
 
-    [Settings.Enum("Scope", DocumentScope.AllLayers)]
+    [Settings.Enum("SCOPE_LABEL", DocumentScope.AllLayers)]
     public DocumentScope Mode => GetValue<DocumentScope>();
 
     public ColorPickerToolViewModel()

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/EllipseToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
@@ -15,7 +16,7 @@ internal class EllipseToolViewModel : ShapeTool
         ActionDisplay = defaultActionDisplay;
     }
 
-    public override string Tooltip => $"Draws an ellipse on canvas ({Shortcut}). Hold Shift to draw a circle.";
+    public override LocalizedString Tooltip => new LocalizedString("ELLIPSE_TOOL_TOOLTIP", Shortcut);
     public bool DrawCircle { get; private set; }
 
     public override void UpdateActionDisplay(bool ctrlIsDown, bool shiftIsDown, bool altIsDown)

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/EraserToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
@@ -21,7 +22,7 @@ internal class EraserToolViewModel : ToolViewModel
 
     public override BrushShape BrushShape => BrushShape.Circle;
 
-    public override string Tooltip => $"Erasers color from pixel. ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("ERASER_TOOL_TOOLTIP", Shortcut);
 
     public override void OnLeftMouseButtonDown(VecD pos)
     {

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/FloodFillToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
 
@@ -13,7 +14,7 @@ internal class FloodFillToolViewModel : ToolViewModel
 
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    public override string Tooltip => $"Fills area with color. ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("FLOOD_FILL_TOOL_TOOLTIP", Shortcut);
 
     public bool ConsiderAllLayers { get; private set; }
 

+ 3 - 2
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/LassoToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
@@ -40,11 +41,11 @@ internal class LassoToolViewModel : ToolViewModel
         }
     }
 
-    public override string Tooltip => $"Lasso. ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("LASSO_TOOL_TOOLTIP", Shortcut);
     
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    [Settings.Enum("Mode")]
+    [Settings.Enum("MODE_LABEL")]
     public SelectionMode SelectMode => GetValue<SelectionMode>();
     
     public override void OnLeftMouseButtonDown(VecD pos)

+ 2 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/LineToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 
@@ -17,7 +18,7 @@ internal class LineToolViewModel : ShapeTool
         Toolbar = ToolbarFactory.Create<LineToolViewModel, BasicToolbar>();
     }
 
-    public override string Tooltip => $"Draws line on canvas ({Shortcut}). Hold Shift to enable snapping.";
+    public override LocalizedString Tooltip => new LocalizedString("LINE_TOOL_TOOLTIP", Shortcut);
 
     [Settings.Inherited]
     public int ToolSize => GetValue<int>();

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MagicWandToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
@@ -11,14 +12,14 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.W)]
 internal class MagicWandToolViewModel : ToolViewModel
 {
-    public override string Tooltip => $"Magic Wand ({Shortcut}). Flood's the selection";
+    public override LocalizedString Tooltip => new LocalizedString("MAGIC_WAND_TOOL_TOOLTIP", Shortcut);
 
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    [Settings.Enum("Mode")]
+    [Settings.Enum("MODE_LABEL")]
     public SelectionMode SelectMode => GetValue<SelectionMode>();
 
-    [Settings.Enum("Scope")]
+    [Settings.Enum("SCOPE_LABEL")]
     public DocumentScope DocumentScope => GetValue<DocumentScope>();
     
     public MagicWandToolViewModel()

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MoveToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
@@ -10,7 +11,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.V)]
 internal class MoveToolViewModel : ToolViewModel
 {
-    private string defaultActionDisplay = "Hold mouse to move selected pixels. Hold Ctrl to move all layers.";
+    private string defaultActionDisplay = new LocalizedString("MOVE_TOOL_ACTION_DISPLAY");
 
     public MoveToolViewModel()
     {
@@ -19,9 +20,9 @@ internal class MoveToolViewModel : ToolViewModel
         Cursor = Cursors.Arrow;
     }
 
-    public override string Tooltip => $"Moves selected pixels ({Shortcut}). Hold Ctrl to move all layers.";
+    public override LocalizedString Tooltip => new LocalizedString("MOVE_TOOL_TOOLTIP", Shortcut);
 
-    [Settings.Bool("Keep original image")]
+    [Settings.Bool("KEEP_ORIGINAL_IMAGE_SETTING")]
     public bool KeepOriginalImage => GetValue<bool>();
     
     public override BrushShape BrushShape => BrushShape.Hidden;

+ 3 - 2
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MoveViewportToolViewModel.cs

@@ -1,4 +1,5 @@
 using System.Windows.Input;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
 
@@ -9,12 +10,12 @@ internal class MoveViewportToolViewModel : ToolViewModel
 {
     public override BrushShape BrushShape => BrushShape.Hidden;
     public override bool HideHighlight => true;
-    public override string Tooltip => $"Moves viewport. ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("MOVE_VIEWPORT_TOOLTIP", Shortcut);
 
     public MoveViewportToolViewModel()
     {
         Cursor = Cursors.SizeAll;
-        ActionDisplay = "Click and move to pan viewport.";
+        ActionDisplay = new LocalizedString("MOVE_VIEWPORT_ACTION_DISPLAY");
     }
 
     public override void OnSelected() { }

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/PenToolViewModel.cs

@@ -2,6 +2,7 @@
 using System.Windows.Media;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
@@ -16,16 +17,16 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools
         public PenToolViewModel()
         {
             Cursor = Cursors.Pen;
-            ActionDisplay = "Click and move to draw.";
+            ActionDisplay = "PEN_TOOL_TOOLTIP";
             Toolbar = ToolbarFactory.Create<PenToolViewModel, BasicToolbar>();
         }
 
-        public override string Tooltip => $"Pen. ({Shortcut})";
+        public override LocalizedString Tooltip => new LocalizedString("PEN_TOOL_TOOLTIP", Shortcut);
 
         [Settings.Inherited]
         public int ToolSize => GetValue<int>();
 
-        [Settings.Bool("Pixel perfect")]
+        [Settings.Bool("PIXEL_PERFECT_SETTING")]
         public bool PixelPerfectEnabled => GetValue<bool>();
 
         public override void OnLeftMouseButtonDown(VecD pos)

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/RectangleToolViewModel.cs

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 
 namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
@@ -8,13 +9,13 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.R)]
 internal class RectangleToolViewModel : ShapeTool
 {
-    private string defaultActionDisplay = "Click and move to draw a rectangle. Hold Shift to draw a square.";
+    private string defaultActionDisplay = new LocalizedString("RECTANGLE_TOOL_ACTION_DISPLAY_DEFAULT");
     public RectangleToolViewModel()
     {
         ActionDisplay = defaultActionDisplay;
     }
 
-    public override string Tooltip => $"Draws rectangle on canvas ({Shortcut}). Hold Shift to draw a square.";
+    public override LocalizedString Tooltip => new LocalizedString("RECTANGLE_TOOL_TOOLTIP", Shortcut);
 
     public bool Filled { get; set; } = false;
     public bool DrawSquare { get; private set; } = false;
@@ -23,7 +24,7 @@ internal class RectangleToolViewModel : ShapeTool
         if (shiftIsDown)
         {
             DrawSquare = true;
-            ActionDisplay = "Click and move to draw a square.";
+            ActionDisplay = new LocalizedString("RECTANGLE_TOOL_ACTION_DISPLAY_SHIFT");
         }
         else
         {

+ 3 - 2
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/RotateViewportToolViewModel.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Input;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
 
@@ -14,11 +15,11 @@ internal class RotateViewportToolViewModel : ToolViewModel
 {
     public override BrushShape BrushShape => BrushShape.Hidden;
     public override bool HideHighlight => true;
-    public override string Tooltip => $"Rotates viewport ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("ROTATE_VIEWPORT_TOOLTIP", Shortcut);
 
     public RotateViewportToolViewModel()
     {
-        ActionDisplay = "Rotate viewport";
+        ActionDisplay = new LocalizedString("ROTATE_VIEWPORT_ACTION_DISPLAY");
     }
 
     public override void OnSelected() { }

+ 7 - 6
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/SelectToolViewModel.cs

@@ -2,6 +2,7 @@
 using ChunkyImageLib.DataHolders;
 using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
@@ -12,7 +13,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.M)]
 internal class SelectToolViewModel : ToolViewModel
 {
-    private string defaultActionDisplay = "Click and move to select an area. Hold Shift to add to existing selection. Hold Ctrl to subtract from it.";
+    private string defaultActionDisplay = new LocalizedString("SELECT_TOOL_ACTION_DISPLAY_DEFAULT");
 
     public SelectToolViewModel()
     {
@@ -28,12 +29,12 @@ internal class SelectToolViewModel : ToolViewModel
     {
         if (shiftIsDown)
         {
-            ActionDisplay = "Click and move to add to the current selection.";
+            ActionDisplay = new LocalizedString("SELECT_TOOL_ACTION_DISPLAY_SHIFT");
             modifierKeySelectionMode = SelectionMode.Add;
         }
         else if (ctrlIsDown)
         {
-            ActionDisplay = "Click and move to subtract from the current selection.";
+            ActionDisplay = new LocalizedString("SELECT_TOOL_ACTION_DISPLAY_ALT");
             modifierKeySelectionMode = SelectionMode.Subtract;
         }
         else
@@ -43,15 +44,15 @@ internal class SelectToolViewModel : ToolViewModel
         }
     }
 
-    [Settings.Enum("Mode")]
+    [Settings.Enum("MODE_LABEL")]
     public SelectionMode SelectMode => GetValue<SelectionMode>();
 
-    [Settings.Enum("Shape")]
+    [Settings.Enum("SHAPE_LABEL")]
     public SelectionShape SelectShape => GetValue<SelectionShape>();
     
     public override BrushShape BrushShape => BrushShape.Pixel;
 
-    public override string Tooltip => $"Selects area. ({Shortcut})";
+    public override LocalizedString Tooltip => new LocalizedString("SELECT_TOOL_TOOLTIP", Shortcut);
 
     public override void OnLeftMouseButtonDown(VecD pos)
     {

+ 4 - 3
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ZoomToolViewModel.cs

@@ -1,4 +1,5 @@
 using System.Windows.Input;
+using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
 
@@ -14,7 +15,7 @@ internal class ZoomToolViewModel : ToolViewModel
         set => SetProperty(ref zoomOutOnClick, value);
     }
 
-    private string defaultActionDisplay = "Click and move to zoom. Click to zoom in, hold ctrl and click to zoom out.";
+    private string defaultActionDisplay = new LocalizedString("ZOOM_TOOL_ACTION_DISPLAY_DEFAULT");
 
     public override BrushShape BrushShape => BrushShape.Hidden;
 
@@ -25,13 +26,13 @@ internal class ZoomToolViewModel : ToolViewModel
 
     public override bool HideHighlight => true;
 
-    public override string Tooltip => $"Zooms viewport ({Shortcut}). Click to zoom in, hold alt and click to zoom out.";
+    public override LocalizedString Tooltip => new LocalizedString("ZOOM_TOOL_TOOLTIP", Shortcut);
 
     public override void UpdateActionDisplay(bool ctrlIsDown, bool shiftIsDown, bool altIsDown)
     {
         if (ctrlIsDown)
         {
-            ActionDisplay = "Click and move to zoom. Click to zoom out, release ctrl and click to zoom in.";
+            ActionDisplay = new LocalizedString("ZOOM_TOOL_ACTION_DISPLAY_CTRL");
             ZoomOutOnClick = true;
         }
         else

+ 1 - 1
src/PixiEditor/Views/MainWindow.xaml

@@ -412,7 +412,7 @@
                         </b:EventTrigger>
                     </b:Interaction.Triggers>
                     <Grid Margin="5,0" VerticalAlignment="Center">
-                        <TextBlock Foreground="White">Search...</TextBlock>
+                        <TextBlock Foreground="White" views:Translator.Key="SEARCH"/>
                         <TextBlock Text="{cmds:ShortcutBinding PixiEditor.Search.Toggle}"
                                    HorizontalAlignment="Right"
                                    Foreground="White"/>