mirror of
https://github.com/GreemDev/Ryujinx
synced 2024-12-21 11:26:33 +01:00
Merge ebc9441eaf
into 8db5a7e98b
This commit is contained in:
commit
cde3d438de
28 changed files with 274 additions and 25 deletions
|
@ -3,6 +3,7 @@ using ARMeilleure.CodeGen.Linking;
|
|||
using ARMeilleure.CodeGen.Unwinding;
|
||||
using ARMeilleure.Common;
|
||||
using ARMeilleure.Memory;
|
||||
using ARMeilleure.State;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Logging;
|
||||
|
@ -30,7 +31,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
||||
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
||||
|
||||
private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project.
|
||||
private const uint InternalVersion = 7007; //! To be incremented manually for each change to the ARMeilleure project.
|
||||
|
||||
private const string ActualDir = "0";
|
||||
private const string BackupDir = "1";
|
||||
|
@ -185,6 +186,36 @@ namespace ARMeilleure.Translation.PTC
|
|||
InitializeCarriers();
|
||||
}
|
||||
|
||||
private bool ContainsBlacklistedFunctions()
|
||||
{
|
||||
List<ulong> blacklist = Profiler.GetBlacklistedFunctions();
|
||||
bool containsBlacklistedFunctions = false;
|
||||
_infosStream.Seek(0L, SeekOrigin.Begin);
|
||||
bool foundBadFunction = false;
|
||||
|
||||
for (int index = 0; index < GetEntriesCount(); index++)
|
||||
{
|
||||
InfoEntry infoEntry = DeserializeStructure<InfoEntry>(_infosStream);
|
||||
foreach (ulong address in blacklist)
|
||||
{
|
||||
if (infoEntry.Address == address)
|
||||
{
|
||||
containsBlacklistedFunctions = true;
|
||||
Logger.Warning?.Print(LogClass.Ptc, "PPTC cache invalidated: Found blacklisted functions in PPTC cache");
|
||||
foundBadFunction = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundBadFunction)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return containsBlacklistedFunctions;
|
||||
}
|
||||
|
||||
private void PreLoad()
|
||||
{
|
||||
string fileNameActual = $"{CachePathActual}.cache";
|
||||
|
@ -533,7 +564,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
|
||||
public void LoadTranslations(Translator translator)
|
||||
{
|
||||
if (AreCarriersEmpty())
|
||||
if (AreCarriersEmpty() || ContainsBlacklistedFunctions())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -836,10 +867,18 @@ namespace ARMeilleure.Translation.PTC
|
|||
while (profiledFuncsToTranslate.TryDequeue(out var item))
|
||||
{
|
||||
ulong address = item.address;
|
||||
ExecutionMode executionMode = item.funcProfile.Mode;
|
||||
bool highCq = item.funcProfile.HighCq;
|
||||
|
||||
Debug.Assert(Profiler.IsAddressInStaticCodeRange(address));
|
||||
|
||||
TranslatedFunction func = translator.Translate(address, item.funcProfile.Mode, item.funcProfile.HighCq);
|
||||
TranslatedFunction func = translator.Translate(address, executionMode, highCq);
|
||||
|
||||
if (func == null)
|
||||
{
|
||||
Profiler.UpdateEntry(address, executionMode, true, true);
|
||||
continue;
|
||||
}
|
||||
|
||||
bool isAddressUnique = translator.Functions.TryAdd(address, func.GuestSize, func);
|
||||
|
||||
|
@ -886,7 +925,14 @@ namespace ARMeilleure.Translation.PTC
|
|||
|
||||
PtcStateChanged?.Invoke(PtcLoadingState.Loaded, _translateCount, _translateTotalCount);
|
||||
|
||||
Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s");
|
||||
if (_translateCount == _translateTotalCount)
|
||||
{
|
||||
Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | {_translateTotalCount - _translateCount} function{(_translateTotalCount - _translateCount != 1 ? "s" : "")} blacklisted | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s");
|
||||
}
|
||||
|
||||
Thread preSaveThread = new(PreSave)
|
||||
{
|
||||
|
|
|
@ -23,10 +23,11 @@ namespace ARMeilleure.Translation.PTC
|
|||
{
|
||||
private const string OuterHeaderMagicString = "Pohd\0\0\0\0";
|
||||
|
||||
private const uint InternalVersion = 5518; //! Not to be incremented manually for each change to the ARMeilleure project.
|
||||
private const uint InternalVersion = 7007; //! Not to be incremented manually for each change to the ARMeilleure project.
|
||||
|
||||
private static readonly uint[] _migrateInternalVersions = {
|
||||
1866,
|
||||
5518,
|
||||
};
|
||||
|
||||
private const int SaveInterval = 30; // Seconds.
|
||||
|
@ -74,20 +75,30 @@ namespace ARMeilleure.Translation.PTC
|
|||
Enabled = false;
|
||||
}
|
||||
|
||||
public void AddEntry(ulong address, ExecutionMode mode, bool highCq)
|
||||
public void AddEntry(ulong address, ExecutionMode mode, bool highCq, bool blacklist = false)
|
||||
{
|
||||
if (IsAddressInStaticCodeRange(address))
|
||||
{
|
||||
Debug.Assert(!highCq);
|
||||
|
||||
lock (_lock)
|
||||
if (blacklist)
|
||||
{
|
||||
ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false));
|
||||
lock (_lock)
|
||||
{
|
||||
ProfiledFuncs[address] = new FuncProfile(mode, highCq: false, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq)
|
||||
public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq, bool? blacklist = null)
|
||||
{
|
||||
if (IsAddressInStaticCodeRange(address))
|
||||
{
|
||||
|
@ -97,7 +108,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
{
|
||||
Debug.Assert(ProfiledFuncs.ContainsKey(address));
|
||||
|
||||
ProfiledFuncs[address] = new FuncProfile(mode, highCq: true);
|
||||
ProfiledFuncs[address] = new FuncProfile(mode, highCq: true, blacklist ?? ProfiledFuncs[address].Blacklist);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -113,7 +124,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
|
||||
foreach (var profiledFunc in ProfiledFuncs)
|
||||
{
|
||||
if (!funcs.ContainsKey(profiledFunc.Key))
|
||||
if (!funcs.ContainsKey(profiledFunc.Key) && !profiledFunc.Value.Blacklist)
|
||||
{
|
||||
profiledFuncsToTranslate.Enqueue((profiledFunc.Key, profiledFunc.Value));
|
||||
}
|
||||
|
@ -128,6 +139,24 @@ namespace ARMeilleure.Translation.PTC
|
|||
ProfiledFuncs.TrimExcess();
|
||||
}
|
||||
|
||||
public List<ulong> GetBlacklistedFunctions()
|
||||
{
|
||||
List<ulong> funcs = new List<ulong>();
|
||||
|
||||
foreach (var profiledFunc in ProfiledFuncs)
|
||||
{
|
||||
if (profiledFunc.Value.Blacklist)
|
||||
{
|
||||
if (!funcs.Contains(profiledFunc.Key))
|
||||
{
|
||||
funcs.Add(profiledFunc.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return funcs;
|
||||
}
|
||||
|
||||
public void PreLoad()
|
||||
{
|
||||
_lastHash = default;
|
||||
|
@ -218,13 +247,18 @@ namespace ARMeilleure.Translation.PTC
|
|||
return false;
|
||||
}
|
||||
|
||||
Func<ulong, FuncProfile, (ulong, FuncProfile)> migrateEntryFunc = null;
|
||||
|
||||
switch (outerHeader.InfoFileVersion)
|
||||
{
|
||||
case InternalVersion:
|
||||
ProfiledFuncs = Deserialize(stream);
|
||||
break;
|
||||
case 1866:
|
||||
ProfiledFuncs = Deserialize(stream, (address, profile) => (address + 0x500000UL, profile));
|
||||
migrateEntryFunc = (address, profile) => (address + 0x500000UL, profile);
|
||||
goto case 5518;
|
||||
case 5518:
|
||||
ProfiledFuncs = DeserializeAddBlacklist(stream, migrateEntryFunc);
|
||||
break;
|
||||
default:
|
||||
Logger.Error?.Print(LogClass.Ptc, $"No migration path for {nameof(outerHeader.InfoFileVersion)} '{outerHeader.InfoFileVersion}'. Discarding cache.");
|
||||
|
@ -254,6 +288,16 @@ namespace ARMeilleure.Translation.PTC
|
|||
return DeserializeDictionary<ulong, FuncProfile>(stream, DeserializeStructure<FuncProfile>);
|
||||
}
|
||||
|
||||
private static Dictionary<ulong, FuncProfile> DeserializeAddBlacklist(Stream stream, Func<ulong, FuncProfile, (ulong, FuncProfile)> migrateEntryFunc = null)
|
||||
{
|
||||
if (migrateEntryFunc != null)
|
||||
{
|
||||
return DeserializeAndUpdateDictionary(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure<FuncProfilePreBlacklist>(stream)); }, migrateEntryFunc);
|
||||
}
|
||||
|
||||
return DeserializeDictionary<ulong, FuncProfile>(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure<FuncProfilePreBlacklist>(stream)); });
|
||||
}
|
||||
|
||||
private static ReadOnlySpan<byte> GetReadOnlySpan(MemoryStream memoryStream)
|
||||
{
|
||||
return new(memoryStream.GetBuffer(), (int)memoryStream.Position, (int)memoryStream.Length - (int)memoryStream.Position);
|
||||
|
@ -385,13 +429,35 @@ namespace ARMeilleure.Translation.PTC
|
|||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 6*/)]
|
||||
public struct FuncProfile
|
||||
{
|
||||
public ExecutionMode Mode;
|
||||
public bool HighCq;
|
||||
public bool Blacklist;
|
||||
|
||||
public FuncProfile(ExecutionMode mode, bool highCq)
|
||||
public FuncProfile(ExecutionMode mode, bool highCq, bool blacklist)
|
||||
{
|
||||
Mode = mode;
|
||||
HighCq = highCq;
|
||||
Blacklist = blacklist;
|
||||
}
|
||||
|
||||
public FuncProfile(FuncProfilePreBlacklist fp)
|
||||
{
|
||||
Mode = fp.Mode;
|
||||
HighCq = fp.HighCq;
|
||||
Blacklist = false;
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
|
||||
public struct FuncProfilePreBlacklist
|
||||
{
|
||||
public ExecutionMode Mode;
|
||||
public bool HighCq;
|
||||
|
||||
public FuncProfilePreBlacklist(ExecutionMode mode, bool highCq)
|
||||
{
|
||||
Mode = mode;
|
||||
HighCq = highCq;
|
||||
|
|
|
@ -249,6 +249,11 @@ namespace ARMeilleure.Translation
|
|||
|
||||
ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter<uint> counter);
|
||||
|
||||
if (cfg == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
ulong funcSize = funcRange.End - funcRange.Start;
|
||||
|
||||
Logger.EndPass(PassName.Translation, cfg);
|
||||
|
@ -407,6 +412,11 @@ namespace ARMeilleure.Translation
|
|||
if (opCode.Instruction.Emitter != null)
|
||||
{
|
||||
opCode.Instruction.Emitter(context);
|
||||
if (opCode.Instruction.Name == InstName.Und && blkIndex == 0)
|
||||
{
|
||||
range = new Range(rangeStart, rangeEnd);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace Ryujinx.HLE.HOS
|
|||
private readonly string _titleIdText;
|
||||
private readonly string _displayVersion;
|
||||
private readonly bool _diskCacheEnabled;
|
||||
private readonly string _diskCacheSelector;
|
||||
private readonly ulong _codeAddress;
|
||||
private readonly ulong _codeSize;
|
||||
|
||||
|
@ -31,6 +32,7 @@ namespace Ryujinx.HLE.HOS
|
|||
string titleIdText,
|
||||
string displayVersion,
|
||||
bool diskCacheEnabled,
|
||||
string diskCacheSelector,
|
||||
ulong codeAddress,
|
||||
ulong codeSize)
|
||||
{
|
||||
|
@ -39,6 +41,7 @@ namespace Ryujinx.HLE.HOS
|
|||
_titleIdText = titleIdText;
|
||||
_displayVersion = displayVersion;
|
||||
_diskCacheEnabled = diskCacheEnabled;
|
||||
_diskCacheSelector = diskCacheSelector;
|
||||
_codeAddress = codeAddress;
|
||||
_codeSize = codeSize;
|
||||
}
|
||||
|
@ -114,7 +117,7 @@ namespace Ryujinx.HLE.HOS
|
|||
}
|
||||
}
|
||||
|
||||
DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, "default"); //Ready for exefs profiles
|
||||
DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, _diskCacheSelector ?? "default");
|
||||
|
||||
return processContext;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ using LibHac.FsSystem;
|
|||
using LibHac.Loader;
|
||||
using LibHac.Tools.FsSystem;
|
||||
using LibHac.Tools.FsSystem.RomFs;
|
||||
using LibHac.Util;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
|
@ -18,6 +19,7 @@ using System.Collections.Specialized;
|
|||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using LazyFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.LazyFile;
|
||||
using Path = System.IO.Path;
|
||||
|
||||
|
@ -583,6 +585,7 @@ namespace Ryujinx.HLE.HOS
|
|||
public BitVector32 Stubs;
|
||||
public BitVector32 Replaces;
|
||||
public MetaLoader Npdm;
|
||||
public string Hash;
|
||||
|
||||
public bool Modified => (Stubs.Data | Replaces.Data) != 0;
|
||||
}
|
||||
|
@ -593,8 +596,11 @@ namespace Ryujinx.HLE.HOS
|
|||
{
|
||||
Stubs = new BitVector32(),
|
||||
Replaces = new BitVector32(),
|
||||
Hash = null,
|
||||
};
|
||||
|
||||
string tempHash = string.Empty;
|
||||
|
||||
if (!_appMods.TryGetValue(applicationId, out ModCache mods) || mods.ExefsDirs.Count == 0)
|
||||
{
|
||||
return modLoadResult;
|
||||
|
@ -630,8 +636,16 @@ namespace Ryujinx.HLE.HOS
|
|||
|
||||
modLoadResult.Replaces[1 << i] = true;
|
||||
|
||||
nsos[i] = new NsoExecutable(nsoFile.OpenRead().AsStorage(), nsoName);
|
||||
Logger.Info?.Print(LogClass.ModLoader, $"NSO '{nsoName}' replaced");
|
||||
using (FileStream stream = nsoFile.OpenRead())
|
||||
{
|
||||
nsos[i] = new NsoExecutable(stream.AsStorage(), nsoName);
|
||||
Logger.Info?.Print(LogClass.ModLoader, $"NSO '{nsoName}' replaced");
|
||||
using (MD5 md5 = MD5.Create())
|
||||
{
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
tempHash += BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
modLoadResult.Stubs[1 << i] |= File.Exists(Path.Combine(mod.Path.FullName, nsoName + StubExtension));
|
||||
|
@ -663,6 +677,14 @@ namespace Ryujinx.HLE.HOS
|
|||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(tempHash))
|
||||
{
|
||||
using (MD5 md5 = MD5.Create())
|
||||
{
|
||||
modLoadResult.Hash += BitConverter.ToString(md5.ComputeHash(tempHash.ToBytes())).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
|
||||
return modLoadResult;
|
||||
}
|
||||
|
||||
|
|
|
@ -82,13 +82,6 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||
// Apply Nsos patches.
|
||||
device.Configuration.VirtualFileSystem.ModLoader.ApplyNsoPatches(programId, nsoExecutables);
|
||||
|
||||
// Don't use PTC if ExeFS files have been replaced.
|
||||
bool enablePtc = device.System.EnablePtc && !modLoadResult.Modified;
|
||||
if (!enablePtc)
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled.");
|
||||
}
|
||||
|
||||
string programName = string.Empty;
|
||||
|
||||
if (!isHomebrew && programId > 0x010000000000FFFF)
|
||||
|
@ -115,7 +108,8 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||
device.System.KernelContext,
|
||||
metaLoader,
|
||||
nacpData,
|
||||
enablePtc,
|
||||
device.System.EnablePtc,
|
||||
modLoadResult.Hash,
|
||||
true,
|
||||
programName,
|
||||
metaLoader.GetProgramId(),
|
||||
|
|
|
@ -212,6 +212,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||
dummyExeFs.GetNpdm(),
|
||||
nacpData,
|
||||
diskCacheEnabled: false,
|
||||
diskCacheSelector: null,
|
||||
allowCodeMemoryForJit: true,
|
||||
programName,
|
||||
programId,
|
||||
|
|
|
@ -186,6 +186,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
false,
|
||||
null,
|
||||
codeAddress,
|
||||
codeSize);
|
||||
|
||||
|
@ -226,6 +227,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||
MetaLoader metaLoader,
|
||||
BlitStruct<ApplicationControlProperty> applicationControlProperties,
|
||||
bool diskCacheEnabled,
|
||||
string diskCacheSelector,
|
||||
bool allowCodeMemoryForJit,
|
||||
string name,
|
||||
ulong programId,
|
||||
|
@ -374,6 +376,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||
$"{programId:x16}",
|
||||
displayVersion,
|
||||
diskCacheEnabled,
|
||||
diskCacheSelector,
|
||||
codeStart,
|
||||
codeSize);
|
||||
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـPPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "تنظيف ذاكرة مرشحات الفيديو المؤقتة",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "يحذف ذاكرة مرشحات الفيديو المؤقتة الخاصة بالتطبيق",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "فتح مجلد PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "تحذير",
|
||||
"DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟",
|
||||
"DialogPPTCDeletionErrorMessage": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"DialogShaderDeletionErrorMessage": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "واجه ريوجينكس خطأ",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Cache-Verwaltung",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Shader Cache löschen",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Löscht den Shader-Cache der Anwendung",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC-Verzeichnis öffnen",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Warnung",
|
||||
"DialogPPTCDeletionMessage": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?",
|
||||
"DialogPPTCDeletionErrorMessage": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?",
|
||||
"DialogShaderDeletionErrorMessage": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten",
|
||||
"DialogRyujinxErrorMessage": "Ein Fehler ist aufgetreten",
|
||||
|
|
|
@ -76,6 +76,8 @@
|
|||
"GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Εκκαθάριση Προσωρινής Μνήμης Shader",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Διαγράφει την προσωρινή μνήμη Shader της εφαρμογής",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Άνοιγμα Τοποθεσίας PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει τη προσωρινή μνήμη PPTC της εφαρμογής",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Προειδοποίηση",
|
||||
"DialogPPTCDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogPPTCDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogShaderDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Cache Management",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Queue PPTC Rebuild",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Trigger PPTC to rebuild at boot time on the next game launch",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Purge Shader Cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Deletes Application's shader cache",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Open PPTC Directory",
|
||||
|
@ -516,6 +518,7 @@
|
|||
"DialogWarning": "Warning",
|
||||
"DialogPPTCDeletionMessage": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCDeletionErrorMessage": "Error purging PPTC cache at {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "You are about to delete the Shader cache for :\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionErrorMessage": "Error purging Shader cache at {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx has encountered an error",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Gestión de caché ",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Limpiar caché de sombreadores",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Eliminar la caché de sombreadores de esta aplicación",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Abrir carpeta de PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Advertencia",
|
||||
"DialogPPTCDeletionMessage": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
|
||||
"DialogPPTCDeletionErrorMessage": "Error purgando la caché de PPTC en {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
|
||||
"DialogShaderDeletionErrorMessage": "Error purgando la caché de sombreadores en {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx ha encontrado un error",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Gestion des caches",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Purger les shaders",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Supprime les shaders du jeu",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Ouvrir le dossier du PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Avertissement",
|
||||
"DialogPPTCDeletionMessage": "Vous êtes sur le point de mettre en file d'attente une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogPPTCDeletionErrorMessage": "Erreur lors de la purge du cache PPTC à {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Vous êtes sur le point de supprimer le cache du Shader pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogShaderDeletionErrorMessage": "Erreur lors de la purge du cache du Shader à {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx a rencontré une erreur",
|
||||
|
|
|
@ -74,6 +74,8 @@
|
|||
"GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים",
|
||||
"GameListContextMenuCacheManagement": "ניהול מטמון",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "ניקוי מטמון הצללות",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "מוחק את מטמון ההצללות של היישום",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "אזהרה",
|
||||
"DialogPPTCDeletionMessage": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}",
|
||||
"DialogPPTCDeletionErrorMessage": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}",
|
||||
"DialogShaderDeletionErrorMessage": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "ריוג'ינקס נתקלה בשגיאה",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Gestione della cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Elimina la cache degli shader",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Elimina la cache degli shader dell'applicazione",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Apri la cartella della cache PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Avviso",
|
||||
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx ha incontrato un errore",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "キャッシュ管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "シェーダーキャッシュを破棄",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "アプリケーションのシェーダーキャッシュを破棄します",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC ディレクトリを開く",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "警告",
|
||||
"DialogPPTCDeletionMessage": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?",
|
||||
"DialogPPTCDeletionErrorMessage": "PPTC キャッシュ破棄エラー {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?",
|
||||
"DialogShaderDeletionErrorMessage": "シェーダーキャッシュ破棄エラー {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "エラーが発生しました",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "캐시 관리",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 실행 부팅 시, PPTC를 트리거하여 다시 구성",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "퍼지 셰이더 캐시",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "앱의 셰이더 캐시 삭제",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC 디렉터리 열기",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "경고",
|
||||
"DialogPPTCDeletionMessage": "다음에 부팅할 때, PPTC 재구축을 대기열에 추가하려고 합니다.\n\n{0}\n\n계속하시겠습니까?",
|
||||
"DialogPPTCDeletionErrorMessage": "{0}에서 PPTC 캐시를 지우는 중 오류 발생 : {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "다음 셰이더 캐시를 삭제 :\n\n{0}\n\n계속하시겠습니까?",
|
||||
"DialogShaderDeletionErrorMessage": "{0}에서 셰이더 캐시를 삭제하는 중 오류 발생 : {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx에서 오류 발생",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Zarządzanie Cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Wyczyść pamięć podręczną cieni",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Usuwa pamięć podręczną cieni danej aplikacji",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Otwórz katalog PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Uwaga",
|
||||
"DialogPPTCDeletionMessage": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"DialogPPTCDeletionErrorMessage": "Błąd czyszczenia cache PPTC w {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?",
|
||||
"DialogShaderDeletionErrorMessage": "Błąd czyszczenia cache Shaderów w {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx napotkał błąd",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Gerenciamento de cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Limpar cache de Shader",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Deleta o cache de Shader armazenado em disco do jogo",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Abrir diretório do cache PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Alerta",
|
||||
"DialogPPTCDeletionMessage": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?",
|
||||
"DialogPPTCDeletionErrorMessage": "Erro apagando cache PPTC em {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?",
|
||||
"DialogShaderDeletionErrorMessage": "Erro apagando o cache de Shader em {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx encontrou um erro",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Управление кэшем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Очистить кэш шейдеров",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Удаляет кеш шейдеров приложения",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Открыть папку PPTC",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Внимание",
|
||||
"DialogPPTCDeletionMessage": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogPPTCDeletionErrorMessage": "Ошибка очистки кэша PPTC в {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "จัดการแคช",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "เพิ่มคิวการสร้าง PPTC ใหม่",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "ล้างแคช แสงเงา",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "ลบแคช แสงเงา ของแอปพลิเคชัน",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "เปิดไดเรกทอรี่ PPTC",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Önbellek Yönetimi",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Shader Önbelleğini Temizle",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Uygulamanın shader önbelleğini temizler",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC Dizinini Aç",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "Uyarı",
|
||||
"DialogPPTCDeletionMessage": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogPPTCDeletionErrorMessage": "Belirtilen PPTC cache temizlenirken hata {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogShaderDeletionErrorMessage": "Belirtilen Shader cache temizlenirken hata {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx bir hata ile karşılaştı",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "Керування кешем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Очистити кеш шейдерів",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Видаляє кеш шейдерів програми",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Відкрити каталог PPTC",
|
||||
|
@ -515,6 +517,7 @@
|
|||
"DialogWarning": "Увага",
|
||||
"DialogPPTCDeletionMessage": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
|
||||
"DialogPPTCDeletionErrorMessage": "Помилка очищення кешу PPTC на {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
|
||||
"DialogShaderDeletionErrorMessage": "Помилка очищення кешу шейдерів на {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "У Ryujinx сталася помилка",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "缓存管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "清除着色器缓存文件",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "打开 PPTC 缓存目录",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "警告",
|
||||
"DialogPPTCDeletionMessage": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?",
|
||||
"DialogPPTCDeletionErrorMessage": "清除 {0} 的 PPTC 缓存文件时出错:{1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?",
|
||||
"DialogShaderDeletionErrorMessage": "清除 {0} 的着色器缓存文件时出错:{1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx 模拟器发生错误",
|
||||
|
|
|
@ -75,6 +75,8 @@
|
|||
"GameListContextMenuCacheManagement": "快取管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建",
|
||||
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
|
||||
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "清除著色器快取",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "刪除應用程式的著色器快取",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "開啟 PPTC 資料夾",
|
||||
|
@ -504,6 +506,7 @@
|
|||
"DialogWarning": "警告",
|
||||
"DialogPPTCDeletionMessage": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogPPTCDeletionErrorMessage": "在 {0} 清除 PPTC 快取時出錯: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogShaderDeletionMessage": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogShaderDeletionErrorMessage": "在 {0} 清除著色器快取時出錯: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx 遇到錯誤",
|
||||
|
|
|
@ -82,6 +82,11 @@
|
|||
Header="{ext:Locale GameListContextMenuCacheManagementPurgePptc}"
|
||||
Icon="{ext:Icon mdi-refresh}"
|
||||
ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementPurgePptcToolTip}" />
|
||||
<MenuItem
|
||||
Click="NukePtcCache_Click"
|
||||
Header="{ext:Locale GameListContextMenuCacheManagementNukePptc}"
|
||||
Icon="{ext:Icon mdi-delete-alert}"
|
||||
ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementNukePptcToolTip}" />
|
||||
<MenuItem
|
||||
Click="PurgeShaderCache_Click"
|
||||
Header="{ext:Locale GameListContextMenuCacheManagementPurgeShaderCache}"
|
||||
|
|
|
@ -170,6 +170,52 @@ namespace Ryujinx.Ava.UI.Controls
|
|||
}
|
||||
}
|
||||
|
||||
public async void NukePtcCache_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||
return;
|
||||
|
||||
UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog(
|
||||
LocaleManager.Instance[LocaleKeys.DialogWarning],
|
||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCNukeMessage, viewModel.SelectedApplication.Name)
|
||||
);
|
||||
|
||||
if (result == UserResult.Yes)
|
||||
{
|
||||
DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "0"));
|
||||
DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "1"));
|
||||
|
||||
List<FileInfo> cacheFiles = new();
|
||||
|
||||
if (mainDir.Exists)
|
||||
{
|
||||
cacheFiles.AddRange(mainDir.EnumerateFiles("*.cache"));
|
||||
cacheFiles.AddRange(mainDir.EnumerateFiles("*.info"));
|
||||
}
|
||||
|
||||
if (backupDir.Exists)
|
||||
{
|
||||
cacheFiles.AddRange(backupDir.EnumerateFiles("*.cache"));
|
||||
cacheFiles.AddRange(mainDir.EnumerateFiles("*.info"));
|
||||
}
|
||||
|
||||
if (cacheFiles.Count > 0)
|
||||
{
|
||||
foreach (FileInfo file in cacheFiles)
|
||||
{
|
||||
try
|
||||
{
|
||||
file.Delete();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionErrorMessage, file.Name, ex));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async void PurgeShaderCache_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||
|
|
Loading…
Reference in a new issue