diff --git a/source/Playnite.Common/Computer.cs b/source/Playnite.Common/Computer.cs index c481d0582..b03b4c911 100644 --- a/source/Playnite.Common/Computer.cs +++ b/source/Playnite.Common/Computer.cs @@ -1,4 +1,5 @@ using Microsoft.Win32; +using Playnite.SDK; using System; using System.Collections.Generic; using System.Linq; @@ -54,8 +55,18 @@ public enum WindowsVersion Win10 } + public enum HwCompany + { + Intel, + AMD, + Nvidia, + VMware, + Uknown + } + public static class Computer { + private static readonly ILogger logger = LogManager.GetLogger(); public static WindowsVersion WindowsVersion { get @@ -167,5 +178,56 @@ public static ComputerScreen ToComputerScreen(this Screen screen) return new ComputerScreen(screen); } } + + public static List GetGpuVendors() + { + var gpus = new List(); + var vendors = new List(); + try + { + using (var video = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController")) + { + foreach (var obj in video.Get()) + { + gpus.Add(obj["Name"].ToString()); + } + } + + foreach (var gpu in gpus) + { + if (gpu.Contains("intel", StringComparison.OrdinalIgnoreCase)) + { + vendors.AddMissing(HwCompany.Intel); + } + else if (gpu.Contains("nvidia", StringComparison.OrdinalIgnoreCase)) + { + vendors.AddMissing(HwCompany.Nvidia); + } + else if (gpu.Contains("amd", StringComparison.OrdinalIgnoreCase)) + { + vendors.AddMissing(HwCompany.AMD); + } + else if (gpu.Contains("vmware", StringComparison.OrdinalIgnoreCase)) + { + vendors.AddMissing(HwCompany.VMware); + } + else + { + return new List { HwCompany.Uknown }; + } + } + + if (vendors.Count > 0) + { + return vendors; + } + } + catch (Exception e) + { + logger.Error(e, "Failed to get GPU vendor."); + } + + return new List { HwCompany.Uknown }; + } } } diff --git a/source/Playnite.Common/Extensions/BitmapExtensions.cs b/source/Playnite.Common/Extensions/BitmapExtensions.cs index 02489d9e6..6be3f2711 100644 --- a/source/Playnite.Common/Extensions/BitmapExtensions.cs +++ b/source/Playnite.Common/Extensions/BitmapExtensions.cs @@ -16,21 +16,77 @@ namespace System.Drawing.Imaging { - public class BitmapLoadProperties + public class BitmapLoadProperties: IEquatable { public DpiScale? DpiScale { get; set; } public int MaxDecodePixelWidth { get; set; } = 0; + public int MaxDecodePixelHeight { get; set; } = 0; public string Source { get; set; } - public BitmapLoadProperties(int decodePixelWidth) + public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight) { MaxDecodePixelWidth = decodePixelWidth; + MaxDecodePixelHeight = decodePixelHeight; } - public BitmapLoadProperties(int decodePixelWidth, DpiScale? dpiScale) + public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale? dpiScale) { MaxDecodePixelWidth = decodePixelWidth; + MaxDecodePixelHeight = decodePixelHeight; DpiScale = dpiScale; + } + + public bool Equals(BitmapLoadProperties other) + { + if (other is null) + { + return false; + } + + if (DpiScale?.Equals(other.DpiScale) == false) + { + return false; + } + + if (MaxDecodePixelWidth != other.MaxDecodePixelWidth) + { + return false; + } + + if (MaxDecodePixelHeight != other.MaxDecodePixelHeight) + { + return false; + } + + if (!string.Equals(Source, other.Source, StringComparison.Ordinal)) + { + return false; + } + + return true; + } + + public override bool Equals(object obj) => Equals(obj as BitmapLoadProperties); + + public override int GetHashCode() => + (Source == null ? 0 : Source.GetHashCode()) ^ + (DpiScale == null ? 0 : DpiScale.GetHashCode()) ^ + MaxDecodePixelWidth.GetHashCode() ^ + MaxDecodePixelHeight.GetHashCode(); + + public static bool operator ==(BitmapLoadProperties obj1, BitmapLoadProperties obj2) + { + return obj1?.Equals(obj2) == true; + } + + public static bool operator !=(BitmapLoadProperties obj1, BitmapLoadProperties obj2) + { + return obj1?.Equals(obj2) == false; + } + + public override string ToString() + { + return $"{MaxDecodePixelWidth}x{MaxDecodePixelHeight};{DpiScale?.DpiScaleX}x{DpiScale?.DpiScaleY};{Source}"; } } @@ -107,21 +163,45 @@ public static BitmapImage BitmapFromStream(Stream stream, BitmapLoadProperties l try { var properties = Images.GetImageProperties(stream); + var aspect = new AspectRatio(properties.Width, properties.Height); stream.Seek(0, SeekOrigin.Begin); var bitmap = new BitmapImage(); bitmap.BeginInit(); + if (loadProperties?.MaxDecodePixelWidth > 0 && properties?.Width > loadProperties?.MaxDecodePixelWidth) { if (loadProperties.DpiScale != null) { - bitmap.DecodePixelWidth = Convert.ToInt32(loadProperties.MaxDecodePixelWidth * loadProperties.DpiScale.Value.DpiScaleX); + bitmap.DecodePixelWidth = (int)Math.Round(loadProperties.MaxDecodePixelWidth * loadProperties.DpiScale.Value.DpiScaleX); } else { bitmap.DecodePixelWidth = loadProperties.MaxDecodePixelWidth; } } - bitmap.StreamSource = stream; + + if (loadProperties?.MaxDecodePixelHeight > 0 && properties?.Height > loadProperties?.MaxDecodePixelHeight) + { + if (loadProperties.DpiScale != null) + { + bitmap.DecodePixelHeight = Convert.ToInt32(loadProperties.MaxDecodePixelHeight * loadProperties.DpiScale.Value.DpiScaleY); + } + else + { + bitmap.DecodePixelHeight = loadProperties.MaxDecodePixelHeight; + } + } + + if (bitmap.DecodePixelHeight != 0 && bitmap.DecodePixelWidth == 0) + { + bitmap.DecodePixelWidth = (int)Math.Round(aspect.GetWidth(bitmap.DecodePixelHeight)); + } + else if (bitmap.DecodePixelWidth != 0 && bitmap.DecodePixelHeight == 0) + { + bitmap.DecodePixelHeight = (int)Math.Round(aspect.GetHeight(bitmap.DecodePixelWidth)); + } + + bitmap.StreamSource = stream; bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.EndInit(); bitmap.Freeze(); @@ -178,32 +258,6 @@ public static Bitmap ToBitmap(this BitmapImage bitmapImage) } } - public static BitmapImage ToBitmapImage(this Bitmap bitmap, BitmapLoadProperties loadProperties = null) - { - using (var memory = new MemoryStream()) - { - bitmap.Save(memory, ImageFormat.Png); - memory.Seek(0, SeekOrigin.Begin); - var properties = Images.GetImageProperties(memory); - memory.Seek(0, SeekOrigin.Begin); - var bitmapImage = new BitmapImage(); - bitmapImage.BeginInit(); - if (loadProperties.DpiScale != null) - { - bitmapImage.DecodePixelWidth = Convert.ToInt32(loadProperties.MaxDecodePixelWidth * loadProperties.DpiScale.Value.DpiScaleX); - } - else - { - bitmapImage.DecodePixelWidth = loadProperties.MaxDecodePixelWidth; - } - bitmapImage.StreamSource = memory; - bitmapImage.CacheOption = BitmapCacheOption.OnLoad; - bitmapImage.EndInit(); - bitmapImage.Freeze(); - return bitmapImage; - } - } - public static BitmapImage TgaToBitmap(string tgaPath) { return TgaToBitmap(new TGA(tgaPath)); diff --git a/source/Playnite.Common/Sizes.cs b/source/Playnite.Common/Sizes.cs index 673619841..8c9390fe0 100644 --- a/source/Playnite.Common/Sizes.cs +++ b/source/Playnite.Common/Sizes.cs @@ -50,17 +50,7 @@ public AspectRatio(int width, int height) Height = height; } - public override bool Equals(object obj) - { - if (obj is AspectRatio other) - { - return other.Height == Height && other.Width == Width; - } - else - { - return false; - } - } + public override bool Equals(object obj) => Equals(obj as AspectRatio); public bool Equals(AspectRatio other) { @@ -71,10 +61,17 @@ public bool Equals(AspectRatio other) public override int GetHashCode() { - var hashCode = 859600377; - hashCode = hashCode * -1521134295 + Width.GetHashCode(); - hashCode = hashCode * -1521134295 + Height.GetHashCode(); - return hashCode; + return Height.GetHashCode() ^ Width.GetHashCode(); + } + + public static bool operator ==(AspectRatio obj1, AspectRatio obj2) + { + return obj1?.Equals(obj2) == true; + } + + public static bool operator !=(AspectRatio obj1, AspectRatio obj2) + { + return obj1?.Equals(obj2) == false; } public override string ToString() diff --git a/source/Playnite.DesktopApp/Controls/GameListItem.cs b/source/Playnite.DesktopApp/Controls/GameListItem.cs index a02e68423..50b88fad0 100644 --- a/source/Playnite.DesktopApp/Controls/GameListItem.cs +++ b/source/Playnite.DesktopApp/Controls/GameListItem.cs @@ -90,14 +90,14 @@ public override void OnApplyTemplate() var sourceBinding = new PriorityBinding(); sourceBinding.Bindings.Add(new Binding() { - Path = new PropertyPath(nameof(GamesCollectionViewEntry.IconObjectCached)), + Path = new PropertyPath(nameof(GamesCollectionViewEntry.DetailsListIconObjectCached)), IsAsync = mainModel.AppSettings.AsyncImageLoading, Converter = new NullToDependencyPropertyUnsetConverter(), Mode = BindingMode.OneWay }); sourceBinding.Bindings.Add(new Binding() { - Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultIconObjectCached)), + Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultDetailsListIconObjectCached)), Converter = new NullToDependencyPropertyUnsetConverter(), Mode = BindingMode.OneWay }); @@ -111,14 +111,14 @@ public override void OnApplyTemplate() var sourceBinding = new PriorityBinding(); sourceBinding.Bindings.Add(new Binding() { - Path = new PropertyPath(nameof(GamesCollectionViewEntry.CoverImageObjectCached)), + Path = new PropertyPath(nameof(GamesCollectionViewEntry.GridViewCoverObjectCached)), IsAsync = mainModel.AppSettings.AsyncImageLoading, Converter = new NullToDependencyPropertyUnsetConverter(), Mode = BindingMode.OneWay }); sourceBinding.Bindings.Add(new Binding() { - Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultCoverImageObjectCached)), + Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultGridViewCoverObjectCached)), Converter = new NullToDependencyPropertyUnsetConverter(), Mode = BindingMode.OneWay }); diff --git a/source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml b/source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml index 81eac1378..3fab80123 100644 --- a/source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml +++ b/source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml @@ -104,5 +104,8 @@ + + diff --git a/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml b/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml new file mode 100644 index 000000000..140e9f6e5 --- /dev/null +++ b/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml @@ -0,0 +1,14 @@ + + + + + diff --git a/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml.cs b/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml.cs new file mode 100644 index 000000000..265a6dc10 --- /dev/null +++ b/source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Playnite.DesktopApp.Controls.SettingsSections +{ + /// + /// Interaction logic for EmptyParent.xaml + /// + public partial class NoSettingsAvailable : UserControl + { + public NoSettingsAvailable() + { + InitializeComponent(); + } + } +} diff --git a/source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml b/source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml index 11f361211..257f587b2 100644 --- a/source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml +++ b/source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml @@ -4,7 +4,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:sys="clr-namespace:System;assembly=mscorlib" - xmlns:psdk="clr-namespace:Playnite.SDK;assembly=Playnite.SDK" + xmlns:psdk="clr-namespace:Playnite.SDK;assembly=Playnite.SDK" + xmlns:pcon="clr-namespace:Playnite.Converters;assembly=Playnite" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> @@ -15,6 +16,7 @@ + @@ -22,7 +24,10 @@ - + + + @@ -33,17 +38,22 @@ IronPython + + + + + - - + - - + diff --git a/source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml b/source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml index 47ef6f9aa..95343bd66 100644 --- a/source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml +++ b/source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml @@ -7,7 +7,7 @@ mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - AppearanceLayout.xaml + + NoSettingsAvailable.xaml + EmptyParent.xaml @@ -510,6 +513,10 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml b/source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml index fa0b98547..dc4f5018e 100644 --- a/source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml +++ b/source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml @@ -4,6 +4,8 @@ - - - - - - - - - - - - + + + Game.Id; @@ -90,13 +90,18 @@ public class GamesCollectionViewEntry : INotifyPropertyChanged, IDisposable public object DefaultIconObject => GetDefaultIcon(false); public object DefaultCoverImageObject => GetDefaultCoverImage(false); - public object IconObjectCached => GetImageObject(Game.Icon, true, iconLoadProperties); - public object CoverImageObjectCached => GetImageObject(Game.CoverImage, true, coverLoadProperties); - public object DefaultIconObjectCached => GetDefaultIcon(true, iconLoadProperties); - public object DefaultCoverImageObjectCached => GetDefaultCoverImage(true, coverLoadProperties); + public object IconObjectCached => GetImageObject(Game.Icon, true); + public object CoverImageObjectCached => GetImageObject(Game.CoverImage, true); + public object DefaultIconObjectCached => GetDefaultIcon(true); + public object DefaultCoverImageObjectCached => GetDefaultCoverImage(true); public string DisplayBackgroundImage => GetBackgroundImage(); - public object DisplayBackgroundImageObject => GetBackgroundImageObject(backgroundLoadProperties); + public object DisplayBackgroundImageObject => GetBackgroundImageObject(backgroundImageProperties); + + public object DetailsListIconObjectCached => GetImageObject(Game.Icon, true, detailsListIconProperties); + public object GridViewCoverObjectCached => GetImageObject(Game.CoverImage, true, gridViewCoverProperties); + public object DefaultDetailsListIconObjectCached => GetDefaultIcon(true, detailsListIconProperties); + public object DefaultGridViewCoverObjectCached => GetDefaultCoverImage(true, gridViewCoverProperties); public Series Series { @@ -177,18 +182,21 @@ public GamesCollectionViewEntry(Game game, LibraryPlugin plugin, PlayniteSetting application = PlayniteApplication.Current; if (application?.Mode == ApplicationMode.Desktop) { - iconLoadProperties = new BitmapLoadProperties( + detailsListIconProperties = new BitmapLoadProperties( + 0, Convert.ToInt32(settings.DetailsViewListIconSize), application.DpiScale); - coverLoadProperties = new BitmapLoadProperties( + gridViewCoverProperties = new BitmapLoadProperties( Convert.ToInt32(settings.GridItemWidth), + 0, application.DpiScale); } if (application != null) { - backgroundLoadProperties = new BitmapLoadProperties( + backgroundImageProperties = new BitmapLoadProperties( application.CurrentScreen.WorkingArea.Width, + 0, application.DpiScale); } @@ -204,18 +212,24 @@ private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(PlayniteSettings.DetailsViewListIconSize)) { - iconLoadProperties = new BitmapLoadProperties( + detailsListIconProperties = new BitmapLoadProperties( + 0, Convert.ToInt32(settings.DetailsViewListIconSize), - PlayniteApplication.Current.DpiScale); - OnPropertyChanged(nameof(IconObjectCached)); + PlayniteApplication.Current.DpiScale); + OnPropertyChanged(nameof(DetailsListIconObjectCached)); + OnPropertyChanged(nameof(DefaultDetailsListIconObjectCached)); } - if (e.PropertyName == nameof(PlayniteSettings.GridItemWidth)) + if (e.PropertyName == nameof(PlayniteSettings.GridItemWidth) || + e.PropertyName == nameof(PlayniteSettings.CoverAspectRatio) || + e.PropertyName == nameof(PlayniteSettings.CoverArtStretch)) { - coverLoadProperties = new BitmapLoadProperties( + gridViewCoverProperties = new BitmapLoadProperties( Convert.ToInt32(settings.GridItemWidth), - PlayniteApplication.Current.DpiScale); - OnPropertyChanged(nameof(CoverImageObjectCached)); + 0, + PlayniteApplication.Current.DpiScale); + OnPropertyChanged(nameof(GridViewCoverObjectCached)); + OnPropertyChanged(nameof(DefaultGridViewCoverObjectCached)); } } } @@ -270,12 +284,14 @@ public void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IconObject))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IconObjectCached))); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DetailsListIconObjectCached))); } if (propertyName == nameof(Game.CoverImage)) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CoverImageObject))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CoverImageObjectCached))); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(GridViewCoverObjectCached))); } if (propertyName == nameof(Game.BackgroundImage)) @@ -365,11 +381,11 @@ public object GetBackgroundImageObject(BitmapLoadProperties loadProperties = nul { if (loadProperties == null) { - return new BitmapLoadProperties(0) { Source = imagePath }; + return new BitmapLoadProperties(0, 0) { Source = imagePath }; } else { - return new BitmapLoadProperties(loadProperties.MaxDecodePixelWidth, loadProperties.DpiScale) + return new BitmapLoadProperties(loadProperties.MaxDecodePixelWidth, 0, loadProperties.DpiScale) { Source = imagePath }; diff --git a/source/Playnite/GamesEditor.cs b/source/Playnite/GamesEditor.cs index af2f01a75..13c744c57 100644 --- a/source/Playnite/GamesEditor.cs +++ b/source/Playnite/GamesEditor.cs @@ -312,7 +312,14 @@ public void RemoveGame(Game game) return; } - Database.Games.Remove(game); + if (Database.Games[game.Id] == null) + { + logger.Warn($"Failed to remove game {game.Name} {game.Id}, game doesn't exists anymore."); + } + else + { + Database.Games.Remove(game); + } } public void RemoveGames(List games) @@ -336,6 +343,15 @@ public void RemoveGames(List games) return; } + foreach (var game in games.ToList()) + { + if (Database.Games[game.Id] == null) + { + logger.Warn($"Failed to remove game {game.Name} {game.Id}, game doesn't exists anymore."); + games.Remove(game); + } + } + Database.Games.Remove(games); } diff --git a/source/Playnite/HttpFileCache.cs b/source/Playnite/HttpFileCache.cs index 1c4a2a8d2..cf980f61a 100644 --- a/source/Playnite/HttpFileCache.cs +++ b/source/Playnite/HttpFileCache.cs @@ -85,7 +85,14 @@ public static void ClearCache(string url) if (File.Exists(cacheFile)) { logger.Debug($"Removing {url} from file cache: {cacheFile}"); - FileSystem.DeleteFileSafe(cacheFile); + try + { + FileSystem.DeleteFileSafe(cacheFile); + } + catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors) + { + logger.Error(e, $"Failed to remove {url} from cache."); + } } } } diff --git a/source/Playnite/ImageSourceManager.cs b/source/Playnite/ImageSourceManager.cs index f8cec3739..239a4a8fb 100644 --- a/source/Playnite/ImageSourceManager.cs +++ b/source/Playnite/ImageSourceManager.cs @@ -166,7 +166,7 @@ public static BitmapImage GetImage(string source, bool cached, BitmapLoadPropert existingMetadata = (BitmapLoadProperties)metaValue; } - if (existingMetadata?.MaxDecodePixelWidth == loadProperties?.MaxDecodePixelWidth) + if (existingMetadata == loadProperties) { return image.CacheObject as BitmapImage; } diff --git a/source/Playnite/Localization/LocSource.xaml b/source/Playnite/Localization/LocSource.xaml index 875c3a155..b287e9716 100644 --- a/source/Playnite/Localization/LocSource.xaml +++ b/source/Playnite/Localization/LocSource.xaml @@ -404,6 +404,9 @@ New database location will only be used after application is restarted.Layout Horizontal Scrolling Select one of the subsections + No settings available + These scripts are executed for every game in the library. Individual scripts can be assigned to each game separately while editing game details. + Animate background image transitions Font sizes Auto Aliased diff --git a/source/Playnite/Localization/af_ZA.xaml b/source/Playnite/Localization/af_ZA.xaml index 74c04022e..17e49afa5 100644 --- a/source/Playnite/Localization/af_ZA.xaml +++ b/source/Playnite/Localization/af_ZA.xaml @@ -361,6 +361,9 @@ + + + diff --git a/source/Playnite/Localization/ar_SA.xaml b/source/Playnite/Localization/ar_SA.xaml index b4256b068..cc139bb48 100644 --- a/source/Playnite/Localization/ar_SA.xaml +++ b/source/Playnite/Localization/ar_SA.xaml @@ -363,6 +363,9 @@ + + + diff --git a/source/Playnite/Localization/ca_ES.xaml b/source/Playnite/Localization/ca_ES.xaml index d02677326..3df0fd3b3 100644 --- a/source/Playnite/Localization/ca_ES.xaml +++ b/source/Playnite/Localization/ca_ES.xaml @@ -391,6 +391,9 @@ Totes les tasques actives (descàrregues de bases de dades) s’anul·laran.Disposició Desplaçament horitzontal + + + diff --git a/source/Playnite/Localization/cs_CZ.xaml b/source/Playnite/Localization/cs_CZ.xaml index 4f6d9942c..70ce20e62 100644 --- a/source/Playnite/Localization/cs_CZ.xaml +++ b/source/Playnite/Localization/cs_CZ.xaml @@ -403,6 +403,9 @@ Nové umístění databáze bude použito po restartu aplikace. Rozložení Horizontální skrolování Vyberte jednu z podkategorií + Nejsou dostupná žádná nastavení + Tyto skripty jsou spuštěny pro každou hru v knihovně. Jednotlivé skripty mohou být přiřazeny ke každé hře zvlášť, v úpravách detailů hry. + Animovat přechody mezi obrázky na pozadí Velikosti písma Automaticky Vyhlazené diff --git a/source/Playnite/Localization/da_DK.xaml b/source/Playnite/Localization/da_DK.xaml index 34de08038..4f21402b7 100644 --- a/source/Playnite/Localization/da_DK.xaml +++ b/source/Playnite/Localization/da_DK.xaml @@ -375,6 +375,9 @@ Bliver: -image "c:\mappe\billede.iso" -fullscreen Layout + + + diff --git a/source/Playnite/Localization/de_DE.xaml b/source/Playnite/Localization/de_DE.xaml index 8cf8602a8..d2da2370a 100644 --- a/source/Playnite/Localization/de_DE.xaml +++ b/source/Playnite/Localization/de_DE.xaml @@ -21,7 +21,7 @@ Homepage: www.playnite.link Quellcode auf GitHub Diagnosedaten erstellen - Diag.-Informationen senden + Diagnosedaten senden Über Playnite von Josef Němec @@ -372,9 +372,9 @@ Daten des offiziellem Shops des Anbieters bevorzugen. Falls nicht verfügbar, IG Weitere Erweiterungen beziehen Neue Erweiterung erstellen Playnite übersetzen - Um die Änderungen anzuwenden muss Playnite neu gestartet werden. Soll Planite jetzt neu gestartet werden? - -Alle laufenden Hintergrundprozesse (z.B. der Download von Metadaten) werden abgebrochen. + Für einige der geänderten Einstellungen muss Playnite neu gestartet werden. Möchtest du Playnite jetzt neu starten? + +Jegliche aktuell laufenden Aufgaben (Herunterladen von Metadaten) werden abgebrochen. Playnite neu starten? Playnite verschiebt die Bibliotheksdateien nicht automatisch, du musst diese daher vor dem Wechsel des Speicherorts verschieben/kopieren. Ist am Zielort keine Bibliothek vorhanden, wird eine neue erstellt. @@ -403,6 +403,9 @@ Der neue Speicherort wird erst nach einem Neustart von Playnite verwendet.Layout Horizontales Scrollen Wähle einen der Unterabschnitte aus + Keine Einstellungen verfügbar + Diese Skripte werden für jedes Spiel der Bibliothek ausgeführt. Individuelle Skripte können für jedes Spiel beim Bearbeiten der Spieldetails separat zugewiesen werden. + Übergänge von Hintergrundbildern animieren Schriftgrößen Automatisch Aliased @@ -638,7 +641,7 @@ Du kannst folgende Maßnahmen versuchen, um das Problem zu beheben: Wird gestartet … Im Spiel Ungültige URL - Nichts unternehmen + Nichts tun Minimieren Wiederherstellen Schließen @@ -657,7 +660,7 @@ Du kannst folgende Maßnahmen versuchen, um das Problem zu beheben: Benutzerwertung Expertenwertung Communitywertung - [UNUSED] + Skripte Plugins Metadatenquellen Erweiterungen @@ -741,7 +744,7 @@ Du kannst folgende Maßnahmen versuchen, um das Problem zu beheben: Beschreibungstext muss HTML-Syntax verwenden Spielzeit wird in Sekunden gemessen und gespeichert. Werte von 0 bis 100 oder leer für keine Bewertung. - Playnites Entwicklung wird finanziell unterstützt durch: + Playnites Entwicklung wird finanziell unterstützt von: Mitwirkende bei Code, Lokalisierung etc: Spielüberwachung beenden? diff --git a/source/Playnite/Localization/el_GR.xaml b/source/Playnite/Localization/el_GR.xaml index f9feeaf9c..f084633ac 100644 --- a/source/Playnite/Localization/el_GR.xaml +++ b/source/Playnite/Localization/el_GR.xaml @@ -390,6 +390,9 @@ IGDB> Επίσημο κατάστημα: + + + diff --git a/source/Playnite/Localization/eo_UY.xaml b/source/Playnite/Localization/eo_UY.xaml index 18d228d8c..f1c01094b 100644 --- a/source/Playnite/Localization/eo_UY.xaml +++ b/source/Playnite/Localization/eo_UY.xaml @@ -361,6 +361,9 @@ + + + diff --git a/source/Playnite/Localization/es_ES.xaml b/source/Playnite/Localization/es_ES.xaml index 6a9b18d23..bcbf6798d 100644 --- a/source/Playnite/Localization/es_ES.xaml +++ b/source/Playnite/Localization/es_ES.xaml @@ -403,6 +403,9 @@ La nueva ubicación de la base de datos solo se usará después de reiniciar la Disposición Desplazamiento horizontal Selecciona una de las subsecciones + No hay ajustes disponibles + Estos scripts son ejecutados para todos los juegos en la libreria. Scripts individuales pueden ser asignados a cada juego por separado mientras editas los detalles del juego. + Animar transiciones de imágenes de fondo Tamaño de letra Auto Aliased diff --git a/source/Playnite/Localization/fi_FI.xaml b/source/Playnite/Localization/fi_FI.xaml index d6bdbe874..fd5b13c90 100644 --- a/source/Playnite/Localization/fi_FI.xaml +++ b/source/Playnite/Localization/fi_FI.xaml @@ -391,6 +391,9 @@ Kaikki aktiiviset tapahtumat (metadatan lataukset) peruutetaan. Asettelu Vaakasuuntainen vieritys Valitse yksi alakohdista + + + Kirjasinkoot Automaattinen Pehmentämätön diff --git a/source/Playnite/Localization/fr_FR.xaml b/source/Playnite/Localization/fr_FR.xaml index 7b1086038..8e0de5f14 100644 --- a/source/Playnite/Localization/fr_FR.xaml +++ b/source/Playnite/Localization/fr_FR.xaml @@ -20,7 +20,7 @@ www.playnite.link Code source sur GitHub - Rapport de bug + Créer un dossier de diagnostic Envoyer un dossier de diagnostic À propos de Playnite Créé par Josef Nemec @@ -48,7 +48,7 @@ Si vous souhaitez nous aider à corriger ce problème, veuillez créer un rappor Signaler un Crash Relancer Playnite Quitter Playnite - Actions au moment du crash (à rédiger en anglais) : + Activité au moment du crash (à rédiger en anglais) : Gestionnaire de bibliothèque Supprimer le(s) jeu(x) ? @@ -396,6 +396,9 @@ Le nouvel emplacement de la base de données ne sera utilisé qu'après le redé Affichage Défilement Horizontal Sélectionner une sous-section + Aucun paramètre n'est disponible + Ces scripts s'appliquent à la totalité des jeux de la bibliothèque. Des scripts individuels peuvent être assignés de manière indépendante en modifiant les propriétés de chaque jeu. + Animer les transitions des images de fond Taille du texte Automatique Aliasé @@ -405,7 +408,7 @@ Le nouvel emplacement de la base de données ne sera utilisé qu'après le redé Affichage Formatage du texte Mode de rendu du texte - Les options de rendu et de formatage du texte ne s'appliquent pas actuellement au texte de description du jeu. + Les options de rendu et de formatage du texte ne s'appliquent pas actuellement aux textes de description des jeux. Téléchargement les images de fond immédiatement Lorsque cette option est active, Playnite téléchargera les images de fond en même temps que le reste des métadonnées. Cela nécessitera davantage d'espace disque mais rendra les images de fond disponible lorsque vous êtes hors-ligne. diff --git a/source/Playnite/Localization/he_IL.xaml b/source/Playnite/Localization/he_IL.xaml index 2827318e4..4c947908e 100644 --- a/source/Playnite/Localization/he_IL.xaml +++ b/source/Playnite/Localization/he_IL.xaml @@ -401,6 +401,9 @@ IGDB > חנות רשמית: פריסה גלילה אופקית בחר אחד מתתי הסעיפים + + + גודלי גופנים אוטומטי מוחלק diff --git a/source/Playnite/Localization/hr_HR.xaml b/source/Playnite/Localization/hr_HR.xaml index 1c784f417..1b798fd3a 100644 --- a/source/Playnite/Localization/hr_HR.xaml +++ b/source/Playnite/Localization/hr_HR.xaml @@ -361,6 +361,9 @@ + + + diff --git a/source/Playnite/Localization/hu_HU.xaml b/source/Playnite/Localization/hu_HU.xaml index fe2f99409..ddc8d1c0b 100644 --- a/source/Playnite/Localization/hu_HU.xaml +++ b/source/Playnite/Localization/hu_HU.xaml @@ -388,6 +388,9 @@ Minden jelenlegi művelete (metaadatok letöltése) abba marad. + + + diff --git a/source/Playnite/Localization/id_ID.xaml b/source/Playnite/Localization/id_ID.xaml index 966f86cc0..1607bc9da 100644 --- a/source/Playnite/Localization/id_ID.xaml +++ b/source/Playnite/Localization/id_ID.xaml @@ -386,6 +386,9 @@ Tugas yang sekarang berjalan (unduhan metadata) akan dibatalkan. + + + diff --git a/source/Playnite/Localization/it_IT.xaml b/source/Playnite/Localization/it_IT.xaml index 5447581e1..3fff47ef6 100644 --- a/source/Playnite/Localization/it_IT.xaml +++ b/source/Playnite/Localization/it_IT.xaml @@ -365,8 +365,8 @@ Preferire i dati del negozio ufficiale e se non sono disponibili usare la banca E' richiesto il riavvio di Playnite per applicare il nuovo tema Ottieni più temi Crea un nuovo tema - - + Scarica altre estensioni + Crea una Nuova Estensione Contribuisci a una nuova localizzazione Alcune delle impostazioni cambiate richiedono il riavvio di Playnite. Vuoi riavviare Playnite ora? @@ -399,6 +399,9 @@ Nuova posizione del database verrà utilizzata solo dopo il riavvio dell'applica Modello Scorrimento orizzontale Seleziona una delle sottosezioni + Nessuna impostazione disponibile + Questi script sono eseguiti per ogni gioco nella libreria. I singoli script possono essere assegnati a ogni gioco separatamente mentre si modificano i dettagli del gioco. + Transizione per le immagini di sfondo animate Dimensione caratteri Automatico Con alias diff --git a/source/Playnite/Localization/ja_JP.xaml b/source/Playnite/Localization/ja_JP.xaml index 373901c5b..9d54b2e58 100644 --- a/source/Playnite/Localization/ja_JP.xaml +++ b/source/Playnite/Localization/ja_JP.xaml @@ -389,6 +389,9 @@ IGDB.comのデータを優先し、利用できない場合は公式ストアの + + + diff --git a/source/Playnite/Localization/ko_KR.xaml b/source/Playnite/Localization/ko_KR.xaml index 7b9d95c9c..ee0a7dd94 100644 --- a/source/Playnite/Localization/ko_KR.xaml +++ b/source/Playnite/Localization/ko_KR.xaml @@ -397,6 +397,9 @@ IGDB.com 데이터베이스를 우선 적용하며, 이를 사용할 수 없을 레이아웃 수평 스크롤 하위 섹션 중 하나 선택 + + + 글꼴 크기 자동 별칭 diff --git a/source/Playnite/Localization/lt_LT.xaml b/source/Playnite/Localization/lt_LT.xaml index 680d97114..00b0a914b 100644 --- a/source/Playnite/Localization/lt_LT.xaml +++ b/source/Playnite/Localization/lt_LT.xaml @@ -388,6 +388,9 @@ Netaikoma žaidimams, kurie jau yra bibliotekoje. + + + diff --git a/source/Playnite/Localization/nl_NL.xaml b/source/Playnite/Localization/nl_NL.xaml index 842512324..b8293083d 100644 --- a/source/Playnite/Localization/nl_NL.xaml +++ b/source/Playnite/Localization/nl_NL.xaml @@ -389,6 +389,9 @@ Gebruik eerst data van de officiële winkel en vul missende data aan met data va Layout Horizontaal Scrollen Selecteer een van de subsecties + + + diff --git a/source/Playnite/Localization/no_NO.xaml b/source/Playnite/Localization/no_NO.xaml index 60c694d89..b25a6e54a 100644 --- a/source/Playnite/Localization/no_NO.xaml +++ b/source/Playnite/Localization/no_NO.xaml @@ -389,6 +389,9 @@ Foretrekk data fra en offisiell Butikk og når det ikke er tilgjengelig, bruk da + + + diff --git a/source/Playnite/Localization/pl_PL.xaml b/source/Playnite/Localization/pl_PL.xaml index 804870eb6..4f063482f 100644 --- a/source/Playnite/Localization/pl_PL.xaml +++ b/source/Playnite/Localization/pl_PL.xaml @@ -393,6 +393,9 @@ Nowa lokalizacja bazy danych zostanie użyta dopiero po ponownym uruchomieniu ap Układ Przewijanie w poziomie Wybierz jedną z podsekcji + + + diff --git a/source/Playnite/Localization/pt_BR.xaml b/source/Playnite/Localization/pt_BR.xaml index 363253510..930e93826 100644 --- a/source/Playnite/Localization/pt_BR.xaml +++ b/source/Playnite/Localization/pt_BR.xaml @@ -403,6 +403,9 @@ O novo local do banco de dados será usado somente após o aplicativo ser reinic Esquema Rolagem horizontal Selecione uma das subseções + Não há configurações disponíveis + Estes scripts serão executados para todos os jogo na sua biblioteca. Scripts individuais podem ser atribuídos a cada jogo separadamente ao editar os detalhes de um jogo. + Transições para imagens de fundo animadas Tamanhos das fontes Automático Sem suavização diff --git a/source/Playnite/Localization/pt_PT.xaml b/source/Playnite/Localization/pt_PT.xaml index 64df192a7..5429530bb 100644 --- a/source/Playnite/Localization/pt_PT.xaml +++ b/source/Playnite/Localization/pt_PT.xaml @@ -387,6 +387,9 @@ Qualquer tarefa a ser executada (como a importação de metadados) será cancela Layout Scroll Horizontal + + + diff --git a/source/Playnite/Localization/ro_RO.xaml b/source/Playnite/Localization/ro_RO.xaml index 7f0875929..591d1bb81 100644 --- a/source/Playnite/Localization/ro_RO.xaml +++ b/source/Playnite/Localization/ro_RO.xaml @@ -389,6 +389,9 @@ Toate sarcinile active vor fi anulate (incluzând descărcările de metadata).Orientare + + + diff --git a/source/Playnite/Localization/ru_RU.xaml b/source/Playnite/Localization/ru_RU.xaml index 951a31840..b4fde0fe1 100644 --- a/source/Playnite/Localization/ru_RU.xaml +++ b/source/Playnite/Localization/ru_RU.xaml @@ -369,8 +369,8 @@ IGDB > Официальный магазин: Playnite требуется перезапуск при смене темы Получить больше тем Создать новую тему - - + Получить больше расширений + Создать новое расширение Добавить новую локализацию Некоторые измененные настройки требуют перезагрузки Playnite. Вы хотите перезагрузить Playnite сейчас? @@ -404,6 +404,9 @@ IGDB > Официальный магазин: Настройка отображения Горизонтальная прокрутка Выберите один из подразделов + Нет доступных настроек + Эти скрипты выполняются для каждой игры в библиотеке. Скрипты для конкретной игры можно настроить при редактировании деталей игры. + Анимировать смену фонового изображения Размеры шрифта Авто Без сглаживания @@ -774,7 +777,7 @@ IGDB > Официальный магазин: Неправильная конфигурация игрового действия. Устранение неполадок синхронизации учетной записи - + Устранение неисправностей Переименовать элемент Добавить новый предмет diff --git a/source/Playnite/Localization/sk_SK.xaml b/source/Playnite/Localization/sk_SK.xaml index d8b1c3d5b..6325f44e6 100644 --- a/source/Playnite/Localization/sk_SK.xaml +++ b/source/Playnite/Localization/sk_SK.xaml @@ -9,109 +9,121 @@ Jazyk Odísť - - - - - + Filter je aktívny + Filter je vypnutý + Dodatočné filtre + Filtre + Filter - Chybné údaje + Neplatné údaje Uložiť zmeny? Stránka aplikácie na www.playnite.link Zdrojový kód na GitHub - - + Vytvoriť diagnostický balíček + Odoslať diagnostický balíček O Playnite Vytvoril Josef Němec Priradiť kategóriu - Určiť kategórie + Nastaviť kategórie Pridať kategóriu - Označené - Priradiť kategóriu -Neoznačené - Odstrániť kategóriu -Neurčité - Žiadné zmeny (počas upravovania viacerích hier) - - - - - - + Zaškrtnuté - priraďte kategóriu +Nezačiarknuté - Odobrať kategóriu +Neurčité - Žiadne zmeny (pri úprave viacerých hier) + Bez kategórie + Bez platformy + + Ale nie, stalo sa niečo zlé… + Stala sa závažná chyba. + +Ak nám chcete pomôcť chybu opraviť, opíšte prosím v skratke vaše akcie, ktoré viedli k pádu programu a potom vytvorte diagnostický balíček. Ak ste pripojení na internet, tento balíček sa nahrá na servery Playnite a bude podrobený analýze. + +Prípadne môžete tiež použiť tlačítko 'Nahlásiť pád' a tým sa vytvorí nový záznam o chybe na GitHube kde budete môcť uviesť problém sami. + +Ďakujeme za pomoc. + Vyskytla sa neopraviteľná chyba. + +Ak nám chcete pomôcť tento problém opraviť, odošlite prosím diagnostický balíček. Ďakujeme. Nahlásiť chybu Reštartovať Playnite - - - - - Zmazať Hru(y)? - - - Určite Chceš Zmazať Túto Hru? + Ukončiť Playnite + Akcie uskutočnené pred pádom programu (v angličtine): + + Správca knižnice + Odstrániť Hru(y)? + Nie je možné odstrániť hru, ktorá je spustená alebo sa práve inštaluje/odinštaluje. + Nie je možné odinštalovať hru, ktorá je spustená. + Naozaj chcete odstrániť túto hru? -Hry, ktoré sa automatický importovaly sa môžu znova objaviť v aplikácií Playnite po ďaľšom importovaní (závisí na vaších nastaveniach). - Naozaj chceš odstrániť {0} hier? +Automaticky importované hry sa môžu znovu objaviť v Playnite po ďalšom behu importu (v závislosti od vašich nastavení). + Naozaj chcete odstrániť {0} hier? -Hry, ktoré sa automatický importovaly sa môžu znova objaviť v aplikácií Playnite po ďaľšom importovaní (závisí na vaších nastaveniach). +Automaticky importované hry sa môžu znovu objaviť v Playnite po ďalšom behu importu (v závislosti od vašich nastavení). Priatelia v službe Steam - Výber obsahuje zmeny na uloženie - - Aktualizácia databázy zlyhala, súbor sa nedá otvoriť. - + Sekcia obsahuje zmeny, ktoré je potrebné uložiť + Aktualizuje sa formát knižnice hier… + Aktualizácie databázy zlyhala. + Nie je možné aktualizovať knižnicu hier. Je potrebných {0} MB voľného priestoru na disku. Chyba hry - Hra nebola spustená. '{0}' nebol nájdený v databáze. - Hra nebola spustená: {0} - Akcia sa nedá vykonať: {0} - Priečinok s hrou sa nedá otvoriť: {0} - Vytvorenie skratky zlyhalo: {0} + Hra sa nedá spustiť. '{0}' sa nenachádza v databáze. + Hra sa neda spustiť: {0} + Akcia sa nedá spustiť: {0} + Nie je možné otvoriť umiestnenie hry: {0} + Nepodarilo sa vytvoriť odkaz: {0} Hra sa nedá nainštalovať: {0} Hra sa nedá odinštalovať: {0} - - - - - - - + Akcia hrať nie je nakonfigurovaná. + Nie je nainštalovaný alebo povolený doplnok knižnice, ktorý je zodpovedný za túto hru. + Prevzatie oficiálnych metadát nie je k dispozícii. + Nie je vybraná žiadna hra. + Spustenie akcie herného skriptu zlyhalo: + +{0} + Spustenie akcie globálneho skriptu zlyhalo: + +{0} + Nie je nainštalovaný PowerShell 3.0 alebo novší. - - Zmazať - + Povolené + Odstrániť + Premenovať Kopírovať Pridať Pôvodná ikona - Pôvodný obal - + Predvolený obrázok obalu + Predvolený obrázok pozadia Dokončiť Ďalej Späť - - - - - - + HOTOVO + SPÄŤ + VYČISTIŤ + Vyčistiť + Zamietnuť + Odmietnuť všetko Importovať Zdroj Názov - - - - - - - - - - - - - - Web - Cieľ - + Autor + Modul + Séria + Verzia + Vekové obmedzenie + Región + Naposledný hrané + Najhranejšie + Počet zahratí + Pridané + Dátum pridania + Zmenené + Dátum zmeny + Webové stránky + Cesta + OK Uložiť Zavrieť Zrušiť @@ -119,69 +131,72 @@ Hry, ktoré sa automatický importovaly sa môžu znova objaviť v aplikácií P Nie Vitajte Miestný použivateľ - Overenie + Autentizovať Všeobecné - Média + Médiá Odkazy Inštalácia Akcie - - + Sťahuje sa… + Načítava sa… Typ Profil Profily - Zmazať + Odstrániť Stiahnuť Hľadať Žáner - + Spoločnosť Vývojár Vydavateľ Kategória - Označenie - - Priblížiť - + Štítok + Štítky + Priblíženie + Zobrazenie zoznamu Obaly - - + Zobrazenie mriežky + Zobrazenie podrobností Vlastné - - - - - - - - - - - - - - - - - - - - - - - - - - - + URL + Patróni + Licencia + Prispievatelia + Ukončuje sa Playnite… + Dnes + Včera + Pondelok + Utorok + Streda + Štvrtok + Piatok + Sobota + Nedeľa + Minulý týždeň + Minulý mesiac + Za posledný rok + Pred viac než rokom + Import bol úspešne dokončený. + Všetky hry + ID hry + ID databázy + Prednastavené + Stĺpec + Stĺpce + Riadok + Riadky - Special variables can be used to add dynamic string: -{InstallDir} - Umiestnenie inštalácie hry -{ImagePath} - Cieľ súboru ISO/ROM ak je určený -{ImageName} - Názov ISO/ROM súboru -{ImageNameNoExt} - Názov ISO/ROM súboru bez prípon + Na pridanie dynamických reťazcov možno použiť špeciálne premenné: +{InstallDir} - Umiestnenie s hrou +{InstallDirName} - Názov adresára s hrou +{ImagePath} - ISO/ROM hry, ak existuje +{ImageName} - názov súboru ISO/ROM +{ImageNameNoExt} - názov súboru ISO/ROM, bez prípony +{PlayniteDir} - inštalačný adresár Playnite +{Name} - Názov hry Príklad: -image "{ImagePath}" -fullscreen -Výsledok: -image "c:\folder\image.iso" -fullscreen +Sa zobrazí ako: -image "c:\folder\image.iso" -fullscreen Ikona sa nedá nastaviť pokiaľ chýba akcia Hrať alebo je nastavená na odkaz URL. @@ -384,6 +399,9 @@ Preferovať údaje z officiálneho Obchodu, pokiaľ niesú dostupné, použiť + + + diff --git a/source/Playnite/Localization/sv_SE.xaml b/source/Playnite/Localization/sv_SE.xaml index 4d8ce3448..b3194d66c 100644 --- a/source/Playnite/Localization/sv_SE.xaml +++ b/source/Playnite/Localization/sv_SE.xaml @@ -389,6 +389,9 @@ Alla just nu pågående bakgrundsjobb (ex. nedladdning av metadata) kommer att a Layout Skrolla vågrätt + + + diff --git a/source/Playnite/Localization/tr_TR.xaml b/source/Playnite/Localization/tr_TR.xaml index fca5539b3..dc24fe93a 100644 --- a/source/Playnite/Localization/tr_TR.xaml +++ b/source/Playnite/Localization/tr_TR.xaml @@ -403,6 +403,9 @@ Yeni veritabanı konumu yalnızca uygulama yeniden başlatıldıktan sonra kulla düzen Yatay Kaydırma Alt bölümlerden birini seçin + + + Yazı tipi boyutları Otomatik Takma Adlı diff --git a/source/Playnite/Localization/uk_UA.xaml b/source/Playnite/Localization/uk_UA.xaml index 8073772ae..efb022b64 100644 --- a/source/Playnite/Localization/uk_UA.xaml +++ b/source/Playnite/Localization/uk_UA.xaml @@ -389,6 +389,9 @@ IGDB > Офіційний магазин: + + + diff --git a/source/Playnite/Localization/vi_VN.xaml b/source/Playnite/Localization/vi_VN.xaml index 74c04022e..17e49afa5 100644 --- a/source/Playnite/Localization/vi_VN.xaml +++ b/source/Playnite/Localization/vi_VN.xaml @@ -361,6 +361,9 @@ + + + diff --git a/source/Playnite/Localization/zh_CN.xaml b/source/Playnite/Localization/zh_CN.xaml index 4a93de665..cd98f5831 100644 --- a/source/Playnite/Localization/zh_CN.xaml +++ b/source/Playnite/Localization/zh_CN.xaml @@ -397,6 +397,9 @@ IGDB > 官方商店: 布局 水平滚动 选择其中一个子选项: + + + 字体大小 自动 别名 diff --git a/source/Playnite/Localization/zh_TW.xaml b/source/Playnite/Localization/zh_TW.xaml index 86cd58057..7bce56482 100644 --- a/source/Playnite/Localization/zh_TW.xaml +++ b/source/Playnite/Localization/zh_TW.xaml @@ -35,14 +35,20 @@ 沒有平台 喔不,出錯了... - + 發生無法復原的錯誤。 + +若您願意協助我們修復此問題,請簡短地描述當機前您所進行的動作並創建診斷包。若您可連上網路則診斷包將被上傳至Playnite伺服器進行分析。 + +除此之外,您也可使用"回報當機"按鈕於Github上手動建立新問題並回報本次錯誤。 + +感謝您的協助。 發生無法復原的錯誤。 如果您願意幫助我們解決此問題,請傳送診斷資料報告給我們,謝謝。 問題回報 重新啟動Playnite 離開Playnite - + 當機之前進行的行為(以英文描述) 資料庫管理員 移除遊戲()? @@ -363,8 +369,8 @@ IGDB > 官方商店 Playnite需要重新啟動以套用新的主題 取得更多主題 建立新的主題 - - + 取得更多附加元件 + 添增新的附加元件 提供新的本地化翻譯 部分變更需要重啟Playnite,是否立即重新啟動? @@ -397,6 +403,9 @@ IGDB > 官方商店 配置 水平捲軸 選擇一個小節 + + + 字型大小 自動 鋸齒化 @@ -765,7 +774,7 @@ IGDB > 官方商店 無效的遊戲動作設定 解決帳號同步問題 - + 疑難排解 重新命名物件 新增物件 @@ -806,9 +815,15 @@ By {1} {0} - - - + 已選擇的圖片過大,可能導致效能無法最佳化。使用大型圖片可能會造成使用者介面嚴重延遲並增加記憶體使用率。 + +建議最大尺寸: +圖標: 高度 256px +封面: 高度 800px +背景: 高度 1080px + + 效能警告 + 不再顯示 diff --git a/source/Playnite/Plugins/ExtensionFactory.cs b/source/Playnite/Plugins/ExtensionFactory.cs index b845432d9..154542152 100644 --- a/source/Playnite/Plugins/ExtensionFactory.cs +++ b/source/Playnite/Plugins/ExtensionFactory.cs @@ -52,6 +52,11 @@ public List MetadataPlugins get => Plugins.Where(a => a.Value.Description.Type == ExtensionType.MetadataProvider).Select(a => (MetadataPlugin)a.Value.Plugin).ToList(); } + public List GenericPlugins + { + get => Plugins.Where(a => a.Value.Description.Type == ExtensionType.GenericPlugin).Select(a => (Plugin)a.Value.Plugin).ToList(); + } + public List Scripts { get; diff --git a/source/Playnite/Properties/AssemblyInfo.cs b/source/Playnite/Properties/AssemblyInfo.cs index c621e4e2e..0be60835b 100644 --- a/source/Playnite/Properties/AssemblyInfo.cs +++ b/source/Playnite/Properties/AssemblyInfo.cs @@ -35,7 +35,7 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("6.2.0.*")] +[assembly: AssemblyVersion("6.3.0.*")] [assembly: InternalsVisibleTo("Playnite.Tests")] [assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Playnite")] diff --git a/source/Playnite/Settings/PlayniteSettings.cs b/source/Playnite/Settings/PlayniteSettings.cs index 633b07c3f..ee09e07e0 100644 --- a/source/Playnite/Settings/PlayniteSettings.cs +++ b/source/Playnite/Settings/PlayniteSettings.cs @@ -377,17 +377,7 @@ public bool ShowGridItemBackground [JsonIgnore] public double GridItemHeight { - get - { - if (GridItemWidth != 0) - { - return GridItemWidth * ((double)gridItemHeightRatio / GridItemWidthRatio); - } - else - { - return 0; - } - } + get; private set; } private double gridItemWidth = ViewSettings.DefaultGridItemWidth; @@ -400,9 +390,9 @@ public double GridItemWidth set { - gridItemWidth = value; + gridItemWidth = Math.Round(value); OnPropertyChanged(); - OnPropertyChanged(nameof(GridItemHeight)); + UpdateGridItemHeight(); } } @@ -421,7 +411,7 @@ public int GridItemWidthRatio { gridItemWidthRatio = value; OnPropertyChanged(); - OnPropertyChanged(nameof(GridItemHeight)); + UpdateGridItemHeight(); OnPropertyChanged(nameof(CoverAspectRatio)); } } @@ -438,7 +428,7 @@ public int GridItemHeightRatio { gridItemHeightRatio = value; OnPropertyChanged(); - OnPropertyChanged(nameof(GridItemHeight)); + UpdateGridItemHeight(); OnPropertyChanged(nameof(CoverAspectRatio)); } } @@ -1354,7 +1344,7 @@ public MetadataDownloaderSettings MetadataSettings } } - private ScriptLanguage actionsScriptLanguage = ScriptLanguage.Batch; + private ScriptLanguage actionsScriptLanguage = ScriptLanguage.PowerShell; public ScriptLanguage ActionsScriptLanguage { get => actionsScriptLanguage; @@ -1409,6 +1399,17 @@ public bool ShowImagePerformanceWarning } } + private bool backgroundImageAnimation = true; + public bool BackgroundImageAnimation + { + get => backgroundImageAnimation; + set + { + backgroundImageAnimation = value; + OnPropertyChanged(); + } + } + [JsonIgnore] public static bool IsPortable { @@ -1432,6 +1433,12 @@ public FullscreenSettings Fullscreen public PlayniteSettings() { + var gpus = Computer.GetGpuVendors(); + if (gpus.Contains(HwCompany.Intel) || gpus.Contains(HwCompany.VMware)) + { + BackgroundImageAnimation = false; + } + InstallInstanceId = Guid.NewGuid().ToString(); ItemSpacingMargin = GetItemSpacingMargin(); FullscreenItemSpacingMargin = GetFullscreenItemSpacingMargin(); @@ -1506,10 +1513,18 @@ public static PlayniteSettings LoadSettings() public void SaveSettings() { - FileSystem.CreateDirectory(PlaynitePaths.ConfigRootPath); - SaveSettingFile(this, PlaynitePaths.ConfigFilePath); - SaveSettingFile(WindowPositions, PlaynitePaths.WindowPositionsPath); - SaveSettingFile(Fullscreen, PlaynitePaths.FullscreenConfigFilePath); + + try + { + FileSystem.CreateDirectory(PlaynitePaths.ConfigRootPath); + SaveSettingFile(this, PlaynitePaths.ConfigFilePath); + SaveSettingFile(WindowPositions, PlaynitePaths.WindowPositionsPath); + SaveSettingFile(Fullscreen, PlaynitePaths.FullscreenConfigFilePath); + } + catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors) + { + logger.Error(e, "Failed to save application settings."); + } } [OnError] @@ -1617,6 +1632,20 @@ private Thickness GetFullscreenItemSpacingMargin() return new Thickness(marginY, marginX, 0, 0); } + private void UpdateGridItemHeight() + { + if (GridItemWidth != 0) + { + GridItemHeight = Math.Round(GridItemWidth * ((double)gridItemHeightRatio / GridItemWidthRatio)); + } + else + { + GridItemHeight = 0; + } + + OnPropertyChanged(nameof(GridItemHeight)); + } + #region Serialization Conditions public bool ShouldSerializeDisabledPlugins() diff --git a/source/Playnite/Themes.cs b/source/Playnite/Themes.cs index eac68e084..df1c70b2a 100644 --- a/source/Playnite/Themes.cs +++ b/source/Playnite/Themes.cs @@ -49,8 +49,8 @@ public class ThemeManager private static ILogger logger = LogManager.GetLogger(); public const string ThemeManifestFileName = "theme.yaml"; public const string PackedThemeFileExtention = ".pthm"; - public static System.Version DesktopApiVersion => new System.Version("1.4.0"); - public static System.Version FullscreenApiVersion => new System.Version("1.4.0"); + public static System.Version DesktopApiVersion => new System.Version("1.4.1"); + public static System.Version FullscreenApiVersion => new System.Version("1.4.1"); public static ThemeDescription CurrentTheme { get; private set; } public static ThemeDescription DefaultTheme { get; private set; } diff --git a/source/Playnite/ViewModels/RandomGameSelectViewModel.cs b/source/Playnite/ViewModels/RandomGameSelectViewModel.cs index 0e5372b2c..f6904513d 100644 --- a/source/Playnite/ViewModels/RandomGameSelectViewModel.cs +++ b/source/Playnite/ViewModels/RandomGameSelectViewModel.cs @@ -19,7 +19,7 @@ public class RandomGameSelectViewModel : ObservableObject private readonly BaseCollectionView collection; private readonly GameDatabase database; - private bool isLimitedToFilter = false; + private bool isLimitedToFilter = true; public bool IsLimitedToFilter { get => isLimitedToFilter; diff --git a/source/PlayniteSDK/Models/Game.cs b/source/PlayniteSDK/Models/Game.cs index 72b381bd5..75d86fe8c 100644 --- a/source/PlayniteSDK/Models/Game.cs +++ b/source/PlayniteSDK/Models/Game.cs @@ -867,7 +867,7 @@ public int? CommunityScore } } - private ScriptLanguage actionsScriptLanguage = ScriptLanguage.Batch; + private ScriptLanguage actionsScriptLanguage = ScriptLanguage.PowerShell; /// /// Gets or sets scripting language for and scripts. /// diff --git a/source/PlayniteSDK/ScriptLanguage.cs b/source/PlayniteSDK/ScriptLanguage.cs index 318cd950a..7f0dd9b91 100644 --- a/source/PlayniteSDK/ScriptLanguage.cs +++ b/source/PlayniteSDK/ScriptLanguage.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -22,6 +23,7 @@ public enum ScriptLanguage /// /// Represents Batch scripting language. /// + [Description("Batch (.bat script)")] Batch } } diff --git a/source/Plugins/UplayLibrary/UplayLibrary.cs b/source/Plugins/UplayLibrary/UplayLibrary.cs index 5ff1e4dca..9805b1bc8 100644 --- a/source/Plugins/UplayLibrary/UplayLibrary.cs +++ b/source/Plugins/UplayLibrary/UplayLibrary.cs @@ -96,29 +96,29 @@ public List GetInstalledGames() { root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); installsKey = root.OpenSubKey(@"SOFTWARE\ubisoft\Launcher\Installs\"); - - if (installsKey == null) - { - return games; - } } - foreach (var install in installsKey.GetSubKeyNames()) + if (installsKey != null) { - var gameData = installsKey.OpenSubKey(install); - var installDir = (gameData.GetValue("InstallDir") as string).Replace('/', Path.DirectorySeparatorChar); - - var newGame = new GameInfo() + foreach (var install in installsKey.GetSubKeyNames()) { - GameId = install, - Source = "Uplay", - InstallDirectory = installDir, - PlayAction = GetGamePlayTask(install), - Name = Path.GetFileName(installDir.TrimEnd(Path.DirectorySeparatorChar)), - IsInstalled = true - }; - - games.Add(newGame); + var gameData = installsKey.OpenSubKey(install); + var installDir = (gameData.GetValue("InstallDir") as string)?.Replace('/', Path.DirectorySeparatorChar); + if (!installDir.IsNullOrEmpty()) + { + var newGame = new GameInfo() + { + GameId = install, + Source = "Uplay", + InstallDirectory = installDir, + PlayAction = GetGamePlayTask(install), + Name = Path.GetFileName(installDir.TrimEnd(Path.DirectorySeparatorChar)), + IsInstalled = true + }; + + games.Add(newGame); + } + } } return games; diff --git a/source/Tests/Playnite.Tests/Extensions/BitmapExtensionsTests.cs b/source/Tests/Playnite.Tests/Extensions/BitmapExtensionsTests.cs new file mode 100644 index 000000000..ba552616f --- /dev/null +++ b/source/Tests/Playnite.Tests/Extensions/BitmapExtensionsTests.cs @@ -0,0 +1,29 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace Playnite.Tests.Extensions +{ + [TestFixture] + public class BitmapExtensionsTests + { + [Test] + public void BitmapLoadPropertiesEquabilityTest() + { + var np1 = new BitmapLoadProperties(1, 1, new DpiScale(1, 1)); + var np2 = new BitmapLoadProperties(1, 1, new DpiScale(1, 1)); + var np3 = new BitmapLoadProperties(2, 2, new DpiScale(2, 2)); + + Assert.AreEqual(np1, np2); + Assert.IsTrue(np1 == np2); + + Assert.AreNotEqual(np1, np3); + Assert.IsTrue(np1 != np3); + } + } +} diff --git a/source/Tests/Playnite.Tests/Playnite.Tests.csproj b/source/Tests/Playnite.Tests/Playnite.Tests.csproj index dd06caf8a..201e4f914 100644 --- a/source/Tests/Playnite.Tests/Playnite.Tests.csproj +++ b/source/Tests/Playnite.Tests/Playnite.Tests.csproj @@ -109,6 +109,7 @@ + diff --git a/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0-1.4.1.txt b/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0-1.4.1.txt new file mode 100644 index 000000000..9469a8eac Binary files /dev/null and b/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0-1.4.1.txt differ diff --git a/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0.zip b/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0.zip new file mode 100644 index 000000000..e4591cc95 Binary files /dev/null and b/source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.0.zip differ