提交 1044044a 编写于 作者: N Nicke Manarin

Merge branch 'dev'

namespace ScreenToGif.Domain.Enums;
public enum ApplicationTypes
{
Unidentified = 0,
/// <summary>
/// Light package (.NET 6 desktop runtime download and installation required).
/// Distributted as a single file, as an EXE.
/// </summary>
DependantSingle = 1,
/// <summary>
/// Full package (.NET 6 desktop runtime included).
/// Distributted as a single file, as an EXE.
/// </summary>
FullSingle = 2,
/// <summary>
/// Full package (.NET 6 desktop runtime included).
/// Distributted as multiple files, as a MSIX for the outside the Store.
/// </summary>
FullMultiMsix = 3,
/// <summary>
/// Full package (.NET 6 desktop runtime included).
/// Distributted as multiple files, as a MSIX for the Store.
/// </summary>
FullMultiMsixStore = 4,
}
\ No newline at end of file
namespace ScreenToGif.Domain.Enums;
public enum OverwriteModes
{
Allow,
Warn,
Prompt
}
\ No newline at end of file
...@@ -8,7 +8,7 @@ namespace ScreenToGif.Domain.Interfaces ...@@ -8,7 +8,7 @@ namespace ScreenToGif.Domain.Interfaces
string DescriptionKey { get; set; } string DescriptionKey { get; set; }
ExportFormats Type { get; set; } ExportFormats Type { get; set; }
bool PickLocation { get; set; } bool PickLocation { get; set; }
bool OverwriteOnSave { get; set; } OverwriteModes OverwriteMode { get; set; }
bool ExportAsProjectToo { get; set; } bool ExportAsProjectToo { get; set; }
bool UploadFile { get; set; } bool UploadFile { get; set; }
string UploadService { get; set; } string UploadService { get; set; }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<UseWPF>True</UseWPF> <UseWPF>True</UseWPF>
<Platforms>AnyCPU;ARM64;x64;x86</Platforms> <Platforms>AnyCPU;ARM64;x64;x86</Platforms>
<Version>2.35.4</Version> <Version>2.36.0</Version>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<UseWindowsForms>True</UseWindowsForms> <UseWindowsForms>True</UseWindowsForms>
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<Platforms>AnyCPU;ARM64;x64;x86</Platforms> <Platforms>AnyCPU;ARM64;x64;x86</Platforms>
<Version>2.35.4</Version> <Version>2.36.0</Version>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
......
...@@ -49,7 +49,7 @@ internal class LayerRecord : IPsdContent ...@@ -49,7 +49,7 @@ internal class LayerRecord : IPsdContent
stream.WriteByte(0); //Flags, Visible = true, 1 byte. (For invisible, try using 10) stream.WriteByte(0); //Flags, Visible = true, 1 byte. (For invisible, try using 10)
stream.WriteByte(0); //Filler, 1 byte stream.WriteByte(0); //Filler, 1 byte
var name = StreamHelpers.GetPascalStringAsBytes(Encoding.GetEncoding(1252).GetBytes(Name)); var name = StreamHelpers.GetPascalStringAsBytes(Encoding.Unicode.GetBytes(Name));
var aditionalLayerInfo = AditionalInfo.SelectMany(s => s.Content).ToArray(); var aditionalLayerInfo = AditionalInfo.SelectMany(s => s.Content).ToArray();
stream.WriteUInt32(BitHelper.ConvertEndian((uint)(4 + 4 + name.Length + aditionalLayerInfo.Length))); //Extra data length, 4 bytes. stream.WriteUInt32(BitHelper.ConvertEndian((uint)(4 + 4 + name.Length + aditionalLayerInfo.Length))); //Extra data length, 4 bytes.
......
using ScreenToGif.Domain.Enums;
namespace ScreenToGif.Util;
public static class IdentityHelper
{
public static ApplicationTypes ApplicationType
{
get
{
#if DEPENDANT_SINGLE
//Dependant, Single File
return ApplicationTypes.DependantSingle;
#elif FULL_SINGLE
//Full, Single File
return ApplicationTypes.FullSingle;
#elif FULL_MULTI_MSIX
//Full, Multiple Files, MSIX
return ApplicationTypes.FullMultiMsix;
#elif FULL_MULTI_MSIX_STORE
//Full, Multiple Files, MSIX, Store
return ApplicationTypes.FullMultiMsixStore;
#endif
return ApplicationTypes.Unidentified;
}
}
public static string ApplicationTypeDescription
{
get
{
#if DEPENDANT_SINGLE
return "Framework Dependant, Single File";
#elif FULL_SINGLE
return "Full, Single File";
#elif FULL_MULTI_MSIX
return "Full, Multiple Files, MSIX";
#elif FULL_MULTI_MSIX_STORE
return "Full, Multiple Files, MSIX, Store";
#endif
return "Unidentified";
}
}
}
\ No newline at end of file
...@@ -21,6 +21,34 @@ public static class ProcessHelper ...@@ -21,6 +21,34 @@ public static class ProcessHelper
} }
} }
public static async Task<string> Start(string arguments, bool runWithPowershell = true)
{
var info = new ProcessStartInfo(runWithPowershell ? "Powershell.exe" : "cmd.exe")
{
Arguments = (!runWithPowershell ? "/c " : "") + arguments,
RedirectStandardOutput = true,
CreateNoWindow = true
};
try
{
using var process = new Process();
process.StartInfo = info;
process.Start();
var message = await process.StandardOutput.ReadToEndAsync();
await process.WaitForExitAsync();
return message;
}
catch (Exception e)
{
LogWriter.Log(e, "It was not possible to run the command");
return "";
}
}
public static void StartWithShell(string filename) public static void StartWithShell(string filename)
{ {
var info = new ProcessStartInfo var info = new ProcessStartInfo
...@@ -31,7 +59,7 @@ public static class ProcessHelper ...@@ -31,7 +59,7 @@ public static class ProcessHelper
Process.Start(info); Process.Start(info);
} }
public static async Task<bool> RestartAsAdmin(string arguments = "", bool waitToClose = false) public static async Task<bool> RestartAsAdmin(string arguments = "", bool waitToClose = false)
{ {
try try
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<UseWPF>True</UseWPF> <UseWPF>True</UseWPF>
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<Platforms>AnyCPU;ARM64;x64;x86</Platforms> <Platforms>AnyCPU;ARM64;x64;x86</Platforms>
<Version>2.35.4</Version> <Version>2.36.0</Version>
<!--<UseWindowsForms>True</UseWindowsForms>--> <!--<UseWindowsForms>True</UseWindowsForms>-->
</PropertyGroup> </PropertyGroup>
...@@ -19,41 +19,49 @@ ...@@ -19,41 +19,49 @@
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
using ScreenToGif.Domain.Models; using ScreenToGif.Domain.Models;
using ScreenToGif.Settings.Migrations; using ScreenToGif.Settings.Migrations;
using ScreenToGif.Util.Settings.Migrations;
namespace ScreenToGif.Util.Settings; namespace ScreenToGif.Util.Settings;
...@@ -28,7 +29,7 @@ public static class Migration ...@@ -28,7 +29,7 @@ public static class Migration
case "2.31": //To 2.32 case "2.31": //To 2.32
Migration2_31_0To2_32_0.Up(properties); Migration2_31_0To2_32_0.Up(properties);
goto default; goto case "2.32";
case "2.32": //To 2.35 case "2.32": //To 2.35
case "2.32.1": case "2.32.1":
...@@ -37,6 +38,14 @@ public static class Migration ...@@ -37,6 +38,14 @@ public static class Migration
case "2.34": case "2.34":
case "2.34.1": case "2.34.1":
Migration2_32_0To2_35_0.Up(properties); Migration2_32_0To2_35_0.Up(properties);
goto case "2.35";
case "2.35": //To 2.36
case "2.35.1":
case "2.35.2":
case "2.35.3":
case "2.35.4":
Migration2_35_0To2_36_0.Up(properties);
goto default; goto default;
default: default:
......
using ScreenToGif.Domain.Models;
namespace ScreenToGif.Util.Settings.Migrations;
internal class Migration2_35_0To2_36_0
{
internal static bool Up(List<Property> properties)
{
//Rename a property.
var presets = properties.FirstOrDefault(f => f.Key == "ExportPresets");
if (presets != null)
{
foreach (var child in presets.Children)
{
foreach (var attribute in child.Attributes)
{
switch (attribute.Key)
{
case "OverwriteOnSave":
{
attribute.Key = "OverwriteMode";
attribute.Value = attribute.Value == "True" ? "Allow" : "Prompt";
break;
}
}
}
}
}
return true;
}
}
...@@ -289,6 +289,8 @@ public class UserSettings : INotifyPropertyChanged ...@@ -289,6 +289,8 @@ public class UserSettings : INotifyPropertyChanged
return Enum.Parse(typeof(ColorQuantizationTypes), property.Value); return Enum.Parse(typeof(ColorQuantizationTypes), property.Value);
case "SizeUnits": case "SizeUnits":
return Enum.Parse(typeof(SizeUnits), property.Value); return Enum.Parse(typeof(SizeUnits), property.Value);
case "OverwriteModes":
return Enum.Parse(typeof(OverwriteModes), property.Value);
case "FontWeight": case "FontWeight":
return new FontWeightConverter().ConvertFrom(property.Value); return new FontWeightConverter().ConvertFrom(property.Value);
...@@ -494,7 +496,7 @@ public class UserSettings : INotifyPropertyChanged ...@@ -494,7 +496,7 @@ public class UserSettings : INotifyPropertyChanged
} }
public static void Save(bool canForce = false) public static void Save(bool canForce = false, bool saveToAppData = false)
{ {
//Only writes if non-default values were created. Should not write the default dictionary. //Only writes if non-default values were created. Should not write the default dictionary.
if (_local == null && _appData == null) if (_local == null && _appData == null)
...@@ -503,17 +505,14 @@ public class UserSettings : INotifyPropertyChanged ...@@ -503,17 +505,14 @@ public class UserSettings : INotifyPropertyChanged
try try
{ {
//Filename (Local or AppData). //Filename (Local or AppData).
var folder = _local != null ? AppDomain.CurrentDomain.BaseDirectory : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ScreenToGif"); var folder = !saveToAppData && _local != null ? AppDomain.CurrentDomain.BaseDirectory : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ScreenToGif");
var filename = Path.Combine(folder, "Settings.xaml"); var filename = Path.Combine(folder, "Settings.xaml");
var backup = filename + ".bak";
//Create folder. //Create folder.
if (!string.IsNullOrWhiteSpace(folder) && !Directory.Exists(folder)) if (!string.IsNullOrWhiteSpace(folder) && !Directory.Exists(folder))
Directory.CreateDirectory(folder); Directory.CreateDirectory(folder);
//Create the backup, in case the save operation fails. var backup = File.Exists(filename) ? File.ReadAllText(filename) : null;
if (File.Exists(filename))
File.Copy(filename, backup, true);
var settings = new XmlWriterSettings var settings = new XmlWriterSettings
{ {
...@@ -532,17 +531,21 @@ public class UserSettings : INotifyPropertyChanged ...@@ -532,17 +531,21 @@ public class UserSettings : INotifyPropertyChanged
XamlWriter.Save(_local ?? _appData, writer); XamlWriter.Save(_local ?? _appData, writer);
CheckIfSavedCorrectly(filename, backup, true); CheckIfSavedCorrectly(filename, backup, true);
File.Delete(backup);
} }
catch (UnauthorizedAccessException u) catch (UnauthorizedAccessException u)
{ {
LogWriter.Log(u, "Unauthorized to save the settings."); //Try saving to AppData first, then try harder.
if (!saveToAppData)
if (canForce) {
Save(canForce, true);
}
else if (canForce)
{
LogWriter.Log(u, "Unauthorized to save the settings.");
throw new SettingsPersistenceException(_local ?? _appData, _local != null); throw new SettingsPersistenceException(_local ?? _appData, _local != null);
}
} }
catch (Exception e) catch (Exception e) when (e is not SettingsPersistenceException)
{ {
LogWriter.Log(e, "Impossible to save the settings."); LogWriter.Log(e, "Impossible to save the settings.");
} }
...@@ -589,7 +592,7 @@ public class UserSettings : INotifyPropertyChanged ...@@ -589,7 +592,7 @@ public class UserSettings : INotifyPropertyChanged
if (content.All(x => x == '\0')) if (content.All(x => x == '\0'))
{ {
LogWriter.Log("Settings disk persistence failed.", content); LogWriter.Log("Settings disk persistence failed.", content);
File.Copy(backup, filename, true); File.WriteAllText(filename, backup);
if (throwException) if (throwException)
throw new UnauthorizedAccessException("The file had garbage inside it."); throw new UnauthorizedAccessException("The file had garbage inside it.");
...@@ -597,7 +600,7 @@ public class UserSettings : INotifyPropertyChanged ...@@ -597,7 +600,7 @@ public class UserSettings : INotifyPropertyChanged
} }
catch (Exception e) catch (Exception e)
{ {
LogWriter.Log(e, "Impossible to check if the settings file was saved correctly."); LogWriter.Log(e, "Impossible to check if the settings file was saved correctly or impossible to restore backup.");
} }
} }
......
...@@ -242,12 +242,6 @@ public static class StreamHelpers ...@@ -242,12 +242,6 @@ public static class StreamHelpers
ms.Write(bytes, 0, bytes.Length); ms.Write(bytes, 0, bytes.Length);
} }
public static void WriteString1252(this Stream ms, string value)
{
var bytes = Encoding.GetEncoding(1252).GetBytes(value);
ms.Write(bytes, 0, bytes.Length);
}
public static byte[] GetPascalStringAsBytes(byte[] bytes, bool padded = true, int byteLimit = 31) public static byte[] GetPascalStringAsBytes(byte[] bytes, bool padded = true, int byteLimit = 31)
{ {
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
...@@ -267,7 +261,7 @@ public static class StreamHelpers ...@@ -267,7 +261,7 @@ public static class StreamHelpers
public static void WritePascalString(this Stream ms, string value, bool padded = true) public static void WritePascalString(this Stream ms, string value, bool padded = true)
{ {
var bytes = Encoding.GetEncoding(1252).GetBytes(value); var bytes = Encoding.Unicode.GetBytes(value);
ms.WriteByte((byte)bytes.Length); //String size, 1 byte. ms.WriteByte((byte)bytes.Length); //String size, 1 byte.
ms.Write(bytes, 0, bytes.Length); //String, XX bytes. ms.Write(bytes, 0, bytes.Length); //String, XX bytes.
......
...@@ -37,7 +37,7 @@ public abstract class ExportPreset : BindableBase, IExportPreset ...@@ -37,7 +37,7 @@ public abstract class ExportPreset : BindableBase, IExportPreset
private int _partialExportFrameEnd = 0; private int _partialExportFrameEnd = 0;
private string _partialExportFrameExpression; private string _partialExportFrameExpression;
private bool _pickLocation = true; private bool _pickLocation = true;
private bool _overwriteOnSave; private OverwriteModes _overwriteMode;
private bool _exportAsProjectToo; private bool _exportAsProjectToo;
private bool _uploadFile; private bool _uploadFile;
private string _uploadService; private string _uploadService;
...@@ -245,10 +245,10 @@ public abstract class ExportPreset : BindableBase, IExportPreset ...@@ -245,10 +245,10 @@ public abstract class ExportPreset : BindableBase, IExportPreset
set => SetProperty(ref _pickLocation, value); set => SetProperty(ref _pickLocation, value);
} }
public bool OverwriteOnSave public OverwriteModes OverwriteMode
{ {
get => _overwriteOnSave; get => _overwriteMode;
set => SetProperty(ref _overwriteOnSave, value); set => SetProperty(ref _overwriteMode, value);
} }
public bool ExportAsProjectToo public bool ExportAsProjectToo
...@@ -393,9 +393,6 @@ public abstract class ExportPreset : BindableBase, IExportPreset ...@@ -393,9 +393,6 @@ public abstract class ExportPreset : BindableBase, IExportPreset
if (ResolvedFilename.ToCharArray().Any(x => Path.GetInvalidFileNameChars().Contains(x))) if (ResolvedFilename.ToCharArray().Any(x => Path.GetInvalidFileNameChars().Contains(x)))
return Task.FromResult(new ValidatedEventArgs("S.SaveAs.Warning.Filename.Invalid", StatusReasons.InvalidState)); return Task.FromResult(new ValidatedEventArgs("S.SaveAs.Warning.Filename.Invalid", StatusReasons.InvalidState));
if (!OverwriteOnSave && File.Exists(Path.Combine(OutputFolder, ResolvedFilename + Extension)))
return Task.FromResult(new ValidatedEventArgs("S.SaveAs.Warning.Overwrite", StatusReasons.FileAlreadyExists));
} }
//Upload set, but no service selected. //Upload set, but no service selected.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
<Platforms>AnyCPU;ARM64;x64;x86</Platforms> <Platforms>AnyCPU;ARM64;x64;x86</Platforms>
<Version>2.35.4</Version> <Version>2.36.0</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
...@@ -6,6 +6,14 @@ public class UpdateAvailable ...@@ -6,6 +6,14 @@ public class UpdateAvailable
{ {
public bool IsFromGithub { get; set; } = true; public bool IsFromGithub { get; set; } = true;
/// <summary>
/// The update binary idenfitication failed.
/// Update must be done manually.
/// </summary>
public bool MustDownloadManually { get; set; } = false;
public bool HasDownloadLink => !string.IsNullOrWhiteSpace(InstallerDownloadUrl);
public Version Version { get; set; } public Version Version { get; set; }
public string Description { get; set; } public string Description { get; set; }
public bool IsDownloading { get; set; } public bool IsDownloading { get; set; }
...@@ -19,7 +27,18 @@ public class UpdateAvailable ...@@ -19,7 +27,18 @@ public class UpdateAvailable
public string PortableName { get; set; } public string PortableName { get; set; }
public string PortableDownloadUrl { get; set; } public string PortableDownloadUrl { get; set; }
public long PortableSize { get; set; } public long PortableSize { get; set; }
#if FULL_MULTI_MSIX
public string ActivePath
{
get => InstallerPath;
set => InstallerPath = value;
}
public string ActiveName => InstallerName;
public string ActiveDownloadUrl => InstallerDownloadUrl;
public long ActiveSize => InstallerSize;
#else
public string ActivePath public string ActivePath
{ {
get => UserSettings.All.PortableUpdate ? PortablePath : InstallerPath; get => UserSettings.All.PortableUpdate ? PortablePath : InstallerPath;
...@@ -35,6 +54,7 @@ public class UpdateAvailable ...@@ -35,6 +54,7 @@ public class UpdateAvailable
public string ActiveName => UserSettings.All.PortableUpdate ? PortableName : InstallerName; public string ActiveName => UserSettings.All.PortableUpdate ? PortableName : InstallerName;
public string ActiveDownloadUrl => UserSettings.All.PortableUpdate ? PortableDownloadUrl : InstallerDownloadUrl; public string ActiveDownloadUrl => UserSettings.All.PortableUpdate ? PortableDownloadUrl : InstallerDownloadUrl;
public long ActiveSize => UserSettings.All.PortableUpdate ? PortableSize : InstallerSize; public long ActiveSize => UserSettings.All.PortableUpdate ? PortableSize : InstallerSize;
#endif
public TaskCompletionSource<bool> TaskCompletionSource { get; set; } public TaskCompletionSource<bool> TaskCompletionSource { get; set; }
} }
\ No newline at end of file
...@@ -34,9 +34,8 @@ public class StatusList : StackPanel ...@@ -34,9 +34,8 @@ public class StatusList : StackPanel
if (current != null) if (current != null)
Children.Remove(current); Children.Remove(current);
var band = new StatusBand(); var band = new StatusBand { Reason = reason };
band.Reason = reason; band.Dismissed += (_, _) => Children.Remove(band);
band.Dismissed += (sender, args) => Children.Remove(band);
if (Children.Count >= MaxBands) if (Children.Count >= MaxBands)
Children.RemoveAt(0); Children.RemoveAt(0);
...@@ -57,7 +56,7 @@ public class StatusList : StackPanel ...@@ -57,7 +56,7 @@ public class StatusList : StackPanel
} }
} }
public void Info(string text, StatusReasons reason, Action action = null) public void Info(string text, StatusReasons reason = StatusReasons.None, Action action = null)
{ {
Add(StatusType.Info, text, reason, action); Add(StatusType.Info, text, reason, action);
} }
......
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\Publish\Dependent\ARM64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup>
</Project>
\ No newline at end of file
...@@ -6,12 +6,12 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,12 +6,12 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\Publish\Contained\ARM64</PublishDir> <PublishDir>bin\Publish\Full\ARM64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-arm64</RuntimeIdentifier> <RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<SelfContained>true</SelfContained> <SelfContained>true</SelfContained>
<PublishSingleFile>False</PublishSingleFile> <PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun> <PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup> </PropertyGroup>
</Project> </Project>
\ No newline at end of file
...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\Publish\Dependent\ARM64</PublishDir> <PublishDir>bin\Publish\Full-Single\ARM64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-arm64</RuntimeIdentifier> <RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<SelfContained>false</SelfContained> <SelfContained>true</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun> <PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup> </PropertyGroup>
......
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>x64</Platform>
<PublishDir>bin\Publish\Dependent\x64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup>
</Project>
\ No newline at end of file
...@@ -6,7 +6,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,7 +6,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\Publish\Contained\x64</PublishDir> <PublishDir>bin\Publish\Full\x64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
......
...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\Publish\Dependent\x64</PublishDir> <PublishDir>bin\Publish\Full-Single\x64</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>false</SelfContained> <SelfContained>true</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun> <PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup> </PropertyGroup>
......
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>x86</Platform>
<PublishDir>bin\Publish\Dependent\x86</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup>
</Project>
\ No newline at end of file
...@@ -6,12 +6,12 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,12 +6,12 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x86</Platform> <Platform>x86</Platform>
<PublishDir>bin\Publish\Contained\x86</PublishDir> <PublishDir>bin\Publish\Full\x86</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier> <RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>true</SelfContained> <SelfContained>true</SelfContained>
<PublishSingleFile>False</PublishSingleFile> <PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun> <PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup> </PropertyGroup>
</Project> </Project>
\ No newline at end of file
...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121. ...@@ -6,11 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x86</Platform> <Platform>x86</Platform>
<PublishDir>bin\Publish\Dependent\x86</PublishDir> <PublishDir>bin\Publish\Full-Single\x86</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier> <RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>false</SelfContained> <SelfContained>true</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun> <PublishReadyToRun>False</PublishReadyToRun>
</PropertyGroup> </PropertyGroup>
......
...@@ -4,15 +4,21 @@ This is the current project of ScreenToGif. ...@@ -4,15 +4,21 @@ This is the current project of ScreenToGif.
_VS 2022 and .NET 6 or newer required._ _VS 2022 and .NET 6 or newer required._
## What's new? (Version 2.35.4) ## What's new? (Version 2.36)
• Updated the French localization. • New installer and portable versions with the full package (no .NET 6 download required) are available alongside with the lighter versions, which still require the installation of .NET 6 desktop runtime.
• New installer package (MSIX) available.
• Added an option to prompt to overwrite when saving (enabled by default).
• Updated the Danish, French, German, Hungarian, Polish, Norwegian, Russian, and Simplified Chinese localizations.
### Fixed: ### Fixed:
♦ It was not possible to load projects from the recent prtojects list. ♦ The smooth loop feature was not working properly.
♦ It was possible to import images with multiple sizes, which would end up in crashes during encoding. ♦ A new message will be displayed if you already have a smooth loop based on current settings instead of a warning.
♦ The translation updater was not working for portable releases. ♦ It was not possible to set the app to start at Windows startup.
♦ A settings migration issue from 2.31 to newer versions was fixed.
♦ It was not possible to export as PSD.
♦ When not having permission to save the settings to the installation location, the app would not try to save to AppData.
### Known Bugs: ### Known Bugs:
......
...@@ -1307,6 +1307,7 @@ ...@@ -1307,6 +1307,7 @@
<s:String x:Key="S.SmoothLoop.Info">Tries to find a frame at least {0} % similar to the start frame and deletes all later frames.&#x0d;You can choose if you want to ignore some initial frames and initiate the comparison from the start (after the threshold) or the end.</s:String> <s:String x:Key="S.SmoothLoop.Info">Tries to find a frame at least {0} % similar to the start frame and deletes all later frames.&#x0d;You can choose if you want to ignore some initial frames and initiate the comparison from the start (after the threshold) or the end.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.Threshold">The number of frames to ignore needs to be smaller than the total number of frames.</s:String> <s:String x:Key="S.SmoothLoop.Warning.Threshold">The number of frames to ignore needs to be smaller than the total number of frames.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">It was not possible to create a smooth loop with the selected settings.</s:String> <s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">It was not possible to create a smooth loop with the selected settings.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.AlreadySmoothLoop">You already have a smooth loop based on selected settings.</s:String>
<!--Editor • Captions--> <!--Editor • Captions-->
<s:String x:Key="S.Caption.Text">Text</s:String> <s:String x:Key="S.Caption.Text">Text</s:String>
...@@ -1693,7 +1694,13 @@ ...@@ -1693,7 +1694,13 @@
<s:String x:Key="S.SaveAs.SaveOptions">Export options</s:String> <s:String x:Key="S.SaveAs.SaveOptions">Export options</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.Partial">Export partially.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.Partial">Export partially.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.PickFolder">Save the file to a folder of your choice.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.PickFolder">Save the file to a folder of your choice.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.Overwrite">Overwrite (if already exists).</s:String> <s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode">Overwrite?</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Warn">Warn</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Warn.Info">Only warns that another file exists with the same name.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Prompt">Prompt</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Prompt.Info">Asks if the user wants to overwrite the file.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Allow">Allow</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Allow.Info">Simply overwrites the file.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.ProjectToo">Save as project too (same folder, same filename).</s:String> <s:String x:Key="S.SaveAs.SaveOptions.ProjectToo">Save as project too (same folder, same filename).</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.UploadFile">Upload the file.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.UploadFile">Upload the file.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.CopyToClipboard">Copy to the clipboard.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.CopyToClipboard">Copy to the clipboard.</s:String>
...@@ -1783,6 +1790,11 @@ ...@@ -1783,6 +1790,11 @@
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Title">Export Frames</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Title">Export Frames</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Instruction">Are you sure that you want to export the frames?</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Instruction">Are you sure that you want to export the frames?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Message">This action will export {0} frames directly into the selected folder.</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Message">This action will export {0} frames directly into the selected folder.</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Title">Overwrite</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Instruction">Would you like to overwrite the file?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Message">A file with the name '{0}' already exists in that folder.\r\nWould you like to overwrite it?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.OverwriteMultiple.Instruction">Would you like to overwrite the files?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.OverwriteMultiple.Message">One or more files with the same name already exist in that folder.\r\nWould you like to overwrite them?</s:String>
<!--Command Preview--> <!--Command Preview-->
<s:String x:Key="S.CommandPreviewer.Title">Command Previewer</s:String> <s:String x:Key="S.CommandPreviewer.Title">Command Previewer</s:String>
......
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s="clr-namespace:System;assembly=mscorlib"
xml:space="preserve"> xml:space="preserve">
...@@ -61,7 +61,12 @@ ...@@ -61,7 +61,12 @@
<s:String x:Key="S.Warning.Graphics.Switch">Gépház megnyitása</s:String> <s:String x:Key="S.Warning.Graphics.Switch">Gépház megnyitása</s:String>
<!--Keys--> <!--Keys-->
<s:String x:Key="S.Keys.Enter">Enter</s:String>
<s:String x:Key="S.Keys.Esc">Esc</s:String>
<s:String x:Key="S.Keys.Space">Szóköz</s:String> <s:String x:Key="S.Keys.Space">Szóköz</s:String>
<!--Mouse-->
<s:String x:Key="S.Mouse.Right">Jobb kattintás</s:String>
<!--Tray icon--> <!--Tray icon-->
<s:String x:Key="S.NewRecording">Új képernyőfelvétel</s:String> <s:String x:Key="S.NewRecording">Új képernyőfelvétel</s:String>
...@@ -104,6 +109,7 @@ ...@@ -104,6 +109,7 @@
<s:String x:Key="S.Command.DeleteNext">Az összes következő képkocka törlése</s:String> <s:String x:Key="S.Command.DeleteNext">Az összes következő képkocka törlése</s:String>
<s:String x:Key="S.Command.RemoveDuplicates">Ismétlődések eltávolítása</s:String> <s:String x:Key="S.Command.RemoveDuplicates">Ismétlődések eltávolítása</s:String>
<s:String x:Key="S.Command.Reduce">A képkockaszám csökkentése</s:String> <s:String x:Key="S.Command.Reduce">A képkockaszám csökkentése</s:String>
<s:String x:Key="S.Command.SmoothLoop">Egy egyenletes ciklus létrehozása</s:String>
<s:String x:Key="S.Command.Reverse">Fordított animáció</s:String> <s:String x:Key="S.Command.Reverse">Fordított animáció</s:String>
<s:String x:Key="S.Command.Yoyo">Az animációt előre-hátra mozgóvá teszi</s:String> <s:String x:Key="S.Command.Yoyo">Az animációt előre-hátra mozgóvá teszi</s:String>
<s:String x:Key="S.Command.MoveLeft">A kijelölt képkocka mozgatása balra</s:String> <s:String x:Key="S.Command.MoveLeft">A kijelölt képkocka mozgatása balra</s:String>
...@@ -159,6 +165,7 @@ ...@@ -159,6 +165,7 @@
<s:String x:Key="S.Updater.Header">Egy új frissítés érhető el</s:String> <s:String x:Key="S.Updater.Header">Egy új frissítés érhető el</s:String>
<s:String x:Key="S.Updater.NewRelease">Új kiadás!</s:String> <s:String x:Key="S.Updater.NewRelease">Új kiadás!</s:String>
<s:String x:Key="S.Updater.NewRelease.Info">Új kiadás áll rendelkezésre, Verzió {0}!&#x0d;Kattints ide további részletekért.</s:String> <s:String x:Key="S.Updater.NewRelease.Info">Új kiadás áll rendelkezésre, Verzió {0}!&#x0d;Kattints ide további részletekért.</s:String>
<s:String x:Key="S.Updater.NoNewRelease.Info">Úgy tűnik, hogy a rendszered már nem támogatott, vagy valami megváltozott a frissítési rendszerben. Próbáld meg manuálisan letölteni a weboldalról.</s:String>
<s:String x:Key="S.Updater.Version">Verzió</s:String> <s:String x:Key="S.Updater.Version">Verzió</s:String>
<s:String x:Key="S.Updater.Portable">Hordozható</s:String> <s:String x:Key="S.Updater.Portable">Hordozható</s:String>
<s:String x:Key="S.Updater.Installer">Telepítő</s:String> <s:String x:Key="S.Updater.Installer">Telepítő</s:String>
...@@ -195,9 +202,7 @@ ...@@ -195,9 +202,7 @@
<s:String x:Key="S.Options.Other">Egyéb</s:String> <s:String x:Key="S.Options.Other">Egyéb</s:String>
<s:String x:Key="S.Options.Warning.Follow.Header">Hiányzik a billentyűparancs a kurzor követéséhez</s:String> <s:String x:Key="S.Options.Warning.Follow.Header">Hiányzik a billentyűparancs a kurzor követéséhez</s:String>
<s:String x:Key="S.Options.Warning.Follow.Message">Az egérmutató követési funkciójának használatához be kell állítanod egy billentyűparancsot, amely szükség esetén bekapcsolja azt.</s:String> <s:String x:Key="S.Options.Warning.Follow.Message">Az egérmutató követési funkciójának használatához be kell állítanod egy billentyűparancsot, amely szükség esetén bekapcsolja azt.</s:String>
<s:String x:Key="S.Options.Warning.DesktopDuplication.Header">Hiányoznak a képernyőfelvétel függőségei</s:String>
<s:String x:Key="S.Options.Warning.DesktopDuplication.Message">A képernyő rögzítésének érdekében (a Desktop Duplication API-val), le kell töltened a SharpDx könyvtárakat.</s:String>
<!--Options • Application--> <!--Options • Application-->
<s:String x:Key="S.Options.App.Startup">Indítás</s:String> <s:String x:Key="S.Options.App.Startup">Indítás</s:String>
<s:String x:Key="S.Options.App.Startup.Mode.Manual">Indítás&#x0d;manuálisan</s:String> <s:String x:Key="S.Options.App.Startup.Mode.Manual">Indítás&#x0d;manuálisan</s:String>
...@@ -369,6 +374,12 @@ ...@@ -369,6 +374,12 @@
<s:String x:Key="S.Options.Editor.General.LimitHistory">A visszavonási / ismétlési előzmények korlátozása.</s:String> <s:String x:Key="S.Options.Editor.General.LimitHistory">A visszavonási / ismétlési előzmények korlátozása.</s:String>
<s:String x:Key="S.Options.Editor.General.LimitHistory.Info">(A régebbi műveletek a korlát elérésekor törlődnek)</s:String> <s:String x:Key="S.Options.Editor.General.LimitHistory.Info">(A régebbi műveletek a korlát elérésekor törlődnek)</s:String>
<s:String x:Key="S.Options.Editor.General.LimitHistory.Maximum">(A tárolt műveletek maximális száma)</s:String> <s:String x:Key="S.Options.Editor.General.LimitHistory.Maximum">(A tárolt műveletek maximális száma)</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.Folder">A kimeneti mappa szinkronizálása az előbeállítások között.</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.Folder.Info">(Az előbeállítások ugyanazt a kimeneti útvonalat használják)</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.Filename">Szinkronizálja a fájlnevet is.</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.Filename.Info">(Az előbeállítások is ugyanazt a fájlnevet fogják használni)</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.SameType">Csak az azonos fájltípusú előbeállítások szinkronizálása.</s:String>
<s:String x:Key="S.Options.Editor.General.SyncPath.SameType.Info">(Csak az azonos fájltípusú előbeállítások lesznek szinkronban)</s:String>
<!--Options • Tasks--> <!--Options • Tasks-->
<s:String x:Key="S.Options.Tasks.Title">Automatizált feladat</s:String> <s:String x:Key="S.Options.Tasks.Title">Automatizált feladat</s:String>
...@@ -572,9 +583,6 @@ ...@@ -572,9 +583,6 @@
<s:String x:Key="S.Options.Extras.GifskiLocation.Select">Válaszd ki a Gifski könyvtár helyét</s:String> <s:String x:Key="S.Options.Extras.GifskiLocation.Select">Válaszd ki a Gifski könyvtár helyét</s:String>
<s:String x:Key="S.Options.Extras.GifskiLocation.File">Gifski könyvtár</s:String> <s:String x:Key="S.Options.Extras.GifskiLocation.File">Gifski könyvtár</s:String>
<s:String x:Key="S.Options.Extras.GifskiLocation.Invalid">A Gifski könyvtár elérési útja egy vagy több érvénytelen karaktert tartalmaz. Válassz érvényes helyet a könyvtárhoz.</s:String> <s:String x:Key="S.Options.Extras.GifskiLocation.Invalid">A Gifski könyvtár elérési útja egy vagy több érvénytelen karaktert tartalmaz. Válassz érvényes helyet a könyvtárhoz.</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation">SharpDx mappa (SharpDX.dll, SharpDX.Direct3D11.dll és SharpDX.DXGI.dll)</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation.Select">Válaszd ki a SharpDx-könyvtárak helyét</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation.Invalid">A SharpDx-tárak elérési útja egy vagy több érvénytelen karaktert tartalmaz. Jelölj ki egy érvényes mappát ezekhez a könyvtárakhoz.</s:String>
<s:String x:Key="S.Options.Extras.License.Ffmpeg">FFmpeg licenc</s:String> <s:String x:Key="S.Options.Extras.License.Ffmpeg">FFmpeg licenc</s:String>
<s:String x:Key="S.Options.Extras.License.Gifski">Gifski licenc</s:String> <s:String x:Key="S.Options.Extras.License.Gifski">Gifski licenc</s:String>
<s:String x:Key="S.Options.Extras.License.SharpDx">SharpDx licenc</s:String> <s:String x:Key="S.Options.Extras.License.SharpDx">SharpDx licenc</s:String>
...@@ -602,6 +610,8 @@ ...@@ -602,6 +610,8 @@
<!--Options • About--> <!--Options • About-->
<s:String x:Key="S.Options.About.Version">Verzió:</s:String> <s:String x:Key="S.Options.About.Version">Verzió:</s:String>
<s:String x:Key="S.Options.About.UpdateCheck">Frissítések keresése</s:String>
<s:String x:Key="S.Options.About.UpdateCheck.Nothing">A legfrissebb verzióval rendelkezel.</s:String>
<s:String x:Key="S.Options.About.Author">Szerző: Nicke Manarin</s:String> <s:String x:Key="S.Options.About.Author">Szerző: Nicke Manarin</s:String>
<s:String x:Key="S.Options.About.StoreVersion">A Microsoft Store verzió. Egyes szolgáltatások a kényszerített házirendek miatt le vannak tiltva.</s:String> <s:String x:Key="S.Options.About.StoreVersion">A Microsoft Store verzió. Egyes szolgáltatások a kényszerített házirendek miatt le vannak tiltva.</s:String>
<s:String x:Key="S.Options.About.Contact">Kapcsolat</s:String> <s:String x:Key="S.Options.About.Contact">Kapcsolat</s:String>
...@@ -679,8 +689,7 @@ ...@@ -679,8 +689,7 @@
<s:String x:Key="S.Recorder.Warning.CaptureNotPossible.Info">Nem lehetett rögzíteni a képernyőt. A rögzítési módszer 5 próbálkozás után nem adott vissza képkockát.</s:String> <s:String x:Key="S.Recorder.Warning.CaptureNotPossible.Info">Nem lehetett rögzíteni a képernyőt. A rögzítési módszer 5 próbálkozás után nem adott vissza képkockát.</s:String>
<s:String x:Key="S.Recorder.Warning.StartPauseNotPossible">A képernyő rögzítését nem lehetett elindítani / szüneteltetni</s:String> <s:String x:Key="S.Recorder.Warning.StartPauseNotPossible">A képernyő rögzítését nem lehetett elindítani / szüneteltetni</s:String>
<s:String x:Key="S.Recorder.Warning.Windows8">Windows 8 vagy újabb szükséges a képernyő rögzítéséhez (Desktop Duplication API használatával).</s:String> <s:String x:Key="S.Recorder.Warning.Windows8">Windows 8 vagy újabb szükséges a képernyő rögzítéséhez (Desktop Duplication API használatával).</s:String>
<s:String x:Key="S.Recorder.Warning.MissingSharpDx">A SharpDx könyvtárak szükségesek ahhoz, hogy rögzítsd a képernyőt a Desktop Duplication API-val. A letöltéshez nyisd meg az Beállítások > Extrák lehetőséget.</s:String>
<!--New recorder--> <!--New recorder-->
<s:String x:Key="S.Recorder.Area">Terület</s:String> <s:String x:Key="S.Recorder.Area">Terület</s:String>
<s:String x:Key="S.Recorder.Area.Select">Egy terület kijelölése</s:String> <s:String x:Key="S.Recorder.Area.Select">Egy terület kijelölése</s:String>
...@@ -1015,6 +1024,7 @@ ...@@ -1015,6 +1024,7 @@
<s:String x:Key="S.Editor.Edit.Delete">Törlés</s:String> <s:String x:Key="S.Editor.Edit.Delete">Törlés</s:String>
<s:String x:Key="S.Editor.Edit.Frames.Duplicates">Ismétlődések&#10;eltávolítása</s:String> <s:String x:Key="S.Editor.Edit.Frames.Duplicates">Ismétlődések&#10;eltávolítása</s:String>
<s:String x:Key="S.Editor.Edit.Frames.Reduce">Képkockaszám&#x0d;csökkentése</s:String> <s:String x:Key="S.Editor.Edit.Frames.Reduce">Képkockaszám&#x0d;csökkentése</s:String>
<s:String x:Key="S.Editor.Edit.Frames.SmoothLoop">Egyenletes&#x0d;ciklus</s:String>
<s:String x:Key="S.Editor.Edit.DeletePrevious">Az összes előző törlése</s:String> <s:String x:Key="S.Editor.Edit.DeletePrevious">Az összes előző törlése</s:String>
<s:String x:Key="S.Editor.Edit.DeleteNext">Az összes következő törlése</s:String> <s:String x:Key="S.Editor.Edit.DeleteNext">Az összes következő törlése</s:String>
...@@ -1125,6 +1135,7 @@ ...@@ -1125,6 +1135,7 @@
<s:String x:Key="S.Editor.Warning.Gifski">Gifski nincs jelen. Add hozzá a Path környezeti változókhoz, vagy kattints ide a Beállítások > Extrák megnyitásához és a hely beállításához.</s:String> <s:String x:Key="S.Editor.Warning.Gifski">Gifski nincs jelen. Add hozzá a Path környezeti változókhoz, vagy kattints ide a Beállítások > Extrák megnyitásához és a hely beállításához.</s:String>
<s:String x:Key="S.Editor.Warning.LowSpace">Nincs elég hely a meghajtón, ahol ez az alkalmazás tárolja a gyorsítótárat ({0}% maradt). Kattints ide a Beállítások > Ideiglenes fájlok megnyitásához, hogy helyet szabadítson fel.</s:String> <s:String x:Key="S.Editor.Warning.LowSpace">Nincs elég hely a meghajtón, ahol ez az alkalmazás tárolja a gyorsítótárat ({0}% maradt). Kattints ide a Beállítások > Ideiglenes fájlok megnyitásához, hogy helyet szabadítson fel.</s:String>
<s:String x:Key="S.Editor.Warning.DifferentDpi">Több különböző DPI-vel rendelkező képet próbáltál importálni, ami nem támogatott. Néhány importálva lett, a többit külön kell importálni.</s:String> <s:String x:Key="S.Editor.Warning.DifferentDpi">Több különböző DPI-vel rendelkező képet próbáltál importálni, ami nem támogatott. Néhány importálva lett, a többit külön kell importálni.</s:String>
<s:String x:Key="S.Editor.Warning.DifferentSize">Több különböző méretű képet próbáltál importálni, ami nem támogatott. Néhányat sikerült importálni, másokat külön-külön kell importálni.</s:String>
<!--Editor • Status--> <!--Editor • Status-->
<s:String x:Key="S.Editor.RetrievingFromCache">Képkockák visszanyerése a gyorsítótárból.</s:String> <s:String x:Key="S.Editor.RetrievingFromCache">Képkockák visszanyerése a gyorsítótárból.</s:String>
...@@ -1145,6 +1156,8 @@ ...@@ -1145,6 +1156,8 @@
<s:String x:Key="S.Editor.ApplyingTransition">Az áttűnési hatás alkalmazása</s:String> <s:String x:Key="S.Editor.ApplyingTransition">Az áttűnési hatás alkalmazása</s:String>
<s:String x:Key="S.Editor.PreparingSaving">Mentés előkészítése</s:String> <s:String x:Key="S.Editor.PreparingSaving">Mentés előkészítése</s:String>
<s:String x:Key="S.Editor.CancelDiscard">A betöltés megszakítása és a projekt elvetése.</s:String> <s:String x:Key="S.Editor.CancelDiscard">A betöltés megszakítása és a projekt elvetése.</s:String>
<s:String x:Key="S.Editor.FindingLoop">A tökéletes ciklus megtalálása</s:String>
<s:String x:Key="S.Editor.DiscardingLoop">A ciklusban fel nem használt képkockák elvetése</s:String>
<!--Editor • Frame list--> <!--Editor • Frame list-->
<s:String x:Key="S.Editor.List.Frame">Képkocka:</s:String> <s:String x:Key="S.Editor.List.Frame">Képkocka:</s:String>
...@@ -1229,16 +1242,18 @@ ...@@ -1229,16 +1242,18 @@
<s:String x:Key="S.Clipboard.After">A kiválasztott képkocka után</s:String> <s:String x:Key="S.Clipboard.After">A kiválasztott képkocka után</s:String>
<!--Editor • Resize--> <!--Editor • Resize-->
<s:String x:Key="S.Resize.CurrentProperties">Jelenlegi tulajdonságok</s:String> <s:String x:Key="S.Resize.Difference">Különbség</s:String>
<s:String x:Key="S.Resize.Dpi">Dpi</s:String> <s:String x:Key="S.Resize.Dpi">Dpi</s:String>
<s:String x:Key="S.Resize.NewProperties">Új tulajdonságok</s:String> <s:String x:Key="S.Resize.Options">Beállítások</s:String>
<s:String x:Key="S.Resize.Pixels">Pixelek (px)</s:String>
<s:String x:Key="S.Resize.Percent">Százalék (%)</s:String>
<s:String x:Key="S.Resize.Dpi2">DPI:</s:String> <s:String x:Key="S.Resize.Dpi2">DPI:</s:String>
<s:String x:Key="S.Resize.KeepAspect">Képarány megtartása.</s:String> <s:String x:Key="S.Resize.KeepAspect">Képarány megtartása.</s:String>
<s:String x:Key="S.Resize.Options">Beállítások</s:String>
<s:String x:Key="S.Resize.ScalingQuality">Méretezés minősége:</s:String> <s:String x:Key="S.Resize.ScalingQuality">Méretezés minősége:</s:String>
<s:String x:Key="S.Resize.ScalingQuality.Fant">Fant (jobb minőségű)</s:String> <s:String x:Key="S.Resize.ScalingQuality.Fant">Fant (jobb minőségű)</s:String>
<s:String x:Key="S.Resize.ScalingQuality.Linear">Lineáris (gyengébb minőség)</s:String> <s:String x:Key="S.Resize.ScalingQuality.Linear">Lineáris (gyengébb minőség)</s:String>
<s:String x:Key="S.Resize.ScalingQuality.NearestNeighbor">Legközelebbi szomszéd (gyengébb minőségű és gyorsabb)</s:String> <s:String x:Key="S.Resize.ScalingQuality.NearestNeighbor">Legközelebbi szomszéd (gyengébb minőségű és gyorsabb)</s:String>
<s:String x:Key="S.Resize.ScalingQuality.Info">Méretezési minőség.</s:String>
<s:String x:Key="S.Resize.Warning">Az Átméretezés művelet alkalmazásához másik értéket kell választanod.</s:String> <s:String x:Key="S.Resize.Warning">Az Átméretezés művelet alkalmazásához másik értéket kell választanod.</s:String>
<!--Editor • Crop--> <!--Editor • Crop-->
...@@ -1282,6 +1297,16 @@ ...@@ -1282,6 +1297,16 @@
<s:String x:Key="S.RemoveDuplicates.Delay.Average">Átlag használata</s:String> <s:String x:Key="S.RemoveDuplicates.Delay.Average">Átlag használata</s:String>
<s:String x:Key="S.RemoveDuplicates.Delay.Sum">Az összeg használata</s:String> <s:String x:Key="S.RemoveDuplicates.Delay.Sum">Az összeg használata</s:String>
<s:String x:Key="S.RemoveDuplicates.Info">Ez a művelet elemzi az egyes képkockákat (képpontról képpontra), és eltávolítja azokat, amelyek legalább {0} %-ban hasonlítanak a közvetlen szomszédjára.&#x0d;Kiválaszthatod, hogy módosítani szeretnéd-e a képkockák késleltetését (kiállítási időtartamát).</s:String> <s:String x:Key="S.RemoveDuplicates.Info">Ez a művelet elemzi az egyes képkockákat (képpontról képpontra), és eltávolítja azokat, amelyek legalább {0} %-ban hasonlítanak a közvetlen szomszédjára.&#x0d;Kiválaszthatod, hogy módosítani szeretnéd-e a képkockák késleltetését (kiállítási időtartamát).</s:String>
<!--Editor • Smooth Loop-->
<s:String x:Key="S.SmoothLoop.Header">Egyenletes ciklus létrehozása</s:String>
<s:String x:Key="S.SmoothLoop.StartThreshold">Az első figyelmen kívül hagyása: </s:String>
<s:String x:Key="S.SmoothLoop.From">Összehasonlítás innen:</s:String>
<s:String x:Key="S.SmoothLoop.From.Last">Vége</s:String>
<s:String x:Key="S.SmoothLoop.From.First">Eleje</s:String>
<s:String x:Key="S.SmoothLoop.Info">Megpróbál egy olyan képkockát találni, amely legalább {0} %-ban hasonlít a kezdő képkockára, és törli az összes későbbi képkockát.&#x0d; Kiválaszthatod, hogy figyelmen kívül akarsz-e hagyni néhány kezdeti képkockát, és az összehasonlítást az elejétől (a küszöbérték után) vagy a végétől kezded.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.Threshold">A figyelmen kívül hagyandó képkockák számának kisebbnek kell lennie, mint a képkockák teljes száma.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">A kiválasztott beállításokkal nem lehetett egyenletes ciklust létrehozni.</s:String>
<!--Editor • Captions--> <!--Editor • Captions-->
<s:String x:Key="S.Caption.Text">Szöveg</s:String> <s:String x:Key="S.Caption.Text">Szöveg</s:String>
......
...@@ -1307,6 +1307,7 @@ ...@@ -1307,6 +1307,7 @@
<s:String x:Key="S.SmoothLoop.Info">Tenta encontrar um quadro com no mínimo {0} % de similaridade do quadro inicial e deleta todos os próximos quadros.&#x0d;Você pode escolher se você quer ignorar alguns quadros iniciais e/ou executar a verificação do início (depois dos quadros ignorados) ou do fim.</s:String> <s:String x:Key="S.SmoothLoop.Info">Tenta encontrar um quadro com no mínimo {0} % de similaridade do quadro inicial e deleta todos os próximos quadros.&#x0d;Você pode escolher se você quer ignorar alguns quadros iniciais e/ou executar a verificação do início (depois dos quadros ignorados) ou do fim.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.Threshold">O número de quadros para serem ignorados precisa ser menor que o número de quadros totais.</s:String> <s:String x:Key="S.SmoothLoop.Warning.Threshold">O número de quadros para serem ignorados precisa ser menor que o número de quadros totais.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">Não foi posssível criar um loop suave com as configurações atuais.</s:String> <s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">Não foi posssível criar um loop suave com as configurações atuais.</s:String>
<s:String x:Key="S.SmoothLoop.Warning.AlreadySmoothLoop">Você já tem um loop suave baseando-se nas configurações atuais.</s:String>
<!--Editor • Captions--> <!--Editor • Captions-->
<s:String x:Key="S.Caption.Text">Texto</s:String> <s:String x:Key="S.Caption.Text">Texto</s:String>
...@@ -1693,7 +1694,13 @@ ...@@ -1693,7 +1694,13 @@
<s:String x:Key="S.SaveAs.SaveOptions">Opções de exportação</s:String> <s:String x:Key="S.SaveAs.SaveOptions">Opções de exportação</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.Partial">Exporte parcialmente.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.Partial">Exporte parcialmente.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.PickFolder">Exporte o arquivo em uma pasta de sua escolha.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.PickFolder">Exporte o arquivo em uma pasta de sua escolha.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.Overwrite">Sobrescrever (caso já exista).</s:String> <s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode">Sobrescrever?</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Warn">Avisar</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Warn.Info">Apenas avisa que existe um arquivo com o mesmo nome.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Prompt">Perguntar</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Prompt.Info">Pergunta se o usuário quer sobrescrever o arquivo.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Allow">Permitir</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.OverwriteMode.Allow.Info">Simplesmente sobrescreve o arquivo.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.ProjectToo">Exportar como projeto também (mesma pasta, mesmo nome).</s:String> <s:String x:Key="S.SaveAs.SaveOptions.ProjectToo">Exportar como projeto também (mesma pasta, mesmo nome).</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.UploadFile">Fazer upload do arquivo.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.UploadFile">Fazer upload do arquivo.</s:String>
<s:String x:Key="S.SaveAs.SaveOptions.CopyToClipboard">Copiar para a área de transferência.</s:String> <s:String x:Key="S.SaveAs.SaveOptions.CopyToClipboard">Copiar para a área de transferência.</s:String>
...@@ -1783,6 +1790,11 @@ ...@@ -1783,6 +1790,11 @@
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Title">Exportar Quadros</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Title">Exportar Quadros</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Instruction">Tem certeza de que deseja exportar os quadros?</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Instruction">Tem certeza de que deseja exportar os quadros?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Multiple.Message">Essa ação exportará {0} quadros diretamente para a pasta selecionada.</s:String> <s:String x:Key="S.SaveAs.Dialogs.Multiple.Message">Essa ação exportará {0} quadros diretamente para a pasta selecionada.</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Title">Sobrescrever</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Instruction">Você deseja sobrescrever o arquivo?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.Overwrite.Message">Um arquivo com o nome '{0}' já existe naquela pasta.\r\nVocê gostaria de sobrescrevê-lo?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.OverwriteMultiple.Instruction">Você deseja sobrescrever os arquivos?</s:String>
<s:String x:Key="S.SaveAs.Dialogs.OverwriteMultiple.Message">Já existe um ou mais arquivos com o mesmo nome nessa pasta.\r\nVocê gostaria de sobrescrevê-los?</s:String>
<!--Command Preview--> <!--Command Preview-->
<s:String x:Key="S.CommandPreviewer.Title">Visualizador de comando</s:String> <s:String x:Key="S.CommandPreviewer.Title">Visualizador de comando</s:String>
......
...@@ -109,6 +109,7 @@ ...@@ -109,6 +109,7 @@
<s:String x:Key="S.Command.DeleteNext">删除所有下一帧</s:String> <s:String x:Key="S.Command.DeleteNext">删除所有下一帧</s:String>
<s:String x:Key="S.Command.RemoveDuplicates">删除重复项</s:String> <s:String x:Key="S.Command.RemoveDuplicates">删除重复项</s:String>
<s:String x:Key="S.Command.Reduce">减少帧数</s:String> <s:String x:Key="S.Command.Reduce">减少帧数</s:String>
<s:String x:Key="S.Command.SmoothLoop">创建平滑循环</s:String>
<s:String x:Key="S.Command.Reverse">反向动画</s:String> <s:String x:Key="S.Command.Reverse">反向动画</s:String>
<s:String x:Key="S.Command.Yoyo">溜溜球,使动画前进和后退</s:String> <s:String x:Key="S.Command.Yoyo">溜溜球,使动画前进和后退</s:String>
<s:String x:Key="S.Command.MoveLeft">移动所选择帧到左侧</s:String> <s:String x:Key="S.Command.MoveLeft">移动所选择帧到左侧</s:String>
...@@ -164,6 +165,7 @@ ...@@ -164,6 +165,7 @@
<s:String x:Key="S.Updater.Header">一个新的更新可用</s:String> <s:String x:Key="S.Updater.Header">一个新的更新可用</s:String>
<s:String x:Key="S.Updater.NewRelease">新版本发布!</s:String> <s:String x:Key="S.Updater.NewRelease">新版本发布!</s:String>
<s:String x:Key="S.Updater.NewRelease.Info">新版本 {0} 可用!&#x0d;点击此处查看。</s:String> <s:String x:Key="S.Updater.NewRelease.Info">新版本 {0} 可用!&#x0d;点击此处查看。</s:String>
<s:String x:Key="S.Updater.NoNewRelease.Info">看来您的系统不再被支持,或者更新系统时发生了一些变化。尝试从网站上手动下载它。</s:String>
<s:String x:Key="S.Updater.Version">版本</s:String> <s:String x:Key="S.Updater.Version">版本</s:String>
<s:String x:Key="S.Updater.Portable">便携版</s:String> <s:String x:Key="S.Updater.Portable">便携版</s:String>
<s:String x:Key="S.Updater.Installer">安装程序</s:String> <s:String x:Key="S.Updater.Installer">安装程序</s:String>
...@@ -200,8 +202,6 @@ ...@@ -200,8 +202,6 @@
<s:String x:Key="S.Options.Other">其它</s:String> <s:String x:Key="S.Options.Other">其它</s:String>
<s:String x:Key="S.Options.Warning.Follow.Header">光标后缺少快捷键</s:String> <s:String x:Key="S.Options.Warning.Follow.Header">光标后缺少快捷键</s:String>
<s:String x:Key="S.Options.Warning.Follow.Message">为了使用鼠标光标跟随功能,必须设置一个快捷键,以便在需要时进行切换。</s:String> <s:String x:Key="S.Options.Warning.Follow.Message">为了使用鼠标光标跟随功能,必须设置一个快捷键,以便在需要时进行切换。</s:String>
<s:String x:Key="S.Options.Warning.DesktopDuplication.Header">缺少屏幕捕获的依赖项</s:String>
<s:String x:Key="S.Options.Warning.DesktopDuplication.Message">为了使用 Desktop Duplication API 捕获屏幕,必须下载 SharpDx 库。</s:String>
<!--Options • Application--> <!--Options • Application-->
<s:String x:Key="S.Options.App.Startup">启动</s:String> <s:String x:Key="S.Options.App.Startup">启动</s:String>
...@@ -284,7 +284,7 @@ ...@@ -284,7 +284,7 @@
<s:String x:Key="S.Options.Recorder.Mode">捕获模式</s:String> <s:String x:Key="S.Options.Recorder.Mode">捕获模式</s:String>
<s:String x:Key="S.Options.Recorder.Bitblt.Info">使用较旧的捕获方法,该方法较慢,可能无法捕获游戏,但不需要其他插件。</s:String> <s:String x:Key="S.Options.Recorder.Bitblt.Info">使用较旧的捕获方法,该方法较慢,可能无法捕获游戏,但不需要其他插件。</s:String>
<s:String x:Key="S.Options.Recorder.DirectX.Info">使用桌面复制 API 捕获方法,该方法更快,并且可以捕获全屏游戏,但是需要 SharpDx 插件和 Windows 8 或更高版本系统。</s:String> <s:String x:Key="S.Options.Recorder.DirectX.Info">使用桌面复制 API 捕获方法,该方法更快,并且可以捕获全屏游戏,但是需要 Windows 8 或更高版本系统。</s:String>
<s:String x:Key="S.Options.Recorder.File">保存到文件</s:String> <s:String x:Key="S.Options.Recorder.File">保存到文件</s:String>
<s:String x:Key="S.Options.Recorder.File.Info">捕获的每一帧将直接作为图像保存在磁盘上。</s:String> <s:String x:Key="S.Options.Recorder.File.Info">捕获的每一帧将直接作为图像保存在磁盘上。</s:String>
<s:String x:Key="S.Options.Recorder.Cache">内存缓存</s:String> <s:String x:Key="S.Options.Recorder.Cache">内存缓存</s:String>
...@@ -585,9 +585,6 @@ ...@@ -585,9 +585,6 @@
<s:String x:Key="S.Options.Extras.GifskiLocation.Invalid">Gifski 可执行文件的路径中包含一个或多个无效字符。请为该可执行文件选择一个有效位置。</s:String> <s:String x:Key="S.Options.Extras.GifskiLocation.Invalid">Gifski 可执行文件的路径中包含一个或多个无效字符。请为该可执行文件选择一个有效位置。</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation">SharpDx 位置(SharpDX.dll,SharpDX.Direct3D11.dll 和 SharpDX.DXGI.dll)</s:String> <s:String x:Key="S.Options.Extras.SharpDxLocation">SharpDx 位置(SharpDX.dll,SharpDX.Direct3D11.dll 和 SharpDX.DXGI.dll)</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation.Select">选择 SharpDx 库的位置</s:String> <s:String x:Key="S.Options.Extras.SharpDxLocation.Select">选择 SharpDx 库的位置</s:String>
<s:String x:Key="S.Options.Extras.SharpDxLocation.Invalid">SharpDx 库的路径中包含一个或多个无效字符。 请为这些库选择一个有效位置。</s:String>
<s:String x:Key="S.Options.Extras.License.Ffmpeg">FFmpeg 许可证</s:String>
<s:String x:Key="S.Options.Extras.License.Gifski">Gifski 许可证</s:String>
<s:String x:Key="S.Options.Extras.License.SharpDx">SharpDx 许可证</s:String> <s:String x:Key="S.Options.Extras.License.SharpDx">SharpDx 许可证</s:String>
<s:String x:Key="S.Options.Extras.Permission.Header">文件夹中缺少写入权限</s:String> <s:String x:Key="S.Options.Extras.Permission.Header">文件夹中缺少写入权限</s:String>
<s:String x:Key="S.Options.Extras.Permission.Observation">由于缺少写入权限,无法将下载内容保存在文件夹中。&#10;&#10;您是否要以管理员权限启动下载程序以完成下载?</s:String> <s:String x:Key="S.Options.Extras.Permission.Observation">由于缺少写入权限,无法将下载内容保存在文件夹中。&#10;&#10;您是否要以管理员权限启动下载程序以完成下载?</s:String>
...@@ -692,7 +689,6 @@ ...@@ -692,7 +689,6 @@
<s:String x:Key="S.Recorder.Warning.CaptureNotPossible.Info">无法捕获屏幕。5 次尝试后,捕获方法未返回任何帧。</s:String> <s:String x:Key="S.Recorder.Warning.CaptureNotPossible.Info">无法捕获屏幕。5 次尝试后,捕获方法未返回任何帧。</s:String>
<s:String x:Key="S.Recorder.Warning.StartPauseNotPossible">无法开始/暂停捕获屏幕</s:String> <s:String x:Key="S.Recorder.Warning.StartPauseNotPossible">无法开始/暂停捕获屏幕</s:String>
<s:String x:Key="S.Recorder.Warning.Windows8">使用桌面复制 Desktop Duplication API 捕获屏幕需要 Windows 8 或更高版本。</s:String> <s:String x:Key="S.Recorder.Warning.Windows8">使用桌面复制 Desktop Duplication API 捕获屏幕需要 Windows 8 或更高版本。</s:String>
<s:String x:Key="S.Recorder.Warning.MissingSharpDx">为了使用 Desktop Duplication API 捕获屏幕,需要 SharpDx 库。 进入 选项 > 附加功能 下载。</s:String>
<!--New recorder--> <!--New recorder-->
<s:String x:Key="S.Recorder.Area">区域</s:String> <s:String x:Key="S.Recorder.Area">区域</s:String>
...@@ -1028,6 +1024,7 @@ ...@@ -1028,6 +1024,7 @@
<s:String x:Key="S.Editor.Edit.Delete">删除</s:String> <s:String x:Key="S.Editor.Edit.Delete">删除</s:String>
<s:String x:Key="S.Editor.Edit.Frames.Duplicates">移除重复</s:String> <s:String x:Key="S.Editor.Edit.Frames.Duplicates">移除重复</s:String>
<s:String x:Key="S.Editor.Edit.Frames.Reduce">减少帧数</s:String> <s:String x:Key="S.Editor.Edit.Frames.Reduce">减少帧数</s:String>
<s:String x:Key="S.Editor.Edit.Frames.SmoothLoop">平滑循环</s:String>
<s:String x:Key="S.Editor.Edit.DeletePrevious">删除之前所有</s:String> <s:String x:Key="S.Editor.Edit.DeletePrevious">删除之前所有</s:String>
<s:String x:Key="S.Editor.Edit.DeleteNext">删除之后所有</s:String> <s:String x:Key="S.Editor.Edit.DeleteNext">删除之后所有</s:String>
...@@ -1137,7 +1134,8 @@ ...@@ -1137,7 +1134,8 @@
<s:String x:Key="S.Editor.Warning.Ffmpeg">找不到 FFmpeg。将其添加到 PATH 环境变量或在设置中配置其路径。</s:String> <s:String x:Key="S.Editor.Warning.Ffmpeg">找不到 FFmpeg。将其添加到 PATH 环境变量或在设置中配置其路径。</s:String>
<s:String x:Key="S.Editor.Warning.Gifski">找不到 Gifski。将其添加到 PATH 环境变量或在设置中配置其路径。</s:String> <s:String x:Key="S.Editor.Warning.Gifski">找不到 Gifski。将其添加到 PATH 环境变量或在设置中配置其路径。</s:String>
<s:String x:Key="S.Editor.Warning.LowSpace">驱动器上没有足够的空间供应用程序存储缓存({0}% 左右)。单击此处打开“选项” > “临时文件”,以释放一些空间。</s:String> <s:String x:Key="S.Editor.Warning.LowSpace">驱动器上没有足够的空间供应用程序存储缓存({0}% 左右)。单击此处打开“选项” > “临时文件”,以释放一些空间。</s:String>
<s:String x:Key="S.Editor.Warning.DifferentDpi">您尝试使用不支持的 DPI 导入多个图像。 其中一些已导入,另一些则需要单独导入。</s:String> <s:String x:Key="S.Editor.Warning.DifferentDpi">您试图导入多张不同 DPI 的图片,这不被支持。其中一些图片被导入,其他的则需要单独导入。</s:String>
<s:String x:Key="S.Editor.Warning.DifferentSize">您试图导入多张不同尺寸的图片,这不被支持。其中一些图片被导入,其他的则需要单独导入。</s:String>
<!--Editor • Status--> <!--Editor • Status-->
<s:String x:Key="S.Editor.RetrievingFromCache">从缓存中检索帧</s:String> <s:String x:Key="S.Editor.RetrievingFromCache">从缓存中检索帧</s:String>
...@@ -1158,6 +1156,8 @@ ...@@ -1158,6 +1156,8 @@
<s:String x:Key="S.Editor.ApplyingTransition">正在应用过渡效果</s:String> <s:String x:Key="S.Editor.ApplyingTransition">正在应用过渡效果</s:String>
<s:String x:Key="S.Editor.PreparingSaving">正在准备保存</s:String> <s:String x:Key="S.Editor.PreparingSaving">正在准备保存</s:String>
<s:String x:Key="S.Editor.CancelDiscard">取消载入并放弃项目。</s:String> <s:String x:Key="S.Editor.CancelDiscard">取消载入并放弃项目。</s:String>
<s:String x:Key="S.Editor.FindingLoop">寻找完美循环</s:String>
<s:String x:Key="S.Editor.DiscardingLoop">丢弃循环中未使用的帧</s:String>
<!--Editor • Frame list--> <!--Editor • Frame list-->
<s:String x:Key="S.Editor.List.Frame">帧:</s:String> <s:String x:Key="S.Editor.List.Frame">帧:</s:String>
...@@ -1297,6 +1297,16 @@ ...@@ -1297,6 +1297,16 @@
<s:String x:Key="S.RemoveDuplicates.Delay.Average">使用平均值</s:String> <s:String x:Key="S.RemoveDuplicates.Delay.Average">使用平均值</s:String>
<s:String x:Key="S.RemoveDuplicates.Delay.Sum">使用总和</s:String> <s:String x:Key="S.RemoveDuplicates.Delay.Sum">使用总和</s:String>
<s:String x:Key="S.RemoveDuplicates.Info">此操作会分析每个帧(逐个像素),并删除至少为 {0} %的类似于其最近邻的帧。&#x0d;您可以选择是否要调整帧的延迟(显示持续时间)。</s:String> <s:String x:Key="S.RemoveDuplicates.Info">此操作会分析每个帧(逐个像素),并删除至少为 {0} %的类似于其最近邻的帧。&#x0d;您可以选择是否要调整帧的延迟(显示持续时间)。</s:String>
<!--Editor • Smooth Loop-->
<s:String x:Key="S.SmoothLoop.Header">创建平滑循环</s:String>
<s:String x:Key="S.SmoothLoop.StartThreshold">先忽略:</s:String>
<s:String x:Key="S.SmoothLoop.From">比较自:</s:String>
<s:String x:Key="S.SmoothLoop.From.Last">结束</s:String>
<s:String x:Key="S.SmoothLoop.From.First">开始</s:String>
<s:String x:Key="S.SmoothLoop.Info">尝试查找至少 {0} % 类似于开始帧的帧,并删除所有后续帧。&#x0d;您可以选择是否要忽略一些初始帧,并从开始(阈值之后)或结束开始比较。</s:String>
<s:String x:Key="S.SmoothLoop.Warning.Threshold">忽略的帧数需要小于总帧数。</s:String>
<s:String x:Key="S.SmoothLoop.Warning.NoLoopFound">无法使用所选设置创建平滑循环。</s:String>
<!--Editor • Captions--> <!--Editor • Captions-->
<s:String x:Key="S.Caption.Text">文本</s:String> <s:String x:Key="S.Caption.Text">文本</s:String>
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<UpdateRequired>false</UpdateRequired> <UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>2.35.0.0</ApplicationVersion> <ApplicationVersion>2.36.0.0</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
...@@ -38,41 +38,49 @@ ...@@ -38,41 +38,49 @@
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<AppDesigner Include="Properties\" /> <AppDesigner Include="Properties\" />
...@@ -131,10 +139,10 @@ ...@@ -131,10 +139,10 @@
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<Company>Nicke Manarin</Company> <Company>Nicke Manarin</Company>
<Authors>Nicke Manarin</Authors> <Authors>Nicke Manarin</Authors>
<Version>2.35.4</Version> <Version>2.36.0</Version>
<Copyright>Copyright© Nicke Manarin 2021</Copyright> <Copyright>Copyright© Nicke Manarin 2022</Copyright>
<PackageProjectUrl>https://www.screentogif.com</PackageProjectUrl> <PackageProjectUrl>https://www.screentogif.com</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile> <PackageReadmeFile>Readme.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/nickemanarin/screentogif</RepositoryUrl> <RepositoryUrl>https://github.com/nickemanarin/screentogif</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<PackageTags>gif; recorder; editor; screen-recorder; gif-editor</PackageTags> <PackageTags>gif; recorder; editor; screen-recorder; gif-editor</PackageTags>
...@@ -143,12 +151,6 @@ ...@@ -143,12 +151,6 @@
<SignAssembly>False</SignAssembly> <SignAssembly>False</SignAssembly>
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Include="..\README.md">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ScreenToGif.Native\ScreenToGif.Native.csproj" /> <ProjectReference Include="..\ScreenToGif.Native\ScreenToGif.Native.csproj" />
<ProjectReference Include="..\ScreenToGif.ViewModel\ScreenToGif.ViewModel.csproj" /> <ProjectReference Include="..\ScreenToGif.ViewModel\ScreenToGif.ViewModel.csproj" />
...@@ -157,5 +159,9 @@ ...@@ -157,5 +159,9 @@
<None Update="app.manifest"> <None Update="app.manifest">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</None> </None>
<None Update="Readme.md">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
...@@ -1201,9 +1201,24 @@ ...@@ -1201,9 +1201,24 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<n:ExtendedCheckBox Grid.Row="0" Text="{DynamicResource S.SaveAs.SaveOptions.Overwrite}" Margin="20,3,3,3" <StackPanel Orientation="Horizontal" Margin="20,0,0,0">
IsChecked="{Binding OverwriteOnSave, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> <TextBlock Text="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode}" Foreground="{DynamicResource Element.Foreground.Medium}" Padding="0" VerticalAlignment="Center"/>
<WrapPanel Margin="5,0,0,0">
<n:ExtendedRadioButton x:Name="OverwriteWarnRadioButton" ContentWidth="0" ContentHeight="0" Padding="0,2,2,2" Text="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Warn}"
IsChecked="{Binding OverwriteMode, Converter={StaticResource EnumToBool}, ConverterParameter={x:Static e:OverwriteModes.Warn}}"
ToolTip="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Warn.Info}"/>
<Separator Width="1"/>
<n:ExtendedRadioButton x:Name="OverwritePromptRadioButton" ContentWidth="0" ContentHeight="0" Padding="0,2,2,2" Text="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Prompt}"
IsChecked="{Binding OverwriteMode, Converter={StaticResource EnumToBool}, ConverterParameter={x:Static e:OverwriteModes.Prompt}}"
ToolTip="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Prompt.Info}"/>
<Separator Width="1"/>
<n:ExtendedRadioButton x:Name="OverwriteAllowRadioButton" ContentWidth="0" ContentHeight="0" Padding="0,2,2,2" Text="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Allow}"
IsChecked="{Binding OverwriteMode, Converter={StaticResource EnumToBool}, ConverterParameter={x:Static e:OverwriteModes.Allow}}"
ToolTip="{DynamicResource S.SaveAs.SaveOptions.OverwriteMode.Allow.Info}"/>
</WrapPanel>
</StackPanel>
<n:ExtendedCheckBox Grid.Row="1" x:Name="SaveAsProjectTooCheckBox" Text="{DynamicResource S.SaveAs.SaveOptions.ProjectToo}" Margin="20,3,3,3" <n:ExtendedCheckBox Grid.Row="1" x:Name="SaveAsProjectTooCheckBox" Text="{DynamicResource S.SaveAs.SaveOptions.ProjectToo}" Margin="20,3,3,3"
IsChecked="{Binding ExportAsProjectToo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> IsChecked="{Binding ExportAsProjectToo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid> </Grid>
......
...@@ -163,9 +163,9 @@ public partial class ExportPanel : UserControl, IPanel ...@@ -163,9 +163,9 @@ public partial class ExportPanel : UserControl, IPanel
#endregion #endregion
#region UWP restrictions #region Store restrictions
#if UWP #if FULL_MULTI_MSIX_STORE
CustomCommandsCheckBox.IsEnabled = false; CustomCommandsCheckBox.IsEnabled = false;
CustomCommandsTextBox.IsEnabled = false; CustomCommandsTextBox.IsEnabled = false;
...@@ -712,9 +712,27 @@ public partial class ExportPanel : UserControl, IPanel ...@@ -712,9 +712,27 @@ public partial class ExportPanel : UserControl, IPanel
if (CurrentPreset.PickLocation) if (CurrentPreset.PickLocation)
{ {
if (CurrentPreset.OverwriteMode != OverwriteModes.Allow && File.Exists(Path.Combine(CurrentPreset.OutputFolder, CurrentPreset.ResolvedFilename + CurrentPreset.Extension)))
{
if (CurrentPreset.OverwriteMode == OverwriteModes.Prompt)
{
if (!Dialog.Ask(LocalizationHelper.Get("S.SaveAs.Dialogs.Overwrite.Title"), LocalizationHelper.Get("S.SaveAs.Dialogs.Overwrite.Instruction"),
LocalizationHelper.GetWithFormat("S.SaveAs.Dialogs.Overwrite.Message", "A file with the name '{0}' already exists in that folder.\r\nWould you like to overwrite it?", CurrentPreset.ResolvedFilename + CurrentPreset.Extension)))
{
RaiseValidatedEvent("S.SaveAs.Warning.Overwrite", StatusReasons.FileAlreadyExists);
return false;
}
}
else
{
RaiseValidatedEvent("S.SaveAs.Warning.Overwrite", StatusReasons.FileAlreadyExists);
return false;
}
}
if (CurrentPreset.ExportAsProjectToo) if (CurrentPreset.ExportAsProjectToo)
{ {
if (!CurrentPreset.OverwriteOnSave) if (CurrentPreset.OverwriteMode != OverwriteModes.Allow)
{ {
//Get the project extension in use. //Get the project extension in use.
var extension = UserSettings.All.ExportPresets.OfType<StgPreset>().OrderBy(o => o.IsSelectedForEncoder).Select(s => s.Extension ?? s.DefaultExtension).FirstOrDefault() ?? ".stg"; var extension = UserSettings.All.ExportPresets.OfType<StgPreset>().OrderBy(o => o.IsSelectedForEncoder).Select(s => s.Extension ?? s.DefaultExtension).FirstOrDefault() ?? ".stg";
...@@ -1366,7 +1384,7 @@ public partial class ExportPanel : UserControl, IPanel ...@@ -1366,7 +1384,7 @@ public partial class ExportPanel : UserControl, IPanel
preset.OutputFolder = Path.GetDirectoryName(sfd.FileName); preset.OutputFolder = Path.GetDirectoryName(sfd.FileName);
preset.OutputFilename = Path.GetFileNameWithoutExtension(sfd.FileName); preset.OutputFilename = Path.GetFileNameWithoutExtension(sfd.FileName);
preset.OverwriteOnSave = File.Exists(sfd.FileName); preset.OverwriteMode = File.Exists(sfd.FileName) ? OverwriteModes.Prompt : OverwriteModes.Warn;
preset.Extension = Path.GetExtension(sfd.FileName); preset.Extension = Path.GetExtension(sfd.FileName);
RaiseSaveEvent(); RaiseSaveEvent();
......
...@@ -1208,7 +1208,7 @@ internal class EncodingManager ...@@ -1208,7 +1208,7 @@ internal class EncodingManager
#region Execute commands #region Execute commands
#if !UWP #if !FULL_MULTI_MSIX_STORE
if (preset.ExecuteCustomCommands && !string.IsNullOrWhiteSpace(preset.CustomCommands)) if (preset.ExecuteCustomCommands && !string.IsNullOrWhiteSpace(preset.CustomCommands))
{ {
......
...@@ -1732,12 +1732,18 @@ namespace ScreenToGif.Windows ...@@ -1732,12 +1732,18 @@ namespace ScreenToGif.Windows
} }
Cursor = Cursors.AppStarting; Cursor = Cursors.AppStarting;
var initialCount = Project.Frames.Count;
var index = await Task.Run(() => SmoothLoopAsync((decimal)UserSettings.All.SmoothLoopSimilarity, UserSettings.All.SmoothLoopStartThreshold, UserSettings.All.SmoothLoopFrom)); var index = await Task.Run(() => SmoothLoopAsync((decimal)UserSettings.All.SmoothLoopSimilarity, UserSettings.All.SmoothLoopStartThreshold, UserSettings.All.SmoothLoopFrom));
if (index == Project.Frames.Count) //If nothing changed, it means that no frame was removed.
if (Project.Frames.Count == initialCount)
{ {
StatusList.Warning(LocalizationHelper.Get("S.SmoothLoop.Warning.NoLoopFound")); //The reason could be for no loop found or loop already smooth.
if (index == Project.Frames.Count - 1)
StatusList.Info(LocalizationHelper.Get("S.SmoothLoop.Warning.AlreadySmoothLoop"));
else
StatusList.Warning(LocalizationHelper.Get("S.SmoothLoop.Warning.NoLoopFound"));
//Workaround for not disabling the CanExecute of the panel. //Workaround for not disabling the CanExecute of the panel.
_applyAction = ApplySmoothLoopButton_Click; _applyAction = ApplySmoothLoopButton_Click;
...@@ -3442,7 +3448,7 @@ namespace ScreenToGif.Windows ...@@ -3442,7 +3448,7 @@ namespace ScreenToGif.Windows
Project.Persist(); Project.Persist();
//Get enabled tasks. //Get enabled tasks.
var tasks = UserSettings.All.AutomatedTasksList?.Cast<BaseTaskViewModel>().Where(w => w.IsEnabled).ToList() ?? new List<BaseTaskViewModel>(); var tasks = UserSettings.All.AutomatedTasksList?.Cast<BaseTaskViewModel>().Where(w => w != null && w.IsEnabled).ToList() ?? new List<BaseTaskViewModel>();
if (tasks.Any()) if (tasks.Any())
{ {
...@@ -5255,7 +5261,7 @@ namespace ScreenToGif.Windows ...@@ -5255,7 +5261,7 @@ namespace ScreenToGif.Windows
//Validates each file name when saving multiple images (if more than one image, that will not be zipped). //Validates each file name when saving multiple images (if more than one image, that will not be zipped).
if (preset is ImagePreset { ZipFiles: false }) if (preset is ImagePreset { ZipFiles: false })
{ {
if (!preset.OverwriteOnSave) if (preset.OverwriteMode != OverwriteModes.Allow)
{ {
var output = Path.Combine(preset.OutputFolder, preset.ResolvedFilename); var output = Path.Combine(preset.OutputFolder, preset.ResolvedFilename);
var padSize = (Project.Frames.Count - 1).ToString().Length; var padSize = (Project.Frames.Count - 1).ToString().Length;
...@@ -5266,12 +5272,24 @@ namespace ScreenToGif.Windows ...@@ -5266,12 +5272,24 @@ namespace ScreenToGif.Windows
if (any) if (any)
{ {
Dispatcher.Invoke(() => StatusList.Warning(LocalizationHelper.Get("S.SaveAs.Warning.Overwrite"))); if (preset.OverwriteMode == OverwriteModes.Prompt)
return false; {
if (Dispatcher.Invoke(() => !Dialog.Ask(LocalizationHelper.Get("S.SaveAs.Dialogs.Overwrite.Title"), LocalizationHelper.Get("S.SaveAs.Dialogs.OverwriteMultiple.Instruction"),
LocalizationHelper.Get("S.SaveAs.Dialogs.OverwriteMultiple.Message"))))
{
Dispatcher.Invoke(() => StatusList.Warning(LocalizationHelper.Get("S.SaveAs.Warning.Overwrite")));
return false;
}
}
else
{
Dispatcher.Invoke(() => StatusList.Warning(LocalizationHelper.Get("S.SaveAs.Warning.Overwrite")));
return false;
}
} }
} }
if (indexes.Count > 1 && !Dispatcher.Invoke<bool>(() => Dialog.Ask(LocalizationHelper.Get("S.SaveAs.Dialogs.Multiple.Title"), if (indexes.Count > 1 && !Dispatcher.Invoke(() => Dialog.Ask(LocalizationHelper.Get("S.SaveAs.Dialogs.Multiple.Title"),
LocalizationHelper.Get("S.SaveAs.Dialogs.Multiple.Instruction"), LocalizationHelper.GetWithFormat("S.SaveAs.Dialogs.Multiple.Message", indexes.Count)))) LocalizationHelper.Get("S.SaveAs.Dialogs.Multiple.Instruction"), LocalizationHelper.GetWithFormat("S.SaveAs.Dialogs.Multiple.Message", indexes.Count))))
{ {
Dispatcher.Invoke(() => StatusList.Warning(LocalizationHelper.Get("S.SaveAs.Warning.Canceled"))); Dispatcher.Invoke(() => StatusList.Warning(LocalizationHelper.Get("S.SaveAs.Warning.Canceled")));
...@@ -6291,12 +6309,11 @@ namespace ScreenToGif.Windows ...@@ -6291,12 +6309,11 @@ namespace ScreenToGif.Windows
break; break;
} }
count++;
start += step; start += step;
} }
if (found == -1 || found == threshold || found == Project.Frames.Count - 1) if (found == -1 || found == threshold - 1 || found == Project.Frames.Count - 1)
return Project.Frames.Count; return found;
var removeList = Project.Frames.GetRange(found + 1, Project.Frames.Count - 1 - found).Select(s => s.Index).ToList(); var removeList = Project.Frames.GetRange(found + 1, Project.Frames.Count - 1 - found).Select(s => s.Index).ToList();
......
...@@ -386,9 +386,9 @@ ...@@ -386,9 +386,9 @@
<n:ExtendedCheckBox x:Name="UpdatesCheckBox" Text="{DynamicResource S.Options.App.General.CheckForUpdates}" Margin="15,3,5,3" IsChecked="{Binding Path=CheckForUpdates, Mode=TwoWay}"/> <n:ExtendedCheckBox x:Name="UpdatesCheckBox" Text="{DynamicResource S.Options.App.General.CheckForUpdates}" Margin="15,3,5,3" IsChecked="{Binding Path=CheckForUpdates, Mode=TwoWay}"/>
<StackPanel Visibility="{Binding CheckForUpdates, Converter={StaticResource Bool2Visibility}}"> <StackPanel Visibility="{Binding CheckForUpdates, Converter={StaticResource Bool2Visibility}}">
<n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.PortableUpdate}" Info="{DynamicResource S.Options.App.General.PortableUpdate.Info}" <n:ExtendedCheckBox x:Name="PortableUpdateCheckBox" Text="{DynamicResource S.Options.App.General.PortableUpdate}" Info="{DynamicResource S.Options.App.General.PortableUpdate.Info}"
Margin="30,3,5,3" IsChecked="{Binding Path=PortableUpdate, Mode=TwoWay}"/> Margin="30,3,5,3" IsChecked="{Binding Path=PortableUpdate, Mode=TwoWay}"/>
<n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.ForceUpdateAsAdmin}" Margin="30,3,5,3" IsChecked="{Binding Path=ForceUpdateAsAdmin, Mode=TwoWay}"/> <n:ExtendedCheckBox x:Name="AdminUpdateCheckBox" Text="{DynamicResource S.Options.App.General.ForceUpdateAsAdmin}" Margin="30,3,5,3" IsChecked="{Binding Path=ForceUpdateAsAdmin, Mode=TwoWay}"/>
<n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.UpdateOnClose}" Margin="30,3,5,3" IsChecked="{Binding Path=InstallUpdates, Mode=TwoWay}"/> <n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.UpdateOnClose}" Margin="30,3,5,3" IsChecked="{Binding Path=InstallUpdates, Mode=TwoWay}"/>
<n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.PromptToInstall}" Margin="45,3,5,3" IsChecked="{Binding Path=PromptToInstall, Mode=TwoWay}" <n:ExtendedCheckBox Text="{DynamicResource S.Options.App.General.PromptToInstall}" Margin="45,3,5,3" IsChecked="{Binding Path=PromptToInstall, Mode=TwoWay}"
Visibility="{Binding InstallUpdates, Converter={StaticResource Bool2Visibility}}"/> Visibility="{Binding InstallUpdates, Converter={StaticResource Bool2Visibility}}"/>
......
...@@ -7,7 +7,6 @@ using System.IO; ...@@ -7,7 +7,6 @@ using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
...@@ -101,10 +100,13 @@ public partial class Options : Window, INotification ...@@ -101,10 +100,13 @@ public partial class Options : Window, INotification
{ {
InitializeComponent(); InitializeComponent();
#if UWP #if FULL_MULTI_MSIX_STORE
UpdatesCheckBox.Visibility = Visibility.Collapsed; UpdatesCheckBox.Visibility = Visibility.Collapsed;
CheckForUpdatesLabel.Visibility = Visibility.Collapsed; CheckForUpdatesLabel.Visibility = Visibility.Collapsed;
StoreTextBlock.Visibility = Visibility.Visible; StoreTextBlock.Visibility = Visibility.Visible;
#elif FULL_MULTI_MSIX
PortableUpdateCheckBox.Visibility = Visibility.Collapsed;
AdminUpdateCheckBox.Visibility = Visibility.Collapsed;
#endif #endif
} }
...@@ -126,7 +128,7 @@ public partial class Options : Window, INotification ...@@ -126,7 +128,7 @@ public partial class Options : Window, INotification
//Detect if this app is set to start with windows. //Detect if this app is set to start with windows.
var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", false); var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", false);
var key = sub?.GetValue("ScreenToGif"); var key = sub?.GetValue("ScreenToGif");
var name = Assembly.GetEntryAssembly()?.Location ?? Process.GetCurrentProcess().MainModule?.FileName; var name = ProcessHelper.GetEntryAssemblyPath();
if (key == null || key as string != name) if (key == null || key as string != name)
{ {
...@@ -199,7 +201,7 @@ public partial class Options : Window, INotification ...@@ -199,7 +201,7 @@ public partial class Options : Window, INotification
_ignoreStartup = true; _ignoreStartup = true;
var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
var name = Assembly.GetEntryAssembly()?.Location ?? Process.GetCurrentProcess().MainModule?.FileName; var name = ProcessHelper.GetEntryAssemblyPath();
if (string.IsNullOrWhiteSpace(name) || sub == null) if (string.IsNullOrWhiteSpace(name) || sub == null)
{ {
...@@ -232,7 +234,7 @@ public partial class Options : Window, INotification ...@@ -232,7 +234,7 @@ public partial class Options : Window, INotification
_ignoreStartup = true; _ignoreStartup = true;
var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); var sub = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
var name = Assembly.GetEntryAssembly()?.Location ?? Process.GetCurrentProcess().MainModule?.FileName; var name = ProcessHelper.GetEntryAssemblyPath();
if (string.IsNullOrWhiteSpace(name) || sub == null) if (string.IsNullOrWhiteSpace(name) || sub == null)
{ {
...@@ -1291,7 +1293,7 @@ public partial class Options : Window, INotification ...@@ -1291,7 +1293,7 @@ public partial class Options : Window, INotification
return; return;
} }
#if UWP #if FULL_MULTI_MSIX_STORE
StatusBand.Warning(LocalizationHelper.Get("S.Options.Extras.DownloadRestriction")); StatusBand.Warning(LocalizationHelper.Get("S.Options.Extras.DownloadRestriction"));
return; return;
#else #else
...@@ -1390,7 +1392,7 @@ public partial class Options : Window, INotification ...@@ -1390,7 +1392,7 @@ public partial class Options : Window, INotification
return; return;
} }
#if UWP #if FULL_MULTI_MSIX_STORE
StatusBand.Warning(LocalizationHelper.Get("S.Options.Extras.DownloadRestriction")); StatusBand.Warning(LocalizationHelper.Get("S.Options.Extras.DownloadRestriction"));
return; return;
#else #else
...@@ -1515,7 +1517,8 @@ public partial class Options : Window, INotification ...@@ -1515,7 +1517,8 @@ public partial class Options : Window, INotification
var result = ofd.ShowDialog(); var result = ofd.ShowDialog();
if (!result.HasValue || !result.Value) return; if (!result.HasValue || !result.Value)
return;
UserSettings.All.FfmpegLocation = ofd.FileName; UserSettings.All.FfmpegLocation = ofd.FileName;
...@@ -1563,7 +1566,8 @@ public partial class Options : Window, INotification ...@@ -1563,7 +1566,8 @@ public partial class Options : Window, INotification
var result = ofd.ShowDialog(); var result = ofd.ShowDialog();
if (!result.HasValue || !result.Value) return; if (!result.HasValue || !result.Value)
return;
UserSettings.All.GifskiLocation = ofd.FileName; UserSettings.All.GifskiLocation = ofd.FileName;
......
...@@ -49,6 +49,9 @@ public partial class DownloadDialog : Window ...@@ -49,6 +49,9 @@ public partial class DownloadDialog : Window
return; return;
} }
if (Global.UpdateAvailable.MustDownloadManually)
StatusBand.Warning(LocalizationHelper.Get("S.Updater.NoNewRelease.Info"));
#endregion #endregion
try try
...@@ -157,6 +160,13 @@ public partial class DownloadDialog : Window ...@@ -157,6 +160,13 @@ public partial class DownloadDialog : Window
{ {
StatusBand.Hide(); StatusBand.Hide();
if (Global.UpdateAvailable.MustDownloadManually)
{
ProcessHelper.StartWithShell("https://www.screentogif.com");
DialogResult = false;
return;
}
if (EncodingManager.Encodings.Any(a => a.Status == EncodingStatus.Processing)) if (EncodingManager.Encodings.Any(a => a.Status == EncodingStatus.Processing))
{ {
StatusBand.Warning(LocalizationHelper.Get("S.Updater.Warning.Encoding")); StatusBand.Warning(LocalizationHelper.Get("S.Updater.Warning.Encoding"));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册