This commit is contained in:
2023-04-16 15:43:17 +03:00
parent 3f774d751f
commit 79b0df8609
19 changed files with 2394 additions and 110 deletions

View File

@@ -0,0 +1,64 @@
using Newtonsoft.Json;
using System.Text;
namespace FileSplitter.Shared.Classes;
/// <summary>
/// Параметры консоли программы
/// </summary>
public sealed class FileSplitterConsoleOptions
{
/// <summary>
/// Конструктор
/// </summary>
public FileSplitterConsoleOptions () => Language = "russian";
/// <summary>
/// Язык приложения
/// </summary>
public string Language { get; set; }
/// <summary>
/// Сохранение параметров в файл
/// </summary>
public void Save ()
{
//Открываю файл
StreamWriter writer = new("settings.json", Encoding.UTF8,
new() { Access = FileAccess.Write, Mode = FileMode.Create });
//Записываю файл
writer.WriteLine(JsonConvert.SerializeObject(this));
//Закрываю файл
writer.Close();
//Освобождаю память
writer.Dispose();
}
/// <summary>
/// Загрузка параметров из файла
/// </summary>
public void Load ()
{
//Если файла опций не существует
if (!File.Exists("settings.json"))
//- то создаём
Save();
//Открываю файл
StreamReader reader = new("settings.json", Encoding.UTF8);
//Читаю файл
FileSplitterConsoleOptions options =
JsonConvert.DeserializeObject<FileSplitterConsoleOptions>(reader.ReadLine() ?? "[]") ?? new();
//- закрываю файл
reader.Close();
//- освобождаю память
reader.Dispose();
//Устанавливаю параметры
Language = options.Language;
}
}

View File

@@ -0,0 +1,134 @@
namespace FileSplitter.Shared.Classes;
/// <summary>
/// Класс json-представления языкового файла программы
/// </summary>
public class FileSplitterLanguage
{
//Параметры приложения
public FileSplitterLanguage()
{
AppTitle = string.Empty;
AppVersion = string.Empty;
AppCopyrights = string.Empty;
MessageNoParametersForSplit = string.Empty;
MessageSplitAsk = string.Empty;
MessageStartSplit = string.Empty;
MessageSplitFilePart = string.Empty;
MessageSplitComplete = string.Empty;
MessageHashCheckStart = string.Empty;
MessageHashCheckFail = string.Empty;
MessageHashCheckComplete = string.Empty;
MessageJoinAsk = string.Empty;
MessageStartJoin = string.Empty;
MessageJoinUnsupportedFile = string.Empty;
MessageJoinUnknownFile = string.Empty;
MessageJoinHashError = string.Empty;
MessageJoinCheckError = string.Empty;
MessageJoinFilePart = string.Empty;
MessageJoinComplete = string.Empty;
MessagePleaseWaitToReady = string.Empty;
InteractiveStartAsk = string.Empty;
InteractiveWrongInput = string.Empty;
InteractiveOperationFinish = string.Empty;
InteractiveFileNameNotExist = string.Empty;
InteractiveFileNameExist = string.Empty;
InteractiveSplitFileNameAsk = string.Empty;
InteractiveSplitFileNameResult = string.Empty;
InteractiveSplitTargetDirAsk = string.Empty;
InteractiveSplitTargetDirResult = string.Empty;
InteractiveSplitPartSizeAsk = string.Empty;
InteractiveSplitPartSizeAsk2 = string.Empty;
InteractiveSplitPartSizeResult = string.Empty;
InteractiveSplitOptionsAsk = string.Empty;
InteractiveSplitOptionsResult = string.Empty;
InteractiveJoinFileNameAsk = string.Empty;
InteractiveJoinFileNameResult = string.Empty;
InteractiveJoinTargetFileNameAsk = string.Empty;
InteractiveJoinTargetFileNameResult = string.Empty;
InteractiveJoinOptionsAsk = string.Empty;
InteractiveJoinOptionsResult = string.Empty;
InteractiveOptionsAsk = string.Empty;
InteractiveOptionsConfirm = string.Empty;
InteractiveOptionsResult = string.Empty;
FileSizeStringsByte = string.Empty;
FileSizeStringsKByte = string.Empty;
FileSizeStringsMByte = string.Empty;
FileSizeStringsGByte = string.Empty;
FileSizeStringsTByte = string.Empty;
ExitCodeNamesAllDone = string.Empty;
ExitCodeNamesInfoVersionUnsupported = string.Empty;
ExitCodeNamesInvalidParameters = string.Empty;
ExitCodeNamesSplitFileHashError = string.Empty;
ExitCodeNamesTargetFileCheckError = string.Empty;
ExitCodeNamesUnknownInfoFile = string.Empty;
ExitCodeNamesUserAborted = string.Empty;
}
public string AppTitle { get; set; }
public string AppVersion { get; set; }
public string AppCopyrights { get; set; }
//Сообщения
public string MessageNoParametersForSplit { get; set; }
public string MessageSplitAsk { get; set; }
public string MessageStartSplit { get; set; }
public string MessageSplitFilePart { get; set; }
public string MessageSplitComplete { get; set; }
public string MessageHashCheckStart { get; set; }
public string MessageHashCheckFail { get; set; }
public string MessageHashCheckComplete { get; set; }
public string MessageJoinAsk { get; set; }
public string MessageStartJoin { get; set; }
public string MessageJoinUnsupportedFile { get; set; }
public string MessageJoinUnknownFile { get; set; }
public string MessageJoinHashError { get; set; }
public string MessageJoinCheckError { get; set; }
public string MessageJoinFilePart { get; set; }
public string MessageJoinComplete { get; set; }
public string MessagePleaseWaitToReady { get; set; }
//Сообщения интерактивного режима
public string InteractiveStartAsk { get; set; }
public string InteractiveWrongInput { get; set; }
public string InteractiveOperationFinish { get; set; }
public string InteractiveFileNameNotExist { get; set; }
public string InteractiveFileNameExist { get; set; }
public string InteractiveSplitFileNameAsk { get; set; }
public string InteractiveSplitFileNameResult { get; set; }
public string InteractiveSplitTargetDirAsk { get; set; }
public string InteractiveSplitTargetDirResult { get; set; }
public string InteractiveSplitPartSizeAsk { get; set; }
public string InteractiveSplitPartSizeAsk2 { get; set; }
public string InteractiveSplitPartSizeResult { get; set; }
public string InteractiveSplitOptionsAsk { get; set; }
public string InteractiveSplitOptionsResult { get; set; }
public string InteractiveJoinFileNameAsk { get; set; }
public string InteractiveJoinFileNameResult { get; set; }
public string InteractiveJoinTargetFileNameAsk { get; set; }
public string InteractiveJoinTargetFileNameResult { get; set; }
public string InteractiveJoinOptionsAsk { get; set; }
public string InteractiveJoinOptionsResult { get; set; }
public string InteractiveOptionsAsk { get; set; }
public string InteractiveOptionsConfirm { get; set; }
public string InteractiveOptionsResult { get; set; }
//Константы размеров
public string FileSizeStringsByte { get; set; }
public string FileSizeStringsKByte { get; set; }
public string FileSizeStringsMByte { get; set; }
public string FileSizeStringsGByte { get; set; }
public string FileSizeStringsTByte { get; set; }
//Переводы кодов возврата
public string ExitCodeNamesAllDone { get; set; }
public string ExitCodeNamesInfoVersionUnsupported { get; set; }
public string ExitCodeNamesInvalidParameters { get; set; }
public string ExitCodeNamesSplitFileHashError { get; set; }
public string ExitCodeNamesTargetFileCheckError { get; set; }
public string ExitCodeNamesUnknownInfoFile { get; set; }
public string ExitCodeNamesUserAborted { get; set; }
}

View File

@@ -1,62 +1,117 @@
using FileSplitter.Shared.Enums;
using Newtonsoft.Json;
namespace FileSplitter.Shared.Classes;
public static class Localization
{
//Содержимое языкового файла
private static readonly FileSplitterLanguage Language;
/// <summary>
/// Конструктор
/// </summary>
static Localization()
{
//Создаю опции приложения
FileSplitterConsoleOptions options = new();
//- и загружаю их
options.Load();
//Язык приложения
string language = options.Language;
//Если файла языка не существует
if (!File.Exists($"languages\\{language}.json"))
//- то используем русский
language = "russian";
//Читаю файл
string languageContent = File.ReadAllText($"languages\\{language}.json");
//Загружаю парсер
Language = JsonConvert.DeserializeObject<FileSplitterLanguage>(languageContent) ?? new ();
//Задаю массивы
//- размеров файлов
FileSizeStrings = new[]
{
Language.FileSizeStringsByte,
Language.FileSizeStringsKByte,
Language.FileSizeStringsMByte,
Language.FileSizeStringsGByte,
Language.FileSizeStringsTByte
};
//- кодов ответов
ExitCodeNames = new()
{
(FsExitCode.ecAllDone, Language.ExitCodeNamesAllDone),
(FsExitCode.ecInvalidParameters, Language.ExitCodeNamesInvalidParameters),
(FsExitCode.ecUserAborted, Language.ExitCodeNamesUserAborted),
(FsExitCode.ecUnknownInfoFile, Language.ExitCodeNamesUnknownInfoFile),
(FsExitCode.ecInfoVersionUnsupported, Language.ExitCodeNamesInfoVersionUnsupported),
(FsExitCode.ecSplitFileHashError, Language.ExitCodeNamesSplitFileHashError),
(FsExitCode.ecTargetFileCheckError, Language.ExitCodeNamesTargetFileCheckError)
};
}
//Параметры приложения
public const string AppTitle = "ANB Software Делитель файлов";
public const string AppVersion = "Версия: {0}";
public const string AppCopyrights = "Авторские права (C) {0}, Александр Бабаев.";
public static string AppTitle => Language.AppTitle;
public static string AppVersion => Language.AppVersion;
public static string AppCopyrights => Language.AppCopyrights;
//Сообщения
public const string MessageNoParametersForSplit =
"Не заданы параметры разбиения. Информацию о работе с программой смотрите в файле \"Help\\Russian\\Console.html\"";
public const string MessageSplitAsk =
"Информация о разбиваемом файле:\n***{0}\n***Размер: {1}\n***Хэш файла: {2}\n***Предполагается разбиение на {3} части(-ей)\nВы хотите начать разбиение? [Y|y - да, Любая другая буква/слово/выражение - нет]";
public const string MessageStartSplit = "Запущено разбиение файла {0} на части размером {1} и сохранением их в директории {2}.";
public const string MessageSplitFilePart = "Идёт обработка части {0} из {1}...";
public const string MessageSplitComplete = "Разбиение файла {0} завершено!";
public const string MessageHashCheckStart = "Начинаю проверку хэша разбиения";
public const string MessageHashCheckFail = "К сожалению, файл \"{0}\" не прошёл проверку хэша!";
public const string MessageHashCheckComplete = "Проверка хэша завершена!";
public const string MessageJoinAsk = "Вы хотите начать сборку файла {0}? [Y|y - да, любая другая буква/слово/выражение - нет]";
public const string MessageStartJoin = "Запущено объединение файлов, заданных файлом информации {0}, в файл {1}.";
public const string MessageJoinUnsupportedFile = "К сожалению, версия файла информации {0} не поддерживается!";
public const string MessageJoinUnknownFile = "Не могу прочитать файл информации! Возможно он зашифрован?";
public const string MessageJoinHashError = "К сожалению, разделённые файлы не прошли проверку. Возможно они повреждены?";
public const string MessageJoinCheckError =
"К сожалению, объединённый файл не прошли проверку корректности объединения. Возможно были какие-либо ошибки?";
public const string MessageJoinFilePart = "Идёт обработка части {0} из {1}...";
public const string MessageJoinComplete = "Объединение файла {0} завершено!";
public static string MessageNoParametersForSplit => Language.MessageNoParametersForSplit;
public static string MessageSplitAsk => Language.MessageSplitAsk;
public static string MessageStartSplit => Language.MessageStartSplit;
public static string MessageSplitFilePart => Language.MessageSplitFilePart;
public static string MessageSplitComplete => Language.MessageSplitComplete;
public static string MessageHashCheckStart => Language.MessageHashCheckStart;
public static string MessageHashCheckFail => Language.MessageHashCheckFail;
public static string MessageHashCheckComplete => Language.MessageHashCheckComplete;
public static string MessageJoinAsk => Language.MessageJoinAsk;
public static string MessageStartJoin => Language.MessageStartJoin;
public static string MessageJoinUnsupportedFile => Language.MessageJoinUnsupportedFile;
public static string MessageJoinUnknownFile => Language.MessageJoinUnknownFile;
public static string MessageJoinHashError => Language.MessageJoinHashError;
public static string MessageJoinCheckError => Language.MessageJoinCheckError;
public static string MessageJoinFilePart => Language.MessageJoinFilePart;
public static string MessageJoinComplete => Language.MessageJoinComplete;
public static string MessagePleaseWaitToReady => Language.MessagePleaseWaitToReady;
//Сообщения интерактивного режима
public const string InteractiveStartAsk = "Выберете одно из действий:\n* S|s - разбиение\n* J|j - объединение\n* E|e - выход\nВаш выбор:";
public const string InteractiveWrongInput = "Выбрано неизвестное действие!";
public const string InteractiveOperationFinish = "Операция завершена с кодом: {0}";
public const string InteractiveSplitFileNameAsk = "Введите имя разбиваемого файла (или перетащите его сюда):";
public const string InteractiveFileNameNotExist = "Файл не существует! Повторить ввод файла? [Y|y - для повтора, любая другая буква - прерывание операции]";
public const string InteractiveSplitFileNameResult = "Для разбиения выбран файл: {0}";
public const string InteractiveSplitTargetDirAsk = "Выберете папку, куда следует сохранить части файла (или оставьте пустым, чтобы использовать папку разбиваемого файла):";
public const string InteractiveSplitTargetDirResult = "Файлы разбиения будут сохранены в папке: {0}";
public const string InteractiveSplitPartSizeAsk = "Введите размер части (в байтах):";
public const string InteractiveSplitPartSizeAsk2 = "Вы выбрали размер части {0}. Всё правильно? [Y|y - да, продолжить, любая другая буква - нет, повторить ввод]";
public const string InteractiveSplitPartSizeResult = "Выбран размер части: {0}";
public const string InteractiveSplitOptionsAsk = "Введите дополнительные параметры разбиения (разделитель - пробел):";
public const string InteractiveSplitOptionsResult = "Выбраны дополнительные параметры: [{0}]";
public static string InteractiveStartAsk => Language.InteractiveStartAsk;
public static string InteractiveWrongInput => Language.InteractiveWrongInput;
public static string InteractiveOperationFinish => Language.InteractiveOperationFinish;
public static string InteractiveFileNameNotExist => Language.InteractiveFileNameNotExist;
public static string InteractiveFileNameExist => Language.InteractiveFileNameExist;
public static string InteractiveSplitFileNameAsk => Language.InteractiveSplitFileNameAsk;
public static string InteractiveSplitFileNameResult => Language.InteractiveSplitFileNameResult;
public static string InteractiveSplitTargetDirAsk => Language.InteractiveSplitTargetDirAsk;
public static string InteractiveSplitTargetDirResult => Language.InteractiveSplitTargetDirResult;
public static string InteractiveSplitPartSizeAsk => Language.InteractiveSplitPartSizeAsk;
public static string InteractiveSplitPartSizeAsk2 => Language.InteractiveSplitPartSizeAsk2;
public static string InteractiveSplitPartSizeResult => Language.InteractiveSplitPartSizeResult;
public static string InteractiveSplitOptionsAsk => Language.InteractiveSplitOptionsAsk;
public static string InteractiveSplitOptionsResult => Language.InteractiveSplitOptionsResult;
public static string InteractiveJoinFileNameAsk => Language.InteractiveJoinFileNameAsk;
public static string InteractiveJoinFileNameResult => Language.InteractiveJoinFileNameResult;
public static string InteractiveJoinTargetFileNameAsk => Language.InteractiveJoinTargetFileNameAsk;
public static string InteractiveJoinTargetFileNameResult => Language.InteractiveJoinTargetFileNameResult;
public static string InteractiveJoinOptionsAsk => Language.InteractiveJoinOptionsAsk;
public static string InteractiveJoinOptionsResult => Language.InteractiveJoinOptionsResult;
public static string InteractiveOptionsAsk => Language.InteractiveOptionsAsk;
public static string InteractiveOptionsConfirm => Language.InteractiveOptionsConfirm;
public static string InteractiveOptionsResult => Language.InteractiveOptionsResult;
//Константы размеров
public static readonly string[] FileSizeStrings = { "байт", "Кб", "Мб", "Гб", "Тб" };
public static string[] FileSizeStrings { get; }
//Переводы кодов возврата
public static readonly List<(FsExitCode, string)> ExitCodeNames = new()
{
(FsExitCode.ecAllDone, "Успешно завершено"),
(FsExitCode.ecInvalidParameters, "Неверные параметры"),
(FsExitCode.ecUserAborted, "Прервано пользователем"),
(FsExitCode.ecUnknownInfoFile, "Неизвестный файл информации о разбиении"),
(FsExitCode.ecInfoVersionUnsupported, "Версия файла информации о разбиении не поддерживается"),
(FsExitCode.ecSplitFileHashError, "Ошибка проверки хэш-суммы разделённых файлов"),
(FsExitCode.ecTargetFileCheckError, "Ошибка проверки целостности собираемого файла")
};
public static List<(FsExitCode, string)> ExitCodeNames { get; }
}

View File

@@ -6,6 +6,16 @@
<Nullable>enable</Nullable>
<AssemblyName>FileSplitterShared</AssemblyName>
<RootNamespace>FileSplitter.Shared</RootNamespace>
<Title>FileSplitted Shared Library</Title>
<Version>2023.04.16</Version>
<Authors>Alexander Babaev</Authors>
<Company />
<Product>ANB Software FileSplitter</Product>
<Description>Support library for ANB Software FileSplitter</Description>
<Copyright>Alexander Babaev</Copyright>
<PackageProjectUrl>https://git.babaev-an.ru/babaev-an/FileSplitter</PackageProjectUrl>
<RepositoryUrl>https://git.babaev-an.ru/babaev-an/FileSplitter</RepositoryUrl>
<NeutralLanguage>ru</NeutralLanguage>
</PropertyGroup>
<ItemGroup>