Compare commits

...

8 commits

Author SHA1 Message Date
LotP1
24b5aa65a1
Merge ebc9441eaf into 8e00cb5232 2024-12-15 16:46:47 +00:00
LotP1
ebc9441eaf default value of dishCacheSelector should be null 2024-12-15 17:46:46 +01:00
LotP1
5ffbf2e637 Add nuke PPTC option to cache management 2024-12-15 17:46:46 +01:00
LotP1
64293bf556 Remove outdated comment 2024-12-15 17:46:46 +01:00
LotP1
9b1372c181 Implement blacklist functionality
- Added blacklist status to FunctionProfile
- Added PPTC Info file updater from v5518 and updated old updater logic to allow multiple update passes
- Added blacklist check to PPTC Cache loading
- Added marking functions as blacklisted if they do not yet exist at PPTC translation time
- Logger now shows how many functions were blacklisted when translating new functions to PPTC cache
2024-12-15 17:46:46 +01:00
LotP1
6dc63de2f0 Fix incorrect hash logic
The stream hadn't been reset causing all hashes to be the same in most cases
2024-12-15 17:46:46 +01:00
LotP1
c2a3b490f3 Add cacheselector and allow PPTC with exefs mods
this is currently broken with Exlaunch mods that use hooks
2024-12-15 17:46:45 +01:00
GabCoolGuy
8e00cb5232
UI: Add faq, setup and multiplayer guides to the Help dropdown (#383)
Some checks failed
Canary release job / Create tag (push) Has been cancelled
Canary release job / Release for linux-arm64 (push) Has been cancelled
Canary release job / Release for linux-x64 (push) Has been cancelled
Canary release job / Release for win-x64 (push) Has been cancelled
Canary release job / Release MacOS universal (push) Has been cancelled
2024-12-15 10:45:37 -06:00
31 changed files with 413 additions and 25 deletions

View file

@ -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);
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)
{

View file

@ -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);
if (blacklist)
{
lock (_lock)
{
ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false));
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;

View file

@ -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
{

View file

@ -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;
}

View file

@ -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);
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;
}

View file

@ -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(),

View file

@ -212,6 +212,7 @@ namespace Ryujinx.HLE.Loaders.Processes
dummyExeFs.GetNpdm(),
nacpData,
diskCacheEnabled: false,
diskCacheSelector: null,
allowCodeMemoryForJit: true,
programName,
programId,

View file

@ -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);

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_مساعدة",
"MenuBarHelpCheckForUpdates": "تحقق من التحديثات",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "حول",
"MenuSearch": "بحث...",
"GameListHeaderFavorite": "مفضلة",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت",
"GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـPPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "تنظيف ذاكرة مرشحات الفيديو المؤقتة",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "يحذف ذاكرة مرشحات الفيديو المؤقتة الخاصة بالتطبيق",
"GameListContextMenuCacheManagementOpenPptcDirectory": "‫فتح مجلد PPTC",
@ -498,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": "واجه ريوجينكس خطأ",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Hilfe",
"MenuBarHelpCheckForUpdates": "Nach Updates suchen",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Über Ryujinx",
"MenuSearch": "Suchen...",
"GameListHeaderFavorite": "Favorit",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Βοήθεια",
"MenuBarHelpCheckForUpdates": "Έλεγχος για Ενημερώσεις",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Σχετικά με",
"MenuSearch": "Αναζήτηση...",
"GameListHeaderFavorite": "Αγαπημένο",
@ -70,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 της εφαρμογής",
@ -498,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 αντιμετώπισε σφάλμα",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Help",
"MenuBarHelpCheckForUpdates": "Check for Updates",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "About",
"MenuSearch": "Search...",
"GameListHeaderFavorite": "Fav",
@ -69,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",
@ -510,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ayuda",
"MenuBarHelpCheckForUpdates": "Buscar actualizaciones",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Acerca de",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favoritos",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aide",
"MenuBarHelpCheckForUpdates": "Vérifier les mises à jour",
"MenuBarHelpFaq": "Page de FAQ et de dépannage",
"MenuBarHelpFaqTooltip": "Ouvre la page de FAQ et de dépannage sur le wiki officiel de Ryujinx",
"MenuBarHelpSetup": "Guide d'Installation et de Configuration",
"MenuBarHelpSetupTooltip": "Ouvre le guide d'installation et de configuration sur le wiki officiel de Ryujinx",
"MenuBarHelpMultiplayer": "Guide Multijoueur (LDN/LAN)",
"MenuBarHelpMultiplayerTooltip": "Ouvre le guide de Multijoueur sur le wiki officiel de Ryujinx",
"MenuBarHelpAbout": "À propos",
"MenuSearch": "Rechercher...",
"GameListHeaderFavorite": "Favoris",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_עזרה",
"MenuBarHelpCheckForUpdates": "חפש עדכונים",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "אודות",
"MenuSearch": "חפש...",
"GameListHeaderFavorite": "אהוב",
@ -68,6 +74,8 @@
"GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים",
"GameListContextMenuCacheManagement": "ניהול מטמון",
"GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק",
"GameListContextMenuCacheManagementPurgeShaderCache": "ניקוי מטמון הצללות",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "מוחק את מטמון ההצללות של היישום",
@ -498,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": "ריוג'ינקס נתקלה בשגיאה",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aiuto",
"MenuBarHelpCheckForUpdates": "Controlla aggiornamenti",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Informazioni",
"MenuSearch": "Cerca...",
"GameListHeaderFavorite": "Preferito",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "ヘルプ(_H)",
"MenuBarHelpCheckForUpdates": "アップデートを確認",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Ryujinx について",
"MenuSearch": "検索...",
"GameListHeaderFavorite": "お気に入り",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "キャッシュ管理",
"GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築",
"GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "シェーダーキャッシュを破棄",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "アプリケーションのシェーダーキャッシュを破棄します",
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC ディレクトリを開く",
@ -498,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": "エラーが発生しました",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "도움말(_H)",
"MenuBarHelpCheckForUpdates": "업데이트 확인",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "정보",
"MenuSearch": "찾기...",
"GameListHeaderFavorite": "즐겨찾기",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "캐시 관리",
"GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성",
"GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 실행 부팅 시, PPTC를 트리거하여 다시 구성",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "퍼지 셰이더 캐시",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "앱의 셰이더 캐시 삭제",
"GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC 디렉터리 열기",
@ -498,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에서 오류 발생",

View file

@ -37,6 +37,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Hjelp",
"MenuBarHelpCheckForUpdates": "Se etter oppdateringer",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Om",
"MenuSearch": "Søk ...",
"GameListHeaderFavorite": "Fav",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Pomoc",
"MenuBarHelpCheckForUpdates": "Sprawdź aktualizacje",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "O programie",
"MenuSearch": "Wyszukaj...",
"GameListHeaderFavorite": "Ulubione",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ajuda",
"MenuBarHelpCheckForUpdates": "_Verificar se há atualizações",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "_Sobre",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favorito",
@ -69,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",
@ -498,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",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Помощь",
"MenuBarHelpCheckForUpdates": "Проверить наличие обновлений",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "О программе",
"MenuSearch": "Поиск...",
"GameListHeaderFavorite": "Избранное",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "Управление кэшем",
"GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "Очистить кэш шейдеров",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Удаляет кеш шейдеров приложения",
"GameListContextMenuCacheManagementOpenPptcDirectory": "Открыть папку PPTC",
@ -498,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 обнаружил ошибку",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_ช่วยเหลือ",
"MenuBarHelpCheckForUpdates": "ตรวจสอบอัปเดต",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "เกี่ยวกับ",
"MenuSearch": "กำลังค้นหา...",
"GameListHeaderFavorite": "ชื่นชอบ",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "จัดการแคช",
"GameListContextMenuCacheManagementPurgePptc": "เพิ่มคิวการสร้าง PPTC ใหม่",
"GameListContextMenuCacheManagementPurgePptcToolTip": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "ล้างแคช แสงเงา",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "ลบแคช แสงเงา ของแอปพลิเคชัน",
"GameListContextMenuCacheManagementOpenPptcDirectory": "เปิดไดเรกทอรี่ PPTC",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Yardım",
"MenuBarHelpCheckForUpdates": "Güncellemeleri Denetle",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Hakkında",
"MenuSearch": "Ara...",
"GameListHeaderFavorite": "Favori",
@ -69,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ç",
@ -498,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ı",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Допомога",
"MenuBarHelpCheckForUpdates": "Перевірити оновлення",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Про застосунок",
"MenuSearch": "Пошук...",
"GameListHeaderFavorite": "Обране",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "Керування кешем",
"GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "Очистити кеш шейдерів",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Видаляє кеш шейдерів програми",
"GameListContextMenuCacheManagementOpenPptcDirectory": "Відкрити каталог PPTC",
@ -509,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 сталася помилка",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "帮助(_H)",
"MenuBarHelpCheckForUpdates": "检查更新",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "关于",
"MenuSearch": "搜索…",
"GameListHeaderFavorite": "收藏",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "缓存管理",
"GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件",
"GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "清除着色器缓存文件",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件",
"GameListContextMenuCacheManagementOpenPptcDirectory": "打开 PPTC 缓存目录",
@ -498,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 模拟器发生错误",

View file

@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "說明(_H)",
"MenuBarHelpCheckForUpdates": "檢查更新",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "關於",
"MenuSearch": "搜尋...",
"GameListHeaderFavorite": "我的最愛",
@ -69,6 +75,8 @@
"GameListContextMenuCacheManagement": "快取管理",
"GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建",
"GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建",
"GameListContextMenuCacheManagementNukePptc": "Purge PPTC cache",
"GameListContextMenuCacheManagementNukePptcToolTip": "Deletes Application's PPTC cache",
"GameListContextMenuCacheManagementPurgeShaderCache": "清除著色器快取",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "刪除應用程式的著色器快取",
"GameListContextMenuCacheManagementOpenPptcDirectory": "開啟 PPTC 資料夾",
@ -498,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 遇到錯誤",

View file

@ -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}"

View file

@ -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 })

View file

@ -290,6 +290,25 @@
Icon="{ext:Icon mdi-update}"
ToolTip.Tip="{ext:Locale CheckUpdatesTooltip}" />
<Separator />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpFaq}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/FAQ-and-Troubleshooting"
ToolTip.Tip="{ext:Locale MenuBarHelpFaqTooltip}" />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpSetup}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/Ryujinx-Setup-&amp;-Configuration-Guide"
ToolTip.Tip="{ext:Locale MenuBarHelpSetupTooltip}" />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpMultiplayer}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/Multiplayer%E2%80%90(LDN%E2%80%90Local%E2%80%90Wireless)%E2%80%90Guide"
ToolTip.Tip="{ext:Locale MenuBarHelpMultiplayerTooltip}" />
<Separator />
<MenuItem
Click="OpenAboutWindow"
Header="{ext:Locale MenuBarHelpAbout}"

View file

@ -222,6 +222,12 @@ namespace Ryujinx.Ava.UI.Views.Main
await Updater.BeginUpdateAsync(true);
}
private void MenuItem_OnClick(object sender, RoutedEventArgs e)
{
if (sender is MenuItem { Tag: string url })
OpenHelper.OpenUrl(url);
}
public async void OpenXCITrimmerWindow(object sender, RoutedEventArgs e) => await XCITrimmerWindow.Show(ViewModel);
public async void OpenAboutWindow(object sender, RoutedEventArgs e) => await AboutWindow.Show();