Move all localizable strings from Aaru.Gui project to resources.

This commit is contained in:
2022-11-19 21:10:41 +00:00
parent 887e58c6e5
commit 81195f8630
42 changed files with 1128 additions and 1059 deletions

View File

@@ -48,6 +48,7 @@
<ProjectReference Include="..\Aaru.Core\Aaru.Core.csproj"/>
<ProjectReference Include="..\Aaru.Devices\Aaru.Devices.csproj"/>
<ProjectReference Include="..\Aaru.Checksums\Aaru.Checksums.csproj"/>
<ProjectReference Include="..\Aaru.Localization\Aaru.Localization.csproj"/>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Assets\Logos\Media\AIT1.png"/>

View File

@@ -34,6 +34,7 @@
using System;
using System.Collections.ObjectModel;
using Aaru.Console;
using Aaru.Localization;
using JetBrains.Annotations;
namespace Aaru.Gui;
@@ -96,7 +97,7 @@ static class ConsoleHandler
Message = string.Format(format, arg),
Module = null,
Timestamp = DateTime.Now,
Type = "Info"
Type = UI.LogEntry_Type_Info
});
}

View File

@@ -33,6 +33,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using Aaru.Localization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.LogicalTree;
@@ -247,7 +248,7 @@ public sealed class BlockMap : ItemsControl
case NotifyCollectionChangedAction.Replace:
{
if(e.NewItems is not {} items)
throw new ArgumentException("Invalid list of items");
throw new ArgumentException(UI.Invalid_list_of_items);
using IDrawingContextImpl ctxi = _bitmap.CreateDrawingContext(null);
using var ctx = new DrawingContext(ctxi, false);
@@ -255,7 +256,7 @@ public sealed class BlockMap : ItemsControl
foreach(object item in items)
{
if(item is not ValueTuple<ulong, double> block)
throw new ArgumentException("Invalid item in list", nameof(Items));
throw new ArgumentException(UI.Invalid_item_in_list, nameof(Items));
DrawCluster(block.Item1, block.Item2, false, ctx);
}
@@ -269,7 +270,7 @@ public sealed class BlockMap : ItemsControl
{
if(e.NewItems is not {} newItems ||
e.OldItems is not {} oldItems)
throw new ArgumentException("Invalid list of items");
throw new ArgumentException(UI.Invalid_list_of_items);
using IDrawingContextImpl ctxi = _bitmap.CreateDrawingContext(null);
using var ctx = new DrawingContext(ctxi, false);
@@ -277,7 +278,7 @@ public sealed class BlockMap : ItemsControl
foreach(object item in oldItems)
{
if(item is not ValueTuple<ulong, double> block)
throw new ArgumentException("Invalid item in list", nameof(Items));
throw new ArgumentException(UI.Invalid_item_in_list, nameof(Items));
DrawCluster(block.Item1, block.Item2, false, ctx);
}
@@ -285,7 +286,7 @@ public sealed class BlockMap : ItemsControl
foreach(object item in newItems)
{
if(item is not ValueTuple<ulong, double> block)
throw new ArgumentException("Invalid item in list", nameof(Items));
throw new ArgumentException(UI.Invalid_item_in_list, nameof(Items));
DrawCluster(block.Item1, block.Item2, false, ctx);
}
@@ -315,7 +316,7 @@ public sealed class BlockMap : ItemsControl
foreach(object item in Items)
{
if(item is not ValueTuple<ulong, double> block)
throw new ArgumentException("Invalid item in list", nameof(Items));
throw new ArgumentException(UI.Invalid_item_in_list, nameof(Items));
DrawCluster(block.Item1, block.Item2, false, ctx);
}
@@ -327,7 +328,7 @@ public sealed class BlockMap : ItemsControl
{
if(double.IsNegative(duration) ||
double.IsInfinity(duration))
throw new ArgumentException("Duration cannot be negative or infinite", nameof(duration));
throw new ArgumentException(UI.Duration_cannot_be_negative_or_infinite, nameof(duration));
bool newContext = ctx is null;
ulong clustersPerRow = (ulong)Width / BLOCK_SIZE;
@@ -385,8 +386,7 @@ public sealed class BlockMap : ItemsControl
{
if(e.NewValue != null &&
e.NewValue is not IList<(ulong, double)>)
throw new
ArgumentException("Items must be a IList<(ulong, double)> with ulong being the block and double being the time spent reading it, or NaN for an error.");
throw new ArgumentException(UI.Items_must_be_a_IList_ulong_double);
base.ItemsChanged(e);

View File

@@ -40,6 +40,7 @@ using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Aaru.Gui.Models;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
@@ -88,13 +89,13 @@ public sealed class AboutViewModel : ViewModelBase
}
[NotNull]
public string AboutLabel => "About";
public string AboutLabel => UI.Label_About;
[NotNull]
public string LibrariesLabel => "Libraries";
public string LibrariesLabel => UI.Label_Libraries;
[NotNull]
public string AuthorsLabel => "Authors";
public string AuthorsLabel => UI.Label_Authors;
[NotNull]
public string Title => "About Aaru";
public string Title => UI.Title_About_Aaru;
[NotNull]
public string SoftwareName => "Aaru";
[NotNull]
@@ -104,27 +105,15 @@ public sealed class AboutViewModel : ViewModelBase
[NotNull]
public string Website => "https://aaru.app";
[NotNull]
public string License => "License: GNU General Public License Version 3";
public string License => UI.Label_License;
[NotNull]
public string CloseLabel => "Close";
public string CloseLabel => UI.ButtonLabel_Close;
[NotNull]
public string AssembliesLibraryText => "Library";
public string AssembliesLibraryText => UI.Title_Library;
[NotNull]
public string AssembliesVersionText => "Version";
public string AssembliesVersionText => UI.Title_Version;
[NotNull]
public string Authors => @"Developers:
Natalia Portillo
Michael Drüing
Rebecca Wallander
Testers:
Silas Laspada
Public relations:
Noah Bacon
Logo and art:
Juan Carlos Pastor Segura (Denymetanol)";
public string Authors => UI.Text_Authors;
public ReactiveCommand<Unit, Unit> WebsiteCommand { get; }
public ReactiveCommand<Unit, Unit> LicenseCommand { get; }
public ReactiveCommand<Unit, Unit> CloseCommand { get; }

View File

@@ -39,6 +39,7 @@ using System.Reflection;
using System.Threading.Tasks;
using Aaru.CommonTypes.Interop;
using Aaru.Console;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using MessageBox.Avalonia;
@@ -62,21 +63,21 @@ public sealed class ConsoleViewModel : ViewModelBase
}
[NotNull]
public string Title => "Console";
public string Title => UI.Title_Console;
public ReactiveCommand<Unit, Unit> ClearCommand { get; }
public ReactiveCommand<Unit, Task> SaveCommand { get; }
public ObservableCollection<LogEntry> Entries => ConsoleHandler.Entries;
[NotNull]
public string DebugText => "Enable debug console";
public string DebugText => UI.Enable_debug_console;
[NotNull]
public string SaveLabel => "Save";
public string SaveLabel => UI.ButtonLabel_Save;
[NotNull]
public string ClearLabel => "Clear";
public string ClearLabel => UI.ButtonLabel_Clear;
public string TimeLabel => "Time";
public string TypeLabel => "Type";
public string ModuleLabel => "Module";
public string MessageLabel => "Message";
public string TimeLabel => UI.Title_Time;
public string TypeLabel => UI.Title_Type;
public string ModuleLabel => UI.Title_Module;
public string MessageLabel => UI.Title_Message;
public bool DebugChecked
{
@@ -98,7 +99,7 @@ public sealed class ConsoleViewModel : ViewModelBase
{
"log"
}),
Name = "Log files"
Name = UI.Dialog_Log_files
});
string result = await dlgSave.ShowAsync(_view);
@@ -111,7 +112,7 @@ public sealed class ConsoleViewModel : ViewModelBase
var logFs = new FileStream(result, FileMode.Create, FileAccess.ReadWrite);
var logSw = new StreamWriter(logFs);
logSw.WriteLine("Log saved at {0}", DateTime.Now);
logSw.WriteLine(UI.Log_saved_at_0, DateTime.Now);
PlatformID platId = DetectOS.GetRealPlatformID();
string platVer = DetectOS.GetVersion();
@@ -121,7 +122,7 @@ public sealed class ConsoleViewModel : ViewModelBase
typeof(AssemblyInformationalVersionAttribute)) as
AssemblyInformationalVersionAttribute;
logSw.WriteLine("################# System information #################");
logSw.WriteLine(UI.System_information);
logSw.WriteLine("{0} {1} ({2}-bit)", DetectOS.GetPlatformName(platId, platVer), platVer,
Environment.Is64BitOperatingSystem ? 64 : 32);
@@ -130,19 +131,19 @@ public sealed class ConsoleViewModel : ViewModelBase
logSw.WriteLine();
logSw.WriteLine("################# Program information ################");
logSw.WriteLine(UI.Program_information);
logSw.WriteLine("Aaru {0}", assemblyVersion?.InformationalVersion);
logSw.WriteLine("Running in {0}-bit", Environment.Is64BitProcess ? 64 : 32);
logSw.WriteLine(UI.Running_in_0_bit, Environment.Is64BitProcess ? 64 : 32);
#if DEBUG
logSw.WriteLine("DEBUG version");
logSw.WriteLine(UI.DEBUG_version);
#endif
logSw.WriteLine("Command line: {0}", Environment.CommandLine);
logSw.WriteLine(UI.Command_line_0, Environment.CommandLine);
logSw.WriteLine();
logSw.WriteLine("################# Console ################");
logSw.WriteLine(UI.Console_with_ornament);
foreach(LogEntry entry in ConsoleHandler.Entries)
if(entry.Type != "Info")
if(entry.Type != UI.LogEntry_Type_Info)
logSw.WriteLine("{0}: ({1}) {2}", entry.Timestamp, entry.Type.ToLower(), entry.Message);
else
logSw.WriteLine("{0}: {1}", entry.Timestamp, entry.Message);
@@ -153,10 +154,11 @@ public sealed class ConsoleViewModel : ViewModelBase
catch(Exception exception)
{
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Exception {exception.Message
} trying to save logfile, details has been sent to console.",
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Exception_0_trying_to_save_logfile_details_has_been_sent_to_console,
exception.Message), ButtonEnum.Ok, Icon.Error).
ShowDialog(_view);
AaruConsole.ErrorWriteLine("Console", exception.Message);
AaruConsole.ErrorWriteLine("Console", exception.StackTrace);

View File

@@ -38,6 +38,7 @@ using System.Text;
using System.Threading.Tasks;
using Aaru.Gui.Models;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
@@ -73,12 +74,12 @@ public sealed class EncodingsViewModel : ViewModelBase
}
[NotNull]
public string Title => "Encodings";
public string Title => UI.Encodings;
[NotNull]
public string CloseLabel => "Close";
public string CloseLabel => UI.ButtonLabel_Close;
public string CodeLabel => "Code";
public string NameLabel => "Name";
public string CodeLabel => UI.Title_Code_for_encoding;
public string NameLabel => UI.Title_Name;
public ReactiveCommand<Unit, Unit> CloseCommand { get; }
public ObservableCollection<EncodingModel> Encodings { get; }

View File

@@ -34,6 +34,7 @@ using System.IO;
using System.Reactive;
using System.Reflection;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
@@ -49,6 +50,7 @@ public sealed class LicenseViewModel : ViewModelBase
_view = view;
CloseCommand = ReactiveCommand.Create(ExecuteCloseCommand);
// TODO: Localize
using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Aaru.Gui.LICENSE");
if(stream == null)
@@ -60,9 +62,9 @@ public sealed class LicenseViewModel : ViewModelBase
}
[NotNull]
public string Title => "Aaru's license";
public string Title => UI.Title_Aaru_license;
[NotNull]
public string CloseLabel => "Close";
public string CloseLabel => UI.ButtonLabel_Close;
public string LicenseText { get; }
public ReactiveCommand<Unit, Unit> CloseCommand { get; }

View File

@@ -37,6 +37,7 @@ using Aaru.CommonTypes.Interfaces;
using Aaru.Core;
using Aaru.Gui.Models;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
@@ -139,29 +140,29 @@ public sealed class PluginsViewModel : ViewModelBase
}
[NotNull]
public string Title => "Plugins";
public string Title => UI.Title_Plugins;
[NotNull]
public string FiltersLabel => "Filters";
public string FiltersLabel => UI.Title_Filters;
[NotNull]
public string PartitionsLabel => "Partitions";
public string PartitionsLabel => UI.Title_Partitions;
[NotNull]
public string FilesystemsLabel => "Filesystems";
public string FilesystemsLabel => UI.Title_Filesystems;
[NotNull]
public string IdentifyLabel => "Identify only:";
public string IdentifyLabel => UI.Title_Identify_only;
[NotNull]
public string ImagesLabel => "Media images";
public string ImagesLabel => UI.Title_Media_images;
[NotNull]
public string FloppyImagesLabel => "Floppy images";
public string FloppyImagesLabel => UI.Title_Floppy_images;
[NotNull]
public string ReadableLabel => "Readable:";
public string ReadableLabel => UI.Title_Readable;
[NotNull]
public string WritableLabel => "Writable:";
public string WritableLabel => UI.Title_Writable;
[NotNull]
public string CloseLabel => "Close";
public string NameLabel => "Name";
public string UUIDLabel => "UUID";
public string VersionLabel => "Version";
public string AuthorLabel => "Author";
public string CloseLabel => UI.ButtonLabel_Close;
public string NameLabel => UI.Title_Name;
public string UUIDLabel => UI.Title_UUID;
public string VersionLabel => UI.Title_Version;
public string AuthorLabel => UI.Title_Author;
public ReactiveCommand<Unit, Unit> CloseCommand { get; }
public ObservableCollection<PluginModel> Filters { get; }

View File

@@ -32,6 +32,7 @@
using System.Reactive;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using Aaru.Settings;
using JetBrains.Annotations;
using ReactiveUI;
@@ -90,85 +91,61 @@ public sealed class SettingsViewModel : ViewModelBase
// TODO: Show Preferences in macOS
[NotNull]
public string Title => "Settings";
public string Title => UI.Title_Settings;
[NotNull]
public string GdprLabel => "GDPR";
public string GdprLabel => UI.Title_GDPR;
[NotNull]
public string ReportsLabel => "Reports";
public string ReportsLabel => UI.Title_Reports;
[NotNull]
public string StatisticsLabel => "Statistics";
public string StatisticsLabel => UI.Title_Statistics;
[NotNull]
public string SaveLabel => "Save";
public string SaveLabel => UI.ButtonLabel_Save;
[NotNull]
public string CancelLabel => "Cancel";
public string CancelLabel => UI.ButtonLabel_Cancel;
[NotNull]
public string GdprText1 =>
@"In compliance with the European Union General Data Protection Regulation 2016/679 (GDPR),
we must give you the following information about Aaru and ask if you want to opt-in
in some information sharing.";
public string GdprText1 => UI.GDPR_Compliance;
[NotNull]
public string GdprText2 => @"Disclaimer: Because Aaru is an open source software this information, and therefore,
compliance with GDPR only holds true if you obtained a certificated copy from its original
authors. In case of doubt, close Aaru now and ask in our IRC support channel.";
public string GdprText2 => UI.GDPR_Open_Source_Disclaimer;
[NotNull]
public string GdprText3 =>
@"For any information sharing your IP address may be stored in our server, in a way that is not
possible for any person, manual, or automated process, to link with your identity, unless
specified otherwise.";
public string GdprText3 => UI.GDPR_Information_sharing;
[NotNull]
public string ReportsGloballyText =>
@"With the 'device-report' command, Aaru creates a report of a device, that includes its
manufacturer, model, firmware revision and/or version, attached bus, size, and supported commands.
The serial number of the device is not stored in the report. If used with the debug parameter,
extra information about the device will be stored in the report. This information is known to contain
the device serial number in non-standard places that prevent the automatic removal of it on a handful
of devices. A human-readable copy of the report in XML format is always created in the same directory
where Aaru is being run from.";
public string ReportsGloballyText => UI.Configure_Device_Report_information_disclaimer;
[NotNull]
public string SaveReportsGloballyText => "Save device reports in shared folder of your computer?";
public string SaveReportsGloballyText => UI.Save_device_reports_in_shared_folder_of_your_computer_Q;
[NotNull]
public string ReportsText =>
@"Sharing a report with us will send it to our server, that's in the european union territory, where it
will be manually analyzed by an european union citizen to remove any trace of personal identification
from it. Once that is done, it will be shared in our stats website, https://www.aaru.app
These report will be used to improve Aaru support, and in some cases, to provide emulation of the
devices to other open-source projects. In any case, no information linking the report to you will be stored.";
public string ReportsText => UI.Configure_share_report_disclaimer;
[NotNull]
public string ShareReportsText => "Share your device reports with us?";
public string ShareReportsText => UI.Share_your_device_reports_with_us_Q;
[NotNull]
public string StatisticsText =>
@"Aaru can store some usage statistics. These statistics are limited to the number of times a
command is executed, a filesystem, partition, or device is used, the operating system version, and other.
In no case, any information besides pure statistical usage numbers is stored, and they're just joint to the
pool with no way of using them to identify you.";
public string StatisticsText => UI.Statistics_disclaimer;
[NotNull]
public string SaveStatsText => "Save stats about your Aaru usage?";
public string SaveStatsText => UI.Save_stats_about_your_Aaru_usage_Q;
[NotNull]
public string ShareStatsText => "Share your stats (anonymously)?";
public string ShareStatsText => UI.Share_your_stats_anonymously_Q;
[NotNull]
public string CommandStatsText => "Gather statistics about command usage?";
public string CommandStatsText => UI.Gather_statistics_about_command_usage_Q;
[NotNull]
public string DeviceStatsText => "Gather statistics about found devices?";
public string DeviceStatsText => UI.Gather_statistics_about_found_devices_Q;
[NotNull]
public string FilesystemStatsText => "Gather statistics about found filesystems?";
public string FilesystemStatsText => UI.Gather_statistics_about_found_filesystems_Q;
[NotNull]
public string FilterStatsText => "Gather statistics about found file filters?";
public string FilterStatsText => UI.Gather_statistics_about_found_file_filters_Q;
[NotNull]
public string MediaImageStatsText => "Gather statistics about found media image formats?";
public string MediaImageStatsText => UI.Gather_statistics_about_found_media_image_formats_Q;
[NotNull]
public string MediaScanStatsText => "Gather statistics about scanned media?";
public string MediaScanStatsText => UI.Gather_statistics_about_scanned_media_Q;
[NotNull]
public string PartitionStatsText => "Gather statistics about found partitioning schemes?";
public string PartitionStatsText => UI.Gather_statistics_about_found_partitioning_schemes_Q;
[NotNull]
public string MediaStatsText => "Gather statistics about media types?";
public string MediaStatsText => UI.Gather_statistics_about_media_types_Q;
[NotNull]
public string VerifyStatsText => "Gather statistics about media image verifications?";
public string VerifyStatsText => UI.Gather_statistics_about_media_image_verifications_Q;
public ReactiveCommand<Unit, Unit> CancelCommand { get; }
public ReactiveCommand<Unit, Unit> SaveCommand { get; }

View File

@@ -37,6 +37,7 @@ using Aaru.Database;
using Aaru.Database.Models;
using Aaru.Gui.Models;
using Aaru.Gui.Views.Dialogs;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
using NameCountModel = Aaru.Gui.Models.NameCountModel;
@@ -135,7 +136,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "fs-info" && !c.Synchronized);
FsInfoVisible = true;
FsInfoText = $"You have called the Filesystem Info command {count} times";
FsInfoText = string.Format(UI.You_have_called_the_Filesystem_Info_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "checksum"))
@@ -146,7 +147,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "checksum" && !c.Synchronized);
ChecksumVisible = true;
ChecksumText = $"You have called the Checksum command {count} times";
ChecksumText = string.Format(UI.You_have_called_the_Checksum_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "compare"))
@@ -157,7 +158,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "compare" && !c.Synchronized);
CompareVisible = true;
CompareText = $"You have called the Compare command {count} times";
CompareText = string.Format(UI.You_have_called_the_Compare_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "convert-image"))
@@ -168,7 +169,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "convert-image" && !c.Synchronized);
ConvertImageVisible = true;
ConvertImageText = $"You have called the Convert-Image command {count} times";
ConvertImageText = string.Format(UI.You_have_called_the_Convert_Image_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "create-sidecar"))
@@ -179,7 +180,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "create-sidecar" && !c.Synchronized);
CreateSidecarVisible = true;
CreateSidecarText = $"You have called the Create-Sidecar command {count} times";
CreateSidecarText = string.Format(UI.You_have_called_the_Create_Sidecar_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "decode"))
@@ -190,7 +191,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "decode" && !c.Synchronized);
DecodeVisible = true;
DecodeText = $"You have called the Decode command {count} times";
DecodeText = string.Format(UI.You_have_called_the_Decode_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "device-info"))
@@ -201,7 +202,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "device-info" && !c.Synchronized);
DeviceInfoVisible = true;
DeviceInfoText = $"You have called the Device-Info command {count} times";
DeviceInfoText = string.Format(UI.You_have_called_the_Device_Info_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "device-report"))
@@ -212,7 +213,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "device-report" && !c.Synchronized);
DeviceReportVisible = true;
DeviceReportText = $"You have called the Device-Report command {count} times";
DeviceReportText = string.Format(UI.You_have_called_the_Device_Report_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "dump-media"))
@@ -223,7 +224,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "dump-media" && !c.Synchronized);
DumpMediaVisible = true;
DumpMediaText = $"You have called the Dump-Media command {count} times";
DumpMediaText = string.Format(UI.You_have_called_the_Dump_Media_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "entropy"))
@@ -234,7 +235,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "entropy" && !c.Synchronized);
EntropyVisible = true;
EntropyText = $"You have called the Entropy command {count} times";
EntropyText = string.Format(UI.You_have_called_the_Entropy_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "formats"))
@@ -245,7 +246,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "formats" && !c.Synchronized);
FormatsCommandVisible = true;
FormatsCommandText = $"You have called the Formats command {count} times";
FormatsCommandText = string.Format(UI.You_have_called_the_Formats_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "image-info"))
@@ -256,7 +257,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "image-info" && !c.Synchronized);
ImageInfoVisible = true;
ImageInfoText = $"You have called the Image-Info command {count} times";
ImageInfoText = string.Format(UI.You_have_called_the_Image_Info_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "media-info"))
@@ -267,7 +268,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "media-info" && !c.Synchronized);
MediaInfoVisible = true;
MediaInfoText = $"You have called the Media-Info command {count} times";
MediaInfoText = string.Format(UI.You_have_called_the_Media_Info_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "media-scan"))
@@ -278,7 +279,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "media-scan" && !c.Synchronized);
MediaScanVisible = true;
MediaScanText = $"You have called the Media-Scan command {count} times";
MediaScanText = string.Format(UI.You_have_called_the_Media_Scan_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "printhex"))
@@ -289,7 +290,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "printhex" && !c.Synchronized);
PrintHexVisible = true;
PrintHexText = $"You have called the Print-Hex command {count} times";
PrintHexText = string.Format(UI.You_have_called_the_Print_Hex_command_0_times, count);
}
if(ctx.Commands.Any(c => c.Name == "verify"))
@@ -300,7 +301,7 @@ public sealed class StatisticsViewModel : ViewModelBase
count += (ulong)ctx.Commands.LongCount(c => c.Name == "verify" && !c.Synchronized);
VerifyVisible = true;
VerifyText = $"You have called the Verify command {count} times";
VerifyText = string.Format(UI.You_have_called_the_Verify_command_0_times, count);
}
CommandsVisible = FsInfoVisible || ChecksumVisible || CompareVisible || ConvertImageVisible ||
@@ -417,7 +418,7 @@ public sealed class StatisticsViewModel : ViewModelBase
{
Name = media,
Count = count,
Type = "real"
Type = UI.Media_found_type_real
});
count = ctx.Medias.Where(c => c.Type == media && c.Synchronized && !c.Real).Select(c => c.Count).
@@ -432,7 +433,7 @@ public sealed class StatisticsViewModel : ViewModelBase
{
Name = media,
Count = count,
Type = "image"
Type = UI.Media_found_type_image
});
}
}
@@ -672,45 +673,45 @@ public sealed class StatisticsViewModel : ViewModelBase
}
[NotNull]
public string CommandsLabel => "Commands";
public string CommandsLabel => UI.Title_Commands;
[NotNull]
public string FilterLabel => "Filter";
public string FilterLabel => UI.Title_Filter;
[NotNull]
public string PartitionLabel => "Partition";
public string PartitionLabel => UI.Title_Partition;
[NotNull]
public string PartitionsLabel => "Partitions";
public string PartitionsLabel => UI.Title_Partitions;
[NotNull]
public string FiltersLabel => "Filters";
public string FiltersLabel => UI.Title_Filters;
[NotNull]
public string FormatsLabel => "Formats";
public string FormatsLabel => UI.Title_Formats;
[NotNull]
public string FormatLabel => "Format";
public string FormatLabel => UI.Title_Format;
[NotNull]
public string FilesystemsLabel => "Filesystems";
public string FilesystemsLabel => UI.Title_Filesystems;
[NotNull]
public string FilesystemLabel => "Filesystem";
public string FilesystemLabel => UI.Title_Filesystem;
[NotNull]
public string TimesFoundLabel => "Times found";
public string TimesFoundLabel => UI.Title_Times_used;
[NotNull]
public string DevicesLabel => "Devices";
public string DevicesLabel => UI.Title_Devices;
[NotNull]
public string DeviceLabel => "Device";
public string DeviceLabel => UI.Title_Device;
[NotNull]
public string ManufacturerLabel => "Manufacturer";
public string ManufacturerLabel => UI.Title_Manufacturer;
[NotNull]
public string RevisionLabel => "Revision";
public string RevisionLabel => UI.Title_Revision;
[NotNull]
public string BusLabel => "Bus";
public string BusLabel => UI.Title_Bus;
[NotNull]
public string MediasLabel => "Medias";
public string MediasLabel => UI.Title_Medias;
[NotNull]
public string MediaLabel => "Media";
public string MediaLabel => UI.Title_Media;
[NotNull]
public string TypeLabel => "Type";
public string TypeLabel => UI.Title_Type_for_media;
[NotNull]
public string Title => "Encodings";
public string Title => UI.Encodings;
[NotNull]
public string CloseLabel => "Close";
public string CloseLabel => UI.ButtonLabel_Close;
public ReactiveCommand<Unit, Unit> CloseCommand { get; }
public ObservableCollection<NameCountModel> Filters { get; }

View File

@@ -39,6 +39,7 @@ using Aaru.Decoders.SCSI.SSC;
using Aaru.Devices;
using Aaru.Gui.ViewModels.Tabs;
using Aaru.Gui.Views.Tabs;
using Aaru.Localization;
using Avalonia.Controls;
using ReactiveUI;
using DeviceInfo = Aaru.Core.Devices.Info.DeviceInfo;
@@ -234,26 +235,28 @@ public sealed class DeviceInfoViewModel : ViewModelBase
{
PlextorPoweRecRecommendedVisible = true;
PlextorPoweRecRecommended = $"{devInfo.PlextorFeatures.PoweRecRecommendedSpeed} Kb/sec.";
PlextorPoweRecRecommended =
string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecRecommendedSpeed);
}
if(devInfo.PlextorFeatures.PoweRecSelected > 0)
{
PlextorPoweRecSelectedVisible = true;
PlextorPoweRecSelected = $"{devInfo.PlextorFeatures.PoweRecSelected} Kb/sec.";
PlextorPoweRecSelected =
string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecSelected);
}
if(devInfo.PlextorFeatures.PoweRecMax > 0)
{
PlextorPoweRecMaxVisible = true;
PlextorPoweRecMax = $"{devInfo.PlextorFeatures.PoweRecMax} Kb/sec.";
PlextorPoweRecMax = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecMax);
}
if(devInfo.PlextorFeatures.PoweRecLast > 0)
{
PlextorPoweRecLastVisible = true;
PlextorPoweRecLast = $"{devInfo.PlextorFeatures.PoweRecLast} Kb/sec.";
PlextorPoweRecLast = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecLast);
}
}
}
@@ -267,15 +270,16 @@ public sealed class DeviceInfoViewModel : ViewModelBase
if(devInfo.PlextorFeatures.SilentModeEnabled)
{
PlextorSilentModeAccessTime = devInfo.PlextorFeatures.AccessTimeLimit == 2
? "\tAccess time is slow" : "\tAccess time is fast";
? Localization.Core.Access_time_is_slow
: Localization.Core.Access_time_is_fast;
PlextorSilentModeCdReadSpeedLimit =
devInfo.PlextorFeatures.CdReadSpeedLimit > 0
? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : "unlimited";
? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : UI.unlimited_as_in_speed;
PlextorSilentModeCdWriteSpeedLimit =
devInfo.PlextorFeatures.CdWriteSpeedLimit > 0
? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : "unlimited";
? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : UI.unlimited_as_in_speed;
if(devInfo.PlextorFeatures.IsDvd)
{
@@ -283,7 +287,7 @@ public sealed class DeviceInfoViewModel : ViewModelBase
PlextorSilentModeDvdReadSpeedLimit =
devInfo.PlextorFeatures.DvdReadSpeedLimit > 0
? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x" : "unlimited";
? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x" : UI.unlimited_as_in_speed;
}
}
}
@@ -340,18 +344,23 @@ public sealed class DeviceInfoViewModel : ViewModelBase
Ssc = true;
if(blockLimits.Value.minBlockLen == blockLimits.Value.maxBlockLen)
MinBlockSize = $"Device's block size is fixed at {blockLimits.Value.minBlockLen} bytes";
MinBlockSize = string.Format(Localization.Core.Device_block_size_is_fixed_at_0_bytes,
blockLimits.Value.minBlockLen);
else
{
MaxBlockSize = blockLimits.Value.maxBlockLen > 0
? $"Device's maximum block size is {blockLimits.Value.maxBlockLen} bytes"
: "Device does not specify a maximum block size";
? string.Format(Localization.Core.Device_maximum_block_size_is_0_bytes,
blockLimits.Value.maxBlockLen) : Localization.Core.
Device_does_not_specify_a_maximum_block_size;
MinBlockSize = $"Device's minimum block size is {blockLimits.Value.minBlockLen} bytes";
MinBlockSize = string.Format(Localization.Core.Device_minimum_block_size_is_0_bytes,
blockLimits.Value.minBlockLen);
if(blockLimits.Value.granularity > 0)
BlockSizeGranularity = $"Device's needs a block size granularity of 2^{
blockLimits.Value.granularity} ({Math.Pow(2, blockLimits.Value.granularity)}) bytes";
BlockSizeGranularity =
string.Format(Localization.Core.Device_needs_a_block_size_granularity_of_pow_0_1_bytes,
blockLimits.Value.granularity,
Math.Pow(2, blockLimits.Value.granularity));
}
}
}
@@ -912,75 +921,75 @@ public sealed class DeviceInfoViewModel : ViewModelBase
set => this.RaiseAndSetIfChanged(ref _sdMmcInfo, value);
}
public string DeviceInformationLabel => "Device information";
public string GeneralLabel => "General";
public string DeviceTypeLabel => "Device type";
public string ManufacturerLabel => "Manufacturer";
public string ModelLabel => "Model";
public string RevisionLabel => "Revision";
public string SerialNumberLabel => "Serial number";
public string ScsiTypeLabel => "Peripheral device type";
public string RemovableMediaLabel => "Removable media";
public string UsbConnectedLabel => "Connected by USB";
public string USBLabel => "USB";
public string VendorIDLabel => "Vendor ID";
public string ProductIDLabel => "Product ID";
public string ProductLabel => "Product";
public string SaveUsbDescriptorsLabel => "Save descriptors to file";
public string FireWireLabel => "FireWire";
public string ModelIDLabel => "Model ID";
public string GUIDLabel => "GUID";
public string PlextorLabel => "Plextor";
public string PlextorDiscsLabel => "Total loaded discs:";
public string PlextorCdReadTimeLabel => "Time spent reading CDs";
public string PlextorCdWriteTimeLabel => "Time spent writing CDs";
public string PlextorDvdReadTimeLabel => "Time spent reading DVDs";
public string PlextorDvdWriteTimeLabel => "Time spent writing DVDs";
public string PlextorPoweRecLabel => "Supports PoweRec";
public string PlextorPoweRecEnabledLabel => "PoweRec is enabled";
public string PlextorPoweRecRecommendedLabel => "Recommended speed";
public string PlextorPoweRecSelectedLabel => "Selected PoweRec speed for currently inserted media:";
public string PlextorPoweRecMaxLabel => "Maximum PoweRec speed for currently inserted media:";
public string PlextorPoweRecLastLabel => "Last PoweRec used speed";
public string PlextorSilentModeLabel => "Supports SilentMode";
public string PlextorSilentModeEnabledLabel => "SilentMode is enabled";
public string PlextorSilentModeCdReadSpeedLimitLabel => "CD read speed limited to";
public string PlextorSilentModeCdWriteSpeedLimitLabel => "CD write speed limited to";
public string PlextorSilentModeDvdReadSpeedLimitLabel => "DVD read speed limited to";
public string PlextorGigaRecLabel => "Supports GigaRec";
public string PlextorSecuRecLabel => "Supports SecuRec";
public string PlextorSpeedReadLabel => "Supports SpeedRead";
public string PlextorSpeedEnabledLabel => "SpeedRead is enabled";
public string PlextorHidingLabel => "Supports hiding CD-Rs and sessions";
public string PlextorHidesRecordablesLabel => "Is hiding CD-Rs";
public string PlextorHidesSessionsLabel => "Is forcing only first session";
public string PlextorVariRecLabel => "Supports VariRec";
public string PlextorVariRecDvdLabel => "Supports VariRec on DVDs";
public string PlextorBitSettingLabel => "Supports bitsetting DVD+R book type";
public string PlextorBitSettingDlLabel => "Supports bitsetting DVD+R DL book type";
public string PlextorDvdPlusWriteTestLabel => "Supports test writing DVD+";
public string KreonLabel => "Kreon";
public string KreonChallengeResponseLabel => "Can do challenge/response with Xbox discs";
public string KreonDecryptSsLabel => "Can read and decrypt SS from Xbox discs";
public string KreonXtremeUnlockLabel => "Can set xtreme unlock state with Xbox discs";
public string KreonWxripperUnlockLabel => "Can set wxripper unlock state with Xbox discs";
public string KreonChallengeResponse360Label => "Can do challenge/response with Xbox 360 discs";
public string KreonDecryptSs360Label => "Can read and decrypt SS from Xbox 360 discs";
public string KreonXtremeUnlock360Label => "Can set xtreme unlock state with Xbox 360 discs";
public string KreonWxripperUnlock360Label => "Can set wxripper unlock state with Xbox 360 discs";
public string KreonSetLockedLabel => "Can set locked state";
public string KreonErrorSkippingLabel => "Can skip read errors";
public string DensitiesSupportedByDeviceLabel => "Densities supported by device:";
public string MediumTypesSupportedByDeviceLabel => "Medium types supported by device:";
public string CIDLabel => "CID";
public string CSDLabel => "CSD";
public string OCRLabel => "OCR";
public string ExtendedCSDLabel => "Extended CSD";
public string SCRLabel => "SCR";
public string PCMCIALabel => "PCMCIA";
public string ATA_ATAPILabel => "ATA/ATAPI";
public string SCSILabel => "SCSI";
public string SD_MMCLabel => "SD/MMC";
public string DeviceInformationLabel => UI.Title_Device_information;
public string GeneralLabel => UI.Title_General;
public string DeviceTypeLabel => UI.Title_Device_type;
public string ManufacturerLabel => UI.Title_Manufacturer;
public string ModelLabel => UI.Title_Model;
public string RevisionLabel => UI.Title_Revision;
public string SerialNumberLabel => UI.Title_Serial_number;
public string ScsiTypeLabel => UI.Title_Peripheral_device_type;
public string RemovableMediaLabel => UI.Title_Removable_media;
public string UsbConnectedLabel => UI.Title_Connected_by_USB;
public string USBLabel => UI.Title_USB;
public string VendorIDLabel => UI.Title_Vendor_ID;
public string ProductIDLabel => UI.Title_Product_ID;
public string ProductLabel => UI.Title_Product;
public string SaveUsbDescriptorsLabel => UI.Save_descriptors_to_file;
public string FireWireLabel => UI.Title_FireWire;
public string ModelIDLabel => UI.Title_Model_ID;
public string GUIDLabel => UI.Title_GUID;
public string PlextorLabel => UI.Title_Plextor;
public string PlextorDiscsLabel => UI.Total_loaded_discs;
public string PlextorCdReadTimeLabel => UI.Time_spent_reading_CDs;
public string PlextorCdWriteTimeLabel => UI.Time_spent_writing_CDs;
public string PlextorDvdReadTimeLabel => UI.Time_spent_reading_DVDs;
public string PlextorDvdWriteTimeLabel => UI.Time_spent_writing_DVDs;
public string PlextorPoweRecLabel => UI.Supports_PoweRec;
public string PlextorPoweRecEnabledLabel => UI.PoweRec_is_enabled;
public string PlextorPoweRecRecommendedLabel => UI.Recommended_speed;
public string PlextorPoweRecSelectedLabel => UI.Selected_PoweRec_speed_for_currently_inserted_media;
public string PlextorPoweRecMaxLabel => UI.Maximum_PoweRec_speed_for_currently_inserted_media;
public string PlextorPoweRecLastLabel => UI.Last_PoweRec_used_speed;
public string PlextorSilentModeLabel => UI.Supports_SilentMode;
public string PlextorSilentModeEnabledLabel => UI.SilentMode_is_enabled;
public string PlextorSilentModeCdReadSpeedLimitLabel => UI.CD_read_speed_limited_to;
public string PlextorSilentModeCdWriteSpeedLimitLabel => UI.CD_write_speed_limited_to;
public string PlextorSilentModeDvdReadSpeedLimitLabel => UI.DVD_read_speed_limited_to;
public string PlextorGigaRecLabel => UI.Supports_GigaRec;
public string PlextorSecuRecLabel => UI.Supports_SecuRec;
public string PlextorSpeedReadLabel => UI.Supports_SpeedRead;
public string PlextorSpeedEnabledLabel => UI.SpeedRead_is_enabled;
public string PlextorHidingLabel => UI.Supports_hiding_CD_Rs_and_sessions;
public string PlextorHidesRecordablesLabel => UI.Is_hiding_CD_Rs;
public string PlextorHidesSessionsLabel => UI.Is_forcing_only_first_session;
public string PlextorVariRecLabel => UI.Supports_VariRec;
public string PlextorVariRecDvdLabel => UI.Supports_VariRec_on_DVDs;
public string PlextorBitSettingLabel => UI.Supports_bitsetting_DVD_R_book_type;
public string PlextorBitSettingDlLabel => UI.Supports_bitsetting_DVD_R_DL_book_type;
public string PlextorDvdPlusWriteTestLabel => UI.Supports_test_writing_DVD_Plus;
public string KreonLabel => UI.Title_Kreon;
public string KreonChallengeResponseLabel => Localization.Core.Can_do_challenge_response_with_Xbox_discs;
public string KreonDecryptSsLabel => Localization.Core.Can_read_and_decrypt_SS_from_Xbox_discs;
public string KreonXtremeUnlockLabel => Localization.Core.Can_set_xtreme_unlock_state_with_Xbox_discs;
public string KreonWxripperUnlockLabel => Localization.Core.Can_set_wxripper_unlock_state_with_Xbox_discs;
public string KreonChallengeResponse360Label => Localization.Core.Can_do_challenge_response_with_Xbox_360_discs;
public string KreonDecryptSs360Label => Localization.Core.Can_read_and_decrypt_SS_from_Xbox_360_discs;
public string KreonXtremeUnlock360Label => Localization.Core.Can_set_xtreme_unlock_state_with_Xbox_360_discs;
public string KreonWxripperUnlock360Label => Localization.Core.Can_set_wxripper_unlock_state_with_Xbox_360_discs;
public string KreonSetLockedLabel => Localization.Core.Can_set_Kreon_locked_state;
public string KreonErrorSkippingLabel => Localization.Core.Kreon_Can_skip_read_errors;
public string DensitiesSupportedByDeviceLabel => UI.Densities_supported_by_device;
public string MediumTypesSupportedByDeviceLabel => UI.Medium_types_supported_by_device;
public string CIDLabel => UI.Title_CID;
public string CSDLabel => UI.Title_CSD;
public string OCRLabel => UI.Title_OCR;
public string ExtendedCSDLabel => UI.Title_Extended_CSD;
public string SCRLabel => UI.Title_SCR;
public string PCMCIALabel => UI.Title_PCMCIA;
public string ATA_ATAPILabel => UI.Title_ATA_ATAPI;
public string SCSILabel => UI.Title_SCSI;
public string SD_MMCLabel => UI.Title_SD_MMC;
async Task ExecuteSaveUsbDescriptorsCommand()
{
@@ -992,7 +1001,7 @@ public sealed class DeviceInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -30,6 +30,7 @@
// Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/
using Aaru.Localization;
using JetBrains.Annotations;
using Schemas;
@@ -39,27 +40,38 @@ public sealed class FileSystemViewModel
{
public FileSystemViewModel([NotNull] FileSystemType xmlFsType, string information)
{
TypeText = $"Filesystem type: {xmlFsType.Type}";
VolumeNameText = $"Volume name: {xmlFsType.VolumeName}";
SerialNumberText = $"Serial number: {xmlFsType.VolumeSerial}";
ApplicationIdentifierText = $"Application identifier: {xmlFsType.ApplicationIdentifier}";
SystemIdentifierText = $"System identifier: {xmlFsType.SystemIdentifier}";
VolumeSetIdentifierText = $"Volume set identifier: {xmlFsType.VolumeSetIdentifier}";
DataPreparerIdentifierText = $"Data preparer identifier: {xmlFsType.DataPreparerIdentifier}";
PublisherIdentifierText = $"Publisher identifier: {xmlFsType.PublisherIdentifier}";
CreationDateText = $"Volume created on {xmlFsType.CreationDate:F}";
EffectiveDateText = $"Volume effective from {xmlFsType.EffectiveDate:F}";
ModificationDateText = $"Volume last modified on {xmlFsType.ModificationDate:F}";
ExpirationDateText = $"Volume expired on {xmlFsType.ExpirationDate:F}";
BackupDateText = $"Volume last backed up on {xmlFsType.BackupDate:F}";
TypeText = string.Format(Localization.Core.Filesystem_type_0, xmlFsType.Type);
VolumeNameText = string.Format(Localization.Core.Volume_name_0, xmlFsType.VolumeName);
SerialNumberText = string.Format(Localization.Core.Volume_serial_0, xmlFsType.VolumeSerial);
ClustersText = $"Volume has {xmlFsType.Clusters} clusters of {xmlFsType.ClusterSize} bytes each (total of {
xmlFsType.Clusters * xmlFsType.ClusterSize} bytes)";
ApplicationIdentifierText =
string.Format(Localization.Core.Application_identifier_0, xmlFsType.ApplicationIdentifier);
FreeClustersText = $"Volume has {xmlFsType.FreeClusters} clusters free ({
xmlFsType.FreeClusters / xmlFsType.Clusters:P})";
SystemIdentifierText = string.Format(Localization.Core.System_identifier_0, xmlFsType.SystemIdentifier);
FilesText = $"Volume contains {xmlFsType.Files} files";
VolumeSetIdentifierText =
string.Format(Localization.Core.Volume_set_identifier_0, xmlFsType.VolumeSetIdentifier);
DataPreparerIdentifierText =
string.Format(Localization.Core.Data_preparer_identifier_0, xmlFsType.DataPreparerIdentifier);
PublisherIdentifierText =
string.Format(Localization.Core.Publisher_identifier_0, xmlFsType.PublisherIdentifier);
CreationDateText = string.Format(Localization.Core.Volume_created_on_0, xmlFsType.CreationDate);
EffectiveDateText = string.Format(Localization.Core.Volume_effective_from_0, xmlFsType.EffectiveDate);
ModificationDateText = string.Format(Localization.Core.Volume_last_modified_on_0, xmlFsType.ModificationDate);
ExpirationDateText = string.Format(Localization.Core.Volume_expired_on_0, xmlFsType.ExpirationDate);
BackupDateText = string.Format(Localization.Core.Volume_last_backed_up_on_0, xmlFsType.BackupDate);
ClustersText = string.Format(Localization.Core.Volume_has_0_clusters_of_1_bytes_each_total_of_2_bytes,
xmlFsType.Clusters, xmlFsType.ClusterSize,
xmlFsType.Clusters * xmlFsType.ClusterSize);
FreeClustersText = string.Format(Localization.Core.Volume_has_0_clusters_free_1, xmlFsType.FreeClusters,
xmlFsType.FreeClusters / xmlFsType.Clusters);
FilesText = string.Format(Localization.Core.Volume_contains_0_files, xmlFsType.Files);
BootableChecked = xmlFsType.Bootable;
DirtyChecked = xmlFsType.Dirty;
InformationText = information;
@@ -73,9 +85,9 @@ public sealed class FileSystemViewModel
FilesVisible = xmlFsType.FilesSpecified;
}
public string BootableLabel => "Filesystem contains boot code";
public string DirtyLabel => "Filesystem has not been unmounted correctly or contains errors";
public string DetailsLabel => "Details";
public string BootableLabel => Localization.Core.Filesystem_contains_boot_code;
public string DirtyLabel => Localization.Core.Filesystem_has_not_been_unmounted_correctly_or_contains_errors;
public string DetailsLabel => UI.Title_Details;
public string TypeText { get; }
public string VolumeNameText { get; }

View File

@@ -49,6 +49,7 @@ using Aaru.Gui.ViewModels.Windows;
using Aaru.Gui.Views.Tabs;
using Aaru.Gui.Views.Windows;
using Aaru.Helpers;
using Aaru.Localization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media.Imaging;
@@ -112,82 +113,89 @@ public sealed class ImageInfoViewModel : ViewModelBase
? genericOpticalIcon
: genericFolderIcon;
ImagePathText = $"Path: {imagePath}";
FilterText = $"Filter: {filter.Name}";
ImageIdentifiedText = $"Image format identified by {imageFormat.Name} ({imageFormat.Id}).";
ImagePathText = string.Format(UI.Path_0, imagePath);
FilterText = string.Format(UI.Filter_0, filter.Name);
ImageIdentifiedText = string.Format(UI.Image_format_identified_by_0_1, imageFormat.Name, imageFormat.Id);
ImageFormatText = !string.IsNullOrWhiteSpace(imageFormat.Info.Version)
? $"Format: {imageFormat.Format} version {imageFormat.Info.Version}"
: $"Format: {imageFormat.Format}";
? string.Format(UI.Format_0_version_1, imageFormat.Format, imageFormat.Info.Version)
: string.Format(UI.Format_0, imageFormat.Format);
ImageSizeText = $"Image without headers is {imageFormat.Info.ImageSize} bytes long";
ImageSizeText = string.Format(Localization.Core.Image_without_headers_is_0_bytes_long,
imageFormat.Info.ImageSize);
SectorsText = $"Contains a media of {imageFormat.Info.Sectors} sectors with a maximum sector size of {
imageFormat.Info.SectorSize} bytes (if all sectors are of the same size this would be {
imageFormat.Info.Sectors * imageFormat.Info.SectorSize} bytes)";
SectorsText =
string.Format(Localization.Core.Contains_a_media_of_0_sectors_with_a_maximum_sector_size_of_1_bytes_etc,
imageFormat.Info.Sectors, imageFormat.Info.SectorSize,
imageFormat.Info.Sectors * imageFormat.Info.SectorSize);
MediaTypeText = $"Contains a media of type {imageFormat.Info.MediaType} and XML type {
imageFormat.Info.XmlMediaType}";
MediaTypeText = string.Format(Localization.Core.Contains_a_media_of_type_0_and_XML_type_1,
imageFormat.Info.MediaType, imageFormat.Info.XmlMediaType);
HasPartitionsText = $"{(imageFormat.Info.HasPartitions ? "Has" : "Doesn't have")} partitions";
HasSessionsText = $"{(imageFormat.Info.HasSessions ? "Has" : "Doesn't have")} sessions";
HasPartitionsText = imageFormat.Info.HasPartitions ? UI.Has_partitions : UI.Doesnt_have_partitions;
HasSessionsText = imageFormat.Info.HasSessions ? UI.Has_sessions : UI.Doesnt_have_sessions;
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application))
ApplicationText = !string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion)
? $"Was created with {imageFormat.Info.Application} version {
imageFormat.Info.ApplicationVersion}"
: $"Was created with {imageFormat.Info.Application}";
? string.Format(Localization.Core.Was_created_with_0_version_1,
imageFormat.Info.Application, imageFormat.Info.ApplicationVersion)
: string.Format(Localization.Core.Was_created_with_0, imageFormat.Info.Application);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Creator))
CreatorText = $"Created by: {imageFormat.Info.Creator}";
CreatorText = string.Format(Localization.Core.Created_by_0, imageFormat.Info.Creator);
if(imageFormat.Info.CreationTime != DateTime.MinValue)
CreationTimeText = $"Created on {imageFormat.Info.CreationTime}";
CreationTimeText = string.Format(Localization.Core.Created_on_0, imageFormat.Info.CreationTime);
if(imageFormat.Info.LastModificationTime != DateTime.MinValue)
LastModificationTimeText = $"Last modified on {imageFormat.Info.LastModificationTime}";
LastModificationTimeText =
string.Format(Localization.Core.Last_modified_on_0, imageFormat.Info.LastModificationTime);
if(imageFormat.Info.MediaSequence != 0 &&
imageFormat.Info.LastMediaSequence != 0)
MediaSequenceText = $"Media is number {imageFormat.Info.MediaSequence} on a set of {
imageFormat.Info.LastMediaSequence} medias";
MediaSequenceText = string.Format(Localization.Core.Media_is_number_0_on_a_set_of_1_medias,
imageFormat.Info.MediaSequence, imageFormat.Info.LastMediaSequence);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle))
MediaTitleText = $"Media title: {imageFormat.Info.MediaTitle}";
MediaTitleText = string.Format(UI.Media_title_0, imageFormat.Info.MediaTitle);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer))
MediaManufacturerText = $"Media manufacturer: {imageFormat.Info.MediaManufacturer}";
MediaManufacturerText =
string.Format(Localization.Core.Media_manufacturer_0, imageFormat.Info.MediaManufacturer);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel))
MediaModelText = $"Media model: {imageFormat.Info.MediaModel}";
MediaModelText = string.Format(UI.Media_model_0, imageFormat.Info.MediaModel);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber))
MediaSerialNumberText = $"Media serial number: {imageFormat.Info.MediaSerialNumber}";
MediaSerialNumberText =
string.Format(Localization.Core.Media_serial_number_0, imageFormat.Info.MediaSerialNumber);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode))
MediaBarcodeText = $"Media barcode: {imageFormat.Info.MediaBarcode}";
MediaBarcodeText = string.Format(UI.Media_barcode_0, imageFormat.Info.MediaBarcode);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber))
MediaPartNumberText = $"Media part number: {imageFormat.Info.MediaPartNumber}";
MediaPartNumberText = string.Format(UI.Media_part_number_0, imageFormat.Info.MediaPartNumber);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer))
DriveManufacturerText = $"Drive manufacturer: {imageFormat.Info.DriveManufacturer}";
DriveManufacturerText = string.Format(UI.Drive_manufacturer_0, imageFormat.Info.DriveManufacturer);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel))
DriveModelText = $"Drive model: {imageFormat.Info.DriveModel}";
DriveModelText = string.Format(UI.Drive_model_0, imageFormat.Info.DriveModel);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber))
DriveSerialNumberText = $"Drive serial number: {imageFormat.Info.DriveSerialNumber}";
DriveSerialNumberText =
string.Format(Localization.Core.Drive_serial_number_0, imageFormat.Info.DriveSerialNumber);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision))
DriveFirmwareRevisionText = $"Drive firmware info: {imageFormat.Info.DriveFirmwareRevision}";
DriveFirmwareRevisionText = string.Format(UI.Drive_firmware_info_0, imageFormat.Info.DriveFirmwareRevision);
if(imageFormat.Info.Cylinders > 0 &&
imageFormat.Info is { Heads: > 0, SectorsPerTrack: > 0 } &&
imageFormat.Info.XmlMediaType != XmlMediaType.OpticalDisc &&
imageFormat is not ITapeImage { IsTape: true })
MediaGeometryText = $"Media geometry: {imageFormat.Info.Cylinders} cylinders, {imageFormat.Info.Heads
} heads, {imageFormat.Info.SectorsPerTrack} sectors per track";
MediaGeometryText = string.Format(UI.Media_geometry_0_cylinders_1_heads_2_sectors_per_track,
imageFormat.Info.Cylinders, imageFormat.Info.Heads,
imageFormat.Info.SectorsPerTrack);
if(imageFormat.Info.ReadableMediaTags is { Count: > 0 })
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.OrderBy(t => t))
@@ -720,51 +728,51 @@ public sealed class ImageInfoViewModel : ViewModelBase
MediaSerialNumberText != null || MediaBarcodeText != null ||
MediaPartNumberText != null;
public string ImageInformationLabel => "Image information";
public string GeneralLabel => "General";
public string CommentsLabel => "Comments:";
public string MediaInformationLabel => "Media information";
public string DriveInformationLabel => "Drive information";
public string ReadableMediaTagsLabel => "Readable media tags";
public string TagLabel => "Readable media tags";
public string ReadableSectorTagsLabel => "Readable sector tags";
public string SessionsLabel => "Sessions";
public string SessionLabel => "Session";
public string FirstTrackLabel => "First track";
public string LastTrackLabel => "Last track";
public string StartLabel => "Start";
public string EndLabel => "End";
public string TracksLabel => "Tracks";
public string TrackLabel => "Track";
public string TypeLabel => "Type";
public string BpsLabel => "Bps";
public string RawBpsLabel => "Raw bps";
public string SubchannelLabel => "Subchannel";
public string PregapLabel => "Pregap";
public string DumpHardwareLabel => "Dump hardware";
public string ManufacturerLabel => "Manufacturer";
public string ModelLabel => "Model";
public string RevisionLabel => "Revision";
public string SerialLabel => "Serial";
public string SoftwareLabel => "Software";
public string VersionLabel => "Version";
public string OperatingSystemLabel => "Operating system";
public string SCSILabel => "SCSI";
public string ATA_ATAPILabel => "ATA / ATAPI";
public string CompactDiscLabel => "CompactDisc";
public string DVD_HD_DVDLabel => "DVD / HD DVD";
public string DVD_R_WLabel => "DVD-R(W)";
public string BluRayLabel => "Blu-ray";
public string PCMCIALabel => "PCMCIA";
public string SD_MMCLabel => "SD / MMC";
public string XboxLabel => "Xbox";
public string EntropyLabel => "Calculate entropy";
public string VerifyLabel => "Verify";
public string ChecksumLabel => "Checksum";
public string ConvertLabel => "Convert to...";
public string CreateSidecarLabel => "Create CICM XML sidecar...";
public string ViewSectorsLabel => "View sectors";
public string DecodeMediaTagLabel => "Decode media tags";
public string ImageInformationLabel => UI.Title_Image_information;
public string GeneralLabel => UI.Title_General;
public string CommentsLabel => UI.Title_Comments;
public string MediaInformationLabel => UI.Title_Media_information;
public string DriveInformationLabel => UI.Title_Drive_information;
public string ReadableMediaTagsLabel => UI.Title_Readable_media_tags;
public string TagLabel => UI.Title_Readable_media_tags;
public string ReadableSectorTagsLabel => UI.Title_Readable_sector_tags;
public string SessionsLabel => UI.Title_Sessions;
public string SessionLabel => Localization.Core.Title_Session;
public string FirstTrackLabel => Localization.Core.Title_First_track;
public string LastTrackLabel => Localization.Core.Title_Last_track;
public string StartLabel => Localization.Core.Title_Start;
public string EndLabel => Localization.Core.Title_End;
public string TracksLabel => UI.Title_Tracks;
public string TrackLabel => Localization.Core.Title_Track;
public string TypeLabel => UI.Title_Type;
public string BpsLabel => Localization.Core.Title_Bps;
public string RawBpsLabel => Localization.Core.Title_Raw_bps;
public string SubchannelLabel => Localization.Core.Title_Subchannel;
public string PregapLabel => Localization.Core.Title_Pregap;
public string DumpHardwareLabel => UI.Title_Dump_hardware;
public string ManufacturerLabel => UI.Title_Manufacturer;
public string ModelLabel => UI.Title_Model;
public string RevisionLabel => UI.Title_Revision;
public string SerialLabel => UI.Serial;
public string SoftwareLabel => UI.Title_Software;
public string VersionLabel => UI.Title_Version;
public string OperatingSystemLabel => UI.Title_Operating_system;
public string SCSILabel => UI.Title_SCSI;
public string ATA_ATAPILabel => UI.Title_ATA_ATAPI;
public string CompactDiscLabel => Localization.Core.Title_CompactDisc;
public string DVD_HD_DVDLabel => Localization.Core.Title_DVD_HD_DVD;
public string DVD_R_WLabel => Localization.Core.Title_DVD_Plus_Dash_R_W;
public string BluRayLabel => Localization.Core.Title_Blu_ray;
public string PCMCIALabel => UI.Title_PCMCIA;
public string SD_MMCLabel => UI.Title_SD_MMC;
public string XboxLabel => Localization.Core.Title_Xbox;
public string EntropyLabel => UI.ButtonLabel_Calculate_entropy;
public string VerifyLabel => UI.ButtonLabel_Verify;
public string ChecksumLabel => UI.ButtonLabel_Checksum;
public string ConvertLabel => UI.ButtonLabel_Convert_to;
public string CreateSidecarLabel => UI.ButtonLabel_Create_CICM_XML_sidecar;
public string ViewSectorsLabel => UI.ButtonLabel_View_sectors;
public string DecodeMediaTagLabel => UI.ButtonLabel_Decode_media_tags;
void ExecuteEntropyCommand()
{

View File

@@ -40,6 +40,7 @@ using Aaru.Gui.ViewModels.Tabs;
using Aaru.Gui.ViewModels.Windows;
using Aaru.Gui.Views.Tabs;
using Aaru.Gui.Views.Windows;
using Aaru.Localization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media.Imaging;
@@ -109,16 +110,17 @@ public sealed class MediaInfoViewModel : ViewModelBase
MediaSize = totalSize switch
{
> 1099511627776 => $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize
} bytes/each. (for a total of {totalSize / 1099511627776d:F3} TiB)",
> 1073741824 => $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize
} bytes/each. (for a total of {totalSize / 1073741824d:F3} GiB)",
> 1048576 => $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize} bytes/each. (for a total of {
totalSize / 1048576d:F3} MiB)",
> 1024 => $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize} bytes/each. (for a total of {
totalSize / 1024d:F3} KiB)",
_ => $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize} bytes/each. (for a total of {totalSize
} bytes)"
> 1099511627776 =>
string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2_TiB,
scsiInfo.Blocks, scsiInfo.BlockSize, totalSize / 1099511627776d),
> 1073741824 => string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2_GiB,
scsiInfo.Blocks, scsiInfo.BlockSize, totalSize / 1073741824d),
> 1048576 => string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2_MiB,
scsiInfo.Blocks, scsiInfo.BlockSize, totalSize / 1048576d),
> 1024 => string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2_KiB,
scsiInfo.Blocks, scsiInfo.BlockSize, totalSize / 1024d),
_ => string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2_bytes,
scsiInfo.Blocks, scsiInfo.BlockSize, totalSize)
};
}
@@ -344,29 +346,29 @@ public sealed class MediaInfoViewModel : ViewModelBase
set => this.RaiseAndSetIfChanged(ref _blurayInfo, value);
}
public string MediaInformationLabel => "Media information";
public string GeneralLabel => "General";
public string MediaTypeLabel => "Media type";
public string MediaSerialNumberLabel => "Media serial number";
public string SaveReadMediaSerialLabel => "Save READ MEDIA SERIAL NUMBER response";
public string SaveReadCapacityLabel => "Save READ CAPACITY response";
public string SaveReadCapacity16Label => "Save READ CAPACITY (16) response";
public string MMCLabel => "MMC";
public string SaveGetConfigurationLabel => "Save GET CONFIGURATION response";
public string SaveRecognizedFormatLayersLabel => "Save RECOGNIZED FORMAT LAYERS response";
public string SaveWriteProtectionStatusLabel => "Save WRITE PROTECTION STATUS response";
public string SSCLabel => "SSC";
public string DensitySupportLabel => "Densities supported by currently inserted media";
public string MediumSupportLabel => "Medium types currently inserted in device";
public string SaveDensitySupportLabel => "Save REPORT DENSITY SUPPORT (MEDIA) response";
public string SaveMediumSupportLabel => "Save REPORT DENSITY SUPPORT (MEDIUM & MEDIA) response";
public string CompactDiscLabel => "CompactDisc";
public string DVDLabel => "DVD";
public string DVD_R_WLabel => "DVD±R(W)";
public string XboxLabel => "Xbox";
public string BluRayLabel => "Blu-ray";
public string DumpLabel => "Dump media to image";
public string ScanLabel => "Scan media surface";
public string MediaInformationLabel => UI.Title_Media_information;
public string GeneralLabel => UI.Title_General;
public string MediaTypeLabel => UI.Title_Media_type;
public string MediaSerialNumberLabel => UI.Title_Media_serial_number;
public string SaveReadMediaSerialLabel => UI.ButtonLabel_Save_READ_MEDIA_SERIAL_NUMBER_response;
public string SaveReadCapacityLabel => UI.ButtonLabel_Save_READ_CAPACITY_response;
public string SaveReadCapacity16Label => UI.ButtonLabel_Save_READ_CAPACITY_16_response;
public string MMCLabel => Localization.Core.Title_MMC;
public string SaveGetConfigurationLabel => UI.ButtonLabel_Save_GET_CONFIGURATION_response;
public string SaveRecognizedFormatLayersLabel => UI.ButtonLabel_Save_RECOGNIZED_FORMAT_LAYERS_response;
public string SaveWriteProtectionStatusLabel => UI.ButtonLabel_Save_WRITE_PROTECTION_STATUS_response;
public string SSCLabel => Localization.Core.Title_SSC;
public string DensitySupportLabel => UI.Densities_supported_by_currently_inserted_media;
public string MediumSupportLabel => UI.Medium_types_currently_inserted_in_device;
public string SaveDensitySupportLabel => UI.ButtonLabel_Save_REPORT_DENSITY_SUPPORT_MEDIA_response;
public string SaveMediumSupportLabel => UI.ButtonLabel_Save_REPORT_DENSITY_SUPPORT_MEDIUM_MEDIA_response;
public string CompactDiscLabel => Localization.Core.Title_CompactDisc;
public string DVDLabel => Localization.Core.Title_DVD;
public string DVD_R_WLabel => Localization.Core.Title_DVD_Plus_Dash_R_W;
public string XboxLabel => Localization.Core.Title_Xbox;
public string BluRayLabel => Localization.Core.Title_Blu_ray;
public string DumpLabel => UI.ButtonLabel_Dump_media_to_image;
public string ScanLabel => UI.ButtonLabel_Scan_media_surface;
async Task SaveElement(byte[] data)
{
@@ -378,7 +380,7 @@ public sealed class MediaInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -414,15 +416,17 @@ public sealed class MediaInfoViewModel : ViewModelBase
{
case CommonTypes.MediaType.GDR or CommonTypes.MediaType.GDROM:
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "GD-ROM dump support is not yet implemented.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error,
Localization.Core.GD_ROM_dump_support_is_not_yet_implemented,
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
return;
case CommonTypes.MediaType.XGD or CommonTypes.MediaType.XGD2 or CommonTypes.MediaType.XGD3
when _scsiInfo.DeviceInfo.ScsiInquiry?.KreonPresent != true:
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "Dumping Xbox discs require a Kreon drive.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error,
Localization.Core.Dumping_Xbox_discs_require_a_Kreon_drive,
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
return;
}
@@ -443,8 +447,9 @@ public sealed class MediaInfoViewModel : ViewModelBase
case CommonTypes.MediaType.GDR:
case CommonTypes.MediaType.GDROM:
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "GD-ROM scan support is not yet implemented.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error,
Localization.Core.GD_ROM_scan_support_is_not_yet_implemented,
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
return;
@@ -453,8 +458,9 @@ public sealed class MediaInfoViewModel : ViewModelBase
case CommonTypes.MediaType.XGD2:
case CommonTypes.MediaType.XGD3:
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "Scanning Xbox discs is not yet supported.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error,
Localization.Core.Scanning_Xbox_discs_is_not_yet_supported,
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
return;
}

View File

@@ -38,11 +38,14 @@ public sealed class PartitionViewModel
{
public PartitionViewModel(Partition partition)
{
NameText = $"Partition name: {partition.Name}";
TypeText = $"Partition type: {partition.Type}";
StartText = $"Partition start: sector {partition.Start}, byte {partition.Offset}";
LengthText = $"Partition length: {partition.Length} sectors, {partition.Size} bytes";
DescriptionLabelText = "Partition description:";
NameText = string.Format(Localization.Core.Partition_name_0, partition.Name);
TypeText = string.Format(Localization.Core.Partition_type_0, partition.Type);
StartText = string.Format(Localization.Core.Partition_start_sector_0_byte_1, partition.Start, partition.Offset);
LengthText = string.Format(Localization.Core.Partition_length_0_sectors_1_bytes, partition.Length,
partition.Size);
DescriptionLabelText = Localization.Core.Title_Partition_description;
DescriptionText = partition.Description;
}

View File

@@ -43,6 +43,7 @@ using Aaru.CommonTypes.Structs;
using Aaru.Console;
using Aaru.Core;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using MessageBox.Avalonia;
@@ -69,10 +70,11 @@ public sealed class SubdirectoryViewModel
if(errno != ErrorNumber.NoError)
{
MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} trying to read \"{model.Path}\" of chosen filesystem",
ButtonEnum.Ok, Icon.Error).ShowDialog(view);
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_trying_to_read_1_of_chosen_filesystem,
errno, model.Path), ButtonEnum.Ok, Icon.Error).
ShowDialog(view);
return;
}
@@ -83,8 +85,9 @@ public sealed class SubdirectoryViewModel
if(errno != ErrorNumber.NoError)
{
AaruConsole.ErrorWriteLine($"Error {errno} trying to get information about filesystem entry named {
dirent}");
AaruConsole.
ErrorWriteLine(string.Format(UI.Error_0_trying_to_get_information_about_filesystem_entry_named_1,
errno, dirent));
continue;
}
@@ -114,20 +117,20 @@ public sealed class SubdirectoryViewModel
public List<FileModel> SelectedEntries { get; }
public ReactiveCommand<Unit, Task> ExtractFilesCommand { get; }
public string ExtractFilesLabel => "Extract to...";
public string NameLabel => "Name";
public string LengthLabel => "Length";
public string CreationLabel => "Creation";
public string LastAccessLabel => "Last access";
public string ChangedLabel => "Changed";
public string LastBackupLabel => "Last backup";
public string LastWriteLabel => "Last write";
public string AttributesLabel => "Attributes";
public string GIDLabel => "GID";
public string UIDLabel => "UID";
public string InodeLabel => "Inode";
public string LinksLabel => "Links";
public string ModeLabel => "Mode";
public string ExtractFilesLabel => UI.ButtonLabel_Extract_to;
public string NameLabel => UI.Title_Name;
public string LengthLabel => UI.Title_Length;
public string CreationLabel => UI.Title_Creation;
public string LastAccessLabel => UI.Title_Last_access;
public string ChangedLabel => UI.Title_Changed;
public string LastBackupLabel => UI.Title_Last_backup;
public string LastWriteLabel => UI.Title_Last_write;
public string AttributesLabel => UI.Title_Attributes;
public string GIDLabel => UI.Title_GID;
public string UIDLabel => UI.Title_UID;
public string InodeLabel => UI.Title_Inode;
public string LinksLabel => UI.Title_Links;
public string ModeLabel => UI.Title_Mode;
async Task ExecuteExtractFilesCommand()
{
@@ -136,7 +139,7 @@ public sealed class SubdirectoryViewModel
var saveFilesFolderDialog = new OpenFolderDialog
{
Title = "Choose destination folder..."
Title = UI.Dialog_Choose_destination_folder
};
string result = await saveFilesFolderDialog.ShowAsync(_view);
@@ -261,10 +264,13 @@ public sealed class SubdirectoryViewModel
string corrected = new(chars);
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow("Unsupported filename",
$"The file name {filename
} is not supported on this platform.\nDo you want to rename it to {corrected
}?", ButtonEnum.YesNoCancel, Icon.Warning).ShowDialog(_view);
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow(UI.Unsupported_filename,
string.
Format(UI.Filename_0_not_supported_want_to_rename_to_1,
filename,
corrected), ButtonEnum.YesNoCancel,
Icon.Warning).
ShowDialog(_view);
switch(mboxResult)
{
@@ -281,9 +287,8 @@ public sealed class SubdirectoryViewModel
if(File.Exists(outputPath))
{
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow("Existing file",
$"A file named {filename
} already exists on the destination folder.\nDo you want to overwrite it?",
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow(UI.Existing_file,
string.Format(UI.File_named_0_exists_overwrite_Q, filename),
ButtonEnum.YesNoCancel, Icon.Warning).ShowDialog(_view);
switch(mboxResult)
@@ -297,9 +302,9 @@ public sealed class SubdirectoryViewModel
}
catch(IOException)
{
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow("Cannot delete",
"Could not delete existing file.\nDo you want to continue?",
ButtonEnum.YesNo, Icon.Error).ShowDialog(_view);
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow(UI.Cannot_delete,
UI.Could_note_delete_existe_file_continue_Q, ButtonEnum.YesNo,
Icon.Error).ShowDialog(_view);
if(mboxResult == ButtonResult.No)
return;
@@ -317,8 +322,8 @@ public sealed class SubdirectoryViewModel
if(error != ErrorNumber.NoError)
{
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow("Error reading file",
$"Error {error} reading file.\nDo you want to continue?", ButtonEnum.YesNo,
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow(UI.Error_reading_file,
string.Format(UI.Error_0_reading_file_continue_Q, error), ButtonEnum.YesNo,
Icon.Error).ShowDialog(_view);
if(mboxResult == ButtonResult.No)
@@ -366,9 +371,10 @@ public sealed class SubdirectoryViewModel
}
catch(IOException)
{
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow("Cannot create file",
"Could not create destination file.\nDo you want to continue?", ButtonEnum.YesNo,
Icon.Error).ShowDialog(_view);
mboxResult = await MessageBoxManager.GetMessageBoxStandardWindow(UI.Cannot_create_file,
UI.Could_not_create_destination_file_continue_Q,
ButtonEnum.YesNo, Icon.Error).
ShowDialog(_view);
if(mboxResult == ButtonResult.No)
return;

View File

@@ -35,6 +35,7 @@ using System.IO;
using System.Reactive;
using System.Threading.Tasks;
using Aaru.Decoders.ATA;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using ReactiveUI;
@@ -71,12 +72,13 @@ public sealed class AtaInfoViewModel : ViewModelBase
{
AtaMcptText = (ataMcptError.Value.DeviceHead & 0x7) switch
{
0 => "Device reports incorrect media card type",
1 => "Device contains a Secure Digital card",
2 => "Device contains a MultiMediaCard ",
3 => "Device contains a Secure Digital I/O card",
4 => "Device contains a Smart Media card",
_ => $"Device contains unknown media card type {ataMcptError.Value.DeviceHead & 0x07}"
0 => Localization.Core.Device_reports_incorrect_media_card_type,
1 => Localization.Core.Device_contains_SD_card,
2 => Localization.Core.Device_contains_MMC,
3 => Localization.Core.Device_contains_SDIO_card,
4 => Localization.Core.Device_contains_SM_card,
_ => string.Format(Localization.Core.Device_contains_unknown_media_card_type_0,
ataMcptError.Value.DeviceHead & 0x07)
};
AtaMcptWriteProtectionChecked = (ataMcptError.Value.DeviceHead & 0x08) == 0x08;
@@ -84,7 +86,7 @@ public sealed class AtaInfoViewModel : ViewModelBase
ushort specificData =
(ushort)((ataMcptError.Value.CylinderHigh * 0x100) + ataMcptError.Value.CylinderLow);
AtaMcptSpecificDataText = $"Card specific data: 0x{specificData:X4}";
AtaMcptSpecificDataText = string.Format(Localization.Core.Card_specific_data_0, specificData);
}
AtaIdentifyText = Identify.Prettify(_ata);
@@ -107,10 +109,10 @@ public sealed class AtaInfoViewModel : ViewModelBase
public string AtaOrAtapiText { get; }
public string AtaMcptLabel => "Device is Media Card Pass Through";
public string AtaMcptWriteProtectionLabel => "Media card is write protected";
public string SaveAtaBinaryLabel => "Save binary to file";
public string SaveAtaTextLabel => "Save text to file";
public string AtaMcptLabel => Localization.Core.Device_supports_MCPT_Command_Set;
public string AtaMcptWriteProtectionLabel => Localization.Core.Media_card_is_write_protected;
public string SaveAtaBinaryLabel => UI.ButtonLabel_Save_binary_to_file;
public string SaveAtaTextLabel => UI.ButtonLabel_Save_text_to_file;
async Task ExecuteSaveAtaBinaryCommand()
{
@@ -122,7 +124,7 @@ public sealed class AtaInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -150,7 +152,7 @@ public sealed class AtaInfoViewModel : ViewModelBase
{
"*.txt"
}),
Name = "Text"
Name = UI.Dialog_Text_files
});
string result = await dlgSaveText.ShowAsync(_view);

View File

@@ -36,6 +36,7 @@ using System.Reactive;
using System.Threading.Tasks;
using Aaru.Decoders.Bluray;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using ReactiveUI;
@@ -155,22 +156,22 @@ public sealed class BlurayInfoViewModel
public bool SaveBlurayRawDflVisible { get; }
public bool SaveBlurayPacVisible { get; }
public string DiscinformationLabel => "Disc information";
public string BurstCuttingAreaLabel => "Burst Cutting Area";
public string DiscDefinitionStructureLabel => "Disc Definition Structure";
public string CartridgeStatusLabel => "Cartridge Status";
public string SpareAreaInformationLabel => "Spare Area Information";
public string PseudoOverWriteResourcesLabel => "Pseudo-OverWrite Resources";
public string TrackResourcesLabel => "Track Resources";
public string SaveBlurayDiscInformationLabel => "Save Disc Information";
public string SaveBlurayBurstCuttingAreaLabel => "Save Burst Cutting Area";
public string SaveBlurayDdsLabel => "Save Disc Definition Structure";
public string SaveBlurayCartridgeStatusLabel => "Save Spare Area Information";
public string SaveBluraySpareAreaInformationLabel => "Save Spare Area Information";
public string SaveBlurayPowResourcesLabel => "Save Pseudo-OverWrite Resources";
public string SaveBlurayTrackResourcesLabel => "Save Track Resources";
public string SaveBlurayRawDflLabel => "Save raw DFL";
public string SaveBlurayPacLabel => "Save PAC";
public string DiscinformationLabel => UI.Disc_information;
public string BurstCuttingAreaLabel => UI.Burst_Cutting_Area;
public string DiscDefinitionStructureLabel => UI.Disc_Definition_Structure;
public string CartridgeStatusLabel => UI.Cartridge_Status;
public string SpareAreaInformationLabel => UI.Spare_Area_Information;
public string PseudoOverWriteResourcesLabel => UI.Pseudo_OverWrite_Resources;
public string TrackResourcesLabel => UI.Track_Resources;
public string SaveBlurayDiscInformationLabel => UI.ButtonLabel_Save_Disc_Information;
public string SaveBlurayBurstCuttingAreaLabel => UI.ButtonLabel_Save_Burst_Cutting_Area;
public string SaveBlurayDdsLabel => UI.ButtonLabel_Save_Disc_Definition_Structure;
public string SaveBlurayCartridgeStatusLabel => UI.ButtonLabel_Save_Cartridge_Status;
public string SaveBluraySpareAreaInformationLabel => UI.ButtonLabel_Save_Spare_Area_Information;
public string SaveBlurayPowResourcesLabel => UI.ButtonLabel_Save_Pseudo_OverWrite_Resources;
public string SaveBlurayTrackResourcesLabel => UI.ButtonLabel_Save_Track_Resources;
public string SaveBlurayRawDflLabel => UI.ButtonLabel_Save_raw_DFL;
public string SaveBlurayPacLabel => UI.ButtonLabel_Save_PAC;
async Task SaveElement(byte[] data)
{
@@ -182,7 +183,7 @@ public sealed class BlurayInfoViewModel
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -38,6 +38,7 @@ using System.Threading.Tasks;
using Aaru.Decoders.CD;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using ReactiveUI;
@@ -129,24 +130,24 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
public ReactiveCommand<Unit, Task> SaveCdPmaCommand { get; }
public ObservableCollection<IsrcModel> IsrcList { get; }
public string CdInformationLabel => "Information";
public string SaveCdInformationLabel => "Save READ DISC INFORMATION response";
public string CdTocLabel => "TOC";
public string SaveCdTocLabel => "Save READ TOC response";
public string CdFullTocLabel => "TOC (full)";
public string SaveCdFullTocLabel => "Save READ RAW TOC response";
public string CdSessionLabel => "Session";
public string SaveCdSessionLabel => "Save READ SESSION response";
public string CdTextLabel => "CD-TEXT";
public string SaveCdTextLabel => "Save Lead-In CD-TEXT";
public string CdAtipLabel => "ATIP";
public string SaveCdAtipLabel => "Save READ ATIP response";
public string MiscellaneousLabel => "Miscellaneous";
public string McnLabel => "Media catalog number";
public string ISRCsLabel => "ISRCs";
public string TrackLabel => "Track";
public string ISRCLabel => "ISRC";
public string SaveCdPmaLabel => "Save READ PMA response";
public string CdInformationLabel => UI.Title_Information;
public string SaveCdInformationLabel => UI.ButtonLabel_Save_READ_DISC_INFORMATION_response;
public string CdTocLabel => UI.Title_TOC;
public string SaveCdTocLabel => UI.ButtonLabel_Save_READ_TOC_response;
public string CdFullTocLabel => UI.Title_TOC_full;
public string SaveCdFullTocLabel => UI.ButtonLabel_Save_READ_RAW_TOC_response;
public string CdSessionLabel => Localization.Core.Title_Session;
public string SaveCdSessionLabel => UI.ButtonLabel_Save_READ_SESSION_response;
public string CdTextLabel => UI.Title_CD_TEXT;
public string SaveCdTextLabel => UI.ButtonLabel_Save_Lead_In_CD_TEXT;
public string CdAtipLabel => UI.Title_ATIP;
public string SaveCdAtipLabel => UI.ButtonLabel_Save_READ_ATIP_response;
public string MiscellaneousLabel => UI.Title_Miscellaneous;
public string McnLabel => UI.Title_Media_catalog_number;
public string ISRCsLabel => UI.Title_ISRCs;
public string TrackLabel => Localization.Core.Title_Track;
public string ISRCLabel => UI.Title_ISRC;
public string SaveCdPmaLabel => UI.ButtonLabel_Save_READ_PMA_response;
async Task ExecuteSaveCdInformationCommand()
{
@@ -158,7 +159,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -182,7 +183,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -206,7 +207,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -230,7 +231,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -254,7 +255,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -278,7 +279,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -302,7 +303,7 @@ public sealed class CompactDiscInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -36,6 +36,7 @@ using System.Reactive;
using System.Threading.Tasks;
using Aaru.CommonTypes;
using Aaru.Decoders.DVD;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using ReactiveUI;
@@ -118,12 +119,12 @@ public sealed class DvdInfoViewModel
public bool SaveDvdBcaVisible { get; }
public bool SaveDvdAacsVisible { get; }
public string SaveDvdPfiLabel => "Save Physical Format Information";
public string SaveDvdDmiLabel => "Save Disc Manufacturer Information";
public string SaveDvdCmiLabel => "Save Copyright Management Information";
public string SaveHdDvdCmiLabel => "Save Copyright Management Information";
public string SaveDvdBcaLabel => "Save Burst Cutting Area";
public string SaveDvdAacsLabel => "Save AACS Information";
public string SaveDvdPfiLabel => UI.ButtonLabel_Save_Physical_Format_Information;
public string SaveDvdDmiLabel => UI.ButtonLabel_Save_Disc_Manufacturer_Information;
public string SaveDvdCmiLabel => UI.ButtonLabel_Save_Copyright_Management_Information;
public string SaveHdDvdCmiLabel => UI.ButtonLabel_Save_Copyright_Management_Information;
public string SaveDvdBcaLabel => UI.ButtonLabel_Save_Burst_Cutting_Area;
public string SaveDvdAacsLabel => UI.ButtonLabel_Save_AACS_Information;
async Task SaveElement(byte[] data)
{
@@ -135,7 +136,7 @@ public sealed class DvdInfoViewModel
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -36,6 +36,7 @@ using System.Reactive;
using System.Threading.Tasks;
using Aaru.CommonTypes;
using Aaru.Decoders.DVD;
using Aaru.Localization;
using Avalonia.Controls;
using ReactiveUI;
@@ -233,25 +234,25 @@ public sealed class DvdWritableInfoViewModel
public ReactiveCommand<Unit, Task> SaveDvdPlusAdipCommand { get; }
public ReactiveCommand<Unit, Task> SaveDvdPlusDcbCommand { get; }
public string DvdRamDdsLabel => "Disc Definition Structure";
public string DvdRamCartridgeStatusLabel => "Cartridge Status";
public string DvdRamSpareAreaInformationLabel => "Spare Area Information";
public string SaveDvdRamDdsLabel => "Save Disc Definition Structure";
public string SaveDvdRamCartridgeStatusLabel => "Save Cartridge Status";
public string SaveDvdRamSpareAreaInformationLabel => "Save Spare Area Information";
public string SaveLastBorderOutRmdLabel => "Save Last Border-Out RMD";
public string SaveDvdPreRecordedInfoLabel => "Save Pre-Recorded Physical Information";
public string SaveDvdrMediaIdentifierLabel => "Save Media Identifier";
public string SaveDvdrPhysicalInformationLabel => "Save Recordable Physical Information";
public string SaveHddvdrMediumStatusLabel => "Save Medium Status";
public string SaveHddvdrLastRmdLabel => "Save Last Border-Out RMD";
public string SaveDvdrLayerCapacityLabel => "Save Layer Capacity";
public string SaveDvdrDlMiddleZoneStartLabel => "Save Middle Zone Start";
public string SaveDvdrDlJumpIntervalSizeLabel => "Save Jump Interval Size";
public string SaveDvdrDlManualLayerJumpStartLbaLabel => "Save Manual Layer Jump Start LBA";
public string SaveDvdrDlRemapAnchorPointLabel => "Save Remap Anchor Point";
public string SaveDvdPlusAdipLabel => "Save ADIP";
public string SaveDvdPlusDcbLabel => "Save Disc Control Blocks";
public string DvdRamDdsLabel => UI.Disc_Definition_Structure;
public string DvdRamCartridgeStatusLabel => UI.Cartridge_Status;
public string DvdRamSpareAreaInformationLabel => UI.Spare_Area_Information;
public string SaveDvdRamDdsLabel => UI.ButtonLabel_Save_Disc_Definition_Structure;
public string SaveDvdRamCartridgeStatusLabel => UI.ButtonLabel_Save_Cartridge_Status;
public string SaveDvdRamSpareAreaInformationLabel => UI.ButtonLabel_Save_Spare_Area_Information;
public string SaveLastBorderOutRmdLabel => UI.ButtonLabel_Save_Last_Border_Out_RMD;
public string SaveDvdPreRecordedInfoLabel => UI.ButtonLabel_Save_Pre_Recorded_Physical_Information;
public string SaveDvdrMediaIdentifierLabel => UI.ButtonLabel_Save_Media_Identifier;
public string SaveDvdrPhysicalInformationLabel => UI.ButtonLabel_Save_Recordable_Physical_Information;
public string SaveHddvdrMediumStatusLabel => UI.ButtonLabel_Save_Medium_Status;
public string SaveHddvdrLastRmdLabel => UI.ButtonLabel_Save_Last_Border_Out_RMD;
public string SaveDvdrLayerCapacityLabel => UI.ButtonLabel_Save_Layer_Capacity;
public string SaveDvdrDlMiddleZoneStartLabel => UI.ButtonLabel_Save_Middle_Zone_Start;
public string SaveDvdrDlJumpIntervalSizeLabel => UI.ButtonLabel_Save_Jump_Interval_Size;
public string SaveDvdrDlManualLayerJumpStartLbaLabel => UI.ButtonLabel_Save_Manual_Layer_Jump_Start_LBA;
public string SaveDvdrDlRemapAnchorPointLabel => UI.ButtonLabel_Save_Remap_Anchor_Point;
public string SaveDvdPlusAdipLabel => UI.ButtonLabel_Save_ADIP;
public string SaveDvdPlusDcbLabel => UI.ButtonLabel_Save_Disc_Control_Blocks;
async Task SaveElement(byte[] data)
{
@@ -263,7 +264,7 @@ public sealed class DvdWritableInfoViewModel
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -38,6 +38,7 @@ using System.Threading.Tasks;
using Aaru.Console;
using Aaru.Decoders.PCMCIA;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using ReactiveUI;
@@ -76,17 +77,17 @@ public class PcmciaInfoViewModel : ViewModelBase
case TupleCodes.CISTPL_END: continue;
case TupleCodes.CISTPL_DEVICEGEO:
case TupleCodes.CISTPL_DEVICEGEO_A:
tupleCode = "Device Geometry Tuples";
tupleCode = UI.Device_Geometry_Tuples;
tupleDescription = CIS.PrettifyDeviceGeometryTuple(tuple);
break;
case TupleCodes.CISTPL_MANFID:
tupleCode = "Manufacturer Identification Tuple";
tupleCode = UI.Manufacturer_Identification_Tuple;
tupleDescription = CIS.PrettifyManufacturerIdentificationTuple(tuple);
break;
case TupleCodes.CISTPL_VERS_1:
tupleCode = "Level 1 Version / Product Information Tuple";
tupleCode = UI.Level_1_Version_Product_Information_Tuple;
tupleDescription = CIS.PrettifyLevel1VersionTuple(tuple);
break;
@@ -124,13 +125,13 @@ public class PcmciaInfoViewModel : ViewModelBase
case TupleCodes.CISTPL_SPCL:
case TupleCodes.CISTPL_SWIL:
case TupleCodes.CISTPL_VERS_2:
tupleCode = $"Undecoded tuple ID {tuple.Code}";
tupleDescription = $"Undecoded tuple ID {tuple.Code}";
tupleCode = string.Format(UI.Undecoded_tuple_ID_0, tuple.Code);
tupleDescription = string.Format(UI.Undecoded_tuple_ID_0, tuple.Code);
break;
default:
tupleCode = $"0x{(byte)tuple.Code:X2}";
tupleDescription = $"Found unknown tuple ID 0x{(byte)tuple.Code:X2}";
tupleDescription = string.Format(UI.Found_unknown_tuple_ID_0, (byte)tuple.Code);
break;
}
@@ -142,11 +143,11 @@ public class PcmciaInfoViewModel : ViewModelBase
});
}
else
AaruConsole.DebugWriteLine("Device-Info command", "PCMCIA CIS returned no tuples");
AaruConsole.DebugWriteLine("Device-Info command", UI.PCMCIA_CIS_returned_no_tuples);
}
public string CisLabel => "CIS";
public string SavePcmciaCisLabel => "Save PCMCIA CIS to file";
public string CisLabel => UI.Title_CIS;
public string SavePcmciaCisLabel => UI.ButtonLabel_Save_PCMCIA_CIS_to_file;
public ObservableCollection<PcmciaCisModel> CisList { get; }
@@ -181,7 +182,7 @@ public class PcmciaInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -42,6 +42,7 @@ using Aaru.Decoders.SCSI;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Gui.Models;
using Aaru.Helpers;
using Aaru.Localization;
using Avalonia.Controls;
using ReactiveUI;
using Inquiry = Aaru.CommonTypes.Structs.Devices.SCSI.Inquiry;
@@ -90,15 +91,15 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
ModeSensePages.Add(new ScsiPageModel
{
Page = "Header",
Page = UI.Title_Header,
Description = Modes.PrettifyModeHeader(scsiMode.Value.Header, scsiType)
});
if(scsiMode.Value.Pages != null)
foreach(Modes.ModePage page in scsiMode.Value.Pages.OrderBy(t => t.Page).ThenBy(t => t.Subpage))
{
string pageNumberText = page.Subpage == 0 ? $"MODE {page.Page:X2}h"
: $"MODE {page.Page:X2} Subpage {page.Subpage:X2}";
string pageNumberText = page.Subpage == 0 ? string.Format(UI.MODE_0, page.Page)
: string.Format(UI.MODE_0_Subpage_1, page.Page, page.Subpage);
string decodedText;
@@ -110,7 +111,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
page.Subpage == 0)
decodedText = Modes.PrettifyModePage_00_SFF(page.PageResponse);
else
decodedText = "Undecoded";
decodedText = UI.Undecoded;
break;
}
@@ -358,7 +359,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
case 0x30:
{
if(Modes.IsAppleModePage_30(page.PageResponse))
decodedText = "Drive identifies as Apple OEM drive";
decodedText = Localization.Core.Drive_identifies_as_Apple_OEM_drive;
else
goto default;
@@ -406,14 +407,14 @@ public sealed class ScsiInfoViewModel : ViewModelBase
}
default:
{
decodedText = "Undecoded";
decodedText = UI.Undecoded;
break;
}
}
// TODO: Automatic error reporting
decodedText ??= "Error decoding page, please open an issue.";
decodedText ??= UI.Error_decoding_page_please_open_an_issue;
ModeSensePages.Add(new ScsiPageModel
{
@@ -432,103 +433,103 @@ public sealed class ScsiInfoViewModel : ViewModelBase
switch(page.Key)
{
case >= 0x01 and <= 0x7F:
evpdPageTitle = $"ASCII Page {page.Key:X2}h";
evpdPageTitle = string.Format(UI.ASCII_Page_0, page.Key);
evpdDecodedPage = EVPD.DecodeASCIIPage(page.Value);
break;
case 0x80:
evpdPageTitle = "Unit Serial Number";
evpdPageTitle = UI.Unit_Serial_Number;
evpdDecodedPage = EVPD.DecodePage80(page.Value);
break;
case 0x81:
evpdPageTitle = "SCSI Implemented operating definitions";
evpdPageTitle = UI.SCSI_Implemented_operating_definitions;
evpdDecodedPage = EVPD.PrettifyPage_81(page.Value);
break;
case 0x82:
evpdPageTitle = "ASCII implemented operating definitions";
evpdPageTitle = UI.ASCII_implemented_operating_definitions;
evpdDecodedPage = EVPD.DecodePage82(page.Value);
break;
case 0x83:
evpdPageTitle = "SCSI Device identification";
evpdPageTitle = UI.SCSI_Device_identification;
evpdDecodedPage = EVPD.PrettifyPage_83(page.Value);
break;
case 0x84:
evpdPageTitle = "SCSI Software Interface Identifiers";
evpdPageTitle = UI.SCSI_Software_Interface_Identifiers;
evpdDecodedPage = EVPD.PrettifyPage_84(page.Value);
break;
case 0x85:
evpdPageTitle = "SCSI Management Network Addresses";
evpdPageTitle = UI.SCSI_Management_Network_Addresses;
evpdDecodedPage = EVPD.PrettifyPage_85(page.Value);
break;
case 0x86:
evpdPageTitle = "SCSI Extended INQUIRY Data";
evpdPageTitle = UI.SCSI_Extended_INQUIRY_Data;
evpdDecodedPage = EVPD.PrettifyPage_86(page.Value);
break;
case 0x89:
evpdPageTitle = "SCSI to ATA Translation Layer Data";
evpdPageTitle = UI.SCSI_to_ATA_Translation_Layer_Data;
evpdDecodedPage = EVPD.PrettifyPage_89(page.Value);
break;
case 0xB0:
evpdPageTitle = "SCSI Sequential-access Device Capabilities";
evpdPageTitle = UI.SCSI_Sequential_access_Device_Capabilities;
evpdDecodedPage = EVPD.PrettifyPage_B0(page.Value);
break;
case 0xB1:
evpdPageTitle = "Manufacturer-assigned Serial Number";
evpdPageTitle = UI.Manufacturer_assigned_Serial_Number;
evpdDecodedPage = EVPD.DecodePageB1(page.Value);
break;
case 0xB2:
evpdPageTitle = "TapeAlert Supported Flags Bitmap";
evpdPageTitle = UI.TapeAlert_Supported_Flags_Bitmap;
evpdDecodedPage = $"0x{EVPD.DecodePageB2(page.Value):X16}";
break;
case 0xB3:
evpdPageTitle = "Automation Device Serial Number";
evpdPageTitle = UI.Automation_Device_Serial_Number;
evpdDecodedPage = EVPD.DecodePageB3(page.Value);
break;
case 0xB4:
evpdPageTitle = "Data Transfer Device Element Address";
evpdPageTitle = UI.Data_Transfer_Device_Element_Address;
evpdDecodedPage = EVPD.DecodePageB4(page.Value);
break;
case 0xC0 when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "quantum":
evpdPageTitle = "Quantum Firmware Build Information page";
evpdPageTitle = UI.Quantum_Firmware_Build_Information_page;
evpdDecodedPage = EVPD.PrettifyPage_C0_Quantum(page.Value);
break;
case 0xC0 when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "seagate":
evpdPageTitle = "Seagate Firmware Numbers page";
evpdPageTitle = UI.Seagate_Firmware_Numbers_page;
evpdDecodedPage = EVPD.PrettifyPage_C0_Seagate(page.Value);
break;
case 0xC0 when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "ibm":
evpdPageTitle = "IBM Drive Component Revision Levels page";
evpdPageTitle = UI.IBM_Drive_Component_Revision_Levels_page;
evpdDecodedPage = EVPD.PrettifyPage_C0_IBM(page.Value);
break;
case 0xC1 when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "ibm":
evpdPageTitle = "IBM Drive Serial Numbers page";
evpdPageTitle = UI.IBM_Drive_Serial_Numbers_page;
evpdDecodedPage = EVPD.PrettifyPage_C1_IBM(page.Value);
break;
case 0xC0 or 0xC1
when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "certance":
evpdPageTitle = "Certance Drive Component Revision Levels page";
evpdPageTitle = UI.Certance_Drive_Component_Revision_Levels_page;
evpdDecodedPage = EVPD.PrettifyPage_C0_C1_Certance(page.Value);
break;
@@ -537,11 +538,11 @@ public sealed class ScsiInfoViewModel : ViewModelBase
Trim() == "certance":
evpdPageTitle = page.Key switch
{
0xC2 => "Head Assembly Serial Number",
0xC3 => "Reel Motor 1 Serial Number",
0xC4 => "Reel Motor 2 Serial Number",
0xC5 => "Board Serial Number",
0xC6 => "Base Mechanical Serial Number",
0xC2 => UI.Head_Assembly_Serial_Number,
0xC3 => UI.Reel_Motor_1_Serial_Number,
0xC4 => UI.Reel_Motor_2_Serial_Number,
0xC5 => UI.Board_Serial_Number,
0xC6 => UI.Base_Mechanical_Serial_Number,
_ => evpdPageTitle
};
@@ -553,12 +554,12 @@ public sealed class ScsiInfoViewModel : ViewModelBase
Trim() == "hp":
evpdPageTitle = page.Key switch
{
0xC0 => "HP Drive Firmware Revision Levels page:",
0xC1 => "HP Drive Hardware Revision Levels page:",
0xC2 => "HP Drive PCA Revision Levels page:",
0xC3 => "HP Drive Mechanism Revision Levels page:",
0xC4 => "HP Drive Head Assembly Revision Levels page:",
0xC5 => "HP Drive ACI Revision Levels page:",
0xC0 => UI.HP_Drive_Firmware_Revision_Levels_page,
0xC1 => UI.HP_Drive_Hardware_Revision_Levels_page,
0xC2 => UI.HP_Drive_PCA_Revision_Levels_page,
0xC3 => UI.HP_Drive_Mechanism_Revision_Levels_page,
0xC4 => UI.HP_Drive_Head_Assembly_Revision_Levels_page,
0xC5 => UI.HP_Drive_ACI_Revision_Levels_page,
_ => evpdPageTitle
};
@@ -567,7 +568,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
break;
case 0xDF when StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
Trim() == "certance":
evpdPageTitle = "Certance drive status page";
evpdPageTitle = UI.Certance_drive_status_page;
evpdDecodedPage = EVPD.PrettifyPage_DF_Certance(page.Value);
break;
@@ -576,11 +577,11 @@ public sealed class ScsiInfoViewModel : ViewModelBase
if(page.Key == 0x00)
continue;
evpdPageTitle = $"Page {page.Key:X2}h";
evpdDecodedPage = "Undecoded";
evpdPageTitle = string.Format(UI.Page_0_h, page.Key);
evpdDecodedPage = UI.Undecoded;
AaruConsole.DebugWriteLine("Device-Info command", "Found undecoded SCSI VPD page 0x{0:X2}",
page.Key);
AaruConsole.DebugWriteLine("Device-Info command",
Localization.Core.Found_undecoded_SCSI_VPD_page_0, page.Key);
break;
}
@@ -599,16 +600,17 @@ public sealed class ScsiInfoViewModel : ViewModelBase
Features.SeparatedFeatures ftr = Features.Separate(_configuration);
AaruConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION length is {0} bytes", ftr.DataLength);
AaruConsole.DebugWriteLine("Device-Info command", Localization.Core.GET_CONFIGURATION_length_is_0,
ftr.DataLength);
AaruConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION current profile is {0:X4}h",
AaruConsole.DebugWriteLine("Device-Info command", Localization.Core.GET_CONFIGURATION_current_profile_is_0,
ftr.CurrentProfile);
if(ftr.Descriptors != null)
foreach(Features.FeatureDescriptor desc in ftr.Descriptors)
{
string featureNumber = $"Feature {desc.Code:X4}h";
AaruConsole.DebugWriteLine("Device-Info command", "Feature {0:X4}h", desc.Code);
string featureNumber = string.Format(Localization.Core.Feature_0, desc.Code);
AaruConsole.DebugWriteLine("Device-Info command", Localization.Core.Feature_0, desc.Code);
string featureDescription = desc.Code switch
{
@@ -670,7 +672,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
0x0110 => Features.Prettify_0110(desc.Data),
0x0113 => Features.Prettify_0113(desc.Data),
0x0142 => Features.Prettify_0142(desc.Data),
_ => "Unknown feature"
_ => UI.Unknown_feature
};
MmcFeatures.Add(new ScsiPageModel
@@ -680,7 +682,8 @@ public sealed class ScsiInfoViewModel : ViewModelBase
});
}
else
AaruConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION returned no feature descriptors");
AaruConsole.DebugWriteLine("Device-Info command",
Localization.Core.GET_CONFIGURATION_returned_no_feature_descriptors);
}
public byte[] InquiryData { get; }
@@ -758,19 +761,19 @@ public sealed class ScsiInfoViewModel : ViewModelBase
set => this.RaiseAndSetIfChanged(ref _mmcFeatureText, value);
}
public string InquiryLabel => "INQUIRY";
public string ScsiInquiryLabel => "SCSI INQUIRY";
public string SaveInquiryBinaryLabel => "Save binary to file";
public string SaveInquiryTextLabel => "Save text to file";
public string ModeSenseLabel => "MODE SENSE";
public string PageLabel => "Page";
public string SaveModeSense6Label => "Save MODE SENSE (6) response to file";
public string SaveModeSense10Label => "Save MODE SENSE (10) response to file";
public string EvpdLabel => "EVPD";
public string SaveEvpdPageLabel => "Save EVPD page to file";
public string MmcFeaturesLabel => "MMC FEATURES";
public string FeatureLabel => "Feature";
public string SaveMmcFeaturesLabel => "Save MMC GET CONFIGURATION response to file";
public string InquiryLabel => UI.Title_INQUIRY;
public string ScsiInquiryLabel => UI.Title_SCSI_INQUIRY;
public string SaveInquiryBinaryLabel => UI.ButtonLabel_Save_binary_to_file;
public string SaveInquiryTextLabel => UI.ButtonLabel_Save_text_to_file;
public string ModeSenseLabel => UI.Title_MODE_SENSE;
public string PageLabel => UI.Title_Page;
public string SaveModeSense6Label => UI.ButtonLabel_Save_MODE_SENSE_6_response_to_file;
public string SaveModeSense10Label => UI.ButtonLabel_Save_MODE_SENSE_10_response_to_file;
public string EvpdLabel => UI.Title_EVPD;
public string SaveEvpdPageLabel => UI.ButtonLabel_Save_EVPD_page_to_file;
public string MmcFeaturesLabel => UI.Title_MMC_FEATURES;
public string FeatureLabel => UI.Title_Feature;
public string SaveMmcFeaturesLabel => UI.ButtonLabel_Save_MMC_GET_CONFIGURATION_response_to_file;
async Task ExecuteSaveInquiryBinaryCommand()
{
@@ -782,7 +785,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -806,7 +809,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.txt"
}),
Name = "Text"
Name = UI.Dialog_Text_files
});
string result = await dlgSaveText.ShowAsync(_view);
@@ -830,7 +833,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -854,7 +857,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -881,7 +884,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);
@@ -905,7 +908,7 @@ public sealed class ScsiInfoViewModel : ViewModelBase
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using Aaru.CommonTypes.Enums;
using Aaru.Localization;
using JetBrains.Annotations;
namespace Aaru.Gui.ViewModels.Tabs;
@@ -87,9 +88,9 @@ public sealed class SdMmcInfoViewModel
public string ExtendedCsdText { get; }
public string ScrText { get; }
public string CidLabel => "CID";
public string CsdLabel => "CSD";
public string OcrLabel => "OCR";
public string ExtendedCsdLabel => "Extended CSD";
public string ScrLabel => "SCR";
public string CidLabel => UI.Title_CID;
public string CsdLabel => UI.Title_CSD;
public string OcrLabel => UI.Title_OCR;
public string ExtendedCsdLabel => UI.Title_Extended_CSD;
public string ScrLabel => UI.Title_SCR;
}

View File

@@ -36,6 +36,7 @@ using System.Reactive;
using System.Threading.Tasks;
using Aaru.Core.Media.Info;
using Aaru.Decoders.Xbox;
using Aaru.Localization;
using Avalonia.Controls;
using JetBrains.Annotations;
using ReactiveUI;
@@ -57,11 +58,11 @@ public sealed class XboxInfoViewModel
if(xgdInfo != null)
{
XboxInformationVisible = true;
XboxL0VideoText = $"{xgdInfo.L0Video} sectors";
XboxL1VideoText = $"{xgdInfo.L1Video} sectors";
XboxMiddleZoneText = $"{xgdInfo.MiddleZone} sectors";
XboxGameSizeText = $"{xgdInfo.GameSize} sectors";
XboxTotalSizeText = $"{xgdInfo.TotalSize} sectors";
XboxL0VideoText = string.Format(Localization.Core._0_sectors, xgdInfo.L0Video);
XboxL1VideoText = string.Format(Localization.Core._0_sectors, xgdInfo.L1Video);
XboxMiddleZoneText = string.Format(Localization.Core._0_sectors, xgdInfo.MiddleZone);
XboxGameSizeText = string.Format(Localization.Core._0_sectors, xgdInfo.GameSize);
XboxTotalSizeText = string.Format(Localization.Core._0_sectors, xgdInfo.TotalSize);
XboxRealBreakText = xgdInfo.LayerBreak.ToString();
}
@@ -91,15 +92,15 @@ public sealed class XboxInfoViewModel
public string XboxDmiText { get; }
public string XboxSsText { get; }
public string XboxL0VideoLabel => "Video layer 0 size";
public string XboxL1VideoLabel => "Video layer 1 size";
public string XboxMiddleZoneLabel => "Middle zone size";
public string XboxGameSizeLabel => "Game data size";
public string XboxTotalSizeLabel => "Total size";
public string XboxRealBreakLabel => "Real layer break";
public string XboxDmiLabel => "Disc Manufacturing Information";
public string XboxSsLabel => "Security Sector";
public string SaveXboxSsLabel => "Save Xbox Security Sector";
public string XboxL0VideoLabel => Localization.Core.Video_layer_zero_size;
public string XboxL1VideoLabel => Localization.Core.Video_layer_one_size;
public string XboxMiddleZoneLabel => Localization.Core.Middle_zone_size;
public string XboxGameSizeLabel => Localization.Core.Game_data_size;
public string XboxTotalSizeLabel => Localization.Core.Total_size;
public string XboxRealBreakLabel => Localization.Core.Real_layer_break;
public string XboxDmiLabel => UI.Title_Disc_Manufacturing_Information;
public string XboxSsLabel => UI.Title_Security_Sector;
public string SaveXboxSsLabel => UI.ButtonLabel_Save_Xbox_Security_Sector;
async Task SaveElement(byte[] data)
{
@@ -111,7 +112,7 @@ public sealed class XboxInfoViewModel
{
"*.bin"
}),
Name = "Binary"
Name = UI.Dialog_Binary_files
});
string result = await dlgSaveBinary.ShowAsync(_view);

View File

@@ -45,6 +45,7 @@ using Aaru.Decoders.SCSI.MMC;
using Aaru.Decoders.Xbox;
using Aaru.Gui.Models;
using Aaru.Helpers;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
using BCA = Aaru.Decoders.Bluray.BCA;
@@ -249,7 +250,7 @@ public sealed class DecodeMediaTagsViewModel : ViewModelBase
set => this.RaiseAndSetIfChanged(ref _decodedText, value);
}
public string TagLabel => "Tag:";
public string HexViewLabel => "HexView";
public string DecodedLabel => "Decoded";
public string TagLabel => UI.Title_Tag;
public string HexViewLabel => UI.Title_HexView;
public string DecodedLabel => UI.Title_Decoded;
}

View File

@@ -41,6 +41,7 @@ using Aaru.CommonTypes.Structs;
using Aaru.Console;
using Aaru.Core;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using ReactiveUI;
@@ -128,28 +129,28 @@ public sealed class ImageChecksumViewModel : ViewModelBase
}
}
public string ChecksumMediaLabel => "Checksums the whole disc.";
public string ChecksumTracksLabel => "Checksums each track separately.";
public string Adler32Label => "Calculates Adler-32.";
public string Crc16Label => "Calculates CRC16.";
public string Crc32Label => "Calculates CRC32.";
public string Crc64Label => "Calculates CRC64 (ECMA).";
public string Fletcher16Label => "Calculates Fletcher-16.";
public string Fletcher32Label => "Calculates Fletcher-32.";
public string Md5Label => "Calculates MD5.";
public string Sha1Label => "Calculates SHA1.";
public string Sha256Label => "Calculates SHA256.";
public string Sha384Label => "Calculates SHA384";
public string Sha512Label => "Calculates SHA512.";
public string SpamSumLabel => "Calculates SpamSum fuzzy hash.";
public string TrackChecksumsLabel => "Track checksums:";
public string TrackLabel => "Track";
public string AlgorithmsLabel => "Algorithms";
public string HashLabel => "Hash";
public string MediaChecksumsLabel => "Media checksums:";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string ChecksumMediaLabel => UI.Checksums_the_whole_disc;
public string ChecksumTracksLabel => UI.Checksums_each_track_separately;
public string Adler32Label => UI.Calculates_Adler_32;
public string Crc16Label => UI.Calculates_CRC16;
public string Crc32Label => UI.Calculates_CRC32;
public string Crc64Label => UI.Calculates_CRC64_ECMA;
public string Fletcher16Label => UI.Calculates_Fletcher_16;
public string Fletcher32Label => UI.Calculates_Fletcher_32;
public string Md5Label => UI.Calculates_MD5;
public string Sha1Label => UI.Calculates_SHA1;
public string Sha256Label => UI.Calculates_SHA256;
public string Sha384Label => UI.Calculates_SHA384;
public string Sha512Label => UI.Calculates_SHA512;
public string SpamSumLabel => UI.Calculates_SpamSum_fuzzy_hash;
public string TrackChecksumsLabel => UI.Title_Track_checksums;
public string TrackLabel => Localization.Core.Title_Track;
public string AlgorithmsLabel => UI.Title_Algorithms;
public string HashLabel => UI.Title_Hash;
public string MediaChecksumsLabel => UI.Title_Media_checksums;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public string Title
{
@@ -482,7 +483,8 @@ public sealed class ImageChecksumViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Hashing track {currentTrack.Sequence} of {opticalMediaImage.Tracks.Count}";
ProgressText = string.Format(UI.Hashing_track_0_of_1, currentTrack.Sequence,
opticalMediaImage.Tracks.Count);
ProgressValue++;
});
@@ -511,8 +513,7 @@ public sealed class ImageChecksumViewModel : ViewModelBase
mediaChecksum?.Update(hiddenSector);
}
AaruConsole.DebugWriteLine("Checksum command",
"Track {0} starts at sector {1} and ends at sector {2}",
AaruConsole.DebugWriteLine("Checksum command", UI.Track_0_starts_at_sector_1_and_ends_at_sector_2,
currentTrack.Sequence, currentTrack.StartSector, currentTrack.EndSector);
if(ChecksumTracksChecked)
@@ -655,7 +656,7 @@ public sealed class ImageChecksumViewModel : ViewModelBase
}
catch(Exception ex)
{
AaruConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
AaruConsole.DebugWriteLine(UI.Could_not_get_tracks_because_0, ex.Message);
AaruConsole.WriteLine("Unable to get separate tracks, not checksumming them");
}
else
@@ -703,8 +704,8 @@ public sealed class ImageChecksumViewModel : ViewModelBase
{
Progress2Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
Progress2Text = $"Hashing sectors {doneSectorsToInvoke} to {
doneSectorsToInvoke + SECTORS_TO_READ}";
Progress2Text = string.Format(UI.Hashing_sectors_0_to_1, doneSectorsToInvoke,
doneSectorsToInvoke + SECTORS_TO_READ);
});
doneSectors += SECTORS_TO_READ;
@@ -728,8 +729,9 @@ public sealed class ImageChecksumViewModel : ViewModelBase
{
Progress2Value = (int)(doneSectorsToInvoke / SECTORS_TO_READ);
Progress2Text = $"Hashing sectors {doneSectorsToInvoke} to {
doneSectorsToInvoke + (_inputFormat.Info.Sectors - doneSectorsToInvoke)}";
Progress2Text = string.Format(UI.Hashing_sectors_0_to_1, doneSectorsToInvoke,
doneSectorsToInvoke +
(_inputFormat.Info.Sectors - doneSectorsToInvoke));
});
doneSectors += _inputFormat.Info.Sectors - doneSectors;

View File

@@ -51,6 +51,7 @@ using Aaru.Core;
using Aaru.Core.Media;
using Aaru.Devices;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using MessageBox.Avalonia;
@@ -128,32 +129,32 @@ public sealed class ImageConvertViewModel : ViewModelBase
bool _stopVisible;
string _title;
public string SourceImageLabel => "Source image";
public string OutputFormatLabel => "Output format";
public string ChooseLabel => "Choose...";
public string SectorsLabel => "How many sectors to convert at once.";
public string ForceLabel => "Continue conversion even if sector or media tags will be lost in the process.";
public string CreatorLabel => "Who (person) created the image?";
public string GetFromSourceImageLabel => "Get from source image";
public string MetadataLabel => "Metadata";
public string MediaLabel => "Media";
public string TitleLabel => "Title";
public string ManufacturerLabel => "Manufacturer";
public string ModelLabel => "Model";
public string SerialNumberLabel => "Serial number";
public string BarcodeLabel => "Barcode";
public string PartNumberLabel => "Part number";
public string NumberInSequenceLabel => "Number in sequence";
public string LastMediaOfTheSequenceLabel => "Last media of the sequence";
public string DriveLabel => "Drive";
public string FirmwareRevisionLabel => "Firmware revision";
public string CommentsLabel => "Comments";
public string CicmXmlLabel => "Existing CICM XML sidecar";
public string FromImageLabel => "From image...";
public string ResumeFileLabel => "Existing resume file";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string SourceImageLabel => UI.Source_image;
public string OutputFormatLabel => UI.Output_format;
public string ChooseLabel => UI.ButtonLabel_Choose;
public string SectorsLabel => UI.How_many_sectors_to_convert_at_once;
public string ForceLabel => UI.Continue_conversion_even_if_data_lost;
public string CreatorLabel => UI.Who_person_created_the_image;
public string GetFromSourceImageLabel => UI.ButtonLabel_Get_from_source_image;
public string MetadataLabel => UI.Title_Metadata;
public string MediaLabel => UI.Title_Media;
public string TitleLabel => UI.Title_Title;
public string ManufacturerLabel => UI.Title_Manufacturer;
public string ModelLabel => UI.Title_Model;
public string SerialNumberLabel => UI.Title_Serial_number;
public string BarcodeLabel => UI.Title_Barcode;
public string PartNumberLabel => UI.Title_Part_number;
public string NumberInSequenceLabel => UI.Title_Number_in_sequence;
public string LastMediaOfTheSequenceLabel => UI.Title_Last_media_of_the_sequence;
public string DriveLabel => UI.Title_Drive;
public string FirmwareRevisionLabel => UI.Title_Firmware_revision;
public string CommentsLabel => UI.Title_Comments;
public string CicmXmlLabel => UI.Title_Existing_CICM_XML_sidecar;
public string FromImageLabel => UI.Title_From_image;
public string ResumeFileLabel => UI.Title_Existing_resume_file;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public ImageConvertViewModel([JetBrains.Annotations.NotNull] IMediaImage inputFormat, string imageSource,
Window view)
@@ -216,8 +217,8 @@ public sealed class ImageConvertViewModel : ViewModelBase
_dumpHardware = inputFormat.DumpHardware?.Any() == true ? inputFormat.DumpHardware : null;
CicmXmlText = _cicmMetadata == null ? "" : "<From image>";
ResumeFileText = _dumpHardware == null ? "" : "<From image>";
CicmXmlText = _cicmMetadata == null ? "" : UI._From_image_;
ResumeFileText = _dumpHardware == null ? "" : UI._From_image_;
}
public string Title
@@ -591,7 +592,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
if(SelectedPlugin is null)
{
await MessageBoxManager.GetMessageBoxStandardWindow("Error", "Error trying to find selected plugin",
await MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Error_trying_to_find_selected_plugin,
icon: Icon.Error).ShowDialog(_view);
return;
@@ -607,7 +608,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
if(plugin is not IWritableImage outputFormat)
{
await MessageBoxManager.GetMessageBoxStandardWindow("Error", "Error trying to find selected plugin",
await MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Error_trying_to_find_selected_plugin,
icon: Icon.Error).ShowDialog(_view);
return;
@@ -712,9 +713,10 @@ public sealed class ImageConvertViewModel : ViewModelBase
!outputFormat.SupportedMediaTags.Contains(mediaTag) && !ForceChecked))
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Converting image will lose media tag {
mediaTag}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Converting_image_will_lose_media_tag_0,
mediaTag),
icon: Icon.Error).
ShowDialog(_view));
@@ -737,9 +739,10 @@ public sealed class ImageConvertViewModel : ViewModelBase
}
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Converting image will lose sector tag {
sectorTag}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Converting_image_will_lose_sector_tag_0,
sectorTag),
icon: Icon.Error).
ShowDialog(_view));
@@ -782,7 +785,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Creating output image";
ProgressText = UI.Creating_output_image;
Progress2Text = "";
Progress2Indeterminate = true;
});
@@ -791,20 +794,22 @@ public sealed class ImageConvertViewModel : ViewModelBase
_inputFormat.Info.SectorSize))
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} creating output image.",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_creating_output_image,
outputFormat.
ErrorMessage),
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} creating output image.", outputFormat.ErrorMessage);
AaruConsole.ErrorWriteLine(UI.Error_0_creating_output_image, outputFormat.ErrorMessage);
return;
}
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Setting image metadata";
ProgressText = UI.Setting_image_metadata;
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = true;
@@ -833,25 +838,24 @@ public sealed class ImageConvertViewModel : ViewModelBase
if(!_cancel)
if(!outputFormat.SetMetadata(metadata))
{
AaruConsole.ErrorWrite("Error {0} setting metadata, ", outputFormat.ErrorMessage);
if(ForceChecked != true)
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.
ErrorMessage
} setting metadata, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_setting_metadata_not_continuing,
outputFormat.
ErrorMessage),
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("not continuing...");
AaruConsole.ErrorWriteLine(UI.Error_0_setting_metadata_not_continuing, outputFormat.ErrorMessage);
return;
}
warning = true;
AaruConsole.ErrorWriteLine("continuing...");
AaruConsole.ErrorWriteLine(UI.Error_0_setting_metadata, outputFormat.ErrorMessage);
}
if(tracks != null &&
@@ -860,7 +864,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Setting tracks list";
ProgressText = UI.Setting_tracks_list;
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = true;
@@ -869,14 +873,15 @@ public sealed class ImageConvertViewModel : ViewModelBase
if(!outputOptical.SetTracks(tracks))
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.
ErrorMessage
} sending tracks list to output image.",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_sending_tracks_list_to_output_image,
outputFormat.
ErrorMessage),
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} sending tracks list to output image.", outputFormat.ErrorMessage);
AaruConsole.ErrorWriteLine(UI.Error_0_sending_tracks_list_to_output_image, outputFormat.ErrorMessage);
return;
}
@@ -888,7 +893,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Converting media tag {mediaTag}";
ProgressText = string.Format(UI.Converting_media_tag_0, mediaTag);
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = true;
@@ -908,9 +913,9 @@ public sealed class ImageConvertViewModel : ViewModelBase
warning = true;
if(errno == ErrorNumber.NoError)
AaruConsole.ErrorWriteLine("Error {0} writing media tag, continuing...", outputFormat.ErrorMessage);
AaruConsole.ErrorWriteLine(UI.Error_0_writing_media_tag, outputFormat.ErrorMessage);
else
AaruConsole.ErrorWriteLine("Error {0} reading media tag, continuing...", errno);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_media_tag, errno);
}
else
{
@@ -918,24 +923,25 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(action: async () =>
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} writing media tag, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_media_tag_not_continuing,
outputFormat.ErrorMessage),
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing media tag, not continuing...",
outputFormat.ErrorMessage);
AaruConsole.ErrorWriteLine(UI.Error_0_writing_media_tag_not_continuing, outputFormat.ErrorMessage);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () =>
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno
} reading media tag, not continuing...",
icon: Icon.Error).ShowDialog(_view));
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_media_tag_not_continuing,
errno), icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} reading media tag, not continuing...", errno);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_media_tag_not_continuing, errno);
}
return;
@@ -949,8 +955,9 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Setting geometry to {_inputFormat.Info.Cylinders} cylinders, {_inputFormat.Info.Heads
} heads and {_inputFormat.Info.SectorsPerTrack} sectors per track";
ProgressText = string.Format(UI.Setting_geometry_to_0_cylinders_1_heads_and_2_sectors_per_track,
_inputFormat.Info.Cylinders, _inputFormat.Info.Heads,
_inputFormat.Info.SectorsPerTrack);
ProgressValue++;
Progress2Text = "";
@@ -962,13 +969,13 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} setting geometry, image may be incorrect, continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_setting_geometry_image_may_be_incorrect_continuing,
outputFormat.ErrorMessage);
}
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Converting sectors";
ProgressText = UI.Converting_sectors;
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = false;
@@ -993,8 +1000,8 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting sectors {sectors} to {sectors + sectorsToDo} ({
sectors / (double)_inputFormat.Info.Sectors:P2} done)";
Progress2Text = string.Format(UI.Converting_sectors_0_to_1_2_done, sectors, sectors + sectorsToDo,
sectors / (double)_inputFormat.Info.Sectors);
Progress2Value = (int)(sectors / SectorsValue);
});
@@ -1017,19 +1024,18 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, not continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_not_continuing, errno, doneSectors);
return;
}
@@ -1051,19 +1057,18 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, not continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_not_continuing, errno, doneSectors);
return;
}
@@ -1075,19 +1080,20 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, continuing...",
outputFormat.ErrorMessage, doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_writing_sector_1_continuing, outputFormat.ErrorMessage,
doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} writing sector {doneSectors
}, not continuing...", icon: Icon.Error).
ShowDialog(_view));
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_sector_1_not_continuing,
outputFormat.ErrorMessage,
doneSectors),
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_sector_1_not_continuing,
outputFormat.ErrorMessage, doneSectors);
return;
@@ -1098,8 +1104,8 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting sectors {_inputFormat.Info.Sectors} to {_inputFormat.Info.Sectors} ({1.0
:P2} done)";
Progress2Text = string.Format(UI.Converting_sectors_0_to_1_2_done, _inputFormat.Info.Sectors,
_inputFormat.Info.Sectors, 1.0);
Progress2Value = Progress2MaxValue;
});
@@ -1167,7 +1173,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Converting tag {tag}";
ProgressText = string.Format(UI.Converting_tag_0, tag);
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = false;
@@ -1194,9 +1200,10 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting tag {sectors / (double)_inputFormat.Info.Sectors} for sectors {
sectors} to {sectors + sectorsToDo} ({sectors / (double)_inputFormat.Info.Sectors
:P2} done)";
Progress2Text = string.Format(UI.Converting_tag_0_for_sectors_1_to_2_3_done,
sectors / (double)_inputFormat.Info.Sectors, sectors,
sectors + sectorsToDo,
sectors / (double)_inputFormat.Info.Sectors);
Progress2Value = (int)(sectors / SectorsValue);
});
@@ -1236,20 +1243,19 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, not continuing...", errno,
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_not_continuing, errno,
doneSectors);
return;
@@ -1290,20 +1296,19 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, not continuing...", errno,
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_not_continuing, errno,
doneSectors);
return;
@@ -1316,19 +1321,21 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_sector_1_continuing,
outputFormat.ErrorMessage, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} writing sector {doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_sector_1_not_continuing,
outputFormat.
ErrorMessage,
doneSectors),
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_sector_1_not_continuing,
outputFormat.ErrorMessage, doneSectors);
return;
@@ -1339,8 +1346,8 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting tag {tag} for sectors {_inputFormat.Info.Sectors} to {
_inputFormat.Info.Sectors} ({1.0:P2} done)";
Progress2Text = string.Format(UI.Converting_tag_0_for_sectors_1_to_2_3_done, tag,
_inputFormat.Info.Sectors, _inputFormat.Info.Sectors, 1.0);
Progress2Value = Progress2MaxValue;
});
@@ -1370,7 +1377,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Converting sectors in track {track.Sequence}";
ProgressText = string.Format(UI.Converting_sectors_in_track_0, track.Sequence);
ProgressValue++;
Progress2Text = "";
Progress2Indeterminate = false;
@@ -1395,9 +1402,11 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting sectors {sectors + track.StartSector} to {
sectors + sectorsToDo + track.StartSector} in track {track.Sequence} ({
(sectors + track.StartSector) / (double)_inputFormat.Info.Sectors:P2} done)";
Progress2Text = string.Format(UI.Converting_sectors_0_to_1_in_track_2_3_done,
sectors + track.StartSector,
sectors + sectorsToDo + track.StartSector, track.Sequence,
(sectors + track.StartSector) /
(double)_inputFormat.Info.Sectors);
Progress2Value = (int)(sectors / SectorsValue);
});
@@ -1424,16 +1433,15 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).
ShowDialog(_view));
@@ -1460,16 +1468,15 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading sector {1}, continuing...", errno,
doneSectors);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_sector_1_continuing, errno, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno} reading sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).
ShowDialog(_view));
@@ -1483,16 +1490,18 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_sector_1_continuing,
outputFormat.ErrorMessage, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} writing sector {doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_sector_1_not_continuing,
outputFormat.
ErrorMessage,
doneSectors),
icon: Icon.Error).ShowDialog(_view));
return;
@@ -1504,8 +1513,8 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting sectors {_inputFormat.Info.Sectors} to {_inputFormat.Info.Sectors
} in track {tracks.Count} ({1.0:P2} done)";
Progress2Text = string.Format(UI.Converting_sectors_0_to_1_in_track_2_3_done, _inputFormat.Info.Sectors,
_inputFormat.Info.Sectors, tracks.Count, 1.0);
Progress2Value = Progress2MaxValue;
});
@@ -1561,15 +1570,16 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading tag, continuing...", errno);
AaruConsole.ErrorWriteLine(UI.Error_0_reading_media_tag, errno);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () =>
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno
} reading tag, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_media_tag_not_continuing,
errno),
icon: Icon.Error).
ShowDialog(_view));
@@ -1584,17 +1594,18 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} writing tag, continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_tag_continuing,
outputFormat.ErrorMessage);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () =>
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.
ErrorMessage
} writing tag, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_tag_not_continuing,
outputFormat.
ErrorMessage),
icon: Icon.Error).
ShowDialog(_view));
@@ -1620,9 +1631,11 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Text = $"Converting tag {tag} for sectors {sectors + track.StartSector} to {
sectors + sectorsToDo + track.StartSector} in track {track.Sequence} ({
(sectors + track.StartSector) / (double)_inputFormat.Info.Sectors:P2} done)";
Progress2Text = string.Format(UI.Converting_tag_0_for_sectors_1_to_2_in_track_3_4_done, tag,
sectors + track.StartSector,
sectors + sectorsToDo + track.StartSector, track.Sequence,
(sectors + track.StartSector) /
(double)_inputFormat.Info.Sectors);
Progress2Value = (int)(sectors / SectorsValue);
});
@@ -1645,17 +1658,16 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} reading tag for sector {1}, continuing...", errno,
AaruConsole.ErrorWriteLine(UI.Error_0_reading_tag_for_sector_1_continuing, errno,
doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {errno
} reading tag for sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_reading_tag_for_sector_1_not_continuing,
errno, doneSectors),
icon: Icon.Error).
ShowDialog(_view));
@@ -1668,18 +1680,18 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
warning = true;
AaruConsole.ErrorWriteLine("Error {0} writing tag for sector {1}, continuing...",
AaruConsole.ErrorWriteLine(UI.Error_0_writing_tag_for_sector_1_continuing,
outputFormat.ErrorMessage, doneSectors);
}
else
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.
ErrorMessage
} writing tag for sector {
doneSectors
}, not continuing...",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_writing_tag_for_sector_1_not_continuing,
outputFormat.
ErrorMessage,
doneSectors),
icon: Icon.Error).
ShowDialog(_view));
@@ -1705,15 +1717,14 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Writing dump hardware list to output image.";
ProgressText = UI.Writing_dump_hardware_list;
ProgressValue++;
});
ret = outputFormat.SetDumpHardware(_dumpHardware);
if(!ret)
AaruConsole.WriteLine("Error {0} writing dump hardware list to output image.",
outputFormat.ErrorMessage);
AaruConsole.WriteLine(UI.Error_0_writing_dump_hardware_list_to_output_image, outputFormat.ErrorMessage);
}
ret = false;
@@ -1723,20 +1734,19 @@ public sealed class ImageConvertViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Writing CICM XML metadata to output image.";
ProgressText = UI.Writing_CICM_XML_metadata_to_output_image;
ProgressValue++;
});
outputFormat.SetCicmMetadata(_cicmMetadata);
if(!ret)
AaruConsole.WriteLine("Error {0} writing CICM XML metadata to output image.",
outputFormat.ErrorMessage);
AaruConsole.WriteLine(UI.Error_0_writing_CICM_XML_metadata_to_output_image, outputFormat.ErrorMessage);
}
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Closing output image.";
ProgressText = UI.Closing_output_image;
ProgressIndeterminate = true;
});
@@ -1745,7 +1755,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(action: async () =>
{
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "Operation canceled, the output file is not correct.",
GetMessageBoxStandardWindow(UI.Title_Error, UI.Operation_canceled_the_output_file_is_not_correct,
icon: Icon.Error).ShowDialog(_view);
CloseVisible = true;
@@ -1759,9 +1769,11 @@ public sealed class ImageConvertViewModel : ViewModelBase
if(!outputFormat.Close())
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage
} closing output image... Contents are not correct.",
GetMessageBoxStandardWindow(UI.Title_Error,
string.
Format(UI.Error_0_closing_output_image_Contents_are_not_correct,
outputFormat.
ErrorMessage),
icon: Icon.Error).
ShowDialog(_view));
@@ -1770,12 +1782,11 @@ public sealed class ImageConvertViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(action: async () =>
{
await MessageBoxManager.GetMessageBoxStandardWindow(warning ? "Warning" : "Conversion success",
warning
? "Some warnings happened. Check console for more information. Image should be correct."
: "Image converted successfully.",
icon: warning ? Icon.Warning : Icon.Info).
ShowDialog(_view);
await MessageBoxManager.
GetMessageBoxStandardWindow(warning ? UI.Title_Warning : UI.Title_Conversion_success,
warning ? UI.Some_warnings_happened_Check_console
: UI.Image_converted_successfully,
icon: warning ? Icon.Warning : Icon.Info).ShowDialog(_view);
CloseVisible = true;
StopVisible = false;
@@ -1934,7 +1945,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
var dlgDestination = new SaveFileDialog
{
Title = "Choose destination file"
Title = UI.Dialog_Choose_destination_file
};
dlgDestination.Filters?.Add(new FileDialogFilter
@@ -1989,7 +2000,7 @@ public sealed class ImageConvertViewModel : ViewModelBase
void ExecuteCicmXmlFromImageCommand()
{
CicmXmlText = "<From image>";
CicmXmlText = UI._From_image_;
_cicmMetadata = _inputFormat.CicmMetadata;
}
@@ -2000,12 +2011,12 @@ public sealed class ImageConvertViewModel : ViewModelBase
var dlgMetadata = new OpenFileDialog
{
Title = "Choose existing metadata sidecar"
Title = UI.Dialog_Choose_existing_metadata_sidecar
};
dlgMetadata.Filters?.Add(new FileDialogFilter
{
Name = "CICM XML metadata",
Name = UI.Dialog_CICM_XML_metadata,
Extensions = new List<string>(new[]
{
".xml"
@@ -2029,14 +2040,14 @@ public sealed class ImageConvertViewModel : ViewModelBase
}
catch
{
await MessageBoxManager.GetMessageBoxStandardWindow("Error", "Incorrect metadata sidecar file...",
await MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Incorrect_metadata_sidecar_file,
icon: Icon.Error).ShowDialog(_view);
}
}
void ExecuteResumeFileFromImageCommand()
{
ResumeFileText = "<From image>";
ResumeFileText = UI._From_image_;
_dumpHardware = _inputFormat.DumpHardware;
}
@@ -2047,12 +2058,12 @@ public sealed class ImageConvertViewModel : ViewModelBase
var dlgMetadata = new OpenFileDialog
{
Title = "Choose existing resume file"
Title = UI.Dialog_Choose_existing_resume_file
};
dlgMetadata.Filters?.Add(new FileDialogFilter
{
Name = "CICM XML metadata",
Name = UI.Dialog_CICM_XML_metadata,
Extensions = new List<string>(new[]
{
".xml"
@@ -2079,14 +2090,16 @@ public sealed class ImageConvertViewModel : ViewModelBase
}
else
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "Resume file does not contain dump hardware information...",
GetMessageBoxStandardWindow(UI.Title_Error,
UI.Resume_file_does_not_contain_dump_hardware_information,
icon: Icon.Error).ShowDialog(_view);
sr.Close();
}
catch
{
await MessageBoxManager.GetMessageBoxStandardWindow("Error", "Incorrect resume file...", icon: Icon.Error).
await MessageBoxManager.
GetMessageBoxStandardWindow(UI.Title_Error, UI.Incorrect_resume_file, icon: Icon.Error).
ShowDialog(_view);
}
}

View File

@@ -40,6 +40,7 @@ using Aaru.CommonTypes.Interfaces;
using Aaru.Console;
using Aaru.Core;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using ReactiveUI;
@@ -109,17 +110,16 @@ public sealed class ImageEntropyViewModel : ViewModelBase
}
}
public string DuplicatedSectorsLabel =>
"Calculates how many sectors are duplicated (have same exact data in user area).";
public string SeparatedTracksLabel => "Calculates entropy for each track separately.";
public string WholeDiscLabel => "Calculates entropy for the whole disc.";
public string TrackEntropyLabel => "Track entropy";
public string TrackLabel => "Track";
public string EntropyLabel => "Entropy";
public string UniqueSectorsLabel => "Unique sectors";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string DuplicatedSectorsLabel => UI.Calculates_how_many_sectors_are_duplicated;
public string SeparatedTracksLabel => UI.Calculates_entropy_for_each_track_separately;
public string WholeDiscLabel => UI.Calculates_entropy_for_the_whole_disc;
public string TrackEntropyLabel => UI.Title_Track_entropy;
public string TrackLabel => Localization.Core.Title_Track;
public string EntropyLabel => UI.Title_Entropy;
public string UniqueSectorsLabel => UI.Title_Unique_sectors;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public bool SeparatedTracksVisible
{
@@ -290,7 +290,7 @@ public sealed class ImageEntropyViewModel : ViewModelBase
}
[JetBrains.Annotations.NotNull]
public string Title => "Calculating entropy";
public string Title => UI.Title_Calculating_entropy;
public ObservableCollection<TrackEntropyModel> TrackEntropy { get; }
public ReactiveCommand<Unit, Unit> StartCommand { get; }
public ReactiveCommand<Unit, Unit> CloseCommand { get; }
@@ -315,7 +315,7 @@ public sealed class ImageEntropyViewModel : ViewModelBase
if(WholeDiscChecked && _inputFormat is IOpticalMediaImage { Sessions.Count: > 1 })
{
AaruConsole.ErrorWriteLine("Calculating disc entropy of multisession images is not yet implemented.");
AaruConsole.ErrorWriteLine(UI.Calculating_disc_entropy_of_multisession_images_is_not_yet_implemented);
WholeDiscChecked = false;
}
@@ -328,10 +328,10 @@ public sealed class ImageEntropyViewModel : ViewModelBase
foreach(EntropyResults trackEntropy in _tracksEntropy)
{
AaruConsole.WriteLine("Entropy for track {0} is {1:F4}.", trackEntropy.Track, trackEntropy.Entropy);
AaruConsole.WriteLine(UI.Entropy_for_track_0_is_1, trackEntropy.Track, trackEntropy.Entropy);
if(trackEntropy.UniqueSectors != null)
AaruConsole.WriteLine("Track {0} has {1} unique sectors ({2:P3})", trackEntropy.Track,
AaruConsole.WriteLine(UI.Track_0_has_1_unique_sectors_2, trackEntropy.Track,
trackEntropy.UniqueSectors,
(double)trackEntropy.UniqueSectors / trackEntropy.Sectors);
}
@@ -370,14 +370,14 @@ public sealed class ImageEntropyViewModel : ViewModelBase
if(WholeDiscChecked != true)
return;
MediaEntropyText = $"Entropy for disk is {_entropy.Entropy:F4}.";
MediaEntropyText = string.Format(UI.Entropy_for_disk_is_0, _entropy.Entropy);
MediaEntropyVisible = true;
if(_entropy.UniqueSectors == null)
return;
MediaUniqueSectorsText = $"Disk has {_entropy.UniqueSectors} unique sectors ({
(double)_entropy.UniqueSectors / _entropy.Sectors:P3})";
MediaUniqueSectorsText = string.Format(UI.Disk_has_0_unique_sectors_1, _entropy.UniqueSectors,
(double)_entropy.UniqueSectors / _entropy.Sectors);
MediaUniqueSectorsVisible = true;
}

View File

@@ -42,6 +42,7 @@ using System.Xml.Serialization;
using Aaru.CommonTypes.Interfaces;
using Aaru.Console;
using Aaru.Core;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using ReactiveUI;
@@ -98,11 +99,11 @@ public sealed class ImageSidecarViewModel : ViewModelBase
StopCommand = ReactiveCommand.Create(ExecuteStopCommand);
}
public string DestinationFileLabel => "Destination file";
public string ChooseLabel => "Choose...";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string DestinationFileLabel => UI.Title_Destination_file;
public string ChooseLabel => UI.ButtonLabel_Choose;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public string Title { get; }
public ReactiveCommand<Unit, Task> DestinationCommand { get; }
@@ -251,7 +252,7 @@ public sealed class ImageSidecarViewModel : ViewModelBase
_sidecarClass.EndProgressEvent2 += EndProgress2;
CICMMetadataType sidecar = _sidecarClass.Create();
AaruConsole.WriteLine("Writing metadata sidecar");
AaruConsole.WriteLine(Localization.Core.Writing_metadata_sidecar);
var xmlFs = new FileStream(DestinationText, FileMode.Create);
@@ -324,7 +325,7 @@ public sealed class ImageSidecarViewModel : ViewModelBase
void ExecuteStopCommand()
{
ProgressText = "Aborting...";
ProgressText = Localization.Core.Aborting;
StopEnabled = false;
_sidecarClass.Abort();
}
@@ -333,12 +334,12 @@ public sealed class ImageSidecarViewModel : ViewModelBase
{
var dlgDestination = new SaveFileDialog
{
Title = "Choose destination file"
Title = UI.Dialog_Choose_destination_file
};
dlgDestination.Filters?.Add(new FileDialogFilter
{
Name = "CICM XML metadata",
Name = UI.Dialog_CICM_XML_metadata,
Extensions = new List<string>(new[]
{
"*.xml"

View File

@@ -41,6 +41,7 @@ using Aaru.CommonTypes.Structs;
using Aaru.Console;
using Aaru.Core;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using ReactiveUI;
@@ -106,12 +107,12 @@ public sealed class ImageVerifyViewModel : ViewModelBase
OptionsVisible = true;
}
public string VerifyImageLabel => "Verify disc image if supported.";
public string VerifySectorsLabel => "Verify all sectors if supported.";
public string LBALabel => "LBA";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string VerifyImageLabel => UI.Verify_disc_image_if_supported;
public string VerifySectorsLabel => UI.Verify_all_sectors_if_supported;
public string LBALabel => UI.Title_LBA;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public ObservableCollection<LbaModel> ErrorList { get; }
public ObservableCollection<LbaModel> UnknownList { get; }
@@ -402,13 +403,13 @@ public sealed class ImageVerifyViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
ImageResultVisible = true;
ImageResultText = "Disc image does not support verification.";
ImageResultText = UI.Disc_image_does_not_support_verification;
});
else
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = "Checking media image...";
ProgressText = UI.Checking_media_image;
if(VerifySectorsChecked)
ProgressValue = 1;
@@ -430,13 +431,13 @@ public sealed class ImageVerifyViewModel : ViewModelBase
ImageResultText = discCheckStatus switch
{
true => "Disc image checksums are correct",
false => "Disc image checksums are incorrect",
null => "Disc image does not contain checksums"
true => UI.Disc_image_checksums_are_correct,
false => UI.Disc_image_checksums_are_incorrect,
null => UI.Disc_image_does_not_contain_checksums
};
});
AaruConsole.VerboseWriteLine("Checking disc image checksums took {0} seconds", checkTime.TotalSeconds);
AaruConsole.VerboseWriteLine(UI.Checking_disc_image_checksums_took_0_seconds, checkTime.TotalSeconds);
}
}
@@ -465,7 +466,8 @@ public sealed class ImageVerifyViewModel : ViewModelBase
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
ProgressText = $"Verifying track {currentTrack.Sequence} of {inputOptical.Tracks.Count}";
ProgressText = string.Format(UI.Verifying_track_0_of_1, currentTrack.Sequence,
inputOptical.Tracks.Count);
ProgressValue++;
});
@@ -493,8 +495,8 @@ public sealed class ImageVerifyViewModel : ViewModelBase
{
Progress2Value = all / 512d;
Progress2Text = $"Checking sector {all} of {_inputFormat.Info.Sectors}, on track {
currentTrack.Sequence}";
Progress2Text = string.Format(UI.Checking_sector_0_of_1_on_track_2, all,
_inputFormat.Info.Sectors, currentTrack.Sequence);
});
List<ulong> tempFailingLbas;
@@ -554,7 +556,7 @@ public sealed class ImageVerifyViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
Progress2Value = (int)(sector / 512);
Progress2Text = $"Checking sector {sector} of {_inputFormat.Info.Sectors}";
Progress2Text = string.Format(UI.Checking_sector_0_of_1, sector, _inputFormat.Info.Sectors);
});
List<ulong> tempFailingLbas;
@@ -587,7 +589,7 @@ public sealed class ImageVerifyViewModel : ViewModelBase
}
TimeSpan checkTime = endCheck - startCheck;
AaruConsole.VerboseWriteLine("Checking sector checksums took {0} seconds", checkTime.TotalSeconds);
AaruConsole.VerboseWriteLine(UI.Checking_sector_checksums_took_0_seconds, checkTime.TotalSeconds);
await Dispatcher.UIThread.InvokeAsync(() =>
{
@@ -596,11 +598,11 @@ public sealed class ImageVerifyViewModel : ViewModelBase
if(failingLbas.Count == (int)_inputFormat.Info.Sectors)
{
SectorsErrorsAllVisible = true;
SectorsErrorsAllText = "All sectors contain errors";
SectorsErrorsAllText = UI.All_sectors_contain_errors;
}
else
{
SectorErrorsText = "LBAs with error:";
SectorErrorsText = UI.LBAs_with_error;
SectorErrorsVisible = true;
foreach(ulong t in failingLbas)
@@ -616,11 +618,11 @@ public sealed class ImageVerifyViewModel : ViewModelBase
if(unknownLbas.Count == (int)_inputFormat.Info.Sectors)
{
SectorsUnknownAllVisible = true;
SectorsUnknownAllText = "All sectors are unknown";
SectorsUnknownAllText = UI.All_sectors_are_unknown;
}
else
{
SectorsUnknownsText = "Unknown LBAs:";
SectorsUnknownsText = UI.Unknown_LBAs;
SectorsUnknownsVisible = true;
foreach(ulong t in unknownLbas)
@@ -632,11 +634,12 @@ public sealed class ImageVerifyViewModel : ViewModelBase
}
SectorSummaryVisible = true;
TotalSectorsText = $"Total sectors........... {_inputFormat.Info.Sectors}";
TotalSectorErrorsText = $"Total errors............ {failingLbas.Count}";
TotalSectorUnknownsText = $"Total unknowns.......... {unknownLbas.Count}";
TotalSectorsText = string.Format(UI.Total_sectors, _inputFormat.Info.Sectors);
TotalSectorErrorsText = string.Format(UI.Total_errors, failingLbas.Count);
TotalSectorUnknownsText = string.Format(UI.Total_unknowns, unknownLbas.Count);
TotalSectorErrorsUnknownsText = $"Total errors+unknowns... {failingLbas.Count + unknownLbas.Count}";
TotalSectorErrorsUnknownsText =
string.Format(UI.Total_errors_plus_unknowns, failingLbas.Count + unknownLbas.Count);
});
}

View File

@@ -53,6 +53,7 @@ using Aaru.Gui.ViewModels.Panels;
using Aaru.Gui.Views.Dialogs;
using Aaru.Gui.Views.Panels;
using Aaru.Gui.Views.Windows;
using Aaru.Localization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
@@ -113,7 +114,7 @@ public sealed class MainWindowViewModel : ViewModelBase
_imagesRoot = new ImagesRootModel
{
Name = "Images"
Name = UI.Title_Images
};
TreeRoot.Add(_imagesRoot);
@@ -125,7 +126,7 @@ public sealed class MainWindowViewModel : ViewModelBase
case PlatformID.FreeBSD:
_devicesRoot = new DevicesRootModel
{
Name = "Devices"
Name = UI.Title_Devices
};
TreeRoot.Add(_devicesRoot);
@@ -162,27 +163,27 @@ public sealed class MainWindowViewModel : ViewModelBase
_ejectIcon = new Bitmap(_assets.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/media-eject.png")));
}
public string FileLabel => "_File";
public string OpenLabel => "_Open";
public string SettingsLabel => "_Settings";
public string ExitLabel => "E_xit";
public string DevicesLabel => "_Devices";
public string RefreshDevicesLabel => "_Refresh";
public string WindowLabel => "_Window";
public string ConsoleLabel => "_Console";
public string HelpLabel => "_Help";
public string EncodingsLabel => "_Encodings";
public string PluginsLabel => "_Plugins";
public string StatisticsLabel => "_Statistics";
public string AboutLabel => "_About";
public string RefreshDevicesFullLabel => "_Refresh devices";
public string CloseAllImagesLabel => "_Close all images";
public string CalculateEntropyLabel => "Calculate entropy";
public string VerifyImageLabel => "Verify";
public string ChecksumImageLabel => "Checksum";
public string CreateSidecarLabel => "Create CICM XML sidecar...";
public string ViewImageSectorsLabel => "View sectors";
public string DecodeImageMediaTagsLabel => "Decode media tags";
public string FileLabel => UI.Menu_File;
public string OpenLabel => UI.Menu_Open;
public string SettingsLabel => UI.Menu_Settings;
public string ExitLabel => UI.Menu_Exit;
public string DevicesLabel => UI.Menu_Devices;
public string RefreshDevicesLabel => UI.Menu_Refresh;
public string WindowLabel => UI.Menu_Window;
public string ConsoleLabel => UI.Menu_Console;
public string HelpLabel => UI.Menu_Help;
public string EncodingsLabel => UI.Menu_Encodings;
public string PluginsLabel => UI.Menu_Plugins;
public string StatisticsLabel => UI.Menu_Statistics;
public string AboutLabel => UI.Menu_About;
public string RefreshDevicesFullLabel => UI.Menu_Refresh_devices;
public string CloseAllImagesLabel => UI.Menu_Close_all_images;
public string CalculateEntropyLabel => UI.ButtonLabel_Calculate_entropy;
public string VerifyImageLabel => UI.ButtonLabel_Verify;
public string ChecksumImageLabel => UI.ButtonLabel_Checksum;
public string CreateSidecarLabel => UI.ButtonLabel_Create_CICM_XML_sidecar;
public string ViewImageSectorsLabel => UI.ButtonLabel_View_sectors;
public string DecodeImageMediaTagsLabel => UI.ButtonLabel_Decode_media_tags;
public bool DevicesSupported
{
@@ -195,7 +196,7 @@ public sealed class MainWindowViewModel : ViewModelBase
IClassicDesktopStyleApplicationLifetime)?.MainWindow);
[NotNull]
public string Greeting => "Welcome to Aaru!";
public string Greeting => UI.Welcome_to_Aaru;
public ObservableCollection<RootModel> TreeRoot { get; }
public ReactiveCommand<Unit, Unit> AboutCommand { get; }
public ReactiveCommand<Unit, Unit> ConsoleCommand { get; }
@@ -271,7 +272,7 @@ public sealed class MainWindowViewModel : ViewModelBase
switch(dev)
{
case null:
ContentPanel = $"Error {devErrno} opening device";
ContentPanel = string.Format(UI.Error_0_opening_device, devErrno);
return;
case Devices.Remote.Device remoteDev:
@@ -285,7 +286,7 @@ public sealed class MainWindowViewModel : ViewModelBase
if(dev.Error)
{
ContentPanel = $"Error {dev.LastError} opening device";
ContentPanel = string.Format(UI.Error_0_opening_device, dev.LastError);
return;
}
@@ -298,7 +299,7 @@ public sealed class MainWindowViewModel : ViewModelBase
deviceModel.Media.Add(new MediaModel
{
NonRemovable = true,
Name = "Non-removable device commands not yet implemented"
Name = UI.Non_removable_device_commands_not_yet_implemented
});
else
{
@@ -310,7 +311,7 @@ public sealed class MainWindowViewModel : ViewModelBase
{
NoMediaInserted = true,
Icon = _ejectIcon,
Name = "No media inserted"
Name = UI.No_media_inserted
});
else
{
@@ -339,11 +340,11 @@ public sealed class MainWindowViewModel : ViewModelBase
break;
}
case MediaModel { NonRemovable: true }:
ContentPanel = "Non-removable device commands not yet implemented";
ContentPanel = UI.Non_removable_device_commands_not_yet_implemented;
break;
case MediaModel { NoMediaInserted: true }:
ContentPanel = "No media inserted";
ContentPanel = UI.No_media_inserted;
break;
case MediaModel mediaModel:
@@ -484,7 +485,8 @@ public sealed class MainWindowViewModel : ViewModelBase
!ctx.Partitions.Any() &&
!ctx.SeenDevices.Any())
{
MessageBoxManager.GetMessageBoxStandardWindow("Warning", "There are no statistics.").ShowDialog(_view);
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Warning, UI.There_are_no_statistics).
ShowDialog(_view);
return;
}
@@ -520,7 +522,7 @@ public sealed class MainWindowViewModel : ViewModelBase
// TODO: Extensions
var dlgOpenImage = new OpenFileDialog
{
Title = "Choose image to open",
Title = UI.Dialog_Choose_image_to_open,
AllowMultiple = false
};
@@ -534,7 +536,7 @@ public sealed class MainWindowViewModel : ViewModelBase
if(inputFilter == null)
{
MessageBoxManager.GetMessageBoxStandardWindow("Error", "Cannot open specified file.", ButtonEnum.Ok,
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Cannot_open_specified_file, ButtonEnum.Ok,
Icon.Error);
return;
@@ -544,13 +546,13 @@ public sealed class MainWindowViewModel : ViewModelBase
{
if(ImageFormat.Detect(inputFilter) is not IMediaImage imageFormat)
{
MessageBoxManager.GetMessageBoxStandardWindow("Error", "Image format not identified.", ButtonEnum.Ok,
Icon.Error);
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Image_format_not_identified,
ButtonEnum.Ok, Icon.Error);
return;
}
AaruConsole.WriteLine("Image format identified by {0} ({1}).", imageFormat.Name, imageFormat.Id);
AaruConsole.WriteLine(UI.Image_format_identified_by_0_1, imageFormat.Name, imageFormat.Id);
try
{
@@ -558,11 +560,12 @@ public sealed class MainWindowViewModel : ViewModelBase
if(opened != ErrorNumber.NoError)
{
MessageBoxManager.GetMessageBoxStandardWindow("Error", $"Error {opened} opening image format.",
ButtonEnum.Ok, Icon.Error);
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error,
string.Format(UI.Error_0_opening_image_format,
opened), ButtonEnum.Ok, Icon.Error);
AaruConsole.ErrorWriteLine("Unable to open image format");
AaruConsole.ErrorWriteLine("No error given");
AaruConsole.ErrorWriteLine(UI.Unable_to_open_image_format);
AaruConsole.ErrorWriteLine(UI.No_error_given);
return;
}
@@ -595,13 +598,13 @@ public sealed class MainWindowViewModel : ViewModelBase
if(partitions.Count == 0)
{
AaruConsole.DebugWriteLine("Fs-info command", "No partitions found");
AaruConsole.DebugWriteLine("Fs-info command", UI.No_partitions_found);
checkRaw = true;
}
else
{
AaruConsole.WriteLine("{0} partitions found.", partitions.Count);
AaruConsole.WriteLine(UI._0_partitions_found, partitions.Count);
foreach(string scheme in partitions.Select(p => p.Scheme).Distinct().OrderBy(s => s))
{
@@ -622,15 +625,15 @@ public sealed class MainWindowViewModel : ViewModelBase
ViewModel = new PartitionViewModel(partition)
};
AaruConsole.WriteLine("Identifying filesystem on partition");
AaruConsole.WriteLine(UI.Identifying_filesystems_on_partition);
Core.Filesystems.Identify(imageFormat, out idPlugins, partition);
if(idPlugins.Count == 0)
AaruConsole.WriteLine("Filesystem not identified");
AaruConsole.WriteLine(UI.Filesystem_not_identified);
else
{
AaruConsole.WriteLine($"Identified by {idPlugins.Count} plugins");
AaruConsole.WriteLine(string.Format(UI.Identified_by_0_plugins, idPlugins.Count));
foreach(string pluginName in idPlugins)
if(plugins.PluginsList.TryGetValue(pluginName, out plugin))
@@ -688,7 +691,7 @@ public sealed class MainWindowViewModel : ViewModelBase
{
var wholePart = new CommonTypes.Partition
{
Name = "Whole device",
Name = Localization.Core.Whole_device,
Length = imageFormat.Info.Sectors,
Size = imageFormat.Info.Sectors * imageFormat.Info.SectorSize
};
@@ -696,10 +699,10 @@ public sealed class MainWindowViewModel : ViewModelBase
Core.Filesystems.Identify(imageFormat, out idPlugins, wholePart);
if(idPlugins.Count == 0)
AaruConsole.WriteLine("Filesystem not identified");
AaruConsole.WriteLine(UI.Filesystem_not_identified);
else
{
AaruConsole.WriteLine($"Identified by {idPlugins.Count} plugins");
AaruConsole.WriteLine(string.Format(UI.Identified_by_0_plugins, idPlugins.Count));
foreach(string pluginName in idPlugins)
if(plugins.PluginsList.TryGetValue(pluginName, out plugin))
@@ -753,20 +756,20 @@ public sealed class MainWindowViewModel : ViewModelBase
}
catch(Exception ex)
{
MessageBoxManager.GetMessageBoxStandardWindow("Error", "Unable to open image format.", ButtonEnum.Ok,
Icon.Error);
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Unable_to_open_image_format,
ButtonEnum.Ok, Icon.Error);
AaruConsole.ErrorWriteLine("Unable to open image format");
AaruConsole.ErrorWriteLine("Error: {0}", ex.Message);
AaruConsole.DebugWriteLine("Image-info command", "Stack trace: {0}", ex.StackTrace);
AaruConsole.ErrorWriteLine(UI.Unable_to_open_image_format);
AaruConsole.ErrorWriteLine(UI.Error_0, ex.Message);
AaruConsole.DebugWriteLine("Image-info command", Localization.Core.Stack_trace_0, ex.StackTrace);
}
}
catch(Exception ex)
{
MessageBoxManager.GetMessageBoxStandardWindow("Error", "Exception reading file.", ButtonEnum.Ok,
MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, UI.Exception_reading_file, ButtonEnum.Ok,
Icon.Error);
AaruConsole.ErrorWriteLine($"Error reading file: {ex.Message}");
AaruConsole.ErrorWriteLine(string.Format(UI.Error_reading_file_0, ex.Message));
AaruConsole.DebugWriteLine("Image-info command", ex.StackTrace);
}
@@ -784,14 +787,14 @@ public sealed class MainWindowViewModel : ViewModelBase
try
{
AaruConsole.WriteLine("Refreshing devices");
AaruConsole.WriteLine(UI.Refreshing_devices);
_devicesRoot.Devices.Clear();
foreach(Devices.DeviceInfo device in Device.ListDevices().Where(d => d.Supported).OrderBy(d => d.Vendor).
ThenBy(d => d.Model))
{
AaruConsole.DebugWriteLine("Main window",
"Found supported device model {0} by manufacturer {1} on bus {2} and path {3}",
UI.Found_supported_device_model_0_by_manufacturer_1_on_bus_2_and_path_3,
device.Model, device.Vendor, device.Bus, device.Path);
var deviceModel = new DeviceModel

View File

@@ -51,6 +51,7 @@ using Aaru.Core.Logging;
using Aaru.Core.Media.Info;
using Aaru.Devices;
using Aaru.Gui.Models;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Threading;
using DynamicData;
@@ -240,24 +241,24 @@ public sealed class MediaDumpViewModel : ViewModelBase
_devicePath = devicePath;
}
public string OutputFormatLabel => "Output format";
public string ChooseLabel => "Choose...";
public string StopOnErrorLabel => "Stop media dump on first error";
public string ForceLabel => "Continue dumping whatever happens";
public string RetriesLabel => "Retry passes";
public string PersistentLabel => "Try to recover partial or incorrect data";
public string ResumeLabel => "Create/use resume mapfile";
public string Track1PregapLabel => "Try to read track 1 pregap";
public string SkippedLabel => "Skipped sectors on error";
public string SidecarLabel => "Create CICM XML metadata sidecar";
public string TrimLabel => "Trim errors from skipped sectors";
public string ExistingMetadataLabel => "Take metadata from existing CICM XML sidecar";
public string EncodingLabel => "Encoding to use on metadata sidecar creation";
public string DestinationLabel => "Writing image to:";
public string LogLabel => "Log";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string OutputFormatLabel => UI.Output_format;
public string ChooseLabel => UI.ButtonLabel_Choose;
public string StopOnErrorLabel => UI.Stop_media_dump_on_first_error;
public string ForceLabel => UI.Continue_dumping_whatever_happens;
public string RetriesLabel => UI.Retry_passes;
public string PersistentLabel => UI.Try_to_recover_partial_or_incorrect_data;
public string ResumeLabel => UI.Create_use_resume_mapfile;
public string Track1PregapLabel => UI.Try_to_read_track_1_pregap;
public string SkippedLabel => UI.Skipped_sectors_on_error;
public string SidecarLabel => UI.Create_CICM_XML_metadata_sidecar;
public string TrimLabel => UI.Trim_errors_from_skipped_sectors;
public string ExistingMetadataLabel => UI.Take_metadata_from_existing_CICM_XML_sidecar;
public string EncodingLabel => UI.Encoding_to_use_on_metadata_sidecar_creation;
public string DestinationLabel => UI.Writing_image_to;
public string LogLabel => UI.Title_Log;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public ReactiveCommand<Unit, Unit> StartCommand { get; }
public ReactiveCommand<Unit, Unit> CloseCommand { get; }
@@ -501,12 +502,12 @@ public sealed class MediaDumpViewModel : ViewModelBase
var dlgMetadata = new OpenFileDialog
{
Title = "Choose existing metadata sidecar"
Title = UI.Dialog_Choose_existing_metadata_sidecar
};
dlgMetadata.Filters?.Add(new FileDialogFilter
{
Name = "CICM XML metadata",
Name = UI.Dialog_CICM_XML_metadata,
Extensions = new List<string>(new[]
{
".xml"
@@ -536,7 +537,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
_ = MessageBoxManager.
// ReSharper restore AssignmentIsFullyDiscarded
GetMessageBoxStandardWindow("Error", "Incorrect metadata sidecar file...", ButtonEnum.Ok,
GetMessageBoxStandardWindow(UI.Title_Error, UI.Incorrect_metadata_sidecar_file, ButtonEnum.Ok,
Icon.Error).ShowDialog(_view).Result;
ExistingMetadata = false;
@@ -659,7 +660,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
var dlgDestination = new SaveFileDialog
{
Title = "Choose destination file"
Title = UI.Dialog_Choose_destination_file
};
dlgDestination.Filters?.Add(new FileDialogFilter
@@ -702,7 +703,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
catch
{
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", "Incorrect resume file, cannot use it...", ButtonEnum.Ok,
GetMessageBoxStandardWindow(UI.Title_Error, UI.Incorrect_resume_file_cannot_use_it, ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
Resume = false;
@@ -716,8 +717,8 @@ public sealed class MediaDumpViewModel : ViewModelBase
return;
await MessageBoxManager.
GetMessageBoxStandardWindow("Warning",
"Media already dumped correctly, please choose another destination...",
GetMessageBoxStandardWindow(UI.Title_Warning,
UI.Media_already_dumped_correctly_please_choose_another_destination,
ButtonEnum.Ok, Icon.Warning).ShowDialog(_view);
Resume = false;
@@ -742,14 +743,14 @@ public sealed class MediaDumpViewModel : ViewModelBase
DestinationEnabled = false;
OptionsVisible = false;
UpdateStatus("Opening device...");
UpdateStatus(UI.Opening_device);
_dev = Device.Create(_devicePath, out ErrorNumber devErrno);
switch(_dev)
{
case null:
StoppingErrorMessage($"Error {devErrno} opening device.");
StoppingErrorMessage(string.Format(UI.Error_0_opening_device, devErrno));
return;
case Devices.Remote.Device remoteDev:
@@ -762,7 +763,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
if(_dev.Error)
{
StoppingErrorMessage($"Error {_dev.LastError} opening device.");
StoppingErrorMessage(string.Format(UI.Error_0_opening_device, _dev.LastError));
return;
}
@@ -772,7 +773,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
if(SelectedPlugin is null)
{
StoppingErrorMessage("Cannot open output plugin.");
StoppingErrorMessage(UI.Cannot_open_output_plugin);
return;
}
@@ -786,7 +787,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
}
catch(ArgumentException)
{
StoppingErrorMessage("Specified encoding is not supported.");
StoppingErrorMessage(UI.Specified_encoding_is_not_supported);
return;
}
@@ -824,7 +825,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
var dumpLog = new DumpLog(_outputPrefix + ".log", _dev, false);
dumpLog.WriteLine("Output image format: {0}.", SelectedPlugin.Name);
dumpLog.WriteLine(UI.Output_image_format_0, SelectedPlugin.Name);
var errorLog = new ErrorLog(_outputPrefix + ".error.log");
@@ -922,7 +923,7 @@ public sealed class MediaDumpViewModel : ViewModelBase
{
ErrorMessage(text);
await MessageBoxManager.GetMessageBoxStandardWindow("Error", $"{text}", ButtonEnum.Ok, Icon.Error).
await MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, $"{text}", ButtonEnum.Ok, Icon.Error).
ShowDialog(_view);
await WorkFinished();

View File

@@ -39,6 +39,7 @@ using Aaru.CommonTypes.Enums;
using Aaru.Core;
using Aaru.Core.Devices.Scanning;
using Aaru.Devices;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Media;
using Avalonia.Threading;
@@ -111,12 +112,12 @@ public sealed class MediaScanViewModel : ViewModelBase
LineColor = Colors.Yellow;
}
public string SpeedLabel => "Stop";
public string KbsLabel => "Kb/s";
public string BlockLabel => "Block";
public string StartLabel => "Start";
public string CloseLabel => "Close";
public string StopLabel => "Stop";
public string SpeedLabel => UI.ButtonLabel_Stop;
public string KbsLabel => UI.Kb_s;
public string BlockLabel => UI.Title_Block;
public string StartLabel => UI.ButtonLabel_Start;
public string CloseLabel => UI.ButtonLabel_Close;
public string StopLabel => UI.ButtonLabel_Stop;
public Color AxesColor
{
@@ -344,8 +345,8 @@ public sealed class MediaScanViewModel : ViewModelBase
{
case null:
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", $"Error {devErrno} opening device.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error, string.Format(UI.Error_0_opening_device, devErrno),
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
StopVisible = false;
StartVisible = true;
@@ -364,8 +365,8 @@ public sealed class MediaScanViewModel : ViewModelBase
if(dev.Error)
{
await MessageBoxManager.
GetMessageBoxStandardWindow("Error", $"Error {dev.LastError} opening device.", ButtonEnum.Ok,
Icon.Error).ShowDialog(_view);
GetMessageBoxStandardWindow(UI.Title_Error, string.Format(UI.Error_0_opening_device, dev.LastError),
ButtonEnum.Ok, Icon.Error).ShowDialog(_view);
StopVisible = false;
StartVisible = true;
@@ -394,18 +395,21 @@ public sealed class MediaScanViewModel : ViewModelBase
await Dispatcher.UIThread.InvokeAsync(() =>
{
TotalTime = $"Took a total of {results.TotalTime} seconds ({results.ProcessingTime} processing commands).";
TotalTime = string.Format(Localization.Core.Took_a_total_of_0_seconds_1_processing_commands,
results.TotalTime, results.ProcessingTime);
AvgSpeed = $"Average speed: {results.AvgSpeed:F3} MiB/sec.";
MaxSpeed = $"Fastest speed burst: {results.MaxSpeed:F3} MiB/sec.";
MinSpeed = $"Slowest speed burst: {results.MinSpeed:F3} MiB/sec.";
A = $"{results.A} sectors took less than 3 ms.";
B = $"{results.B} sectors took less than 10 ms but more than 3 ms.";
C = $"{results.C} sectors took less than 50 ms but more than 10 ms.";
D = $"{results.D} sectors took less than 150 ms but more than 50 ms.";
E = $"{results.E} sectors took less than 500 ms but more than 150 ms.";
F = $"{results.F} sectors took more than 500 ms.";
UnreadableSectors = $"{results.UnreadableSectors.Count} sectors could not be read.";
AvgSpeed = string.Format(Localization.Core.Average_speed_0_MiB_sec, results.AvgSpeed);
MaxSpeed = string.Format(Localization.Core.Fastest_speed_burst_0_MiB_sec, results.MaxSpeed);
MinSpeed = string.Format(Localization.Core.Slowest_speed_burst_0_MiB_sec, results.MinSpeed);
A = string.Format(Localization.Core._0_sectors_took_less_than_3_ms, results.A);
B = string.Format(Localization.Core._0_sectors_took_less_than_10_ms_but_more_than_3_ms, results.B);
C = string.Format(Localization.Core._0_sectors_took_less_than_50_ms_but_more_than_10_ms, results.C);
D = string.Format(Localization.Core._0_sectors_took_less_than_150_ms_but_more_than_50_ms, results.D);
E = string.Format(Localization.Core._0_sectors_took_less_than_500_ms_but_more_than_150_ms, results.E);
F = string.Format(Localization.Core._0_sectors_took_more_than_500_ms, results.F);
UnreadableSectors = string.Format(Localization.Core._0_sectors_could_not_be_read,
results.UnreadableSectors.Count);
});
// TODO: Show list of unreadable sectors
@@ -589,7 +593,7 @@ public sealed class MediaScanViewModel : ViewModelBase
{
ProgressText = text;
await MessageBoxManager.GetMessageBoxStandardWindow("Error", $"{text}", ButtonEnum.Ok, Icon.Error).
await MessageBoxManager.GetMessageBoxStandardWindow(UI.Title_Error, $"{text}", ButtonEnum.Ok, Icon.Error).
ShowDialog(_view);
await WorkFinished();
@@ -605,7 +609,7 @@ public sealed class MediaScanViewModel : ViewModelBase
async void OnScanUnreadable(ulong sector) => await Dispatcher.UIThread.InvokeAsync(() =>
{
_localResults.Errored += _blocksToRead;
UnreadableSectors = $"{_localResults.Errored} sectors could not be read.";
UnreadableSectors = string.Format(Localization.Core._0_sectors_could_not_be_read, _localResults.Errored);
BlockMapList.Add((sector / _blocksToRead, double.NaN));
});
@@ -642,11 +646,11 @@ public sealed class MediaScanViewModel : ViewModelBase
break;
}
A = $"{_localResults.A} sectors took less than 3 ms.";
B = $"{_localResults.B} sectors took less than 10 ms but more than 3 ms.";
C = $"{_localResults.C} sectors took less than 50 ms but more than 10 ms.";
D = $"{_localResults.D} sectors took less than 150 ms but more than 50 ms.";
E = $"{_localResults.E} sectors took less than 500 ms but more than 150 ms.";
F = $"{_localResults.F} sectors took more than 500 ms.";
A = string.Format(Localization.Core._0_sectors_took_less_than_3_ms, _localResults.A);
B = string.Format(Localization.Core._0_sectors_took_less_than_10_ms_but_more_than_3_ms, _localResults.B);
C = string.Format(Localization.Core._0_sectors_took_less_than_50_ms_but_more_than_10_ms, _localResults.C);
D = string.Format(Localization.Core._0_sectors_took_less_than_150_ms_but_more_than_50_ms, _localResults.D);
E = string.Format(Localization.Core._0_sectors_took_less_than_500_ms_but_more_than_150_ms, _localResults.E);
F = string.Format(Localization.Core._0_sectors_took_more_than_500_ms, _localResults.F);
});
}

View File

@@ -42,6 +42,7 @@ using Aaru.Database;
using Aaru.Gui.ViewModels.Dialogs;
using Aaru.Gui.Views.Dialogs;
using Aaru.Gui.Views.Windows;
using Aaru.Localization;
using Aaru.Settings;
using Avalonia.Threading;
using Microsoft.EntityFrameworkCore;
@@ -78,7 +79,7 @@ public sealed class SplashWindowViewModel : ViewModelBase
internal void OnOpened()
{
Message = "Welcome to Aaru!";
Message = UI.Welcome_to_Aaru;
MaxProgress = 9;
CurrentProgress = 0;
@@ -88,12 +89,12 @@ public sealed class SplashWindowViewModel : ViewModelBase
void InitializeConsole()
{
CurrentProgress++;
Message = "Initializing console...";
Message = UI.Initializing_console;
Task.Run(() =>
{
ConsoleHandler.Init();
AaruConsole.WriteLine("Aaru started!");
AaruConsole.WriteLine(UI.Aaru_started);
Dispatcher.UIThread.Post(LoadSettings);
});
@@ -102,8 +103,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void LoadSettings()
{
CurrentProgress++;
Message = "Loading settings...";
AaruConsole.WriteLine("Loading settings...");
Message = UI.Loading_settings;
AaruConsole.WriteLine(UI.Loading_settings);
Task.Run(() =>
{
@@ -117,8 +118,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void MigrateLocalDatabase()
{
CurrentProgress++;
Message = "Migrating local database...";
AaruConsole.WriteLine("Migrating local database...");
Message = UI.Migrating_local_database;
AaruConsole.WriteLine(UI.Migrating_local_database);
Task.Run(() =>
{
@@ -181,8 +182,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void UpdateMainDatabase()
{
CurrentProgress++;
Message = "Updating main database...";
AaruConsole.WriteLine("Updating main database...");
Message = UI.Updating_main_database;
AaruConsole.WriteLine(UI.Updating_main_database);
Task.Run(() =>
{
@@ -194,7 +195,7 @@ public sealed class SplashWindowViewModel : ViewModelBase
if(mainContext.Database.GetPendingMigrations().Any())
{
AaruConsole.WriteLine("New database version, updating...");
AaruConsole.WriteLine(UI.New_database_version_updating);
try
{
@@ -202,9 +203,9 @@ public sealed class SplashWindowViewModel : ViewModelBase
}
catch(Exception)
{
AaruConsole.ErrorWriteLine("Exception trying to remove old database version, cannot continue...");
AaruConsole.ErrorWriteLine(UI.Exception_trying_to_remove_old_database_version);
AaruConsole.ErrorWriteLine("Please manually remove file at {0}", Settings.Settings.MainDbPath);
AaruConsole.ErrorWriteLine(UI.Please_manually_remove_file_at_0, Settings.Settings.MainDbPath);
return;
}
@@ -220,8 +221,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
async void CheckGdprCompliance()
{
CurrentProgress++;
Message = "Checking GDPR compliance...";
AaruConsole.WriteLine("Checking GDPR compliance...");
Message = UI.Checking_GDPR_compliance;
AaruConsole.WriteLine(UI.Checking_GDPR_compliance);
if(Settings.Settings.Current.GdprCompliance < DicSettings.GDPR_LEVEL)
{
@@ -237,8 +238,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void LoadStatistics()
{
CurrentProgress++;
Message = "Loading statistics...";
AaruConsole.WriteLine("Loading statistics...");
Message = UI.Loading_statistics;
AaruConsole.WriteLine(UI.Loading_statistics);
Task.Run(() =>
{
@@ -251,8 +252,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void RegisterEncodings()
{
CurrentProgress++;
Message = "Registering encodings...";
AaruConsole.WriteLine("Registering encodings...");
Message = UI.Registering_encodings;
AaruConsole.WriteLine(UI.Registering_encodings);
Task.Run(() =>
{
@@ -265,8 +266,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void SaveStatistics()
{
CurrentProgress++;
Message = "Saving statistics...";
AaruConsole.WriteLine("Saving statistics...");
Message = UI.Saving_statistics;
AaruConsole.WriteLine(UI.Saving_statistics);
Task.Run(() =>
{
@@ -279,8 +280,8 @@ public sealed class SplashWindowViewModel : ViewModelBase
void LoadMainWindow()
{
CurrentProgress++;
Message = "Loading main window...";
AaruConsole.WriteLine("Loading main window...");
Message = UI.Loading_main_window;
AaruConsole.WriteLine(UI.Loading_main_window);
WorkFinished?.Invoke(this, EventArgs.Empty);
}

View File

@@ -33,6 +33,7 @@
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers;
using Aaru.Localization;
using JetBrains.Annotations;
using ReactiveUI;
@@ -64,8 +65,8 @@ public sealed class ViewSectorViewModel : ViewModelBase
SectorNumber = 0;
}
public string SectorLabel => "Sector";
public string LongSectorLabel => "Show long sector";
public string SectorLabel => UI.Title_Sector;
public string LongSectorLabel => UI.Show_long_sector;
public string Title
{

View File

@@ -129,22 +129,26 @@
<TextBlock Grid.Row="0" Text="{Binding ReadableLabel}" FontWeight="Bold" />
<DataGrid Grid.Row="1" Items="{Binding Images}" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="UUID" Binding="{Binding Uuid}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="Version" Binding="{Binding Version}" Width="Auto"
<DataGridTextColumn Header="{Binding NameLabel}" Binding="{Binding Name}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="Author" Binding="{Binding Author}" Width="Auto"
<DataGridTextColumn Header="{Binding UUIDLabel}" Binding="{Binding Uuid}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="{Binding VersionLabel}" Binding="{Binding Version}"
Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="{Binding AuthorLabel}" Binding="{Binding Author}" Width="Auto"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
<TextBlock Grid.Row="2" Text="{Binding WritableLabel}" FontWeight="Bold" />
<DataGrid Grid.Row="3" Items="{Binding WritableImages}" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="UUID" Binding="{Binding Uuid}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="Version" Binding="{Binding Version}" Width="Auto"
<DataGridTextColumn Header="{Binding NameLabel}" Binding="{Binding Name}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="Author" Binding="{Binding Author}" Width="Auto"
<DataGridTextColumn Header="{Binding UUIDLabel}" Binding="{Binding Uuid}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="{Binding VersionLabel}" Binding="{Binding Version}"
Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="{Binding AuthorLabel}" Binding="{Binding Author}" Width="Auto"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
@@ -162,11 +166,13 @@
<TextBlock Grid.Row="0" Text="{Binding ReadableLabel}" FontWeight="Bold" />
<DataGrid Grid.Row="1" Items="{Binding FloppyImages}" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="UUID" Binding="{Binding Uuid}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="Version" Binding="{Binding Version}" Width="Auto"
<DataGridTextColumn Header="{Binding NameLabel}" Binding="{Binding Name}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="Author" Binding="{Binding Author}" Width="Auto"
<DataGridTextColumn Header="{Binding UUIDLabel}" Binding="{Binding Uuid}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="{Binding VersionLabel}" Binding="{Binding Version}"
Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="{Binding AuthorLabel}" Binding="{Binding Author}" Width="Auto"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
@@ -174,11 +180,13 @@
<DataGrid Grid.Row="3" Items="{Binding WritableFloppyImages}"
HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="UUID" Binding="{Binding Uuid}" Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="Version" Binding="{Binding Version}" Width="Auto"
<DataGridTextColumn Header="{Binding NameLabel}" Binding="{Binding Name}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="Author" Binding="{Binding Author}" Width="Auto"
<DataGridTextColumn Header="{Binding UUIDLabel}" Binding="{Binding Uuid}" Width="Auto"
IsReadOnly="True" />
<DataGridTextColumn Header="{Binding VersionLabel}" Binding="{Binding Version}"
Width="Auto" IsReadOnly="True" />
<DataGridTextColumn Header="{Binding AuthorLabel}" Binding="{Binding Author}" Width="Auto"
IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>

View File

@@ -365,7 +365,7 @@ sealed class DeviceInfoCommand : Command
if(dev.Type != DeviceType.ATAPI)
AaruConsole.WriteLine($"[bold]{UI.Title_SCSI_device}[/]");
DataFile.WriteTo("Device-Info command", outputPrefix, "_scsi_inquiry.bin", "SCSI INQUIRY",
DataFile.WriteTo("Device-Info command", outputPrefix, "_scsi_inquiry.bin", UI.Title_SCSI_INQUIRY,
devInfo.ScsiInquiryData);
AaruConsole.WriteLine(Inquiry.Prettify(devInfo.ScsiInquiry));
@@ -1026,7 +1026,7 @@ sealed class DeviceInfoCommand : Command
if(devInfo.DensitySupportHeader.HasValue)
{
AaruConsole.WriteLine("Densities supported by device:");
AaruConsole.WriteLine(UI.Densities_supported_by_device);
AaruConsole.WriteLine(DensitySupport.PrettifyDensity(devInfo.DensitySupportHeader));
}
}
@@ -1038,7 +1038,7 @@ sealed class DeviceInfoCommand : Command
if(devInfo.MediaTypeSupportHeader.HasValue)
{
AaruConsole.WriteLine("Medium types supported by device:");
AaruConsole.WriteLine(UI.Medium_types_supported_by_device);
AaruConsole.WriteLine(DensitySupport.PrettifyMediumType(devInfo.MediaTypeSupportHeader));
}

View File

@@ -267,7 +267,7 @@ sealed class FilesystemInfoCommand : Command
table.AddRow(UI.Title_Name, Markup.Escape(partitionsList[i].Name ?? ""));
table.AddRow(UI.Title_Type, Markup.Escape(partitionsList[i].Type ?? ""));
table.AddRow(UI.Title_Start,
table.AddRow(Localization.Core.Title_Start,
string.Format(UI.sector_0_byte_1, partitionsList[i].Start,
partitionsList[i].Offset));

View File

@@ -302,7 +302,7 @@ sealed class ConvertImageCommand : Command
}
catch(Exception ex)
{
AaruConsole.ErrorWriteLine(UI.Incorrect_metadata_sidecar_file);
AaruConsole.ErrorWriteLine(UI.Incorrect_metadata_sidecar_file_not_continuing);
AaruConsole.DebugWriteLine("Image conversion", $"{ex}");
return (int)ErrorNumber.InvalidSidecar;
@@ -326,7 +326,7 @@ sealed class ConvertImageCommand : Command
}
catch(Exception ex)
{
AaruConsole.ErrorWriteLine(UI.Incorrect_resume_file);
AaruConsole.ErrorWriteLine(UI.Incorrect_resume_file_not_continuing);
AaruConsole.DebugWriteLine("Image conversion", $"{ex}");
return (int)ErrorNumber.InvalidResume;

View File

@@ -498,7 +498,7 @@ sealed class DumpMediaCommand : Command
}
catch
{
AaruConsole.ErrorWriteLine(UI.Incorrect_metadata_sidecar_file);
AaruConsole.ErrorWriteLine(UI.Incorrect_metadata_sidecar_file_not_continuing);
if(isResponse)
continue;

View File

@@ -364,7 +364,7 @@ sealed class MediaInfoCommand : Command
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_dvdram_dds.bin",
"SCSI READ DISC STRUCTURE", scsiInfo.DvdRamDds);
AaruConsole.WriteLine($"[bold]{Localization.Core.Disc_Definition_Structure}:[/]",
AaruConsole.WriteLine($"[bold]{UI.Disc_Definition_Structure}:[/]",
$"\n{Markup.Escape(DDS.Prettify(scsiInfo.DvdRamDds))}");
}
@@ -382,7 +382,7 @@ sealed class MediaInfoCommand : Command
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_dvdram_spare.bin",
"SCSI READ DISC STRUCTURE", scsiInfo.DvdRamSpareArea);
AaruConsole.WriteLine($"[bold]{Localization.Core.Spare_Area_Information}:[/]",
AaruConsole.WriteLine($"[bold]{UI.Spare_Area_Information}:[/]",
$"\n{Markup.Escape(Spare.Prettify(scsiInfo.DvdRamSpareArea))}");
}
@@ -533,7 +533,7 @@ sealed class MediaInfoCommand : Command
scsiInfo.Toc);
if(scsiInfo.DecodedToc.HasValue)
AaruConsole.WriteLine($"[bold]{Localization.Core.TOC}:[/]",
AaruConsole.WriteLine($"[bold]{UI.Title_TOC}:[/]",
$"\n{Markup.Escape(TOC.Prettify(scsiInfo.DecodedToc))}");
}
@@ -543,7 +543,7 @@ sealed class MediaInfoCommand : Command
scsiInfo.Atip);
if(scsiInfo.DecodedAtip != null)
AaruConsole.WriteLine($"[bold]{Localization.Core.ATIP}:[/]",
AaruConsole.WriteLine($"[bold]{UI.Title_ATIP}:[/]",
$"\n{Markup.Escape(ATIP.Prettify(scsiInfo.DecodedAtip))}");
}