diff --git a/MPF.Avalonia/App.axaml b/MPF.Avalonia/App.axaml
new file mode 100644
index 000000000..f64c761b3
--- /dev/null
+++ b/MPF.Avalonia/App.axaml
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #FFF5F5F5
+ #FF111111
+ #FF111111
+ #FFFFFFFF
+ #FFD0D0D0
+ #FFE5E5E5
+ #FFEDEDED
+ #FFD8D8D8
+ #FFE2E2E2
+ #FFB8B8B8
+ #FF9F9F9F
+ #FF8E8E8E
+ #FFD2D2D2
+ #FF8A8A8A
+ #00FFFFFF
+ #FFFFFFFF
+ #FFD0D0D0
+ #FFEDEDED
+ #FFD8D8D8
+ #FFE5E5E5
+ #FFD0D0D0
+ #FF202020
+ #FFF0F0F0
+
+
diff --git a/MPF.Avalonia/App.axaml.cs b/MPF.Avalonia/App.axaml.cs
new file mode 100644
index 000000000..fd247f960
--- /dev/null
+++ b/MPF.Avalonia/App.axaml.cs
@@ -0,0 +1,30 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+using MPF.Frontend;
+using MPF.Frontend.Tools;
+using MPF.Avalonia.Services;
+using MPF.Avalonia.Windows;
+
+namespace MPF.Avalonia
+{
+ public partial class App : Application
+ {
+ public override void Initialize()
+ {
+ Name = "MPF";
+ AvaloniaXamlLoader.Load(this);
+ StringResourceLoader.Load(Resources, InterfaceLanguage.English);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ ThemeService.ApplySystemTheme(Resources, OptionsLoader.LoadFromConfig());
+
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ desktop.MainWindow = new MainWindow();
+
+ base.OnFrameworkInitializationCompleted();
+ }
+ }
+}
diff --git a/MPF.Avalonia/Controls/MeasuredDropDownComboBox.cs b/MPF.Avalonia/Controls/MeasuredDropDownComboBox.cs
new file mode 100644
index 000000000..10852c53a
--- /dev/null
+++ b/MPF.Avalonia/Controls/MeasuredDropDownComboBox.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Collections;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Layout;
+
+namespace MPF.Avalonia.Controls
+{
+ public class MeasuredDropDownComboBox : ComboBox
+ {
+ private const double DropDownButtonWidth = 24;
+ private const double ClosedComboBoxChromeWidth = 30;
+ private const double ShortClosedComboBoxChromeWidth = 44;
+ private const int ShortClosedTextThreshold = 24;
+ private const double OpenComboBoxChromeWidth = 44;
+
+ public static readonly StyledProperty SizeToWidestItemProperty =
+ AvaloniaProperty.Register(nameof(SizeToWidestItem));
+
+ public static readonly StyledProperty SizeToSelectedItemProperty =
+ AvaloniaProperty.Register(nameof(SizeToSelectedItem));
+
+ public static readonly StyledProperty IgnoreHeaderItemsInMeasurementProperty =
+ AvaloniaProperty.Register(nameof(IgnoreHeaderItemsInMeasurement));
+
+ private Popup? _popup;
+ private double _measuredDropDownWidth;
+
+ protected override Type StyleKeyOverride => typeof(ComboBox);
+
+ public bool SizeToWidestItem
+ {
+ get => GetValue(SizeToWidestItemProperty);
+ set => SetValue(SizeToWidestItemProperty, value);
+ }
+
+ public bool SizeToSelectedItem
+ {
+ get => GetValue(SizeToSelectedItemProperty);
+ set => SetValue(SizeToSelectedItemProperty, value);
+ }
+
+ public bool IgnoreHeaderItemsInMeasurement
+ {
+ get => GetValue(IgnoreHeaderItemsInMeasurementProperty);
+ set => SetValue(IgnoreHeaderItemsInMeasurementProperty, value);
+ }
+
+ public MeasuredDropDownComboBox()
+ {
+ DropDownOpened += OnDropDownOpened;
+ DropDownClosed += OnDropDownClosed;
+ AttachedToVisualTree += (_, _) => UpdateMeasuredWidth();
+ }
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ base.OnApplyTemplate(e);
+ _popup = e.NameScope.Find("PART_Popup");
+
+ Control? dropDownButton = e.NameScope.Find("DropDownButton")
+ ?? e.NameScope.Find("PART_DropDownButton");
+
+ if (dropDownButton is not null)
+ {
+ dropDownButton.Width = DropDownButtonWidth;
+ dropDownButton.MinWidth = DropDownButtonWidth;
+ dropDownButton.MaxWidth = DropDownButtonWidth;
+ dropDownButton.HorizontalAlignment = HorizontalAlignment.Right;
+
+ if (dropDownButton is Button button)
+ button.Padding = new Thickness(0);
+ }
+ }
+
+ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
+ {
+ base.OnPropertyChanged(change);
+
+ if (change.Property == ItemsSourceProperty || change.Property == FontFamilyProperty
+ || change.Property == FontSizeProperty || change.Property == FontStyleProperty
+ || change.Property == FontWeightProperty || change.Property == SizeToWidestItemProperty
+ || change.Property == SizeToSelectedItemProperty
+ || change.Property == IgnoreHeaderItemsInMeasurementProperty)
+ {
+ _measuredDropDownWidth = 0;
+ UpdateMeasuredWidth();
+ }
+ else if (change.Property == SelectedItemProperty)
+ {
+ UpdateMeasuredWidth();
+ }
+ }
+
+ private void OnDropDownOpened(object? sender, EventArgs e)
+ {
+ double measuredWidth = GetMeasuredDropDownWidth();
+
+ if (SizeToSelectedItem && measuredWidth > 0)
+ Width = measuredWidth;
+
+ if (_popup?.Child is not Control child)
+ return;
+
+ child.MinWidth = Math.Max(child.MinWidth, measuredWidth);
+ }
+
+ private void OnDropDownClosed(object? sender, EventArgs e)
+ {
+ UpdateMeasuredWidth();
+ }
+
+ private void UpdateMeasuredWidth()
+ {
+ if (!SizeToWidestItem && !SizeToSelectedItem)
+ return;
+
+ double measuredWidth = SizeToSelectedItem && !IsDropDownOpen
+ ? MeasureSelectedItemWidth()
+ : GetMeasuredDropDownWidth();
+
+ if (measuredWidth > 0)
+ Width = measuredWidth;
+ }
+
+ private double GetMeasuredDropDownWidth()
+ {
+ if (_measuredDropDownWidth > 0)
+ return _measuredDropDownWidth;
+
+ double maxWidth = 0;
+ IEnumerable? items = ItemsSource as IEnumerable ?? Items;
+ if (items is null)
+ return maxWidth;
+
+ foreach (object? item in items)
+ {
+ if (ShouldSkipItem(item))
+ continue;
+
+ maxWidth = Math.Max(maxWidth, MeasureItemWidth(item, OpenComboBoxChromeWidth));
+ }
+
+ _measuredDropDownWidth = Math.Ceiling(maxWidth);
+ return _measuredDropDownWidth;
+ }
+
+ private double MeasureSelectedItemWidth()
+ {
+ string selectedText = SelectedItem?.ToString() ?? string.Empty;
+ double chromeWidth = selectedText.Length <= ShortClosedTextThreshold
+ ? ShortClosedComboBoxChromeWidth
+ : ClosedComboBoxChromeWidth;
+
+ return MeasureItemWidth(SelectedItem, chromeWidth);
+ }
+
+ private double MeasureItemWidth(object? item, double chromeWidth)
+ {
+ if (item is null)
+ return 0;
+
+ var textBlock = new TextBlock
+ {
+ Text = item.ToString() ?? string.Empty,
+ FontFamily = FontFamily,
+ FontSize = FontSize,
+ FontStyle = FontStyle,
+ FontWeight = global::Avalonia.Media.FontWeight.SemiBold,
+ };
+
+ textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
+ return Math.Ceiling(textBlock.DesiredSize.Width + chromeWidth);
+ }
+
+ private bool ShouldSkipItem(object? item)
+ {
+ if (!IgnoreHeaderItemsInMeasurement || item is null)
+ return false;
+
+ object? isHeader = item.GetType().GetProperty("IsHeader")?.GetValue(item);
+ return isHeader is true;
+ }
+ }
+}
diff --git a/MPF.Avalonia/ElementConverter.cs b/MPF.Avalonia/ElementConverter.cs
new file mode 100644
index 000000000..59cce5e18
--- /dev/null
+++ b/MPF.Avalonia/ElementConverter.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Globalization;
+using Avalonia.Data.Converters;
+using MPF.Frontend;
+using MPF.Frontend.ComboBoxItems;
+using SabreTools.RedumpLib.Data;
+using LogCompression = MPF.Processors.LogCompression;
+using RedumperDriveType = MPF.ExecutionContexts.Redumper.DriveType;
+using RedumperReadMethod = MPF.ExecutionContexts.Redumper.ReadMethod;
+using RedumperSectorOrder = MPF.ExecutionContexts.Redumper.SectorOrder;
+
+namespace MPF.Avalonia
+{
+ internal sealed class ElementConverter : IValueConverter
+ {
+ public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ return value switch
+ {
+ DiscCategory discCategory => new Element(discCategory),
+ InterfaceLanguage interfaceLanguage => new Element(interfaceLanguage),
+ InternalProgram internalProgram => new Element(internalProgram),
+ LogCompression logCompression => new Element(logCompression),
+ MediaType mediaType => new Element(mediaType),
+ RedumperReadMethod readMethod => new Element(readMethod),
+ RedumperSectorOrder sectorOrder => new Element(sectorOrder),
+ RedumperDriveType driveType => new Element(driveType),
+ RedumpSystem redumpSystem => new RedumpSystemComboBoxItem(redumpSystem),
+ Region region => new Element(region),
+ _ => new RedumpSystemComboBoxItem((RedumpSystem?)null),
+ };
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is not IElement element)
+ return null;
+
+ return element switch
+ {
+ Element dcElement => dcElement.Value,
+ Element ilElement => ilElement.Value,
+ Element ipElement => ipElement.Value,
+ Element lcElement => lcElement.Value,
+ Element mtElement => mtElement.Value,
+ Element rmElement => rmElement.Value,
+ Element soElement => soElement.Value,
+ Element dtElement => dtElement.Value,
+ RedumpSystemComboBoxItem rsElement => rsElement.Value,
+ Element reElement => reElement.Value,
+ _ => null,
+ };
+ }
+ }
+}
diff --git a/MPF.Avalonia/MPF.Avalonia.csproj b/MPF.Avalonia/MPF.Avalonia.csproj
new file mode 100644
index 000000000..c4efa8522
--- /dev/null
+++ b/MPF.Avalonia/MPF.Avalonia.csproj
@@ -0,0 +1,62 @@
+
+
+
+
+ net5.0;net6.0;net7.0;net8.0;net9.0;net10.0
+ WinExe
+ ..\MPF.UI\Images\Icon.ico
+ false
+ false
+ true
+ latest
+ NU1902;NU1903
+ enable
+ true
+ true
+ 3.7.1
+
+
+ MPF
+ Matt Nadareski;ReignStumble;Jakz
+ Frontend for various dumping programs
+ Copyright (c) Matt Nadareski 2019-2026
+ https://github.com/SabreTools/
+ https://github.com/SabreTools/MPF
+ git
+ MIT
+
+
+
+
+ win-x86;win-x64
+
+
+ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64
+
+
+ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64
+
+
+ net6.0;net7.0;net8.0;net9.0;net10.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets\%(Filename)%(Extension)
+
+
+ Assets\%(Filename)%(Extension)
+
+
+
+
diff --git a/MPF.Avalonia/Program.cs b/MPF.Avalonia/Program.cs
new file mode 100644
index 000000000..4d118ecae
--- /dev/null
+++ b/MPF.Avalonia/Program.cs
@@ -0,0 +1,16 @@
+using Avalonia;
+
+namespace MPF.Avalonia
+{
+ internal static class Program
+ {
+ [System.STAThread]
+ public static void Main(string[] args)
+ => BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
+
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure()
+ .UsePlatformDetect()
+ .LogToTrace();
+ }
+}
diff --git a/MPF.Avalonia/Resources/Strings.37.xaml b/MPF.Avalonia/Resources/Strings.37.xaml
new file mode 100644
index 000000000..a2e02faaf
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.37.xaml
@@ -0,0 +1,236 @@
+
+
+
+ L37
+
+
+ 4cc3p7
+ 8r0wz3
+ C4nc31
+ M1n1m1z3
+ C10z3
+ z3771n9z
+ z747uz
+ W4RN1N9:
+ W4rn1n9
+ 3rr0r
+
+
+ M3d14 Pr3z3rv4710n Fr0n73nd
+
+ _F113
+ 3_x17
+ _7001z
+ _Ch3ck Dump
+ Cr3473 _Pz3 1RD
+ _0p710nz
+ _D38u9 1nf0 W1nd0w
+ _H31p
+ _480u7
+ _Ch3ck f0r Upd473z
+
+ zyz73m 7yp3
+ zyz73m/M3d14 7yp3
+ N0 zyz73m z313c73d
+ 0u7pu7 P47h
+ Dr1v3 13773r
+ Dr1v3 zp33d
+ Dump1n9 Pr09r4m
+ P4r4m373rz
+
+ C0n7r01z
+ z74r7 Dump1n9
+ z70p Dump1n9
+ zc4n f0r D1zcz
+ Upd473 14831
+ zc4n f0r Pr073c710n
+
+ 109 0u7pu7
+ C134r 109
+ z4v3 109
+
+
+ 0p710nz
+ W31c0m3 70 MPF, 3xp10r3 7h3 0p710nz
+ 1f y0u ch00z3 70 3n4813 v411d4710n 4nd 1nf0rm4710n r37r13v41, y0u 4r3 r3zp0nz1813 f0r 3nzur1n9 7h47 411 d474 p0pu1473d m47ch3z y0ur 4c7u41 m3d14. z0m3 1nf0rm4710n m4y 83 m4rk3d 70 ch3ck f0r v411d17y 4z 4 r3m1nd3r, 8u7 411 1nf0rm4710n zh0u1d 83 zu8j3c7 70 7h3 z4m3 zcru71ny.
+
+ 93n3r41
+ Uz3r 1n73rf4c3
+ 3n4813 D4rk M0d3
+ Ch3ck f0r Upd473z 0n z74r7up
+ C0py Upd473 UR1 70 C11p804rd
+ F4z7 Upd473 14831
+ D3f4u17 U1 14n9u493:
+ D373c710n
+ zk1p zyz73m D373c7
+ N0 F1x3d Dr1v3z
+ D3f4u17 zyz73m:
+ 10991n9
+ V3r80z3 10991n9
+ 4u70-0p3n 109z
+
+ P47hz
+ 44ru P47h
+ D1zc1m493Cr3470r P47h
+ R3dump3r P47h
+ D3f4u17 Dump1n9 Pr09r4m
+ D3f4u17 0u7pu7 P47h
+
+ Dump1n9
+ Dump1n9
+ zh0w D1zc 1nf0
+ Pu11 411 1nf0rm4710n
+ 3n4813 748 1npu7
+ 3n4813 R3dump C0mp47181117y
+ zh0w 3j3c7 R3m1nd3r
+ 4dd P14c3h01d3rz
+ 4dd F113n4m3 zuff1x
+ 0u7pu7 zu8m1zz10n Jz0N
+ [D38U9] 1nc1ud3 4r71f4c7z
+ C0mpr3zz 109 F113z
+ 109 C0mpr3zz10n:
+ D31373 Unn3c3zz4ry F113z
+ Cr3473 Pz3 1RD 4f73r Dump1n9
+ Pr073c710n
+ 3n4813 Pr073c710n zc4n
+ zc4n 4rch1v3 C0n73n7z
+ 1nc1ud3 D38u9 1nf0rm4710n
+ H1d3 Dr1v3 13773rz
+ D3f4u17 zp33dz
+ CD
+ DVD
+ HD-DVD
+ 8D
+
+ Pr09r4mz
+ 44ru
+ 3n4813 D38u9 0u7pu7
+ 3n4813 V3r80z3 0u7pu7
+ F0rc3 Dump1n9
+ z7r1p P3rz0n41 D474
+ R3r34d 7r13z:
+ D1zc1m493Cr3470r
+ Qu137 M0d3
+ P4r4n01d M0d3
+ Uz3 CM1 F149
+ Mu171-z3c70r R34d
+ Mu171-z3c70r R34d V41u3:
+ CD R3r34d 7r13z:
+ DVD/HD-DVD/8D R3r34d 7r13z:
+ R3dump3r
+ 3n4813 V3r80z3 0u7pu7
+ 3n4813 R3f1n3 z3c70r M0d3 F149
+ R3r34d 7r13z:
+ P13x70r 134d-1n R37r13z:
+ N0n-R3dump 0p710nz
+ D3f4u17 R34d M37h0d:
+ D3f4u17 z3c70r 0rd3r:
+ D3f4u17 Dr1v3 7yp3:
+
+ 1091n 1nf0
+ R37r13v41
+ R37r13v3 M47ch 1nf0rm4710n
+ R3dump
+ Uz3rn4m3
+ P4zzw0rd
+ 73z7 1091n
+
+
+ Ch3ck 3x1z71n9 Dump
+ 1npu7 P47h
+ Ch3ck Dump
+ Ch3ck w111 0v3rwr173 4ny 3x1z71n9 zu8m1zz10n 1nf0rm4710n f113z. P134z3 m4k3 84ckupz 0f 7h0z3 1f y0u n33d 70 83f0r3 runn1n9 Ch3ck.
+
+
+ Cr3473 Pz3 1RD
+ 1npu7
+ Pz3 1z0 P47h
+ *.937k3y.109 F113 P47h
+ M4nu411y d3f1n3 Pz3 D1zc 3ncryp710n K3y
+ H3x4d3c1m41 K3y
+ K3y F113 P47h
+ K3y z747uz
+ M4nu411y d3f1n3 Pz3 D1zc 1D
+ D1zc 1D
+ D1zc 1D z747uz
+ M4nu411y d3f1n3 P3rm4n3n7 1nf0rm4710n & C0n7r01 (P1C)
+ 14y3r8r34k (z3c70rz)
+ P1C
+ P1C F113 P47h
+ P1C z747uz
+ Cr3473 1RD
+
+
+ M3d14 1nf0rm4710n
+ R1n9 C0d3 9u1d3
+
+ C0mm0n 1nf0
+ C0mm0n M3d14 1nf0rm4710n
+ 71713
+ 4173rn471v3 71713
+ F0r319n 71713 (N0n-1471n)
+ 4173rn471v3 F0r319n 71713
+ D1zc Num83r / 13773r
+ D1zc 71713
+ D1zc 71713 (n0n-1471n)
+ C47390ry
+ R3910n
+ 14n9u493z
+ 14n9u493 z313c710n V14
+ z3r141
+ 84rc0d3
+ V3rz10n 4nd 3d1710nz
+ V3rz10n
+ 3d1710n
+ 3d1710n (n0n-1471n)
+
+ 4dd1710n41 1nf0
+ C0mm3n7z
+ C0mp471813 0z
+ Pr073c710n
+ 3x7r4z
+ Phyz1c41 1d3n71f13rz
+ Pu811zh3r 1d3n71f13rz
+
+ C0n73n7z
+
+ R1n9c0d3z
+ D474/10 1nf0
+ 14831/11 1nf0
+ 12 1nf0
+ 13 1nf0
+
+ R34d-0n1y 1nf0
+
+
+ R1n9 C0d3 9u1d3
+
+
+ 480u7
+ M3d14 Pr3z3rv4710n Fr0n73nd (MPF)
+ 4 c0mmun17y pr3z3rv4710n fr0n73nd d3v310p3d 1n C#.
+ zupp0r7z R3dump3r, 44ru, 4nd D1zc1m493Cr3470r.
+ 0r191n411y cr3473d 70 h31p 7h3 R3dump pr0j3c7.
+ 7h4nkz 70 3v3ry0n3 wh0 h4z zupp0r73d 7h1z pr0j3c7!
+ V3rz10n
+
+
+ V3rz10n Upd473 Ch3ck
+
+
+ 3j3c7
+ 17 1z n0w z4f3 70 3j3c7 7h3 d1zc
+
+
+ Qu17
+ 4 dump 1z z7111 831n9 pr0c3zz3d, 4r3 y0u zur3 y0u w4n7 70 qu17?
+
+
+ 3rr0r!
+ 4n 3xc3p710n 0ccurr3d, z33 7h3 109 f0r d37411z
+
+
+ D373c73d Pr073c710n(z)
+
+
diff --git a/MPF.Avalonia/Resources/Strings.de.xaml b/MPF.Avalonia/Resources/Strings.de.xaml
new file mode 100644
index 000000000..f5943dd69
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.de.xaml
@@ -0,0 +1,226 @@
+
+
+
+ DEU
+
+
+ OK
+ Öffnen
+ Abbrechen
+ Minimieren
+ Schließen
+ Einstellungen
+ Status
+ WARNUNG:
+ Warnung
+ Fehler
+
+
+
+ _Datei
+ _Beenden
+ _Tools
+ Dump _prüfen
+ PS3 _IRD erstellen
+ _Optionen
+ _Debug-Info-Fenster
+ _Hilfe
+ Ü_ber
+ _Nach Updates suchen
+
+ Systemtyp
+ System/Medientyp
+ Kein System ausgewählt
+ Ausgabepfad
+ Laufwerksbuchstabe
+ Laufwerksgeschwindigkeit
+ Dump Programm
+ Parameter
+
+ Steuerung
+ Dump starten
+ Dump stoppen
+ Nach Discs suchen
+ Label aktualisieren
+ Schutz prüfen
+
+ Protokollausgabe
+ Löschen
+ Speichern
+
+
+ Optionen
+ Willkommen bei MPF, erkunden Sie die Optionen
+ Wenn Sie die Validierung und Informationsabfrage aktivieren, sind Sie dafür verantwortlich, dass alle ausgefüllten Daten Ihren tatsächlichen Medien entsprechen. Einige Informationen können zur Überprüfung auf Gültigkeit markiert sein, aber alle Informationen sollten derselben Prüfung unterzogen werden.
+
+ Allgemein
+ Benutzeroberfläche
+ Dunkelmodus aktivieren
+ Beim Start nach Updates suchen
+ Update-URL in Zwischenablage kopieren
+ Schnelles Update-Label
+ Standard-Sprache der Benutzeroberfläche:
+ Erkennung
+ Systemerkennung überspringen
+ Keine festen Laufwerke
+ Standard-x:
+ Protokollierung
+ Detaillierte Protokollierung
+ Protokolle automatisch öffnen
+
+ Pfad
+ Aaru-Pfad
+ DiscImageCreator-Pfad
+ Redumper-Pfad
+ Standard-Dump-Programm
+ Standard-Ausgabepfad
+
+ Dumping
+ Dumping
+ Disc-Informationen anzeigen
+ Alle Informationen abrufen
+ Tab-Eingabe aktivieren
+ Redump-Kompatibilität aktivieren
+ Auswurferinnerung anzeigen
+ Platzhalter hinzufügen
+ Dateinamensuffix hinzufügen
+ JSON-Ausgabe für Einreichung
+ [DEBUG] Artefakte einbeziehen
+ Protokolldateien komprimieren
+ Protokollkompression:
+ Unnötige Dateien löschen
+ PS3 IRD nach Dumping erstellen
+ Schutz
+ Schutzscan aktivieren
+ Archivinhalt scannen
+ Debug-Informationen einbeziehen
+ Laufwerksbuchstaben ausblenden
+ Standardgeschwindigkeiten
+
+ Programme
+ Aaru
+ Debug-Ausgabe aktivieren
+ Detaillierte Ausgabe aktivieren
+ Dumping erzwingen
+ Persönliche Daten entfernen
+ Wiederholungsversuche:
+ DiscImageCreator
+ Leiser Modus
+ Paranoider Modus
+ CMI-Flag verwenden
+ Mehrsektor-Lesen
+ Wert für Mehrsektor-Lesen:
+ CD-Wiederholungsversuche:
+ DVD/HD-DVD/BD-Wiederholungsversuche:
+ Redumper
+ Detaillierte Ausgabe aktivieren
+ Refine-Sektor-Modus-Flag aktivieren
+ Wiederholungsversuche:
+ Plextor Lead-in Wiederholungen:
+ Nicht-Redump-Optionen
+ Standard-Lesemethode:
+ Standard-Sektorordnung:
+ Standard-Laufwerkstyp:
+ Standard-Laufwerk Pregap Start:
+
+ Login-Informationen
+ Abruf
+ Übereinstimmung informationen abrufen
+ Redump
+ Benutzername
+ Passwort
+ Login testen
+
+
+ Vorhandenen Dump prüfen
+ Eingabepfad
+ Dump prüfen
+ Die Prüfung überschreibt alle vorhandenen Einreichung Informationsdateien. Bitte erstellen Sie vorher ggf. Sicherungskopien.
+
+
+ PS3 IRD erstellen
+ Eingabe
+ PS3-ISO-Pfad
+ Pfad zur *.getkey.log-Datei
+ PS3-Disc-Verschlüsselungsschlüssel manuell definieren
+ Hexadezimaler Schlüssel
+ Schlüssel-Dateipfad
+ Schlüsselstatus
+ PS3-Disc-ID manuell definieren
+ Disc-ID
+ Disc-ID-Status
+ Permanent Information & Control (PIC) manuell definieren
+ Layerbreak (Sektoren)
+ PIC
+ PIC-Dateipfad
+ PIC-Status
+ IRD erstellen
+
+
+ Medieninformationen
+ Ring-Code-Leitfaden
+
+ Allgemeine Informationen
+ Allgemeine Medieninformationen
+ Titel
+ Alternativer Titel
+ Fremdtitel (Nicht-Latein)
+ Alternativer Fremdtitel
+ Disc-Nummer / Buchstabe
+ Disc-Titel
+ Disc-Titel (Nicht-Latein)
+ Kategorie
+ Region
+ Sprachen
+ Sprachauswahl über
+ Seriennummer
+ Barcode
+ Versionen und Editionen
+ Version
+ Edition
+ Edition (Nicht-Latein)
+
+ Zusätzliche Informationen
+ Kommentare
+ Kompatibles Betriebssystem
+ Schutz
+ Extras
+ Physische Kennungen
+ Publisher-Kennungen
+
+ Inhalt
+
+ Ringcodes
+ Daten/L0-Info
+ Label/L1-Info
+ L2-Info
+ L3-Info
+
+ Nur-Lese-Info
+
+
+ Ring-Code-Leitfaden
+
+
+ Über
+
+
+ Updateprüfung
+
+
+ Auswerfen
+ Das Auswerfen der Disc ist jetzt sicher
+
+
+ Beenden
+ Ein Dump wird noch verarbeitet. Möchten Sie wirklich beenden?
+
+
+ Fehler!
+ Eine Ausnahme ist aufgetreten. Details im Protokoll einsehen.
+
+
+ Erkannter Schutz
+
+
diff --git a/MPF.Avalonia/Resources/Strings.es.xaml b/MPF.Avalonia/Resources/Strings.es.xaml
new file mode 100644
index 000000000..42fc55592
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.es.xaml
@@ -0,0 +1,227 @@
+
+
+
+ SPA
+
+
+ Aceptar
+ Examinar
+ Cancelar
+ Minimizar
+ Cerrar
+ Configuración
+ Estado
+ ADVERTENCIA:
+ Advertencia
+ Error
+
+
+
+ _Archivo
+ _Salir
+ _Utilidades
+ _Comprobar volcado
+ Crear _PS3 IRD
+ _Opciones
+ _Ventana de depuración
+ _Ayuda
+ _Acerca de
+ _Buscar actualizaciones
+
+ Sistema
+ Sistema/Tipo de medio
+ Ningún sistema seleccionado
+ Ruta de salida
+ Letra de unidad
+ Velocidad de unidad
+ Programa de volcado
+ Parámetros
+
+ Controles
+ Iniciar volcado
+ Detener volcado
+ Buscar discos
+ Actualizar etiqueta
+ Buscar protección
+
+ Registro de salida
+ Borrar
+ Guardar
+
+
+ Opciones
+ Bienvenido a MPF, Explora las Opciones
+ Si eliges habilitar la validación y la recuperación de información, eres responsable de asegurar que todos los datos rellenados coincidan con tu medio real. Parte de la información puede estar marcada para verificar su validez como recordatorio, pero toda la información debe someterse al mismo escrutinio.
+
+ General
+ Interfaz de Usuario
+ Habilitar modo oscuro
+ Buscar actualizaciones al iniciar
+ Copiar URL de actualización
+ Etiqueta de actualización rápida
+ Idioma predeterminado de la interfaz:
+ Detección
+ Omitir detección de sistema
+ Sin unidades fijas
+ Sistema predeterminado:
+ Registro
+ Registro detallado
+ Abrir registros automáticamente
+
+ Rutas
+ Ruta de Aaru
+ Ruta de DiscImageCreator
+ Ruta de Redumper
+ Programa predeterminado
+ Ruta de salida predeterminada
+
+ Volcado
+ Volcado
+ Mostrar información del disco
+ Obtener toda la información
+ Habilitar entrada con Tab
+ Habilitar compatibilidad con Redump
+ Mostrar recordatorio de expulsión
+ Añadir marcadores de posición
+ Añadir sufijo al nombre de archivo
+ Generar JSON de envío
+ [DEBUG] Incluir artefactos
+ Comprimir archivos de registro
+ Compresión de registro:
+ Eliminar archivos innecesarios
+ Crear PS3 IRD tras volcado
+ Protección
+ Habilitar escaneo de protección
+ Escanear contenido de archivos
+ Incluir información de depuración
+ Ocultar letras de unidad
+ Velocidades predeterminadas
+
+ Programas
+ Aaru
+ Habilitar salida de depuración
+ Habilitar salida detallada
+ Forzar volcado
+ Eliminar datos personales
+ Intentos de relectura:
+ DiscImageCreator
+ Modo silencioso
+ Modo paranoico
+ Usar opción CMI
+ Lectura multi-sector
+ Valor de lectura multi-sector:
+ Intentos de relectura de CD:
+ Intentos de relectura de DVD/HD-DVD/BD:
+ Redumper
+ Habilitar salida detallada
+ Habilitar refinamiento de sectores
+ Intentos de relectura:
+ Reintentos de lead-in de Plextor:
+ Opciones fuera de Redump
+ Método de lectura predeterminado:
+ Orden de sectores predeterminado:
+ Tipo de unidad predeterminado:
+ Pregap Start de unidad predeterminada:
+
+ Información de acceso
+ Recuperación
+ Recuperar información de coincidencias
+ Redump
+ Usuario
+ Contraseña
+ Probar acceso
+
+
+ Comprobar volcado existente
+ Ruta de entrada
+ Comprobar
+ La comprobación sobrescribirá cualquier archivo de información de envío existente. Por favor, realiza copias de seguridad de esos archivos si las necesitas antes de ejecutar la comprobación.
+
+
+ Crear PS3 IRD
+ Entrada
+ Ruta del ISO de PS3
+ Ruta del archivo *.getkey.log
+ Definir manualmente la clave de cifrado del disco PS3
+ Clave hexadecimal
+ Ruta del archivo de clave
+ Estado de la clave
+ Definir manualmente el ID del disco PS3
+ ID del disco
+ Estado del ID del disco
+ Definir manualmente Permanent Information & Control (PIC)
+ Layerbreak (sectores)
+ PIC
+ Ruta del archivo PIC
+ Estado del PIC
+ Crear IRD
+
+
+ Información del medio
+ Guía de Ring Code
+
+ Información común
+ Información común del medio
+ Título
+ Título alternativo
+ Título extranjero (no latino)
+ Título extranjero alternativo
+ Número / letra del disco
+ Título del disco
+ Título del disco (no latino)
+ Categoría
+ Región
+ Idiomas
+ Selección de idioma mediante
+ Número de serie
+ Código de barras
+ Versiones y ediciones
+ Versión
+ Edición
+ Edición (no latina)
+
+ Información adicional
+ Comentarios
+ Sistemas compatibles
+ Protección
+ Extras
+ Identificadores físicos
+ Identificadores del editor
+
+ Contenido
+
+ Ringcodes
+ Datos/Info L0
+ Etiqueta/Info L1
+ Info L2
+ Info L3
+
+ Info de solo lectura
+
+
+ Guía de Ring Code
+
+
+ Acerca de
+ Versión
+
+
+ Comprobación de actualización de versión
+
+
+ Expulsar
+ Ahora es seguro expulsar el disco
+
+
+ Salir
+ Aún se está procesando un volcado, ¿estás seguro de que quieres salir?
+
+
+ ¡Error!
+ Ocurrió una excepción, consulta el registro para más detalles
+
+
+ Protección(es) detectada(s)
+
+
diff --git a/MPF.Avalonia/Resources/Strings.fr.xaml b/MPF.Avalonia/Resources/Strings.fr.xaml
new file mode 100644
index 000000000..fe876a181
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.fr.xaml
@@ -0,0 +1,227 @@
+
+
+
+ FRA
+
+
+ Accepter
+ Parcourir
+ Annuler
+ Réduire
+ Fermer
+ Paramètres
+ Statut
+ ATTENTION :
+ Attention
+ Erreur
+
+
+
+ _Fichier
+ _Quitter
+ _Outils
+ _Vérifier Dump
+ _Créer PS3 IRD
+ _Options
+ _Fenêtre Info Debug
+ _Aide
+ À _propos
+ _Vérifier les mises à jour
+
+ Type de système
+ Type de système/média
+ Aucun système sélectionné
+ Chemin de sortie
+ Lettre du lecteur
+ Vitesse du lecteur
+ Programme de dump
+ Paramètres
+
+ Contrôles
+ Démarrer le dump
+ Arrêter le dump
+ Scanner les disques
+ Actualiser l’étiquette
+ Scanner la protection
+
+ Journal des opérations
+ Effacer
+ Enregistrer
+
+
+ Options
+ Bienvenue dans MPF, explorez les options
+ Si vous choisissez d’activer la validation et la récupération des informations, vous êtes responsable de vous assurer que toutes les données renseignées correspondent à vos médias réels. Certaines informations peuvent être signalées pour vérification comme rappel, mais toutes les informations doivent être soumises au même contrôle.
+
+ Général
+ Interface utilisateur
+ Activer le mode sombre
+ Vérifier les mises à jour au démarrage
+ Copier l’URL de mise à jour
+ Mise à jour rapide du titre du disque
+ Langue par défaut de l’interface :
+ Détection
+ Ignorer la détection du système
+ Aucun lecteur fixe
+ Système par défaut :
+ Journalisation
+ Journalisation détaillée
+ Ouverture automatique des journaux
+
+ Chemins
+ Chemin Aaru
+ Chemin DiscImageCreator
+ Chemin Redumper
+ Programme par défaut
+ Chemin de sortie par défaut
+
+ Dumping
+ Dumping
+ Afficher les infos du disque
+ Récupérer toutes les informations
+ Activer la saisie des tabulations
+ Activer la compatibilité Redump
+ Afficher le rappel d’éjection
+ Ajouter des espaces réservés
+ Ajouter un suffixe au nom de fichier
+ Sortie JSON pour soumission
+ [DEBUG] Inclure les artefacts
+ Compresser les fichiers journaux
+ Compression du journal :
+ Supprimer les fichiers inutiles
+ Créer PS3 IRD après le dump
+ Protection
+ Activer le scan de protection
+ Scanner le contenu des archives
+ Inclure les informations de debug
+ Masquer les lettres de lecteur
+ Vitesses par défaut
+
+ Programmes
+ Aaru
+ Activer la sortie debug
+ Activer la sortie détaillée
+ Forcer le dumping
+ Supprimer les données personnelles
+ Nombre de relectures :
+ DiscImageCreator
+ Mode silencieux
+ Mode parano
+ Utiliser le flag CMI
+ Lecture multi-secteurs
+ Valeur lecture multi-secteurs :
+ Nombre de relectures CD :
+ Nombre de relectures DVD/HD-DVD/BD :
+ Redumper
+ Activer la sortie détaillée
+ Activer flag raffinement secteur
+ Nombre de relectures :
+ Relectures Plextor Lead-in :
+ Options non-Redump
+ Méthode de lecture par défaut :
+ Ordre des secteurs par défaut :
+ Type de lecteur par défaut :
+ Pregap Start de lecteur par défaut:
+
+ Infos de connexion
+ Récupération
+ Récupérer les informations de correspondance
+ Redump
+ Utilisateur
+ Mot de passe
+ Tester
+
+
+ Vérifier le dump existant
+ Chemin d’entrée
+ Vérifier Dump
+ La vérification écrasera tous les fichiers d’informations de soumission existants. Veuillez en faire une sauvegarde si nécessaire avant d’exécuter la vérification.
+
+
+ Créer PS3 IRD
+ Entrée
+ Chemin ISO PS3
+ Chemin *.getkey.log
+ Définir manuellement la clé de chiffrement du disque PS3
+ Clé hexadécimale
+ Chemin du fichier de clé
+ État de la clé
+ Définir manuellement l’ID du disque PS3
+ ID du disque
+ État de l’ID du disque
+ Définir manuellement le Permanent Information & Control (PIC)
+ Layerbreak (secteurs)
+ PIC
+ Chemin du fichier PIC
+ État du PIC
+ Créer IRD
+
+
+ Informations sur le média
+ Guide des codes Ring
+
+ Infos générales
+ Informations générales sur le média
+ Titre
+ Titre alternatif
+ Titre étranger (non-latin)
+ Titre étranger alternatif
+ Numéro / Lettre du disque
+ Titre du disque
+ Titre du disque (non-latin)
+ Catégorie
+ Région
+ Langues
+ Sélection de la langue via
+ Numéro de série
+ Code-barres
+ Versions et éditions
+ Version
+ Édition
+ Édition (non-latin)
+
+ Informations supplémentaires
+ Commentaires
+ OS compatible
+ Protection
+ Extras
+ Identifiants physiques
+ Identifiants de l’éditeur
+
+ Contenu
+
+ Codes Ring
+ Infos Data/L0
+ Infos Label/L1
+ Infos L2
+ Infos L3
+
+ Infos en lecture seule
+
+
+ Guide des codes Ring
+
+
+ À propos
+ Version
+
+
+ Vérification des mises à jour
+
+
+ Éjecter
+ Vous pouvez maintenant éjecter le disque en toute sécurité
+
+
+ Quitter
+ Un dump est encore en cours, êtes-vous sûr de vouloir quitter ?
+
+
+ Erreur !
+ Une exception s’est produite, consultez le journal pour plus de détails
+
+
+ Protection(s) détectée(s)
+
+
diff --git a/MPF.Avalonia/Resources/Strings.it.xaml b/MPF.Avalonia/Resources/Strings.it.xaml
new file mode 100644
index 000000000..78a44ac71
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.it.xaml
@@ -0,0 +1,232 @@
+
+
+
+ ITA
+
+
+ Accetta
+ Sfoglia
+ Annulla
+ Riduci a icona
+ Chiudi
+ Impostazioni
+ Stato
+ ATTENZIONE:
+ Attenzione
+ Errore
+
+
+
+ _File
+ _Esci
+ _Utility
+ _Verifica Dump
+ _Crea PS3 IRD
+ _Opzioni
+ _Finestra Info Debug
+ _Aiuto
+ _Informazioni
+ _Controlla Aggiornamenti
+
+ Tipo di Sistema
+ Tipo Sistema/Supporto
+ Nessun sistema selezionato
+ Percorso di Output
+ Lettera Unità
+ Velocità Unità
+ Programma di Dump
+ Parametri
+
+ Controlli
+ Avvia Dump
+ Ferma Dump
+ Cerca Dischi
+ Aggiorna Etichetta
+ Cerca Protezioni
+
+ Output Log
+ Pulisci Log
+ Salva Log
+
+
+ Opzioni
+ Benvenuto in MPF, esplora le Opzioni
+ Se scegli di abilitare la convalida e il recupero delle informazioni, sei responsabile di verificare che tutti i dati inseriti corrispondano ai tuoi supporti reali. Alcune informazioni potrebbero essere contrassegnate per controllarne la validità come promemoria, ma tutti i dati devono essere sottoposti allo stesso livello di verifica.
+
+ Generale
+ Interfaccia Utente
+ Abilita Modalità Scura
+ Controlla Aggiornamenti all'Avvio
+ Copia URL Aggiornamento
+ Aggiornamento Rapido Etichetta
+ Lingua Predefinita UI:
+ Rilevamento
+ Salta Rilevamento Sistema
+ Nessuna Unità Fissa
+ Sistema Predefinito:
+ Registrazione
+ Registrazione Dettagliata
+ Apri Log Automaticamente
+
+ Percorsi
+ Percorso Aaru
+ Percorso DiscImageCreator
+ Percorso Redumper
+ Programma di Dump Predefinito
+ Percorso Output Predefinito
+
+ Dumping
+ Dumping
+ Mostra Informazioni Disco
+ Recupera Tutte le Informazioni
+ Abilita Input Tab
+ Abilita Compatibilità Redump
+ Mostra Promemoria Espulsione
+ Aggiungi Segnaposto
+ Aggiungi Suffisso Nome File
+ Genera JSON di Invio
+ [DEBUG] Includi Artifacts
+ Comprimi File Log
+ Compressione Log:
+ Elimina File Non Necessari
+ Crea PS3 IRD Dopo Dump
+ Protezione
+ Abilita Scansione Protezione
+ Scansiona Contenuti Archivio
+ Includi Informazioni di Debug
+ Nascondi Lettere Unità
+ Velocità Predefinite
+
+ Programmi
+ Aaru
+ Abilita Output Debug
+ Abilita Output Dettagliato
+ Forza Dumping
+ Rimuovi Dati Personali
+ Tentativi di Rilettura:
+ DiscImageCreator
+ Modalità Silenziosa
+ Modalità Paranoica
+ Usa Flag CMI
+ Lettura Multi-Settore
+ Valore Lettura Multi-Settore:
+ Tentativi di Rilettura CD:
+ Tentativi di Rilettura DVD/HD-DVD/BD:
+ Redumper
+ Abilita Output Dettagliato
+ Abilita Flag Modalità Raffina Settore
+ Tentativi di Rilettura:
+ Tentativi Plextor Lead-in:
+ Opzioni Non-Redump
+ Metodo di Lettura Predefinito:
+ Ordine Settori Predefinito:
+ Tipo Unità Predefinito:
+ Drive Pregap Start Predefinito:
+
+ Informazioni Login
+ Recupero
+ Recupera Informazioni di Corrispondenza
+ Redump
+ Nome Utente
+ Password
+ Test Login
+
+
+ Verifica Dump Esistente
+ Percorso di Input
+ Verifica Dump
+ La verifica sovrascriverà eventuali file di informazioni di invio esistenti. Effettua il backup se necessario prima di eseguire la verifica.
+
+
+ Crea PS3 IRD
+ Input
+ Percorso PS3 ISO
+ Percorso file *.getkey.log
+ Definisci manualmente la chiave di cifratura PS3
+ Chiave Esadecimale
+ Percorso File Chiave
+ Stato Chiave
+ Definisci manualmente l'ID del Disco PS3
+ ID Disco
+ Stato ID Disco
+ Definisci manualmente Permanent Information & Control (PIC)
+ Layerbreak (settori)
+ PIC
+ Percorso File PIC
+ Stato PIC
+ Crea IRD
+
+
+ Informazioni Media
+ Guida Ring Code
+
+
+ Informazioni Generali
+ Informazioni Generali Media
+ Titolo
+ Titolo Alternativo
+ Titolo Estero (Non Latino)
+ Titolo Estero Alternativo
+ Numero / Lettera Disco
+ Titolo Disco
+ Titolo Disco (Non Latino)
+ Categoria
+ Regione
+ Lingue
+ Selezione Lingua Tramite
+ Seriale
+ Codice a Barre
+ Versioni e Edizioni
+ Versione
+ Edizione
+ Edizione (Non Latino)
+
+
+ Informazioni Aggiuntive
+ Commenti
+ OS Compatibili
+ Protezione
+ Extra
+ Identificatori Fisici
+ Identificatori Editore
+
+
+ Contenuti
+
+
+ Ringcodes
+ Dati / Info L0
+ Etichetta / Info L1
+ Info L2
+ Info L3
+
+
+ Info di Sola Lettura
+
+
+ Guida Ring Code
+
+
+ Informazioni
+ Versione
+
+
+ Controllo Aggiornamenti Versione
+
+
+ Espulsione
+ Ora è sicuro espellere il disco
+
+
+ Esci
+ Un dump è ancora in corso, sei sicuro di voler uscire?
+
+
+ Errore!
+ Si è verificata un'eccezione, consulta il log per i dettagli
+
+
+ Protezione(i) Rilevata(e)
+
+
diff --git a/MPF.Avalonia/Resources/Strings.ja.xaml b/MPF.Avalonia/Resources/Strings.ja.xaml
new file mode 100644
index 000000000..6f16236c3
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.ja.xaml
@@ -0,0 +1,227 @@
+
+
+
+ 日本語
+
+
+ OK
+ 参照...
+ キャンセル
+ 最小化
+ 閉じる
+ 設定
+ ステータス
+ 警告:
+ 警告
+ エラー
+
+
+
+ ファイル
+ 終了
+ ツール
+ ダンプを確認
+ PS3 IRD を作成
+ オプション
+ デバッグ情報ウィンドウ
+ ヘルプ
+ バージョン情報
+ 更新の確認
+
+ システム種別
+ システム/メディア種別
+ システムが選択されていません
+ 出力先
+ ドライブレター
+ ドライブ速度
+ ダンプログラム
+ パラメーター
+
+ 操作
+ ダンプ開始
+ ダンプ停止
+ ディスクをスキャン
+ ラベルを更新
+ プロテクトをスキャン
+
+ ログ出力
+ ログをクリア
+ ログを保存
+
+
+ オプション
+ MPF へようこそ — オプションを設定しましょう
+ 検証および情報取得を有効にする場合、取得したデータが実際のメディア内容と一致していることを確認する責任はユーザーにあります。一部の情報には確認が必要な項目が表示される場合がありますが、すべての情報を慎重に確認してください。
+
+ 全般
+ ユーザーインターフェース
+ ダークモードを有効にする
+ 起動時に更新を確認する
+ 更新URLをクリップボードにコピー
+ 高速ラベル更新
+ 既定のUI言語:
+ 検出
+ システム検出をスキップ
+ 固定ドライブを除外
+ 既定のシステム:
+ ログ
+ 詳細ログ
+ ログを自動で開く
+
+ パス
+ Aaru のパス
+ DiscImageCreator のパス
+ Redumper のパス
+ 既定のダンプログラム
+ 既定の出力先
+
+ ダンプ
+ ダンプ設定
+ ディスク情報を表示
+ すべての情報を取得
+ タブ入力を有効にする
+ Redump 互換を有効にする
+ 排出リマインダーを表示
+ プレースホルダーを追加
+ ファイル名にサフィックスを追加
+ 送信用 JSON を出力
+ 【デバッグ】成果物を含める
+ ログファイルを圧縮
+ ログ圧縮:
+ 不要ファイルを削除
+ ダンプ後に PS3 IRD を作成
+ プロテクト
+ プロテクトスキャンを有効にする
+ アーカイブ内容をスキャン
+ デバッグ情報を含める
+ ドライブレターを非表示
+ 既定の速度
+
+ プログラム
+ Aaru
+ デバッグ出力を有効にする
+ 詳細出力を有効にする
+ 強制的にダンプを実行
+ 個人情報を除去
+ 再読み込み回数:
+ DiscImageCreator
+ サイレントモード
+ パラノイドモード
+ CMI フラグを使用
+ マルチセクターリード
+ マルチセクターリード値:
+ CD 再読み込み回数:
+ DVD/HD-DVD/BD 再読み込み回数:
+ Redumper
+ 詳細出力を有効にする
+ Refine Sector モードフラグを有効にする
+ 再読み込み回数:
+ Plextor リードイン再試行回数:
+ 非 Redump オプション
+ 既定のリード方法:
+ 既定のセクター順序:
+ 既定のドライブ種別:
+ 既定のドライブ プリギャップ スタート:
+
+ ログイン情報
+ 情報取得
+ 一致情報を取得
+ Redump
+ ユーザー名
+ パスワード
+ ログインをテスト
+
+
+ 既存ダンプの確認
+ 入力パス
+ ダンプを確認
+ 確認を実行すると、既存の送信情報ファイルは上書きされます。必要に応じてバックアップを作成してから実行してください。
+
+
+ PS3 IRD の作成
+ 入力
+ PS3 ISO パス
+ *.getkey.log ファイルパス
+ PS3 ディスク暗号化キーを手動で指定
+ 16進キー
+ キー ファイル パス
+ キーの状態
+ PS3 ディスク ID を手動で指定
+ ディスク ID
+ ディスク ID 状態
+ Permanent Information & Control (PIC) を手動で指定
+ レイヤーブレイク (セクター数)
+ PIC
+ PIC ファイル パス
+ PIC 状態
+ IRD を作成
+
+
+ メディア情報
+ リングコードガイド
+
+ 共通情報
+ 共通メディア情報
+ タイトル
+ 別タイトル
+ 外国語タイトル(非ラテン文字)
+ 代替外国語タイトル
+ ディスク番号/記号
+ ディスクタイトル
+ ディスクタイトル(非ラテン文字)
+ カテゴリ
+ リージョン
+ 言語
+ 言語選択方法
+ シリアル
+ バーコード
+ バージョン/エディション
+ バージョン
+ エディション
+ エディション(非ラテン文字)
+
+ 追加情報
+ コメント
+ 対応 OS
+ プロテクト
+ その他
+ 物理識別情報
+ 出版社識別情報
+
+ 内容
+
+ リングコード
+ データ/L0 情報
+ ラベル/L1 情報
+ L2 情報
+ L3 情報
+
+ 読み取り専用情報
+
+
+ リングコードガイド
+
+
+ バージョン情報
+ バージョン
+
+
+ バージョン更新の確認
+
+
+ 取り出し
+ ディスクを安全に取り出せます
+
+
+ 終了
+ ダンプ処理がまだ進行中です。終了してもよろしいですか?
+
+
+ エラー!
+ 例外が発生しました。詳細はログを確認してください。
+
+
+ 検出されたプロテクト
+
+
diff --git a/MPF.Avalonia/Resources/Strings.ko.xaml b/MPF.Avalonia/Resources/Strings.ko.xaml
new file mode 100644
index 000000000..537c6abe9
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.ko.xaml
@@ -0,0 +1,232 @@
+
+
+
+ 한국어
+
+
+ 확인
+ 찾아보기
+ 취소
+ 최소화
+ 끝내기
+ 설정
+ 상태
+ 경고:
+ 경고
+ 오류
+
+
+
+ 파일
+ 종료
+ 도구
+ 체크 덤프
+ PS3 IRD 생성
+ 옵션
+ 디버그 정보 창
+ 도움말
+ 앱 정보
+ 업데이트 확인
+
+ 시스템 유형
+ 시스템/미디어 유형
+ No system selected
+ 출력 경로
+ 드라이브 문자
+ 드라이브 속도
+ 덤프 프로그램
+ 매개변수
+
+ 컨트롤
+ 덤프 시작
+ 덤프 중지
+ 디스크 스캔
+ 레이블 갱신
+ 보호 스캔
+
+ 로그 출력
+ 로그 지우기
+ 로그 저장
+
+
+ 옵션
+ MPF에 오신 것을 환영합니다. 옵션을 살펴보세요.
+
+
+ 일반
+ 사용자 인터페이스
+ 다크 모드 활성화
+ 시작 시 업데이트 확인
+ 업데이트 URL을 클립보드에 복사
+ 빠른 업데이트 레이블
+ 기본 UI 언어:
+ 감지
+ 시스템 감지 건너뛰기
+ 고정 드라이브 없음
+ 기본 시스템:
+ 로그
+ 상세 로그
+ 로그 자동 열기
+
+ 경로
+ Aaru 경로
+ DiscImageCreator 경로
+ Redumper 경로
+ 기본 덤핑 프로그램
+ 기본 출력 경로
+
+ 덤핑
+ 덤핑
+ 디스크 정보 표시
+ 모든 정보 가져오기
+ 탭 입력 활성화
+ Redump 호환성 활성화
+ 배출 알림 표시
+ 자리표시자 추가
+ 파일명 접미사 추가
+ 제출 JSON 출력
+ [DEBUG] 아티팩트 포함
+ 로그 파일 압축
+ 로그 압축:
+ 불필요한 파일 삭제
+ 덤핑 후 PS3 IRD 생성
+ 보호
+ 보호 스캔 활성화
+ 아카이브 내용 스캔
+ 디버그 정보 포함
+ 드라이브 문자 숨기기
+ 기본 속도
+
+ 프로그램
+ Aaru
+ 디버그 출력 활성화
+ 상세 출력 활성화
+ 강제 덤핑
+ 개인 데이터 제거
+ 재읽기 시도 횟수:
+ DiscImageCreator
+ 조용한 모드
+ 안전 모드
+ CMI 플래그 사용
+ 멀티 섹터 읽기
+ 멀티 섹터 읽기 값:
+ CD 재읽기 시도 횟수:
+ DVD/HD-DVD/BD 재읽기 시도 횟수:
+ Redumper
+ 상세 출력 활성화
+ Refine Sector 모드 플래그 활성화
+ 재읽기 시도 횟수:
+ Plextor 리드인 재시도:
+ 비-Redump 옵션
+ 기본 읽기 방식:
+ 기본 섹터 순서:
+ 기본 드라이브 유형:
+ 기본 드라이브 프리갭 스타트:
+
+ 로그인 정보
+ 검색
+ 일치 정보 가져오기
+ Redump
+ 사용자 이름
+ 비밀번호
+ 로그인 테스트
+
+
+ 체크 기존 덤프
+ 입력 경로
+ 체크 덤프
+
+
+
+ PS3 IRD 생성
+ 입력
+ PS3 ISO 경로
+ *.getkey.log 파일 경로
+ PS3 디스크 암호화 키 수동 설정
+ 헥스 키
+ 키 파일 경로
+ 키 상태
+ PS3 디스크 ID 수동 설정
+ 디스크 ID
+ 디스크 ID 상태
+ Permanent Information & Control (PIC) 수동 설정
+ Layerbreak (sectors)
+ PIC
+ PIC 파일 경로
+ PIC 상태
+ IRD 생성
+
+
+ 미디어 정보
+ 링 코드 가이드
+
+ 일반 정보
+ 일반 미디어 정보
+ 제목
+ 대체 제목
+ 외국어 제목 (비라틴 문자)
+ 대체 외국어 제목
+ 디스크 번호 / 문자
+ 디스크 제목
+ 디스크 제목 (비라틴 문자)
+ 카테고리
+ 지역
+ 언어 (문자)
+ 언어 선택 방식
+ 시리얼
+ 바코드
+ 버전 및 에디션
+ 버전
+ 에디션
+ 에디션 (비라틴 문자)
+
+ 추가 정보
+ 코멘트
+ 호환 운영체제
+ 보호
+ 추가
+ 물리적 식별자
+ 게시자 식별자
+
+ 내용물
+
+ 링 코드
+ 데이터/L0 정보
+ 라벨/L1 정보
+ L2 정보
+ L3 정보
+
+ 읽기 전용 정보
+
+
+ 링 코드 가이드
+
+
+ 앱 정보
+
+ 버전
+
+
+ 버전 업데이트 확인
+
+
+ 꺼내다
+ 이제 디스크를 꺼내셔도 됩니다
+
+
+ 종료
+ 덤프가 아직 처리 중입니다. 종료하시겠습니까?
+
+
+ 오류!
+ 예외가 발생했습니다. 자세한 내용은 로그를 참조하세요
+
+
+ 감지된 보호
+
+
diff --git a/MPF.Avalonia/Resources/Strings.pl.xaml b/MPF.Avalonia/Resources/Strings.pl.xaml
new file mode 100644
index 000000000..81536e78c
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.pl.xaml
@@ -0,0 +1,227 @@
+
+
+
+ POL
+
+
+ Akceptuj
+ Wybierz
+ Anuluj
+ Minimalizuj
+ Zamknij
+ Ustawienia
+ Status
+ UWAGA:
+ Uwaga
+ Błąd
+
+
+
+ _Plik
+ _Zakończ
+ _Narzędzia
+ _Sprawdź dump
+ _Utwórz PS3 IRD
+ _Opcje
+ Okno informacji _debugowania
+ _Pomoc
+ _O programie
+ _Sprawdź aktualizacje
+
+ Typ systemu
+ System / Typ nośnika
+ Nie wybrano systemu
+ Ścieżka wyjściowa
+ Litera napędu
+ Prędkość napędu
+ Program do dumpingu
+ Parametry
+
+ Sterowanie
+ Rozpocznij dumping
+ Zatrzymaj dumping
+ Skanuj płyty
+ Aktualizuj etykietę
+ Skanuj zabezpieczenia
+
+ Wyjście logu
+ Wyczyść log
+ Zapisz log
+
+
+ Opcje
+ Witamy w MPF, odkryj opcje
+ Jeśli zdecydujesz się włączyć opcję walidacji i pobierania informacji, jesteś odpowiedzialny za sprawdzenie, że wszystkie wprowadzone dane są zgodne z faktycznym nośnikiem. Niektóre informacje mogą być oznaczone do weryfikacji jako przypomnienie, ale wszystkie dane powinny być poddane tej samej kontroli.
+
+ Ogólne
+ Interfejs użytkownika
+ Włącz tryb ciemny
+ Sprawdzaj aktualizacje przy starcie
+ Kopiuj URL aktualizacji do schowka
+ Szybka aktualizacja etykiety
+ Domyślny język UI:
+ Wykrywanie
+ Pomiń wykrywanie systemu
+ Brak dysków stałych
+ Domyślny x:
+ Logowanie
+ Szczegółowe logowanie
+ Automatyczne otwieranie logów
+
+ Ścieżki
+ Ścieżka Aaru
+ Ścieżka DiscImageCreator
+ Ścieżka Redumper
+ Domyślny program do dumpingu
+ Domyślna ścieżka wyjściowa
+
+ Dumping
+ Dumping
+ Pokaż informacje o płycie
+ Pobierz wszystkie informacje
+ Włącz obsługę klawisza Tab
+ Włącz kompatybilność z Redump
+ Pokaż przypomnienie o wysunięciu
+ Dodaj symbole zastępcze
+ Dodaj sufiks nazwy pliku
+ Wyjście JSON dla zgłoszeń
+ [DEBUG] Uwzględnij artefakty
+ Kompresuj pliki logów
+ Kompresja logów:
+ Usuń niepotrzebne pliki
+ Utwórz PS3 IRD po dumpingu
+ Zabezpieczenia
+ Włącz skanowanie zabezpieczeń
+ Skanuj zawartość archiwów
+ Dołącz informacje debugowania
+ Ukryj litery napędów
+ Domyślne prędkości
+
+ Programy
+ Aaru
+ Włącz wyjście debugowania
+ Włącz szczegółowe wyjście
+ Wymuś dumping
+ Usuń dane osobiste
+ Liczba prób ponownego odczytu:
+ DiscImageCreator
+ Tryb cichy
+ Tryb paranoiczny
+ Użyj flagi CMI
+ Odczyt wielu sektorów
+ Wartość odczytu wielu sektorów:
+ Liczba prób odczytu CD:
+ Liczba prób odczytu DVD/HD-DVD/BD:
+ Redumper
+ Włącz szczegółowe wyjście
+ Włącz flagę trybu poprawy sektorów
+ Liczba prób ponownego odczytu:
+ Liczba prób lead-in Plextor:
+ Opcje nie-Redump
+ Domyślna metoda odczytu:
+ Domyślna kolejność sektorów:
+ Domyślny typ napędu:
+ Domyślny pregap start napęd:
+
+ Informacje logowania
+ Pobieranie
+ Pobierz informacje o dopasowaniu
+ Redump
+ Użytkownika
+ Hasło
+ Sprawdź
+
+
+ Sprawdź istniejący dump
+ Ścieżka wejściowa
+ Sprawdź dump
+ Sprawdzenie nadpisze wszystkie istniejące pliki informacji zgłoszenia. Zrób kopie zapasowe, jeśli są potrzebne, przed wykonaniem sprawdzenia.
+
+
+ Utwórz PS3 IRD
+ Wejście
+ Ścieżka PS3 ISO
+ Ścieżka pliku *.getkey.log
+ Ręczne określenie klucza szyfrowania PS3
+ Klucz szesnastkowy
+ Ścieżka pliku klucza
+ Status klucza
+ Ręczne określenie ID płyty PS3
+ ID płyty
+ Status ID płyty
+ Ręczne określenie Permanent Information & Control (PIC)
+ Layerbreak (sektory)
+ PIC
+ Ścieżka pliku PIC
+ Status PIC
+ Utwórz IRD
+
+
+ Informacje o nośniku
+ Przewodnik Ringcode
+
+ Informacje ogólne
+ Ogólne informacje o nośniku
+ Tytuł
+ Alternatywny tytuł
+ Tytuł obcy (niełaciński)
+ Alternatywny tytuł obcy
+ Numer / litera płyty
+ Tytuł płyty
+ Tytuł płyty (niełaciński)
+ Kategoria
+ Region
+ Języki
+ Wybór języka przez
+ Numer seryjny
+ Kod kreskowy
+ Wersje i edycje
+ Wersja
+ Edycja
+ Edycja (niełaciński)
+
+ Dodatkowe informacje
+ Komentarze
+ Kompatybilne systemy
+ Zabezpieczenia
+ Dodatki
+ Identyfikatory fizyczne
+ Identyfikatory wydawcy
+
+ Zawartość
+
+ Ringcodes
+ Dane / L0 Info
+ Etykieta / L1 Info
+ L2 Info
+ L3 Info
+
+ Informacje tylko do odczytu
+
+
+ Przewodnik Ring Code
+
+
+ O programie
+ Wersja
+
+
+ Sprawdzenie aktualizacji wersji
+
+
+ Wysuń
+ Można bezpiecznie wysunąć płytę
+
+
+ Zakończ
+ Dump nadal jest przetwarzany. Czy na pewno chcesz zakończyć?
+
+
+ Błąd!
+ Wystąpił wyjątek, zobacz log dla szczegółów
+
+
+ Wykryte zabezpieczenie(a)
+
+
diff --git a/MPF.Avalonia/Resources/Strings.pt.xaml b/MPF.Avalonia/Resources/Strings.pt.xaml
new file mode 100644
index 000000000..269af915c
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.pt.xaml
@@ -0,0 +1,237 @@
+
+
+
+ POR
+
+
+ Aceitar
+ Procurar
+ Cancelar
+ Minimiziar
+ Fechar
+ Definições
+ Estado
+ AVISO:
+ Aviso
+ Erro
+
+
+ Media Preservation Frontend
+
+ _Ficheiro
+ _Sair
+ _Recursos
+ _Verificar dump
+ Criar _IRD PS3
+ _Opções
+ Info de _depuração
+ _Ajuda
+ _Sobre
+ _Procurar atualizações
+
+ Tipo de sistema
+ Tipo de sistema/mídia
+ Nenhum sistema escolhido
+ Caminho de saída
+ Letra da unidade
+ Velocidade da unidade
+ Programa para dump
+ Parâmetros
+
+ Controlos
+ Começar dump
+ Cancelar dump
+ Procurar por discos
+ Atualizar etiqueta
+ Procurar por proteção
+
+ Saída do log
+ Limpar log
+ Guardar log
+
+
+ Opções
+ Bem-vindo ao MPF, explora as opções
+ Se escolheres ativar a validação e obtenção de informação, és responsável por assegurar que todos os dados inseridos correspondem à tua mídia. Alguma informação pode conter um lembrete de a verificar, mas toda a informação deve passar pelo mesmo nível de escrutínio.
+
+ Geral
+ Interface
+ Ativar modo escuro
+ Procurar por atualizações ao iniciar
+ Copiar URL da atualização
+ Atualização rápida da etiqueta
+ Língua padrão da interface:
+ Deteção
+ Saltar deteção de sistema
+ Ignorar unidades fixas
+ Sistema padrão:
+ Logs
+ Logs detalhados
+ Abrir logs automaticamente
+
+ Caminhos
+ Caminho do Aaru
+ Caminho do DiscImageCreator
+ Caminho do Redumper
+ Programa padrão para dump
+ Caminho de saída padrão
+
+ Dumps
+ Dumps
+ Mostrar info do disco
+ Buscar toda a informação
+ Ativar escrita de tabs
+ Ativar compatibilidade com Redump
+ Lembrar de ejetar o disco
+ Adicionar espaço reservado
+ Adicionar sufixo ao ficheiro
+ Gerar JSON de submissão
+ [DEPURAÇÃO] Incluir artefactos
+ Comprimir ficheiros log
+ Compressão do log:
+ Apagar ficheiros desnecessários
+ Criar IRD PS3 após o dump
+ Proteção
+ Ativar scan de proteção
+ Verificar conteúdo dos ficheiros
+ Incluir info de depuração
+ Esconder letras das unidades
+ Velocidades padrão
+ CD
+ DVD
+ HD-DVD
+ BD
+
+ Programas
+ Aaru
+ Ativar saída de depuração
+ Ativar saída detalhada
+ Forçar dump
+ Remover dados pessoais
+ Tentativas de leitura:
+ DiscImageCreator
+ Modo silencioso
+ Modo paranoico
+ Usar flag CMI
+ Leitura multissetorial
+ Valor de leitura multissetorial:
+ Tentativas de leitura de CD:
+ Tentativas de leitura de DVD/HD-DVD/BD:
+ Redumper
+ Ativar saída detalhada
+ Ativar flag modo de refinar setor
+ Tentativas de leitura:
+ Tentativas Lead-in Plextor:
+ Opções não-Redump
+ Método de leitura padrão:
+ Ordem padrão de setores:
+ Tipo de unidade padrão:
+ Pregap start da unidade padrão:
+
+ Info de login
+ Obtenção
+ Obter info quando corresponde
+ Redump
+ Utilizador
+ Palavra-passe
+ Testar login
+
+
+ Verificar dump existente
+ Caminho do ficheiro
+ Verificar dump
+ A verificação vai substituir qualquer ficheiro de info de submissão existente. Por favor faz cópias deles se precisares, antes de iniciar a verificação.
+
+
+ Criar IRD PS3
+ Entrada
+ Caminho do ISO PS3
+ Caminho de *.getkey.log
+ Definir manualmente a chave de encriptação do disco PS3
+ Chave hexadecimal
+ Caminho do ficheiro chave
+ Estado da chave
+ Definir manualmente o ID do disco
+ ID do disco
+ Estado do ID do disco
+ Definir manualmente o Permanent Information & Control (PIC)
+ Layerbreak (setores)
+ PIC
+ Caminho do ficheiro PIC
+ Estado do PIC
+ Criar IRD
+
+
+ Informação da mídia
+ Guia códigos anéis
+
+ Info comum
+ Info comum da mídia
+ Título
+ Título alternativo
+ Título estrangeiro (não-latim)
+ Título estrangeiro alternativo
+ Número/letra do disco
+ Título do disco
+ Título do disco (não-latim)
+ Categoria
+ Região
+ Idiomas
+ Seleção de idioma via
+ Número de série
+ Código de barras
+ Versão e edições
+ Versão
+ Edição
+ Edição (não-latim)
+
+ Info adicional
+ Comentários
+ Sistemas operativ. compatív.
+ Proteção
+ Extras
+ Identificadores físicos
+ Identificadores de editores
+
+ Conteúdo
+
+ Códigos dos anéis
+ Dados/Info L0
+ Etiqueta/Info L1
+ Info L2
+ Info L3
+
+ Info de leitura apenas
+
+
+ Guia códigos dos anéis
+
+
+ Sobre
+ Media Preservation Frontend (MPF)
+ Um programa de preservação comunitária programado em C#.
+ Suporta Redumper, Aaru, e DiscImageCreator.
+ Originalmente criado para ajudar o projeto Redump.
+ Obrigado a todos os que apoiaram este projeto!
+ Versão
+
+
+ Procurar atualizações
+
+
+ Ejetar
+ Já é seguro ejetar o disco
+
+
+ Sair
+ Um dump ainda está a ser processado, de certeza que queres sair?
+
+
+ Erro!
+ Ocorreu uma exceção, verifica o log para detalhes
+
+
+ Detetaram-se proteções
+
+
diff --git a/MPF.Avalonia/Resources/Strings.ru.xaml b/MPF.Avalonia/Resources/Strings.ru.xaml
new file mode 100644
index 000000000..d05dd0c3a
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.ru.xaml
@@ -0,0 +1,227 @@
+
+
+
+ RUS
+
+
+ Принять
+ Обзор
+ Отмена
+ Свернуть
+ Закрыть
+ Настройки
+ Статус
+ ПРЕДУПРЕЖДЕНИЕ:
+ Предупреждение
+ Ошибка
+
+
+
+ Файл
+ Выход
+ Утилиты
+ Проверить дамп
+ Создать PS3 IRD
+ Параметры
+ Окно отладки
+ Справка
+ О программе
+ Проверить обновления
+
+ Тип системы
+ Система / тип носителя
+ Система не выбрана
+ Путь вывода
+ Буква диска
+ Скорость привода
+ Программа дампа
+ Параметры
+
+ Управление
+ Начать дамп
+ Остановить дамп
+ Сканировать диски
+ Обновить метку
+ Проверить защиту
+
+ Вывод лога
+ Очистить
+ Сохранить
+
+
+ Параметры
+ Добро пожаловать в MPF — изучите параметры
+ Если вы включаете проверку и получение данных, вы несёте ответственность за соответствие введённой информации фактическим данным вашего носителя. Некоторые данные могут быть помечены как требующие проверки, однако вся информация должна быть тщательно проверена.
+
+ Общие
+ Интерфейс
+ Включить тёмную тему
+ Проверять обновления при запуске
+ Копировать ссылку обновления в буфер
+ Быстрое обновление метки
+ Язык интерфейса по умолчанию:
+ Обнаружение
+ Пропустить определение системы
+ Без жёстких дисков
+ Система по умолчанию:
+ Журналирование
+ Подробный лог
+ Автоматически открывать логи
+
+ Пути
+ Путь к Aaru
+ Путь к DiscImageCreator
+ Путь к Redumper
+ Программа дампа по умолчанию
+ Путь вывода по умолчанию
+
+ Дамп
+ Дамп
+ Показать информацию о диске
+ Извлечь всю информацию
+ Разрешить ввод через вкладки
+ Совместимость с Redump
+ Показывать напоминание о извлечении
+ Добавлять шаблоны
+ Добавлять суффикс к имени файла
+ Создавать JSON для отправки
+ [ОТЛАДКА] Включать артефакты
+ Сжимать файлы логов
+ Сжатие логов:
+ Удалять лишние файлы
+ Создать PS3 IRD после дампа
+ Защита
+ Включить проверку защиты
+ Проверять содержимое архива
+ Включать отладочную информацию
+ Скрывать буквы дисков
+ Скорости по умолчанию
+
+ Программы
+ Aaru
+ Включить отладочный вывод
+ Подробный вывод
+ Принудительный дамп
+ Удалять личные данные
+ Повторные чтения:
+ DiscImageCreator
+ Тихий режим
+ Параноидальный режим
+ Использовать флаг CMI
+ Чтение нескольких секторов
+ Количество секторов:
+ Повторы чтения CD:
+ Повторы чтения DVD/HD-DVD/BD:
+ Redumper
+ Подробный вывод
+ Уточнённого режима секторов
+ Повторные чтения:
+ Повторы Lead-in (Plextor):
+ Параметры вне Redump
+ Метод чтения по умолчанию:
+ Порядок секторов:
+ Тип привода по умолчанию:
+ Pregap Start привода по умолчанию:
+
+ Данные входа
+ Получение
+ Получать совпадающую информацию
+ Redump
+ Имя пользователя
+ Пароль
+ Проверить
+
+
+ Проверка дампа
+ Путь к входным данным
+ Проверить дамп
+ Проверка перезапишет существующие файлы информации. Создайте резервные копии перед запуском проверки.
+
+
+ Создание PS3 IRD
+ Вход
+ Путь к PS3 ISO
+ Путь к файлу *.getkey.log
+ Задать ключ шифрования PS3 вручную
+ Шестнадцатеричный ключ
+ Путь к файлу ключа
+ Статус ключа
+ Задать PS3 Disc ID вручную
+ Disc ID
+ Статус Disc ID
+ Задать Permanent Information & Control (PIC) вручную
+ Раздел слоя (в секторах)
+ PIC
+ Путь к файлу PIC
+ Статус PIC
+ Создать IRD
+
+
+ Информация о носителе
+ Справка по кольцевым кодам
+
+ Общая информация
+ Общие данные о носителе
+ Название
+ Альтернативное название
+ Иностранное название (нелатиницей)
+ Альтернативное иностранное название
+ Номер / буква диска
+ Название диска
+ Название диска (нелатиницей)
+ Категория
+ Регион
+ Языки
+ Выбор языка через
+ Серийный номер
+ Штрихкод
+ Версии и издания
+ Версия
+ Издание
+ Издание (нелатиницей)
+
+ Доп. информация
+ Комментарии
+ Совместимые ОС
+ Защита
+ Дополнительно
+ Физические идентификаторы
+ Идентификаторы издателя
+
+ Содержимое
+
+ Кольцевые коды
+ Данные / L0
+ Метка / L1
+ L2
+ L3
+
+ Только для чтения
+
+
+ Справка по кольцевым кодам
+
+
+ О программе
+ Версия
+
+
+ Проверка обновлений
+
+
+ Извлечение
+ Теперь можно безопасно извлечь диск
+
+
+ Выход
+ Дамп всё ещё выполняется. Вы уверены, что хотите выйти?
+
+
+ Ошибка!
+ Произошло исключение. Подробности см. в логе.
+
+
+ Обнаружена защита
+
+
diff --git a/MPF.Avalonia/Resources/Strings.sv.xaml b/MPF.Avalonia/Resources/Strings.sv.xaml
new file mode 100644
index 000000000..5e3bfa0fe
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.sv.xaml
@@ -0,0 +1,227 @@
+
+
+
+ SWE
+
+
+ Acceptera
+ Bläddra
+ Avbryt
+ Minimera
+ Stäng
+ Inställningar
+ Status
+ VARNING:
+ Varning
+ Fel
+
+
+
+ _Arkiv
+ A_vsluta
+ _Verktyg
+ _Kontrollera Dump
+ _Skapa PS3 IRD
+ _Alternativ
+ _Felsökningsfönster
+ _Hjälp
+ _Om
+ _Sök efter uppdateringar
+
+ Systemtyp
+ System/Medietyp
+ Inget system valt
+ Utdatamapp
+ Enhetsbeteckning
+ Enhetshastighet
+ Dumpningsprogram
+ Parametrar
+
+ Kontroller
+ Starta Dumpning
+ Stoppa Dumpning
+ Skanna efter skivor
+ Uppdatera etikett
+ Skanna efter skydd
+
+ Logg
+ Rensa Logg
+ Spara Logg
+
+
+ Alternativ
+ Välkommen till MPF, Utforska Alternativen
+ Om du väljer att aktivera validering och informationshämtning är du ansvarig för att all data som fylls i matchar det media som du dumpar. Viss information kan markeras som påminnelse, men all bör granskas till samma grad.
+
+ Allmänt
+ Användargränssnitt
+ Aktivera mörkt läge
+ Sök efter uppdateringar vid start
+ Kopiera uppdaterings-URL till Urklipp
+ Snabb uppdatering av etikett
+ Standard språk för gränssnitt:
+ Upptäcka
+ Hoppa över systemupptäckt
+ Inga fasta enheter
+ Standard x:
+ Loggning
+ Detaljerad loggning
+ Öppna loggar automatiskt
+
+ Sökvägar
+ Aaru-sökväg
+ DiscImageCreator-sökväg
+ Redumper-sökväg
+ Standard dumpningsprogram
+ Standard utdatamapp
+
+ Dumpning
+ Dumpning
+ Visa skivinformation
+ Hämta all information
+ Aktivera Tab-inmatning
+ Aktivera Redump-kompatibilitet
+ Visa påminnelse om urtagning
+ Lägg till platshållare
+ Lägg till filnamnstillägg
+ Generera JSON för Submission
+ [DEBUG] Inkludera artefakter
+ Komprimera loggfiler
+ Loggkomprimering:
+ Ta bort onödiga filer
+ Skapa PS3 IRD efter dumpning
+ Kopieringsskydd
+ Aktivera skyddsskanning
+ Skanna arkivinnehåll
+ Inkludera felsökningsinformation
+ Dölj enhetsbeteckning
+ Standardhastigheter
+
+ Program
+ Aaru
+ Aktivera felsökningsdata
+ Aktivera detaljerad utdata
+ Tvinga dumpning
+ Ta bort personuppgifter
+ Omläsningsförsök:
+ DiscImageCreator
+ Tyst läge
+ Paranoidt Läge
+ Aktivera CMI-Flagga
+ Multi-sektor läsning
+ Multi-sektor läsvärde:
+ Omläsningsförsök för:
+ Omläsningsförsök för DVD/HD-DVD/BD:
+ Redumper
+ Aktivera detaljerad utdata
+ Aktivera Refine Sector Mode flagga
+ Omläsningsförsök:
+ Plextor Lead-in läsningsförsök:
+ Alternativ utanför Redump
+ Standard läsmetod:
+ Standard sektorordning:
+ Standard enhetstyp:
+ Standard pregap start:
+
+ Inloggningsinfo
+ Hämtning
+ Hämta matchningsinformation från Redump.org
+ Redump
+ Användarnamn
+ Lösenord
+ Testa
+
+
+ Kontrollera befintlig Dump
+ Indatamapp
+ Kontrollera Dump
+ Kontrollen kommer skriva över befintliga filer. Säkerhetskopiera dessa innan du kör kontrollen.
+
+
+ Skapa PS3 IRD
+ Indata
+ PS3 ISO-sökväg
+ *.getkey.log Fil-sökväg
+ Definiera PS3-skivnyckel manuellt
+ Hexadecimal nyckel
+ Nyckelfilssökväg
+ Nyckelstatus
+ Definiera PS3-skiv-ID manuellt
+ Skiv-ID
+ Skiv-ID Status
+ Definiera Permanent Information & Control (PIC) manuellt
+ Layerbreak (sektorer)
+ PIC
+ PIC Fil-sökväg
+ PIC Status
+ Skapa IRD
+
+
+ Medieinformation
+ Ringkods guide
+
+ Allmän Info
+ Allmän Medieinformation
+ Titel
+ Alternativ titel
+ Utländsk titel (icke-latin)
+ Alternativ utländsk titel
+ Skivnummer / Bokstav
+ Skivtitel
+ Skivtitel (icke-latin)
+ Kategori
+ Region
+ Språk
+ Språkväljning via
+ Serienummer
+ Streckkod
+ Version och Utgåvor
+ Version
+ Utgåva
+ Utgåva (icke-latin)
+
+ Ytterligare info
+ Kommentarer
+ OS Kompatibeltitet
+ Kopieringsskydd
+ Extra
+ Fysiska Identifierare
+ Utgivaridentifierare
+
+ Innehåll
+
+ Ringkoder
+ Data/L0 Info
+ Etikett/L1 Info
+ L2 Info
+ L3 Info
+
+ Skrivskyddad Info
+
+
+ Ringkods guide
+
+
+ Om
+ Version
+
+
+ Sök efter uppdatering
+
+
+ Mata ut
+ Det är nu säkert att mata ut skivan
+
+
+ Avsluta
+ En dumpning pågår fortfarande, är du säker på att du vill avsluta?
+
+
+ Fel!
+ Ett undantag uppstod, se loggen för detaljer
+
+
+ Upptäckta Skydd
+
+
diff --git a/MPF.Avalonia/Resources/Strings.uk.xaml b/MPF.Avalonia/Resources/Strings.uk.xaml
new file mode 100644
index 000000000..e01747308
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.uk.xaml
@@ -0,0 +1,237 @@
+
+
+
+ UKR
+
+
+ Прийняти
+ Вибрати
+ Відхилити
+ Згорнути
+ Закрити
+ Налаштування
+ Статус
+ УВАГА:
+ Увага
+ Помилка
+
+
+ Media Preservation Frontend
+
+ _Файл
+ _Вийти
+ _Утиліти
+ _Перевірити дамп
+ Створити _PS3 IRD
+ П_араметри
+ В_ікно дебагу
+ _Допомога
+ П_ро програму
+ П_еревірити оновлення
+
+ Тип системи
+ Система/Тип диску
+ Система не вибрана
+ Вихідна тека
+ Буква диску
+ Швидкість приводу
+ Програма для дампу
+ Параметри
+
+ Команди
+ Почати дамп
+ Зупинити дамп
+ Сканувати диск
+ Зчитати мітку
+ Сканувати захист
+
+ Вивід звіту
+ Очистити звіт
+ Зберегти звіт
+
+
+ Параметри
+ Ласкаво просимо до MPF, переглянути параметри
+ Якщо ви увімкнете валідацію та завантаження онлайн інформації, автозаповнені дані повинні відповідати даним з вашого диску. Програма підказує які поля варто перевірити але загалом вся відповідальність на вас, будьте пильні!
+
+ Загальні
+ Графічний інтерфейс
+ Увімкнути темний режим
+ Перевіряти оновлення при запуску
+ Скопіювати URL оновлення
+ Швидке оновлення міток
+ Мова інтерфейсу за замовчуванням:
+ Пошук
+ Вимкнути автопошук системи
+ Вимкнути стаціонарні приводи
+ Система за замовчуванням:
+ Звіт
+ Детальний звіт
+ Відкривати звіт автоматично
+
+ Теки
+ Шлях до Aaru
+ Шлях до DiscImageCreator
+ Шлях до Redumper
+ Програма за замовчуванням
+ Вихідна тека за замовчуванням
+
+ Дамп
+ Дамп
+ Показати інформацію по диску
+ Завантажити всю інформацію
+ Увімкнути закладки
+ Увімкнути сумісність з Redump
+ Нагадувати витягнути диск
+ Заповняти поля за замовчуванням
+ Додавати суфікс файлу
+ Створити JSON для подання в систему
+ [ДЕБАГ] Увімкнути артефакти
+ Стискати звіти
+ Компресія звітів:
+ Видалити непотрібні файли
+ Створити PS3 IRD після дампу
+ Protection
+ Увімкнути сканування захисту
+ Сканувати архіви
+ Додавати інформацію для дебагу
+ Приховати букви дисків
+ Швидкість за замовчуванням
+ CD
+ DVD
+ HD-DVD
+ BD
+
+ Програми
+ Aaru
+ Увімкнути вивід інформації для дебагу
+ Увімкнути детальний вивід інформації
+ Форсувати дамп
+ Видалити персональні дані
+ Кількість спроб читання:
+ DiscImageCreator
+ Тихий режим
+ Параноїдальний режим
+ Використовувати мітку CMI
+ Пакетне читання секторів
+ Кількість секторів в одному пакеті:
+ Кількість спроб читання для CD:
+ Спроб читання для DVD/HD-DVD/BD:
+ Redumper
+ Увімкнути детальний вивід інформації
+ Увімкнути секторне покращення
+ Кількість спроб читання:
+ Кількість спроб читання Plextor Lead-in:
+ Розширені параметри
+ Режим читання за замовчуванням:
+ Структура сектору за замовчуванням:
+ Тип приводу за замовчуванням:
+ Pregap start приводу за замовчуванням:
+
+ Інформація для входу
+ Завантаження
+ Завантажити онлайн інформацію
+ Redump
+ Ім'я
+ Пароль
+ Протестувати вхід
+
+
+ Перевірити існуючий дамп
+ Вхіда тека
+ Перевірити дамп
+ Перевірка перепише існуючі інформаційні файли для додавання в систему. Будь-ласка зробіть резервні копії перед запукском перевірки якщо це необхідно.
+
+
+ Створити PS3 IRD
+ Ввід
+ PS3 ISO вихідний файл
+ *.getkey.log вихідний файл
+ Описати кдюч шифрування PS3 диску вручну
+ Шістнадцятковий ключ
+ Key вихідний файл
+ Key статус
+ Описати PS3 Disc ID вручну
+ Disc ID
+ Disc ID статус
+ Описати Permanent Information & Control (PIC) вручну
+ Layerbreak (сектори)
+ PIC
+ PIC вихідний файл
+ PIC статус
+ Створити IRD
+
+
+ Інформація по диску
+ Інструкція по рінгкодах
+
+ Загальна інформація
+ Загальна інформація по диску
+ Назва
+ Альтернативна назва
+ Оригінальна назва
+ Альт. оригінальна назва
+ Номер / Буква диску
+ Назва диску
+ Назва диску (не латиниця)
+ Категорія
+ Регіон
+ Мови
+ Спосіб вибору мови
+ Серійний код
+ Штрихкод
+ Версія і видання
+ Версія
+ Видання
+ Видання (не латиниця)
+
+ Додаткова інформація
+ Коментарі
+ Сумісна ОС
+ Захист
+ Додатково
+ Фізичні ідентифікатори
+ Ідентифікатори видавця
+
+ Вміст
+
+ Рінгкоди
+ Інформація Дані/L0
+ Інформація Графіка/L1
+ Інформація L2
+ Інформація L3
+
+ Інформація тільки для читання
+
+
+ Інструкція по рінгкодах
+
+
+ Про програму
+ Media Preservation Frontend (MPF)
+ Відкритий фронтенд для презервації розроблений на C#.
+ Підтримує Redumper, Aaru та DiscImageCreator.
+ Створений для допомоги проекту Redump.
+ Дякую всім за підтримку цього проекту!
+ Версія
+
+
+ Перевірка оновлення версії
+
+
+ Витягнути диск
+ Зараз безпечно витягнути диск
+
+
+ Вийти
+ Дамп все ще обробляється, ви впевнені що хочете вийти?
+
+
+ Помилка!
+ Виникла помилка, перегляньте звіт для детальної інформації
+
+
+ Знайдений захист
+
+
diff --git a/MPF.Avalonia/Resources/Strings.xaml b/MPF.Avalonia/Resources/Strings.xaml
new file mode 100644
index 000000000..87abb1482
--- /dev/null
+++ b/MPF.Avalonia/Resources/Strings.xaml
@@ -0,0 +1,237 @@
+
+
+
+ ENG
+
+
+ Accept
+ Browse
+ Cancel
+ Minimize
+ Close
+ Settings
+ Status
+ WARNING:
+ Warning
+ Error
+
+
+ Media Preservation Frontend
+
+ _File
+ E_xit
+ _Tools
+ _Check Dump
+ Create _PS3 IRD
+ _Options
+ _Debug Info Window
+ _Help
+ _About
+ _Check for Updates
+
+ System Type
+ System/Media Type
+ No system selected
+ Output Path
+ Drive Letter
+ Drive Speed
+ Dumping Program
+ Parameters
+
+ Controls
+ Start Dumping
+ Stop Dumping
+ Scan for Discs
+ Update Label
+ Scan for Protection
+
+ Log Output
+ Clear Log
+ Save Log
+
+
+ Options
+ Welcome to MPF, Explore the Options
+ If you choose to enable validation and information retrieval, you are responsible for ensuring that all data populated matches your actual media. Some information may be marked to check for validity as a reminder, but all information should be subject to the same scrutiny.
+
+ General
+ User Interface
+ Enable Dark Mode
+ Check for Updates on Startup
+ Copy Update URL to Clipboard
+ Fast Update Label
+ Default UI Language:
+ Detection
+ Skip System Detect
+ No Fixed Drives
+ Default x:
+ Logging
+ Verbose Logging
+ Auto-Open Logs
+
+ Paths
+ Aaru Path
+ DiscImageCreator Path
+ Redumper Path
+ Default Dumping Program
+ Default Output Path
+
+ Dumping
+ Dumping
+ Show Disc Info
+ Pull All Information
+ Enable Tab Input
+ Enable Redump Compatibility
+ Show Eject Reminder
+ Add Placeholders
+ Add Filename Suffix
+ Output Submission JSON
+ [DEBUG] Include Artifacts
+ Compress Log Files
+ Log Compression:
+ Delete Unnecessary Files
+ Create PS3 IRD After Dumping
+ Protection
+ Enable Protection Scan
+ Scan Archive Contents
+ Include Debug Information
+ Hide Drive Letters
+ Default Speeds
+ CD
+ DVD
+ HD-DVD
+ BD
+
+ Programs
+ Aaru
+ Enable Debug Output
+ Enable Verbose Output
+ Force Dumping
+ Strip Personal Data
+ Reread Tries:
+ DiscImageCreator
+ Quiet Mode
+ Paranoid Mode
+ Use CMI Flag
+ Multi-Sector Read
+ Multi-Sector Read Value:
+ CD Reread Tries:
+ DVD/HD-DVD/BD Reread Tries:
+ Redumper
+ Enable Verbose Output
+ Enable Refine Sector Mode Flag
+ Reread Tries:
+ Plextor Lead-in Retries:
+ Non-Redump Options
+ Default Read Method:
+ Default Sector Order:
+ Default Drive Type:
+ Default Drive Pregap Start:
+
+ Login Info
+ Retrieval
+ Retrieve Match Information
+ Redump
+ Username
+ Password
+ Test Login
+
+
+ Check Existing Dump
+ Input Path
+ Check Dump
+ Check will overwrite any existing submission information files. Please make backups of those if you need to before running Check.
+
+
+ Create PS3 IRD
+ Input
+ PS3 ISO Path
+ *.getkey.log File Path
+ Manually define PS3 Disc Encryption Key
+ Hexadecimal Key
+ Key File Path
+ Key Status
+ Manually define PS3 Disc ID
+ Disc ID
+ Disc ID Status
+ Manually define Permanent Information & Control (PIC)
+ Layerbreak (sectors)
+ PIC
+ PIC File Path
+ PIC Status
+ Create IRD
+
+
+ Media Information
+ Ring Code Guide
+
+ Common Info
+ Common Media Information
+ Title
+ Alternative Title
+ Foreign Title (Non-Latin)
+ Alternative Foreign Title
+ Disc Number / Letter
+ Disc Title
+ Disc Title (non-Latin)
+ Category
+ Region
+ Languages
+ Language Selection Via
+ Serial
+ Barcode
+ Version and Editions
+ Version
+ Edition
+ Edition (non-Latin)
+
+ Additional Info
+ Comments
+ Compatible OS
+ Protection
+ Extras
+ Physical Identifiers
+ Publisher Identifiers
+
+ Contents
+
+ Ringcodes
+ Data/L0 Info
+ Label/L1 Info
+ L2 Info
+ L3 Info
+
+ Read-Only Info
+
+
+ Ring Code Guide
+
+
+ About
+ Media Preservation Frontend (MPF)
+ A community preservation frontend developed in C#.
+ Supports Redumper, Aaru, and DiscImageCreator.
+ Originally created to help the Redump project.
+ Thanks to everyone who has supported this project!
+ Version
+
+
+ Version Update Check
+
+
+ Eject
+ It is now safe to eject the disc
+
+
+ Quit
+ A dump is still being processed, are you sure you want to quit?
+
+
+ Error!
+ An exception occurred, see the log for details
+
+
+ Detected Protection(s)
+
+
diff --git a/MPF.Avalonia/Services/DialogService.cs b/MPF.Avalonia/Services/DialogService.cs
new file mode 100644
index 000000000..a30551006
--- /dev/null
+++ b/MPF.Avalonia/Services/DialogService.cs
@@ -0,0 +1,55 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Platform.Storage;
+
+namespace MPF.Avalonia.Services
+{
+ internal static class DialogService
+ {
+ public static async Task OpenFileAsync(Window owner, string title, IReadOnlyList fileTypes)
+ {
+ if (owner.StorageProvider is null)
+ return null;
+
+ var files = await owner.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
+ {
+ Title = title,
+ AllowMultiple = false,
+ FileTypeFilter = fileTypes,
+ });
+
+ return files.FirstOrDefault()?.TryGetLocalPath();
+ }
+
+ public static async Task OpenFolderAsync(Window owner, string title)
+ {
+ if (owner.StorageProvider is null)
+ return null;
+
+ var folders = await owner.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
+ {
+ Title = title,
+ AllowMultiple = false,
+ });
+
+ return folders.FirstOrDefault()?.TryGetLocalPath();
+ }
+
+ public static async Task SaveFileAsync(Window owner, string title, string suggestedName, IReadOnlyList fileTypes)
+ {
+ if (owner.StorageProvider is null)
+ return null;
+
+ var file = await owner.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
+ {
+ Title = title,
+ SuggestedFileName = suggestedName,
+ FileTypeChoices = fileTypes,
+ });
+
+ return file?.TryGetLocalPath();
+ }
+ }
+}
diff --git a/MPF.Avalonia/Services/StringResourceLoader.cs b/MPF.Avalonia/Services/StringResourceLoader.cs
new file mode 100644
index 000000000..d48532d9b
--- /dev/null
+++ b/MPF.Avalonia/Services/StringResourceLoader.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml.Styling;
+using MPF.Frontend;
+
+namespace MPF.Avalonia.Services
+{
+ internal static class StringResourceLoader
+ {
+ private static readonly Dictionary LanguageFiles = new()
+ {
+ [InterfaceLanguage.English] = "Strings.xaml",
+ [InterfaceLanguage.French] = "Strings.fr.xaml",
+ [InterfaceLanguage.German] = "Strings.de.xaml",
+ [InterfaceLanguage.Italian] = "Strings.it.xaml",
+ [InterfaceLanguage.Japanese] = "Strings.ja.xaml",
+ [InterfaceLanguage.Korean] = "Strings.ko.xaml",
+ [InterfaceLanguage.Polish] = "Strings.pl.xaml",
+ [InterfaceLanguage.Portuguese] = "Strings.pt.xaml",
+ [InterfaceLanguage.Russian] = "Strings.ru.xaml",
+ [InterfaceLanguage.Spanish] = "Strings.es.xaml",
+ [InterfaceLanguage.Swedish] = "Strings.sv.xaml",
+ [InterfaceLanguage.Ukrainian] = "Strings.uk.xaml",
+ [InterfaceLanguage.L337] = "Strings.37.xaml",
+ };
+
+ public static void Load(IResourceDictionary resources, InterfaceLanguage language)
+ {
+ resources.MergedDictionaries.Clear();
+
+ AddResource(resources, "Strings.xaml");
+
+ if (language == InterfaceLanguage.AutoDetect)
+ language = FromCurrentCulture();
+
+ if (language != InterfaceLanguage.English && LanguageFiles.TryGetValue(language, out string? fileName))
+ AddResource(resources, fileName);
+ }
+
+ private static void AddResource(IResourceDictionary resources, string fileName)
+ {
+ string assemblyName = typeof(StringResourceLoader).Assembly.GetName().Name ?? "MPF";
+ var uri = new Uri($"avares://{assemblyName}/Assets/{fileName}");
+
+ var resourceInclude = new ResourceInclude(uri)
+ {
+ Source = uri
+ };
+
+ resources.MergedDictionaries.Add(resourceInclude);
+ }
+
+ private static InterfaceLanguage FromCurrentCulture()
+ {
+ return System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName switch
+ {
+ "fr" => InterfaceLanguage.French,
+ "de" => InterfaceLanguage.German,
+ "it" => InterfaceLanguage.Italian,
+ "ja" => InterfaceLanguage.Japanese,
+ "ko" => InterfaceLanguage.Korean,
+ "pl" => InterfaceLanguage.Polish,
+ "pt" => InterfaceLanguage.Portuguese,
+ "ru" => InterfaceLanguage.Russian,
+ "es" => InterfaceLanguage.Spanish,
+ "sv" => InterfaceLanguage.Swedish,
+ "uk" => InterfaceLanguage.Ukrainian,
+ _ => InterfaceLanguage.English,
+ };
+ }
+ }
+}
diff --git a/MPF.Avalonia/Services/ThemeService.cs b/MPF.Avalonia/Services/ThemeService.cs
new file mode 100644
index 000000000..84e0e16c7
--- /dev/null
+++ b/MPF.Avalonia/Services/ThemeService.cs
@@ -0,0 +1,176 @@
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Controls;
+using Avalonia.Media;
+using Avalonia.Platform;
+using Avalonia.Styling;
+using MPF.Frontend;
+
+namespace MPF.Avalonia.Services
+{
+ internal static class ThemeService
+ {
+ public static void SyncWithSystemTheme(Options options)
+ => options.GUI.Theming.EnableDarkMode = IsSystemDarkMode();
+
+ public static void ApplySystemTheme(IResourceDictionary resources, Options options)
+ {
+ SyncWithSystemTheme(options);
+ Apply(resources, options);
+ }
+
+ public static void Apply(IResourceDictionary resources, Options options)
+ {
+ bool darkMode = options.GUI.Theming.EnableDarkMode;
+ Color background = darkMode ? Color.Parse("#FF1F1F1F") : Color.Parse("#FFF5F5F5");
+ Color foreground = darkMode ? Color.Parse("#FFD8D8D8") : Color.Parse("#FF111111");
+
+ if (!string.IsNullOrWhiteSpace(options.GUI.Theming.CustomBackgroundColor)
+ && Color.TryParse(options.GUI.Theming.CustomBackgroundColor, out Color customBackground))
+ {
+ background = customBackground;
+ }
+
+ if (!string.IsNullOrWhiteSpace(options.GUI.Theming.CustomTextColor)
+ && Color.TryParse(options.GUI.Theming.CustomTextColor, out Color customForeground))
+ {
+ foreground = customForeground;
+ }
+
+ resources["AppBackgroundBrush"] = new SolidColorBrush(background);
+ resources["AppForegroundBrush"] = new SolidColorBrush(foreground);
+ resources["HeadingForegroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FFCFCFCF") : Color.Parse("#FF111111"));
+ resources["PanelBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF292929") : Colors.White);
+ resources["PanelBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF424242") : Color.Parse("#FFD0D0D0"));
+ resources["ButtonBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF333333") : Color.Parse("#FFE5E5E5"));
+ resources["ButtonHoverBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF3D3D3D") : Color.Parse("#FFEDEDED"));
+ resources["ButtonPressedBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF2A2A2A") : Color.Parse("#FFD8D8D8"));
+ resources["ButtonDisabledBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF252525") : Color.Parse("#FFE2E2E2"));
+ resources["ButtonBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF424242") : Color.Parse("#FFB8B8B8"));
+ resources["ButtonHoverBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF4A4A4A") : Color.Parse("#FF9F9F9F"));
+ resources["ButtonPressedBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF505050") : Color.Parse("#FF8E8E8E"));
+ resources["ButtonDisabledBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF333333") : Color.Parse("#FFD2D2D2"));
+ resources["DisabledForegroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF5C5C5C") : Color.Parse("#FF8A8A8A"));
+ resources["MenuBackgroundBrush"] = new SolidColorBrush(Colors.Transparent);
+ resources["MenuSubMenuBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF292929") : Colors.White);
+ resources["MenuSubMenuBorderBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF4A4A4A") : Color.Parse("#FFD0D0D0"));
+ resources["MenuItemHoverBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF3D3D3D") : Color.Parse("#FFEDEDED"));
+ resources["MenuItemPressedBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF333333") : Color.Parse("#FFD8D8D8"));
+ resources["TitleBarButtonHoverBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF333333") : Color.Parse("#FFE5E5E5"));
+ resources["TitleBarButtonPressedBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF2A2A2A") : Color.Parse("#FFD0D0D0"));
+ resources["LogBackgroundBrush"] = new SolidColorBrush(darkMode ? Color.Parse("#FF151515") : Color.Parse("#FF202020"));
+ resources["LogForegroundBrush"] = new SolidColorBrush(Color.Parse("#FFF0F0F0"));
+
+ if (global::Avalonia.Application.Current is { } application)
+ {
+ application.RequestedThemeVariant = darkMode ? ThemeVariant.Dark : ThemeVariant.Light;
+ ApplyWindowsTitleBarTheme(darkMode);
+ }
+ }
+
+ public static void ApplyWindowTitleBarTheme(Window window)
+ {
+ if (global::Avalonia.Application.Current is null)
+ return;
+
+ ApplyWindowTitleBarTheme(window, global::Avalonia.Application.Current.RequestedThemeVariant == ThemeVariant.Dark);
+ }
+
+ private static void ApplyWindowsTitleBarTheme(bool darkMode)
+ {
+ if (!OperatingSystem.IsWindows())
+ return;
+
+ if (global::Avalonia.Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+ return;
+
+ foreach (Window window in desktop.Windows)
+ ApplyWindowTitleBarTheme(window, darkMode);
+ }
+
+ private static void ApplyWindowTitleBarTheme(Window window, bool darkMode)
+ {
+ if (!OperatingSystem.IsWindows())
+ return;
+
+ IntPtr hwnd = window.TryGetPlatformHandle()?.Handle ?? IntPtr.Zero;
+ if (hwnd == IntPtr.Zero)
+ return;
+
+ int enabled = darkMode ? 1 : 0;
+ if (DwmSetWindowAttribute(hwnd, DwmWindowAttributeUseImmersiveDarkMode, ref enabled, sizeof(int)) != 0)
+ _ = DwmSetWindowAttribute(hwnd, DwmWindowAttributeUseImmersiveDarkModeBefore20H1, ref enabled, sizeof(int));
+ }
+
+ private static bool IsSystemDarkMode()
+ {
+ PlatformThemeVariant? themeVariant = global::Avalonia.Application.Current?
+ .PlatformSettings?
+ .GetColorValues()
+ .ThemeVariant;
+
+ if (themeVariant == PlatformThemeVariant.Dark)
+ return true;
+
+ if (!OperatingSystem.IsLinux())
+ return false;
+
+ return IsLinuxDarkMode();
+ }
+
+ private static bool IsLinuxDarkMode()
+ => IsDarkThemeName(Environment.GetEnvironmentVariable("GTK_THEME"))
+ || IsDarkThemeName(Environment.GetEnvironmentVariable("QT_STYLE_OVERRIDE"))
+ || IsDarkThemeName(RunCommand("gsettings", "get org.gnome.desktop.interface color-scheme"))
+ || IsDarkThemeName(RunCommand("gsettings", "get org.gnome.desktop.interface gtk-theme"))
+ || IsKdeColorSchemeDark();
+
+ private static bool IsKdeColorSchemeDark()
+ {
+ string? colorScheme = RunCommand("kreadconfig6", "--group General --key ColorScheme")
+ ?? RunCommand("kreadconfig5", "--group General --key ColorScheme");
+
+ return IsDarkThemeName(colorScheme);
+ }
+
+ private static bool IsDarkThemeName(string? value)
+ => value?.IndexOf("dark", StringComparison.OrdinalIgnoreCase) >= 0
+ || value?.IndexOf("prefer-dark", StringComparison.OrdinalIgnoreCase) >= 0;
+
+ private static string? RunCommand(string fileName, string arguments)
+ {
+ try
+ {
+ using Process process = Process.Start(new ProcessStartInfo
+ {
+ FileName = fileName,
+ Arguments = arguments,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ })!;
+
+ if (!process.WaitForExit(1000))
+ {
+ process.Kill(true);
+ return null;
+ }
+
+ return process.ExitCode == 0 ? process.StandardOutput.ReadToEnd().Trim() : null;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ private const int DwmWindowAttributeUseImmersiveDarkModeBefore20H1 = 19;
+ private const int DwmWindowAttributeUseImmersiveDarkMode = 20;
+
+ [DllImport("dwmapi.dll")]
+ private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int attributeValue, int attributeSize);
+ }
+}
diff --git a/MPF.Avalonia/Services/WindowChromeService.cs b/MPF.Avalonia/Services/WindowChromeService.cs
new file mode 100644
index 000000000..e06e504d4
--- /dev/null
+++ b/MPF.Avalonia/Services/WindowChromeService.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Runtime.InteropServices;
+using Avalonia.Controls;
+using Avalonia.Threading;
+
+namespace MPF.Avalonia.Services
+{
+ internal static class WindowChromeService
+ {
+ public static void Apply(Window window, bool hideMinimizeButton = false)
+ {
+ HideMacOSUnavailableWindowButtons(window, hideMinimizeButton);
+ Dispatcher.UIThread.Post(() => HideMacOSUnavailableWindowButtons(window, hideMinimizeButton), DispatcherPriority.Loaded);
+ ThemeService.ApplyWindowTitleBarTheme(window);
+ }
+
+ private static void HideMacOSUnavailableWindowButtons(Window window, bool hideMinimizeButton)
+ {
+ if (!OperatingSystem.IsMacOS())
+ return;
+
+ IntPtr nsWindow = window.TryGetPlatformHandle()?.Handle ?? IntPtr.Zero;
+ if (nsWindow == IntPtr.Zero)
+ return;
+
+ ulong styleMask = objc_msgSend_ulong(nsWindow, sel_registerName("styleMask"));
+ if (hideMinimizeButton)
+ styleMask &= ~NSWindowStyleMaskMiniaturizable;
+
+ if (!window.CanResize)
+ styleMask &= ~NSWindowStyleMaskResizable;
+
+ objc_msgSend_ulong(nsWindow, sel_registerName("setStyleMask:"), styleMask);
+
+ if (hideMinimizeButton)
+ HideMacOSWindowButton(nsWindow, NSWindowMiniaturizeButton);
+
+ if (!window.CanResize)
+ HideMacOSWindowButton(nsWindow, NSWindowZoomButton);
+ }
+
+ private static void HideMacOSWindowButton(IntPtr nsWindow, long button)
+ {
+ IntPtr windowButton = objc_msgSend_IntPtr_Int64(nsWindow, sel_registerName("standardWindowButton:"), button);
+ if (windowButton == IntPtr.Zero)
+ return;
+
+ objc_msgSend_double(windowButton, sel_registerName("setAlphaValue:"), 0);
+ objc_msgSend_bool(windowButton, sel_registerName("setHidden:"), true);
+ objc_msgSend_bool(windowButton, sel_registerName("setEnabled:"), false);
+ }
+
+ private const ulong NSWindowStyleMaskMiniaturizable = 1UL << 2;
+ private const ulong NSWindowStyleMaskResizable = 1UL << 3;
+ private const long NSWindowMiniaturizeButton = 1;
+ private const long NSWindowZoomButton = 2;
+
+ [DllImport("/usr/lib/libobjc.A.dylib")]
+ private static extern IntPtr sel_registerName(string name);
+
+ [DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
+ private static extern IntPtr objc_msgSend_IntPtr_Int64(IntPtr receiver, IntPtr selector, long argument);
+
+ [DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
+ private static extern void objc_msgSend_bool(IntPtr receiver, IntPtr selector, bool argument);
+
+ [DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
+ private static extern void objc_msgSend_double(IntPtr receiver, IntPtr selector, double argument);
+
+ [DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
+ private static extern ulong objc_msgSend_ulong(IntPtr receiver, IntPtr selector);
+
+ [DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
+ private static extern void objc_msgSend_ulong(IntPtr receiver, IntPtr selector, ulong argument);
+ }
+}
diff --git a/MPF.Avalonia/UserControls/LogOutput.axaml b/MPF.Avalonia/UserControls/LogOutput.axaml
new file mode 100644
index 000000000..561b9578b
--- /dev/null
+++ b/MPF.Avalonia/UserControls/LogOutput.axaml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MPF.Avalonia/UserControls/LogOutput.axaml.cs b/MPF.Avalonia/UserControls/LogOutput.axaml.cs
new file mode 100644
index 000000000..92719ab10
--- /dev/null
+++ b/MPF.Avalonia/UserControls/LogOutput.axaml.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.ObjectModel;
+using System.IO;
+using Avalonia.Controls;
+using Avalonia.Media;
+using Avalonia.Styling;
+using Avalonia.Threading;
+using MPF.Frontend;
+
+namespace MPF.Avalonia.UserControls
+{
+ public partial class LogOutput : UserControl
+ {
+ public const double DefaultConsoleHeight = 180;
+ private const int MaxEntryCount = 5000;
+
+ public ObservableCollection Entries { get; } = [];
+
+ public LogOutput()
+ {
+ InitializeComponent();
+ DataContext = this;
+
+ this.FindControl