diff --git a/.all-contributorsrc b/.all-contributorsrc index b8a34941e..b37ccc915 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -224,6 +224,15 @@ "contributions": [ "translation" ] + }, + { + "login": "perfectdelusions", + "name": "eden", + "avatar_url": "https://avatars.githubusercontent.com/u/272893080?v=4", + "profile": "https://github.com/perfectdelusions", + "contributions": [ + "translation" + ] } ], "repoType": "github" diff --git a/CollapseLauncher/Classes/CachesManagement/Honkai/Check.cs b/CollapseLauncher/Classes/CachesManagement/Honkai/Check.cs index 6a883cd9c..fd5d93799 100644 --- a/CollapseLauncher/Classes/CachesManagement/Honkai/Check.cs +++ b/CollapseLauncher/Classes/CachesManagement/Honkai/Check.cs @@ -58,15 +58,6 @@ private async Task> Check(List assetIndex, Cancella return returnAsset; } - private readonly SearchValues _unusedSearchValues = SearchValues.Create([ - "output_log", - "Crashes", - "Verify.txt", - "APM", - "FBData", - "asb.dat" - ], StringComparison.OrdinalIgnoreCase); - private void CheckUnusedAssets(List assetIndex, List returnAsset) { // Directory info and if the directory doesn't exist, return @@ -76,13 +67,25 @@ private void CheckUnusedAssets(List assetIndex, List ret return; } + SearchValues unusedSearchValues = SearchValues + .Create(GameVersionManager.GamePreset.GameInstallFileInfo?.CacheUpdateUnusedFilesIgnoreList + ?? [ + "output_log", + "Crashes", + "Verify.txt", + "APM", + "FBData", + "asb.dat", + "MiHoYoSDK.log" + ], StringComparison.OrdinalIgnoreCase); + // Iterate the file contained in the _gamePath foreach (FileInfo fileInfo in directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories) .EnumerateNoReadOnly()) { ReadOnlySpan filePath = fileInfo.FullName; - if (filePath.ContainsAny(_unusedSearchValues) + if (filePath.ContainsAny(unusedSearchValues) || assetIndex.Exists(x => x.ConcatPath == fileInfo.FullName)) { continue; diff --git a/CollapseLauncher/Classes/EventsManagement/BackgroundActivityManager.cs b/CollapseLauncher/Classes/EventsManagement/BackgroundActivityManager.cs index 6274e3871..a5e4a97d2 100644 --- a/CollapseLauncher/Classes/EventsManagement/BackgroundActivityManager.cs +++ b/CollapseLauncher/Classes/EventsManagement/BackgroundActivityManager.cs @@ -7,11 +7,13 @@ using CollapseLauncher.Plugins; using Hi3Helper; using Hi3Helper.Data; +using Hi3Helper.Shared.Region; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; using System; using System.Collections.Generic; +using System.IO; using System.Numerics; // ReSharper disable StringLiteralTypo @@ -67,23 +69,24 @@ private static IconElement GetGamePresetIcon(PresetConfig presetConfig) if (presetConfig is not PluginPresetConfigWrapper pluginPresetConfig) { - return new BitmapIcon - { - UriSource = new Uri(uri) - }; + return Create(uri); } PluginInfo pluginInfo = pluginPresetConfig.PluginInfo; GamePluginIconConverter converter = StaticConverter.Shared; if (converter.Convert(pluginInfo, null!, null!, "") is not IconElement iconElement) { - return new BitmapIcon - { - UriSource = new Uri(uri) - }; + return Create(uri); } return iconElement; + + static BitmapIcon Create(string uri) + => new() + { + UriSource = new Uri(uri), + ShowAsMonochrome = false + }; } private static void AttachEventToNotification(PresetConfig presetConfig, IBackgroundActivity activity, string activityTitle, string activitySubtitle) diff --git a/CollapseLauncher/Classes/GameManagement/ImageBackground/ImageBackgroundManager.FFmpeg.cs b/CollapseLauncher/Classes/GameManagement/ImageBackground/ImageBackgroundManager.FFmpeg.cs index fe1749f85..990586cbb 100644 --- a/CollapseLauncher/Classes/GameManagement/ImageBackground/ImageBackgroundManager.FFmpeg.cs +++ b/CollapseLauncher/Classes/GameManagement/ImageBackground/ImageBackgroundManager.FFmpeg.cs @@ -98,17 +98,18 @@ public bool TryRelinkFFmpegPath() return false; } - // -- If custom FFmpeg path is set but FFmpeg is not available, - // Try to resolve the symbolic link path again. - // -- Check for custom FFmpeg path availability first. If not available, skip. - result = (IsFFmpegAvailable(customFFmpegDirPath, out exception) && - // -- Re-link FFmpeg symbolic link - TryLinkFFmpegLibrary(customFFmpegDirPath, curDir, out exception)) || - // -- If custom FFmpeg path is not avail, then try to find one from EnvVar (this might be a bit expensive). - // If found, the GlobalCustomFFmpegPath will be updated to the found path. - (TryFindFFmpegInstallFromEnvVar(out string? envVarPath, out exception) && TryLinkFFmpegLibrary(envVarPath, curDir, out exception)); - - return result; + // -- 1. Check from custom path first. If it exists, then pass. + if (!string.IsNullOrEmpty(customFFmpegDirPath) && + IsFFmpegAvailable(customFFmpegDirPath, out exception) && + TryLinkFFmpegLibrary(customFFmpegDirPath, curDir, out exception)) + { + return result = true; + } + + // -- 2. Find one from environment variables. If it exists, then pass. + // Otherwise, return false. + return result = TryFindFFmpegInstallFromEnvVar(out string? envVarPath, out exception) && + TryLinkFFmpegLibrary(envVarPath, curDir, out exception); } finally { @@ -180,7 +181,6 @@ internal static bool IsFFmpegAvailable(string? checkOnDirectory, string dllPathAvfilter = Path.Combine(checkOnDirectory, Fields.DllNameAvfilter); string dllPathAvformat = Path.Combine(checkOnDirectory, Fields.DllNameAvformat); string dllPathAvutil = Path.Combine(checkOnDirectory, Fields.DllNameAvutil); - string dllPathPostproc = Path.Combine(checkOnDirectory, Fields.DllNamePostproc); string dllPathSwresample = Path.Combine(checkOnDirectory, Fields.DllNameSwresample); string dllPathSwscale = Path.Combine(checkOnDirectory, Fields.DllNameSwscale); @@ -189,7 +189,6 @@ internal static bool IsFFmpegAvailable(string? checkOnDirectory, FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathAvfilter, out _, out exception) && FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathAvformat, out _, out exception) && FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathAvutil, out _, out exception) && - FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathPostproc, out _, out exception) && FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathSwresample, out _, out exception) && FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathSwscale, out _, out exception); } @@ -201,7 +200,6 @@ internal static string[] GetFFmpegRequiredDllFilenames() => Fields.DllNameAvfilter, Fields.DllNameAvformat, Fields.DllNameAvutil, - Fields.DllNamePostproc, Fields.DllNameSwresample, Fields.DllNameSwscale ]; @@ -262,14 +260,24 @@ public static bool TryLinkFFmpegLibrary( string dllPathSwresample = Path.Combine(sourceDir, Fields.DllNameSwresample); string dllPathSwscale = Path.Combine(sourceDir, Fields.DllNameSwscale); - return CreateSymbolLink(dllPathAvcodec, targetDir, out exception) && - CreateSymbolLink(dllPathAvdevice, targetDir, out exception) && - CreateSymbolLink(dllPathAvfilter, targetDir, out exception) && - CreateSymbolLink(dllPathAvformat, targetDir, out exception) && - CreateSymbolLink(dllPathAvutil, targetDir, out exception) && - CreateSymbolLink(dllPathPostproc, targetDir, out exception) && - CreateSymbolLink(dllPathSwresample, targetDir, out exception) && - CreateSymbolLink(dllPathSwscale, targetDir, out exception); + bool result = + CreateSymbolLink(dllPathAvcodec, targetDir, out exception) && + CreateSymbolLink(dllPathAvdevice, targetDir, out exception) && + CreateSymbolLink(dllPathAvfilter, targetDir, out exception) && + CreateSymbolLink(dllPathAvformat, targetDir, out exception) && + CreateSymbolLink(dllPathAvutil, targetDir, out exception) && + CreateSymbolLink(dllPathSwresample, targetDir, out exception) && + CreateSymbolLink(dllPathSwscale, targetDir, out exception); + + // Additionally, link postproc if it exists. + // Since some non-free/GPL custom build (if used by the user) still requires postproc library to exist if enabled on build. + // Without it, some build might fail to run. + if (result && FileUtility.IsFileExistOrSymbolicLinkResolved(dllPathPostproc, out string? resolvedOptDllPostproc, out exception)) + { + return result && CreateSymbolLink(resolvedOptDllPostproc, targetDir, out exception); + } + + return result; static bool CreateSymbolLink(string filePath, string targetDirectory, diff --git a/CollapseLauncher/Classes/Helper/Metadata/PresetConfig.cs b/CollapseLauncher/Classes/Helper/Metadata/PresetConfig.cs index 14a0d4a9a..a4a5601c0 100644 --- a/CollapseLauncher/Classes/Helper/Metadata/PresetConfig.cs +++ b/CollapseLauncher/Classes/Helper/Metadata/PresetConfig.cs @@ -82,11 +82,12 @@ public enum LauncherType public class GameInstallFileInfo { - public string GameDataFolderName { get; init; } = string.Empty; - public string[] FilesToDelete { get; init; } = []; - public string[] FoldersToDelete { get; init; } = []; - public string[] FoldersToKeepInData { get; init; } = []; - public string[] FilesCleanupIgnoreList { get; init; } = []; + public string GameDataFolderName { get; init; } = string.Empty; + public string[] FilesToDelete { get; init; } = []; + public string[] FoldersToDelete { get; init; } = []; + public string[] FoldersToKeepInData { get; init; } = []; + public string[] FilesCleanupIgnoreList { get; init; } = []; + public string[] CacheUpdateUnusedFilesIgnoreList { get; init; } = []; } public class SophonChunkUrls diff --git a/CollapseLauncher/Classes/Helper/StreamUtility/StreamExtension.cs b/CollapseLauncher/Classes/Helper/StreamUtility/StreamExtension.cs index 0e7cae51b..90df5161d 100644 --- a/CollapseLauncher/Classes/Helper/StreamUtility/StreamExtension.cs +++ b/CollapseLauncher/Classes/Helper/StreamUtility/StreamExtension.cs @@ -309,7 +309,7 @@ public static FileInfo ResolveSymlink(this FileInfo fileInfo) /// /// The directory to remove. /// Whether to remove all possibly empty directories recursively. - public static void DeleteEmptyDirectory(this string dir, bool recursive = false) + public static bool DeleteEmptyDirectory(this string dir, bool recursive = false) => new DirectoryInfo(dir).DeleteEmptyDirectory(recursive); /// @@ -317,20 +317,34 @@ public static void DeleteEmptyDirectory(this string dir, bool recursive = false) /// /// The directory to remove. /// Whether to remove all possibly empty directories recursively. - public static void DeleteEmptyDirectory(this DirectoryInfo dir, bool recursive = false) + public static bool DeleteEmptyDirectory(this DirectoryInfo dir, bool recursive = false) { - if (recursive) + try { - foreach (DirectoryInfo childDir in dir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)) + if (!dir.Exists) { - childDir.DeleteEmptyDirectory(); + return true; + } + + if (recursive) + { + foreach (DirectoryInfo childDir in dir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)) + { + childDir.DeleteEmptyDirectory(); + } } - } - FindFiles.TryIsDirectoryEmpty(dir.FullName, out bool isEmpty); - if (isEmpty) + FindFiles.TryIsDirectoryEmpty(dir.FullName, out bool isEmpty); + if (isEmpty) + { + dir.Delete(true); + } + + return true; + } + catch { - dir.Delete(true); + return false; } } diff --git a/CollapseLauncher/Classes/InstallManagement/Base/InstallManagerBase.Sophon.cs b/CollapseLauncher/Classes/InstallManagement/Base/InstallManagerBase.Sophon.cs index 30e4c4d2b..a4c4c0fb2 100644 --- a/CollapseLauncher/Classes/InstallManagement/Base/InstallManagerBase.Sophon.cs +++ b/CollapseLauncher/Classes/InstallManagement/Base/InstallManagerBase.Sophon.cs @@ -796,7 +796,7 @@ await TryGetAdditionalPackageForSophonDiff(httpClient, } // Filter asset list - await FilterSophonPatchAssetList(sophonUpdateAssetList, Token!.Token); + await FilterAssetList(sophonUpdateAssetList, x => x.AssetName, Token!.Token); // Get the remote chunk size ProgressPerFileSizeTotal = sophonUpdateAssetList.GetCalculatedDiffSize(!isPreloadMode); @@ -925,12 +925,6 @@ await Parallel.ForEachAsync(sophonUpdateAssetList } } - protected virtual Task FilterSophonPatchAssetList(List itemList, CancellationToken token) - { - // NOP - return Task.CompletedTask; - } - private ValueTask RunSophonAssetDownloadThread(HttpClient client, SophonAsset asset, ParallelOptions parallelOptions) diff --git a/CollapseLauncher/Classes/InstallManagement/StarRail/StarRailInstall.SophonPatch.cs b/CollapseLauncher/Classes/InstallManagement/StarRail/StarRailInstall.SophonPatch.cs index 156db6930..4a993a3b6 100644 --- a/CollapseLauncher/Classes/InstallManagement/StarRail/StarRailInstall.SophonPatch.cs +++ b/CollapseLauncher/Classes/InstallManagement/StarRail/StarRailInstall.SophonPatch.cs @@ -1,4 +1,5 @@ -using Hi3Helper.Data; +using Hi3Helper; +using Hi3Helper.Data; using System; using System.Buffers; using System.Collections.Generic; @@ -62,9 +63,13 @@ public override async Task FilterAssetList( continue; } + ConverterTool.NormalizePathInplaceNoTrim(filePath); + int indexOfAny = filePath.IndexOfAny(searchValues); if (indexOfAny >= 0) { + Logger.LogWriteLine($"[StarRailInstall::FilterAssetList] Asset: {patchAsset} is ignored due to marked as deleted asset.", + writeToLog: true); continue; } @@ -90,12 +95,9 @@ static ReadOnlySpan GetFilePathFromJson(ReadOnlySpan line) line = line[(firstIndexOf + first.Length)..]; int endIndexOf = line.IndexOf(end); - if (endIndexOf <= 0) - { - return ReadOnlySpan.Empty; - } - - return line[..endIndexOf]; + return endIndexOf <= 0 + ? ReadOnlySpan.Empty + : line[..endIndexOf]; } } diff --git a/CollapseLauncher/Classes/InstallManagement/Zenless/ZenlessInstall.SophonPatch.cs b/CollapseLauncher/Classes/InstallManagement/Zenless/ZenlessInstall.SophonPatch.cs index c867ee2fb..7f38d2909 100644 --- a/CollapseLauncher/Classes/InstallManagement/Zenless/ZenlessInstall.SophonPatch.cs +++ b/CollapseLauncher/Classes/InstallManagement/Zenless/ZenlessInstall.SophonPatch.cs @@ -1,11 +1,9 @@ -using Hi3Helper.Sophon; -using Hi3Helper.Sophon.Infos; +using Hi3Helper; using Hi3Helper.Sophon.Structs; using System; using System.Buffers; using System.Collections.Generic; using System.IO; -using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; // ReSharper disable CheckNamespace @@ -17,14 +15,6 @@ internal partial class ZenlessInstall { private const StringSplitOptions SplitOptions = StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries; - // ReSharper disable once StringLiteralTypo - [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "k__BackingField")] - private static extern ref SophonChunksInfo GetChunkAssetChunksInfo(SophonAsset element); - - // ReSharper disable once StringLiteralTypo - [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "k__BackingField")] - private static extern ref SophonChunksInfo GetChunkAssetChunksInfoAlt(SophonAsset element); - public override async Task FilterAssetList( List itemList, Func itemPathSelector, @@ -67,6 +57,8 @@ private static void FilterSophonAsset(List itemList, HashSet excep if (asset is SophonIdentifiableProperty { MatchingField: { } assetMatchingField } && exceptMatchFieldHashSet.Contains(assetMatchingField)) { + Logger.LogWriteLine($"[ZenlessInstall::FilterSophonAsset] Asset: {asset} is ignored due to marked as deleted asset.", + writeToLog: true); continue; } diff --git a/CollapseLauncher/Classes/Plugins/PluginGameInstallWrapper.cs b/CollapseLauncher/Classes/Plugins/PluginGameInstallWrapper.cs index a4fa7e2c5..3bd6c0769 100644 --- a/CollapseLauncher/Classes/Plugins/PluginGameInstallWrapper.cs +++ b/CollapseLauncher/Classes/Plugins/PluginGameInstallWrapper.cs @@ -1,7 +1,9 @@ using CollapseLauncher.Dialogs; +using CollapseLauncher.DiscordPresence; using CollapseLauncher.Extension; using CollapseLauncher.FileDialogCOM; using CollapseLauncher.Helper; +using CollapseLauncher.Helper.Loading; using CollapseLauncher.Helper.Metadata; using CollapseLauncher.InstallManager; using CollapseLauncher.InstallManager.Base; @@ -16,12 +18,15 @@ using Hi3Helper.Shared.ClassStruct; using Hi3Helper.Shared.Region; using Hi3Helper.Win32.ManagedTools; +using CollapseLauncher.Pages; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; using System; using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; @@ -30,6 +35,9 @@ namespace CollapseLauncher.Plugins; #nullable enable internal partial class PluginGameInstallWrapper : ProgressBase, IGameInstallManager { + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private unsafe delegate void PerFileProgressCallbackNative(InstallPerFileProgress* progress); + private struct InstallProgressProperty { public int StateCount; @@ -63,6 +71,10 @@ public override string GamePath private readonly InstallProgressStateDelegate _updateProgressStatusDelegate; private InstallProgressProperty _updateProgressProperty; + private PerFileProgressCallbackNative? _perFileProgressDelegate; + private GCHandle _perFileProgressGcHandle; + private bool _hasPerFileProgress; + private PluginGameVersionWrapper GameManager => GameVersionManager as PluginGameVersionWrapper ?? throw new InvalidCastException("GameVersionManager is not PluginGameVersionWrapper"); @@ -103,10 +115,66 @@ private void ResetAndCancelTokenSource() public void Dispose() { + UnregisterPerFileProgressCallback(); _gameInstaller.Free(); GC.SuppressFinalize(this); } + private unsafe void TryRegisterPerFileProgressCallback() + { + if (_perFileProgressGcHandle.IsAllocated) + return; + + _perFileProgressDelegate = OnPerFileProgressCallback; + _perFileProgressGcHandle = GCHandle.Alloc(_perFileProgressDelegate); + nint callbackPtr = Marshal.GetFunctionPointerForDelegate(_perFileProgressDelegate); + + _hasPerFileProgress = _pluginPresetConfig.PluginInfo.EnablePerFileProgressCallback(callbackPtr); + + if (!_hasPerFileProgress) + { + _perFileProgressGcHandle.Free(); + _perFileProgressDelegate = null; + } + } + + private void UnregisterPerFileProgressCallback() + { + if (!_hasPerFileProgress) + return; + + _pluginPresetConfig.PluginInfo.DisablePerFileProgressCallback(); + _hasPerFileProgress = false; + + if (_perFileProgressGcHandle.IsAllocated) + _perFileProgressGcHandle.Free(); + _perFileProgressDelegate = null; + } + + private unsafe void OnPerFileProgressCallback(InstallPerFileProgress* progress) + { + // IMPORTANT: Called from NativeAOT plugin across reverse P/Invoke. Must never throw. + try + { + if (progress == null) + return; + + long downloaded = progress->PerFileDownloadedBytes; + long total = progress->PerFileTotalBytes; + + Progress.ProgressPerFileSizeCurrent = downloaded; + Progress.ProgressPerFileSizeTotal = total; + Progress.ProgressPerFilePercentage = total > 0 + ? ConverterTool.ToPercentage(total, downloaded) + : 0; + } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::OnPerFileProgressCallback] Exception (swallowed):\r\n{ex}", + LogType.Error, true); + } + } + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] public async ValueTask GetInstallationPath(bool isHasOnlyMigrateOption = false) { @@ -198,15 +266,81 @@ public async ValueTask GetInstallationPath(bool isHasOnlyMigrateOption = fa return folder; } - public Task StartPackageDownload(bool skipDialog = false) + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public async Task StartPackageDownload(bool skipDialog = false) { - // NOP - return Task.CompletedTask; + ResetStatusAndProgressProperty(); + bool isSuccess = false; + + try + { + IsRunning = true; + + Status.IsProgressAllIndetermined = true; + Status.IsProgressPerFileIndetermined = true; + Status.IsRunning = true; + Status.IsIncludePerFileIndicator = false; + UpdateStatus(); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Step 1/5: InitPluginComAsync...", LogType.Debug, true); + await _gameInstaller.InitPluginComAsync(_plugin, Token!.Token); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Step 2/5: GetGameSizeAsync...", LogType.Debug, true); + Guid cancelGuid = _plugin.RegisterCancelToken(Token.Token); + + _gameInstaller.GetGameSizeAsync(GameInstallerKind.Preload, in cancelGuid, out nint asyncSize); + long sizeToDownload = await asyncSize.AsTask(); + Logger.LogWriteLine($"[PluginGameInstallWrapper::StartPackageDownload] Size to download: {sizeToDownload}", LogType.Debug, true); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Step 3/5: GetGameDownloadedSizeAsync...", LogType.Debug, true); + _gameInstaller.GetGameDownloadedSizeAsync(GameInstallerKind.Preload, in cancelGuid, out nint asyncDownloaded); + long sizeAlreadyDownloaded = await asyncDownloaded.AsTask(); + Logger.LogWriteLine($"[PluginGameInstallWrapper::StartPackageDownload] Already downloaded: {sizeAlreadyDownloaded}", LogType.Debug, true); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Step 4/5: EnsureDiskSpaceAvailability...", LogType.Debug, true); + await EnsureDiskSpaceAvailability(GameManager.GameDirPath, sizeToDownload, sizeAlreadyDownloaded); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Step 5/5: StartPreloadAsync...", LogType.Debug, true); + TryRegisterPerFileProgressCallback(); + Status.IsIncludePerFileIndicator = _hasPerFileProgress; + UpdateStatus(); + + _gameInstaller.StartPreloadAsync( + _updateProgressDelegate, + _updateProgressStatusDelegate, + _plugin.RegisterCancelToken(Token.Token), + out nint asyncPreload); + + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Awaiting preload task...", LogType.Debug, true); + await asyncPreload.AsTask().ConfigureAwait(false); + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Preload task completed.", LogType.Debug, true); + isSuccess = true; + } + catch (OperationCanceledException) + { + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Cancelled by user.", LogType.Warning, true); + Status.IsCanceled = true; + throw; + } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::StartPackageDownload] Preload failed:\r\n{ex}", LogType.Error, true); + SentryHelper.ExceptionHandler(ex, SentryHelper.ExceptionType.UnhandledOther); + throw; + } + finally + { + Logger.LogWriteLine("[PluginGameInstallWrapper::StartPackageDownload] Entering finally block.", LogType.Debug, true); + UnregisterPerFileProgressCallback(); + Status.IsCompleted = isSuccess; + IsRunning = false; + UpdateStatus(); + } } public ValueTask StartPackageVerification(List? gamePackage = null) { - // NOP + // NOP — preload download includes verification internally return new ValueTask(1); } @@ -216,6 +350,7 @@ public async Task StartPackageInstallation() _updateProgressProperty.IsUpdateMode = await GameManager.GetGameState() == GameInstallStateEnum.NeedsUpdate; ResetStatusAndProgressProperty(); + bool isSuccess = false; try { @@ -240,6 +375,10 @@ public async Task StartPackageInstallation() await EnsureDiskSpaceAvailability(GameManager.GameDirPath, sizeToDownload, sizeAlreadyDownloaded); + TryRegisterPerFileProgressCallback(); + Status.IsIncludePerFileIndicator = _hasPerFileProgress; + UpdateStatus(); + Task routineTask; if (_updateProgressProperty.IsUpdateMode) { @@ -263,15 +402,23 @@ public async Task StartPackageInstallation() } await routineTask.ConfigureAwait(false); + isSuccess = true; } - catch (OperationCanceledException) when (Token!.IsCancellationRequested) + catch (OperationCanceledException) { Status.IsCanceled = true; throw; } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::StartPackageInstallation] Install/Update failed:\r\n{ex}", LogType.Error, true); + SentryHelper.ExceptionHandler(ex, SentryHelper.ExceptionType.UnhandledOther); + throw; + } finally { - Status.IsCompleted = true; + UnregisterPerFileProgressCallback(); + Status.IsCompleted = isSuccess; IsRunning = false; UpdateStatus(); } @@ -279,64 +426,102 @@ public async Task StartPackageInstallation() private void UpdateProgressCallback(in InstallProgress delegateProgress) { - using (_updateStatusLock.EnterScope()) + // IMPORTANT: This callback is invoked via a function pointer from the NativeAOT plugin. + // Any unhandled exception here crosses the reverse P/Invoke boundary and causes a + // FailFast (STATUS_FAIL_FAST_EXCEPTION / exit code -1073741189). Must never throw. + try { - long downloadedBytes = delegateProgress.DownloadedBytes; - long downloadedBytesTotal = delegateProgress.TotalBytesToDownload; - - long readDownload = delegateProgress.DownloadedBytes - _updateProgressProperty.LastDownloaded; - double currentSpeed = CalculateSpeed(readDownload); - - if (CheckIfNeedRefreshStopwatch()) + using (_updateStatusLock.EnterScope()) { - return; + _updateProgressProperty.StateCount = delegateProgress.StateCount; + _updateProgressProperty.StateCountTotal = delegateProgress.TotalStateToComplete; + + _updateProgressProperty.AssetCount = delegateProgress.DownloadedCount; + _updateProgressProperty.AssetCountTotal = delegateProgress.TotalCountToDownload; + + long downloadedBytes = delegateProgress.DownloadedBytes; + long downloadedBytesTotal = delegateProgress.TotalBytesToDownload; + + long readDownload = delegateProgress.DownloadedBytes - _updateProgressProperty.LastDownloaded; + double currentSpeed = CalculateSpeed(readDownload); + + Progress.ProgressAllSizeCurrent = downloadedBytes; + Progress.ProgressAllSizeTotal = downloadedBytesTotal; + Progress.ProgressAllSpeed = currentSpeed; + + if (_hasPerFileProgress) + { + // V1Ext_Update5: per-file bytes/percentage come from OnPerFileProgressCallback. + // We only set the speed here (overall throughput is the meaningful metric). + Progress.ProgressPerFileSpeed = currentSpeed; + } + else + { + // Fallback: mirror aggregate values into per-file fields for older plugins. + Progress.ProgressPerFileSizeCurrent = downloadedBytes; + Progress.ProgressPerFileSizeTotal = downloadedBytesTotal; + Progress.ProgressPerFileSpeed = currentSpeed; + Progress.ProgressPerFilePercentage = downloadedBytesTotal > 0 + ? ConverterTool.ToPercentage(downloadedBytesTotal, downloadedBytes) + : 0; + } + + Progress.ProgressAllTimeLeft = downloadedBytesTotal > 0 && currentSpeed > 0 + ? ConverterTool.ToTimeSpanRemain(downloadedBytesTotal, downloadedBytes, currentSpeed) + : TimeSpan.Zero; + + Progress.ProgressAllPercentage = downloadedBytesTotal > 0 + ? ConverterTool.ToPercentage(downloadedBytesTotal, downloadedBytes) + : 0; + + _updateProgressProperty.LastDownloaded = downloadedBytes; + + if (!CheckIfNeedRefreshStopwatch()) + { + return; + } + + if (Status.IsProgressAllIndetermined) + { + Status.IsProgressAllIndetermined = false; + Status.IsProgressPerFileIndetermined = false; + UpdateStatus(); + } + + UpdateProgress(); } - - _updateProgressProperty.StateCount = delegateProgress.StateCount; - _updateProgressProperty.StateCountTotal = delegateProgress.TotalStateToComplete; - - _updateProgressProperty.AssetCount = delegateProgress.DownloadedCount; - _updateProgressProperty.AssetCountTotal = delegateProgress.TotalCountToDownload; - - Progress.ProgressAllSizeCurrent = downloadedBytes; - Progress.ProgressAllSizeTotal = downloadedBytesTotal; - Progress.ProgressAllSpeed = currentSpeed; - - Progress.ProgressAllTimeLeft = ConverterTool - .ToTimeSpanRemain(downloadedBytesTotal, downloadedBytes, currentSpeed); - - Progress.ProgressAllPercentage = ConverterTool.ToPercentage(downloadedBytesTotal, downloadedBytes); - - _updateProgressProperty.LastDownloaded = downloadedBytes; - - if (Status.IsProgressAllIndetermined) - { - Status.IsProgressAllIndetermined = false; - Status.IsProgressPerFileIndetermined = false; - UpdateStatus(); - } - - UpdateProgress(); + } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::UpdateProgressCallback] Exception (swallowed to prevent FailFast):\r\n{ex}", LogType.Error, true); } } private void UpdateStatusCallback(InstallProgressState delegateState) { - using (_updateStatusLock.EnterScope()) + // IMPORTANT: Same reverse P/Invoke boundary guard as UpdateProgressCallback above. + try { - string stateString = delegateState switch + using (_updateStatusLock.EnterScope()) { - InstallProgressState.Removing => string.Format("Deleting" + ": " + Locale.Current.Lang?._Misc?.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), - InstallProgressState.Idle => Locale.Current.Lang?._Misc?.Idle, - InstallProgressState.Install => string.Format(Locale.Current.Lang?._Misc?.Extracting + ": " + Locale.Current.Lang?._Misc?.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), - InstallProgressState.Verify or InstallProgressState.Preparing => string.Format(Locale.Current.Lang?._Misc?.Verifying + ": " + Locale.Current.Lang?._Misc?.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), - _ => string.Format((!_updateProgressProperty.IsUpdateMode ? Locale.Current.Lang?._Misc?.Downloading : Locale.Current.Lang?._Misc?.Updating) + ": " + Locale.Current.Lang?._Misc?.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal) - } ?? ""; - - Status.ActivityStatus = stateString; - Status.ActivityAll = string.Format(Locale.Current.Lang?._Misc?.PerFromTo ?? "", _updateProgressProperty.AssetCount, _updateProgressProperty.AssetCountTotal); + string stateString = delegateState switch + { + InstallProgressState.Removing => string.Format("Deleting" + ": " + Locale.Current.Lang._Misc.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), + InstallProgressState.Idle => Locale.Current.Lang._Misc.Idle, + InstallProgressState.Install => string.Format(Locale.Current.Lang._Misc.Extracting + ": " + Locale.Current.Lang._Misc.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), + InstallProgressState.Verify or InstallProgressState.Preparing => string.Format(Locale.Current.Lang._Misc.Verifying + ": " + Locale.Current.Lang._Misc.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal), + _ => string.Format((!_updateProgressProperty.IsUpdateMode ? Locale.Current.Lang._Misc.Downloading : Locale.Current.Lang._Misc.Updating) + ": " + Locale.Current.Lang._Misc.PerFromTo, _updateProgressProperty.StateCount, _updateProgressProperty.StateCountTotal) + }; + + Status.ActivityStatus = stateString; + Status.ActivityAll = string.Format(Locale.Current.Lang._Misc.PerFromTo, _updateProgressProperty.AssetCount, _updateProgressProperty.AssetCountTotal); - UpdateStatus(); + UpdateStatus(); + } + } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::UpdateStatusCallback] Exception (swallowed to prevent FailFast):\r\n{ex}", LogType.Error, true); } } @@ -414,12 +599,34 @@ public async ValueTask UninstallGame() public void Flush() => FlushingTrigger?.Invoke(this, EventArgs.Empty); - // TODO: - // Implement this after WuWa Plugin implementation is completed - public ValueTask IsPreloadCompleted(CancellationToken token = default) + public async ValueTask IsPreloadCompleted(CancellationToken token = default) { - // NOP - return new ValueTask(true); + try + { + await _gameInstaller.InitPluginComAsync(_plugin, token); + + Guid cancelGuid = _plugin.RegisterCancelToken(token); + + _gameInstaller.GetGameSizeAsync(GameInstallerKind.Preload, in cancelGuid, out nint asyncTotal); + long totalSize = await asyncTotal.AsTask(); + + if (totalSize <= 0) + return false; + + _gameInstaller.GetGameDownloadedSizeAsync(GameInstallerKind.Preload, in cancelGuid, out nint asyncDownloaded); + long downloadedSize = await asyncDownloaded.AsTask(); + + return downloadedSize >= totalSize; + } + catch (OperationCanceledException) + { + throw; + } + catch (Exception ex) + { + Logger.LogWriteLine($"[PluginGameInstallWrapper::IsPreloadCompleted] Error checking preload status:\r\n{ex}", LogType.Error, true); + return false; + } } // TODO: @@ -437,19 +644,127 @@ public ValueTask TryShowFailedGameConversionState() return new ValueTask(false); } - // TODO: - // Implement this after WuWa Plugin implementation is completed - public ValueTask CleanUpGameFiles(bool withDialog = true) + public async ValueTask CleanUpGameFiles(bool withDialog = true) { - // NOP - return new ValueTask(); + string gameDirPath = GameManager.GameDirPath; + string tempDirPath = Path.Combine(gameDirPath, "TempPath"); + + if (!Directory.Exists(tempDirPath)) + return; + + // Collect temp files + DirectoryInfo tempDir = new DirectoryInfo(tempDirPath); + List tempFiles = []; + long totalSize = 0; + + foreach (FileInfo file in tempDir.EnumerateFiles("*", SearchOption.AllDirectories)) + { + LocalFileInfo localFile = new LocalFileInfo(file, gameDirPath); + tempFiles.Add(localFile); + totalSize += file.Length; + } + + if (tempFiles.Count == 0) + return; + + if (withDialog) + { + if (WindowUtility.CurrentWindow is MainWindow mainWindow) + { + mainWindow.OverlayFrame.BackStack?.Clear(); + mainWindow.OverlayFrame.Navigate(typeof(NullPage)); + mainWindow.OverlayFrame.Navigate(typeof(FileCleanupPage), null, + new DrillInNavigationTransitionInfo()); + } + + if (FileCleanupPage.Current == null) + return; + await FileCleanupPage.Current.InjectFileInfoSource(tempFiles, totalSize); + + LoadingMessageHelper.HideLoadingFrame(); + + FileCleanupPage.Current.MenuExitButton.Click += ExitFromOverlay; + FileCleanupPage.Current.MenuReScanButton.Click += ExitFromOverlay; + FileCleanupPage.Current.MenuReScanButton.Click += async (_, _) => + { + await Task.Delay(250); + await CleanUpGameFiles(); + }; + return; + } + + // Delete directly without dialog + foreach (LocalFileInfo fileInfo in tempFiles) + { + TryDeleteReadOnlyFile(fileInfo.FullPath); + } + + return; + + static void ExitFromOverlay(object? sender, RoutedEventArgs args) + { + if (WindowUtility.CurrentWindow is not MainWindow mainWindow) + return; + + mainWindow.OverlayFrame.GoBack(); + mainWindow.OverlayFrame.BackStack?.Clear(); + } } - // TODO: - // Implement this after WuWa Plugin implementation is completed public void UpdateCompletenessStatus(CompletenessStatus status) { - // NOP + switch (status) + { + case CompletenessStatus.Running: + IsRunning = true; + Status.IsRunning = true; + Status.IsCompleted = false; + Status.IsCanceled = false; +#if !DISABLEDISCORD + InnerLauncherConfig.AppDiscordPresence?.SetActivity(ActivityType.Update); +#endif + break; + case CompletenessStatus.Completed: + IsRunning = false; + Status.IsRunning = false; + Status.IsCompleted = true; + Status.IsCanceled = false; + Status.IsProgressAllIndetermined = false; + Status.IsProgressPerFileIndetermined = false; +#if !DISABLEDISCORD + InnerLauncherConfig.AppDiscordPresence?.SetActivity(ActivityType.Idle); +#endif + lock (Progress) + { + Progress.ProgressAllPercentage = 100f; + Progress.ProgressPerFilePercentage = 100f; + } + break; + case CompletenessStatus.Cancelled: + IsRunning = false; + Status.IsRunning = false; + Status.IsCompleted = false; + Status.IsCanceled = true; + Status.IsProgressAllIndetermined = false; + Status.IsProgressPerFileIndetermined = false; +#if !DISABLEDISCORD + InnerLauncherConfig.AppDiscordPresence?.SetActivity(ActivityType.Idle); +#endif + break; + case CompletenessStatus.Idle: + IsRunning = false; + Status.IsRunning = false; + Status.IsCompleted = false; + Status.IsCanceled = false; + Status.IsProgressAllIndetermined = false; + Status.IsProgressPerFileIndetermined = false; +#if !DISABLEDISCORD + InnerLauncherConfig.AppDiscordPresence?.SetActivity(ActivityType.Idle); +#endif + break; + } + + UpdateAll(); } public PostInstallBehaviour PostInstallBehaviour { get; set; } = PostInstallBehaviour.Nothing; diff --git a/CollapseLauncher/Classes/Plugins/PluginInfo.cs b/CollapseLauncher/Classes/Plugins/PluginInfo.cs index 2f957769b..20b267f21 100644 --- a/CollapseLauncher/Classes/Plugins/PluginInfo.cs +++ b/CollapseLauncher/Classes/Plugins/PluginInfo.cs @@ -329,6 +329,48 @@ internal unsafe void ToggleSpeedLimiterService(bool isEnable) } } + /// + /// Registers a per-file progress callback with the plugin via the V1Ext_Update5 export. + /// Returns true if the plugin supports Update5 and the callback was registered. + /// + internal unsafe bool EnablePerFileProgressCallback(nint callbackPtr) + { + if (!IsLoaded) + return false; + + if (!Handle.TryGetExportUnsafe("SetPerFileProgressCallback", out nint setCallbackP)) + return false; + + HResult hr = ((delegate* unmanaged[Cdecl])setCallbackP)(callbackPtr); + if (Marshal.GetExceptionForHR(hr) is { } exception) + { + Logger.LogWriteLine($"[PluginInfo] Plugin: {Name} failed to register per-file progress callback: {hr} {exception}", + LogType.Error, true); + return false; + } + + return true; + } + + /// + /// Unregisters the per-file progress callback from the plugin. + /// + internal unsafe void DisablePerFileProgressCallback() + { + if (!IsLoaded) + return; + + if (!Handle.TryGetExportUnsafe("SetPerFileProgressCallback", out nint setCallbackP)) + return; + + HResult hr = ((delegate* unmanaged[Cdecl])setCallbackP)(nint.Zero); + if (Marshal.GetExceptionForHR(hr) is { } exception) + { + Logger.LogWriteLine($"[PluginInfo] Plugin: {Name} failed to unregister per-file progress callback: {hr} {exception}", + LogType.Error, true); + } + } + internal async Task Initialize(CancellationToken token = default) { if (!IsLoaded) diff --git a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.AsbExt.Video.cs b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.AsbExt.Video.cs index a983d5793..9434d82e2 100644 --- a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.AsbExt.Video.cs +++ b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.AsbExt.Video.cs @@ -5,7 +5,7 @@ using Hi3Helper.Data; using Hi3Helper.EncTool; using Hi3Helper.EncTool.Parser.AssetMetadata; -using Hi3Helper.EncTool.Parser.Cache; +using Hi3Helper.EncTool.Parser.CacheParser; using Hi3Helper.EncTool.Parser.KianaDispatch; using Hi3Helper.Preset; using Hi3Helper.Shared.ClassStruct; @@ -14,12 +14,9 @@ using System.IO; using System.Linq; using System.Net.Http; -using System.Text; using System.Threading; using System.Threading.Tasks; -using CGMetadataHashId = Hi3Helper.EncTool.Parser.Cache.HashID; - // ReSharper disable CheckNamespace // ReSharper disable IdentifierTypo // ReSharper disable StringLiteralTypo @@ -32,6 +29,21 @@ namespace CollapseLauncher.RepairManagement; internal static partial class AssetBundleExtension { internal const string RelativePathVideo = @"BH3_Data\StreamingAssets\Video\"; + internal const string MetadataFilename = "107438912"; + + internal static void RemoveUnlistedVideoAssetFromList(this List originList, + List assetListFromVideo) + { + List originOthersListOnly = originList.Where(x => x.FT != FileType.Video).ToList(); + List originVideoListOnly = originList.Where(x => x.FT == FileType.Video).ToList(); + originList.Clear(); + originList.AddRange(originOthersListOnly); + + HashSet assetListVideoDict = + assetListFromVideo.Select(x => x.N).ToHashSet(StringComparer.OrdinalIgnoreCase); + + originList.AddRange(originVideoListOnly.Where(originVideoAsset => assetListVideoDict.Contains(originVideoAsset.N))); + } internal static async Task> GetVideoAssetListAsync( @@ -49,19 +61,19 @@ internal static async Task> HashSet ignoredCgHashset = new(ignoredCgIds ?? []); List assetInfoList = - await GetCacheAssetBundleListAsync(assetBundleHttpClient, - presetConfig, - gameServerInfo, - CacheAssetType.Data, - progressibleInstance, - token); + await assetBundleHttpClient + .GetCacheAssetBundleListAsync(presetConfig, + gameServerInfo, + CacheAssetType.Data, + progressibleInstance, + token); CacheAssetInfo? cgMetadataFile = assetInfoList - .FirstOrDefault(x => x.Asset.N.EndsWith(CGMetadataHashId.CgMetadataFilename)); + .FirstOrDefault(x => x.Asset.N.EndsWith(MetadataFilename)); if (cgMetadataFile == null) { - Logger.LogWriteLine($"[AssetBundleExtension::GetVideoAssetListAsync] Cannot find CG Metadata file with Asset ID: {CGMetadataHashId.CgMetadataFilename}", + Logger.LogWriteLine($"[AssetBundleExtension::GetVideoAssetListAsync] Cannot find CG Metadata file with Asset ID: {MetadataFilename}", LogType.Error, true); return []; @@ -83,11 +95,11 @@ await GetCacheAssetBundleListAsync(assetBundleHttpClient, cgFileStreamMemory.Position = 0; await using CacheStream dechipheredCgStream = - new CacheStream(cgFileStreamMemory, preSeed: cgMetadataFile.MhyMersenneTwisterSeed); + new(cgFileStreamMemory, preSeed: cgMetadataFile.MhyMersenneTwisterSeed); List cgEntries = []; await Parallel - .ForEachAsync(CGMetadata.Enumerate(dechipheredCgStream, Encoding.UTF8), + .ForEachAsync(KianaCgMetadata.Parse(dechipheredCgStream), new ParallelOptions { CancellationToken = token, @@ -97,56 +109,50 @@ await Parallel return cgEntries; - async ValueTask ImplCheckAndAdd(CGMetadata entry, CancellationToken innerToken) + async ValueTask ImplCheckAndAdd(KeyValuePair entry, CancellationToken innerToken) { - if (entry.InStreamingAssets || - ignoredCgHashset.Contains(entry.CgSubCategory)) + if (ignoredCgHashset.Contains(entry.Value.SubCategoryId)) { return; } - string assetName = gameLanguageType == AudioLanguageType.Japanese - ? entry.CgPathHighBitrateJP - : entry.CgPathHighBitrateCN; + string assetName = (gameLanguageType == AudioLanguageType.Japanese + ? entry.Value.PathJp + : entry.Value.PathCn) ?? throw new NullReferenceException(); assetName += ".usm"; long assetFilesize = gameLanguageType == AudioLanguageType.Japanese - ? entry.FileSizeHighBitrateJP - : entry.FileSizeHighBitrateCN; + ? entry.Value.SizeJp + : entry.Value.SizeCn; foreach (string baseUrl in gameServerInfo.ExternalAssetUrls) { string assetUrl = (isUseHttpRepairOverride ? "http://" : "https://") + baseUrl; assetUrl = assetUrl.CombineURLFromString("Video", assetName); - // If the file has no appoinment schedule (like non-birthday CG), then return true - /* - if (entry.AppointmentDownloadScheduleID == 0) - { - goto AddCgEntry; // I love goto. Dun ask me why :> - } - */ - // Update status if (progressibleInstance != null) { - progressibleInstance.Status.ActivityStatus = string.Format(Locale.Current.Lang?._GameRepairPage?.Status14 ?? "", entry.CgExtraKey); + progressibleInstance.Status.ActivityStatus = string.Format(Locale.Current.Lang?._GameRepairPage?.Status14 ?? "", assetName); progressibleInstance.Status.IsProgressAllIndetermined = true; progressibleInstance.Status.IsProgressPerFileIndetermined = true; progressibleInstance.UpdateStatus(); } - UrlStatus urlStatus = await assetBundleHttpClient.GetURLStatusCode(assetUrl, innerToken); - Logger.LogWriteLine($"The CG asset: {assetName} " + - (urlStatus.IsSuccessStatusCode ? "is" : "is not") + $" available (Status code: {urlStatus.StatusCode})", LogType.Default, true); - if (!urlStatus.IsSuccessStatusCode) + if (entry.Value.Category is CGCategory.Birthday or CGCategory.Activity or CGCategory.VersionPV) { - continue; - } + UrlStatus urlStatus = await assetBundleHttpClient.GetURLStatusCode(assetUrl, innerToken); + Logger.LogWriteLine($"The CG asset: {assetName} " + + (urlStatus.IsSuccessStatusCode ? "is" : "is not") + $" available (Status code: {urlStatus.StatusCode})", LogType.Default, true); + if (!urlStatus.IsSuccessStatusCode) + { + continue; + } - if (urlStatus.FileSize > 0) - { - assetFilesize = urlStatus.FileSize; + if (urlStatus.FileSize > 0) + { + assetFilesize = urlStatus.FileSize; + } } lock (cgEntries) @@ -157,7 +163,7 @@ async ValueTask ImplCheckAndAdd(CGMetadata entry, CancellationToken innerToken) N = assetName, RN = assetUrl, S = assetFilesize, - AssociatedObject = entry + AssociatedObject = entry.Value }); } return; diff --git a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Check.Generic.cs b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Check.Generic.cs index fdefb8d42..74a044ee6 100644 --- a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Check.Generic.cs +++ b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Check.Generic.cs @@ -3,7 +3,9 @@ using CollapseLauncher.RepairManagement; using Hi3Helper; using Hi3Helper.Data; +using Hi3Helper.EncTool; using Hi3Helper.EncTool.Hashes; +using Hi3Helper.EncTool.Parser.CacheParser; using Hi3Helper.EncTool.Parser.Senadina; using Hi3Helper.Shared.ClassStruct; using System; @@ -49,6 +51,39 @@ private async Task IsHashMatchedAuto( token)).IsHashMatched; } + /// + /// Check actual remote size asset from the actual URL.
+ ///
+ /// Note: This method only works on asset type with URL defined. + /// Otherwise, the method will immediately returns . + ///
+ private async ValueTask TryIsAssetRemoteSizeEquals( + FilePropertiesRemote asset, + FileInfo fileInfo, + bool useFastCheck, + CancellationToken token = default) + { + if (!fileInfo.Exists) + { + return false; + } + + if (asset.FT != FileType.Video || + string.IsNullOrEmpty(asset.RN) || + useFastCheck) + { + return true; + } + + UrlStatus status = await HttpClientAssetBundle.GetCachedUrlStatus(asset.RN, token); + if (!status.IsSuccessStatusCode || status.FileSize == 0) // Returns true if status is not successful or size is 0 anyways + { + return true; + } + + return fileInfo.Exists && status.FileSize == fileInfo.Length; + } + private async Task<(bool IsHashMatched, int HashSize)> IsHashMatchedAuto( FilePropertiesRemote asset, byte[] hashBuffer, @@ -78,6 +113,12 @@ private async Task IsHashMatchedAuto( if (!isAssetExist || (assetFileInfo.Length != asset.S && !isSkipSizeCheck)) { + // Try alternate check for video + if (await TryIsAssetRemoteSizeEquals(asset, assetFileInfo, useFastCheck, token)) + { + return (true, hashSize); + } + Interlocked.Add(ref ProgressAllSizeCurrent, asset.S); if (addAssetIfBroken) { diff --git a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Fetch.cs b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Fetch.cs index 9e3f031f5..c0bef2101 100644 --- a/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Fetch.cs +++ b/CollapseLauncher/Classes/RepairManagement/HonkaiV2/HonkaiRepairV2.Fetch.cs @@ -5,7 +5,7 @@ using Hi3Helper.Data; using Hi3Helper.EncTool; using Hi3Helper.EncTool.Parser.AssetMetadata; -using Hi3Helper.EncTool.Parser.Cache; +using Hi3Helper.EncTool.Parser.CacheParser; using Hi3Helper.EncTool.Parser.KianaDispatch; using Hi3Helper.EncTool.Parser.Senadina; using Hi3Helper.Shared.ClassStruct; @@ -83,6 +83,7 @@ private async Task FetchAssetFromGameAssetBundle(List asse #region Fetch Video Assets from AssetBundle List assetListFromVideo = []; + List assetListFromVideoOnlyDownloadable = []; Task assetListFromVideoTask = HttpClientAssetBundle .GetVideoAssetListAsync(gamePresetConfig, @@ -93,6 +94,7 @@ private async Task FetchAssetFromGameAssetBundle(List asse .GetResultFromAction(result => { assetListFromVideo.AddRange(result); + assetListFromVideoOnlyDownloadable.AddRange(result.Where(x => ((KianaCgMetadata)x.AssociatedObject).DownloadMode == CGDownloadMode.DownloadTipOnce)); FinalizeVideoAssetsPath(assetListFromVideo); }); #endregion @@ -144,9 +146,18 @@ await Task.WhenAll(assetListFromVideoTask, assetListFromBlockTask); #endregion + #region Remove Video Assets from base + + if (!IsMainAssetOnlyMode && !IsCacheMode) + { + assetIndex.RemoveUnlistedVideoAssetFromList(assetListFromVideo); + } + + #endregion + // Finalize the asset index list by overriding it from above additional sources. FinalizeBaseAssetIndex(assetIndex, - assetListFromVideo, + assetListFromVideoOnlyDownloadable, assetListFromAudio, assetListFromBlock); } @@ -155,6 +166,7 @@ await Task.WhenAll(assetListFromVideoTask, #region Fetch by Game Cache Files private static Task FetchAssetFromGameCacheFiles(List assetIndex, CancellationToken token) { + // TODO: Use it for altering assets for Cache Update mode return Task.CompletedTask; } #endregion @@ -276,7 +288,7 @@ private void FinalizeVideoAssetsPath(List assetList) { string relativePath = Path.Combine(AssetBundleExtension.RelativePathVideo, asset.N); ConverterTool.NormalizePathInplaceNoTrim(relativePath); - if (asset.AssociatedObject is CGMetadata { InStreamingAssets: false }) + if (asset.AssociatedObject is KianaCgMetadata { DownloadMode: CGDownloadMode.DownloadTipOnce }) { versionStreamWriter.WriteLine($"Video/{asset.N}\t1"); } @@ -375,7 +387,7 @@ private async Task FinalizeBlockAssetsPath( CancellationToken token) { // Block assets replacement and add - HashSet oldBlockNames = new HashSet(StringComparer.OrdinalIgnoreCase); + HashSet oldBlockNames = new(StringComparer.OrdinalIgnoreCase); foreach (FilePropertiesRemote asset in targetAssetList) { string relativePath = Path.Combine(AssetBundleExtension.RelativePathBlock, asset.N); diff --git a/CollapseLauncher/CollapseLauncher.csproj b/CollapseLauncher/CollapseLauncher.csproj index a69521d08..d8d13206a 100644 --- a/CollapseLauncher/CollapseLauncher.csproj +++ b/CollapseLauncher/CollapseLauncher.csproj @@ -294,8 +294,8 @@ - - + + @@ -311,13 +311,13 @@ - + - + diff --git a/CollapseLauncher/XAMLs/MainApp/MainPage.Navigation.cs b/CollapseLauncher/XAMLs/MainApp/MainPage.Navigation.cs index 64d936086..fa03a0dfa 100644 --- a/CollapseLauncher/XAMLs/MainApp/MainPage.Navigation.cs +++ b/CollapseLauncher/XAMLs/MainApp/MainPage.Navigation.cs @@ -13,6 +13,8 @@ using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media.Animation; using System; +using System.Collections; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Numerics; @@ -36,6 +38,31 @@ #nullable enable namespace CollapseLauncher; +file static class NavigationExtension +{ + public static void Add(this IList list, string localePropertyPath, string? iconGlyph = null, object? tag = null) + where TItem : NavigationViewItemBase, new() + { + TItem item = new() { Tag = tag }; + item.BindNavigationViewItemText(Locale.Current, localePropertyPath); + + if (item is NavigationViewItem asItem && iconGlyph != null) + { + asItem.Icon = new FontIcon { Glyph = iconGlyph }; + } + + list.Add(item); + } + + public static void Add(this IList list, string localePropertyPath, string? iconGlyph = null) + where TItem : NavigationViewItemBase, new() + where TPage : notnull + { + Type navigationType = typeof(TPage); + list.Add(localePropertyPath, iconGlyph, navigationType); + } +} + public partial class MainPage : Page { private void InitializeNavigationItems(bool ResetSelection = true) @@ -49,59 +76,50 @@ void Impl() NavigationViewControl.MenuItems.Clear(); NavigationViewControl.FooterMenuItems.Clear(); - IGameVersion? CurrentGameVersionCheck = GetCurrentGameProperty().GameVersion; + GamePresetProperty gameProperty = GetCurrentGameProperty(); + IGameVersion? CurrentGameVersionCheck = gameProperty.GameVersion; - FontIcon IconLauncher = new() { Glyph = "" }; - FontIcon IconRepair = new() { Glyph = "" }; - FontIcon IconCaches = new() { Glyph = m_isWindows11 ? "" : "" }; - FontIcon IconGameSettings = new() { Glyph = "" }; - FontIcon IconAppSettings = new() { Glyph = "" }; - FontIcon IconFilesCleanup = new() { Glyph = "" }; + FontIcon iconAppSettings = new() { Glyph = "" }; + string cachePageGlyph = m_isWindows11 ? "" : ""; if (m_appMode == AppMode.Hi3CacheUpdater) { if (CurrentGameVersionCheck?.GamePreset.IsCacheUpdateEnabled ?? false) { - NavigationViewControl.MenuItems.Add(new NavigationViewItem { Icon = IconCaches, Tag = typeof(CachesPage) }.BindNavigationViewItemText(Locale.Current, "Lang._CachesPage.PageTitle")); + NavigationViewControl.MenuItems.Add("Lang._CachesPage.PageTitle", cachePageGlyph); } return; } - NavigationViewControl.MenuItems.Add(new NavigationViewItem { Icon = IconLauncher, Tag = typeof(HomePage) }.BindNavigationViewItemText(Locale.Current, "Lang._HomePage.PageTitle")); - NavigationViewControl.MenuItems.Add(new NavigationViewItemHeader().BindNavigationViewItemText(Locale.Current, "Lang._MainPage.NavigationUtilities")); + NavigationViewControl.MenuItems.Add("Lang._HomePage.PageTitle", ""); + NavigationViewControl.MenuItems.Add("Lang._MainPage.NavigationUtilities"); if (CurrentGameVersionCheck?.GamePreset.IsRepairEnabled ?? false) { - NavigationViewControl.MenuItems.Add(new NavigationViewItem { Icon = IconRepair, Tag = typeof(RepairPage) }.BindNavigationViewItemText(Locale.Current, "Lang._GameRepairPage.PageTitle")); + NavigationViewControl.MenuItems.Add("Lang._GameRepairPage.PageTitle", ""); } if (CurrentGameVersionCheck?.GamePreset.IsCacheUpdateEnabled ?? false) { - NavigationViewControl.MenuItems.Add(new NavigationViewItem { Icon = IconCaches, Tag = typeof(CachesPage) }.BindNavigationViewItemText(Locale.Current, "Lang._CachesPage.PageTitle")); + NavigationViewControl.MenuItems.Add("Lang._CachesPage.PageTitle", cachePageGlyph); } - switch (CurrentGameVersionCheck?.GameType) + Type? gspPageType = CurrentGameVersionCheck?.GameType switch { - case GameNameType.Honkai: - NavigationViewControl.FooterMenuItems.Add(new NavigationViewItem { Icon = IconGameSettings, Tag = typeof(HonkaiGameSettingsPage) }.BindNavigationViewItemText(Locale.Current, "Lang._GameSettingsPage.PageTitle")); - break; - case GameNameType.StarRail: - NavigationViewControl.FooterMenuItems.Add(new NavigationViewItem { Icon = IconGameSettings, Tag = typeof(StarRailGameSettingsPage) }.BindNavigationViewItemText(Locale.Current, "Lang._StarRailGameSettingsPage.PageTitle")); - break; - case GameNameType.Genshin: - NavigationViewControl.FooterMenuItems.Add(new NavigationViewItem { Icon = IconGameSettings, Tag = typeof(GenshinGameSettingsPage) }.BindNavigationViewItemText(Locale.Current, "Lang._GenshinGameSettingsPage.PageTitle")); - break; - case GameNameType.Zenless: - NavigationViewControl.FooterMenuItems.Add(new NavigationViewItem { Icon = IconGameSettings, Tag = typeof(ZenlessGameSettingsPage) }.BindNavigationViewItemText(Locale.Current, "Lang._GameSettingsPage.PageTitle")); - break; - } + GameNameType.Honkai => typeof(HonkaiGameSettingsPage), + GameNameType.StarRail => typeof(StarRailGameSettingsPage), + GameNameType.Genshin => typeof(GenshinGameSettingsPage), + GameNameType.Zenless => typeof(ZenlessGameSettingsPage), + _ => null + }; - NavigationViewControl.FooterMenuItems.Add(new NavigationViewItem { Icon = IconFilesCleanup, Tag = "filescleanup"}.BindNavigationViewItemText(Locale.Current, "Lang._FileCleanupPage.Title")); + NavigationViewControl.FooterMenuItems.Add("Lang._GameSettingsPage.PageTitle", "", gspPageType); + NavigationViewControl.FooterMenuItems.Add("Lang._FileCleanupPage.Title", "", "filescleanup"); if (NavigationViewControl.SettingsItem is NavigationViewItem settingsItem) { - settingsItem.Tag = typeof(SettingsPage); - settingsItem.Icon = IconAppSettings; + settingsItem.Tag = typeof(SettingsPage); + settingsItem.Icon = iconAppSettings; _ = settingsItem.BindNavigationViewItemText(Locale.Current, "Lang._SettingsPage.PageTitle"); } @@ -125,7 +143,7 @@ void Impl() break; } } - AttachShadowNavigationPanelItem(IconAppSettings); + AttachShadowNavigationPanelItem(iconAppSettings); if (ResetSelection) { @@ -310,6 +328,12 @@ typeOfPageObj is Type currentPageType && } LauncherFrame.Navigate(pageType, null, transitionInfo ?? new DrillInNavigationTransitionInfo()); + + if (isForceLoad) + { + LauncherFrame.BackStack.Clear(); + LauncherFrame.CacheSize = 0; + } break; } case "filescleanup": diff --git a/CollapseLauncher/XAMLs/MainApp/MainPage.xaml.cs b/CollapseLauncher/XAMLs/MainApp/MainPage.xaml.cs index 9da2562d2..26fd7a1ab 100644 --- a/CollapseLauncher/XAMLs/MainApp/MainPage.xaml.cs +++ b/CollapseLauncher/XAMLs/MainApp/MainPage.xaml.cs @@ -250,20 +250,7 @@ private async void ErrorSenderInvoker_ExceptionEvent(object? sender, ErrorProper private void MainFrameChangerInvoker_FrameEvent(object? sender, MainFrameProperties e) { InnerLauncherConfig.m_appCurrentFrameName = e.FrameTo.Name; - - int previousStackLimit = LauncherFrame.CacheSize; - if (e.RequireCacheReset) - { - LauncherFrame.BackStack.Clear(); - LauncherFrame.CacheSize = 0; - NavigationViewControl.SelectedItem = null; - } - TryNavigateFrom(e.FrameTo, e.Transition, e.RequireCacheReset); - if (e.RequireCacheReset) - { - LauncherFrame.CacheSize = previousStackLimit; - } } private void MainFrameChangerInvoker_FrameGoBackEvent(object? sender, EventArgs e) diff --git a/CollapseLauncher/XAMLs/MainApp/Pages/Dialogs/SimpleDialogs.cs b/CollapseLauncher/XAMLs/MainApp/Pages/Dialogs/SimpleDialogs.cs index 49de5501c..eb088f14a 100644 --- a/CollapseLauncher/XAMLs/MainApp/Pages/Dialogs/SimpleDialogs.cs +++ b/CollapseLauncher/XAMLs/MainApp/Pages/Dialogs/SimpleDialogs.cs @@ -1910,7 +1910,56 @@ void HomepageHyperlinkOnClick(Hyperlink sender, HyperlinkClickEventArgs args) closeText: Locale.Current.Lang?._Misc?.IDoNotAcceptAgreement, primaryText: Locale.Current.Lang?._Misc?.IAcceptAgreement, defaultButton: ContentDialogButton.Primary, - dialogTheme: ContentDialogTheme.Informational); + dialogTheme: ContentDialogTheme.Informational, + onLoaded: (sender, _) => + { + if (sender is not ContentDialog dialog) + return; + + // Disable the primary ("I accept") button until user scrolls to the bottom + dialog.IsPrimaryButtonEnabled = false; + + // The ContentDialog wraps its Content in a ScrollViewer. + // Find it and listen for scroll changes. + ScrollViewer? sv = dialog.FindDescendant(); + if (sv == null) + return; + + sv.ViewChanged += OnViewChanged; + + // If content is short enough to not need scrolling, + // enable the button after layout completes. + sv.SizeChanged += OnSizeChanged; + + void OnSizeChanged(object s, SizeChangedEventArgs e) + { + if (s is not ScrollViewer scrollViewer) + return; + + if (scrollViewer.ScrollableHeight < 1) + { + dialog.IsPrimaryButtonEnabled = true; + scrollViewer.ViewChanged -= OnViewChanged; + scrollViewer.SizeChanged -= OnSizeChanged; + } + } + + void OnViewChanged(object s, ScrollViewerViewChangedEventArgs args) + { + if (args.IsIntermediate) + return; + + if (s is not ScrollViewer scrollViewer) + return; + + if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight - 40) + { + dialog.IsPrimaryButtonEnabled = true; + scrollViewer.ViewChanged -= OnViewChanged; + scrollViewer.SizeChanged -= OnSizeChanged; + } + } + }); if (result == ContentDialogResult.None) { return false; diff --git a/CollapseLauncher/XAMLs/MainApp/Pages/HomePage.xaml.cs b/CollapseLauncher/XAMLs/MainApp/Pages/HomePage.xaml.cs index 1ec813219..abad7c1ea 100644 --- a/CollapseLauncher/XAMLs/MainApp/Pages/HomePage.xaml.cs +++ b/CollapseLauncher/XAMLs/MainApp/Pages/HomePage.xaml.cs @@ -145,7 +145,17 @@ private void InitializeConsoleValues() private static bool NeedShowEventIcon => GetAppConfigValue("ShowEventsPanel").ToBool(); - private static void ReturnToHomePage() => MainFrameChanger.ChangeMainFrame(typeof(HomePage), true); + private void ReturnToHomePage() + { + if (!(m_mainPage?.TryGetCurrentPageObject(out object typeOfPage) ?? false) || + typeOfPage is not Type asTypePage || + asTypePage != typeof(HomePage) || + GamePropertyVault.GetCurrentGameProperty() != CurrentGameProperty) + { + return; + } + MainFrameChanger.ChangeMainFrame(typeof(HomePage), true); + } private async void Page_Loaded(object sender, RoutedEventArgs e) { diff --git a/CollapseLauncher/packages.lock.json b/CollapseLauncher/packages.lock.json index 2712cd156..4667fee68 100644 --- a/CollapseLauncher/packages.lock.json +++ b/CollapseLauncher/packages.lock.json @@ -4,15 +4,15 @@ "net10.0-windows10.0.26100": { "CommunityToolkit.Common": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "yqU6s4sLjaMuJ0OS6MSpOLkdbLS8HhyD0RSMQ/+/AyAjXizLMdXnlImgVBXPEGmBsNKDjApGF7uFmSh/xhie7A==" + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "SedQf214RzGA4Jwdl/auRM6h/8838DAbP0XvCxRWfeRTEnVqtl+6vn/XGYW2aXt8J5cWTh7rPdHWLZmly2qyIg==" }, "CommunityToolkit.Mvvm": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "tqVU8yc/ADO9oiTRyTnwhFN68hCwvkliMierptWOudIAvWY1mWCh5VFh+guwHJmpMwfg0J0rY+yyd5Oy7ty9Uw==" + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "WadCzGEc2U+3e20avRLng4qNtt4zoOGWrdUISqJWrHe3/FSnrYjuM5Sb4yQb09LhkBXrrI4Zt3dLKgRMbItsrg==" }, "CommunityToolkit.WinUI.Behaviors": { "type": "Direct", @@ -111,9 +111,9 @@ }, "Markdig.Signed": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "l8HRXbpkhS/FJW32AROpuxOYBl0ezjR8QU/WIhgPlZWm37B5d+1ZPcfS34Lu2bOY/IoItvQwQeW0tA81mxes9g==" + "requested": "[1.1.2, )", + "resolved": "1.1.2", + "contentHash": "VhLyagUuMYAluPCBwz6TJwWkdmq+X4q2eTc9w2sKRHwb4+HcvGtANhOxKqnI7a+KQXMhCgnjkqMEbepEcg908g==" }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Direct", @@ -171,19 +171,19 @@ }, "Microsoft.WindowsAppSDK": { "type": "Direct", - "requested": "[1.8.260209005, )", - "resolved": "1.8.260209005", - "contentHash": "AGHOiZcrDrpaxpHfEFKlI8MVnibfbSixI5DlbU6ozP/9dyWN5FkTFowg+dEOnaFRCnOzTSAjBQ1HuS4lAO+aMQ==", + "requested": "[1.8.260317003, )", + "resolved": "1.8.260317003", + "contentHash": "gJ78mbsatwWB67OPeZ6PFz0PSOttvSsp4E7Xb6/1Ls7ZIJtRrsLix4e0DGVWrE8AlQuBYJMc157gyOtQTx5TRw==", "dependencies": { - "Microsoft.WindowsAppSDK.AI": "[1.8.47]", + "Microsoft.WindowsAppSDK.AI": "[1.8.53]", "Microsoft.WindowsAppSDK.Base": "[1.8.251216001]", "Microsoft.WindowsAppSDK.DWrite": "[1.8.25122902]", - "Microsoft.WindowsAppSDK.Foundation": "[1.8.260203002]", + "Microsoft.WindowsAppSDK.Foundation": "[1.8.260222000]", "Microsoft.WindowsAppSDK.InteractiveExperiences": "[1.8.260125001]", - "Microsoft.WindowsAppSDK.ML": "[1.8.2124]", - "Microsoft.WindowsAppSDK.Runtime": "[1.8.260209005]", + "Microsoft.WindowsAppSDK.ML": "[1.8.2141]", + "Microsoft.WindowsAppSDK.Runtime": "[1.8.260317003]", "Microsoft.WindowsAppSDK.Widgets": "[1.8.251231004]", - "Microsoft.WindowsAppSDK.WinUI": "[1.8.260204000]" + "Microsoft.WindowsAppSDK.WinUI": "[1.8.260224000]" } }, "Microsoft.Xaml.Behaviors.WinUI.Managed": { @@ -312,8 +312,8 @@ }, "Google.Protobuf": { "type": "Transitive", - "resolved": "3.34.0", - "contentHash": "a5US9akiNczS5kC7qBqYqJmnxHVQDITZD6GRRbwGHk/oa17EwOGE3PHIWFVeHTqCctq8mVjLSelwsxCkYYBinA==" + "resolved": "3.34.1", + "contentHash": "212vdYxRuVopGE5bess6Jg5oXWyizA6hcLPTI7G+qA4PthQEvfeof3njT+7VSY5v/+O0P22xTydiP5fSJJpGEA==" }, "Hi3Helper.ZstdNet": { "type": "Transitive", @@ -364,11 +364,11 @@ }, "Microsoft.WindowsAppSDK.AI": { "type": "Transitive", - "resolved": "1.8.47", - "contentHash": "9il8KT8WR4T826hnm3M/USZTkPtVXFGE0IztmE1l7H9DPYsa3QHEUgGHFHQg88fsMjdr3vhyMvs23AB+1IYF1w==", + "resolved": "1.8.53", + "contentHash": "bRzx+VwQY/OXxFJYML9riOrds7sBrCNpDG6Aok8KiH+TcdE6HnWjNzxJBDe/dQRTXQO5OQa9I7LNjN8NAZ1fjg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001" + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000" } }, "Microsoft.WindowsAppSDK.Base": { @@ -390,8 +390,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" @@ -407,18 +407,18 @@ }, "Microsoft.WindowsAppSDK.ML": { "type": "Transitive", - "resolved": "1.8.2124", - "contentHash": "l7ZptLbvOWHEJgxZtCQhUzDNCakNcqSJyAa7DNXBLKxGIUMDqq9LnWyYRZZFNQwN7hRfDAR8fEAblP1UHYHGgw==", + "resolved": "1.8.2141", + "contentHash": "A707h4Fg0Z4y5lWOJMacWUNQxZ01Iceat2iS8cMggLj4pe/NmbtehBQAgvaVKbsHN8V4F+SlJL+c7fAjXJjWJQ==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "System.Numerics.Tensors": "9.0.0" } }, "Microsoft.WindowsAppSDK.Runtime": { "type": "Transitive", - "resolved": "1.8.260209005", - "contentHash": "aZjMu/glUGjzACowzzhj9drn/Ddfp1yA+f7CFXpkiSk6iZ2x32vhKfcqT64RpJ6R+Dj1hl9/79aXFhIavYNj9g==", + "resolved": "1.8.260317003", + "contentHash": "sLhPQoFHywDZLMvLTzjErOMvZJkRtzYRW0vQhumT9UqZI700sygbmnbuyCkjyvrmEnsNB9iVAiYbKf93OVBWXA==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001" } @@ -433,12 +433,12 @@ }, "Microsoft.WindowsAppSDK.WinUI": { "type": "Transitive", - "resolved": "1.8.260204000", - "contentHash": "DSpA01+iPXwky4O1uZCrdClSi2aRIYTIhmsTeC1EsJmWBFpSirwNAg4EGHejijV6u4ZVkTdyv3px0Y2P3fp72Q==", + "resolved": "1.8.260224000", + "contentHash": "w3k3qK6gvJU0RgkP6gQUgvgUbuYvLP4OeQA+0Vrx+4mJtwCB+6D9LOhzFNVVq3y0yrW5eoPT4xeDQALTbpe2Sw==", "dependencies": { "Microsoft.Web.WebView2": "1.0.3179.45", "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260203002", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" } }, @@ -449,8 +449,8 @@ }, "Sentry": { "type": "Transitive", - "resolved": "6.2.0", - "contentHash": "kZkHnj9NvQTjf5e8VmVQUT2HdVSmph9MhSm6U+vGoB4vq2uR1a+ZRHpAksNJNl7EjaGbYp55cOWqx5Nh0jQc8w==" + "resolved": "6.3.0", + "contentHash": "PwcF5yIzcKuhd/3BOxU3QHJA5/xYiuSNSaSpXi2kR3x7ONKel73xi49GfYvRg4mbMN1gRjxduqxQL6iRNNWqBA==" }, "SharpHDiffPatch.Core": { "type": "Transitive", @@ -513,7 +513,7 @@ "type": "Project", "dependencies": { "H.NotifyIcon": "[1.0.0, )", - "Microsoft.WindowsAppSDK": "[1.8.260209005, )" + "Microsoft.WindowsAppSDK": "[1.8.260317003, )" } }, "hi3helper.core": { @@ -522,13 +522,13 @@ "Hi3Helper.EncTool": "[1.0.0, )", "Hi3Helper.Win32": "[1.0.0, )", "Microsoft.Windows.CsWinRT": "[2.2.0, )", - "Sentry": "[6.2.0, )" + "Sentry": "[6.3.0, )" } }, "hi3helper.enctool": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.34.0, )", + "Google.Protobuf": "[3.34.1, )", "Hi3Helper.Http": "[2.0.0, )", "Hi3Helper.Win32": "[1.0.0, )", "System.IO.Hashing": "[10.0.5, )" @@ -555,7 +555,7 @@ "hi3helper.sophon": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.34.0, )", + "Google.Protobuf": "[3.34.1, )", "Hi3Helper.ZstdNet": "[*, )", "SharpHDiffPatch.Core": "[*, )", "System.IO.Hashing": "[10.0.5, )" @@ -578,22 +578,22 @@ "ImageCropper": { "type": "Project", "dependencies": { - "CommunityToolkit.Common": "[8.4.0, )", + "CommunityToolkit.Common": "[8.4.2, )", "CommunityToolkit.WinUI.Extensions": "[8.2.251219, )", "CommunityToolkit.WinUI.Media": "[8.2.251219, )", "Microsoft.Graphics.Win2D": "[1.4.0, )", "Microsoft.Windows.CsWinRT": "[2.2.0, )", "Microsoft.Windows.SDK.BuildTools": "[10.0.26100.7705, )", - "Microsoft.WindowsAppSDK": "[1.8.260209005, )" + "Microsoft.WindowsAppSDK": "[1.8.260317003, )" } }, "imageex": { "type": "Project", "dependencies": { - "CommunityToolkit.Common": "[8.4.0, )", + "CommunityToolkit.Common": "[8.4.2, )", "CommunityToolkit.WinUI.Extensions": "[8.2.251219, )", "Microsoft.Windows.SDK.BuildTools": "[10.0.26100.7705, )", - "Microsoft.WindowsAppSDK": "[1.8.260209005, )" + "Microsoft.WindowsAppSDK": "[1.8.260317003, )" } }, "innosetuphelper": { @@ -605,11 +605,11 @@ "SettingsControls": { "type": "Project", "dependencies": { - "CommunityToolkit.Common": "[8.4.0, )", + "CommunityToolkit.Common": "[8.4.2, )", "CommunityToolkit.WinUI.Triggers": "[8.2.251219, )", "Microsoft.Windows.CsWinRT": "[2.2.0, )", "Microsoft.Windows.SDK.BuildTools": "[10.0.26100.7705, )", - "Microsoft.WindowsAppSDK": "[1.8.260209005, )" + "Microsoft.WindowsAppSDK": "[1.8.260317003, )" } }, "sevenzipextractor": { @@ -688,8 +688,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" diff --git a/H.NotifyIcon b/H.NotifyIcon index 0b5053b01..57d386dd3 160000 --- a/H.NotifyIcon +++ b/H.NotifyIcon @@ -1 +1 @@ -Subproject commit 0b5053b01d50b9ee8f3fc7b3eb9461e299202169 +Subproject commit 57d386dd3fc88c96aa9afa84b9ff92273cd2f0d2 diff --git a/Hi3Helper.CommunityToolkit/ImageCropper/Hi3Helper.CommunityToolkit.WinUI.Controls.ImageCropper.csproj b/Hi3Helper.CommunityToolkit/ImageCropper/Hi3Helper.CommunityToolkit.WinUI.Controls.ImageCropper.csproj index 82e2ca5f7..17801e91e 100644 --- a/Hi3Helper.CommunityToolkit/ImageCropper/Hi3Helper.CommunityToolkit.WinUI.Controls.ImageCropper.csproj +++ b/Hi3Helper.CommunityToolkit/ImageCropper/Hi3Helper.CommunityToolkit.WinUI.Controls.ImageCropper.csproj @@ -32,10 +32,10 @@ - + - + diff --git a/Hi3Helper.CommunityToolkit/ImageCropper/packages.lock.json b/Hi3Helper.CommunityToolkit/ImageCropper/packages.lock.json index d15abf3fc..ab42d77e4 100644 --- a/Hi3Helper.CommunityToolkit/ImageCropper/packages.lock.json +++ b/Hi3Helper.CommunityToolkit/ImageCropper/packages.lock.json @@ -4,9 +4,9 @@ "net10.0-windows10.0.26100": { "CommunityToolkit.Common": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "yqU6s4sLjaMuJ0OS6MSpOLkdbLS8HhyD0RSMQ/+/AyAjXizLMdXnlImgVBXPEGmBsNKDjApGF7uFmSh/xhie7A==" + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "SedQf214RzGA4Jwdl/auRM6h/8838DAbP0XvCxRWfeRTEnVqtl+6vn/XGYW2aXt8J5cWTh7rPdHWLZmly2qyIg==" }, "CommunityToolkit.WinUI.Extensions": { "type": "Direct", @@ -59,19 +59,19 @@ }, "Microsoft.WindowsAppSDK": { "type": "Direct", - "requested": "[1.8.260209005, )", - "resolved": "1.8.260209005", - "contentHash": "AGHOiZcrDrpaxpHfEFKlI8MVnibfbSixI5DlbU6ozP/9dyWN5FkTFowg+dEOnaFRCnOzTSAjBQ1HuS4lAO+aMQ==", + "requested": "[1.8.260317003, )", + "resolved": "1.8.260317003", + "contentHash": "gJ78mbsatwWB67OPeZ6PFz0PSOttvSsp4E7Xb6/1Ls7ZIJtRrsLix4e0DGVWrE8AlQuBYJMc157gyOtQTx5TRw==", "dependencies": { - "Microsoft.WindowsAppSDK.AI": "[1.8.47]", + "Microsoft.WindowsAppSDK.AI": "[1.8.53]", "Microsoft.WindowsAppSDK.Base": "[1.8.251216001]", "Microsoft.WindowsAppSDK.DWrite": "[1.8.25122902]", - "Microsoft.WindowsAppSDK.Foundation": "[1.8.260203002]", + "Microsoft.WindowsAppSDK.Foundation": "[1.8.260222000]", "Microsoft.WindowsAppSDK.InteractiveExperiences": "[1.8.260125001]", - "Microsoft.WindowsAppSDK.ML": "[1.8.2124]", - "Microsoft.WindowsAppSDK.Runtime": "[1.8.260209005]", + "Microsoft.WindowsAppSDK.ML": "[1.8.2141]", + "Microsoft.WindowsAppSDK.Runtime": "[1.8.260317003]", "Microsoft.WindowsAppSDK.Widgets": "[1.8.251231004]", - "Microsoft.WindowsAppSDK.WinUI": "[1.8.260204000]" + "Microsoft.WindowsAppSDK.WinUI": "[1.8.260224000]" } }, "CommunityToolkit.WinUI.Animations": { @@ -95,11 +95,11 @@ }, "Microsoft.WindowsAppSDK.AI": { "type": "Transitive", - "resolved": "1.8.47", - "contentHash": "9il8KT8WR4T826hnm3M/USZTkPtVXFGE0IztmE1l7H9DPYsa3QHEUgGHFHQg88fsMjdr3vhyMvs23AB+1IYF1w==", + "resolved": "1.8.53", + "contentHash": "bRzx+VwQY/OXxFJYML9riOrds7sBrCNpDG6Aok8KiH+TcdE6HnWjNzxJBDe/dQRTXQO5OQa9I7LNjN8NAZ1fjg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001" + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000" } }, "Microsoft.WindowsAppSDK.Base": { @@ -121,8 +121,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" @@ -138,18 +138,18 @@ }, "Microsoft.WindowsAppSDK.ML": { "type": "Transitive", - "resolved": "1.8.2124", - "contentHash": "l7ZptLbvOWHEJgxZtCQhUzDNCakNcqSJyAa7DNXBLKxGIUMDqq9LnWyYRZZFNQwN7hRfDAR8fEAblP1UHYHGgw==", + "resolved": "1.8.2141", + "contentHash": "A707h4Fg0Z4y5lWOJMacWUNQxZ01Iceat2iS8cMggLj4pe/NmbtehBQAgvaVKbsHN8V4F+SlJL+c7fAjXJjWJQ==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "System.Numerics.Tensors": "9.0.0" } }, "Microsoft.WindowsAppSDK.Runtime": { "type": "Transitive", - "resolved": "1.8.260209005", - "contentHash": "aZjMu/glUGjzACowzzhj9drn/Ddfp1yA+f7CFXpkiSk6iZ2x32vhKfcqT64RpJ6R+Dj1hl9/79aXFhIavYNj9g==", + "resolved": "1.8.260317003", + "contentHash": "sLhPQoFHywDZLMvLTzjErOMvZJkRtzYRW0vQhumT9UqZI700sygbmnbuyCkjyvrmEnsNB9iVAiYbKf93OVBWXA==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001" } @@ -164,12 +164,12 @@ }, "Microsoft.WindowsAppSDK.WinUI": { "type": "Transitive", - "resolved": "1.8.260204000", - "contentHash": "DSpA01+iPXwky4O1uZCrdClSi2aRIYTIhmsTeC1EsJmWBFpSirwNAg4EGHejijV6u4ZVkTdyv3px0Y2P3fp72Q==", + "resolved": "1.8.260224000", + "contentHash": "w3k3qK6gvJU0RgkP6gQUgvgUbuYvLP4OeQA+0Vrx+4mJtwCB+6D9LOhzFNVVq3y0yrW5eoPT4xeDQALTbpe2Sw==", "dependencies": { "Microsoft.Web.WebView2": "1.0.3179.45", "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260203002", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" } }, @@ -196,8 +196,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" diff --git a/Hi3Helper.CommunityToolkit/SettingsControls/Hi3Helper.CommunityToolkit.WinUI.Controls.SettingsControls.csproj b/Hi3Helper.CommunityToolkit/SettingsControls/Hi3Helper.CommunityToolkit.WinUI.Controls.SettingsControls.csproj index 46493f409..936cbd0bc 100644 --- a/Hi3Helper.CommunityToolkit/SettingsControls/Hi3Helper.CommunityToolkit.WinUI.Controls.SettingsControls.csproj +++ b/Hi3Helper.CommunityToolkit/SettingsControls/Hi3Helper.CommunityToolkit.WinUI.Controls.SettingsControls.csproj @@ -32,10 +32,10 @@ - + - + diff --git a/Hi3Helper.CommunityToolkit/SettingsControls/packages.lock.json b/Hi3Helper.CommunityToolkit/SettingsControls/packages.lock.json index 467c88601..0dfa23978 100644 --- a/Hi3Helper.CommunityToolkit/SettingsControls/packages.lock.json +++ b/Hi3Helper.CommunityToolkit/SettingsControls/packages.lock.json @@ -4,9 +4,9 @@ "net10.0-windows10.0.26100": { "CommunityToolkit.Common": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "yqU6s4sLjaMuJ0OS6MSpOLkdbLS8HhyD0RSMQ/+/AyAjXizLMdXnlImgVBXPEGmBsNKDjApGF7uFmSh/xhie7A==" + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "SedQf214RzGA4Jwdl/auRM6h/8838DAbP0XvCxRWfeRTEnVqtl+6vn/XGYW2aXt8J5cWTh7rPdHWLZmly2qyIg==" }, "CommunityToolkit.WinUI.Triggers": { "type": "Direct", @@ -38,19 +38,19 @@ }, "Microsoft.WindowsAppSDK": { "type": "Direct", - "requested": "[1.8.260209005, )", - "resolved": "1.8.260209005", - "contentHash": "AGHOiZcrDrpaxpHfEFKlI8MVnibfbSixI5DlbU6ozP/9dyWN5FkTFowg+dEOnaFRCnOzTSAjBQ1HuS4lAO+aMQ==", + "requested": "[1.8.260317003, )", + "resolved": "1.8.260317003", + "contentHash": "gJ78mbsatwWB67OPeZ6PFz0PSOttvSsp4E7Xb6/1Ls7ZIJtRrsLix4e0DGVWrE8AlQuBYJMc157gyOtQTx5TRw==", "dependencies": { - "Microsoft.WindowsAppSDK.AI": "[1.8.47]", + "Microsoft.WindowsAppSDK.AI": "[1.8.53]", "Microsoft.WindowsAppSDK.Base": "[1.8.251216001]", "Microsoft.WindowsAppSDK.DWrite": "[1.8.25122902]", - "Microsoft.WindowsAppSDK.Foundation": "[1.8.260203002]", + "Microsoft.WindowsAppSDK.Foundation": "[1.8.260222000]", "Microsoft.WindowsAppSDK.InteractiveExperiences": "[1.8.260125001]", - "Microsoft.WindowsAppSDK.ML": "[1.8.2124]", - "Microsoft.WindowsAppSDK.Runtime": "[1.8.260209005]", + "Microsoft.WindowsAppSDK.ML": "[1.8.2141]", + "Microsoft.WindowsAppSDK.Runtime": "[1.8.260317003]", "Microsoft.WindowsAppSDK.Widgets": "[1.8.251231004]", - "Microsoft.WindowsAppSDK.WinUI": "[1.8.260204000]" + "Microsoft.WindowsAppSDK.WinUI": "[1.8.260224000]" } }, "CommunityToolkit.WinUI.Extensions": { @@ -83,11 +83,11 @@ }, "Microsoft.WindowsAppSDK.AI": { "type": "Transitive", - "resolved": "1.8.47", - "contentHash": "9il8KT8WR4T826hnm3M/USZTkPtVXFGE0IztmE1l7H9DPYsa3QHEUgGHFHQg88fsMjdr3vhyMvs23AB+1IYF1w==", + "resolved": "1.8.53", + "contentHash": "bRzx+VwQY/OXxFJYML9riOrds7sBrCNpDG6Aok8KiH+TcdE6HnWjNzxJBDe/dQRTXQO5OQa9I7LNjN8NAZ1fjg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001" + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000" } }, "Microsoft.WindowsAppSDK.Base": { @@ -109,8 +109,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" @@ -126,18 +126,18 @@ }, "Microsoft.WindowsAppSDK.ML": { "type": "Transitive", - "resolved": "1.8.2124", - "contentHash": "l7ZptLbvOWHEJgxZtCQhUzDNCakNcqSJyAa7DNXBLKxGIUMDqq9LnWyYRZZFNQwN7hRfDAR8fEAblP1UHYHGgw==", + "resolved": "1.8.2141", + "contentHash": "A707h4Fg0Z4y5lWOJMacWUNQxZ01Iceat2iS8cMggLj4pe/NmbtehBQAgvaVKbsHN8V4F+SlJL+c7fAjXJjWJQ==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260126001", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "System.Numerics.Tensors": "9.0.0" } }, "Microsoft.WindowsAppSDK.Runtime": { "type": "Transitive", - "resolved": "1.8.260209005", - "contentHash": "aZjMu/glUGjzACowzzhj9drn/Ddfp1yA+f7CFXpkiSk6iZ2x32vhKfcqT64RpJ6R+Dj1hl9/79aXFhIavYNj9g==", + "resolved": "1.8.260317003", + "contentHash": "sLhPQoFHywDZLMvLTzjErOMvZJkRtzYRW0vQhumT9UqZI700sygbmnbuyCkjyvrmEnsNB9iVAiYbKf93OVBWXA==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001" } @@ -152,12 +152,12 @@ }, "Microsoft.WindowsAppSDK.WinUI": { "type": "Transitive", - "resolved": "1.8.260204000", - "contentHash": "DSpA01+iPXwky4O1uZCrdClSi2aRIYTIhmsTeC1EsJmWBFpSirwNAg4EGHejijV6u4ZVkTdyv3px0Y2P3fp72Q==", + "resolved": "1.8.260224000", + "contentHash": "w3k3qK6gvJU0RgkP6gQUgvgUbuYvLP4OeQA+0Vrx+4mJtwCB+6D9LOhzFNVVq3y0yrW5eoPT4xeDQALTbpe2Sw==", "dependencies": { "Microsoft.Web.WebView2": "1.0.3179.45", "Microsoft.WindowsAppSDK.Base": "1.8.251216001", - "Microsoft.WindowsAppSDK.Foundation": "1.8.260203002", + "Microsoft.WindowsAppSDK.Foundation": "1.8.260222000", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" } }, @@ -175,8 +175,8 @@ }, "Microsoft.WindowsAppSDK.Foundation": { "type": "Transitive", - "resolved": "1.8.260203002", - "contentHash": "eKQ/prWq98mW7+E+ffot47iZNbDnq/NVN9R9Gi8vmoU/3Ka6zNNivxdICXh6j7g6REFPCV9530/nQYQC0L3fwg==", + "resolved": "1.8.260222000", + "contentHash": "6YkttVINPZJU1wN2Mp3W9jStVxtStfZ/i/VJfRnGd+vIpBTDyNPdG4xV3Vj6Kcn4VU72fKJFhNHg6nR5t8nqEg==", "dependencies": { "Microsoft.WindowsAppSDK.Base": "1.8.251216001", "Microsoft.WindowsAppSDK.InteractiveExperiences": "1.8.260125001" diff --git a/Hi3Helper.Core/Hi3Helper.Core.csproj b/Hi3Helper.Core/Hi3Helper.Core.csproj index 78a22f729..c9e6c588a 100644 --- a/Hi3Helper.Core/Hi3Helper.Core.csproj +++ b/Hi3Helper.Core/Hi3Helper.Core.csproj @@ -43,7 +43,7 @@ - + diff --git a/Hi3Helper.Core/Lang/de_DE.json b/Hi3Helper.Core/Lang/de_DE.json index a796c7ec0..a3bedbafd 100644 --- a/Hi3Helper.Core/Lang/de_DE.json +++ b/Hi3Helper.Core/Lang/de_DE.json @@ -1,7 +1,7 @@ { "LanguageName": "Deutsch", "LanguageID": "de-DE", - "Author": "DasIschBims, kujou-kju", + "Author": "puyomi2k, Bims_sh", "_StartupPage": { "SelectLang": "Wähle deine Sprache", @@ -9,52 +9,52 @@ "SelectWindowSize": "Wähle deine bevorzugte Fenstergröße", "SelectCDN": "Wähle dein bevorzugtes CDN", "CDNHelpTitle_1": "Was ist ein CDN?", - "CDNHelpTitle_2": "kurz für ", + "CDNHelpTitle_2": "kurz für", "CDNHelpTitle_3": "Content Delivery Network", "CDNHelpTitle_4": "\u200b", "CDNHelpDetail_1": "\u200b", "CDNHelpDetail_2": "CDN", - "CDNHelpDetail_3": " ist ein System, das dazu dient, Startdateien schnell und effizient einem größeren Publikum zur Verfügung zu stellen.", - "CDNHelpDetail_4": "Collapse wählt GitHub als Standartanbieter aus.", + "CDNHelpDetail_3": " ist ein System, mit dem Launcher-Dateien schnell und effizient einem größeren Publikum zur Verfügung gestellt werden können.", + "CDNHelpDetail_4": "Collapse wählt GitHub als Standardanbieter aus.", "CDNsAvailable": "Verfügbare CDNs:", "SplashArt_1": "Das Hintergrundbild ist Eigentum von ", "SplashArt_2": "miHoYo / HoYoverse", "ChooseFolderBtn": "Ordner auswählen", "ChooseFolderDialogCancel": "Abbrechen", "ChooseFolderDialogPrimary": "Ja, bitte!", - "ChooseFolderDialogSecondary": "Nein, Ordner auswählen", - "ChooseFolderDialogSubtitle": "Der Standard-Installationsordner ist:\r\n\r\n{0}\r\n\r\nMöchtest du diesen Ordner verwenden?", + "ChooseFolderDialogSecondary": "Anderen Ordner wählen", + "ChooseFolderDialogSubtitle": "Das Standard-Installationsverzeichnis ist festgelegt auf:\r\n\r\n{0}\r\n\r\nMöchtest du dieses verwenden?", "ChooseFolderDialogTitle": "Ordner auswählen", - "FolderInsufficientPermission": "Keine Berechtigung auf diesen Ordner! Bitte wähle einen anderen Ordner.", - "FolderNotSelected": "Kein Ordner ausgewählt! Bitte wähle einen Ordner.", - "OverlayPrepareFolderSubtitle": "Berechtigung(en) werden angewendet...", - "OverlayPrepareFolderTitle": "App Ordner wird vorbereitet", - "PageTitle": "Erster Start", - "Pg1LoadingSubitle1": "Erstellen einer Liste an unterstützten Spielen...", - "Pg1LoadingSubitle2": "Fertig! Führt den nächsten Schritt aus...", + "FolderInsufficientPermission": "Zugriff verweigert! Wähle einen anderen Ordner aus.", + "FolderNotSelected": "Kein Ordner ausgewählt! Bitte wähle einen aus!", + "OverlayPrepareFolderSubtitle": "Berechtigung(en) angewenden...", + "OverlayPrepareFolderTitle": "Programmdatenordner wird vorbereitet", + "PageTitle": "Erstmaliger Start", + "Pg1LoadingSubitle1": "Erstellen einer Liste unterstützter Spiele...", + "Pg1LoadingSubitle2": "Fertig! Weiter zum nächsten Schritt...", "Pg1LoadingTitle1": "Lädt Spieleliste...", - "Pg1NextBtn": "Weiter - Spiel auswählen", + "Pg1NextBtn": "Weiter zur Spielauswahl", "Pg2ComboBox": "Spiel auswählen", "Pg2ComboBoxRegion": "Region auswählen", "Pg2NextBtn": "Fertig - Starte den Launcher", "Pg2PrevBtn": "Zurück - Ordner auswählen", - "Pg2PrevBtnNew": "Zurück - Launcher-Konfiguration", - "Pg2Subtitle1_1": "Nur noch einen Schritt um dein Spiel vom", - "Pg2Subtitle1_2": "Collapse Launcher.", - "Pg2Subtitle1_3": "", - "Pg2Subtitle2_1": "Wir haben ein paar", - "Pg2Subtitle2_2": "miHoYo/HoYoverse", - "Pg2Subtitle2_3": "Spiele, welche unterstützt werden. Bitte unten eins aus um fortzufahren.", - "Pg2Subtitle2_4": "Collapse Launcher.", - "Pg2Subtitle2_5": "", + "Pg2PrevBtnNew": "Zurück zur Launcher-Konfiguration", + "Pg2Subtitle1_1": "Nur noch einen Schritt, um dein Spiel über", + "Pg2Subtitle1_2": "Collapse Launcher zu starten.", + "Pg2Subtitle1_3": "\u2006", + "Pg2Subtitle2_1": "Wir haben einige unterstütze", + "Pg2Subtitle2_2": "HoYoverse", + "Pg2Subtitle2_3": "Spiele. Wähle unten dein Spiel aus, um mit", + "Pg2Subtitle2_4": "Collapse Launcher loszulegen.", + "Pg2Subtitle2_5": "\u2006", "Pg2Title": "Zeit zu fliegen~", - "Subtitle1": "Hallo!", - "Subtitle2": "Sieht so aus als ob du den Launcher zum ersten Mal startest.", + "Subtitle1": "Hey!", + "Subtitle2": "Sieht so aus, als ob du diesen Launcher zum ersten Mal benutzt.", "Subtitle3": "Danke, dass du das Projekt ausprobierst! Um alles einzurichten, wähle bitte aus, wo Collapse die Launcher-Daten speichern soll.", - "Subtitle4_1": "Um zu starten drück auf den", - "Subtitle4_2": "\"Ordner auswählen\"", - "Subtitle4_3": "knopf unten um auszuwählen wo du das Spiel installieren möchtest.", - "Title1": "Willkommen bei", + "Subtitle4_1": "Um zu beginnen, klicke unten auf die Schaltfläche", + "Subtitle4_2": "„Ordner auswählen“,", + "Subtitle4_3": "und wähle den Ort aus, an dem du das Spiel installieren möchtest", + "Title1": "Willkommen im", "Title2": "Collapse Launcher" }, @@ -62,49 +62,49 @@ "PageTitle": "Verbindung verloren", "Header1": "Deine Internetverbindung", "Header2": "wurde unterbrochen!", - "Footer1": "Bitte überprüfe deine Internetverbindung und drücke", + "Footer1": "Bitte überprüfe deine Netzwerkverbindung und klicke", "Footer2": "Paimon", - "Footer3": "um es erneut zu versuchen.", - "ShowErrorBtn": "Fehler anzeigen", - "GoToAppSettingsBtn": "Go to App Settings", - "GoBackOverlayFrameBtn": "Go Back", - "RegionChangerTitle": "Change the Game Region", - "RegionChangerSubtitle": "In-case you're stuck in this page" + "Footer3": "an, um es erneut zu versuchen.", + "ShowErrorBtn": "Fehlermeldung anzeigen", + "GoToAppSettingsBtn": "Zu Laucher-Einstellungen wechseln", + "GoBackOverlayFrameBtn": "Zurück", + "RegionChangerTitle": "Ändern der Spielregion", + "RegionChangerSubtitle": "falls du hier feststecken solltest" }, "_UnhandledExceptionPage": { "UnhandledTitle1": "Unbehandelter Fehler", "UnhandledSubtitle1": "Ein unbehandelter Fehler ist mit der folgenden Fehlermeldung aufgetreten:", "UnhandledTitle2": "Verbindungsfehler", - "UnhandledSubtitle2": "Ups, sieht so aus als wenn deine Internetverbindung unterbrochen wurde~ Oder ist es etwas anderes?", + "UnhandledSubtitle2": "Hoppla, anscheinend ist deine Internetverbindung unterbrochen worden~ Oder liegt es an etwas anderem?", "UnhandledTitle3": "Spiel abgestürzt", - "UnhandledSubtitle3": "Das Spiel ist mit den folgenden Fehler abgestürzt:", + "UnhandledSubtitle3": "Das Spiel ist mit der folgenden Fehlermeldung abgestürzt:", "UnhandledTitle4": "Warnung", - "WarningSubtitle": "A minor issue has occurred with the following details:", - "UnhandledSubtitle4": "Das ist kein großes Problem, aber wir dachten, wir sollten es euch mitteilen:\r\nAufgrund von miHoYo A/B-Tests unterstützt Collapse das Lesen des folgenden Schlüssels nicht: App_Settings_h2319593470.\r\nWir entschuldigen uns für die Unannehmlichkeiten und danken euch für euer Verständnis.", - "UnhandledTitleDiskCrc": "Disk Corruption Detected!", - "UnhandledSubDiskCrc": "Disk corruption is detected while accessing a file. Please check your disk using chkdsk.", - "CopyClipboardBtn1": "Alles in die Zwischenablage kopieren", - "CopyClipboardBtn2": "In die Zwischenablage kopiert!", - "GoBackPageBtn1": "Zur letzten Seite zurückkehren", - - "CustomBackground_NotFound": "Custom background file is missing! Using default image", - "CustomBackground_RegionalTag": "Region BG", - "CustomBackground_GlobalTag": "Global BG" + "WarningSubtitle": "Ein kleiner Fehler mit folgenden Details ist aufgetreten:", + "UnhandledSubtitle4": "Das ist kein großes Problem, aber wir wollten dich trotzdem darauf hinweisen:\r\nAufgrund von A/B-Tests bei miHoYo unterstützt Collapse das Auslesen des folgenden Schlüssels nicht: App_Settings_h2319593470.\r\nWir entschuldigen uns für die Unannehmlichkeiten und danken dir für dein Verständnis.", + "UnhandledTitleDiskCrc": "Festplattenfehler erkannt!", + "UnhandledSubDiskCrc": "Beim Zugriff auf eine Datei wurde ein Festplattenfehler festgestellt. Bitte überprüfe deine Festplatte mit chkdsk.", + "CopyClipboardBtn1": "Alles in Zwischenablage kopieren", + "CopyClipboardBtn2": "In Zwischenablage kopiert!", + "GoBackPageBtn1": "Zurück zur vorherigen Seite", + + "CustomBackground_NotFound": "Benutzerdefinierte Hintergrunddatei fehlt! Es wird das Standardbild verwendet", + "CustomBackground_RegionalTag": "Regionshintergrund", + "CustomBackground_GlobalTag": "Globaler Hintergrund" }, "_MainPage": { - "PageTitle": "Haupseite", + "PageTitle": "Hauptseite", "RegionChangeConfirm": "Spielregion wird geändert, willst du fortfahren?", - "RegionChangeConfirmBtn": "Ja, ändere die Region!", + "RegionChangeConfirmBtn": "Ja, Region ändern!", "RegionChangeWarnTitle": "Achtung:", - "RegionChangeWarnExper1": "Das Spiel ist aktuell in {0}.\r\nBenutze es auf eigene Gefahr!", + "RegionChangeWarnExper1": "Das Spiel ist aktuell in {0}.\r\nBenutzung auf eigene Gefahr!", "RegionLoadingTitle": "Lade Region", "RegionLoadingAPITitle1": "Lädt", "RegionLoadingAPITitle2": "Launcher API", - "RegionLoadingSubtitleTimeOut": "Aktion (> {1} Sekunden). Versuche Region {0} erneut zu laden...", + "RegionLoadingSubtitleTimeOut": "Aktion (> {1} Sek.). Versuche Region {0} erneut zu laden...", "RegionLoadingSubtitleTooLong": "Das dauert etwas länger als erwartet... Bitte stelle sicher, dass deine Internetverbindung stabil ist!", - "NavCtrlTitleSettings": "App Einstellungen", + "NavCtrlTitleSettings": "Launcher-Einstellungen", "NotifNeverAsk": "Nicht mehr anzeigen", "NotifNoNewNotifs": "Keine neuen Benachrichtigungen", "NotifClearAll": "Alle Benachrichtigungen entfernen", @@ -113,7 +113,7 @@ "Initializing": "Initialisierung", "LoadingLauncherMetadata": "Lade Launcher-Metadaten", "LoadingGameConfiguration": "Lade Spielkonfigurationen", - "LoadingBackgroundImage": "Loading Background Image" + "LoadingBackgroundImage": "Hintergrundbild wird geladen" }, "_HomePage": { @@ -140,41 +140,41 @@ "PauseCancelDownloadBtn": "Pausieren/Abbrechen", "PauseCancelBtn": "Pausieren/Abbrechen", "DownloadBtn": "Spiel herunterladen", - "StartGameTooltip": "Start Game: v{0}", - "InstallGameTooltip": "Install Game: v{0}", - "UpdateGameTooltip": "Update Game: v{0} -> v{1}", - "InstallSdkTooltip": "Install SDK: v{0}", - "UpdateSdkUpdateTooltip": "Update SDK: v{0} -> v{1}", - "InstallPluginTooltip": "Install Plugin: {0} v{1}", - "UpdatePluginTooltip": "Update Plugin: {0} v{1} -> v{2}", + "StartGameTooltip": "Starte Spiel: v{0}", + "InstallGameTooltip": "Installiere Spiel: v{0}", + "UpdateGameTooltip": "Aktualisiere Spiel: v{0} -> v{1}", + "InstallSdkTooltip": "Installiere SDK: v{0}", + "UpdateSdkUpdateTooltip": "Aktualisiere SDK: v{0} -> v{1}", + "InstallPluginTooltip": "Installiere Plugin: {0} v{1}", + "UpdatePluginTooltip": "Aktualisiere Plugin: {0} v{1} -> v{2}", "GameStatusPlaceholderComingSoonBtn": "Demnächst verfügbar", "GameStatusPlaceholderPreRegisterBtn": "Jetzt vorregistrieren!", - "GameSettingsBtn": "Schnelleinstellungen", - "GameSettings_Panel1": "Schnelleinstellungen", - "GameSettings_Panel1OpenGameFolder": "Spiel Ordner öffnen", - "GameSettings_Panel1OpenCacheFolder": "Cache Ordner öffnen", - "GameSettings_Panel1OpenScreenshotFolder": "Screenshot Ordner öffnen", - "GameSettings_Panel2": "Spiel Installation", + "GameSettingsBtn": "Schnelle Einstellungen", + "GameSettings_Panel1": "Schnelle Einstellungen", + "GameSettings_Panel1OpenGameFolder": "Spielverzeichnis öffnen", + "GameSettings_Panel1OpenCacheFolder": "Cache-Ordner öffnen", + "GameSettings_Panel1OpenScreenshotFolder": "Screenshots öffnen", + "GameSettings_Panel2": "Spieleinstallation", "GameSettings_Panel2RepairGame": "Spiel reparieren", "GameSettings_Panel2UninstallGame": "Spiel deinstallieren", "GameSettings_Panel2ConvertVersion": "Spielversion konvertieren", - "GameSettings_Panel2ChangeGameLocation": "Change Game Location", - "GameSettings_Panel2MoveGameLocationGame": "Spieleort verschieben", - "GameSettings_Panel2MoveGameLocationGame_SamePath": "Cannot move game to the root of your drive!\r\nPlease make a folder and try again.", + "GameSettings_Panel2ChangeGameLocation": "Spielstandort ändern", + "GameSettings_Panel2MoveGameLocationGame": "Spielstandort verschieben", + "GameSettings_Panel2MoveGameLocationGame_SamePath": "Spiel kann nicht in das Stammverzeichnis des Laufwerks verschoben werden!\r\nBitte erstelle einen Ordner und versuche es erneut.", "GameSettings_Panel2StopGame": "Schließen des Spiels erzwingen", - "GameSettings_Panel3RegionalSettings": "Regional Settings", + "GameSettings_Panel3RegionalSettings": "Regionale Einstellungen", "GameSettings_Panel3": "Benutzerdefinierte Startoptionen", - "GameSettings_Panel3RegionRpc": "Show Playing Status in Discord", - "GameSettings_Panel3CustomBGRegion": "Change Region Background", - "GameSettings_Panel3CustomBGRegionSectionTitle": "Custom Background for Region", - "GameSettings_Panel4": "Andere Einstellungen", + "GameSettings_Panel3RegionRpc": "Spielstatus in Discord anzeigen", + "GameSettings_Panel3CustomBGRegion": "Hintergrund dieser Region ändern", + "GameSettings_Panel3CustomBGRegionSectionTitle": "Benutzerdefinierter Hintergrund für Region", + "GameSettings_Panel4": "Erweiterte Einstellungen", "GameSettings_Panel4ShowEventsPanel": "Aktionspanel anzeigen", - "GameSettings_Panel4ScaleUpEventsPanel": "Scale Up Events Panel on Hover", - "GameSettings_Panel4ShowSocialMediaPanel": "Social Media Panel anzeigen", - "GameSettings_Panel4ShowPlaytimeButton": "Show Game Playtime", - "GameSettings_Panel4SyncPlaytimeDatabase": "Sync Playtime with Database", + "GameSettings_Panel4ScaleUpEventsPanel": "Aktionspanel bei Mauszeiger-Überfahrt vergrößern", + "GameSettings_Panel4ShowSocialMediaPanel": "Social-Media-Panel anzeigen", + "GameSettings_Panel4ShowPlaytimeButton": "Zeige Spielzeit", + "GameSettings_Panel4SyncPlaytimeDatabase": "Spielzeit mit Datenbank synchronisieren", "GameSettings_Panel4CreateShortcutBtn": "Verknüpfung erstellen", "GameSettings_Panel4AddToSteamBtn": "Zu Steam hinzufügen", @@ -183,25 +183,25 @@ "GamePlaytime_Idle_Panel1Minutes": "Minuten", "GamePlaytime_Idle_ResetBtn": "Zurücksetzten", "GamePlaytime_Idle_ChangeBtn": "Ändern", - "GamePlaytime_Idle_SyncDb": "Sync", - "GamePlaytime_Idle_SyncDbSyncing": "Syncing...", + "GamePlaytime_Idle_SyncDb": "Synchronisieren", + "GamePlaytime_Idle_SyncDbSyncing": "Synchronisiere...", "GamePlaytime_Running_Info1": "Eine Instanz des Spiels wird derzeit ausgeführt, daher kann die Spielzeit nicht bearbeitet werden.", "GamePlaytime_Running_Info2": "Bitte beachte, dass das vollständige Schließen von Collapse die Aufzeichnung der Spielzeit beendet (und die bis dahin gespielte Zeit speichert) und nur die mit Collapse begonnenen Sitzungen aufgezeichnet werden.", "GamePlaytime_Display": "{0} Std. {1} Min.", "GamePlaytime_DateDisplay": "{0:00}.{1:00}.{2:0000} {3:00}:{4:00}", - "GamePlaytime_Stats_Title": "Playtime Statistics", - "GamePlaytime_Stats_NeverPlayed": "Never Played", - "GamePlaytime_Stats_LastSession": "Most Recent Session", - "GamePlaytime_Stats_LastSession_StartTime": "Start Time", - "GamePlaytime_Stats_LastSession_Duration": "Duration", - "GamePlaytime_Stats_Daily": "Today", - "GamePlaytime_Stats_Weekly": "Week", - "GamePlaytime_Stats_Monthly": "Month", + "GamePlaytime_Stats_Title": "Spielzeitstatistik", + "GamePlaytime_Stats_NeverPlayed": "Noch nie gespielt", + "GamePlaytime_Stats_LastSession": "Letzte Sitzung", + "GamePlaytime_Stats_LastSession_StartTime": "Startzeit", + "GamePlaytime_Stats_LastSession_Duration": "Dauer", + "GamePlaytime_Stats_Daily": "Heute", + "GamePlaytime_Stats_Weekly": "Diese Woche", + "GamePlaytime_Stats_Monthly": "Diesen Monat", "PostPanel_Events": "Aktionen", "PostPanel_Notices": "Ankündigungen", "PostPanel_Info": "Informationen", - "PostPanel_NoNews": "Was?\nKeine Neuigkeiten für heute?", + "PostPanel_NoNews": "Wie jetzt?\nKeine Neuigkeiten für heute?", "CommunityToolsBtn": "Community-Werkzeuge", "CommunityToolsBtn_OfficialText": "Offizielle Werkzeuge", @@ -210,53 +210,53 @@ "CreateShortcut_FolderPicker": "Wähle aus, wo die Verknüpfung platziert werden soll", - "Exception_DownloadTimeout1": "Timeout occurred when trying to install {0}", - "Exception_DownloadTimeout2": "Check stability of your internet! If your internet speed is slow, please lower the download thread count.", - "Exception_DownloadTimeout3": "**WARNING** Changing download thread count WILL reset your download from 0, and you have to delete the existing download chunks manually!", - - "GameStateInvalid_Title": "Game Data Directory/Executable Name/Config.ini/App.Info file is Invalid!", - "GameStateInvalid_Subtitle1": "Collapse Launcher has detected that the game file properties are invalid for region:\r\n", - "GameStateInvalid_Subtitle2": "It's recommended to perform a fix in order the launcher to detect the game properly", - "GameStateInvalid_Subtitle3": "Click \"", - "GameStateInvalid_Subtitle4": "\" to fix the game properties or click \"", - "GameStateInvalid_Subtitle5": "\" to cancel the operation.", - - "GameStateInvalidFixed_Title": "Game File Properties have been Succesfully Fixed!", - "GameStateInvalidFixed_Subtitle1": "Game file properties have been fixed for region:", - "GameStateInvalidFixed_Subtitle2": "Please perform a \"", - "GameStateInvalidFixed_Subtitle3": "\" in the \"", - "GameStateInvalidFixed_Subtitle4": "\" menu in order to make sure all the files are verified.", - - "InstallFolderRootTitle": "Drive Root Provided!", - "InstallFolderRootSubtitle": "Cannot install game to the root of your drive! Please make a new folder and try again.", - - "BgContextMenu_SaveCurrentBgText": "Save Current Image Files", - "BgContextMenu_SaveCurrentBgTooltip": "Save the files of both current overlay (if available) and background image/video layer.", - "BgContextMenu_SaveAllBgText": "Save All Images Files", - "BgContextMenu_SaveAllBgTooltip": "Save all available background files of both overlay (if available) and background image/video layer.", - "BgContextMenu_CopyFrameToClipboardParentText": "Copy Current Frame to Clipboard", - "BgContextMenu_CopyFrameToClipboardOverlayText": "Copy Overlay Frame Only", - "BgContextMenu_CopyFrameToClipboardOverlayTooltip": "Copy only the overlay layer bitmap frame into clipboard.", - "BgContextMenu_CopyFrameToClipboardBackgroundText": "Copy Background Frame Only", - "BgContextMenu_CopyFrameToClipboardBackgroundTooltip": "Copy only the background layer bitmap frame into clipboard.", - "BgContextMenu_CopyFrameToClipboardMergedText": "Copy Merged", - "BgContextMenu_CopyFrameToClipboardMergedTooltip": "Merge and copy both overlay and background layer bitmap frame into clipboard.", - "BgContextMenu_CopyUrlToClipboardParentText": "Copy URL/Path to Clipboard", - "BgContextMenu_CopyUrlToClipboardOverlayText": "Copy Overlay URL/Path", - "BgContextMenu_CopyUrlToClipboardOverlayTooltip": "Copy only the URL/Path of the overlay layer.", - "BgContextMenu_CopyUrlToClipboardBackgroundText": "Copy Background URL/Path", - "BgContextMenu_CopyUrlToClipboardBackgroundTooltip": "Copy only the URL/Path of the background layer.", - "BgContextMenu_EnableAudioText": "Enable Audio on Video", - "BgContextMenu_EnableAudioTooltip": "Enables audio while playing video background.", - "BgContextMenu_KeepPlayVideoOnUnfocusText": "Keep Play Video When Unfocused", - "BgContextMenu_KeepPlayVideoOnUnfocusTooltip": "Keep play video background with muted audio even if the window is unfocused. When disabled, the video background will be completely paused.", - "BgContextMenu_EnableParallaxText": "Enable Parallax Effect", - "BgContextMenu_EnableParallaxTooltip": "Enables parallax effect on background while hovering around launcher area.", - "BgContextMenu_ParallaxPixelShiftParentText": "Parallax Pixels Shift", - "BgContextMenu_ParallaxPixelShiftCustomText": "Custom", - "BgContextMenu_ParallaxPixelShiftCustomTooltip": "Sets the custom amount of pixels to be shifted.", - "BgContextMenu_FolderSelectSaveCurrentBg": "Save current background to a folder", - "BgContextMenu_FolderSelectSaveAllBg": "Save all available backgrounds to a folder" + "Exception_DownloadTimeout1": "Zeitüberschreitung aufgetreten beim Versuch {0} zu installieren", + "Exception_DownloadTimeout2": "Überprüfe die Stabilität der Internetverbindung! Wenn die Internetgeschwindigkeit langsam ist, verringere bitte die Anzahl der Download-Threads.", + "Exception_DownloadTimeout3": "**WARNUNG** Das Ändern der Anzahl der Download-Threads setzt den Download auf 0 zurück, und du musst die vorhandenen Download-Blöcke manuell löschen!", + + "GameStateInvalid_Title": "Spielverzeichnis/ausführbaren Datei/Config.ini/App.Info-Datei ist unzulässig!", + "GameStateInvalid_Subtitle1": "Collapse Launcher hat festgestellt, dass die Spielekonfiguration für die Region ungültig ist:\r\n", + "GameStateInvalid_Subtitle2": "Es wird empfohlen, eine Korrektur vorzunehmen, damit der Launcher das Spiel korrekt erkennt", + "GameStateInvalid_Subtitle3": "Drücke \"", + "GameStateInvalid_Subtitle4": "\" um die Spielkonfiguration zu reparieren oder \"", + "GameStateInvalid_Subtitle5": "\" um den Vorgang abzubrechen.", + + "GameStateInvalidFixed_Title": "Spielkonfiguration wurde erfolgreich korrigiert!", + "GameStateInvalidFixed_Subtitle1": "Die Spielkonfiguration wurden für die Region korrigiert:", + "GameStateInvalidFixed_Subtitle2": "Bitte führe eine \"", + "GameStateInvalidFixed_Subtitle3": "\" im \"", + "GameStateInvalidFixed_Subtitle4": "\" Menu aus um sicherzustellen, dass alle Dateien überprüft werden.", + + "InstallFolderRootTitle": "Laufwerk-Stammverzeichnis entdeckt!", + "InstallFolderRootSubtitle": "Das Spiel kann nicht im Stammverzeichnis des Laufwerks installiert werden! Bitte erstelle einen neuen Ordner und versuche es erneut.", + + "BgContextMenu_SaveCurrentBgText": "Aktuelle Bilddateien speichern", + "BgContextMenu_SaveCurrentBgTooltip": "Speichert die Dateien sowohl des aktuellen Overlays (falls vorhanden) als auch der Hintergrundbild- bzw. -videoeebene.", + "BgContextMenu_SaveAllBgText": "Alle Bilddateien speichern", + "BgContextMenu_SaveAllBgTooltip": "Speichert alle verfügbaren Hintergrunddateien sowohl des Overlays (falls vorhanden) als auch der Hintergrundbild-/Videoeebene.", + "BgContextMenu_CopyFrameToClipboardParentText": "Aktuellen Frame in die Zwischenablage kopieren", + "BgContextMenu_CopyFrameToClipboardOverlayText": "Nur Overlay-Frame kopieren", + "BgContextMenu_CopyFrameToClipboardOverlayTooltip": "Nur den Bitmap-Rahmen der Überlagerungsebene in die Zwischenablage kopieren.", + "BgContextMenu_CopyFrameToClipboardBackgroundText": "Nur den Hintergrundrahmen kopieren", + "BgContextMenu_CopyFrameToClipboardBackgroundTooltip": "Nur den Bitmap-Rahmen der Hintergrundebene in die Zwischenablage kopieren.", + "BgContextMenu_CopyFrameToClipboardMergedText": "Kopie zusammengefügt", + "BgContextMenu_CopyFrameToClipboardMergedTooltip": "Sowohl den Bitmap-Rahmen der Überlagerungsebene als auch den der Hintergrundebene zusammenführen und in die Zwischenablage kopieren.", + "BgContextMenu_CopyUrlToClipboardParentText": "URL/Pfad in die Zwischenablage kopieren", + "BgContextMenu_CopyUrlToClipboardOverlayText": "URL/Pfad des Overlays kopieren", + "BgContextMenu_CopyUrlToClipboardOverlayTooltip": "Kopiere nur die URL/den Pfad der Overlay-Ebene.", + "BgContextMenu_CopyUrlToClipboardBackgroundText": "URL/Pfad des Hintergrunds kopieren", + "BgContextMenu_CopyUrlToClipboardBackgroundTooltip": "Kopiere nur die URL/den Pfad der Hintergrundebene.", + "BgContextMenu_EnableAudioText": "Ton im Video aktivieren", + "BgContextMenu_EnableAudioTooltip": "Aktiviert den Ton bei der Wiedergabe eines Videos im Hintergrund.", + "BgContextMenu_KeepPlayVideoOnUnfocusText": "Wiedergabe bei Fokusverlust fortsetzen", + "BgContextMenu_KeepPlayVideoOnUnfocusTooltip": "Den Videohintergrund auch dann mit stummgeschaltetem Ton weiter abspielen, wenn das Fenster nicht im Vordergrund ist. Bei deaktivierter Option wird der Videohintergrund vollständig angehalten.", + "BgContextMenu_EnableParallaxText": "Parallax-Effekt aktivieren", + "BgContextMenu_EnableParallaxTooltip": "Aktiviert den Parallax-Effekt im Hintergrund, wenn der Mauszeiger über den Launcher-Bereich bewegt wird.", + "BgContextMenu_ParallaxPixelShiftParentText": "Parallax-Pixelverschiebung", + "BgContextMenu_ParallaxPixelShiftCustomText": "Benutzerdefiniert", + "BgContextMenu_ParallaxPixelShiftCustomTooltip": "Legt die benutzerdefinierte Anzahl der zu verschiebenden Pixel fest.", + "BgContextMenu_FolderSelectSaveCurrentBg": "Aktuellen Hintergrund in einem Ordner speichern", + "BgContextMenu_FolderSelectSaveAllBg": "Alle verfügbaren Hintergründe in einem Ordner speichern" }, "_GameRepairPage": { @@ -267,7 +267,7 @@ "ListCol4": "Größe", "ListCol5": "L.CRC", "ListCol6": "R.CRC", - "Status1": "Klicke auf \"Schnellüberprüfung\" oder \"Vollständige Überprüfung\" um die Spieldateien zu überprüfen.", + "Status1": "Klicke auf \"Schnelle Überprüfung\" oder \"Vollständige Überprüfung\" um die Spieldateien zu überprüfen.", "Status2": "Lade Index...", "Status3": "{0} Datei(en) könnte(n) kaputt oder beschädigt sein (Insgesamt {1}). Drücke auf 'Spiel reparieren' um den Repeturprozess zu starten.", "Status4": "Keine kaputten Dateien gefunden!", @@ -283,18 +283,18 @@ "Status14": "Versuche, die Verfügbarkeit von CG-Assets zu ermitteln: {0}", "Status15": "Versuche, die Verfügbarkeit von Audio-Assets zu ermitteln: {0}", "StatusNone": "Nichts", - "PerProgressTitle1": "Fortschritt pro Datei", + "PerProgressTitle1": "Datei-Fortschritt", "PerProgressSubtitle1": "Warte...", "PerProgressSubtitle2": "Fortschritt: {0}/{1}", "PerProgressSubtitle3": "Abrufen: {0}/s", "PerProgressSubtitle4": "Lade Patch: {0}/{1}", "PerProgressSubtitle5": "Patche: {0}/s", - "TotalProgressTitle1": "Fortschritt", + "TotalProgressTitle1": "Gesamtfortschritt", "RepairBtn1": "Dateien reparieren", "RepairBtn2": "Dateien überprüfen", "RepairBtn2Full": "Vollständige Überprüfung", "RepairBtn2FullDesc": "Diese Methode überprüft die Prüfsumme/Integrität, Größe und Verfügbarkeit der Datei", - "RepairBtn2Quick": "Schnellüberprüfung", + "RepairBtn2Quick": "Schnelle Überprüfung", "RepairBtn2QuickDesc": "Diese Methode überprüft nur die Größe und Verfügbarkeit der Datei. Bitte benutze die \"Vollständige Überprüfung\", wenn du die Integrität der Datei überprüfen möchtest", "OverlayNotInstalledTitle": "Du kannst diese Funktion nicht nutzen, da die ausgewählte Region nicht installiert oder veraltet ist!", "OverlayNotInstalledSubtitle": "Bitte lade das Spiel zuerst auf der Seite \"Spiel\" herunter.", @@ -303,7 +303,7 @@ }, "_CachesPage": { - "PageTitle": "Cache Update", + "PageTitle": "Cache-Aktualisierung", "ListCol1": "Name", "ListCol2": "Typ", "ListCol3": "Quelle", @@ -311,21 +311,21 @@ "ListCol5": "L.CRC", "ListCol6": "R.CRC", "ListCol7": "Status", - "Status1": "Klicke auf \"Schnellüberprüfung\" oder \"Vollständige Überprüfung\" um den Cache auf Updates zu überprüfen", + "Status1": "Klicke auf \"Schnelle Überprüfung\" oder \"Vollständige Überprüfung\" um den Cache auf Updates zu überprüfen", "Status2": "Versuche, die Verfügbarkeit von \"{0}\" Cache-Assets zu ermitteln: {1}", "CachesStatusHeader1": "Insgesamter Fortschritt", "CachesStatusCancelled": "Der Vorgang wurde abgebrochen!", "CachesStatusFetchingType": "Caches werden abgerufen: {0}", - "CachesStatusNeedUpdate": "{0} Cache Datei(en) ({1} insgesamt) können aktualisiert werden. Klicke auf \"Caches Aktualisieren\" um sie zu aktualisieren.", + "CachesStatusNeedUpdate": "{0} Cache-Datei(en) ({1} insgesamt) können aktualisiert werden. Klicke auf \"Caches Aktualisieren\" um sie zu aktualisieren.", "CachesStatusUpToDate": "Caches sind aktuell!", "CachesStatusChecking": "Prüfe {0}: {1}", "CachesTotalStatusNone": "Keine", "CachesTotalStatusChecking": "Bearbeiten: {0}/{1}", "CachesBtn1": "Caches Aktualisieren", - "CachesBtn2": "Schnellüberprüfung", + "CachesBtn2": "Schnelle Überprüfung", "CachesBtn2Full": "Vollständige Überprüfung", - "CachesBtn2FullDesc": "Mit dieser Methode wird nur die Größe und Verfügbarkeit der Caches überprüft. Benutze bitte \"Vollüberprüfung\" wenn du die Integrität der Caches überprüfen willst.", - "CachesBtn2Quick": "Schnellüberprüfung", + "CachesBtn2FullDesc": "Mit dieser Methode wird nur die Größe und Verfügbarkeit der Caches überprüft. Benutze bitte die \"Vollständige Überprüfung\" wenn du die Integrität des Caches überprüfen willst.", + "CachesBtn2Quick": "Schnelle Überprüfung", "CachesBtn2QuickDesc": "Mit dieser Methode wird nur die Größe und Verfügbarkeit der Caches überprüft. Benutze bitte \"Vollständige Überprüfung\", wenn du die Integrität der Caches überprüfen willst", "OverlayNotInstalledTitle": "Du kannst diese Funktion nicht nutzen, da die ausgewählte Region nicht installiert oder veraltet ist!", "OverlayNotInstalledSubtitle": "Bitte lade das Spiel zuerst herunter oder aktualisiere es auf der Launcher Seite!", @@ -351,13 +351,13 @@ "Graphics_ResCustom": "Benutzerdefinierte Auflösung verwenden", "Graphics_ResCustomW": "B", "Graphics_ResCustomH": "H", - "Graphics_ResPrefixFullscreen": "{0}x{1} Fullscreen", - "Graphics_ResPrefixWindowed": "{0}x{1} Windowed", + "Graphics_ResPrefixFullscreen": "{0}x{1} Vollbild", + "Graphics_ResPrefixWindowed": "{0}x{1} Fenster", "Graphics_VSync": "VSync", "Graphics_FPS": "FPS", - "Graphics_FPSUnlimited": "Unlimited", + "Graphics_FPSUnlimited": "Unbegrenzt", "Graphics_FPSPanel": "Maximale FPS", "Graphics_FPSInCombat": "Im Kampf", "Graphics_FPSInMenu": "Hauptmenü", @@ -397,14 +397,14 @@ "Graphics_Legacy_Subtitle": "Diese Optionen sind im Spiel nicht vorhanden und haben möglicherweise keine Auswirkungen.", "SpecDisabled": "Deaktiviert", - "SpecCustom": "Custom", + "SpecCustom": "Benutzerdefiniert", "SpecLow": "Niedrig", "SpecMedium": "Mittel", "SpecHigh": "Hoch", "SpecVeryHigh": "Sehr Hoch", "SpecMaximum": "Maximal", "SpecUltra": "Ultra", - "SpecDynamic": "Dynamic", + "SpecDynamic": "Dynamisch", "SpecGlobal": "Global", "Audio_Title": "Audio-Einstellungen", @@ -448,7 +448,7 @@ "CustomArgs_Footer2": "Unity Standalone Player Befehlszeilen-Dokumentation", "CustomArgs_Footer3": "um weitere Parameter zu erhalten.", - "GameBoost": "Boost Game Priority", + "GameBoost": "Spielpriorität erhöhen", "MobileLayout": "Mobiles Layout verwenden", "Advanced_Title": "Erweiterte Einstellungen", @@ -456,42 +456,42 @@ "Advanced_Subtitle2": "IST NICHT VERANTWORTLICH", "Advanced_Subtitle3": "für irgendetwas, das mit deinem Spiel, deinem Account oder deinem System passiert, während diese Einstellungen verwendet werden! Die Verwendung erfolgt auf eigene Gefahr.", "Advanced_GLC_WarningAdmin": "WARNUNG: Die angegebenen Befehle werden als Administrator ausgeführt!", - "Advanced_GLC_PreLaunch_Title": "Pre-Launch-Befehle", + "Advanced_GLC_PreLaunch_Title": "Befehle vor dem Start", "Advanced_GLC_PreLaunch_Subtitle": "Befehle, die vor dem Start des Spiels ausgeführt werden", "Advanced_GLC_PreLaunch_Exit": "Beenden des gestarteten Prozesses erzwingen, wenn das Spiel geschlossen/gestoppt wird", - "Advanced_GLC_PreLaunch_Delay": "Delay Game Launch (ms)", - "Advanced_GLC_PostExit_Title": "Post-Exit Commands", - "Advanced_GLC_PostExit_Subtitle": "Commands to be executed after the game is closed", + "Advanced_GLC_PreLaunch_Delay": "Spielstart verzögern (ms)", + "Advanced_GLC_PostExit_Title": "Befehl nach dem Beenden", + "Advanced_GLC_PostExit_Subtitle": "Befehle, die nach Schließung des Spiels ausgeführt werden", - "Advanced_RunWithExplorerAsParent_Title": "Launch Game with Explorer as Parent", - "Advanced_RunWithExplorerAsParent_Subtitle": "Disable for compatibility with Steam Input and Overlay", - "Advanced_RunWithExplorerAsParent_Warning": "WARNING: Game logins might be blocked when disabled!" + "Advanced_RunWithExplorerAsParent_Title": "Spiel mit Explorer als übergeordnetem Element starten", + "Advanced_RunWithExplorerAsParent_Subtitle": "Deaktivieren, um die Kompatibilität mit Steam Input und Overlay zu gewährleisten", + "Advanced_RunWithExplorerAsParent_Warning": "WARNUNG: Spielanmeldungen können bei Deaktivierung blockiert werden!" }, "_SettingsPage": { - "PageTitle": "App Einstellungen", + "PageTitle": "Launcher-Einstellungen", "Debug": "Weitere Einstellungen", "Debug_Console": "Konsole anzeigen", - "Debug_IncludeGameLogs": "Speichern von Spielprotokollen in Collapse's (könnte sensible Daten enthalten)", - "Debug_SendRemoteCrashData": "Send anonymous crash reports to developers", - "Debug_SendRemoteCrashData_EnvVarDisablement": "This setting is disabled due to 'DISABLE_SENTRY' environment variable being set to true.", + "Debug_IncludeGameLogs": "Speichern von Spielprotokollen in Collapse (könnte sensible Daten enthalten)", + "Debug_SendRemoteCrashData": "Anonyme Absturzberichte an die Entwickler senden", + "Debug_SendRemoteCrashData_EnvVarDisablement": "Diese Einstellung ist deaktiviert, da die Umgebungsvariable „DISABLE_SENTRY“ auf „true“ gesetzt ist.", "Debug_MultipleInstance": "Ausführen von mehr als einer Instanz von Collapse erlauben", - "Debug_CustomDialogBtn": "[DBG] Spawn Custom Dialog", + "Debug_CustomDialogBtn": "[DBG] Benutzerdefinierten Dialog erzeugen", - "ChangeRegionWarning_Toggle": "Region Änderungswarnung angzeigen", + "ChangeRegionWarning_Toggle": "Warnung bei Regionwechsel anzeigen", "ChangeRegionInstant_Toggle": "Sofortiger Wechsel der Region bei Auswahl", - "ChangeRegionWarning_Warning": "*Du musst die Anwendung neu starten, damit diese Einstellung wirksam wird.", + "ChangeRegionWarning_Warning": "*Damit diese Einstellung wirksam wird, musst du die Anwendung neu starten.", - "Language": "App-Sprache", + "Language": "Sprache des Launchers", "LanguageEntry": "{0} von {1}", - "AppLang_ApplyNeedRestart": "*Du musst die Anwendung neu starten, damit diese Einstellung wirksam wird.", + "AppLang_ApplyNeedRestart": "*Damit die Sprachänderung wirksam wird, musst du die Anwendung neu starten.", - "AppThemes": "Themes", + "AppThemes": "Farbmodus", "AppThemes_Default": "Standard (Systemeinstellungen verwenden)", "AppThemes_Light": "Hell", "AppThemes_Dark": "Dunkel", - "AppThemes_ApplyNeedRestart": "*Du musst die Anwendung neu starten, damit diese Einstellung wirksam wird.", + "AppThemes_ApplyNeedRestart": "*Damit diese Einstellung wirksam wird, musst du die Anwendung neu starten.", "IntroSequenceToggle": "Startanimationssequenz verwenden", @@ -499,12 +499,12 @@ "AppWindowSize_Normal": "Normal", "AppWindowSize_Small": "Klein", - "AppCDNRepository": "Repository CDN", + "AppCDNRepository": "Repository-CDN", - "AppBG": "App Hintergrund", + "AppBG": "Launcher-Hintergrund", "AppBG_Checkbox": "Benutzerdefinierten Hintergrund verwenden", "AppBG_Note": "Akzeptierte Formate:\r\nBild: {0}\r\nVideo: {1}", - "AppBG_Note_Regional": "Regional specific custom background settings is in \"Quick Settings\" button in the home page.", + "AppBG_Note_Regional": "Die regionsspezifischen benutzerdefinierten Hintergrundeinstellungen findest du auf der Startseite unter der Schaltfläche „Schnelleinstellungen“.", "AppThreads": "Anwendungs-Threads", "AppThreads_Download": "Download-Threads", @@ -516,51 +516,51 @@ "AppThreads_Help5": "Dieser Thread wird den Extraktions-/Verifizierungsprozess während der Installation/Reparatur des Spiels durchführen.", "AppThreads_Help6": "Hinweis: Diese Einstellung ist bei der Installation von Honkai Impact 3rd nicht mehr wirksam.", - "SophonSettingsTitle": "Sophon Mode Settings", - "SophonHelp_Title": "What is Sophon Downloader Mode?", - "SophonHelp_1": "\"Sophon\" is a new download mechanism introduced by HoYoVerse recently and allows files to be downloaded into \"chunks\" rather than downloading a big ZIP archive. The benefits are mainly a lower drive space requirement and increased efficiency for downloads and updates.", - "SophonHelp_2": "This method might be slower for those who uses Hard Drives for their game.", - "SophonHelp_IndicatorTitle": "Indicator Icons", - "SophonHelp_Indicator1": "File Size to Write on Disk", - "SophonHelp_Indicator2": "File Size to Download", - "SophonHelp_Indicator3": "Disk I/O Speed on Write", - "SophonHelp_Indicator4": "Network I/O Speed on Write", - "SophonHelp_Thread": "This controls number of simultaneous chunks download Collapse is doing. Lower this value if you get sudden stuck when downloading.", - "SophonHttpNumberBox": "Maximum HTTP Connections", - "SophonHelp_Http": "This controls maximum number of network connection being established by Collapse to download the chunks.", - "SophonToggle": "Enable Sophon on Supported Regions", - "SophonPredownPerfMode_Toggle": "[EXPERIMENTAL] Use all CPU cores when applying pre-download", - "SophonPredownPerfMode_Tooltip": "Enabling this will set CPU threads to maximum available for your system. Disable if you get any problems.", - - "AppThreads_Attention": "Attention", - "AppThreads_Attention1": "Before you change the", - "AppThreads_Attention2": "value, please consider to", - "AppThreads_Attention3": "NOT MODIFYING", - "AppThreads_Attention4": "the value if you have an existing download as it might", - "AppThreads_Attention5": "RE-DOWNLOAD THE ENTIRE THING", - "AppThreads_Attention6": "due to the session count needed for the download do not match.", - "AppThreads_AttentionTop1": "The issues below will no longer occur if you have", - "AppThreads_AttentionTop2": "setting enabled.", + "SophonSettingsTitle": "Einstellungen für den Sophon-Modus", + "SophonHelp_Title": "Was ist der Sophon-Downloader-Modus?", + "SophonHelp_1": "„Sophon“ ist ein neuer Download-Mechanismus, den HoYoVerse kürzlich eingeführt hat und der es ermöglicht, Dateien in „Chunks“ herunterzuladen, anstatt ein großes ZIP-Archiv zu laden. Die Vorteile bestehen vor allem in einem geringeren Speicherplatzbedarf sowie einer höheren Effizienz bei Downloads und Updates.", + "SophonHelp_2": "Diese Methode könnte für diejenigen langsamer sein, die Festplatten für ihre Spiele verwenden.", + "SophonHelp_IndicatorTitle": "Anzeigesymbole", + "SophonHelp_Indicator1": "Dateigröße zum Speichern auf der Festplatte", + "SophonHelp_Indicator2": "Dateigröße zum Herunterladen", + "SophonHelp_Indicator3": "Datenträger-E/A-Geschwindigkeit beim Schreiben", + "SophonHelp_Indicator4": "Netzwerk-E/A-Geschwindigkeit beim Schreiben", + "SophonHelp_Thread": "Dies steuert die Anzahl der gleichzeitig heruntergeladenen Datenblöcke durch Collapse. Verringere diesen Wert, wenn der Download plötzlich ins Stocken gerät.", + "SophonHttpNumberBox": "Max. Anzahl HTTP-Verbindungen", + "SophonHelp_Http": "Dies steuert die maximale Anzahl der Netzwerkverbindungen, die von Collapse zum Herunterladen der Chunks hergestellt werden.", + "SophonToggle": "Sophon in unterstützten Regionen aktivieren", + "SophonPredownPerfMode_Toggle": "[EXPERIMENTELL] Alle CPU-Kerne beim Anwenden des vorab heruntergeladenen Inhalts nutzen", + "SophonPredownPerfMode_Tooltip": "Wenn diese Option aktiviert ist, wird die Anzahl der CPU-Threads auf die für Ihr System maximal verfügbare Anzahl gesetzt. Deaktivieren Sie diese Option, falls Probleme auftreten.", + + "AppThreads_Attention": "Achtung", + "AppThreads_Attention1": "Bevor du den Wert für", + "AppThreads_Attention2": "änderst, solltest du in Betracht ziehen, den Wert", + "AppThreads_Attention3": "NICHT ZU ÄNDERN,", + "AppThreads_Attention4": "wenn bereits ein Download läuft, da dies dazu führen könnte, dass", + "AppThreads_Attention5": "DER GESAMTE INHALT ERNEUT HERUNTERGELADEN WIRD,", + "AppThreads_Attention6": "da die für den Download erforderliche Anzahl an Sitzungen nicht übereinstimmt.", + "AppThreads_AttentionTop1": "Die folgenden Probleme treten nicht mehr auf, wenn die Einstellung", + "AppThreads_AttentionTop2": "aktiviert ist.", "DiscordRPC": "Discord Rich Presence", "DiscordRPC_Toggle": "Discord Präsenz anzeigen", "DiscordRPC_GameStatusToggle": "Zeige aktuelles Spiel im Discord-Status", "DiscordRPC_IdleStatusToggle": "RPC bei Inaktivität anzeigen", - "ImageBackground": "Image Background Settings", + "ImageBackground": "Einstellungen für den Bildhintergrund", "VideoBackground": "Video-Hintergrundeinstellungen", "VideoBackground_IsEnableAudio": "Audio einschalten", - "VideoBackground_IsEnableAcrylicBackground": "Use Acrylic Effect while using Video Background", + "VideoBackground_IsEnableAcrylicBackground": "Acryl-Effekt bei Verwendung eines Videohintergrunds anwenden", "VideoBackground_AudioVolume": "Lautstärke", - "VideoBackground_UseFFmpeg": "Use FFmpeg for Video Decoding", - "VideoBackground_FFmpegInstallStatus": "Install Status:", - "VideoBackground_FFmpegInstallStatus_Installed": "Installed", - "VideoBackground_FFmpegInstallStatus_NotInstalled": "Not Installed", - "VideoBackground_FFmpegInstallBtn_InstallationWizard": "Start New Install or Locate Wizard", - "VideoBackground_FFmpegInstallNote": "Note", - "VideoBackground_FFmpegInstallNoteContent": "Collapse Launcher only supports FFmpeg 7.x build. Other builds of FFmpeg aren't currently supported!", - "VideoBackground_FFmpegInstallLockedTitle": "Changing FFmpeg Installation is Locked", - "VideoBackground_FFmpegInstallLockedContent": "FFmpeg is currently being used for decoding your current background. To change your existing installation, please disabling \"Use FFmpeg for Video Decoding\" feature first, restart your launcher, go back to this settings then click \"Start New Install or Locate Wizard\" button.", + "VideoBackground_UseFFmpeg": "FFmpeg für die Videodekodierung verwenden", + "VideoBackground_FFmpegInstallStatus": "Installationsstatus:", + "VideoBackground_FFmpegInstallStatus_Installed": "Installiert", + "VideoBackground_FFmpegInstallStatus_NotInstalled": "Nicht installiert", + "VideoBackground_FFmpegInstallBtn_InstallationWizard": "Neuinstallation oder Suchassistent starten", + "VideoBackground_FFmpegInstallNote": "Hinweis", + "VideoBackground_FFmpegInstallNoteContent": "Collapse Launcher unterstützt nur die FFmpeg-Version 7.x. Andere Versionen von FFmpeg werden derzeit nicht unterstützt!", + "VideoBackground_FFmpegInstallLockedTitle": "Änderung der FFmpeg-Installation ist gesperrt", + "VideoBackground_FFmpegInstallLockedContent": "Derzeit wird FFmpeg für die Dekodierung deines aktuellen Hintergrunds verwendet. Um deine bestehende Installation zu ändern, deaktiviere bitte zunächst die Option „FFmpeg für die Videodekodierung verwenden“, starte deinen Launcher neu, kehre zu diesen Einstellungen zurück und klicke dann auf die Schaltfläche „Neue Installation starten oder Assistenten suchen“.", "Update": "Nach Updates suchen", "Update_CurVer": "Aktuelle Version:", @@ -569,47 +569,54 @@ "Update_NewVer1": "Aktualisieren auf", "Update_NewVer2": "ist verfügbar!", "Update_LatestVer": "Du benutzt die neuste Version.", - "Update_SeeChangelog": "See Latest Changes (EN)", - "Update_ChangelogTitle": "Latest Changes", + "Update_SeeChangelog": "Letzte Änderungen anzeigen (EN)", + "Update_ChangelogTitle": "Letzte Änderungen (Englisch)", - "AppFiles": "App Dateien-Management", - "AppFiles_OpenDataFolderBtn": "App-Datenordner öffnen", - "AppFiles_RelocateDataFolderBtn": "App-Datenordner verschieben", + "AppFiles": "Launcherdaten-Management", + "AppFiles_OpenDataFolderBtn": "Datenordner öffnen", + "AppFiles_RelocateDataFolderBtn": "Datenordner verschieben", "AppFiles_ClearLogBtn": "Logs löschen", "AppFiles_ClearImgCachesBtn": "Bilddateien löschen", "AppFiles_ClearMetadataBtn": "Metadaten löschen und Neustarten", - "AppFiles_ClearMetadataDialog": "Leere Collapse Metadaten!", - "AppFiles_ClearMetadataDialogHelp": "Clearing Collapse metadata will cause Collapse to forcefully restart. Only use this if you have problems with region loading.\r\nAre you sure?", + "AppFiles_ClearMetadataDialog": "Leeren der Collapse-Metadaten!", + "AppFiles_ClearMetadataDialogHelp": "Löschen der Collapse-Metadaten führt zu einem erzwungenen Neustart des Launchers. Verwende diese Option nur, wenn du Probleme beim Laden von Regionen hast.\r\n\nBist du dir sicher?", "ReportIssueBtn": "Ein Problem melden", "ContributePRBtn": "Mit einer Pull Request beitragen", "ContributorListBtn": "Open-Source-Mitwirkende", "HelpLocalizeBtn": "Hilf uns Collapse zu übersetzen!", - "ShareYourFeedbackBtn": "Share Your Feedback", + "ShareYourFeedbackBtn": "Gib uns dein Feedback", - "About": "Info", + "About": "Über", "About_Copyright1": "© 2022-2026", - "About_Copyright2": " neon-nyan, Cry0, bagusnl,\r\n shatyuka & gablm", + "About_Copyright2": " neon-nyan, Cry0, bagusnl, shatyuka & gablm", "About_Copyright3": "Unter der ", "About_Copyright4": ". Alle Rechte vorbehalten.", "LicenseType": "MIT-Lizenz", + "About_FFmpegCopyright1": "Die Software verwendet Code von ", + "About_FFmpegCopyright2": ", der unter der ", + "About_FFmpegCopyright3": "-Lizenz verfügbar ist, sowie ", + "About_FFmpegCopyright4": " als Wrapper, der unter der ", + "About_FFmpegCopyright5": "-Lizenz lizenziert ist.", + "About_FFmpegDonate": "Ans Projekt spenden", + "Disclaimer": "Haftungsausschluss", "Disclaimer1": "Diese App ist in keinster Weise mit", "Disclaimer2": "verbunden", - "Disclaimer3": "und komplett open-source. Jeder Beitrag ist willkommen.", - "WebsiteBtn": "Visit our Website", - "DiscordBtn1": "Tritt unserem Armada Discord bei!", + "Disclaimer3": "und komplett Open-Source. Jeder Beitrag ist willkommen.", + "WebsiteBtn": "Besuche unsere Webseite", + "DiscordBtn1": "Trete unserem Armada Discord bei!", "DiscordBtn2": "Honkai Impact 3rd Discord", "DiscordBtn3": "Offizieller Collapse Discord!", - "AppChangeReleaseChannel": "Zum Release Channel {0} wechseln", + "AppChangeReleaseChannel": "Zum {0}-Kanal wechseln", "EnableAcrylicEffect": "Acryl-Weichzeichner-Effekt verwenden", "EnableDownloadChunksMerging": "Heruntergeladene Paketstücke zusammenführen", - "Enforce7ZipExtract": "Always Use 7-zip for Game Installation/Update", + "Enforce7ZipExtract": "Immer 7-zip für die Installation/Aktualisierung von Spielen verwenden", "UseExternalBrowser": "Immer externen Browser verwenden", "LowerCollapsePrioOnGameLaunch": "Ressourcenverbrauch des Collapse-Prozesses beim Starten eines Spiels senken", @@ -624,7 +631,7 @@ "AppBehavior_PostGameLaunch_Minimize": "Minimieren", "AppBehavior_PostGameLaunch_ToTray": "In Infobereich minimieren", "AppBehavior_PostGameLaunch_Nothing": "Nichts unternehmen", - "AppBehavior_MinimizeToTray": "In Infobereich minimieren", + "AppBehavior_MinimizeToTray": "In den Infobereich minimieren", "AppBehavior_LaunchOnStartup": "Collapse automatisch starten, wenn der Computer hochfährt", "AppBehavior_StartupToTray": "Collapse-Fenster beim automatischen Starten ausblenden", @@ -635,204 +642,204 @@ "Waifu2X_Warning_D3DMappingLayers": "WARNUNG: Auf dem System ist das \"OpenCL™, OpenGL® und Vulkan® Kompatibilitätspaket\" installiert. Es ist Berichten zufolge nicht mit dem Vulkan Loader kompatibel und führt bei einigen GPUs zu Abstürzen. Bitte entferne dieses Paket, um den GPU-Modus zu aktivieren.", "Waifu2X_Error_Loader": "FEHLER: Vulkan Loader konnte nicht initialisiert werden. Stelle sicher, dass du einen Vulkan-kompatiblen Grafikprozessor mit einem geeigneten GPU-Treiber installiert hast.", "Waifu2X_Error_Output": "FEHLER: Waifu2X-Selbsttest nicht bestanden, leeres Ausgabebild erhalten.", - "Waifu2X_Initializing": "Waifu2X is initializing, please wait a moment.", - - "NetworkSettings_Title": "Network Settings", - "NetworkSettings_Proxy_Title": "Proxy Settings", - - "NetworkSettings_Proxy_Hostname": "Proxy Hostname", - "NetworkSettings_Proxy_HostnameHelp1": "Represents the URL of the Proxy to use.", - "NetworkSettings_Proxy_HostnameHelp2": "Collapse can only support", - "NetworkSettings_Proxy_HostnameHelp3": "HTTP/HTTPS and SOCKS4/4a/5", - "NetworkSettings_Proxy_HostnameHelp4": "type of proxy at the moment.", - - "NetworkSettings_ProxyWarn_UrlInvalid": "The URL entered is not valid!", - "NetworkSettings_ProxyWarn_NotSupported": "The proxy scheme is not supported! Collapse only supports http://, https://, socks4://, socks4a:// and socks5://", - - "NetworkSettings_Proxy_Username": "Proxy Username", - "NetworkSettings_Proxy_UsernamePlaceholder": "Enter Proxy Username", - "NetworkSettings_Proxy_UsernameHelp1": "Default:", - "NetworkSettings_Proxy_UsernameHelp2": "[Empty]", - "NetworkSettings_Proxy_UsernameHelp3": "Leave this field empty if your proxy doesn't require authentication.", - - "NetworkSettings_Proxy_Password": "Proxy Password", - "NetworkSettings_Proxy_PasswordPlaceholder": "Enter Proxy Password", - "NetworkSettings_Proxy_PasswordHelp1": "Default:", - "NetworkSettings_Proxy_PasswordHelp2": "[Empty]", - "NetworkSettings_Proxy_PasswordHelp3": "Leave this field empty if your proxy doesn't require authentication.", - - "NetworkSettings_ProxyTest_Button": "Test Proxy Connectivity", - "NetworkSettings_ProxyTest_ButtonChecking": "Checking Connectivity...", - "NetworkSettings_ProxyTest_ButtonSuccess": "Proxy Connectivity Test is Successful!", - "NetworkSettings_ProxyTest_ButtonFailed": "Test Failed! Proxy is not Reachable", - - "NetworkSettings_Dns_Title": "Custom DNS Settings", - "NetworkSettings_Dns_ConnectionType": "Connection Type", + "Waifu2X_Initializing": "Waifu2X wird initialisiert, bitte einen Moment warten.", + + "NetworkSettings_Title": "Netzwerkeinstellungen", + "NetworkSettings_Proxy_Title": "Proxy-Einstellungen", + + "NetworkSettings_Proxy_Hostname": "Proxy-Hostname", + "NetworkSettings_Proxy_HostnameHelp1": "Gibt die URL des zu verwendenden Proxys an.", + "NetworkSettings_Proxy_HostnameHelp2": "Collapse unterstützt nur", + "NetworkSettings_Proxy_HostnameHelp3": "HTTP/HTTPS und SOCKS4/4a/5", + "NetworkSettings_Proxy_HostnameHelp4": "Arten von Proxy-Servers zum aktuellen Zeitpunkt.", + + "NetworkSettings_ProxyWarn_UrlInvalid": "Die eingegebene URL ist ungültig!", + "NetworkSettings_ProxyWarn_NotSupported": "Das Proxy-Schema wird nicht unterstützt! Collapse unterstützt nur http://, https://, socks4://, socks4a:// and socks5://", + + "NetworkSettings_Proxy_Username": "Proxy-Benutzername", + "NetworkSettings_Proxy_UsernamePlaceholder": "Proxy-Benutzername eingeben", + "NetworkSettings_Proxy_UsernameHelp1": "Standard:", + "NetworkSettings_Proxy_UsernameHelp2": "[Leer]", + "NetworkSettings_Proxy_UsernameHelp3": "Lasse dieses Feld leer, wenn dein Proxy keine Authentifizierung erfordert.", + + "NetworkSettings_Proxy_Password": "Proxy-Passwort", + "NetworkSettings_Proxy_PasswordPlaceholder": "Proxy-Passwort eingeben", + "NetworkSettings_Proxy_PasswordHelp1": "Standard:", + "NetworkSettings_Proxy_PasswordHelp2": "[Leer]", + "NetworkSettings_Proxy_PasswordHelp3": "Lasse dieses Feld leer, wenn dein Proxy keine Authentifizierung erfordert.", + + "NetworkSettings_ProxyTest_Button": "Proxy-Verbindung testen", + "NetworkSettings_ProxyTest_ButtonChecking": "Überprüfen der Verbindung...", + "NetworkSettings_ProxyTest_ButtonSuccess": "Der Proxy-Verbindungstest war erfolgreich!", + "NetworkSettings_ProxyTest_ButtonFailed": "Test fehlgeschlagen! Der Proxy ist nicht erreichbar", + + "NetworkSettings_Dns_Title": "Benutzerdefinierte DNS-Einstellungen", + "NetworkSettings_Dns_ConnectionType": "Verbindungsart", "NetworkSettings_Dns_ConnectionType_SelectionUdp": "UDP (Port 53)", - "NetworkSettings_Dns_ConnectionType_SelectionDoH": "DNS over HTTPS", - "NetworkSettings_Dns_ConnectionType_SelectionDoT": "DNS over TLS", - "NetworkSettings_Dns_ConnectionType_Tooltip1": "Represents the type of which DNS Protocol to be used to query the record. There are few types of Protocol supported by Collapse Launcher, including:", - "NetworkSettings_Dns_ProviderSelection": "DNS Provider", - "NetworkSettings_Dns_ProviderSelection_SelectionCustom": "Custom", - "NetworkSettings_Dns_ProviderSelection_Tooltip1": "There are few available External DNS Provider built into Collapse Launcher. You can also use your own custom DNS Provider/Server by selecting \"Custom\" as the selection under \"DNS Provider\".", - "NetworkSettings_Dns_CustomProvider": "Custom DNS Provider Host(s)", - "NetworkSettings_Dns_CustomProvider_Tooltip1": "Depends on", - "NetworkSettings_Dns_CustomProvider_Tooltip2": "settings", - "NetworkSettings_Dns_CustomProvider_Tooltip3": "When you choose", - "NetworkSettings_Dns_CustomProvider_Tooltip4": "as your", - "NetworkSettings_Dns_CustomProvider_Tooltip5": "selection, you can add your own custom DNS Provider/Server by entering its IPv4/IPv6 or hostname. You can also add pre-defined DNS Provider (which starts with '$' symbol) alongside your custom DNS Provider/Server by separating each entry with these symbols:", - "NetworkSettings_Dns_CustomProvider_Tooltip6": "Example:", - "NetworkSettings_Dns_ChangesWarning": "You need to restart the app for any DNS settings changes to take effect.", - "NetworkSettings_Dns_ValidateAndSaveSettingsButton": "Test & Save Changes", - "NetworkSettings_Dns_ApplyingSettingsButton": "Validating and Applying Changes...", - "NetworkSettings_Dns_SettingsSavedButton": "Changes Saved!", - "NetworkSettings_Dns_SettingsFailedButton": "Changes Failed to Save!", - - "NetworkSettings_Http_Title": ".NET HTTP Client Settings", - "NetworkSettings_Http_Redirect": "Allow HTTP Redirection", - "NetworkSettings_Http_SimulateCookies": "Allow Simulate HTTP Cookies", - "NetworkSettings_Http_UntrustedHttps": "Allow Untrusted HTTPS Certificate", - "NetworkSettings_Http_Timeout": "HTTP Client Timeout (in Seconds)", - - "FileDownloadSettings_Title": "File Download Settings", - "FileDownloadSettings_SpeedLimit_Title": "Limit Download Speed", - "FileDownloadSettings_SpeedLimit_NumBox": "Speed Limit (in MiB)", - "FileDownloadSettings_SpeedLimitHelp1": "Default:", - "FileDownloadSettings_SpeedLimitHelp2": "Speed Limit value range:", + "NetworkSettings_Dns_ConnectionType_SelectionDoH": "DNS über HTTPS", + "NetworkSettings_Dns_ConnectionType_SelectionDoT": "DNS über TLS", + "NetworkSettings_Dns_ConnectionType_Tooltip1": "Gibt den Typ des DNS-Protokolls an, das für die Abfrage des Eintrags verwendet werden soll. Der Collapse Launcher unterstützt einige Protokolltypen, darunter:", + "NetworkSettings_Dns_ProviderSelection": "DNS-Anbieter", + "NetworkSettings_Dns_ProviderSelection_SelectionCustom": "Benutzerdefiniert", + "NetworkSettings_Dns_ProviderSelection_Tooltip1": "In den Collapse Launcher sind nur wenige externe DNS-Anbieter integriert. Du kannst auch deinen eigenen DNS-Anbieter/Server verwenden, indem du unter „DNS-Anbieter“ die Option „Benutzerdefiniert“ auswählst.", + "NetworkSettings_Dns_CustomProvider": "Benutzerdefinierter DNS-Anbieter Host(s)", + "NetworkSettings_Dns_CustomProvider_Tooltip1": "Hängt von den", + "NetworkSettings_Dns_CustomProvider_Tooltip2": "Einstellungen ab", + "NetworkSettings_Dns_CustomProvider_Tooltip3": "Wenn du", + "NetworkSettings_Dns_CustomProvider_Tooltip4": "als deinen", + "NetworkSettings_Dns_CustomProvider_Tooltip5": "auswählst, kannst du deinen eigenen DNS-Anbieter/Server hinzufügen, indem du dessen IPv4-/IPv6-Adresse oder Hostnamen eingibst. Du kannst neben deinem benutzerdefinierten DNS-Anbieter/Server auch vordefinierte DNS-Anbieter (die mit dem Symbol '$' beginnen) hinzufügen, indem du die einzelnen Einträge durch diese Symbole trennst:", + "NetworkSettings_Dns_CustomProvider_Tooltip6": "Beispiel:", + "NetworkSettings_Dns_ChangesWarning": "Für die Übernahme von Änderungen an den DNS-Einstellungen muss die App neu gestartet werden.", + "NetworkSettings_Dns_ValidateAndSaveSettingsButton": "Testen & Änderungen speichern", + "NetworkSettings_Dns_ApplyingSettingsButton": "Änderungen überprüfen und übernehmen...", + "NetworkSettings_Dns_SettingsSavedButton": "Änderungen gespeichert!", + "NetworkSettings_Dns_SettingsFailedButton": "Änderungen konnten nicht gespeichert werden!", + + "NetworkSettings_Http_Title": ".NET-HTTP-Client-Einstellungen", + "NetworkSettings_Http_Redirect": "HTTP-Weiterleitung zulassen", + "NetworkSettings_Http_SimulateCookies": "Simulation von HTTP-Cookies zulassen", + "NetworkSettings_Http_UntrustedHttps": "Nicht vertrauenswürdiges HTTPS-Zertifikat zulassen", + "NetworkSettings_Http_Timeout": "HTTP-Client-Zeitüberschreitung (in Sekunden)", + + "FileDownloadSettings_Title": "Einstellungen für den Datei-Download", + "FileDownloadSettings_SpeedLimit_Title": "Download-Geschwindigkeit begrenzen", + "FileDownloadSettings_SpeedLimit_NumBox": "Geschwindigkeitsbegrenzung (in MiB)", + "FileDownloadSettings_SpeedLimitHelp1": "Standard:", + "FileDownloadSettings_SpeedLimitHelp2": "Wertebereich für Geschwindigkeits-\nbegrenzung:", "FileDownloadSettings_SpeedLimitHelp3": "1 - 1000 MiB/s", - "FileDownloadSettings_SpeedLimitHelp4": "Limits the maximum allowed bandwidth for downloading.", + "FileDownloadSettings_SpeedLimitHelp4": "Begrenzt die maximal zulässige Bandbreite für Downloads. Diese Einstellung kann nicht zusammen mit der", "FileDownloadSettings_SpeedLimitHelp5": "", - "FileDownloadSettings_NewPreallocChunk_Title": "New Pre-allocated Downloader", - "FileDownloadSettings_NewPreallocChunk_Subtitle": "For Game Installation, Game Repair and Cache Updates only.", - "FileDownloadSettings_NewPreallocChunk_NumBox": "Chunk Size (in MiB)", - "FileDownloadSettings_NewPreallocChunkHelp1": "Default:", - "FileDownloadSettings_NewPreallocChunkHelp2": "Chunk Size value range:", + "FileDownloadSettings_NewPreallocChunk_Title": "Neuer, vorab zugewiesener Downloader", + "FileDownloadSettings_NewPreallocChunk_Subtitle": "Nur für die Installation von Spielen, die Reparatur von Spielen und Cache-Aktualisierungen.", + "FileDownloadSettings_NewPreallocChunk_NumBox": "Blockgröße (in MiB)", + "FileDownloadSettings_NewPreallocChunkHelp1": "Standard:", + "FileDownloadSettings_NewPreallocChunkHelp2": "Wertebereich für Chunk-Größe:", "FileDownloadSettings_NewPreallocChunkHelp3": "1 - 32 MiB", - "FileDownloadSettings_NewPreallocChunkHelp4": "When enabled, the downloader will dynamically pre-allocate the file size during its download.", - "FileDownloadSettings_NewPreallocChunkHelp5": "This enables the downloader to directly writes data chunks into the file without splitting it into separate files.", - "FileDownloadSettings_NewPreallocChunkHelp6": "When disabled, the launcher will use the old allocation method, where data chunks will be written into separate files. It will also disable the", - "FileDownloadSettings_NewPreallocChunkHelp7": "and", - "FileDownloadSettings_NewPreallocChunkHelp8": "settings.", - "FileDownloadSettings_NewPreallocChunkHelp9": "Note:", - "FileDownloadSettings_NewPreallocChunkHelp10": "This feature is only available for game installation (such as Initial Install, Update, and Pre-load), Game Repair, and Cache Update steps.", - - "FileDownloadSettings_BurstDownload_Title": "Burst File Download Mode", - "FileDownloadSettings_BurstDownload_Subtitle": "For Game Repair and Cache Updates only.", - "FileDownloadSettings_BurstDownloadHelp1": "Default:", - "FileDownloadSettings_BurstDownloadHelp2": "When enabled, this feature will allow the download process on", - "FileDownloadSettings_BurstDownloadHelp3": "and", - "FileDownloadSettings_BurstDownloadHelp4": "features to run in parallel to make the download process more efficient.", - "FileDownloadSettings_BurstDownloadHelp5": "When disabled, the download process for", - "FileDownloadSettings_BurstDownloadHelp6": "and", - "FileDownloadSettings_BurstDownloadHelp7": "features will use a sequential download process.", - - "Database_Title": "User Synchronizable Database", - "Database_ConnectionOk": "Database connected successfully!", - "Database_ConnectFail": "Failed to connect to the database, see error(s) below:", - "Database_Toggle": "Enable Online Database", - "Database_Url": "Database URL", - "Database_Url_Example": "Example: https://db-collapse.turso.io", + "FileDownloadSettings_NewPreallocChunkHelp4": "Wenn aktiviert, reserviert der Downloader die Dateigröße während des Downloads dynamisch im Voraus.", + "FileDownloadSettings_NewPreallocChunkHelp5": "Dadurch kann der Downloader Datenblöcke direkt in die Datei schreiben, ohne sie in einzelne Dateien aufzuteilen.", + "FileDownloadSettings_NewPreallocChunkHelp6": "Wenn deaktiviert, verwendet der Launcher die alte Zuweisungsmethode, bei der Datenblöcke in separate Dateien geschrieben werden. Außerdem wird die", + "FileDownloadSettings_NewPreallocChunkHelp7": "und", + "FileDownloadSettings_NewPreallocChunkHelp8": "Optionen deaktivieren.", + "FileDownloadSettings_NewPreallocChunkHelp9": "Hinweis:", + "FileDownloadSettings_NewPreallocChunkHelp10": "Diese Funktion steht nur für Schritte zur Spielinstallation (wie Erstinstallation, Aktualisierung und Vorab-Download), zur Spielreparatur und zur Cache-Aktualisierung zur Verfügung.", + + "FileDownloadSettings_BurstDownload_Title": "Schnelldatei-Download-Modus", + "FileDownloadSettings_BurstDownload_Subtitle": "Nur für Spielreparaturen und Cache-Aktualisierungen.", + "FileDownloadSettings_BurstDownloadHelp1": "Standard:", + "FileDownloadSettings_BurstDownloadHelp2": "Wenn diese Funktion aktiviert ist, werden die Download-Vorgänge für die Funktionen", + "FileDownloadSettings_BurstDownloadHelp3": "und", + "FileDownloadSettings_BurstDownloadHelp4": "parallel ausgeführt, um den Download-Prozess effizienter zu gestalten.", + "FileDownloadSettings_BurstDownloadHelp5": "Wenn diese Funktion deaktiviert ist, werden die Download-Vorgänge für die Funktionen ", + "FileDownloadSettings_BurstDownloadHelp6": "und", + "FileDownloadSettings_BurstDownloadHelp7": "nacheinander ausgeführt.", + + "Database_Title": "Synchronisierbare Benutzerdatenbank", + "Database_ConnectionOk": "Verbindung zur Datenbank erfolgreich hergestellt!", + "Database_ConnectFail": "Die Verbindung zur Datenbank konnte nicht hergestellt werden. Siehe folgende Fehlermeldung(en):", + "Database_Toggle": "Online-Datenbank aktivieren", + "Database_Url": "Datenbank-URL", + "Database_Url_Example": "beispiel: https://db-Collapse.turso.io", "Database_Token": "Token", - "Database_UserId": "User ID", - "Database_GenerateGuid": "Generate UID", - "Database_Validate": "Validate & Save Settings", - "Database_Error_EmptyUri": "Database URL cannot be empty!", - "Database_Error_EmptyToken": "Database token cannot be empty!", - "Database_Error_InvalidGuid": "User ID is not a valid GUID!", - "Database_Warning_PropertyChanged": "Database settings has changed", - "Database_ValidationChecking": "Validating Settings...", - "Database_Placeholder_DbUserIdTextBox": "GUID Example: ed6e8048-e3a0-4983-bd56-ad19956c701f", - "Database_Placeholder_DbTokenPasswordBox": "Enter your authentication token here", - - "SearchPlaceholder": "Type to search...", - - "HttpCache_Title": "HTTP Cache Settings", - "HttpCacheModeToggle": "Cache Mode", - "HttpCacheModeToggle_Tooltip1": "Whether to use network caching while performing HTTP request onto CDNs. This might reduce loading time on certain functionalities.", - "HttpCacheModeToggle_Tooltip2": "When enabled, this feature utilize two methods of caching:", - "HttpCacheModeToggle_Tooltip3": "Sidenote:", - "HttpCacheModeToggle_Tooltip4": "You might need to clear the cache by clicking", - "HttpCacheModeToggle_Tooltip5": "button if you encounter some issues or if the launcher behaves unexpectedly.", - "HttpCacheMode_Cat1": "Expire Time-based Caching", - "HttpCacheMode_Cat2": "ETag/Hash-based Caching", - "HttpCacheAggressiveModeToggle": "Aggressive Cache Mode", - "HttpCacheAggressiveModeToggle_Tooltip1": "When enabled, this will allow the launcher to perform caching based on how long the", - "HttpCacheAggressiveModeToggle_Tooltip2": "is defined. Both", - "HttpCacheAggressiveModeToggle_Tooltip3": "and", - "HttpCacheAggressiveModeToggle_Tooltip4": "methods are automatically ignored.", - "HttpCacheAggressiveModeToggle_Tooltip5": "To use this feature, you must enable the", - "HttpCacheAggressiveModeToggle_Tooltip6": "first.", - "HttpCacheMaxExpireTimeBox": "Maximum Expire Time", - "HttpCacheMaxExpireTimeBox_TooltipDefaultValue": "10 minutes", - "HttpCacheMaxExpireTimeBox_Tooltip1": "Determine how long is the allowed maximum cache time for the response (in minutes).", - "HttpCacheMaxExpireTimeBoxMinutes": "minutes", - "HttpCacheClearButton": "Clear Network Cache", - "HttpCacheClearedText": "Caches have been Cleared!", - - "Plugin_LoadedInfoTitle": "Loaded Plugins Information", - "Plugin_OpenManagerBtn": "Open Plugin Management Menu", - "Plugin_AuthorBy": "by {0}", - "Plugin_LoadedInfoDesc": "Description", - "Plugin_LoadedInfoPluginVer": "Plugin Version", - "Plugin_LoadedInfoInterfaceVer": "Interface Version", - "Plugin_LoadedInfoCreationDate": "Creation Date", - "Plugin_LoadedInfoMainLibLocation": "Main Library Location", - "Plugin_LoadedInfoLoadedPresets": "Loaded Presets", - "Plugin_LoadedInfoClipboardCopied": "Information Copied!", - "Plugin_PluginInfoNameUnknown": "Unknown", - "Plugin_PluginInfoDescUnknown": "No description", - "Plugin_PluginInfoAuthorUnknown": "Unknown Author" + "Database_UserId": "Benutzer-ID", + "Database_GenerateGuid": "UID generieren", + "Database_Validate": "Überprüfen und speichern", + "Database_Error_EmptyUri": "Die Datenbank-URL darf nicht leer sein!", + "Database_Error_EmptyToken": "Der Datenbank-Token darf nicht leer sein!", + "Database_Error_InvalidGuid": "Die Benutzer-ID ist keine gültige GUID!", + "Database_Warning_PropertyChanged": "Die Datenbankeinstellungen haben sich geändert", + "Database_ValidationChecking": "Überprüfe Einstellungen...", + "Database_Placeholder_DbUserIdTextBox": "GUID-Beispiel: ed6e8048-e3a0-4983-bd56-ad19956c701f", + "Database_Placeholder_DbTokenPasswordBox": "Gib hier dein Authentifizierungstoken ein", + + "SearchPlaceholder": "Einstellungen durchsuchen...", + + "HttpCache_Title": "HTTP-Cache-Einstellungen", + "HttpCacheModeToggle": "Cache-Modus", + "HttpCacheModeToggle_Tooltip1": "Ob bei HTTP-Anfragen an CDNs Netzwerk-Caching verwendet werden soll. Dies könnte die Ladezeit bestimmter Funktionen verkürzen.", + "HttpCacheModeToggle_Tooltip2": "Wenn diese Funktion aktiviert ist, nutzt es zwei Methoden zum Zwischenspeichern:", + "HttpCacheModeToggle_Tooltip3": "Anmerkung:", + "HttpCacheModeToggle_Tooltip4": "Falls Probleme auftreten oder sich der Launcher unerwartet verhält, kann es erforderlich sein, den Cache durch Klicken auf die Schaltfläche", + "HttpCacheModeToggle_Tooltip5": "zu leeren.", + "HttpCacheMode_Cat1": "Zeitbasiertes Caching mit Ablaufdatum", + "HttpCacheMode_Cat2": "ETag/Hash-basiertes Caching", + "HttpCacheAggressiveModeToggle": "Aggressiver Cache-Modus", + "HttpCacheAggressiveModeToggle_Tooltip1": "Wenn diese Option aktiviert ist, kann der Launcher ein Caching durchführen, dessen Dauer sich nach der Definition von", + "HttpCacheAggressiveModeToggle_Tooltip2": "richtet. Sowohl die", + "HttpCacheAggressiveModeToggle_Tooltip3": "- als auch die", + "HttpCacheAggressiveModeToggle_Tooltip4": "-Methode werden automatisch ignoriert.", + "HttpCacheAggressiveModeToggle_Tooltip5": "Um diese Funktion nutzen zu können, muss zunächst", + "HttpCacheAggressiveModeToggle_Tooltip6": "aktiviert werden.", + "HttpCacheMaxExpireTimeBox": "Maximale Gültigkeitsdauer", + "HttpCacheMaxExpireTimeBox_TooltipDefaultValue": "10 Minuten", + "HttpCacheMaxExpireTimeBox_Tooltip1": "Lege fest, wie lange die maximal zulässige Cache-Dauer für die Antwort beträgt (in Minuten).", + "HttpCacheMaxExpireTimeBoxMinutes": "Minuten", + "HttpCacheClearButton": "Netzwerk-Cache leeren", + "HttpCacheClearedText": "Der Cache wurde geleert!", + + "Plugin_LoadedInfoTitle": "Informationen zu geladenen Plugins", + "Plugin_OpenManagerBtn": "Plugin-Verwaltungsmenü öffnen", + "Plugin_AuthorBy": "von {0}", + "Plugin_LoadedInfoDesc": "Beschreibung", + "Plugin_LoadedInfoPluginVer": "Plugin-Version", + "Plugin_LoadedInfoInterfaceVer": "Schnittstellen-version", + "Plugin_LoadedInfoCreationDate": "Erstelldatum", + "Plugin_LoadedInfoMainLibLocation": "Standort der Hauptbibliothek", + "Plugin_LoadedInfoLoadedPresets": "Geladene Voreinstellungen", + "Plugin_LoadedInfoClipboardCopied": "Informationen kopiert!", + "Plugin_PluginInfoNameUnknown": "Unbekannt", + "Plugin_PluginInfoDescUnknown": "Keine Beschreibung", + "Plugin_PluginInfoAuthorUnknown": "Unbekannter Herausgeber" }, "_PluginManagerPage": { - "PageTitle": "Plugin Manager Menu", - - "FileDialogTitle": "Import Collapse Launcher Plugin", - "FileDialogFileFilter1": "Collapse Launcher Plugin", - - "LeftPanelNoPluginTitle": "Hey, you have no plugins loaded!", - "LeftPanelNoPluginButton1": "Go to the", - "LeftPanelNoPluginButton2": "Plugin Download Catalog", - "LeftPanelNoPluginButton3": "page to get more!", - - "LeftPanelListViewTitle": "Loaded Plugin Information", - - "ListViewMainActionButton1": "Check Updates for All Plugins", - "ListViewMainActionButton1AltChecking": "Checking Updates for All Plugins...", - "ListViewMainActionButton2": "Download Updates for All Plugins", - "ListViewMainActionButton3": "Enable Plugins Auto-update on Launch", - - "ListViewItemContextButton1": "Uninstall Selected Plugins", - "ListViewItemContextButton2": "Restore Selected Plugins", - "ListViewItemContextButton3": "Enable Selected Plugins", - "ListViewItemContextButton4": "Disable Selected Plugins", - "ListViewItemContextButton5": "Update Selected Plugins", - "ListViewItemContextButton6": "Open Current Plugin Folder", - "ListViewItemContextButton7": "Open Collapse Launcher Plugin Folder", - "ListViewItemContextButton8": "Update Current Plugin", - - "ListViewItemContentButton1": "Uninstall Plugin", - "ListViewItemContentButton2": "Restore Plugin", - - "ListViewItemContextButtonCheckUpdateOnly": "Check Update Only", - "ListViewItemContextButtonCheckAndDownloadUpdate": "Check and Download Update", - "ListViewItemContextButtonDownloadUpdate": "Download Update", - - "ListViewItemUpdateStatusAvailable": "Update is Available!", - "ListViewItemUpdateStatusAvailableButton": "Update to {0}", - "ListViewItemUpdateStatusAvailableButtonUpdating": "Updating ({0}%)...", - "ListViewItemUpdateStatusCompleted": "Your plugin has been updated to {0}. Please restart your launcher to apply the update!", - "ListViewItemUpdateStatusChecking": "Checking for updates...", - "ListViewItemUpdateStatusUpToDate": "Plugin is up-to-date!", - - "ListViewFooterWarning1": "You need to restart your launcher in order to apply the changes!", - "ListViewFooterRestartButton": "Restart the Launcher", - - "RightPanelImportTitle1": "Click to add the", - "RightPanelImportTitle2": "or", - "RightPanelImportTitle3": "here", - "RightPanelImportTitle4": "Anywhere in the box is fine!" + "PageTitle": "Menü des Plugin-Managers", + + "FileDialogTitle": "Importieren von Collapse Launcher-Plugins", + "FileDialogFileFilter1": "Collapse Launcher-Plugin", + + "LeftPanelNoPluginTitle": "Hey, es sind keine Plugins geladen!", + "LeftPanelNoPluginButton1": "Gehe zum", + "LeftPanelNoPluginButton2": "Plugin-Download-Katalog", + "LeftPanelNoPluginButton3": "um mehr zu erhalten!", + + "LeftPanelListViewTitle": "Informationen zu geladenen Plugins", + + "ListViewMainActionButton1": "Alle Plugins auf Updates prüfen", + "ListViewMainActionButton1AltChecking": "Nach Updates für alle Plugins suchen...", + "ListViewMainActionButton2": "Updates für alle Plugins herunterladen", + "ListViewMainActionButton3": "Automatische Aktualisierung von Plugins beim Start aktivieren", + + "ListViewItemContextButton1": "Ausgewählte Plugins deinstallieren", + "ListViewItemContextButton2": "Ausgewählte Plugins wiederherstellen", + "ListViewItemContextButton3": "Ausgewählte Plugins aktivieren", + "ListViewItemContextButton4": "Ausgewählte Plugins deaktivieren", + "ListViewItemContextButton5": "Ausgewählte Plugins aktualisieren", + "ListViewItemContextButton6": "Aktuellen Plugin-Ordner öffnen", + "ListViewItemContextButton7": "Plugin-Ordner des Launchers öffnen bzw. schließen", + "ListViewItemContextButton8": "Aktuelles Plugin aktualisieren", + + "ListViewItemContentButton1": "Plugin deinstallieren", + "ListViewItemContentButton2": "Plugin wiederherstellen", + + "ListViewItemContextButtonCheckUpdateOnly": "Nur nach Updates suchen", + "ListViewItemContextButtonCheckAndDownloadUpdate": "Auf Updates prüfen und herunterladen", + "ListViewItemContextButtonDownloadUpdate": "Update herunterladen", + + "ListViewItemUpdateStatusAvailable": "Es ist ein Update verfügbar!", + "ListViewItemUpdateStatusAvailableButton": "Aktualisierung auf {0}", + "ListViewItemUpdateStatusAvailableButtonUpdating": "Aktualisierung ({0} %)...", + "ListViewItemUpdateStatusCompleted": "Das Plugin wurde auf Version {0} aktualisiert. Bitte starte den Launcher neu, um die Aktualisierung zu übernehmen!", + "ListViewItemUpdateStatusChecking": "Nach Updates suchen...", + "ListViewItemUpdateStatusUpToDate": "Plugin ist auf dem neuesten Stand!", + + "ListViewFooterWarning1": "Der Launcher muss neu gestartet werden, damit die Änderungen wirksam werden!", + "ListViewFooterRestartButton": "Launcher neustarten", + + "RightPanelImportTitle1": "Klicke, um die", + "RightPanelImportTitle2": "oder", + "RightPanelImportTitle3": "hier einzufügen", + "RightPanelImportTitle4": "Oder ziehe es einfach in diesen Kasten!" }, "_Misc": { @@ -842,20 +849,20 @@ "UpdateCompleteSubtitle": "Deine Launcher version wurde auf {0} aktualisiert! (Release Channel: {1})", "FeatureUnavailableTitle": "Diese Funktion ist im Moment nicht verfügbar", "FeatureUnavailableSubtitle": "Bitte versuche es später erneut!", - "TimeRemain": "Zeit übrig", - "TimeRemainHMSFormat": "{0:%h}S{0:%m}m{0:%s}s übrig", + "TimeRemain": "Verbleibende Zeit", + "TimeRemainHMSFormat": "{0:%h}h {0:%m}m {0:%s}s übrig", "TimeRemainHMSFormatPlaceholder": "--S--m--s left", - "Speed": "Geschwindigkeit: {0}/s", - "SpeedTextOnly": "Speed", + "Speed": "Tempo: {0}/s", + "SpeedTextOnly": "Geschwindigkeit", "SpeedPerSec": "{0}/s", "SpeedPlaceholder": "Geschwindigkeit: - /s", "PerFromTo": "{0} / {1}", "PerFromToPlaceholder": "- / -", - "EverythingIsOkay": "All OK!", + "EverythingIsOkay": "Alles in Ordnung!", "Cancel": "Abbrechen", "Close": "Schließen", - "CloseOverlay": "Close Overlay", + "CloseOverlay": "Overlay schließen", "UseCurrentDir": "Aktuelles Verzeichnis verwenden", "UseDefaultDir": "Standardverzeichnis verwenden", "MoveToDifferentDir": "Zu anderem Verzeichnis verschieben", @@ -864,7 +871,7 @@ "OkaySad": "Okay ;-;)", "OkayHappy": "Okay (≧▽≦)ノ", "OkayBackToMenu": "Okay, zurück zum Menü", - "Skip": "Überspringen, nie wieder zeigen", + "Skip": "Überspringen & nicht mehr zeigen", "Next": "Weiter", "Prev": "Zurück", "Uninstall": "Deinstallieren", @@ -899,14 +906,14 @@ "LangNameKR": "Koreanisch", "Downloading": "Herunterladen", - "Updating": "Updating", - "UpdatingAndApplying": "Update + Applying", - "Applying": "Applying", + "Updating": "Aktualisierung", + "UpdatingAndApplying": "Aktualisieren & Anwenden", + "Applying": "Anwenden", "Merging": "Zusammenführen", "Idle": "Inaktiv", "Change": "Ändern", "Cancelled": "Abgebrochen", - "FinishingUp": "Finishing Up", + "FinishingUp": "Abschließen", "Extracting": "Extrahieren", "Converting": "Konvertieren", "Patching": "Patchen", @@ -921,20 +928,20 @@ "ApplyingPatch": "Patch anwenden", "Disabled": "Deaktiviert", "Enabled": "Aktiviert", - "UseAsDefault": "Use as Default", - "Default": "Default", + "UseAsDefault": "Als Standard verwenden", + "Default": "Standard", "BuildChannelPreview": "Vorschau", "BuildChannelStable": "Stabil", - "CDNDescription_Github": "Die offizielle (Haupt-)Repository des Launchers.", - "CDNDescription_DigitalOcean": "A mirror of the official (main) repository powered by DigitalOcean.", + "CDNDescription_Github": "Das offizielle (Haupt-)Repository für den Launcher.", + "CDNDescription_DigitalOcean": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet bei DigitalOcean.", "CDNDescription_Cloudflare": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet in Cloudflare R2 Bucket.", - "CDNDescription_Bitbucket": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet in Bitbucket.", - "CDNDescription_GitLab": "A mirror of the official (main) repository hosted in GitLab.", - "CDNDescription_CNB": "A mirror of the official (main) repository powered by CNB.", + "CDNDescription_Bitbucket": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet bei Bitbucket.", + "CDNDescription_GitLab": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet in GitLab.", + "CDNDescription_CNB": "Ein Spiegel des offiziellen (Haupt-)Repository, gehostet bei CNB.", - "LocateExecutable": "Locate Executable", + "LocateExecutable": "Ausführungsdatei suchen", "OpenDownloadPage": "Downloadseite öffnen", "DiscordRP_Play": "Spielt", @@ -967,26 +974,26 @@ "ImageCropperTitle": "Bild zuschneiden", "IsBytesMoreThanBytes": "= {0} bytes (-/+ {1})", - "IsBytesUnlimited": "= Unlimited", + "IsBytesUnlimited": "= Unbegrenzt", "IsBytesNotANumber": "= NaN", - "MissingVcRedist": "Missing Visual C/C++ Redistributable", - "MissingVcRedistSubtitle": "You need to install the Visual C/C++ Redistributable to run this function. Do you want to download it now?\r\nNote: This will open a browser window and download a file from Microsoft. Please run the installer after downloading it then restart Collapse and try again.\r\nIf you have already installed it but the error remains, please send a issue ticket to us.", - "ExceptionFeedbackBtn": "Tell us what happened", - "ExceptionFeedbackBtn_Unavailable": "Crash report is disabled or not available", - "ExceptionFeedbackBtn_FeedbackSent": "Feedback has been sent!", - "ExceptionFeedbackTitle": "Tell us what happened:", - "ExceptionFeedbackTemplate_User": "Username (Optional):", - "ExceptionFeedbackTemplate_Email": "Email (Optional):", - "ExceptionFeedbackTemplate_Message": "Tell us what happened after this line: (You don't need to include the error message, we will attach it for you!)", - - "Feedback": "User Feedback", - "FeedbackSending": "Sending your feedback...", - "FeedbackSent": "Feedback sent!", - "FeedbackSendFailure": "Failed to send feedback! Check logs/console for more info.", - - "Tag_Deprecated": "Deprecated", - "Generic_GameFeatureDeprecation": "Due to unforeseen game changes, this feature has been deprecated and will be removed in the future. Using this feature may cause unexpected behavior." + "MissingVcRedist": "Fehlende Visual C/C++ Redistributable", + "MissingVcRedistSubtitle": "Um diese Funktion auszuführen, muss Visual C/C++ Redistributable installiert sein. Möchtest du es jetzt herunterladen?\r\nHinweis: Dadurch wird ein Browserfenster geöffnet und eine Datei von Microsoft heruntergeladen. Bitte führe das Installationsprogramm nach dem Herunterladen aus, starte Collapse neu und versuche es erneut.\r\nFalls du es bereits installiert hast, der Fehler aber weiterhin auftritt, sende uns bitte ein Support-Ticket.", + "ExceptionFeedbackBtn": "Erzähl uns, was passiert ist", + "ExceptionFeedbackBtn_Unavailable": "Der Absturzbericht ist deaktiviert oder nicht verfügbar", + "ExceptionFeedbackBtn_FeedbackSent": "Das Feedback wurde gesendet!", + "ExceptionFeedbackTitle": "Erzähl uns, was passiert ist:", + "ExceptionFeedbackTemplate_User": "Benutzername (Optional):", + "ExceptionFeedbackTemplate_Email": "E-Mail (Optional):", + "ExceptionFeedbackTemplate_Message": "Erzähle uns nach dieser Zeile, was passiert ist: (Die Fehlermeldung musst du nicht angeben, wir fügen sie für dich bei!)", + + "Feedback": "Nutzer-Feedback", + "FeedbackSending": "Dein Feedback wird gesendet...", + "FeedbackSent": "Feedback wurde gesendet!", + "FeedbackSendFailure": "Das Senden des Feedbacks ist fehlgeschlagen! Weitere Informationen findest du in den Protokollen/der Konsole.", + + "Tag_Deprecated": "Veraltet", + "Generic_GameFeatureDeprecation": "Aufgrund unvorhergesehener Änderungen am Spiel wurde diese Funktion als veraltet eingestuft und wird in Zukunft entfernt. Die Verwendung dieser Funktion kann zu unerwartetem Verhalten führen." }, "_BackgroundNotification": { @@ -1004,18 +1011,18 @@ "_Dialogs": { "DeltaPatchDetectedTitle": "Achtung: Delta-Patch Update wurde erkannt!", "DeltaPatchDetectedSubtitle": "Delta-Patch wird genutzt, um dein Spiel von {0} zu {1} zu aktualisieren.\nDenke daran, dass du möglicherweise noch Spieldateien im Spiel herunterladen musst.\n\nWillst du fortfahren?", - "DeltaPatchPrevFailedTitle": "Der letzte Delta-Patch wurde falsch angewendet oder konnte nicht vollständig beendet werden!", - "DeltaPatchPrevFailedSubtitle": "Der vorherige Delta-Patch konnte nicht angewendet werden. Möchtest du dein Spiel wiederherstellen, um einen erneuten Download zu vermeiden?", + "DeltaPatchPrevFailedTitle": "Letzter Delta-Patch wurde falsch angewendet oder nicht vollständig beendet!", + "DeltaPatchPrevFailedSubtitle": "Der vorherige Delta-Patch konnte nicht angewendet werden. Möchtest du dein Spiel wiederherstellen, um einen Neudownload zu vermeiden?", "DeltaPatchPreReqTitle": "Für den Delta-Patch ist ein zusätzlicher Dateidownload erforderlich!", - "DeltaPatchPreReqSubtitle1": "Additional file download is required for this game before applying delta patch. Around ", - "DeltaPatchPreReqSubtitle2": " is required to be downloaded and some of these files might contains audio package deltas.", + "DeltaPatchPreReqSubtitle1": "Für dieses Spiel muss vor der Installation des Delta-Patches zusätzliche Dateien heruntergeladen werden. Etwa ", + "DeltaPatchPreReqSubtitle2": " Dateien müssen heruntergeladen werden, wobei einige dieser Dateien möglicherweise Audio-Paket-Deltas enthalten.", "DeltaPatchPreReqSubtitle3": "Möchtest du fortfahren?", - "DeltaPatchPreReqSubtitle4": "(Click \"", - "DeltaPatchPreReqSubtitle5": "\" to continue or \"", - "DeltaPatchPreReqSubtitle6": "\" to use normal update or \"", - "DeltaPatchPreReqSubtitle7": "\" to cancel the update)", - "GameConversionPrevFailedTitle": "Die vorherige Spielkonvertierung ist entweder fehlgeschlagen oder wurde nicht abgeschlossen!", - "GameConversionPrevFailedSubtitle": "Die vorherige Spielkonvertierung ist fehlgeschlagen. Möchtest du dein Spiel wiederherstellen, um ein erneutes Herunterladen zu verhindern?", + "DeltaPatchPreReqSubtitle4": "(Klicke \"", + "DeltaPatchPreReqSubtitle5": "\" um fortzufahren oder \"", + "DeltaPatchPreReqSubtitle6": "\", um Update normal durchzuführen oder \"", + "DeltaPatchPreReqSubtitle7": "\" um das Update abzubrechen)", + "GameConversionPrevFailedTitle": "Vorherige Spielkonvertierung schlug fehl oder wurde nicht abgeschlossen!", + "GameConversionPrevFailedSubtitle": "Die vorherige Spielkonvertierung ist fehlgeschlagen. Möchtest du dein Spiel wiederherstellen, um einen Neudownload zu verhindern?", "PreloadVerifiedTitle": "Vorabladepaket wurde verifiziert!", "PreloadVerifiedSubtitle": "Dein Vorabladepaket ist verifiziert und bereit für die Installation!", "LocateInstallTitle": "Installationsordner wird gesucht", @@ -1034,10 +1041,10 @@ "RepairCompletedSubtitleNoBroken": "Keine fehlerhaften Dateien gefunden.", "ExtremeGraphicsSettingsWarnTitle": "Sehr hohe Voreinstellung gewählt!", "ExtremeGraphicsSettingsWarnSubtitle": "Du bist dabei, die Voreinstellung auf \"Sehr Hoch\" zu setzen!\nDie Voreinstellung \"Sehr hoch\" ist im Wesentlichen ein 2-fache Render-Skalierung mit MSAA aktiviert und ist SEHR UNOPTIMIERT!\n\nBist du sicher, dass du diese Einstellung verwenden willst?", - "MigrateExistingMoveDirectoryTitle": "Moving Existing Installation for: {0}", - "MigrateExistingInstallChoiceTitle": "An Existing Installation of {0} is Detected!", - "MigrateExistingInstallChoiceSubtitle1": "You have an existing installation of the game using {0} on this directory:", - "MigrateExistingInstallChoiceSubtitle2": "You have an option to move your existing game data into another directory or use the current directory as the existing one. It's recommended that you use the current directory as the one already installed to ensure that you can still launch your game using {0}.", + "MigrateExistingMoveDirectoryTitle": "Verschieben einer bestehenden Installation für: {0}", + "MigrateExistingInstallChoiceTitle": "Es wurde eine vorhandene Installation von {0} erkannt!", + "MigrateExistingInstallChoiceSubtitle1": "Du hast bereits eine Installation des Spiels unter Verwendung von {0} in diesem Verzeichnis:", + "MigrateExistingInstallChoiceSubtitle2": "Du hast die Möglichkeit, deine vorhandenen Spieldaten in ein anderes Verzeichnis zu verschieben oder das aktuelle Verzeichnis als das bereits vorhandene zu verwenden. Es wird empfohlen, das aktuelle Verzeichnis als das bereits installierte zu verwenden, um sicherzustellen, dass du dein Spiel weiterhin über {0} starten kannst.", "ExistingInstallTitle": "Vorhandene Installation erkannt!", "ExistingInstallSubtitle": "Das Spiel wurde bereits installiert unter:\n\n{0}\n\nEs wird empfohlen das Spiel für bessere Unterstützung und Integration zum Collapse Launcher zu migrieren.\nDu kannst nach wie vor den offiziellen Launcher nutzen, um das Spiel zu starten.\n\nMöchtest du fortfahren?", "ExistingInstallBHI3LTitle": "Bestehende Installation über BetterHI3Launcher erkannt!", @@ -1045,23 +1052,23 @@ "ExistingInstallSteamTitle": "Bestehende Installation über Steam erkannt!", "ExistingInstallSteamSubtitle": "Das Spiel wurde bereits auf Steam installiert unter:\n\n{0}\n\nMöchtest du diese Version in die Nicht-Steam Globale Version umwandeln?\nHinweis: Sobald du die Konvertierung eingeleitet hast, kannst du dich nicht mehr mit deinem Steam-Konto anmelden. Es wird nur noch die Login-Methode für das miHoYo/HoYoverse-Konto verfügbar sein.\n\nMöchtest du mit der Umwandlung und Migration fortfahren?", "SteamConvertNeedMigrateTitle": "Ordnermigration erforderlich", - "SteamConvertNeedMigrateSubtitle": "Du musst den Installationsordner des Spiels an einen anderen Ort verschieben, da Collapse keine Berechtigung hat, in dieses Verzeichnis zu schreiben.\nEs wird empfohlen, den Speicherort in den CollapseLauncher Spielordner zu verschieben.\n\nMöchtest du es in den CollapseLauncher Spielordner verschieben?", + "SteamConvertNeedMigrateSubtitle": "Du musst den Installationsordner des Spiels an einen anderen Ort verschieben, da Collapse keine Berechtigung hat, in dieses Verzeichnis zu schreiben.\nEs wird empfohlen, den Speicherort in den Collapse Launcher Spielordner zu verschieben.\n\nMöchtest du es in den Collapse Launcher Spielordner verschieben?", "SteamConvertIntegrityDoneTitle": "Integritätsprüfung abgeschlossen!", "SteamConvertIntegrityDoneSubtitle": "Überprüfung der Integrität der Spieldaten abgeschlossen! Der Umwandlungsprozess wird mindestens {0} Dateien herunterladen.\nDu kannst fortfahren oder abbrechen und später wiederkommen.\n\nMöchtest du den Umwandlungsprozess starten?", "SteamConvertFailedTitle": "Konvertierung fehlgeschlagen!", "SteamConvertFailedSubtitle": "Der Umwandlungsprozess ist fehlgeschlagen :(\nBitte versuche, den Konvertierungsprozess erneut zu starten.", "InstallDataCorruptTitle": "Spielinstallation beschädigt", "InstallDataCorruptSubtitle": "Eine der heruntergeladenen Dateien ist beschädigt.\n\nServer Hash: {0}\nHeruntergeladener Hash: {1}\n\nMöchtest du versuchen, die Datei erneut herunterzuladen?", - "InstallCorruptDataAnywayTitle": "Extract Corrupted Data", - "InstallCorruptDataAnywaySubtitle1": "You're about to extract this corrupted data: ", + "InstallCorruptDataAnywayTitle": "Beschädigte Daten extrahieren", + "InstallCorruptDataAnywaySubtitle1": "Du bist dabei, diese beschädigten Daten zu extrahieren: ", "InstallCorruptDataAnywaySubtitle2": "{0} - {1} ({2} bytes)", - "InstallCorruptDataAnywaySubtitle3": ". Keep in-mind that the extraction for this data might fail or renders the game fail to run.\r\n\r\nAre you sure to extract this data anyway?", + "InstallCorruptDataAnywaySubtitle3": ". Bitte beachte, dass das Extrahieren dieser Daten fehlschlagen oder dazu führen kann, dass das Spiel nicht mehr läuft.\r\n\r\nMöchtest du diese Daten trotzdem extrahieren?", "InstallDataDownloadResumeTitle": "Download fortsetzen?", "InstallDataDownloadResumeSubtitle": "Du hast bereits {0}/{1} des Spiels heruntergeladen.\n\nWillst du den Download fortsetzen?", "InsufficientDiskTitle": "Unzureichender Speicherplatz", - "InsufficientDiskSubtitle": "You do not have enough free space to install this game on your {2} drive!\r\n\r\nFree Space: {0}\r\nRequired Space: {1}\r\n\r\nPlease ensure that you have enough disk space before proceeding with the installation.", - "RelocateFolderTitle": "App-Datenordner verschieben", - "RelocateFolderSubtitle": "Du verwendest derzeit folgenden Ordner als deinen App-Datenordner:\n\n{0}\n\nMöchtest du den Speicherort ändern?", + "InsufficientDiskSubtitle": "Auf Laufwerk {2} ist nicht genügend Speicherplatz vorhanden, um dieses Spiel zu installieren!\r\n\r\nFreier Speicherplatz: {0}\r\nErforderlicher Speicherplatz: {1}\r\n\r\nBitte stelle sicher, dass genügend Speicherplatz vorhanden ist, bevor du mit der Installation fortfährst.", + "RelocateFolderTitle": "Launcher-Datenordner verschieben", + "RelocateFolderSubtitle": "Du verwendest derzeit folgenden Ordner als deinen Launcher-Datenordner:\n\n{0}\n\nMöchtest du den Speicherort ändern?", "UninstallGameTitle": "Deinstalliere Spiel: {0}", "UninstallGameSubtitle": "Du bist dabei das Spiel zu deinstallieren, welches sich in\n\n{0}\n\nbefindet. Fortfahren?", "MigrationTitle": "Zielordner suchen", @@ -1078,14 +1085,14 @@ "GameConfigBrokenSubtitle1": "Die Konfiguration des Launcher-Scopes ist fehlerhaft. Bitte wähle den bisherigen Spielpfad manuell.", "GameConfigBrokenSubtitle2": "\nStelle sicher, dass der Speicherort des Spiels nicht mit dem Pfad der \"config.ini\"-Datei deines Launchers übereinstimmt, welche sich unter folgender Adresse befindet:\n\n{0}\n\n", "GameConfigBrokenSubtitle3": "Wenn dies zutrifft, verschiebe bitte alle deine Spieldateien an einen anderen Ort und klicke dann auf \"Verzeichnis suchen\", um den Pfad auszuwählen.", - "CookbookLocateTitle": "Cookbook-Datei suchen", - "CookbookLocateSubtitle1": "Bitte suche das heruntergeladene Cookbook, bevor du den Prozess startest.\nWenn du es noch nicht heruntergeladen hast, ", + "CookbookLocateTitle": "Rezeptbuch-Datei suchen", + "CookbookLocateSubtitle1": "Bitte suche das heruntergeladene Rezeptbuch, bevor du den Prozess startest.\nWenn du es noch nicht heruntergeladen hast, ", "CookbookLocateSubtitle2": "HIER KLICKEN", - "CookbookLocateSubtitle3": " um die Cookbook-Datei herunterzuladen und klicke dann auf", + "CookbookLocateSubtitle3": " um die Rezeptbuch-Datei herunterzuladen und klicke dann auf", "CookbookLocateSubtitle4": "Weiter", - "CookbookLocateSubtitle5": "um die heruntergeladene Cookbook-Datei zu finden, bevor du fortfährst.\n\n", + "CookbookLocateSubtitle5": "um die heruntergeladene Rezeptbuch-Datei zu finden, bevor du fortfährst.\n\n", "CookbookLocateSubtitle6": "Hinweis:\n", - "CookbookLocateSubtitle7": "Hier ist der Name der Cookbook-Datei, die du herunterladen möchtest:\n", + "CookbookLocateSubtitle7": "Hier ist der Name der Rezeptbuch-Datei, die du herunterladen möchtest:\n", "PrivilegeMustRunTitle": "Collapse erfordert erhöhte Berechtigungen!", "PrivilegeMustRunSubtitle": "Collapse erfordert Administratorrechte, um richtig zu funktionieren. Möchtest du Collapse als Administrator neu starten?", @@ -1095,9 +1102,9 @@ "ReleaseChannelChangeSubtitle2": "Hinweis:", "ReleaseChannelChangeSubtitle3": "Diese Aktion kann zu unwiderruflichen Änderungen führen und/oder dazu, dass Dinge in deinem aktuellen Setup nicht mehr funktionieren. Wir sind nicht verantwortlich für den Verlust oder die Beschädigung von Daten, die mit deinem Spiel verbunden sind.", - "ForceUpdateCurrentInstallTitle": "Force-update Current Installation", - "ForceUpdateCurrentInstallSubtitle1": "You are about to perform a forced-update to your current:", - "ForceUpdateCurrentInstallSubtitle2": "installation and we recommend you to close your currently opened game(s).", + "ForceUpdateCurrentInstallTitle": "Aktuelle Installation zwangsweise aktualisieren", + "ForceUpdateCurrentInstallSubtitle1": "Du bist dabei, eine erzwungene Aktualisierung deiner aktuellen:", + "ForceUpdateCurrentInstallSubtitle2": "Installation. Wir empfehlen dir, alle derzeit geöffneten Spiele zu schließen.", "ChangePlaytimeTitle": "Bist du sicher, dass du deine Spielzeit ändern willst?", "ChangePlaytimeSubtitle": "Das Ändern der Spielzeit bedeutet, dass der aktuelle Wert mit dem soeben eingegebenen Wert überschrieben wird.", @@ -1105,226 +1112,238 @@ "ResetPlaytimeSubtitle": "Das Zurücksetzen der Spielzeit bedeutet, dass der Spielzeitzähler auf 0 zurückgesetzt wird. Dies ist eine ", "ResetPlaytimeSubtitle2": "zerstörerische", "ResetPlaytimeSubtitle3": " aktion, d. h. du kannst sie nicht rückgängig machen, sobald du sie bestätigt hast. \n\nMöchtest du fortfahren?\n\nHinweis: Dies hat keine Auswirkung auf die Funktionsweise von Collapse und du kannst diesen Wert jederzeit wieder ändern, wenn du das Spiel nicht spielst.", - "InvalidPlaytimeTitle": "There was a problem saving this session's playtime", - "InvalidPlaytimeSubtitle1": "The difference between the starting and ending times results in a negative number.", - "InvalidPlaytimeSubtitle2": "A fallback value is saved every minute and will be used instead:", - "InvalidPlaytimeSubtitle3": "Please refrain from adjusting the computer clock while in-game.", + "InvalidPlaytimeTitle": "Beim Speichern der Spielzeit dieser Sitzung ist ein Problem aufgetreten", + "InvalidPlaytimeSubtitle1": "Die Differenz zwischen Start- und Endzeit ergibt eine negative Zahl.", + "InvalidPlaytimeSubtitle2": "Ein Ausweichwert wird jede Minute gespeichert und wird stattdessen verwendet:", + "InvalidPlaytimeSubtitle3": "Bitte nehmen keine Änderungen an der Systemzeit vor, während das Spiel läuft.", "LocateExePathTitle": "Installationspfad der Anwendung suchen", - "LocateExePathSubtitle": "Bitte verweise Collapse auf den Ort, an dem sich die ausführbare Datei deiner Anwendung befindet:", + "LocateExePathSubtitle": "Bitte verweise Collapse auf den Ort, an dem sich die ausführbare Datei des Werkzeugs befindet:", "CannotUseAppLocationForGameDirTitle": "Der Ordner ist ungültig!", "CannotUseAppLocationForGameDirSubtitle": "Du kannst diesen Ordner nicht verwenden, da er als Systemordner oder für die ausführbare Hauptdatei der Anwendung verwendet wird. Bitte wähle einen anderen Ordner!", - "InvalidGameDirNewTitleFormat": "Path is Invalid: {0}", - "InvalidGameDirNewSubtitleSelectedPath": "Selected Path:", - "InvalidGameDirNewSubtitleSelectOther": "Please select another folder/location!", - "InvalidGameDirNew1Title": "Folder is invalid!", - "InvalidGameDirNew1Subtitle": "You can't use this folder as it is being used as a system folder or being used for main executable of the app. Please choose another folder!", - "InvalidGameDirNew2Title": "Cannot access the selected folder", - "InvalidGameDirNew2Subtitle": "The launcher does not have permission to access this folder!", - "InvalidGameDirNew3Title": "Cannot select root drive", - "InvalidGameDirNew3Subtitle": "You have selected a path on top of the root drive, which is forbidden!", - "InvalidGameDirNew4Title": "Cannot select Windows folder", - "InvalidGameDirNew4Subtitle": "You cannot use Windows folder as Game Installation Location to avoid any unnecessary that might happen.", - "InvalidGameDirNew5Title": "Cannot select Program Data folder", - "InvalidGameDirNew5Subtitle": "You cannot use Program Data folder as Game Installation Location to avoid any unnecessary that might happen.", - "InvalidGameDirNew6Title": "Cannot select Program Files or Program Files (x86) folder", - "InvalidGameDirNew6Subtitle": "You cannot use Program Files or Program Files (x86) folder as Game Installation Location to avoid any unnecessary that might happen.", - "FolderDialogTitle1": "Select Game Installation Location", + "InvalidGameDirNewTitleFormat": "Der Pfad ist ungültig: {0}", + "InvalidGameDirNewSubtitleSelectedPath": "Ausgewählter Pfad:", + "InvalidGameDirNewSubtitleSelectOther": "Bitte einen anderen Ordner/Speicherort auswählen!", + "InvalidGameDirNew1Title": "Der Ordner ist ungültig!", + "InvalidGameDirNew1Subtitle": "Dieser Ordner kann nicht verwendet werden, da er als Systemordner oder für die Hauptausführungsdatei der App genutzt wird. Bitte wähle einen anderen Ordner!", + "InvalidGameDirNew2Title": "Auf den ausgewählten Ordner kann nicht zugegriffen werden", + "InvalidGameDirNew2Subtitle": "Der Launcher hat keine Berechtigung, auf diesen Ordner zuzugreifen!", + "InvalidGameDirNew3Title": "Das Stammlaufwerk kann nicht ausgewählt werden", + "InvalidGameDirNew3Subtitle": "Du hast einen Pfad über dem Stammverzeichnis ausgewählt, was nicht erlaubt ist!", + "InvalidGameDirNew4Title": "Windows-Ordner kann nicht ausgewählt werden", + "InvalidGameDirNew4Subtitle": "Du kannst den Windows-Ordner nicht als Installationsort für das Spiel verwenden, um mögliche Probleme zu vermeiden.", + "InvalidGameDirNew5Title": "Der Programmdatenordner kann nicht ausgewählt werden", + "InvalidGameDirNew5Subtitle": "Du kannst den Programmdatenordner nicht als Installationsort für das Spiel verwenden, um mögliche Probleme zu vermeiden.", + "InvalidGameDirNew6Title": "Der Ordner „Programme“ oder „Programme (x86)“ kann nicht ausgewählt werden", + "InvalidGameDirNew6Subtitle": "Verwende den Ordner „Programme“ oder „Programme (x86)“ nicht als Installationsort für das Spiel, um mögliche Probleme zu vermeiden.", + "FolderDialogTitle1": "Installationsort für das Spiel auswählen", "StopGameTitle": "Beenden des Spiels erzwingen", "StopGameSubtitle": "Bist du sicher, dass du den Abbruch des laufenden Spiels erzwingen willst?\nDu könntest einige Fortschritte im Spiel verlieren.", - "MeteredConnectionWarningTitle": "Metered Connection Detected!", - "MeteredConnectionWarningSubtitle": "Your current internet connection was detected as being 'Metered'! Continuing the update process may incur additional charges from your internet provider. Do you wish to proceed?", - - "ResetKbShortcutsTitle": "Are you sure you want to reset all shortcuts?", - "ResetKbShortcutsSubtitle": "This means every shortcut will be changed to their default key combination. \n\nDo you wish to proceed?\n\nNote: This has no impact on how Collapse operates and you can still change the combination of shortcuts by accessing the Keyboard Shortcuts menu.", - - "OperationErrorDiskSpaceInsufficientTitle": "Disk Space for Drive: {0} is Insufficient!", - "OperationErrorDiskSpaceInsufficientMsg": "You do not have enough free space to do the operation on your {2} drive!\r\n\r\nFree Space: {0}\r\nRequired Space: {1}.\r\n\r\nPlease ensure that you have enough disk space before proceeding.", - - "OperationWarningNotCancellableTitle": "Attention: This Operation is NOT CANCELLABLE!", - "OperationWarningNotCancellableMsg1": "You might need to check that you don't have any heavy tasks running on your computer to avoid possible issues while the process is running. Keep in-mind that you ", - "OperationWarningNotCancellableMsg2": "CANNOT CANCEL THIS PROCESS", - "OperationWarningNotCancellableMsg3": " while it's running!\r\n\r\nClick \"", - "OperationWarningNotCancellableMsg4": "\" to start the process or \"", - "OperationWarningNotCancellableMsg5": "\" to cancel the operation.", - - "GenericWarningExceptionTitle": "Warning", - "GenericWarningExceptionSubtitle": "This isn't a major issue, but we thought we should let you know:", - - "ShortcutCreationConfirmTitle": "Are you sure you want to continue?", - "ShortcutCreationConfirmSubtitle1": "A shortcut will be created in the following path:", - "ShortcutCreationConfirmSubtitle2": "If there is already a shortcut with the same name in this folder, it will be replaced.", - "ShortcutCreationConfirmCheckBox": "Automatically start game after using this shortcut", - "ShortcutCreationSuccessTitle": "Success!", - "ShortcutCreationSuccessSubtitle1": "A shiny new shortcut was created!", - "ShortcutCreationSuccessSubtitle2": "Location: ", - "ShortcutCreationSuccessSubtitle3": "Notes:", - "ShortcutCreationSuccessSubtitle4": " • Using this shortcut will start the game after loading the region.", - "ShortcutCreationSuccessSubtitle5": " • If the game is not installed/updated, Collapse will try to install/update it. Please note that dialogs related to these processes will still be shown.", - - "SteamShortcutCreationConfirmTitle": "Are you sure you want to continue?", - "SteamShortcutCreationConfirmSubtitle1": "A shortcut will be added to every Steam user in this computer.", - "SteamShortcutCreationConfirmSubtitle2": "If already added, the assets related to the shortcut will be verified.", - "SteamShortcutCreationConfirmCheckBox": "Automatically start game after using this shortcut", - "SteamShortcutCreationSuccessTitle": "Success!", - "SteamShortcutCreationSuccessSubtitle1": "A new shiny shortcut was added to every Steam users in this computer!", - "SteamShortcutCreationSuccessSubtitle2": "Notes:", - "SteamShortcutCreationSuccessSubtitle3": " • Using this shortcut will start the game after loading the region.", - "SteamShortcutCreationSuccessSubtitle4": " • Running this process again will fix any corrupted/missing images belonging to the shortcut.", - "SteamShortcutCreationSuccessSubtitle5": " • New shortcuts will only be shown after Steam is reloaded.", - "SteamShortcutCreationSuccessSubtitle6": " • In order to use the Steam overlay, Steam needs to be run as administrator and Collapse must either be fully closed or have the \"Multiple Instances\" option enabled in the settings.", - "SteamShortcutCreationSuccessSubtitle7": " • If the game is not installed/updated, Collapse will try to install/update it. Please note that dialogs related to these processes will still be shown.", + "MeteredConnectionWarningTitle": "Getaktete Verbindung erkannt!", + "MeteredConnectionWarningSubtitle": "Deine aktuelle Internetverbindung wurde als begrenzt erkannt! Wenn du den Aktualisierungsvorgang fortsetzt, können zusätzliche Kosten seitens deines Internetanbieters anfallen. Möchtest du fortfahren?", + + "ResetKbShortcutsTitle": "Möchtest du wirklich alle Tastenkombinationen zurücksetzen?", + "ResetKbShortcutsSubtitle": "Das bedeutet, dass alle Tastenkombinationen auf ihre Standardwerte zurückgesetzt werden. \n\nMöchtest du fortfahren?\n\nHinweis: Dies hat keine Auswirkungen auf die Funktionsweise von Collapse, und du kannst die Tastenkombinationen weiterhin über das Menü „Tastenkombinationen“ ändern.", + + "OperationErrorDiskSpaceInsufficientTitle": "Der Speicherplatz auf Laufwerk: {0} reicht nicht aus!", + "OperationErrorDiskSpaceInsufficientMsg": "Auf dem Laufwerk {2} ist nicht genügend Speicherplatz für den Vorgang vorhanden!\r\n\r\nFreier Speicherplatz: {0}\r\nErforderlicher Speicherplatz: {1}.\r\n\r\nBitte stelle sicher, dass genügend Speicherplatz vorhanden ist, bevor du fortfährst.", + + "OperationWarningNotCancellableTitle": "Achtung: Dieser Vorgang kann NICHT abgebrochen werden!", + "OperationWarningNotCancellableMsg1": "Eventuell muss überprüft werden, ob auf Ihrem Computer keine ressourcenintensiven Aufgaben ausgeführt werden, um mögliche Probleme während des Vorgangs zu vermeiden. Bitte beachte, dass ", + "OperationWarningNotCancellableMsg2": "DIESER VORGANG NICHT ABGEBROCHEN WERDEN KANN", + "OperationWarningNotCancellableMsg3": " während es läuft!\r\n\r\nKlicke \"", + "OperationWarningNotCancellableMsg4": "\" um den Prozess zu starten oder \"", + "OperationWarningNotCancellableMsg5": "\" um den Vorgang abzubrechen.", + + "GenericWarningExceptionTitle": "Warnung", + "GenericWarningExceptionSubtitle": "Das ist kein großes Problem, aber wir dachten, wir sollten dich darüber informieren:", + + "ShortcutCreationConfirmTitle": "Bist du sicher, dass du fortfahren möchtest?", + "ShortcutCreationConfirmSubtitle1": "Es wird eine Verknüpfung unter folgendem Pfad erstellt:", + "ShortcutCreationConfirmSubtitle2": "Wenn in diesem Ordner bereits eine Verknüpfung mit demselben Namen vorhanden ist, wird diese ersetzt.", + "ShortcutCreationConfirmCheckBox": "Das Spiel nach Verwendung dieser Verknüpfung automatisch starten", + "ShortcutCreationSuccessTitle": "Erfolg!", + "ShortcutCreationSuccessSubtitle1": "Eine brandneue Verknüpfung wurde erstellt!", + "ShortcutCreationSuccessSubtitle2": "Pfad: ", + "ShortcutCreationSuccessSubtitle3": "Anmerkungen:", + "ShortcutCreationSuccessSubtitle4": " • Bei Verwendung dieser Tastenkombination wird das Spiel nach dem Laden der Region gestartet.", + "ShortcutCreationSuccessSubtitle5": " • Ist das Spiel nicht installiert oder auf dem neuesten Stand, versucht Collapse, es zu installieren bzw. zu aktualisieren. Bitte beachte, dass die zu diesen Vorgängen gehörenden Dialogfelder weiterhin angezeigt werden.", + + "SteamShortcutCreationConfirmTitle": "Bist du sicher, dass du fortfahren möchtest?", + "SteamShortcutCreationConfirmSubtitle1": "Eine Verknüpfung wird für jeden Steam-Benutzer auf diesem Computer hinzugefügt.", + "SteamShortcutCreationConfirmSubtitle2": "Falls bereits hinzugefügt, werden die mit der Verknüpfung verbundenen Assets überprüft.", + "SteamShortcutCreationConfirmCheckBox": "Das Spiel nach Verwendung dieser Verknüpfung automatisch starten", + "SteamShortcutCreationSuccessTitle": "Erfolg!", + "SteamShortcutCreationSuccessSubtitle1": "Eine brandneue Verknüpfung wurde für jeden Steam-Benutzer auf diesem Computer erstellt!", + "SteamShortcutCreationSuccessSubtitle2": "Anmerkungen:", + "SteamShortcutCreationSuccessSubtitle3": " • Bei Verwendung dieser Tastenkombination wird das Spiel nach dem Laden der Region gestartet.", + "SteamShortcutCreationSuccessSubtitle4": " • Wenn dieser Vorgang erneut ausgeführt wird, werden alle beschädigten oder fehlenden Bilder, die zu der Verknüpfung gehören, wiederhergestellt.", + "SteamShortcutCreationSuccessSubtitle5": " • Neue Verknüpfungen werden erst nach dem Neustart von Steam angezeigt.", + "SteamShortcutCreationSuccessSubtitle6": " • Um das Steam-Overlay nutzen zu können, muss Steam als Administrator ausgeführt werden, und Collapse muss entweder vollständig geschlossen sein oder die Option „Mehrere Instanzen“ in den Einstellungen aktiviert haben.", + "SteamShortcutCreationSuccessSubtitle7": " • Ist das Spiel nicht installiert oder auf dem neuesten Stand, versucht Collapse, es zu installieren bzw. zu aktualisieren. Bitte beachte, dass die zu diesen Vorgängen gehörenden Dialogfelder weiterhin angezeigt werden.", "SteamShortcutCreationSuccessSubtitle8": " Additionally, the \"Launch Game With Explorer As Parent\" option in the region's Advanced Settings must be disabled.", - "SteamShortcutCreationFailureTitle": "Invalid Steam data folder", - "SteamShortcutCreationFailureSubtitle": "It was not possible to find a valid userdata folder.\n\nPlease be sure to login at least once to the Steam client before trying to use this functionality.", - "SteamShortcutTitle": "Steam Shortcut", - "SteamShortcutDownloadingImages": "Downloading Steam Grid Images ({0}/{1})", - - "DownloadSettingsTitle": "Download Settings", - "DownloadSettingsOption1": "Start game after install", - - "OpenInExternalBrowser": "Open in External Browser", - "CloseOverlay": "Close Overlay", - - "DbGenerateUid_Title": "Are you sure you wish to change your user ID?", - "DbGenerateUid_Content": "Changing the current user ID will cause the associated data to be lost if you lose it.", - - "SophonIncrementUpdateUnavailTitle": "Incremental Update is Unavailable: Version is Too Obsolete!", - "SophonIncrementUpdateUnavailSubtitle1": "Your game version: {0}", - "SophonIncrementUpdateUnavailSubtitle2": " is too obsolete", - "SophonIncrementUpdateUnavailSubtitle3": " and incremental update for your version is not available. However, you could still update your game by re-downloading the entire thing from scratch.", - "SophonIncrementUpdateUnavailSubtitle4": "Click \"{0}\" to continue updating the entire thing or click \"{1}\" to cancel the process", - - "SophonAdditionalPkgAvailableUpdateTitle": "Additional Packages are Available to Update!", - "SophonAdditionalPkgAvailableDownloadTitle": "Additional Packages are Available to Download!", - - "SophonAdditionalPkgAvailableSubtitle1": "Your game has additional packages that can be downloaded. The size of the additional data is:", - "SophonAdditionalPkgAvailableSubtitle2": ". In total, you may require to download:", - "SophonAdditionalPkgAvailableSubtitle3": "of data if you wish to include the additional packages.", - "SophonAdditionalPkgAvailableSubtitle4": "Click", - "SophonAdditionalPkgAvailableSubtitle5": "if you want to download the additional package or click", - "SophonAdditionalPkgAvailableSubtitle6": "if you only need to download the base files with only:", - "SophonAdditionalPkgAvailableSubtitle7": "in total size.", - "SophonAdditionalPkgAvailableFootnote1": "Note:", - "SophonAdditionalPkgAvailableFootnote2": "You might be required to download the additional packages later in-game if you choose to download the base files only.", - "SophonAdditionalPkgSeeDetailsBtn": "See Additional Package Details", - "SophonAdditionalConfirmYesBtn": "Download All", - "SophonAdditionalConfirmNoBtn": "Download Base Only", - - "UACWarningTitle": "Warning: UAC Disabled Detected", - "UACWarningContent": "Disabling User Account Control (UAC) is never a good idea.\nThe security of the OS will be compromised and the game may not run properly.\n\nClick the \"Learn More\" button to see how to enable UAC.\nThe related entry is: Run all administrators in Admin Approval Mode.", - "UACWarningLearnMore": "Learn More", - "UACWarningDontShowAgain": "Don't Show Again", - - "EnsureExitTitle": "Exiting Application", - "EnsureExitSubtitle": "There are critical operations running in the background.", - "EnsureExitSubtitle2": "Are you sure you want to exit?", - - "UserFeedback_DialogTitle": "Share Your Thoughts", - "UserFeedback_TextFieldTitleHeader": "Feedback Title", - "UserFeedback_TextFieldTitlePlaceholder": "Write your feedback's title here...", - "UserFeedback_TextFieldMessageHeader": "Message", - "UserFeedback_TextFieldMessagePlaceholder": "Message...", - "UserFeedback_TextFieldRequired": "(required)", - "UserFeedback_RatingText": "Mind to share your ratings?", - "UserFeedback_CancelBtn": "Cancel", - "UserFeedback_SubmitBtn": "Submit your feedback", - "UserFeedback_SubmitBtn_Processing": "Processing...", - "UserFeedback_SubmitBtn_Completed": "Completed!", - "UserFeedback_SubmitBtn_Cancelled": "Cancelled!", - - "PluginManagerUpdateAvailableTitle": "You have {0} plugin(s) ready to be updated!", - "PluginManagerUpdateAvailableSubtitle1": "There are {0} plugin(s) update available. The launcher is required to be restarted in order to apply update to these plugins:", - "PluginManagerUpdateAvailableSubtitle2": "Do you wish to restart the launcher?", - "PluginManagerUpdateAvailableCancelBtn": "Later", - "PluginManagerUpdateAvailableConfirmBtn": "Restart Now!", - "PluginManagerUpdateAvailableToManagerMenuBtn": "Go to {0}", - - "LauncherRestartTitle": "Restarting Collapse Launcher", - "LauncherRestartSubtitle1": "You're about to restart the launcher. Make sure to close or cancel any background activity before restarting your launcher.", - "LauncherRestartSubtitle2": "Are you sure to restart the launcher?", - - "PostInstallBehaviour_Title": "Post Install/Update Behaviour", - "PostInstallBehaviour_Subtitle": "Behaviour after successful install/update", - "PostInstallBehaviour_Subtitle2": "Timeout before restart/shutdown", - "PostInstallBehaviour_EnumNothing": "Do Nothing", - "PostInstallBehaviour_EnumStartGame": "Start Game", - "PostInstallBehaviour_EnumHibernate": "Hibernate", - "PostInstallBehaviour_EnumRestart": "Restart Computer", - "PostInstallBehaviour_EnumShutdown": "Shutdown Computer", - - "BgContextMenu_ParallaxPixelShiftCustomDialogTitle": "Set Custom Parallax Pixels (Min: {0}px, Max: {1}px)", - - "Media_ExtNotSupported1": "Sorry but the file extension for the following background image/video file is not supported.", - "Media_ExtNotSupported2": "File Path/URL: {0}", - "Media_ExtNotSupportedTitle": "Background File is not Supported", - "Media_ImageWICNotSupported1": "Sorry but the following background image file is not supported by internal Windows Imaging Component (WIC) decoder. Make sure you have installed the decoder from Microsoft Store.", - "Media_ImageWICNotSupportedTitle": "Image Background File is not Supported", - "Media_VideoMFNotSupportedFormatTypeUnknown": "Unknown", - "Media_VideoMFNotSupported1": "Collapse Launcher has detected that the video background cannot be played due to missing decoder with details below:", - "Media_VideoMFNotSupported2": "Video Codec FourCC: {0}", - "Media_VideoMFNotSupported3": "Video Codec GUID: {0}", - "Media_VideoMFNotSupported4": "Audio Codec GUID: {0}", - "Media_VideoMFNotSupported5": "Can Play Video/Audio?: (Video: {0} | Audio: {1})", - "Media_VideoMFNotSupported6": "We suggest you to install required Media Foundation video/audio codecs by clicking \"{0}\" or use FFmpeg by clicking \"{1}\" button below.", - "Media_VideoMFNotSupported7": "Note:", - "Media_VideoMFNotSupported8": "We strongly recommend you to use FFmpeg as it broadly supports wide range of video/audio codecs and HW Decoding capability (depends on your hardware).", - "Media_VideoMFNotSupportedTitle": "Video Background Codec is not Supported", - "Media_VideoMFNotSupportedCopyDetailsBtn": "Copy Details", - "Media_VideoMFNotSupportedInstallMFCodecsBtn": "Install Media Foundation Codecs", - "Media_VideoMFNotSupportedInstallFFmpegBtn": "Install & Use FFmpeg", - - "Media_VideoMFCodecPrepareTitle": "Preparing Windows Media Foundation Codecs", - "Media_VideoMFCodecPrepare1": "Collapse Launcher requires additional Windows Media Foundation codec to play background videos or other media. This process might trigger false detection by your anti-virus as we uses powershell to invoke these additional codecs installation, so please disable your anti-virus for a brief moment.", - "Media_VideoMFCodecPrepare2": "These additional codecs only includes support for limited video / audio formats, including:", - "Media_VideoMFCodecPrepare3": " • VP9, AV1 (for Video)", - "Media_VideoMFCodecPrepare4": " • Vorbis, Opus (for Audio)", - "Media_VideoMFCodecPrepare5": "You may require to restart your computer manually once the installation is completed. Click on \"", - "Media_VideoMFCodecPrepare6": "\" to proceed.", - "Media_VideoMFCodecPrepareInstallBtn": "Install Media Foundation Codecs", - "Media_VideoMFCodecInstalledTitle": "Windows Media Foundation Codecs has been Installed!", - "Media_VideoMFCodecInstalled1": "Windows Media Foundation Codecs has been installed successfully. Please manually restart your computer to make the codecs work.", - "Media_VideoMFCodecInstallingTitle": "Installing Windows Media Foundation Codecs", - - "Media_VideoFFmpegCodecPrepareTitle": "Preparing FFmpeg", - "Media_VideoFFmpegCodecPrepare1": "Collapse Launcher requires FFmpeg to play background videos or other media. You can either download or use your existing installation.", - "Media_VideoFFmpegCodecPrepare2": "To continue, Click on \"", - "Media_VideoFFmpegCodecPrepare3": "\" to download and install a fresh installation of FFmpeg or Click on \"", - "Media_VideoFFmpegCodecPrepare4": "\" to locate a folder containing FFmpeg installation.", - "Media_VideoFFmpegCodecPrepareInstallBtn": "Download and Install FFmpeg", - "Media_VideoFFmpegCodecPrepareLocateBtn": "Locate & Use Existing Install", - "Media_VideoFFmpegCodecPrepareLocateDialog": "Select your existing FFmpeg installation folder", - "Media_VideoFFmpegCodecPrepareLocateFailedTitle": "Cannot Find Existing FFmpeg Installation", - "Media_VideoFFmpegCodecPrepareLocateFailed1": "Collapse Launcher cannot find an existing installation of FFmpeg in this directory:", - "Media_VideoFFmpegCodecPrepareLocateFailed2": "Note:", - "Media_VideoFFmpegCodecPrepareLocateFailed3": "Make sure you have these following .dll files:", - "Media_VideoFFmpegCodecPrepareLocateSuccessTitle": "Existing FFmpeg Installation is Detected!", - "Media_VideoFFmpegCodecPrepareLocateSuccess1": "We've found an existing FFmpeg installation on this directory:", - "Media_VideoFFmpegCodecInstallingTitle": "Installing FFmpeg", - - "Agreement_ThirdPartyAgreementPreambleTitle": "Preamble", - "Agreement_ThirdPartyAgreementPreamble1": "Collapse Launcher utilizes the following library to enable one or more of its feature.", - "Agreement_ThirdPartyAgreementPreamble2": "We are respecting the owner(s) of the following library and hence, following any rules mentioned within this agreement.", - "Agreement_ThirdPartyAgreementPreamble3": "Click on \"", - "Agreement_ThirdPartyAgreementPreamble4": "\" to continue or \"", - "Agreement_ThirdPartyAgreementPreamble5": "\" to cancel." + "SteamShortcutCreationFailureTitle": "Ungültiger Steam-Datenordner", + "SteamShortcutCreationFailureSubtitle": "Es konnte kein gültiger Benutzerdatenordner gefunden werden.\n\nBitte melde dich mindestens einmal beim Steam-Client an, bevor du diese Funktion nutzen möchtest.", + "SteamShortcutTitle": "Steam Verknüpfung", + "SteamShortcutDownloadingImages": "Lade Steam-Rasterbilder herunter ({0}/{1})", + + "DownloadSettingsTitle": "Download-Einstellungen", + "DownloadSettingsOption1": "Spiel nach der Installation starten", + + "OpenInExternalBrowser": "In externem Browser öffnen", + "CloseOverlay": "Overlay schließen", + + "DbGenerateUid_Title": "Möchtest du deine Benutzer-ID wirklich ändern?", + "DbGenerateUid_Content": "Wenn du die aktuelle Benutzer-ID änderst, gehen die zugehörigen Daten verloren, falls du sie verlierst.", + + "SophonIncrementUpdateUnavailTitle": "Inkrementelles Update ist nicht verfügbar: Die Version ist zu veraltet!", + "SophonIncrementUpdateUnavailSubtitle1": "Deine Spielversion: {0}", + "SophonIncrementUpdateUnavailSubtitle2": " ist zu veraltet", + "SophonIncrementUpdateUnavailSubtitle3": " Ein Inkrement-Update für deine Version ist nicht verfügbar. Du kannst dein Spiel jedoch trotzdem aktualisieren, indem du es komplett neu herunterlädst.", + "SophonIncrementUpdateUnavailSubtitle4": "Klicken Sie auf „{0}“, um die Aktualisierung fortzusetzen, oder auf „{1}“, um den Vorgang abzubrechen", + + "SophonAdditionalPkgAvailableUpdateTitle": "Es stehen weitere Pakete zur Aktualisierung bereit!", + "SophonAdditionalPkgAvailableDownloadTitle": "Es stehen weitere Pakete zum Herunterladen bereit!", + + "SophonAdditionalPkgAvailableSubtitle1": "Für dein Spiel stehen zusätzliche Pakete zum Herunterladen bereit. Die Größe der zusätzlichen Daten beträgt:", + "SophonAdditionalPkgAvailableSubtitle2": ". Insgesamt musst du möglicherweise", + "SophonAdditionalPkgAvailableSubtitle3": "an Daten herunterladen, wenn du die zusätzlichen Pakete installieren möchtest.", + "SophonAdditionalPkgAvailableSubtitle4": "Klicke", + "SophonAdditionalPkgAvailableSubtitle5": "wenn du das Zusatzpaket herunterladen möchtest oder klicke auf", + "SophonAdditionalPkgAvailableSubtitle6": "wenn du lediglich die Basisdateien, die insgesamt nur", + "SophonAdditionalPkgAvailableSubtitle7": "groß sind, herunterladen willst.", + "SophonAdditionalPkgAvailableFootnote1": "Hinweis:", + "SophonAdditionalPkgAvailableFootnote2": "Möglicherweise musst du die zusätzlichen Pakete später im Spiel herunterladen, wenn du dich dafür entscheidest, nur die Basisdateien herunterzuladen.", + "SophonAdditionalPkgSeeDetailsBtn": "Weitere Details zum Paket anzeigen", + "SophonAdditionalConfirmYesBtn": "Alle herunterladen", + "SophonAdditionalConfirmNoBtn": "Nur Basisversion herunterladen", + + "UACWarningTitle": "Warnung: UAC wurde deaktiviert", + "UACWarningContent": "Das Deaktivieren der Benutzerkontensteuerung (UAC) ist niemals eine gute Idee.\nDie Sicherheit des Betriebssystems wird dadurch beeinträchtigt, und das Spiel läuft möglicherweise nicht ordnungsgemäß.\n\nKlicken auf die Schaltfläche „Weitere Informationen“, um zu erfahren, wie man die Benutzerkontensteuerung aktiviert.\nDer entsprechende Eintrag lautet: Alle Administratorrechte im Modus „Administratorgenehmigung“ ausführen.", + "UACWarningLearnMore": "Weitere Informationen", + "UACWarningDontShowAgain": "Nicht erneut anzeigen", + + "EnsureExitTitle": "Anwendung beenden", + "EnsureExitSubtitle": "Es laufen wichtige Prozesse im Hintergrund.", + "EnsureExitSubtitle2": "Möchtest du das Programm wirklich beenden?", + + "UserFeedback_DialogTitle": "Teile uns deine Meinung mit", + "UserFeedback_TextFieldTitleHeader": "Titel der Rückmeldung", + "UserFeedback_TextFieldTitlePlaceholder": "Gib hier den Titel deiner Rückmeldung ein...", + "UserFeedback_TextFieldMessageHeader": "Nachricht", + "UserFeedback_TextFieldMessagePlaceholder": "Nachricht...", + "UserFeedback_TextFieldRequired": "(erforderlich)", + "UserFeedback_RatingText": "Möchtest du deine\nBewertung mit uns teilen?", + "UserFeedback_CancelBtn": "Abbrechen", + "UserFeedback_SubmitBtn": "Feedback versenden", + "UserFeedback_SubmitBtn_Processing": "Wird verarbeitet...", + "UserFeedback_SubmitBtn_Completed": "Fertig!", + "UserFeedback_SubmitBtn_Cancelled": "Abgebrochen!", + + "PluginManagerUpdateAvailableTitle": "Es stehen {0} Plugin(s) zur Aktualisierung bereit!", + "PluginManagerUpdateAvailableSubtitle1": "Es stehen {0} Plugin-Updates zur Verfügung. Der Launcher muss neu gestartet werden, damit die Updates für diese Plugins übernommen werden können:", + "PluginManagerUpdateAvailableSubtitle2": "Möchtest du den Launcher neu starten?", + "PluginManagerUpdateAvailableCancelBtn": "Später", + "PluginManagerUpdateAvailableConfirmBtn": "Jetzt neustarten!", + "PluginManagerUpdateAvailableToManagerMenuBtn": "Gehe zum {0}", + + "LauncherRestartTitle": "Neustarten von Collapse Launcher", + "LauncherRestartSubtitle1": "Du bist dabei, den Launcher neu zu starten. Stelle sicher, dass du alle im Hintergrund laufenden Prozesse schließt oder abbrichst, bevor du den Launcher neu startest.", + "LauncherRestartSubtitle2": "Möchtest du den Launcher wirklich neu starten?", + + "PostInstallBehaviour_Title": "Verhalten nach Installation/Aktualisierung", + "PostInstallBehaviour_Subtitle": "Verhalten nach erfolgreicher Installation/Aktualisierung", + "PostInstallBehaviour_Subtitle2": "Wartezeit vor Neustart/Herunterfahren", + "PostInstallBehaviour_EnumNothing": "Nichts tun", + "PostInstallBehaviour_EnumStartGame": "Spiel starten", + "PostInstallBehaviour_EnumHibernate": "Ruhezustand", + "PostInstallBehaviour_EnumRestart": "Computer neu starten", + "PostInstallBehaviour_EnumShutdown": "Computer herunterfahren", + + "BgContextMenu_ParallaxPixelShiftCustomDialogTitle": "Benutzerdefinierte Parallax-Pixel festlegen (Min: {0}px, Max: {1}px)", + + "StartupFFmpegInstallDialogTitle": "Installation von FFmpeg ist erforderlich", + "StartupFFmpegInstallDialogSubtitle1": "Collapse Launcher benötigt nun den FFmpeg-Decoder (Build 7.x), damit Videos im Hintergrund ordnungsgemäß wiedergegeben werden können. Klicke auf \"", + "StartupFFmpegInstallDialogSubtitle2": "\", um FFmpeg neu zu installieren oder den Decoder in deiner bestehenden Installation zu suchen, oder klicke auf \"", + "StartupFFmpegInstallDialogSubtitle3": "\", um weiterhin den integrierten Decoder von Windows Media Foundation zu verwenden.", + "StartupFFmpegInstallDialogSubtitle4": "Hinweis:", + "StartupFFmpegInstallDialogSubtitle5": "Bei bestimmten Spielregionen kann es vorkommen, dass der Videohintergrund verzerrt oder fehlerhaft angezeigt wird, da der in Windows Media Foundation integrierte Decoder den Farbraumtyp nicht unterstützt. Wenn du FFmpeg für die Dekodierung des Videohintergrunds verwenden möchtest, rufe die Seite \"", + "StartupFFmpegInstallDialogSubtitle6": "\" auf, suche den Abschnitt \"", + "StartupFFmpegInstallDialogSubtitle7": "\" und aktiviere dort den FFmpeg-Decoder, um ihn zu installieren.", + "StartupFFmpegInstallDialogInstallBtn": "FFmpeg installieren & verwenden", + "StartupFFmpegInstallDialogUseBuiltInBtn": "Integrierten Decoder verwenden", + "StartupFFmpegInstallDialogDoNotAskInstall": "Mich in Zukunft nicht erneut bitten, FFmpeg zu installieren", + + "Media_ExtNotSupported1": "Leider wird die Dateiendung der folgenden Hintergrundbild- bzw. Videodatei nicht unterstützt.", + "Media_ExtNotSupported2": "Dateipfad/URL: {0}", + "Media_ExtNotSupportedTitle": "Hintergrunddatei wird nicht unterstützt", + "Media_ImageWICNotSupported1": "Leider wird die folgende Hintergrundbilddatei vom internen Windows Imaging Component (WIC)-Decoder nicht unterstützt. Bitte stelle sicher, dass du den Decoder aus dem Microsoft Store installiert hast.", + "Media_ImageWICNotSupportedTitle": "Die Bildhintergrunddatei wird nicht unterstützt", + "Media_VideoMFNotSupportedFormatTypeUnknown": "Unbekannt", + "Media_VideoMFNotSupported1": "Collapse Launcher hat festgestellt, dass der Videohintergrund aufgrund eines fehlenden Decoders nicht abgespielt werden kann. Nachstehend findest du weitere Details:", + "Media_VideoMFNotSupported2": "Video-Codec FourCC: {0}", + "Media_VideoMFNotSupported3": "Video-Codec-GUID: {0}", + "Media_VideoMFNotSupported4": "Audio-Codec-GUID: {0}", + "Media_VideoMFNotSupported5": "Kann Video/Audio wiedergeben?: (Video: {0} | Audio: {1})", + "Media_VideoMFNotSupported6": "Wir empfehlen dir, die erforderlichen Media Foundation-Video-/Audio-Codecs zu installieren, indem du unten auf „{0}“ klickst, oder FFmpeg zu verwenden, indem du auf die Schaltfläche „{1}“ klickst.", + "Media_VideoMFNotSupported7": "Anmerkung:", + "Media_VideoMFNotSupported8": "Wir empfehlen dringend die Verwendung von FFmpeg, da es eine Vielzahl von Video- und Audio-Codecs unterstützt und über Funktionen zur Hardware-Decodierung verfügt (abhängig von deiner Hardware).", + "Media_VideoMFNotSupportedTitle": "Der Codec für den Videohintergrund wird nicht unterstützt", + "Media_VideoMFNotSupportedCopyDetailsBtn": "Details kopieren", + "Media_VideoMFNotSupportedInstallMFCodecsBtn": "Media Foundation-Codecs installieren", + "Media_VideoMFNotSupportedInstallFFmpegBtn": "FFmpeg installieren und verwenden", + + "Media_VideoMFCodecPrepareTitle": "Vorbereiten der Windows Media Foundation-Codecs", + "Media_VideoMFCodecPrepare1": "Collapse Launcher benötigt zusätzliche Windows Media Foundation-Codecs, um Hintergrundvideos oder andere Medien abzuspielen. Dieser Vorgang kann möglicherweise zu einer falschen Erkennung durch dein Antivirenprogramm führen, da wir die Installation dieser zusätzlichen Codecs über PowerShell auslösen. Bitte deaktiviere daher dein Antivirenprogramm für einen kurzen Moment.", + "Media_VideoMFCodecPrepare2": "Diese zusätzlichen Codecs unterstützen nur eine begrenzte Anzahl von Video- und Audioformaten, darunter:", + "Media_VideoMFCodecPrepare3": " • VP9, AV1 (für Video)", + "Media_VideoMFCodecPrepare4": " • Vorbis, Opus (für Audio)", + "Media_VideoMFCodecPrepare5": "Möglicherweise musst du deinen Computer nach Abschluss der Installation manuell neu starten. Klicke auf „", + "Media_VideoMFCodecPrepare6": "“, um fortzufahren.", + "Media_VideoMFCodecPrepareInstallBtn": "Media Foundation-Codecs installieren", + "Media_VideoMFCodecInstalledTitle": "Die Windows Media Foundation-Codecs wurden installiert!", + "Media_VideoMFCodecInstalled1": "Die Windows Media Foundation-Codecs wurden erfolgreich installiert. Bitte starte deinen Computer manuell neu, damit die Codecs funktionieren.", + "Media_VideoMFCodecInstallingTitle": "Installieren der Windows Media Foundation-Codecs", + + "Media_VideoFFmpegCodecPrepareTitle": "FFmpeg vorbereiten", + "Media_VideoFFmpegCodecPrepare1": "Collapse Launcher benötigt FFmpeg, um Hintergrundvideos oder andere Medien abzuspielen. Du kannst das Programm entweder herunterladen oder deine vorhandene Installation verwenden.", + "Media_VideoFFmpegCodecPrepare2": "Um fortzufahren, klicke auf „", + "Media_VideoFFmpegCodecPrepare3": "“, um eine neue Version von FFmpeg herunterzuladen und zu installieren, oder klicke auf „", + "Media_VideoFFmpegCodecPrepare4": "“, um einen Ordner mit der FFmpeg-Installation auszuwählen.", + "Media_VideoFFmpegCodecPrepareInstallBtn": "FFmpeg herunterladen und installieren", + "Media_VideoFFmpegCodecPrepareLocateBtn": "Vorhandene Installation suchen und verwenden", + "Media_VideoFFmpegCodecPrepareLocateDialog": "Wähle den vorhandenen FFmpeg-Installationsordner aus", + "Media_VideoFFmpegCodecPrepareLocateFailedTitle": "Es kann keine vorhandene FFmpeg-Installation gefunden werden", + "Media_VideoFFmpegCodecPrepareLocateFailed1": "Der Collapse Launcher kann in diesem Verzeichnis keine vorhandene Installation von FFmpeg finden:", + "Media_VideoFFmpegCodecPrepareLocateFailed2": "Hinweis:", + "Media_VideoFFmpegCodecPrepareLocateFailed3": "Stelle sicher, dass du über die folgenden .dll-Dateien verfügst:", + "Media_VideoFFmpegCodecPrepareLocateSuccessTitle": "Eine bestehende FFmpeg-Installation wurde erkannt!", + "Media_VideoFFmpegCodecPrepareLocateSuccess1": "Wir haben in diesem Verzeichnis eine vorhandene FFmpeg-Installation gefunden:", + "Media_VideoFFmpegCodecInstallingTitle": "FFmpeg wird installiert", + + "Agreement_ThirdPartyAgreementPreambleTitle": "Vorwort", + "Agreement_ThirdPartyAgreementPreamble1": "Collapse Launcher nutzt die folgende Bibliothek, um eine oder mehrere seiner Funktionen zu ermöglichen.", + "Agreement_ThirdPartyAgreementPreamble2": "Wir respektieren die Eigentümer der folgenden Bibliothek und halten uns daher an alle in dieser Vereinbarung genannten Regeln.", + "Agreement_ThirdPartyAgreementPreamble3": "Klicke \"", + "Agreement_ThirdPartyAgreementPreamble4": "\", um fortzufahren oder \"", + "Agreement_ThirdPartyAgreementPreamble5": "\", um abzubrechen." }, "_FileMigrationProcess": { - "PathActivityPanelTitle": "Moving: ", - "SpeedIndicatorTitle": "Speed: ", - "FileCountIndicatorTitle": "File processed: ", - "LocateFolderSubtitle": "Choose the location to move the file/folder to the target path.", - "ChoosePathTextBoxPlaceholder": "Choose the target path...", - "ChoosePathButton": "Choose Target", - "ChoosePathErrorTitle": "Error has Occured!", - "ChoosePathErrorPathIdentical": "The output path you choose is within or identical to the current location!\r\nPlease move to another location!", - "ChoosePathErrorPathUnselected": "Please choose your path before continue!", - "ChoosePathErrorPathNotExist": "Path does not exist!", - "ChoosePathErrorPathNoPermission": "You don't have a permission to access this location! Please choose another location!" + "PathActivityPanelTitle": "Verschoben: ", + "SpeedIndicatorTitle": "Geschwindigkeit: ", + "FileCountIndicatorTitle": "Verarbeitete Dateien: ", + "LocateFolderSubtitle": "Wählen den Ort, an den die Datei/der Ordner verschoben werden soll.", + "ChoosePathTextBoxPlaceholder": "Wählen den Zielpfad...", + "ChoosePathButton": "Ziel wählen", + "ChoosePathErrorTitle": "Ein Fehler ist aufgetreten!", + "ChoosePathErrorPathIdentical": "Der ausgewählte Ausgabeort befindet sich im aktuellen Verzeichnis oder ist mit diesem identisch!\r\nBitte wähle einen anderen Speicherort!", + "ChoosePathErrorPathUnselected": "Bitte wähle einen Pfad aus bevor du fortfährst!", + "ChoosePathErrorPathNotExist": "Der Pfad existiert nicht!", + "ChoosePathErrorPathNoPermission": "Du hast keine Berechtigung, auf diesen Speicherort zuzugreifen! Bitte wähle einen anderen Speicherort!" }, "_InstallMgmt": { @@ -1363,7 +1382,7 @@ "CookbookDownloadTitle": "Herunterladen des Rezepts", "CookbookDownloadSubtitle": "Herunterladen des Rezepts für die Umwandlung von {0} in {1}", - "CookbookFileBrowserFileTypeCategory": "{0} to {1} Cookbook", + "CookbookFileBrowserFileTypeCategory": "{0} bis {1} Rezeptbuch", "CancelBtn": "Konvertierung abbrechen", "CancelMsgTitle": "Konvertierung wird abgebrochen...", @@ -1429,12 +1448,12 @@ "LoadingReleaseFailed": "Fehler beim Abrufen der Versionshinweise.\n{0}", "UpdateHeader1": "Fortschritt:", - "UpdateHeader2": "Time Remaining:", + "UpdateHeader2": "Verbleibende Zeit:", "UpdateHeader3": "Downloadgröße:", "UpdateHeader4": "Geschwindigkeit:", "UpdateHeader5PlaceHolder": "Herunterladen von Updates [- / -]:", - "UpdateForcedHeader": "Der Launcher wird aufgrund von dringenden Änderungen zwangsweise aktualisiert, um sicherzustellen, dass er ordnungsgemäß funktioniert.", + "UpdateForcedHeader": "Der Launcher muss aufgrund dringender Änderungen zwingend aktualisiert werden, um seine ordnungsgemäße Funktion sicherzustellen.", "UpdateStatus1": "Update abrufen:", "UpdateMessage1": "Verbinde zum Update Repository...", @@ -1466,32 +1485,32 @@ "ApplyUpdateErrCollapseRunTitle": "Bitte schließe Collapse, bevor du das Update anwendest!", "ApplyUpdateErrCollapseRunSubtitle": "Warte auf Schließung von Collapse...", - "ApplyUpdateErrCollapseRunTitleWarnBox": "An Instance of Collapse Launcher is Still Running!", - "ApplyUpdateErrCollapseRunSubtitleWarnBox": "We detected an instance of Collapse Launcher is running in the background. To forcely close the launcher, click \"Yes\". To wait until you manually close it, click \"No\".", - "ApplyUpdateErrVelopackStateBrokenTitleWarnBox": "Broken Existing Installation Detected!", - "ApplyUpdateErrVelopackStateBrokenSubtitleWarnBox": "We detected that you have a broken existing installation.\r\n\r\nClick on \"Yes\" to repair the installation before installing updates or Click \"No\" to just run the update installation.", + "ApplyUpdateErrCollapseRunTitleWarnBox": "Eine Instanz des Collapse Launchers läuft noch!", + "ApplyUpdateErrCollapseRunSubtitleWarnBox": "Wir haben festgestellt, dass eine Instanz von Collapse Launcher im Hintergrund läuft. Um den Launcher zwangsweise zu schließen, klicken auf „Ja“. Um abzuwarten, bis er manuell geschlossen wird, klicken auf „Nein“.", + "ApplyUpdateErrVelopackStateBrokenTitleWarnBox": "Es wurde eine fehlerhafte bestehende Installation erkannt!", + "ApplyUpdateErrVelopackStateBrokenSubtitleWarnBox": "Wir haben festgestellt, dass die vorhandene Installation fehlerhaft ist.\r\n\r\nKlicke auf „Ja“, um die Installation vor der Installation der Updates zu reparieren, oder klicke auf „Nein“, um nur die Update-Installation durchzuführen.", "ApplyUpdateErrReleaseFileNotFoundTitle": "FEHLER:\n\"release\"-Datei enthält keine \"stable\"- oder \"preview\"-Angabe", "ApplyUpdateErrReleaseFileNotFoundSubtitle": "Bitte überprüfe die \"release\"-Datei und versuche es erneut.", "ApplyUpdateDownloadSizePlaceholder": "- B / - B", "ApplyUpdateDownloadSpeed": "{0}/s", "ApplyUpdateDownloadSpeedPlaceholder": "- B/s", - "ApplyUpdateDownloadTimeEst": "{0:%h}h{0:%m}m{0:%s}s left", - "ApplyUpdateDownloadTimeEstPlaceholder": "--h--m--s left", - - "ApplyUpdateTaskLegacyVerFoundTitle": "A previous legacy installation of Collapse v{0} detected!", - "ApplyUpdateTaskLegacyVerFoundSubtitle1": "We detected that you have a legacy Collapse v{0} installed on your PC. ", - "ApplyUpdateTaskLegacyVerFoundSubtitle2": "The updater needs to clean-up all the old files inside its directory.\r\n", - "ApplyUpdateTaskLegacyVerFoundSubtitle3": "Please make sure you don't have any important files inside of the Collapse directory or it will be COMPLETELY WIPED OUT!", - "ApplyUpdateTaskLegacyVerFoundSubtitle4": "\r\n\r\nClick \"Yes\" to proceed or \"No\" to cancel.", - "ApplyUpdateTaskLegacyVerFoundSubtitle5": "Click \"Yes\" once again to confirm.", - "ApplyUpdateTaskLegacyCleanupCount": "Clean-up process will be started in {0}...", - "ApplyUpdateTaskLegacyDeleting": "Deleting: {0}...", - - "ApplyUpdateTaskDownloadingPkgTitle": "Downloading package", - "ApplyUpdateTaskExtractingPkgTitle": "Extracting package", - "ApplyUpdateTaskRemoveOldPkgTitle": "Removing old package", - "ApplyUpdateTaskMovingExtractFileTitle": "Moving extracted files", + "ApplyUpdateDownloadTimeEst": "{0:%h}h{0:%m}m{0:%s}s verbleibend", + "ApplyUpdateDownloadTimeEstPlaceholder": "--h--m--s verbleibend", + + "ApplyUpdateTaskLegacyVerFoundTitle": "Eine frühere Installation von Collapse v{0} wurde erkannt!", + "ApplyUpdateTaskLegacyVerFoundSubtitle1": "Wir haben festgestellt, dass auf deinem PC eine ältere Version von Collapse v{0} installiert ist. ", + "ApplyUpdateTaskLegacyVerFoundSubtitle2": "Das Update-Programm muss alle alten Dateien in seinem Verzeichnis löschen.\r\n", + "ApplyUpdateTaskLegacyVerFoundSubtitle3": "Bitte stelle sicher, dass sich keine wichtigen Dateien im Collapse-Verzeichnis befinden, da diese sonst VOLLSTÄNDIG GELÖSCHT werden!", + "ApplyUpdateTaskLegacyVerFoundSubtitle4": "\r\n\r\nKlicke \"Ja\" um fortzufahren oder \"Nein\" um abzubrechen.", + "ApplyUpdateTaskLegacyVerFoundSubtitle5": "Klicke \"Ja\" noch einmal, um zu bestätigen.", + "ApplyUpdateTaskLegacyCleanupCount": "Der Bereinigungsvorgang wird in {0} gestartet...", + "ApplyUpdateTaskLegacyDeleting": "Löschen von: {0}...", + + "ApplyUpdateTaskDownloadingPkgTitle": "Paket wird heruntergeladen", + "ApplyUpdateTaskExtractingPkgTitle": "Entpacke Paket", + "ApplyUpdateTaskRemoveOldPkgTitle": "Entferne altes Paket", + "ApplyUpdateTaskMovingExtractFileTitle": "Verschiebe extrahierten Dateien", "ApplyUpdateTaskLauncherUpdatedTitle": "Launcher wurde aktualisiert auf: {0}!", "ApplyUpdateTaskLauncherUpdatedSubtitle": "Starte Collapse in {0}...", @@ -1535,10 +1554,10 @@ "Graphics_FPS": "FPS", "Graphics_FPS_Help": "120 FPS ist EXPERIMENTELL! Bitte mit Vorsicht verwenden, da Honkai: Star Rail dies nicht offiziell unterstützt!", "Graphics_FPS_Help2": "Das Setzen des FPS-Werts auf 120 führt nicht mehr zum Absturz des Menüs, jedoch kann die Einstellung der FPS im Spiel nicht mehr auf einen niedrigeren Wert geändert werden.\nWenn du die 120 FPS-Option verwendest, ändere die Grafikeinstellungen des Spiels mit Collapse.", - "Graphics_VSync": "VSync", + "Graphics_VSync": "Vertikale Synchronisation", "Graphics_VSync_Help": "VSync ist bei 120 FPS nicht verfügbar", - "Graphics_RenderScale": "Render-Skalierung", - "Graphics_ResolutionQuality": "Auflösungsqualität", + "Graphics_RenderScale": "Renderqualität", + "Graphics_ResolutionQuality": "Auflösung", "Graphics_ShadowQuality": "Schattenqualität", "Graphics_LightQuality": "Lichtqualität", "Graphics_CharacterQuality": "Figurenqualität", @@ -1548,8 +1567,8 @@ "Graphics_AAMode": "Anti-Aliasing-Modus", "Graphics_SFXQuality": "SFX-Qualität", "Graphics_DlssQuality": "NVIDIA DLSS", - "Graphics_SelfShadow": "Character Shadow in Map Exploration", - "Graphics_HalfResTransparent": "Half Resolution Transparency", + "Graphics_SelfShadow": "Schatten der Figuren in Echtzeit während der Kartenerkundung", + "Graphics_HalfResTransparent": "Transparenz bei halber Auflösung", "Graphics_DLSS_UHP": "Ultra Performance", "Graphics_DLSS_Perf": "Performance", @@ -1619,38 +1638,38 @@ "Graphics_ShadowQuality": "Schattenqualität", "Graphics_VisualFX": "Visuelle Effekte", "Graphics_SFXQuality": "SFX-Qualität", - "Graphics_EnvDetailQuality": "Umgebungsqualität", - "Graphics_VSync": "VSync", + "Graphics_EnvDetailQuality": "Details des Handlungsorts", + "Graphics_VSync": "Vertikale Synchronisation", "Graphics_AAMode": "Anti-Aliasing-Modus", "Graphics_VolFogs": "Volumetrischer Nebel", - "Graphics_VolFogs_ToolTip": "Requires Shadow Quality to be set at Medium or higher!", + "Graphics_VolFogs_ToolTip": "Erfordert, dass die Schattenqualität auf „Mittel“ oder höher eingestellt ist!", "Graphics_ReflectionQuality": "Reflektion", - "Graphics_MotionBlur": "Bewegungsunschärfe", - "Graphics_BloomQuality": "Bloom-Effekt", + "Graphics_MotionBlur": "Bewegungs-unschärfe", + "Graphics_BloomQuality": "Blooming", "Graphics_CrowdDensity": "Massendichte", - "Graphics_SubsurfaceScattering": "Unterflächenstreuung", + "Graphics_SubsurfaceScattering": "Unterflächen-streuung", "Graphics_TeammateFX": "Spezialeffekte anderer Spieler", - "Graphics_AnisotropicFiltering": "Anisotropes Filtern", - "Graphics_TeamPageBackground": "Regional Party Setup Background", - "Graphics_GlobalIllumination": "Global Illumination", - "Graphics_GlobalIllumination_Help1": "Only for supported hardware!", - "Graphics_GlobalIllumination_Help2": "More information (en)", - "Graphics_DynamicCharacterResolution": "Dynamic Character Resolution", - "Graphics_DynamicCharacterResolution_Tooltip": "Only for supported hardware!", + "Graphics_AnisotropicFiltering": "Anisotropische Filterung", + "Graphics_TeamPageBackground": "Regionsspezifischer Truppenhintergrund", + "Graphics_GlobalIllumination": "Globale Beleuchtung", + "Graphics_GlobalIllumination_Help1": "Nur für unterstützte Hardware!", + "Graphics_GlobalIllumination_Help2": "Mehr Informationen (EN)", + "Graphics_DynamicCharacterResolution": "Dynamisches Figuren-Rendering", + "Graphics_DynamicCharacterResolution_Tooltip": "Nur für unterstützte Hardware!", "Graphics_HDR": "HDR", "Graphics_HDR_Enable": "HDR aktivieren", "Graphics_HDR_NotSupported1": "Dein Bildschirm unterstützt HDR nicht.", "Graphics_HDR_NotSupported2": "Ein HDR-fähiger Monitor ist erforderlich!", "Graphics_HDR_NotEnabled1": "Dein Gerät unterstützt HDR, aber es ist nicht aktiviert.", "Graphics_HDR_NotEnabled2": "Die Option \"HDR verwenden\" sollte in den Einstellungen von Windows aktiviert werden.", - "Graphics_HDR_Help_Link": "More information", - "Graphics_HDR_MaxLuminosity": "Max Luminosity (nits)", - "Graphics_HDR_MaxLuminosity_Help": "Maximum allowed peak brightness for highlights", - "Graphics_HDR_Calibration_Help": "Adjust until the image shown is faint but visible", - "Graphics_HDR_UiBrightness": "UI Brightness", - "Graphics_HDR_UiBrightness_Help": "Controls how bright UI elements should be", - "Graphics_HDR_SceneBrightness": "Scenery Brightness", - "Graphics_HDR_SceneBrightness_Help": "Controls how bright a scenery should be", + "Graphics_HDR_Help_Link": "Weitere Informationen", + "Graphics_HDR_MaxLuminosity": "Maximale Helligkeit (Nits)", + "Graphics_HDR_MaxLuminosity_Help": "Höchstzulässige Spitzhelligkeit für Highlights", + "Graphics_HDR_Calibration_Help": "Anpassen, bis das angezeigte Bild zwar schwach, aber noch erkennbar ist", + "Graphics_HDR_UiBrightness": "Helligkeit der Benutzeroberfläche", + "Graphics_HDR_UiBrightness_Help": "Legt fest, wie hell die Elemente der Benutzeroberfläche sein sollen", + "Graphics_HDR_SceneBrightness": "Helligkeit der Umgebung", + "Graphics_HDR_SceneBrightness_Help": "Legt fest, wie hell eine Szenerie sein soll", "Graphics_SpecPanel": "Allgemeine Grafikeinstellungen", "SpecEnabled": "Aktiviert", @@ -1687,7 +1706,7 @@ "Audio_Output_Surround": "Surround-Sound verwenden", "Audio_DynamicRange": "Volle Dynamische Reichweite", - "Audio_MuteOnMinimize": "Mute Audio When Minimized", + "Audio_MuteOnMinimize": "Stummschalten, wenn minimiert", "Language": "Spracheinstellungen", "Language_Help1": "Collapse kann das Audiopaket derzeit nicht direkt herunterladen.", @@ -1703,7 +1722,7 @@ "_KbShortcuts": { "DialogTitle": "Tastaturkurzbefehle", "GeneralTab": "Allgemein", - "SwitchTab": "Schnellwechsel", + "SwitchTab": "Schneller Wechsel", "GameFolderTab": "Ordnerzugriff", "GameManagementTab": "Spielverwaltung", @@ -1715,7 +1734,7 @@ "General_OpenNotifTray": "Die Benachrichtigungsleiste öffnen", "General_ReloadRegion": "Aktuelle Seite neu laden", "General_ReloadRegion_Desc": "Alternativ zu diesem Tastenkürzel kann auch F5 gedrückt werden.\nBitte beachte, dass durch das erneute Laden der Startseite die Region neu geladen wird.", - "General_OpenPluginManager": "Opens the Plugin Manager overlay", + "General_OpenPluginManager": "Öffnet das Overlay des Plugin-Managers", "Switch_Title": "Schneller Spiel/Regionswechsel", "Switch_Subtitle": "Hinweis: Die Tastenkombinationen folgen der Auswahlreihenfolge.", @@ -1726,8 +1745,8 @@ "Switch_ChangeRegion_Desc": "z. B. Bei Genshin Impact führt {0}+1 zur globalen Region.", "GameFolder_Title": "Zugriff auf Spieleordner", - "GameFolder_ScreenshotFolder": "Öffne den Screenshot-Ordner", - "GameFolder_MainFolder": "Öffne das Spieleverzeichnis", + "GameFolder_ScreenshotFolder": "Öffnen der Screenshots", + "GameFolder_MainFolder": "Öffne das Spielverzeichnis", "GameFolder_CacheFolder": "Öffne den Cache-Ordner", "GameManagement_Title": "Spielverwaltung", @@ -1739,10 +1758,10 @@ "GameManagement_GoCaches": "Zur Seite Caches Updaten gehen", "ChangeShortcut_Title": "Tastenkürzel ändern", - "ChangeShortcut_Text": "Type the new combination for this shortcut!", - "ChangeShortcut_Help1": "A shortcut is composed by 2 parts:", - "ChangeShortcut_Help2": "・ Modifier - Shift, Control or Alt/Menu", - "ChangeShortcut_Help3": "・ Key - Alphabetical (A to Z) or Tab", + "ChangeShortcut_Text": "Geben die neue Tastenkombination für diese Verknüpfung ein!", + "ChangeShortcut_Help1": "Eine Verknüpfung besteht aus zwei Teilen:", + "ChangeShortcut_Help2": "・ Modifikatortaste – Shift, Strg oder Alt/Menü", + "ChangeShortcut_Help3": "・ Taste – Alphabetisch (A bis Z) oder Tab", "ChangeShortcut_Help4": "Du kannst jede Kombination wählen, die aus einem Wert aus jeder Kategorie besteht, es sei denn, sie ist vom System reserviert oder wird bereits verwendet.", "Keyboard_Control": "Strg", @@ -1769,12 +1788,12 @@ }, "_WpfPackageContext": { - "StartUpdateBtn": "Start Update", - "CancelUpdateBtn": "Cancel Update", - "ReinstallToolBtn": "Re-install", - "StartUpdateAutomatically": "Starts Update Automatically", - "NotifUpdateCompletedTitle": "{0} has been updated!", - "NotifUpdateCompletedSubtitle": "Tool: {0} for your game: {1} - {2} has been updated to v{3}" + "StartUpdateBtn": "Update starten", + "CancelUpdateBtn": "Update abbrechen", + "ReinstallToolBtn": "Erneut installieren", + "StartUpdateAutomatically": "Updates automatisch starten", + "NotifUpdateCompletedTitle": "{0} wurde aktualisiert!", + "NotifUpdateCompletedSubtitle": "Tool: {0} für dein Spiel: {1} – {2} wurde auf Version {3} aktualisiert" }, "_WpfPackageName": { @@ -1786,65 +1805,65 @@ }, "_FileCleanupPage": { - "Title": "Files Clean-up", - "TopButtonRescan": "Re-Scan", - "NoFilesToBeDeletedText": "No files need to be deleted!", - "ListViewFieldFileName": "File Name", - "ListViewFieldFileSize": "File Size", - "LoadingTitle": "Processing", - "LoadingSubtitle1": "Calculating Existing Files ({0} file(s) found - {1} in total)...", - "LoadingSubtitle2": "Checking pkg_version's availability...", - "LoadingSubtitle3": "UI might be unresponsive during this process...", - "DeleteSubtitle": "Deleting files...", - "BottomButtonDeleteAllFiles": "Delete All Files", - "BottomButtonDeleteSelectedFiles": "Delete {0} Selected File(s)", - "BottomCheckboxFilesSelected": "{0} File(s) Selected ({1} / {2} Total)", - "BottomCheckboxNoFileSelected": "No File Selected", - "DialogDeletingFileTitle": "Deleting Files", - "DialogDeletingFileSubtitle1": "You're about to", - "DialogDeletingFileSubtitle2": "delete {0} file(s)", - "DialogDeletingFileSubtitle3": "which contains", - "DialogDeletingFileSubtitle4": "{0} in size.", - "DialogDeletingFileSubtitle5": "Are you sure to delete the files?", - "DialogDeleteSuccessTitle": "Files Deleted!", - "DialogDeleteSuccessSubtitle1": "{0} file(s) have been successfully deleted", - "DialogDeleteSuccessSubtitle2": "with {0} failed to delete", - "DialogMoveToRecycleBin": "Move to Recycle Bin", - "DialogTitleMovedToRecycleBin": "Files moved to Recycle Bin!" + "Title": "Datenbereinigung", + "TopButtonRescan": "Erneut scannen", + "NoFilesToBeDeletedText": "Es müssen keine Dateien gelöscht werden!", + "ListViewFieldFileName": "Dateiname", + "ListViewFieldFileSize": "Dateigröße", + "LoadingTitle": "Verarbeitung", + "LoadingSubtitle1": "Bestehende Dateien werden gezählt ({0} Datei(en) gefunden – insgesamt {1})...", + "LoadingSubtitle2": "Überprüfung der Verfügbarkeit von pkg_version...", + "LoadingSubtitle3": "Die Benutzeroberfläche könnte während dieses Vorgangs nicht reagieren...", + "DeleteSubtitle": "Lösche Dateien...", + "BottomButtonDeleteAllFiles": "Alle Dateien löschen", + "BottomButtonDeleteSelectedFiles": "{0} ausgewählte Datei(en) löschen", + "BottomCheckboxFilesSelected": "{0} Datei(en) ausgewählt (von insgesamt {1} / {2})", + "BottomCheckboxNoFileSelected": "Keine Datei ausgewählt", + "DialogDeletingFileTitle": "Dateien löschen", + "DialogDeletingFileSubtitle1": "Du bist dabei,", + "DialogDeletingFileSubtitle2": "{0} Datei(en) zu löschen", + "DialogDeletingFileSubtitle3": " die eine Gesamtgröße", + "DialogDeletingFileSubtitle4": "von {0} haben.", + "DialogDeletingFileSubtitle5": "Möchtest du die Dateien wirklich löschen?", + "DialogDeleteSuccessTitle": "Dateien gelöscht!", + "DialogDeleteSuccessSubtitle1": "{0} Datei(en) wurden erfolgreich gelöscht,", + "DialogDeleteSuccessSubtitle2": "{0} konnten nicht entfernt werden", + "DialogMoveToRecycleBin": "In den Papierkorb verschieben", + "DialogTitleMovedToRecycleBin": "Dateien wurden in den Papierkorb verschoben!" }, "_OOBEStartUpMenu": { "WelcomeTitleString": { - "Upper": [ "Willkommen", " bei" ], + "Upper": [ "Willkommen", " im" ], "Lower": [ "Collapse", " Launcher" ] }, - "SetupNextButton": "Zum Fortfahren hier klicken", + "SetupNextButton": "Klicke, um fortzufahren", "SetupBackButton": "Zurück", "CustomizationTitle": "Anpassen des Launchers", "CustomizationSettingsLanguageHeader": "Sprache", - "CustomizationSettingsLanguageDescription": "Hierdurch wird die Sprache für die angezeigten Informationen angepasst.", + "CustomizationSettingsLanguageDescription": "Passt die Sprache der angezeigten Informationen an.", "CustomizationSettingsWindowSizeHeader": "Fenstergröße", "CustomizationSettingsWindowSizeDescription": "Ändert die Größe des Launchers", "CustomizationSettingsCDNHeader": "Content Delivery Network", - "CustomizationSettingsCDNDescription": "Wähle das primäre Content-Delivery-Network, das verwendet werden soll.", + "CustomizationSettingsCDNDescription": "Wähle aus, welches CDN primär verwendet werden soll.", "CustomizationSettingsStyleHeader": "Einstellung des Stils", - "CustomizationSettingsStyleDescription": "Ändere das Aussehen des Launcher und entscheide selbst.", + "CustomizationSettingsStyleDescription": "Passe das Aussehen des Launchers an und wähle dein bevorzugtes Design.", "CustomizationSettingsStyleThemeHeader": "Theme", - "CustomizationSettingsStyleThemeDescription": "Ändere die Farbe, die in deinem Launcher erscheint.", + "CustomizationSettingsStyleThemeDescription": "Ändert den Farbmodus des Launchers.", "CustomizationSettingsStyleCustomBackgroundHeader": "Benutzerdefiniertes Hintergrundbild", "CustomizationSettingsStyleCustomBackgroundDescription": "Verwende ein eigenes Hintergrundbild anstelle des Standardbildes.", - "VideoBackgroundPreviewUnavailableHeader": "Video Background Preview is Unavailable", - "VideoBackgroundPreviewUnavailableDescription": "You cannot preview your video background in OOBE but do not worry! Your video background will be applied once you are completing OOBE.", + "VideoBackgroundPreviewUnavailableHeader": "Die Vorschau des Videohintergrunds ist nicht verfügbar", + "VideoBackgroundPreviewUnavailableDescription": "In der Einrichtungsumgebung kannst du keine Vorschau deines Videohintergrunds anzeigen, aber keine Sorge! Dein Videohintergrund wird übernommen, sobald du die Einrichtungsumgebung abgeschlossen hast.", "LoadingInitializationTitle": "Erststart des Launcher wird initialisiert", - "LoadingCDNCheckboxCheckLatency": "(Überprüfung der Latenz...)", + "LoadingCDNCheckboxCheckLatency": "(Prüfe Latenz...)", "LoadingCDNCheckboxPlaceholder": "Überprüfung der CDN-Empfehlung...", - "LoadingCDNCheckingSubitle": "Finde den nächstgelegenen Content Delivery Network (CDN)-Server für dich...", + "LoadingCDNCheckingSubitle": "Finden des nächstgelegenen CDN-Servers für dich...", "LoadingCDNCheckingSkipButton": "CDN-Check überspringen", "LoadingBackgroundImageTitle": "Bild wird geladen", - "LoadingBackgroundImageSubtitle": "Es kann eine Weile dauern, bis das Bild verarbeitet ist.", + "LoadingBackgroundImageSubtitle": "Die Verarbeitung des Bildes kann eine Weile dauern.", "CDNCheckboxItemLatencyFormat": " ({0} ms)", "CDNCheckboxItemLatencyUnknownFormat": "(unbekannt)", @@ -1852,63 +1871,63 @@ }, "_ZenlessGameSettingsPage": { - "Mark_Experimental": "(Experimental)", - "Graphics_ColorFilter": "Color Filter Strength", - "Graphics_RenderRes": "Render Resolution", - "Graphics_EffectsQ": "Effects Quality", - "Graphics_ShadingQ": "Shading Quality", - "Graphics_Distortion": "Distortion", - "Graphics_HighPrecisionCharacterAnimation": "High-Precision Character Animation", - "Audio_PlaybackDev": "Audio Playback Device", - "Audio_PlaybackDev_Headphones": "Headphones", - "Audio_PlaybackDev_Speakers": "Speakers", - "Audio_PlaybackDev_TV": "TV", - "Audio_Ambient": "Ambient Noise Volume", - "AdvancedGraphics_Title": "Advanced Graphics Settings", - "AdvancedGraphics_Tooltip1": "Some features can only be used if you have an Nvidia GeForce RTX Series graphics card and DirectX 12 API enabled.", - "AdvancedGraphics_Tooltip2": "Please take a note that any features available in this section are EXPERIMENTAL. Use at your own risk!", - "AdvancedGraphics_UseDirectX12API": "Use DirectX 12 API", - "AdvancedGraphics_RayTracing": "Ray Tracing", - "AdvancedGraphics_RayTracingQ": "Ray Tracing Quality", - "AdvancedGraphics_SuperScaling": "Super Scaling", - "AdvancedGraphics_SuperScalingQ": "Super Scaling Priority", - "AdvancedGraphics_SuperScalingQ_Performance": "Performance", - "AdvancedGraphics_SuperScalingQ_Balanced": "Balanced", - "AdvancedGraphics_SuperScalingQ_Quality": "Quality" + "Mark_Experimental": "(Experimentell)", + "Graphics_ColorFilter": "Farbqualität", + "Graphics_RenderRes": "Rendering", + "Graphics_EffectsQ": "Spezialeffekte", + "Graphics_ShadingQ": "Schattenqualität", + "Graphics_Distortion": "Verzerrung", + "Graphics_HighPrecisionCharacterAnimation": "Hochpräzise Figurenauflösung", + "Audio_PlaybackDev": "Wiedergabegerät", + "Audio_PlaybackDev_Headphones": "Kopfhörer", + "Audio_PlaybackDev_Speakers": "Lautsprecher", + "Audio_PlaybackDev_TV": "Fernseher", + "Audio_Ambient": "Atmosphärische Lautstärke", + "AdvancedGraphics_Title": "Erweiterte Grafikeinstellungen", + "AdvancedGraphics_Tooltip1": "Einige Funktionen stehen nur zur Verfügung, wenn du eine Grafikkarte der Nvidia GeForce RTX-Serie besitzt und die DirectX 12-API aktiviert ist.", + "AdvancedGraphics_Tooltip2": "Bitte beachte, dass alle in diesem Abschnitt verfügbaren Funktionen EXPERIMENTELL sind. Die Nutzung erfolgt auf eigene Gefahr!", + "AdvancedGraphics_UseDirectX12API": "DirectX 12-API verwenden", + "AdvancedGraphics_RayTracing": "Raytracing", + "AdvancedGraphics_RayTracingQ": "Raytracing-Qualität", + "AdvancedGraphics_SuperScaling": "Super-Skalierung", + "AdvancedGraphics_SuperScalingQ": "Super-Skalierungspriorität", + "AdvancedGraphics_SuperScalingQ_Performance": "Leistung", + "AdvancedGraphics_SuperScalingQ_Balanced": "Ausgewogen", + "AdvancedGraphics_SuperScalingQ_Quality": "Qualität" }, "_NotificationToast": { - "WindowHiddenToTray_Title": "Collapse Launcher is Minimized to Tray", - "WindowHiddenToTray_Subtitle": "The launcher is now running in the background.\r\nClick this notification or the icon on the tray to restore the window.", + "WindowHiddenToTray_Title": "Collapse wurde in den Infobereich minimiert", + "WindowHiddenToTray_Subtitle": "Der Launcher läuft jetzt im Hintergrund.\r\nKlicke auf diese Benachrichtigung oder das Symbol in der Taskleiste, um das Fenster wiederherzustellen.", - "GameInstallCompleted_Title": "{0} is Ready to Play", - "GameInstallCompleted_Subtitle": "{0} has been successfully installed!", + "GameInstallCompleted_Title": "{0} ist spielbereit", + "GameInstallCompleted_Subtitle": "{0} wurde erfolgreich installiert!", - "GameUpdateCompleted_Title": "{0} has been Updated", - "GameUpdateCompleted_Subtitle": "{0} has been successfully updated to v{1}!", + "GameUpdateCompleted_Title": "{0} wurde aktualisiert", + "GameUpdateCompleted_Subtitle": "{0} wurde erfolgreich aktualisiert auf v{1}!", - "GamePreloadCompleted_Title": "Pre-load for {0} has been Downloaded", + "GamePreloadCompleted_Title": "Die Vorab-Daten für {0} wurden heruntergeladen", - "GameRepairCheckCompleted_Title": "Game Repair Check is Completed", - "GameRepairCheckCompletedFound_Subtitle": "{0} file(s) need to be updated/repaired. Click this notification to go back to the launcher.", - "GameRepairCheckCompletedNotFound_Subtitle": "No files need to be updated/repaired.", + "GameRepairCheckCompleted_Title": "Die Spielreparaturprüfung ist abgeschlossen", + "GameRepairCheckCompletedFound_Subtitle": "{0} Datei(en) müssen aktualisiert/repariert werden. Klicke auf diese Benachrichtigung, um zum Launcher zurückzukehren.", + "GameRepairCheckCompletedNotFound_Subtitle": "Keine Dateien müssen aktualisiert oder repariert werden.", - "GameRepairDownloadCompleted_Title": "Game Repair Download is Completed", - "GameRepairDownloadCompleted_Subtitle": "{0} file(s) have been successfully updated/repaired.", + "GameRepairDownloadCompleted_Title": "Spielreparatur-Download abgeschlossen", + "GameRepairDownloadCompleted_Subtitle": "{0} Datei(en) wurde(n) erfolgreich aktualisiert/repariert.", - "CacheUpdateCheckCompleted_Title": "Cache Update Check is Completed", - "CacheUpdateCheckCompletedFound_Subtitle": "{0} cache file(s) need to be updated. Click this notification to go back to the launcher.", - "CacheUpdateCheckCompletedNotFound_Subtitle": "No cache files need to be updated.", + "CacheUpdateCheckCompleted_Title": "Überprüfung der Cache-Aktualisierung abgeschlossen", + "CacheUpdateCheckCompletedFound_Subtitle": "{0} Cache-Datei(en) müssen aktualisiert werden. Klicke auf diese Benachrichtigung, um zum Launcher zurückzukehren.", + "CacheUpdateCheckCompletedNotFound_Subtitle": "Es müssen keine Cache-Dateien aktualisiert werden.", - "CacheUpdateDownloadCompleted_Title": "Cache Update Download is Completed", - "CacheUpdateDownloadCompleted_Subtitle": "{0} cache file(s) have been successfully updated.", + "CacheUpdateDownloadCompleted_Title": "Download der Cache-Aktualisierung ist abgeschlossen", + "CacheUpdateDownloadCompleted_Subtitle": "{0} Cache-Datei(en) wurden erfolgreich aktualisiert.", - "GenericClickNotifToGoBack_Subtitle": "Click this notification to go back to the launcher.", + "GenericClickNotifToGoBack_Subtitle": "Klicke auf diese Benachrichtigung, um zum Launcher zurückzukehren.", - "OOBE_WelcomeTitle": "Welcome to Collapse Launcher!", - "OOBE_WelcomeSubtitle": "You are currently selecting {0} - {1} as your game. There are more games awaits you, find out more!", + "OOBE_WelcomeTitle": "Willkommen im Collapse Launcher!", + "OOBE_WelcomeSubtitle": "Du hast derzeit {0} – {1} als Spiel ausgewählt. Es warten noch weitere Spiele auf dich – erfahre mehr!", - "LauncherUpdated_NotifTitle": "Your launcher is up-to-date!", - "LauncherUpdated_NotifSubtitle": "Your launcher has been updated to: {0}. Go to \"{1}\" and click \"{2}\" to see what changed." + "LauncherUpdated_NotifTitle": "Collapse ist auf dem neuesten Stand!", + "LauncherUpdated_NotifSubtitle": "Der Launcher wurde aktualisiert auf: {0}. Gehe zu \"{1}\" und klicke \"{2}\" um sich die Änderungen anzusehen." } } diff --git a/Hi3Helper.Core/Lang/en_US.json b/Hi3Helper.Core/Lang/en_US.json index 172adb741..1d010adc4 100644 --- a/Hi3Helper.Core/Lang/en_US.json +++ b/Hi3Helper.Core/Lang/en_US.json @@ -560,7 +560,7 @@ "VideoBackground_FFmpegInstallNote": "Note", "VideoBackground_FFmpegInstallNoteContent": "Collapse Launcher only supports FFmpeg 7.x build. Other builds of FFmpeg aren't currently supported!", "VideoBackground_FFmpegInstallLockedTitle": "Changing FFmpeg Installation is Locked", - "VideoBackground_FFmpegInstallLockedContent": "FFmpeg is currently being used for decoding your current background. To change your existing installation, please disabling \"Use FFmpeg for Video Decoding\" feature first, restart your launcher, go back to this settings then click \"Start New Install or Locate Wizard\" button.", + "VideoBackground_FFmpegInstallLockedContent": "FFmpeg is currently being used for decoding your background. To change your existing installation, please disable the \"Use FFmpeg for Video Decoding\" feature first, then restart your launcher and come back to this setting.", "Update": "Check for Updates", "Update_CurVer": "Current Version:", diff --git a/Hi3Helper.Core/Lang/id_ID.json b/Hi3Helper.Core/Lang/id_ID.json index 5e5a98e21..cb22a45ac 100644 --- a/Hi3Helper.Core/Lang/id_ID.json +++ b/Hi3Helper.Core/Lang/id_ID.json @@ -560,7 +560,7 @@ "VideoBackground_FFmpegInstallNote": "Catatan", "VideoBackground_FFmpegInstallNoteContent": "Collapse Launcher hanya mendukung build FFmpeg 7.x. Build FFmpeg lainnya saat ini tidak didukung!", "VideoBackground_FFmpegInstallLockedTitle": "Perubahan Instalasi FFmpeg saat ini Dikunci", - "VideoBackground_FFmpegInstallLockedContent": "FFmpeg sedang digunakan untuk proses decoding background saat ini. Untuk mengganti instalasi saat ini, silahkan matikan fitur \"Gunakan FFmpeg untuk Decoding Video\" terlebih dahulu, restart launcher, kembali ke pengaturan ini dan klik tombol \"Mulai Instalasi Baru atau Pakai Lokasi Existing\".", + "VideoBackground_FFmpegInstallLockedContent": "FFmpeg saat ini sedang digunakan untuk decoding video background. Untuk mengubah instalasi saat ini, silahkan matikan \"Gunakan FFmpeg untuk Decoding Video\" terlebih dahulu, kemudian restart launcher dan kembali lagi ke pengaturan ini.", "Update": "Periksa Pembaruan", "Update_CurVer": "Versi saat ini:", @@ -591,7 +591,7 @@ "About": "Tentang", "About_Copyright1": "© 2022-2026", "About_Copyright2": " neon-nyan, Cry0, bagusnl,\r\n shatyuka & gablm", - "About_Copyright3": "Di bawah lisensi ", + "About_Copyright3": "Di bawah ", "About_Copyright4": ". Hak cipta dilindungi.", "LicenseType": "Lisensi MIT", @@ -601,7 +601,7 @@ "About_FFmpegCopyright3": " dan menggunakan ", "About_FFmpegCopyright4": " sebagai wrapper di bawah lisensi ", "About_FFmpegCopyright5": ".", - "About_FFmpegDonate": "Donasi ke Projek FFmpeg", + "About_FFmpegDonate": "Donasi ke Proyek FFmpeg", "Disclaimer": "Sanggahan", "Disclaimer1": "Aplikasi ini tidak berkaitan dengan", @@ -1266,15 +1266,15 @@ "BgContextMenu_ParallaxPixelShiftCustomDialogTitle": "Set Pixel Parallax Kustom (Min: {0}px, Maks: {1}px)", "StartupFFmpegInstallDialogTitle": "Instalasi FFmpeg Diperlukan", - "StartupFFmpegInstallDialogSubtitle1": "Dekoder FFmpeg (build 7.x) perlu dipasang untuk memutar video background dengan benar pada Collapse Launcher. Klik \"", - "StartupFFmpegInstallDialogSubtitle2": "\" untuk memasang FFmpeg dari awal atau mencari lokasi instalasi existing, atau klik \"", - "StartupFFmpegInstallDialogSubtitle3": "\" untuk tetap menggunakan dekoder bawaan Windows Media Foundation.", + "StartupFFmpegInstallDialogSubtitle1": "Saat ini Collapse Launcher membutuhkan Decoder FFmpeg (build 7.x) terpasang pada sistem kamu. Klik \"", + "StartupFFmpegInstallDialogSubtitle2": "\" untuk memasang FFmpeg dari awal, atau klik \"", + "StartupFFmpegInstallDialogSubtitle3": "\" untuk tetap menggunakan decoder Windows Media Foundation bawaan.", "StartupFFmpegInstallDialogSubtitle4": "Catatan:", - "StartupFFmpegInstallDialogSubtitle5": "Beberapa background video pada beberapa game akan telihat rusak atau terdisplay dengan tidak benar dikarenakan Color-space yang tidak didukung oleh dekoder bawaan Windows Media Foundation. Apabila kamu ingin menggunakan FFmpeg untuk dekod background video nantinya, kamu bisa masuk ke \"", - "StartupFFmpegInstallDialogSubtitle6": "\", lalu cari bagian \"", - "StartupFFmpegInstallDialogSubtitle7": "\" untuk memasang dan menggunakan dekoder FFmpeg.", - "StartupFFmpegInstallDialogInstallBtn": "Pasang & Pakai FFmpeg", - "StartupFFmpegInstallDialogUseBuiltInBtn": "Pakai Dekoder Bawaan", + "StartupFFmpegInstallDialogSubtitle5": "Beberapa game memiliki background video dengan Color-space yang tidak didukung oleh decoder bawaan Windows Media Foundation, sehingga menyebabkan frame terlihat rusak atau tidak dapat ditampilkan dengan benar. Apabila kamu ingin menggunakan FFmpeg nanti, masuk ke \"", + "StartupFFmpegInstallDialogSubtitle6": "\" lalu cari bagian \"", + "StartupFFmpegInstallDialogSubtitle7": "\" untuk memasang dan menggunakan FFmpeg sebagai decoder.", + "StartupFFmpegInstallDialogInstallBtn": "Pasang dan Pakai FFmpeg", + "StartupFFmpegInstallDialogUseBuiltInBtn": "Pakai Decoder Bawaan", "StartupFFmpegInstallDialogDoNotAskInstall": "Jangan tanya lagi untuk pasang FFmpeg", "Media_ExtNotSupported1": "Maaf tapi file extension untuk background gambar/video ini tidak didukung.", diff --git a/Hi3Helper.Core/Lang/ja_JP.json b/Hi3Helper.Core/Lang/ja_JP.json index 77770395c..2dad14b5c 100644 --- a/Hi3Helper.Core/Lang/ja_JP.json +++ b/Hi3Helper.Core/Lang/ja_JP.json @@ -560,7 +560,7 @@ "VideoBackground_FFmpegInstallNote": "注", "VideoBackground_FFmpegInstallNoteContent": "Collapse Launcherはバージョン7.xのFFmpegのみをサポートしています。その他バージョンのFFmpegは現在サポートされていません!", "VideoBackground_FFmpegInstallLockedTitle": "FFmpegの変更がロックされています", - "VideoBackground_FFmpegInstallLockedContent": "FFmpegが現在の動画背景のデコードに使用中です。既存のインストールを変更するには、まず\"動画のデコードにFFmpegを使う\"設定を無効にしてからランチャーを再起動し、再度\"新規インストールまたは既存インストールを参照\"ボタンを押してください。", + "VideoBackground_FFmpegInstallLockedContent": "FFmpegが現在の動画背景のデコードに使用中です。既存のインストールを変更するには、まず\"動画のデコードにFFmpegを使う\"設定を無効にしてからランチャーを再起動し、設定を変更し直してください。", "Update": "アップデートの確認", "Update_CurVer": "現在のバージョン:", @@ -1265,6 +1265,18 @@ "BgContextMenu_ParallaxPixelShiftCustomDialogTitle": "視差エフェクトのピクセル数(最小:{0}px、最大: {1}px)", + "StartupFFmpegInstallDialogTitle": "FFmpegのインストールが必要です", + "StartupFFmpegInstallDialogSubtitle1": "Collapse Launcherで動画背景を正常に再生するためには、FFmpeg(バージョン7.x)のインストールが必要です。\"", + "StartupFFmpegInstallDialogSubtitle2": "\"をクリックしてFFmpegを新規インストールするか、\"", + "StartupFFmpegInstallDialogSubtitle3": "\"をクリックしてWindows Media Foundationデコーダーを使用し続けるか選んでください。", + "StartupFFmpegInstallDialogSubtitle4": "注:", + "StartupFFmpegInstallDialogSubtitle5": "Windows Media Foundationデコーダーでサポートされていない色空間タイプが原因で、特定のゲームを選択したとき、動画背景の表示が乱れる場合があります。動画背景のデコーダーを後からFFmpegに変更したい場合は、\"", + "StartupFFmpegInstallDialogSubtitle6": "\"のページから”", + "StartupFFmpegInstallDialogSubtitle7": "\"のセクションを参照して、FFmpegをインストールしてください。", + "StartupFFmpegInstallDialogInstallBtn": "FFmpegをインストールして使用", + "StartupFFmpegInstallDialogUseBuiltInBtn": "ビルトインデコーダーを使う", + "StartupFFmpegInstallDialogDoNotAskInstall": "今後、FFmpegのインストールを要求しない", + "Media_ExtNotSupported1": "申し訳ありませんが、以下の拡張子の背景画像/動画ファイルはサポートされていません。", "Media_ExtNotSupported2": "ファイルのパス/URL:{0}", "Media_ExtNotSupportedTitle": "サポートされていない背景ファイルです", diff --git a/Hi3Helper.Core/Lang/zh_CN.json b/Hi3Helper.Core/Lang/zh_CN.json index 229631c4c..fb25c288a 100644 --- a/Hi3Helper.Core/Lang/zh_CN.json +++ b/Hi3Helper.Core/Lang/zh_CN.json @@ -560,7 +560,7 @@ "VideoBackground_FFmpegInstallNote": "备注:", "VideoBackground_FFmpegInstallNoteContent": "Collapse 启动器仅支持 FFmpeg 7.x 版本。其他版本的 FFmpeg 暂不支持!", "VideoBackground_FFmpegInstallLockedTitle": "更改 FFmpeg 安装已被锁定", - "VideoBackground_FFmpegInstallLockedContent": "FFmpeg 目前被用来解码您当前的背景。要更改您现有的安装,请先禁用“使用 FFmpeg 进行视频解码”功能,重启您的启动器,返回到这项设置并点击“开始新安装或定位向导”按钮。", + "VideoBackground_FFmpegInstallLockedContent": "FFmpeg 目前被用来解码您的背景。要更改您现有的安装,请先禁用“使用 FFmpeg 进行视频解码”功能,然后重启您的启动器,再返回到这项设置。", "Update": "检查更新", "Update_CurVer": "当前版本:", diff --git a/Hi3Helper.Core/packages.lock.json b/Hi3Helper.Core/packages.lock.json index bf4b15caf..6e0426ab1 100644 --- a/Hi3Helper.Core/packages.lock.json +++ b/Hi3Helper.Core/packages.lock.json @@ -16,14 +16,14 @@ }, "Sentry": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "kZkHnj9NvQTjf5e8VmVQUT2HdVSmph9MhSm6U+vGoB4vq2uR1a+ZRHpAksNJNl7EjaGbYp55cOWqx5Nh0jQc8w==" + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "PwcF5yIzcKuhd/3BOxU3QHJA5/xYiuSNSaSpXi2kR3x7ONKel73xi49GfYvRg4mbMN1gRjxduqxQL6iRNNWqBA==" }, "Google.Protobuf": { "type": "Transitive", - "resolved": "3.34.0", - "contentHash": "a5US9akiNczS5kC7qBqYqJmnxHVQDITZD6GRRbwGHk/oa17EwOGE3PHIWFVeHTqCctq8mVjLSelwsxCkYYBinA==" + "resolved": "3.34.1", + "contentHash": "212vdYxRuVopGE5bess6Jg5oXWyizA6hcLPTI7G+qA4PthQEvfeof3njT+7VSY5v/+O0P22xTydiP5fSJJpGEA==" }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", @@ -46,7 +46,7 @@ "hi3helper.enctool": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.34.0, )", + "Google.Protobuf": "[3.34.1, )", "Hi3Helper.Http": "[2.0.0, )", "Hi3Helper.Win32": "[1.0.0, )", "System.IO.Hashing": "[10.0.5, )" diff --git a/Hi3Helper.EncTool b/Hi3Helper.EncTool index 9da483955..c6db98c46 160000 --- a/Hi3Helper.EncTool +++ b/Hi3Helper.EncTool @@ -1 +1 @@ -Subproject commit 9da483955bd6cf408d022ab032c93533a9b2f386 +Subproject commit c6db98c46f1bd243e2a8953e26d831cabd4d2f1a diff --git a/Hi3Helper.Sophon b/Hi3Helper.Sophon index ffb7a4b43..1fb27baeb 160000 --- a/Hi3Helper.Sophon +++ b/Hi3Helper.Sophon @@ -1 +1 @@ -Subproject commit ffb7a4b43865097e41b2236bf73aec818ffeb561 +Subproject commit 1fb27baeb4a271072e836d4dd083a3d061e83b6e diff --git a/Hi3Helper.TaskScheduler/packages.lock.json b/Hi3Helper.TaskScheduler/packages.lock.json index 2135558f9..96a62a31d 100644 --- a/Hi3Helper.TaskScheduler/packages.lock.json +++ b/Hi3Helper.TaskScheduler/packages.lock.json @@ -17,6 +17,15 @@ "resolved": "6.9.3", "contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA==" }, + "Microsoft.NETFramework.ReferenceAssemblies": { + "type": "Direct", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", + "dependencies": { + "Microsoft.NETFramework.ReferenceAssemblies.net462": "1.0.3" + } + }, "System.Net.Http": { "type": "Direct", "requested": "[4.3.4, )", @@ -38,6 +47,11 @@ "resolved": "2.12.2", "contentHash": "glpAb3VrwfdAofp6PIyAzL0ZeTV7XUJ8muu0oZoTeyU5jtk2sMJ6QAMRRuFbovcaj+SBJiEUGklxIWOqQoxshA==" }, + "Microsoft.NETFramework.ReferenceAssemblies.net462": { + "type": "Transitive", + "resolved": "1.0.3", + "contentHash": "IzAV30z22ESCeQfxP29oVf4qEo8fBGXLXSU6oacv/9Iqe6PzgHDKCaWfwMBak7bSJQM0F5boXWoZS+kChztRIQ==" + }, "System.Security.Cryptography.Algorithms": { "type": "Transitive", "resolved": "4.3.0", diff --git a/ImageEx b/ImageEx index f3c3c605e..078da7c9e 160000 --- a/ImageEx +++ b/ImageEx @@ -1 +1 @@ -Subproject commit f3c3c605e4b3a699e609229e4fb975eca9e0e553 +Subproject commit 078da7c9e9bfb46ab107107b9d9808ebd60ca6b6 diff --git a/README.md b/README.md index 741f66e33..5db3c9f78 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Made by all captains around the world with ❤️. Fight for all that is beautif - + @@ -158,10 +158,11 @@ Made by all captains around the world with ❤️. Fight for all that is beautif - + +
Kemal Setya Adhi
Kemal Setya Adhi

💻 🎨 🧑‍🏫 🚧 👀 📆
Kemal Setya Adhi
Kemal Setya Adhi

💻 🎨 🧑‍🏫 🚧 👀 📆
Ron Friedman
Ron Friedman

💻 🚧 👀 📆
Bagus Nur Listiyono
Bagus Nur Listiyono

💻 🚧 👀 📣 🚇 📆
Gabriel Lima
Gabriel Lima

💻 🌍
Iskandar Montano
Iskandar Montano

💻
Scighost
Scighost

🐛
IhoFox
IhoFox

🌍
kujou
kujou

🌍
puyomi
puyomi

🌍
Souta
Souta

🌍
eden
eden

🌍