diff --git a/Core/Config.cpp b/Core/Config.cpp index 3a38e944e7..f1a2a4d723 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1096,7 +1096,6 @@ static const ConfigSetting debuggerSettings[] = { ConfigSetting("ConsoleWindowY", SETTING(g_Config, iConsoleWindowY), -1, CfgFlag::DEFAULT), ConfigSetting("FontWidth", SETTING(g_Config, iFontWidth), 8, CfgFlag::DEFAULT), ConfigSetting("FontHeight", SETTING(g_Config, iFontHeight), 12, CfgFlag::DEFAULT), - ConfigSetting("DisplayStatusBar", SETTING(g_Config, bDisplayStatusBar), true, CfgFlag::DEFAULT), ConfigSetting("ShowBottomTabTitles",SETTING(g_Config, bShowBottomTabTitles), true, CfgFlag::DEFAULT), ConfigSetting("ShowDeveloperMenu", SETTING(g_Config, bShowDeveloperMenu), false, CfgFlag::DEFAULT), ConfigSetting("SkipDeadbeefFilling", SETTING(g_Config, bSkipDeadbeefFilling), false, CfgFlag::DEFAULT), diff --git a/Core/Config.h b/Core/Config.h index e0f520c787..1eee7388c4 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -622,7 +622,6 @@ public: int iConsoleWindowY; int iFontWidth; int iFontHeight; - bool bDisplayStatusBar; bool bShowBottomTabTitles; bool bShowDeveloperMenu; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 5c1aa55924..7482fa04fe 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -199,7 +199,9 @@ void AdhocLoadServerList() { std::string json; request.buffer().TakeAll(&json); - ParseServerListEntriesJSON(std::string_view(json.data(), json.size())); + if (!ParseServerListEntriesJSON(std::string_view(json.data(), json.size()))) { + LoadFallbackServerList(); + } }); } else if (!g_Config.sAdhocServerListUrl.empty()) { // Try to read local file. @@ -210,7 +212,9 @@ void AdhocLoadServerList() { LoadFallbackServerList(); return; } - ParseServerListEntriesJSON(std::string_view(json.data(), json.size())); + if (!ParseServerListEntriesJSON(std::string_view(json.data(), json.size()))) { + LoadFallbackServerList(); + } } else { LoadFallbackServerList(); } diff --git a/Core/Util/PathUtil.cpp b/Core/Util/PathUtil.cpp index a82bc95fe6..a4e790a599 100644 --- a/Core/Util/PathUtil.cpp +++ b/Core/Util/PathUtil.cpp @@ -155,6 +155,10 @@ bool TryUpdateSavedPath(Path *path) { #if PPSSPP_PLATFORM(IOS) // DEBUG_LOG(Log::Loader, "Original path: %s", path->c_str()); std::string pathStr = path->ToString(); + if (startsWith(pathStr, "/private/var/mobile/Containers/Data/Application/")) { + // For in-application files only, strip off the /private prefix if present - it's sometimes there, sometimes not. + pathStr = pathStr.substr(8); + } const std::string_view applicationRoot = "/var/mobile/Containers/Data/Application/"; if (startsWith(pathStr, applicationRoot)) { diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index 747e81f4c9..7f56fe5cd1 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -1469,12 +1469,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] diff --git a/Tools/langtool/src/main.rs b/Tools/langtool/src/main.rs index 971e1666b3..fa8b351c36 100644 --- a/Tools/langtool/src/main.rs +++ b/Tools/langtool/src/main.rs @@ -996,11 +996,8 @@ fn execute_command(cmd: Command, ai: Option<&ChatGPT>, dry_run: bool, verbose: b } } - println!("Langtool processing reference {reference_ini_filename}"); - - if !dry_run { - reference_ini.write().unwrap(); - } + // Don't need to additionally process reference here like we did before, this is done + // in the main loop. } fn generate_ai_response( diff --git a/UI/DarwinFileSystemServices.mm b/UI/DarwinFileSystemServices.mm index 3e844a10e3..28fbd393b0 100644 --- a/UI/DarwinFileSystemServices.mm +++ b/UI/DarwinFileSystemServices.mm @@ -54,16 +54,23 @@ void DarwinFileSystemServices::ClearDelegate() { } - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { - std::string pathStr = urls[0].path.UTF8String; - // Strip /private prefix if present. - if (startsWith(pathStr, "/private/var/mobile/Containers/Data/Application/")) { - pathStr = pathStr.substr(8); + NSURL *url = urls.firstObject; + if (!url) { + self.panelCallback(false, Path()); + return; } - if (urls.count >= 1) - self.panelCallback(true, Path(pathStr)); - else + // 1. Start accessing the resource + BOOL success = [url startAccessingSecurityScopedResource]; + if (success) { + // 2. Pass the path to PPSSPP + // Note: In a real app, you'd want to call stopAccessingSecurityScopedResource + // when the game is closed, otherwise you "leak" kernel permissions. + self.panelCallback(true, Path(url.path.UTF8String)); + } else { + ERROR_LOG(Log::System, "Failed to start accessing security scoped resource for: %s", url.path.UTF8String); self.panelCallback(false, Path()); + } INFO_LOG(Log::System, "Callback processed, pre-emptively hide keyboard"); [sharedViewController hideKeyboard]; diff --git a/Windows/Debugger/CtrlDisAsmView.cpp b/Windows/Debugger/CtrlDisAsmView.cpp index f8ee0e29fe..8f328112c6 100644 --- a/Windows/Debugger/CtrlDisAsmView.cpp +++ b/Windows/Debugger/CtrlDisAsmView.cpp @@ -1315,7 +1315,7 @@ void CtrlDisAsmView::disassembleToFile() { } std::string filename; - if (W32Util::BrowseForFileName(false, nullptr, L"Save Disassembly As...", nullptr, L"All Files\0*.*\0\0", nullptr, filename)) { + if (W32Util::BrowseForFileName(false, nullptr, L"Save Disassembly As...", nullptr, nullptr, L"All Files\0*.*\0\0", nullptr, filename)) { std::wstring fileName = ConvertUTF8ToWString(filename); FILE *output = _wfopen(fileName.c_str(), L"wb"); if (output == nullptr) { diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 8d6000efd6..ef577edf23 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -112,9 +112,6 @@ CDisasm::CDisasm(HINSTANCE _hInstance, HWND _hParent, MIPSDebugInterface *_cpu) // init status bar statusBarWnd = CreateWindowEx(0, STATUSCLASSNAME, L"", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, m_hDlg, (HMENU)IDC_DISASMSTATUSBAR, _hInstance, NULL); - if (g_Config.bDisplayStatusBar == false) { - ShowWindow(statusBarWnd,SW_HIDE); - } // set it to use two parts RECT statusBarRect; @@ -614,12 +611,8 @@ void CDisasm::UpdateSize(WORD width, WORD height) HWND bottomTabs = GetDlgItem(m_hDlg, IDC_DEBUG_BOTTOMTABS); // ignore the status bar - int topHeightOffset = 0; - if (g_Config.bDisplayStatusBar) - { - GetWindowRect(statusBarWnd,&windowRect); - topHeightOffset = (windowRect.bottom-windowRect.top); - } + GetWindowRect(statusBarWnd, &windowRect); + int topHeightOffset = (windowRect.bottom - windowRect.top); CtrlDisAsmView *ptr = DisAsmView(); int disassemblyRowHeight = ptr->getRowHeight(); diff --git a/Windows/Debugger/DumpMemoryWindow.cpp b/Windows/Debugger/DumpMemoryWindow.cpp index 4942a7cf03..fa82aa3cbf 100644 --- a/Windows/Debugger/DumpMemoryWindow.cpp +++ b/Windows/Debugger/DumpMemoryWindow.cpp @@ -20,7 +20,7 @@ void DumpMemoryWindow::HandleBrowseClick(HWND hwnd) { GetWindowTextW(filenameWnd, &buffer[0], (int)buffer.size()); std::string fn = ConvertWStringToUTF8(buffer); - bool result = W32Util::BrowseForFileName(false, hwnd, L"Select filename", NULL, NULL, NULL, fn); + bool result = W32Util::BrowseForFileName(false, hwnd, L"Select filename", nullptr, L"dump.bin", nullptr, nullptr, fn); if (result) { filenameChosen_ = true; buffer = ConvertUTF8ToWString(fn); diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index a9ac39a364..0310aa524d 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -439,7 +439,7 @@ void CGEDebugger::DescribeSecondPreview(const GPUgstate &state, char desc[256]) void CGEDebugger::PreviewExport(const GPUDebugBuffer *dbgBuffer) { constexpr const wchar_t *filter = L"PNG Image (*.png)\0*.png\0JPEG Image (*.jpg)\0*.jpg\0All files\0*.*\0\0"; std::string fn; - if (W32Util::BrowseForFileName(false, GetDlgHandle(), L"Save Preview Image...", nullptr, filter, L"png", fn)) { + if (W32Util::BrowseForFileName(false, GetDlgHandle(), L"Save Preview Image...", nullptr, L"preview.png", filter, L"png", fn)) { ScreenshotFormat fmt = fn.find(".jpg") != fn.npos ? ScreenshotFormat::JPG : ScreenshotFormat::PNG; Path filename(fn); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index b6e8314fc7..856e39d1ec 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -558,7 +558,7 @@ namespace MainWindow { case ID_FILE_LOADSTATEFILE: if (!Achievements::WarnUserIfHardcoreModeActive(false) && !NetworkWarnUserIfOnlineAndCantSavestate()) { - if (W32Util::BrowseForFileName(true, hWnd, L"Load state", 0, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) { + if (W32Util::BrowseForFileName(true, hWnd, L"Load state", nullptr, nullptr, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) { SetCursor(LoadCursor(0, IDC_WAIT)); SaveState::Load(Path(fn), -1, SaveStateActionFinished); } @@ -566,7 +566,7 @@ namespace MainWindow { break; case ID_FILE_SAVESTATEFILE: if (!Achievements::WarnUserIfHardcoreModeActive(true) && !NetworkWarnUserIfOnlineAndCantSavestate()) { - if (W32Util::BrowseForFileName(false, hWnd, L"Save state", 0, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) { + if (W32Util::BrowseForFileName(false, hWnd, L"Save state", nullptr, L"state.ppst", L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) { SetCursor(LoadCursor(0, IDC_WAIT)); SaveState::Save(Path(fn), -1, SaveStateActionFinished); } @@ -773,27 +773,29 @@ namespace MainWindow { } case ID_DEBUG_LOADMAPFILE: - if (W32Util::BrowseForFileName(true, hWnd, L"Load .ppmap", 0, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) { + if (W32Util::BrowseForFileName(true, hWnd, L"Load .ppmap", nullptr, nullptr, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) { g_symbolMap->LoadSymbolMap(Path(fn)); NotifyDebuggerMapLoaded(); } break; case ID_DEBUG_SAVEMAPFILE: - if (W32Util::BrowseForFileName(false, hWnd, L"Save .ppmap", 0, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) + if (W32Util::BrowseForFileName(false, hWnd, L"Save .ppmap", nullptr, L"map.ppmap", L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) { g_symbolMap->SaveSymbolMap(Path(fn)); + } break; case ID_DEBUG_LOADSYMFILE: - if (W32Util::BrowseForFileName(true, hWnd, L"Load .sym", 0, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) { + if (W32Util::BrowseForFileName(true, hWnd, L"Load .sym", nullptr, nullptr, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) { g_symbolMap->LoadNocashSym(Path(fn)); NotifyDebuggerMapLoaded(); } break; case ID_DEBUG_SAVESYMFILE: - if (W32Util::BrowseForFileName(false, hWnd, L"Save .sym", 0, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) + if (W32Util::BrowseForFileName(false, hWnd, L"Save .sym", nullptr, L"symbols.sym", L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) { g_symbolMap->SaveNocashSym(Path(fn)); + } break; case ID_DEBUG_RESETSYMBOLTABLE: @@ -845,7 +847,7 @@ namespace MainWindow { MessageBox(hWnd, L"File does not exist.", L"Sorry", 0); } else if (info.type == FILETYPE_DIRECTORY) { MessageBox(hWnd, L"Cannot extract directories.", L"Sorry", 0); - } else if (W32Util::BrowseForFileName(false, hWnd, L"Save file as...", 0, L"All files\0*.*\0\0", L"", fn)) { + } else if (W32Util::BrowseForFileName(false, hWnd, L"Save file as...", nullptr, nullptr, L"All files\0*.*\0\0", L"", fn)) { const u32 handle = pspFileSystem.OpenFile(filename, FILEACCESS_READ, ""); // Note: len may be in blocks. size_t len = pspFileSystem.SeekFile(handle, 0, FILEMOVE_END); diff --git a/Windows/W32Util/ShellUtil.cpp b/Windows/W32Util/ShellUtil.cpp index dbeefc06bb..7da6300114 100644 --- a/Windows/W32Util/ShellUtil.cpp +++ b/Windows/W32Util/ShellUtil.cpp @@ -114,40 +114,30 @@ std::string BrowseForFolder2(HWND parent, std::string_view title, std::string_vi } bool BrowseForFileName(bool _bLoad, HWND _hParent, const wchar_t *_pTitle, - const wchar_t *_pInitialFolder, const wchar_t *_pFilter, const wchar_t *_pExtension, + const wchar_t *_pInitialFolder, const wchar_t *initialFilename, const wchar_t *_pFilter, const wchar_t *_pExtension, std::string &_strFileName) { // Let's hope this is large enough, don't want to trigger the dialog twice... - std::wstring filenameBuffer(32768 * 10, '\0'); + wchar_t fileBuffer[2048]{}; + wchar_t fileNameBuffer[2048]{}; + + if (initialFilename) { + wcscpy_s(fileBuffer, initialFilename); + } OPENFILENAME ofn{ sizeof(OPENFILENAME) }; - - auto resetFileBuffer = [&] { - ofn.nMaxFile = (DWORD)filenameBuffer.size(); - ofn.lpstrFile = &filenameBuffer[0]; - if (!_strFileName.empty()) - wcsncpy(ofn.lpstrFile, ConvertUTF8ToWString(_strFileName).c_str(), filenameBuffer.size() - 1); - }; - - resetFileBuffer(); ofn.lpstrInitialDir = _pInitialFolder; ofn.lpstrFilter = _pFilter; - ofn.lpstrFileTitle = nullptr; - ofn.nMaxFileTitle = 0; + ofn.lpstrFileTitle = fileNameBuffer; + ofn.nMaxFileTitle = ARRAY_SIZE(fileNameBuffer); ofn.lpstrDefExt = _pExtension; ofn.hwndOwner = _hParent; + ofn.lpstrFile = fileBuffer; + ofn.nMaxFile = ARRAY_SIZE(fileBuffer); ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER; if (!_bLoad) ofn.Flags |= OFN_HIDEREADONLY; int success = _bLoad ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn); - if (success == 0 && CommDlgExtendedError() == FNERR_BUFFERTOOSMALL) { - size_t sz = *(unsigned short *)&filenameBuffer[0]; - // Documentation is unclear if this is WCHARs to CHARs. - filenameBuffer.resize(filenameBuffer.size() + sz * 2); - resetFileBuffer(); - success = _bLoad ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn); - } - if (success) { _strFileName = ConvertWStringToUTF8(ofn.lpstrFile); return true; diff --git a/Windows/W32Util/ShellUtil.h b/Windows/W32Util/ShellUtil.h index 818838607a..06c78d1600 100644 --- a/Windows/W32Util/ShellUtil.h +++ b/Windows/W32Util/ShellUtil.h @@ -11,7 +11,7 @@ namespace W32Util { std::string BrowseForFolder2(HWND parent, std::string_view title, std::string_view initialPath); bool BrowseForFileName(bool _bLoad, HWND _hParent, const wchar_t*_pTitle, - const wchar_t *_pInitialFolder, const wchar_t *_pFilter, const wchar_t*_pExtension, + const wchar_t *_pInitialFolder, const wchar_t *initialFilename, const wchar_t *_pFilter, const wchar_t*_pExtension, std::string& _strFileName); std::vector BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const wchar_t*_pTitle, const wchar_t*_pInitialFolder, const wchar_t*_pFilter, const wchar_t*_pExtension); diff --git a/Windows/main.cpp b/Windows/main.cpp index 4f9e182265..01478b0665 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -686,7 +686,7 @@ bool System_MakeRequest(SystemRequestType type, int requestId, const std::string std::thread([=] { SetCurrentThreadName("BrowseForImage"); std::string out; - if (W32Util::BrowseForFileName(true, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, + if (W32Util::BrowseForFileName(true, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, nullptr, FinalizeFilter(L"All supported images (*.jpg *.jpeg *.png)|*.jpg;*.jpeg;*.png|All files (*.*)|*.*||").c_str(), L"jpg", out)) { g_requestManager.PostSystemSuccess(requestId, out.c_str()); } else { @@ -699,16 +699,17 @@ bool System_MakeRequest(SystemRequestType type, int requestId, const std::string { const BrowseFileType browseType = (BrowseFileType)param3; std::wstring filter = MakeWindowsFilter(browseType); - std::wstring initialFilename = ConvertUTF8ToWString(param2); // TODO: Plumb through + std::string initialFilename = param2; if (filter.empty()) { // Unsupported. return false; } const bool load = type == SystemRequestType::BROWSE_FOR_FILE; - std::thread([=] { + std::thread([load, param1, initialFilename, filter, requestId] { SetCurrentThreadName("BrowseForFile"); - std::string out; - if (W32Util::BrowseForFileName(load, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, filter.c_str(), L"", out)) { + std::string out = initialFilename; + std::wstring wInitial = ConvertUTF8ToWString(initialFilename); + if (W32Util::BrowseForFileName(load, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, wInitial.c_str(), filter.c_str(), L"", out)) { g_requestManager.PostSystemSuccess(requestId, out.c_str()); } else { g_requestManager.PostSystemFailure(requestId); diff --git a/assets/adhoc-servers.json b/assets/adhoc-servers.json index 40cc360cf3..73549a4ad2 100644 --- a/assets/adhoc-servers.json +++ b/assets/adhoc-servers.json @@ -49,6 +49,7 @@ "name": "ArenaAnywhere SA", "host": "relay-sa.arenaanywhere.site", "discord": "https://discord.gg/GdsXWmNHq5", + "ip": "34.35.138.175", "web": "", "location": "South Africa", "description": "For players looking to play any games", @@ -58,6 +59,7 @@ "name": "ArenaAnywhere EU", "host": "relay.arenaanywhere.site", "discord": "https://discord.gg/GdsXWmNHq5", + "ip": "34.91.25.46", "web": "", "location": "Europe", "description": "For players looking to play any games", @@ -67,11 +69,22 @@ "name": "ArenaAnywhere Dubai", "host": "relay-dubai.arenaanywhere.site", "discord": "https://discord.gg/GdsXWmNHq5", + "ip": "34.165.197.39", "web": "", "location": "Dubai", "description": "For players looking to play any games", "data_mode": "AemuPostoffice" }, + { + "name": "ArenaAnywhere Asia", + "host": "relay-asia.arenaanywhere.site", + "ip": "35.198.217.43", + "discord": "https://discord.gg/GdsXWmNHq5", + "web": "", + "location": "Singapore", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, { "name": "Retroverze Relay Beta", "host": "psp.retroverze.my.id", diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 9244ebaeea..eb6de5df4a 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -69,6 +69,7 @@ This game has no achievements = لا تحتوي هذه اللعبة على اي Top players = افضل اللاعبين Unlocked = الإنجازات المفتوحة Unofficial = الإنجازات الغير رسمية +Unofficial achievements = إنجازات غير رسمية # AI translated Unsupported = الإنجازات الغير مدعومة Win = فوز diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 2f87b198b3..bdcb76164e 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -61,6 +61,7 @@ This game has no achievements = Bu oyunun uğurları yoxdur Top players = Ən üst oyunçular Unlocked = Açılmış uğurlar Unofficial = Rəsmi olmayan uğurlar +Unofficial achievements = Rəsmi olmayan nailiyyətlər # AI translated Unsupported = Dəstəklənməyən uğurlar Win = Qalib gəlmək @@ -683,7 +684,6 @@ FPS = FPS Frame presentation mode = Kadr göstərmə rejimi Frame Rate Control = Kadr yönəldilişi Frame Skipping = Kadr buraxılışı -Frame Skipping Type = Kadr buraxılış biçimi Framerate mode = Kadr tezliyi modu Full screen = Bütün ekran Geometry shader culling = Həndəsə kölgəl-sinin ayıqlanışı @@ -734,7 +734,6 @@ Off = Sönülü OpenGL = OpenGL Overlay Information = Örtük bilgisi Partial Stretch = Qismən dart -Percent of FPS = FPS faizi Performance = Göstəriş Postprocessing shaders = İşləm sonrası kölgələndirmələr Recreate Activity = Etkinliyi yenidən yarat diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index 2bec034523..39f3886695 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Найлепшыя гульцы Unlocked = Разблакаваныя дасягненні Unofficial = Неафіцыйныя дасягненні +Unofficial achievements = Нефармальныя дасягненні # AI translated Unsupported = Непадтрымоўваныя дасягненні Win = Пераможца diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 9afa1de39e..246727781e 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Неправителствени постижения # AI translated Unsupported = Unsupported Win = Победа diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 608fa9be89..711508ddcb 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Èxits no oficials # AI translated Unsupported = Unsupported Win = Guanyar diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 8d14a77d0d..a6f6418928 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Neoficiální úspěchy # AI translated Unsupported = Unsupported Win = Vyhrát diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 9a24dae9fe..a7cd65f469 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Uofficielle præstationer # AI translated Unsupported = Unsupported Win = Vinde diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 3316260a6c..32ec4214b8 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -61,6 +61,7 @@ This game has no achievements = Dieses Spiel hat keine Erfolge Top players = Top-Spieler Unlocked = Freigeschaltete Erfolge Unofficial = Inoffizielle Erfolge +Unofficial achievements = Unoffizielle Erfolge # AI translated Unsupported = Nicht unterstützte Erfolge Win = Gewinnen diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 6d387b5f42..9212a12bf6 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Prestasi tidak resmi # AI translated Unsupported = Unsupported Win = Menang diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index ad633f6984..3b191f6b58 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -85,6 +85,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Unofficial achievements Unsupported = Unsupported Win = Win @@ -122,6 +123,8 @@ Analog Limiter = Analog limiter Analog Settings = Analog Settings Analog Stick = Analog stick Analog Style = Analog Style +Analog stick threshold = Analog stick threshold +Analog to digital mapping = Analog to digital mapping Analog trigger threshold = Analog trigger threshold AnalogLimiter Tip = When the analog limiter button is pressed Auto = Auto @@ -351,6 +354,7 @@ Enable shader cache = Enable shader cache Enter address = Enter address Fast = Fast Fragment = Fragment +Framebuffer list = Framebuffer list FPU = FPU Framedump tests = Framedump tests Frame Profiler = Frame profiler @@ -801,10 +805,12 @@ Existing data = Existing data Import savedata from ZIP file = Import savedata from ZIP file Install = Install Install game from ZIP file? = Install game from ZIP file? +Install plugin from ZIP file? = Install plugin from ZIP file? Install into folder = Install into folder Install textures from ZIP file? = Install textures from ZIP file? Installation failed = Installation failed Installed! = Installed! +Supported games: = Supported games: Texture pack doesn't support install = Texture pack doesn't support install Zip archive corrupt = ZIP archive corrupt ZIP file = ZIP file @@ -875,7 +881,8 @@ Analog limiter = Analog limiter Analog speed = Analog speed Analog Stick = Analog stick Audio/Video Recording = Audio/Video recording -AxisSwap = Axis swap +Axis swap (hold) = Axis swap (hold) +Axis swap (toggle) = Axis swap (toggle) Circle = Circle Cross = Cross Custom %d = Custom %d @@ -955,6 +962,7 @@ Display Portrait Reversed = Display Portrait Reversed [Networking] Ad Hoc multiplayer = Ad Hoc multiplayer AdHoc server = Ad hoc server +Ad hoc server address = Ad hoc server address AdhocServer Failed to Bind Port = Ad hoc server failed to bind port Allow speed control while connected (not recommended) = Allow speed control while connected (not recommended) AM: Data from Unknown Port = AM: Data from Unknown Port @@ -970,6 +978,7 @@ Chat Button Position = Chat button position Chat Here = Chat here Chat message = Chat message Chat Screen Position = Chat screen position +Custom server list = Custom server list Disconnected from AdhocServer = Disconnected from ad hoc server DNS Error Resolving = DNS error resolving DNS server = DNS server @@ -995,6 +1004,7 @@ Hostname = Hostname Infrastructure = Infrastructure Infrastructure server provided by: = Infrastructure server provided by: Invalid IP or hostname = Invalid IP or hostname +Local network addresses = Local network addresses Minimum Timeout = Minimum timeout (override in ms, 0 = default) Misc = Miscellaneous (default = PSP compatibility) Network connected = Network connected @@ -1006,7 +1016,7 @@ P2P mode = P2P mode Please change your Port Offset = Please change your port offset Port offset = Port offset (0 = PSP compatibility) Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page -proAdhocServer Address: = Ad hoc server address: +Public server list = Public server list Quick Chat 1 = Quick chat 1 Quick Chat 2 = Quick chat 2 Quick Chat 3 = Quick chat 3 diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index d88579d682..277202695d 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -61,6 +61,7 @@ This game has no achievements = Este juego no tiene logros Top players = Top jugadores Unlocked = Desbloqueados Unofficial = No oficiales +Unofficial achievements = Logros no oficiales # AI translated Unsupported = No admitidos Win = Ganar diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 7d7153a92b..300625ef64 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -61,6 +61,7 @@ This game has no achievements = Este juego no tiene logros Top players = Top players Unlocked = Desbloqueados Unofficial = No oficiales +Unofficial achievements = Logros no oficiales # AI translated Unsupported = Sin soporte Win = Ganar diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 5700a07ae1..bca3c654a7 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = دستاوردهای غیررسمی # AI translated Unsupported = Unsupported Win = برنده شدن diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 55790bc4aa..7fdc581eb5 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -61,6 +61,7 @@ This game has no achievements = Tällä pelillä ei ole saavutuksia Top players = Top players Unlocked = Avatut saavutukset Unofficial = Epäviralliset saavutukset +Unofficial achievements = Epäviralliset saavutukset # AI translated Unsupported = Unsupported Win = Voittaa @@ -599,8 +600,7 @@ Play = Pelaa Remove From Recent = Poista "äskettäin" listalta... SaveData = Tallennustieto Setting Background = Taustakuvan asetus -ime Played: %1h %2m %3s = Pelattu aika: %1t %2m %3s -Time Played: %1h %2m %3s = Time Played: %1h %2m %3s +Time Played: %1h %2m %3s = Pelattu aika: %1t %2m %3s Uncompressed = Pakkauksen purku tehty USA = USA Use background as UI background = Käytä käyttöliittymän taustakuvaa diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 558aa63066..1e9afa2827 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Réalisations non officielles # AI translated Unsupported = Unsupported Win = Gagner diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 4c8cd91963..71d26f8e38 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Logros non oficiais # AI translated Unsupported = Unsupported Win = Ganar diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 98cfd90a47..8407c80b13 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Άτυπες επιτυχίες # AI translated Unsupported = Unsupported Win = Κερδίζω diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index e8a9185bec..e1264b37ac 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = הישגים בלתי רשמיים # AI translated Unsupported = Unsupported Win = ניצחון diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index e0b7a5116a..492ce39be1 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = םישגי ןמיש הרסימ # AI translated Unsupported = Unsupported Win = ןוקפש diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index a389b59320..e815c8222a 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Neformalna postignuća # AI translated Unsupported = Unsupported Win = Pobjedi diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 049756ddde..f361247744 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -61,6 +61,7 @@ This game has no achievements = Ehhez a játékhoz nincsenek teljesítmények Top players = Top játékosok Unlocked = Kioldott teljesítmények Unofficial = Nem hivatalos teljesítmények +Unofficial achievements = Nem hivatalos teljesítmények # AI translated Unsupported = Nem támogatott teljesítmények Win = Nyerni diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index ce08b5c7a5..bf1f0a5e8d 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -61,6 +61,7 @@ This game has no achievements = Game ini tidak memiliki pencapaian Top players = Pemain papan atas Unlocked = Pencapaian yang telah dibuka Unofficial = Pencapaian tidak resmi +Unofficial achievements = Prestasi tidak resmi # AI translated Unsupported = Pencapaian yang tidak didukung Win = Menang diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 1da2c8d02d..09e5c073c4 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -61,6 +61,7 @@ This game has no achievements = Questo gioco non ha obiettivi Top players = Migliori giocatori Unlocked = Obiettivi sbloccati Unofficial = Obiettivi non ufficiali +Unofficial achievements = Risultati non ufficiali # AI translated Unsupported = Obiettivi non supportati Win = Vincere diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 8fbb8acd3e..dd27235898 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -61,6 +61,7 @@ This game has no achievements = このゲームは実績機能がありません Top players = トッププレイヤー Unlocked = 達成した実績 Unofficial = 非公式な実績 +Unofficial achievements = 非公式な実績 # AI translated Unsupported = サポートしていない実績 Win = 勝つ diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 6a473fd97e..7cb9042fec 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -61,6 +61,7 @@ This game has no achievements = Game iki ora duwe prestasi Top players = Pemain tingkat dhuwur Unlocked = Prestasi sing durung kebuka Unofficial = Prestasi ora resmi +Unofficial achievements = Prestasi ora resmi # AI translated Unsupported = Prestasi sing ora valid Win = Menang diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 6351ff9b6e..4e6f594107 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -61,6 +61,7 @@ This game has no achievements = 이 게임에는 도전과제가 없음 Top players = 상위 플레이어 Unlocked = 잠금 해제된 도전과제 Unofficial = 비공식 도전과제 +Unofficial achievements = 비공식 성취 # AI translated Unsupported = 지원되지 않는 도전과제 Win = 승리 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 2f370c00a9..fc5505df4a 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -74,6 +74,7 @@ This game has no achievements = ئەم یاریە دەستکەوتی نییە Top players = Top players Unlocked = دەستکەوتە کراوەکان Unofficial = دەستکەوتە نافەرمیەکان +Unofficial achievements = Serkeftinên ne resmi # AI translated Unsupported = دەستکەوتە پاڵپشت نەکراوەکان Win = Serkeftin diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index bc65a52f45..c624dd9158 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = ຜົນລັບທີ່ບໍ່ແມ່ນທາງການສູດ # AI translated Unsupported = Unsupported Win = ໄດ້ຊະນະ diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 08799c8f03..be7a8dc9b6 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Neoficialūs pasiekimai # AI translated Unsupported = Unsupported Win = Laimėti diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index c9a0f189f7..6714203cf7 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Pencapaian tidak rasmi # AI translated Unsupported = Unsupported Win = Menang diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index b3fd33e194..9ce6aae4ba 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Niet-officiële prestaties # AI translated Unsupported = Unsupported Win = Winnen diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index ba7f69231f..4f45c1736b 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Uoffisielle prestasjoner # AI translated Unsupported = Unsupported Win = Vin diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index effb3d2ac5..d4aa64d914 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -61,6 +61,7 @@ This game has no achievements = Ta gra nie posiada osiągnięć Top players = Najlepsi gracze Unlocked = Odblokowane osiągnięcia Unofficial = Nieoficjalnie osiągnięcia +Unofficial achievements = Nieoficjalne osiągnięcia # AI translated Unsupported = Niewspierane osiągnięcia Win = Wygrać diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 60f5db6e10..813e5f2944 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -85,6 +85,7 @@ This game has no achievements = Este jogo não tem conquistas Top players = Os melhores jogadores Unlocked = Destrancadas Unofficial = Não oficiais +Unofficial achievements = Conquistas não oficiais # AI translated Unsupported = Não suportadas Win = Vitórias diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 8826d22aef..3abcfec579 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -85,6 +85,7 @@ This game has no achievements = Este jogo não tem conquistas disponíveis Top players = Jogadores no topo Unlocked = Conquistas desbloqueadas Unofficial = Conquistas não oficiais +Unofficial achievements = Conquistas não oficiais # AI translated Unsupported = Conquistas incompatíveis Win = Vencer diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 78bd09af57..b82042b69a 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Realizări neoficiale # AI translated Unsupported = Unsupported Win = Câștigă diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 1f8d822acf..6517f0d42f 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -61,6 +61,7 @@ This game has no achievements = У данной игры нет достижен Top players = Лучшие игроки Unlocked = Разблокированные Unofficial = Неофициальные +Unofficial achievements = Неофициальные достижения # AI translated Unsupported = Неподдерживаемые Win = Победа diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index d2e7ff4c53..689f7ad8e1 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -61,6 +61,7 @@ This game has no achievements = Detta spel har inga prestationer Top players = Toppspelare Unlocked = Upplåsta prestationer Unofficial = Inofficiella prestationer +Unofficial achievements = Inofficiella prestationer # AI translated Unsupported = Prestationer som inte stöds Win = Vinna diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 90c90482b6..af35f9a13f 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -61,6 +61,7 @@ This game has no achievements = Ang larong ito ay wala nakuhang mga tagumpay Top players = Mga nangungunang manlalaro Unlocked = Mga nagawang tagumpay Unofficial = Mga hindi opisyal na tagumpay +Unofficial achievements = Нерасмий дастур # AI translated Unsupported = Mga hindi sinusuportahang tagumpay Win = Баракат diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 387ac7e62e..287cffd1ab 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -61,6 +61,7 @@ This game has no achievements = Bu oyunun başarımları yok Top players = En iyi oyuncular Unlocked = Kilidi Açılmış Başarımlar Unofficial = Resmi Olmayan Başarımlar +Unofficial achievements = Resmi olmayan başarılar # AI translated Unsupported = Desteklenmeyen Başarımlar Win = Kazanmak diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 13a8eb698e..25d94f6d6e 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -61,6 +61,7 @@ This game has no achievements = Ця гра не має відзнак Top players = Найкращі гравці Unlocked = Розблоковані відзнаки Unofficial = Неофіційні відзнаки +Unofficial achievements = Неофіційні досягнення # AI translated Unsupported = Непідтримувані відзнаки Win = Перемогти diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 0a9dd59ee7..72bed62ad3 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements Top players = Top players Unlocked = Unlocked Unofficial = Unofficial +Unofficial achievements = Thành tựu không chính thức # AI translated Unsupported = Unsupported Win = Thắng diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 01ddee7c2f..d5c617a590 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -61,6 +61,7 @@ This game has no achievements = 此游戏没有成就列表 Top players = 速度排名 Unlocked = 解锁的成就 Unofficial = 自定义成就 +Unofficial achievements = 非官方成就 # AI translated Unsupported = 不支持的成绩 Win = 赢 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index ddc72511eb..88b7fb7814 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -61,6 +61,7 @@ This game has no achievements = 這個遊戲沒有成就 Top players = 頂級玩家 Unlocked = 已解鎖的成就 Unofficial = 非官方成就 +Unofficial achievements = 非官方成就 # AI translated Unsupported = 不支援的成就 Win = 贏