diff --git a/src/NebulaAuth/Components/CodeProgressBar.cs b/src/NebulaAuth/Components/CodeProgressBar.cs
index 8171e7b..661b5af 100644
--- a/src/NebulaAuth/Components/CodeProgressBar.cs
+++ b/src/NebulaAuth/Components/CodeProgressBar.cs
@@ -13,7 +13,7 @@ public class CodeProgressBar : ProgressBar
public static readonly DependencyProperty MaxTimeProperty =
DependencyProperty.Register(nameof(MaxTime), typeof(double), typeof(CodeProgressBar),
- new PropertyMetadata(30.0)); // По умолчанию 30 сек
+ new PropertyMetadata(30.0));
public double TimeRemaining
{
diff --git a/src/NebulaAuth/Components/HintBox.xaml b/src/NebulaAuth/Components/HintBox.xaml
index fdf57e9..98495b4 100644
--- a/src/NebulaAuth/Components/HintBox.xaml
+++ b/src/NebulaAuth/Components/HintBox.xaml
@@ -26,15 +26,12 @@
-
-
-
-
+ CommandParameter="{StaticResource True}"
+ Content="{Tr Common.OK}"/>
- Отмена
-
+ CommandParameter="{StaticResource False}"
+ Content="{Tr Common.Cancel}"
+ />
diff --git a/src/NebulaAuth/View/Dialogs/ConfirmCancelDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/ConfirmCancelDialog.xaml.cs
index f678c13..1d226a8 100644
--- a/src/NebulaAuth/View/Dialogs/ConfirmCancelDialog.xaml.cs
+++ b/src/NebulaAuth/View/Dialogs/ConfirmCancelDialog.xaml.cs
@@ -1,8 +1,5 @@
namespace NebulaAuth.View.Dialogs;
-///
-/// Логика взаимодействия для ConfirmCancelDialog.xaml
-///
public partial class ConfirmCancelDialog
{
public ConfirmCancelDialog()
@@ -13,6 +10,6 @@ public partial class ConfirmCancelDialog
public ConfirmCancelDialog(string msg)
{
InitializeComponent();
- ConfirmTextBlock.Text = msg;
+ ConfirmHint.Text = msg;
}
}
\ No newline at end of file
diff --git a/src/NebulaAuth/View/Dialogs/LoginAgainDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/LoginAgainDialog.xaml.cs
index 294f5b6..204506a 100644
--- a/src/NebulaAuth/View/Dialogs/LoginAgainDialog.xaml.cs
+++ b/src/NebulaAuth/View/Dialogs/LoginAgainDialog.xaml.cs
@@ -1,8 +1,5 @@
namespace NebulaAuth.View.Dialogs;
-///
-/// Логика взаимодействия для LoginAgainDialog.xaml
-///
public partial class LoginAgainDialog
{
public LoginAgainDialog()
diff --git a/src/NebulaAuth/View/Dialogs/LoginAgainOnImportDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/LoginAgainOnImportDialog.xaml.cs
index 8d936f9..deb3ec6 100644
--- a/src/NebulaAuth/View/Dialogs/LoginAgainOnImportDialog.xaml.cs
+++ b/src/NebulaAuth/View/Dialogs/LoginAgainOnImportDialog.xaml.cs
@@ -1,8 +1,5 @@
namespace NebulaAuth.View.Dialogs;
-///
-/// Логика взаимодействия для LoginAgainDialog.xaml
-///
public partial class LoginAgainOnImportDialog
{
public LoginAgainOnImportDialog()
diff --git a/src/NebulaAuth/View/Dialogs/SetCryptPasswordDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/SetCryptPasswordDialog.xaml.cs
index a9a5b1e..4c48e3c 100644
--- a/src/NebulaAuth/View/Dialogs/SetCryptPasswordDialog.xaml.cs
+++ b/src/NebulaAuth/View/Dialogs/SetCryptPasswordDialog.xaml.cs
@@ -1,8 +1,6 @@
namespace NebulaAuth.View.Dialogs;
-///
-/// Логика взаимодействия для SetCryptPasswordDialog.xaml
-///
+
public partial class SetCryptPasswordDialog
{
public SetCryptPasswordDialog()
diff --git a/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml b/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml
new file mode 100644
index 0000000..520d887
--- /dev/null
+++ b/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml.cs
new file mode 100644
index 0000000..821a191
--- /dev/null
+++ b/src/NebulaAuth/View/Dialogs/TextFieldDialog.xaml.cs
@@ -0,0 +1,23 @@
+using MaterialDesignThemes.Wpf;
+
+namespace NebulaAuth.View.Dialogs;
+
+
+public partial class TextFieldDialog
+{
+ public TextFieldDialog()
+ {
+ InitializeComponent();
+ }
+
+ public TextFieldDialog(string? title, string? msg)
+ {
+ InitializeComponent();
+
+ if(!string.IsNullOrWhiteSpace(title))
+ TitleTextBlock.Text = title;
+
+ if (!string.IsNullOrEmpty(msg))
+ HintAssist.SetHint(TextField, msg);
+ }
+}
\ No newline at end of file
diff --git a/src/NebulaAuth/View/Dialogs/WaitLoginDialog.xaml.cs b/src/NebulaAuth/View/Dialogs/WaitLoginDialog.xaml.cs
index 8ed0802..0e2b8e1 100644
--- a/src/NebulaAuth/View/Dialogs/WaitLoginDialog.xaml.cs
+++ b/src/NebulaAuth/View/Dialogs/WaitLoginDialog.xaml.cs
@@ -3,9 +3,7 @@ using System.Windows;
namespace NebulaAuth.View.Dialogs;
-///
-/// Логика взаимодействия для WaitLoginDialog.xaml
-///
+
public partial class WaitLoginDialog
{
private TaskCompletionSource _tcs = new();
diff --git a/src/NebulaAuth/View/LinkerView.xaml.cs b/src/NebulaAuth/View/LinkerView.xaml.cs
index 7068f07..bd3728b 100644
--- a/src/NebulaAuth/View/LinkerView.xaml.cs
+++ b/src/NebulaAuth/View/LinkerView.xaml.cs
@@ -1,8 +1,5 @@
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для LinkerView.xaml
-///
public partial class LinkerView
{
public LinkerView()
diff --git a/src/NebulaAuth/View/LinksView.xaml.cs b/src/NebulaAuth/View/LinksView.xaml.cs
index 305d8a1..fd7be3d 100644
--- a/src/NebulaAuth/View/LinksView.xaml.cs
+++ b/src/NebulaAuth/View/LinksView.xaml.cs
@@ -4,9 +4,7 @@ using System.Windows.Controls;
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для LinksView.xaml
-///
+
public partial class LinksView : UserControl
{
public LinksView()
diff --git a/src/NebulaAuth/View/MafileMoverView.xaml.cs b/src/NebulaAuth/View/MafileMoverView.xaml.cs
index 275c1d7..3f5b8cb 100644
--- a/src/NebulaAuth/View/MafileMoverView.xaml.cs
+++ b/src/NebulaAuth/View/MafileMoverView.xaml.cs
@@ -2,9 +2,7 @@
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для MafileMoverView.xaml
-///
+
public partial class MafileMoverView : UserControl
{
public MafileMoverView()
diff --git a/src/NebulaAuth/View/ProxyManagerView.xaml b/src/NebulaAuth/View/ProxyManagerView.xaml
index 642a535..16d2f04 100644
--- a/src/NebulaAuth/View/ProxyManagerView.xaml
+++ b/src/NebulaAuth/View/ProxyManagerView.xaml
@@ -58,8 +58,18 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/src/NebulaAuth/View/ProxyManagerView.xaml.cs b/src/NebulaAuth/View/ProxyManagerView.xaml.cs
index 9feb824..c964d08 100644
--- a/src/NebulaAuth/View/ProxyManagerView.xaml.cs
+++ b/src/NebulaAuth/View/ProxyManagerView.xaml.cs
@@ -3,9 +3,7 @@ using System.Windows.Input;
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для ProxyManagerView.xaml
-///
+
public partial class ProxyManagerView
{
public ProxyManagerView()
diff --git a/src/NebulaAuth/View/SettingsView.xaml b/src/NebulaAuth/View/SettingsView.xaml
index 67cb0f9..b2f71e3 100644
--- a/src/NebulaAuth/View/SettingsView.xaml
+++ b/src/NebulaAuth/View/SettingsView.xaml
@@ -5,12 +5,13 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:other="clr-namespace:NebulaAuth.ViewModel.Other"
+ xmlns:nebulaAuth="clr-namespace:NebulaAuth"
mc:Ignorable="d"
d:DesignHeight="650"
FontFamily="{materialDesign:MaterialDesignFont}"
MinHeight="400"
- MinWidth="400"
- MaxWidth="400"
+ MinWidth="480"
+ MaxWidth="480"
d:DataContext="{d:DesignInstance other:SettingsVM}"
Background="Transparent"
FontSize="15">
@@ -38,6 +39,7 @@
@@ -47,15 +49,33 @@
-
+
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+ True
+ False
+
+
+
+
+
+
+
+
- Применить и переименовать
+
+
diff --git a/src/NebulaAuth/View/SettingsView.xaml.cs b/src/NebulaAuth/View/SettingsView.xaml.cs
index ee85db7..f79b910 100644
--- a/src/NebulaAuth/View/SettingsView.xaml.cs
+++ b/src/NebulaAuth/View/SettingsView.xaml.cs
@@ -5,9 +5,7 @@ using MaterialDesignThemes.Wpf;
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для SettingsView.xaml
-///
+
public partial class SettingsView
{
private readonly DialogHost? _dialogHost;
diff --git a/src/NebulaAuth/View/UpdaterView.xaml.cs b/src/NebulaAuth/View/UpdaterView.xaml.cs
index 9f057b2..859e234 100644
--- a/src/NebulaAuth/View/UpdaterView.xaml.cs
+++ b/src/NebulaAuth/View/UpdaterView.xaml.cs
@@ -1,8 +1,5 @@
namespace NebulaAuth.View;
-///
-/// Логика взаимодействия для UpdaterView.xaml
-///
public partial class UpdaterView
{
public UpdaterView()
diff --git a/src/NebulaAuth/ViewModel/Linker/LinkAccountVM.cs b/src/NebulaAuth/ViewModel/Linker/LinkAccountVM.cs
index 707edfc..6af8983 100644
--- a/src/NebulaAuth/ViewModel/Linker/LinkAccountVM.cs
+++ b/src/NebulaAuth/ViewModel/Linker/LinkAccountVM.cs
@@ -177,7 +177,7 @@ public partial class LinkAccountVM : ObservableObject, ISmsCodeProvider, IPhoneN
var linkOptions = new LinkOptions(_client, StaticLoginConsumer.Instance, this,
- this, this, Storage.BackupHandler, Logger2);
+ this, this, Storage.WriteBackup, Logger2);
var linker = new SteamAuthenticatorLinker(linkOptions);
MobileDataExtended result;
try
@@ -226,7 +226,6 @@ public partial class LinkAccountVM : ObservableObject, ISmsCodeProvider, IPhoneN
}
Storage.SaveMafile(mafile);
- File.Delete(Path.Combine("mafiles_backup", mafile.AccountName + ".mafile"));
await Done(mafile.RevocationCode ?? string.Empty, mafile.SteamId.Steam64.ToString(), login);
}
diff --git a/src/NebulaAuth/ViewModel/MafileMover/MafileMoverVM.cs b/src/NebulaAuth/ViewModel/MafileMover/MafileMoverVM.cs
index aeee6ef..da3cd89 100644
--- a/src/NebulaAuth/ViewModel/MafileMover/MafileMoverVM.cs
+++ b/src/NebulaAuth/ViewModel/MafileMover/MafileMoverVM.cs
@@ -1,13 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows.Threading;
-using AchiesUtilities.Web.Proxy;
+using AchiesUtilities.Web.Proxy;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NebulaAuth.Core;
@@ -33,6 +24,14 @@ using SteamLibForked.Abstractions;
using SteamLibForked.Exceptions.Authorization;
using SteamLibForked.Models.Core;
using SteamLibForked.Models.Session;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Threading;
using ILogger = Microsoft.Extensions.Logging.ILogger;
namespace NebulaAuth.ViewModel.MafileMover;
@@ -236,7 +235,7 @@ public partial class MafileMoverVM : ObservableObject, IAuthProvider, IDisposabl
var t = res.ReplacementToken;
var j = JsonConvert.SerializeObject(t);
- Storage.BackupHandlerStr(login, j);
+ Storage.WriteBackup(login, j);
var mobileData = t.ToMobileDataExtended(SteamAuthenticatorLinkerApi.GenerateDeviceId(), msd);
@@ -254,7 +253,6 @@ public partial class MafileMoverVM : ObservableObject, IAuthProvider, IDisposabl
}
Storage.SaveMafile(mafile);
- File.Delete(Path.Combine("mafiles_backup", mafile.AccountName + ".mafile"));
await Done(mafile.RevocationCode ?? string.Empty, mafile.SteamId.Steam64.ToString());
}
diff --git a/src/NebulaAuth/ViewModel/MainVM.cs b/src/NebulaAuth/ViewModel/MainVM.cs
index 71a25a5..3b30c4a 100644
--- a/src/NebulaAuth/ViewModel/MainVM.cs
+++ b/src/NebulaAuth/ViewModel/MainVM.cs
@@ -49,6 +49,7 @@ public partial class MainVM : ObservableObject
[RelayCommand]
public async Task Debug()
{
+
}
diff --git a/src/NebulaAuth/ViewModel/MainVM_Confirmations.cs b/src/NebulaAuth/ViewModel/MainVM_Confirmations.cs
index 5e0a7e5..b020001 100644
--- a/src/NebulaAuth/ViewModel/MainVM_Confirmations.cs
+++ b/src/NebulaAuth/ViewModel/MainVM_Confirmations.cs
@@ -1,20 +1,20 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Linq;
-using System.Threading.Tasks;
-using CommunityToolkit.Mvvm.Input;
+using CommunityToolkit.Mvvm.Input;
using NebulaAuth.Core;
using NebulaAuth.Model;
using NebulaAuth.Model.Entities;
using NebulaAuth.Utility;
using SteamLib.SteamMobile.Confirmations;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Threading.Tasks;
namespace NebulaAuth.ViewModel;
public partial class MainVM //Confirmations
{
- public ObservableCollection Confirmations { get; } = new();
+ public ObservableCollection Confirmations { get; } = [];
public bool ConfirmationsVisible => SelectedMafile == _confirmationsLoadedForMafile;
private Mafile? _confirmationsLoadedForMafile;
diff --git a/src/NebulaAuth/ViewModel/MainVM_File.cs b/src/NebulaAuth/ViewModel/MainVM_File.cs
index 7188638..942e60c 100644
--- a/src/NebulaAuth/ViewModel/MainVM_File.cs
+++ b/src/NebulaAuth/ViewModel/MainVM_File.cs
@@ -30,7 +30,7 @@ public partial class MainVM //File //TODO: Refactor
{
var mafile = SelectedMafile;
- var path = Storage.MafileFolder;
+ var path = Storage.MafilesDirectory;
string? mafilePath = null;
if (mafile != null)
{
diff --git a/src/NebulaAuth/ViewModel/MainVM_Groups.cs b/src/NebulaAuth/ViewModel/MainVM_Groups.cs
index 840b559..b7114d3 100644
--- a/src/NebulaAuth/ViewModel/MainVM_Groups.cs
+++ b/src/NebulaAuth/ViewModel/MainVM_Groups.cs
@@ -1,8 +1,11 @@
using System.Collections.ObjectModel;
+using System.Diagnostics;
using System.Linq;
+using System.Threading.Tasks;
using AchiesUtilities.Extensions;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
+using NebulaAuth.Core;
using NebulaAuth.Model;
using NebulaAuth.Model.Entities;
@@ -33,9 +36,17 @@ public partial class MainVM //Groups
[ObservableProperty] private ObservableCollection _groups = [];
private string _searchText = string.Empty;
-
private string? _selectedGroup;
+ [RelayCommand]
+ private async Task CreateGroup(Mafile? mafile)
+ {
+ if(mafile == null) return;
+ var res = await DialogsController.ShowTextFieldDialog(GetLocalization("CreateGroupTitle"), GetLocalization("CreateGroupInput"));
+ if(string.IsNullOrWhiteSpace(res)) return;
+ AddToGroup([res, mafile]);
+ SnackbarController.SendSnackbar(GetLocalization("CreateGroupSuccess"));
+ }
[RelayCommand]
private void AddGroup(string? value)
@@ -68,7 +79,7 @@ public partial class MainVM //Groups
OnPropertyChanged(nameof(SelectedMafile));
}
- [RelayCommand]
+ [RelayCommand(CanExecute = nameof(RemoveGroupCanExecute))]
private void RemoveGroup(Mafile? mafile)
{
if (mafile?.Group == null) return;
@@ -85,6 +96,10 @@ public partial class MainVM //Groups
PerformQuery();
}
+ private bool RemoveGroupCanExecute(Mafile? mafile)
+ {
+ return mafile is {Group: not null};
+ }
private void QueryGroups()
{
diff --git a/src/NebulaAuth/ViewModel/Other/SettingsVM.cs b/src/NebulaAuth/ViewModel/Other/SettingsVM.cs
index 356beaf..20c7898 100644
--- a/src/NebulaAuth/ViewModel/Other/SettingsVM.cs
+++ b/src/NebulaAuth/ViewModel/Other/SettingsVM.cs
@@ -1,9 +1,12 @@
-using System.Collections.Generic;
-using System.Windows.Media;
-using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NebulaAuth.Core;
using NebulaAuth.Model;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
namespace NebulaAuth.ViewModel.Other;
@@ -11,6 +14,7 @@ public partial class SettingsVM : ObservableObject
{
public Settings Settings => Settings.Instance;
+ #region SettingsProps
public bool HideToTray
{
@@ -88,7 +92,11 @@ public partial class SettingsVM : ObservableObject
public bool UseAccountNameAsMafileName
{
get => Settings.UseAccountNameAsMafileName;
- set => Settings.UseAccountNameAsMafileName = value;
+ set
+ {
+ Settings.UseAccountNameAsMafileName = value;
+ ApplyRenameSettingCommand.NotifyCanExecuteChanged();
+ }
}
public bool IgnorePatchTuesdayErrors
@@ -97,28 +105,9 @@ public partial class SettingsVM : ObservableObject
set => Settings.IgnorePatchTuesdayErrors = value;
}
- [ObservableProperty] private string? _password;
- [RelayCommand]
- private void SetPassword()
- {
- Settings.IsPasswordSet = PHandler.SetPassword(Password);
- }
-
- [RelayCommand]
- private void ResetThemeDefaults()
- {
- Settings.ResetThemeDefaults();
- OnPropertyChanged(nameof(BackgroundBlur));
- OnPropertyChanged(nameof(BackgroundOpacity));
- OnPropertyChanged(nameof(BackgroundGamma));
- OnPropertyChanged(nameof(LeftOpacity));
- OnPropertyChanged(nameof(RightOpacity));
- OnPropertyChanged(nameof(ApplyBlurBackground));
- OnPropertyChanged(nameof(RippleDisabled));
- }
-
+ #endregion
#region Theme
@@ -177,4 +166,90 @@ public partial class SettingsVM : ObservableObject
}
#endregion
+
+ [ObservableProperty] private string? _password;
+ [ObservableProperty] private string? _renameResultText;
+ [ObservableProperty]
+ [NotifyCanExecuteChangedFor(nameof(ApplyRenameSettingCommand))]
+ private bool _useAccountNameAsMafileNamePreview;
+
+ [ObservableProperty]
+ private double _renameMafilesProgress;
+
+ public SettingsVM()
+ {
+ _useAccountNameAsMafileNamePreview = Settings.UseAccountNameAsMafileName;
+ }
+
+ [RelayCommand]
+ private void SetPassword()
+ {
+ Settings.IsPasswordSet = PHandler.SetPassword(Password);
+
+ }
+
+ [RelayCommand]
+ private void ResetThemeDefaults()
+ {
+ Settings.ResetThemeDefaults();
+ OnPropertyChanged(nameof(BackgroundBlur));
+ OnPropertyChanged(nameof(BackgroundOpacity));
+ OnPropertyChanged(nameof(BackgroundGamma));
+ OnPropertyChanged(nameof(LeftOpacity));
+ OnPropertyChanged(nameof(RightOpacity));
+ OnPropertyChanged(nameof(ApplyBlurBackground));
+ OnPropertyChanged(nameof(RippleDisabled));
+ }
+
+ [RelayCommand(CanExecute = nameof(ApplyRenameSettingCanExecute))]
+ private async Task ApplyRenameSetting()
+ {
+ RenameResultText = null;
+ var targetValue = UseAccountNameAsMafileNamePreview;
+ if (UseAccountNameAsMafileName == targetValue) return;
+ RenameMafilesProgress = 0;
+ Storage.MafileRenameResult? result = null;
+ try
+ {
+ result = await Storage.RenameMafiles(targetValue, new Progress(p => RenameMafilesProgress = p));
+ UseAccountNameAsMafileName = targetValue;
+ }
+ catch (Exception ex)
+ {
+ Shell.Logger.Error(ex, "Error while renaming mafiles");
+ }
+ finally
+ {
+ RenameMafilesProgress = 0;
+ }
+
+ if (result == null)
+ {
+ RenameResultText = GetLoc("Error");
+ return;
+ }
+
+ if (result.Total == 0) return;
+
+ if (result.NotRenamed == 0)
+ {
+ var l = GetLoc("AllRenamed");
+ RenameResultText = string.Format(l, result.Total, result.BackupFileName);
+ return;
+ }
+ else
+ {
+ var l = GetLoc("PartialSuccess");
+ RenameResultText =
+ string.Format(l, result.Total, result.Renamed, result.Errors, result.AlreadyExist, result.BackupFileName);
+
+ }
+
+ string GetLoc(string key)
+ {
+ return LocManager.GetCodeBehindOrDefault(key, "SettingsVM", "MafileRenaming", key);
+ }
+ }
+
+ private bool ApplyRenameSettingCanExecute() => UseAccountNameAsMafileNamePreview != UseAccountNameAsMafileName;
}
\ No newline at end of file
diff --git a/src/NebulaAuth/localization.loc.json b/src/NebulaAuth/localization.loc.json
index 99c49e6..90c13fd 100644
--- a/src/NebulaAuth/localization.loc.json
+++ b/src/NebulaAuth/localization.loc.json
@@ -45,6 +45,16 @@
"ru": "Удалить",
"ua": "Видалити"
},
+ "Cancel": {
+ "en": "Cancel",
+ "ru": "Отмена",
+ "ua": "Скасувати"
+ },
+ "OK": {
+ "en": "OK",
+ "ru": "ОК",
+ "ua": "ОК"
+ },
"Abbreviations": {
"Time": {
"Seconds": {
@@ -290,6 +300,11 @@
"ru": "Скопировать SteamID",
"ua": "Скопіювати SteamID"
},
+ "CreateGroup": {
+ "en": "Create group",
+ "ru": "Создать группу",
+ "ua": "Створити групу"
+ },
"AddToGroup": {
"en": "Add to group",
"ru": "Добавить в группу",
@@ -432,7 +447,7 @@
"ua": "Поточний пароль шифрування"
},
"Hint": {
- "en": "Doesn't saved on disk",
+ "en": "Not saved to disk",
"ru": "Не сохраняется в системе",
"ua": "Не зберігається у системі"
}
@@ -453,10 +468,15 @@
"ru": "Разрешить автообновление",
"ua": "Дозволити автооновлення"
},
- "UseAccountName": {
- "en": "Use account login on mafiles",
- "ru": "Использовать логин аккаунта на мафайлах",
- "ua": "Використовувати логін акаунта на мафайлах"
+ "MafileNamingMode": {
+ "en": "Mafile naming mode",
+ "ru": "Режим именования мафайлов",
+ "ua": "Режим іменування мафайлів"
+ },
+ "ApplyNamingMode": {
+ "en": "Apply and rename",
+ "ru": "Применить и переименовать",
+ "ua": "Застосувати та перейменувати"
},
"IgnorePatchTuesdayErrors": {
"en": "Ignore Patch Tuesday errors in timer (exp.)",
@@ -708,6 +728,13 @@
"ua": "Підтвердіть дію"
}
},
+ "TextFieldDialog": {
+ "Title": {
+ "ru": "Введите значение",
+ "en": "Enter value",
+ "ua": "Введіть значення"
+ }
+ },
"CodeBehind": {
"MainVM": {
"SuccessfulLogin": {
@@ -726,12 +753,9 @@
"ua": "Відсутній RCode"
},
"ConfirmRemovingAuthenticator": {
- "ru":
- "Вы точно уверены, что хотите удалить аутентификатор?\r\nПосле этого вы не сможете обмениваться, использовать торговую площадку 15 дней. Мафайл будет удалён навсегда",
- "en":
- "Are you sure you want to remove the authenticator?\r\nAfter that, you will not be able to trade or use the marketplace for 15 days. Mafile will be deleted permanently",
- "ua":
- "Ви точно впевнені, що хочете видалити автентифікатор?\r\nПісля цього ви не зможете обмінюватися, використовувати торгову площадку 15 днів. Мафайл буде видалено назавжди"
+ "ru": "Вы точно уверены, что хотите удалить аутентификатор?\r\nПосле этого вы не сможете обмениваться, использовать торговую площадку 15 дней. Мафайл будет удалён навсегда",
+ "en": "Are you sure you want to remove the authenticator?\r\nAfter that, you will not be able to trade or use the marketplace for 15 days. Mafile will be deleted permanently",
+ "ua": "Ви точно впевнені, що хочете видалити автентифікатор?\r\nПісля цього ви не зможете обмінюватися, використовувати торгову площадку 15 днів. Мафайл буде видалено назавжди"
},
"AuthenticatorRemoved": {
@@ -800,12 +824,9 @@
"ua": "помилки:"
},
"RemoveMafileConfirmation": {
- "ru":
- "Удалить mafile?\r\nМафайл будет перемещен в папку 'mafiles_removed'\r\nЭто действие НЕ удаляет Steam Guard с аккаунта",
- "en":
- "Remove mafile?\r\nMafile will be moved to 'mafiles_removed' directory\r\nThis action will NOT remove the Steam Guard from the account",
- "ua":
- "Видалити mafile?\r\nМафайл буде переміщено у каталог 'mafiles_removed'\r\nЦя дія НЕ видаляє автентифікатор з облікового запису"
+ "ru": "Удалить mafile?\r\nМафайл будет перемещен в папку 'mafiles_removed'\r\nЭто действие НЕ удаляет Steam Guard с аккаунта",
+ "en": "Remove mafile?\r\nMafile will be moved to 'mafiles_removed' directory\r\nThis action will NOT remove the Steam Guard from the account",
+ "ua": "Видалити mafile?\r\nМафайл буде переміщено у каталог 'mafiles_removed'\r\nЦя дія НЕ видаляє автентифікатор з облікового запису"
},
"CantRemoveAlreadyExist": {
"ru": "Не удалось переместить mafile, возможно в папке уже существует мафайл с таким именем.",
@@ -859,9 +880,23 @@
},
"CantDecryptPassword": {
"en": "Can't decrypt password. Maybe password from this mafile was encrypted with another encryption password",
- "ru":
- "Не удалось расшифровать пароль. Возможно пароль из этого мафайла был зашифрован другим паролем шифрования",
+ "ru": "Не удалось расшифровать пароль. Возможно пароль из этого мафайла был зашифрован другим паролем шифрования",
"ua": "Не вдалося розшифрувати пароль. Можливо пароль з цього мафайла був зашифрований іншим паролем шифрування"
+ },
+ "CreateGroupTitle": {
+ "en": "New group",
+ "ru": "Новая группа",
+ "ua": "Нова група"
+ },
+ "CreateGroupInput": {
+ "en": "Enter group name",
+ "ru": "Введите имя группы",
+ "ua": "Введіть назву групи"
+ },
+ "CreateGroupSuccess": {
+ "en": "Group created",
+ "ru": "Группа создана",
+ "ua": "Групу створено"
}
},
"ErrorTranslator": {
@@ -1116,10 +1151,8 @@
},
"InvalidStateWithStatus2": {
"ru": "Неверное состояние (InvalidState) со статусом 2. Откройте ссылку на руководство сверху этого окна.",
- "en":
- "Invalid state (InvalidState) with status 2. Open link to the troubleshooting guide at the top of this window.",
- "ua":
- "Невірний стан (InvalidState) зі статусом 2. Відкрийте посилання на посібник з усунення несправностей у верхній частині цього вікна."
+ "en": "Invalid state (InvalidState) with status 2. Open link to the troubleshooting guide at the top of this window.",
+ "ua": "Невірний стан (InvalidState) зі статусом 2. Відкрийте посилання на посібник з усунення несправностей у верхній частині цього вікна."
},
"GeneralFailure": {
"ru": "General Failure",
@@ -1168,8 +1201,7 @@
"Guard": {
"ru": "Ошибка: Был запрошен вход с помощью Steam Guard. На аккаунте уже активирован мобильный аутентификатор",
"en": "Error: Login with Steam Guard was requested. Mobile authenticator is already activated on the account",
- "ua":
- "Помилка: Був запрошений вхід за допомогою Steam Guard. На акаунті вже активовано мобільний автентифікатор"
+ "ua": "Помилка: Був запрошений вхід за допомогою Steam Guard. На акаунті вже активовано мобільний автентифікатор"
},
"Unknown": {
"ru": "Ошибка: Неизвестный тип аутентификации",
@@ -1272,12 +1304,9 @@
"ua": "На пошту надіслано лист. Відкрийте посилання з листа, а потім натисніть — 'Продовжити'"
},
"ClickOnEmailLinkRetry": {
- "ru":
- "Не удалось подтвердить переход по ссылке. Убедитесь, что вы открыли ссылку из письма, затем нажмите — 'Продолжить'",
- "en":
- "We couldn’t verify that you clicked the link. Make sure you opened the link from the email, then click 'Proceed'",
- "ua":
- "Не вдалося підтвердити перехід за посиланням. Переконайтесь, що ви відкрили посилання з листа, а потім натисніть — 'Продовжити'"
+ "ru": "Не удалось подтвердить переход по ссылке. Убедитесь, что вы открыли ссылку из письма, затем нажмите — 'Продолжить'",
+ "en": "We couldn’t verify that you clicked the link. Make sure you opened the link from the email, then click 'Proceed'",
+ "ua": "Не вдалося підтвердити перехід за посиланням. Переконайтесь, що ви відкрили посилання з листа, а потім натисніть — 'Продовжити'"
},
"PhoneHint": {
"ru": "На телефон {0} была отправлена СМС",
@@ -1285,12 +1314,9 @@
"ua": "На телефон {0} було відправлено СМС"
},
"EnterPhoneNumber": {
- "ru":
- "Введите номер в международном формате, только цифры (без '+', пробелов и скобок), или оставьте поле пустым, чтобы привязать без номера",
- "en":
- "Enter number in international format, digits only (no '+', spaces or brackets), or leave the field empty to link without a number",
- "ua":
- "Введіть номер у міжнародному форматі, лише цифри (без '+', пробілів і дужок), або залиште поле порожнім, щоб прив’язати без номера"
+ "ru": "Введите номер в международном формате, только цифры (без '+', пробелов и скобок), или оставьте поле пустым, чтобы привязать без номера",
+ "en": "Enter number in international format, digits only (no '+', spaces or brackets), or leave the field empty to link without a number",
+ "ua": "Введіть номер у міжнародному форматі, лише цифри (без '+', пробілів і дужок), або залиште поле порожнім, щоб прив’язати без номера"
}
},
"MafileMoverVM": {
@@ -1315,11 +1341,9 @@
"ua": "RCode: {0}\r\nІм'я файлу: {1}.mafile"
},
"GuardIsNotActive": {
- "ru":
- "Steam Guard установлен на данном аккаунте. Чтобы привязать mafile к аккаунту, воспользуйтесь окном \"Привязать\"",
+ "ru": "Steam Guard установлен на данном аккаунте. Чтобы привязать mafile к аккаунту, воспользуйтесь окном \"Привязать\"",
"en": "Steam Guard is set on this account. To link mafile to the account, use the 'Link' window",
- "ua":
- "Steam Guard встановлено на цьому акаунті. Щоб прив'язати mafile до акаунту, скористайтеся вікном 'Прив'язати'"
+ "ua": "Steam Guard встановлено на цьому акаунті. Щоб прив'язати mafile до акаунту, скористайтеся вікном 'Прив'язати'"
},
"SeemsNoPhoneNumber": {
"en": "The account has no phone number linked, returned Fail code (2)",
@@ -1354,14 +1378,44 @@
"ua": "Авто "
},
"TimerPreventedOverlap": {
- "ru":
- "Авто: таймер подтверждений пытался начать новый цикл, когда предыдущий еще не завершился. Советуем увеличить задержку",
- "en":
- "Auto: confirmation timer tried to start new cycle when previous one was not finished yet. We recommend to increase delay",
- "ua":
- "Авто: таймер підтверджень намагався запустити новий цикл, коли попередній ще не закінчився. Рекомендуємо збільшити затримку"
+ "ru": "Авто: таймер подтверждений пытался начать новый цикл, когда предыдущий еще не завершился. Советуем увеличить задержку",
+ "en": "Auto: confirmation timer tried to start new cycle when previous one was not finished yet. We recommend to increase delay",
+ "ua": "Авто: таймер підтверджень намагався запустити новий цикл, коли попередній ще не закінчився. Рекомендуємо збільшити затримку"
}
- }
+ },
+ "SettingsVM": {
+ "MafileRenaming": {
+ "Error": {
+ "en": "Error while renaming mafiles. It was saved in log",
+ "ru": "Ошибка при переименовании мафайлов. Она была сохранена в log",
+ "ua": "Помилка при перейменуванні мафайлів. Вона була збережена в log"
+ },
+ "AllRenamed": {
+ "ru": "Все мафайлы успешно переименованы ({0}).\r\nБыла создана резервная копия: {1}",
+ "en": "All mafiles successfully renamed ({0}).\r\nBackup was created: {1}",
+ "ua": "Всі мафайли успішно перейменовані ({0}).\r\nБуло створено резервну копію: {1}"
+ },
+ "PartialSuccess": {
+ "en": "Total mafiles: {0}\r\nRenamed: {1}\r\nConflicts: {2}\r\nErrors: {3}\r\n\r\nBackup of mafiles saved in file: {4}",
+ "ru": "Всего мафайлов: {0}\r\nПереименовано: {1}\r\nКонфликты: {2}\r\nОшибок: {3}\r\n\r\nРезервная копия мафайлов сохранена в файле: {4}",
+ "ua": "Всього мафайлів: {0}\r\nПерейменовано: {1}\r\nКонфлікти: {2}\r\nПомилок: {3}\r\n\r\nРезервна копія мафайлів збережена у файлі: {4}"
+ }
+ }
+ },
+ "ProxyStorage": {
+ "ErrorWhileLoadingProxies": {
+ "en": "Error while loading proxies",
+ "ru": "Ошибка при загрузке прокси",
+ "ua": "Помилка при завантаженні проксі"
+ }
+ },
+ "Settings": {
+ "ErrorWhileLoadingSettings": {
+ "en": "Error while loading settings. Settings were reset",
+ "ru": "Ошибка при загрузке настроек. Настройки были сброшены",
+ "ua": "Помилка при завантаженні налаштувань. Налаштування були скинуті"
+ }
+ }
},
"CantAlignTimeError": {
"ru":