diff --git a/Common/DbgNew.h b/Common/DbgNew.h index 13f603fd1c..5acc5f0876 100644 --- a/Common/DbgNew.h +++ b/Common/DbgNew.h @@ -1,5 +1,7 @@ #pragma once +#ifdef _WIN32 + #include // Utility file for using the MS CRT's memory tracking. @@ -21,3 +23,5 @@ #endif // _DEBUG #endif + +#endif // _WIN32 diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index 9ddd6a1490..ba4ec4f862 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -451,7 +451,7 @@ void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, float scale = dc.CalculateTextScale(text_, availWidth); float textW = 0.0f, textH = 0.0f; dc.MeasureTextRect(dc.GetTheme().uiFont, scale, scale, text_, availWidth, &textW, &textH, FLAG_WRAP_TEXT); - textW += 2; // We need a small fudge factor here, not sure why yet. + textW += 4; // We need a small fudge factor here, not sure why yet. totalH = std::max(totalH, textH); totalW += textW; if (image_.isValid()) { diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 11643030c8..2cf56cae11 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -284,6 +284,7 @@ public: void Update() override; + // If you call this at creation, call it AFTER adding the subviews! void SetOpen(bool open) { _dbg_assert_(open_); *open_ = open; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index f75a303152..4c3b103a32 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -150,7 +150,9 @@ static bool ParseServerListEntriesJSON(std::string_view json) { entry.location = server.getStringOr("location", ""); entry.description = server.getStringOr("description", ""); entry.mode = equals(server.getStringOr("data_mode", ""), "AemuPostoffice") ? AdhocDataMode::AemuPostoffice : AdhocDataMode::P2P; - entry.statusUrl = server.getStringOr("status_data_json", ""); + entry.dataJsonUrl = server.getStringOr("status_data_json", ""); + entry.statusXmlUrl = server.getStringOr("status_xml", ""); + entry.statusWebUrl = server.getStringOr("status_web", ""); if (entry.host.empty()) { // Skipping invalid entry. @@ -252,6 +254,17 @@ std::vector AdhocGetServerList(AdhocLoadListMode loadMode) return g_proAdhocServerList; } +bool AdhocGetServerByHost(std::string_view host, AdhocServerListEntry *dest) { + std::vector entries = AdhocGetServerList(AdhocLoadListMode::CacheOnlySync); + for (auto &entry : entries) { + if (equals(host, entry.host)) { + *dest = entry; + return true; + } + } + return false; +} + static AdhocDataMode AdhocGetServerDataMode(std::string_view server) { std::vector list = AdhocGetServerList(AdhocLoadListMode::CacheOnlySync); for (const auto &item : list) { diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h index 95ce139e2f..ade0870b4c 100644 --- a/Core/HLE/sceNetAdhoc.h +++ b/Core/HLE/sceNetAdhoc.h @@ -111,7 +111,9 @@ struct AdhocServerListEntry { std::string discord; std::string location; std::string description; - std::string statusUrl; // Usually empty or /data.json. + std::string dataJsonUrl; + std::string statusXmlUrl; + std::string statusWebUrl; AdhocDataMode mode = AdhocDataMode::P2P; }; @@ -122,6 +124,7 @@ enum class AdhocLoadListMode { void AdhocLoadServerList(AdhocLoadListMode loadMode); std::vector AdhocGetServerList(AdhocLoadListMode loadMode); +bool AdhocGetServerByHost(std::string_view host, AdhocServerListEntry *dest); // CacheOnlySync is enforced. class PointerWrap; diff --git a/Tools/langtool/src/main.rs b/Tools/langtool/src/main.rs index fa8b351c36..d9e95b1ade 100644 --- a/Tools/langtool/src/main.rs +++ b/Tools/langtool/src/main.rs @@ -611,9 +611,10 @@ fn generate_prompt(filenames: &[String], section: &str, value: &str, extra: &str let base_str = format!("Please translate '{value}' from US English to all of these languages: {languages}. Output in json format, a single dictionary, key=value. Include en_US first (the original string). For context, the string will be in the translation section '{section}', and these strings are UI strings for my PSP emulator application. - Keep the strings relatively short, try not to let them become more than 60% longer than the original string. + {extra} + Keep the strings relatively short, try not to let them become more than 60% longer than the original string unless necessary. Do not output any text before or after the list of translated strings, do not ask followups. - {extra}"); + "); base_str } diff --git a/UI/AdhocServerScreen.cpp b/UI/AdhocServerScreen.cpp index c15f23d35d..3ae4cc6a97 100644 --- a/UI/AdhocServerScreen.cpp +++ b/UI/AdhocServerScreen.cpp @@ -1,9 +1,9 @@ #include +#include "ppsspp_config.h" #undef new #include "ext/rapidjson/include/rapidjson/document.h" #include "Common/DbgNew.h" -//#include "rapidjson/document.h" #include "AdhocServerScreen.h" #include "Core/Util/GameDB.h" @@ -16,27 +16,8 @@ #include "Core/HLE/sceNetAdhoc.h" #include "UI/MiscViews.h" -struct User { - std::string name; - std::vector pdp_ports; - std::vector ptp_ports; -}; - -struct Group { - std::string name; - int usercount; - std::vector users; -}; - -struct Game { - std::string name; - int usercount; - std::vector groups; - std::vector game_ids; -}; - -static void UpgradeName(std::string *str) { - if (str->size() == 9) { // TODO: Make a better check +static void UpgradeGameName(std::string *str) { + if (str->size() == 9) { // TODO: Make a better heuristic, we might make some failed lookup into the DB. // It's probably a game ID. Convert it to a name using the database. std::vector infos; if (g_gameDB.GetGameInfos(*str, &infos)) { @@ -45,32 +26,32 @@ static void UpgradeName(std::string *str) { } } -std::vector ParseDataJson(std::string_view json) { +std::vector ParseDataJson(std::string_view json) { rapidjson::Document d; d.Parse(json.data(), json.size()); - std::vector gameList; + std::vector gameList; if (d.HasParseError() || !d.HasMember("games")) return gameList; const auto& gamesArray = d["games"]; for (auto& g : gamesArray.GetArray()) { - Game game; + AdhocGame game; game.name = g["name"].GetString(); - UpgradeName(&game.name); + UpgradeGameName(&game.name); // Handle string-to-int conversion for usercount game.usercount = std::stoi(g["usercount"].GetString()); if (g.HasMember("groups")) { for (auto& grp : g["groups"].GetArray()) { - Group group; + AdhocGroup group; group.name = grp["name"].GetString(); group.usercount = std::stoi(grp["usercount"].GetString()); if (grp.HasMember("users")) { for (auto& u : grp["users"].GetArray()) { - User user; + AdhocUser user; user.name = u["name"].GetString(); for (auto& p : u["pdp_ports"].GetArray()) @@ -141,7 +122,60 @@ private: bool hasRelay_ = false; }; -static UI::View *CreateLinkButton(std::string url) { +class AdhocServerCompactInfo : public UI::LinearLayout { +public: + AdhocServerCompactInfo(const AdhocServerListEntry &entry, UI::LayoutParams *layoutParams = nullptr); + void Draw(UIContext &dc) override { + UI::LinearLayout::Draw(dc); + // Underline + dc.Draw()->DrawImageCenterTexel(dc.GetTheme().whiteImage, bounds_.x, bounds_.y2() - 2, bounds_.x2(), bounds_.y2(), dc.GetTheme().popupTitleStyle.fgColor); + } + void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { + w = 500; h = 100; + } +private: + AdhocServerListEntry entry_; +}; + +AdhocServerCompactInfo::AdhocServerCompactInfo(const AdhocServerListEntry &entry, UI::LayoutParams *layoutParams) + : UI::LinearLayout(ORIENT_HORIZONTAL, new UI::LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT, UI::Margins(5.0f, 0.0f))), entry_(entry) { + using namespace UI; + + SetSpacing(5.0f); + + LinearLayout *lines = Add(new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(Margins(5, 5)))); + lines->SetSpacing(0.0f); + TextView *name = lines->Add(new TextView(entry.name)); + + std::string secondLine = entry.host; + auto n = GetI18NCategory(I18NCat::NETWORKING); + if (!entry.location.empty()) { + secondLine += ": " + entry.location; + } + + lines->Add(new TextView(secondLine))->SetTextSize(TextSize::Small)->SetWordWrap(); + + Add(new Spacer(0.0f, new LinearLayoutParams(1.0f, Margins(0.0f, 5.0f)))); + + if (entry.mode == AdhocDataMode::AemuPostoffice) { + TextView *relay = Add(new TextView(n->T("Relay"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity::G_VCENTER, Margins(10.0)))); + } + + Add(new Choice(ImageID("I_FILE_COPY"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)))->OnClick.Add([host = entry_.host](UI::EventParams &) { + System_CopyStringToClipboard(host); + }); +} + +static UI::View *CreateInfoItemWithButton(std::string_view text, ImageID buttonImage, std::function onClick) { + using namespace UI; + LinearLayout *line = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(12, 0))); + line->Add(new TextView(text, new LinearLayoutParams(0.0f, Gravity::G_VCENTER))); + line->Add(new Spacer(0, new LinearLayoutParams(1.0f))); + line->Add(new Choice(buttonImage, new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)))->OnClick.Add(onClick); + return line; +} + +static UI::View *CreateLinkButton(std::string url, std::string_view title = "") { using namespace UI; // steal strings from all over the place @@ -149,14 +183,14 @@ static UI::View *CreateLinkButton(std::string url) { auto st = GetI18NCategory(I18NCat::STORE); ImageID icon = ImageID("I_LINK_OUT_QUESTION"); - std::string title; - if (startsWith(url, "https://discord")) { icon = ImageID("I_LOGO_DISCORD"); - title = cr->T("Discord"); + if (title.empty()) + title = cr->T("Discord"); } else { icon = ImageID("I_LINK_OUT"); - title = st->T("Website"); + if (title.empty()) + title = st->T("Website"); } Choice *choice = new Choice(title, icon, new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)); @@ -168,92 +202,120 @@ static UI::View *CreateLinkButton(std::string url) { // Later, this might also show games-in-progress. // For now, it's just a simple metadata viewer. -class AdhocServerInfoScreen : public UI::PopupScreen { -public: - AdhocServerInfoScreen(const AdhocServerListEntry &entry) - : PopupScreen(entry.name, T(I18NCat::DIALOG, "Back")), entry_(entry) { +AdhocServerInfoScreen::AdhocServerInfoScreen(const AdhocServerListEntry &entry) + : UI::PopupScreen("", T(I18NCat::DIALOG, "Back")), entry_(entry) { - if (!entry.statusUrl.empty()) { - statusRequest_ = g_DownloadManager.StartDownload(entry.statusUrl, Path(), http::RequestFlags::KeepInMemory | http::RequestFlags::Cached24H, nullptr, "status"); + if (!entry.dataJsonUrl.empty()) { + statusRequest_ = g_DownloadManager.StartDownload(entry.dataJsonUrl, Path(), http::RequestFlags::KeepInMemory, nullptr, "status"); + } +} + +void AdhocServerInfoScreen::CreatePopupContents(UI::ViewGroup *parent) { + using namespace UI; + auto pa = GetI18NCategory(I18NCat::PAUSE); + auto di = GetI18NCategory(I18NCat::DIALOG); + auto ni = GetI18NCategory(I18NCat::NETWORKING); + + Margins contentMargins(12, 0); + + parent->Add(new AdhocServerCompactInfo(entry_, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, contentMargins))); + parent->Add(new Spacer(5.0f)); + + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); + LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); + content->SetSpacing(6.0f); + if (!entry_.ip.empty()) { + content->Add(new InfoItem(entry_.ip, "")); + } + TextView *desc = content->Add(new TextView(entry_.description, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, contentMargins))); + desc->SetTextSize(TextSize::Small); + desc->SetWordWrap(); + + if (!entry_.web.empty() || !entry_.discord.empty()) { + LinearLayout *buttonStrip = content->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); + buttonStrip->SetSpacing(8); + if (!entry_.web.empty()) { + buttonStrip->Add(CreateLinkButton(entry_.web)); } - } // PopupScreen will translate Back on its own - - const char *tag() const override { return "AdhocServerInfo"; } - -protected: - bool FillVertical() const override { return false; } - UI::Size PopupWidth() const override { return 500; } - bool ShowButtons() const override { return true; } - - void CreatePopupContents(UI::ViewGroup *parent) override { - using namespace UI; - auto pa = GetI18NCategory(I18NCat::PAUSE); - auto di = GetI18NCategory(I18NCat::DIALOG); - auto ni = GetI18NCategory(I18NCat::NETWORKING); - - ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); - LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); - Margins contentMargins(10, 0); - content->SetSpacing(0.0f); - LinearLayout *hostLine = content->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(12, 0)))); - hostLine->Add(new TextView(entry_.host, new LinearLayoutParams(0.0f, Gravity::G_VCENTER))); - hostLine->Add(new Spacer(0, new LinearLayoutParams(1.0f))); - hostLine->Add(new Choice(ImageID("I_FILE_COPY"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)))->OnClick.Add([host = entry_.host](UI::EventParams &) { - System_CopyStringToClipboard(host); - }); - if (!entry_.ip.empty()) { - content->Add(new InfoItem(entry_.ip, "")); + if (!entry_.discord.empty()) { + buttonStrip->Add(CreateLinkButton(entry_.discord)); } - content->Add(new InfoItem(entry_.location, "")); - content->Add(new InfoItem(ni->T("Relay server mode"), entry_.mode == AdhocDataMode::AemuPostoffice ? di->T("Yes") : di->T("No"))); - TextView *desc = content->Add(new TextView(entry_.description, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(12)))); - desc->SetTextSize(TextSize::Small); - desc->SetWordWrap(); + } - if (!entry_.web.empty() || !entry_.discord.empty()) { - LinearLayout *buttonStrip = content->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(12)))); - buttonStrip->SetSpacing(8); - if (!entry_.web.empty()) { - buttonStrip->Add(CreateLinkButton(entry_.web)); - } - if (!entry_.discord.empty()) { - buttonStrip->Add(CreateLinkButton(entry_.discord)); - } + if (entry_.dataJsonUrl.empty()) { + content->Add(CreateInfoItemWithButton(ni->T("This server has no data.json status page"), ImageID("I_LINK_OUT_QUESTION"), [](UI::EventParams &e) { + System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/docs/multiplayer/adhoc-server-status/"); + })); + if (!entry_.statusWebUrl.empty()) { + content->Add(CreateLinkButton(entry_.statusWebUrl, ni->T("Status on web"))); } - - if (entry_.statusUrl.empty()) { - content->Add(new TextView("This server has no data.json status page.")); + if (!entry_.statusXmlUrl.empty()) { + content->Add(CreateLinkButton(entry_.statusXmlUrl, ni->T("Status on web"))); + } + } else { + if (games_.empty()) { + content->Add(new TextView(ni->T("No games in progress on this server"))); } else { - if (games_.empty()) { - content->Add(new TextView("No games are currently being played on this server.")); - } else { - // TODO: Do something more sophisticated here, like showing groups and users. For now, just show game names. - for (const auto &game : games_) { - content->Add(new TextView(game.name)); + for (const AdhocGame &game : games_) { + CollapsibleSection *gameSection = content->Add(new CollapsibleSection(StringFromFormat("%s (players: %d groups: %d)", game.name.c_str(), game.usercount, (int)game.groups.size()))); + for (const AdhocGroup &group : game.groups) { + gameSection->Add(new TextView(StringFromFormat(" %s (players: %d)", group.name.c_str(), group.usercount)))->SetTextSize(TextSize::Small); + for (const AdhocUser &user : group.users) { + std::string portInfo; + if (!user.pdp_ports.empty()) { + portInfo += "PDP: "; + for (int port : user.pdp_ports) { + portInfo += std::to_string(port) + " "; + } + } + if (!user.ptp_ports.empty()) { + portInfo += "PTP: "; + for (int port : user.ptp_ports) { + portInfo += std::to_string(port) + " "; + } + } + gameSection->Add(new TextView(StringFromFormat(" %s %s", user.name.c_str(), portInfo.c_str())))->SetTextSize(TextSize::Tiny); + } + } + gameSection->SetOpen(false); // NOTE: Must be last! + } + } + } + + scroll->Add(content); + parent->Add(scroll); +} + +void AdhocServerInfoScreen::update() { + UI::PopupScreen::update(); + if (statusRequest_ && statusRequest_->Done()) { + std::string json; + statusRequest_->buffer().TakeAll(&json); + games_ = ParseDataJson(json); + statusRequest_.reset(); + RecreateViews(); + } +} + +void AddDeleteButton(std::string *editValue, ScreenManager *screenManager, UI::ViewGroup *viewGroup, const AdhocServerListEntry &entry) { + using namespace UI; + Choice *deleteButton = viewGroup->Add(new Choice(ImageID("I_TRASHCAN"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity::G_VCENTER, Margins(0, 0, 10, 0)))); + deleteButton->OnClick.Add([host = entry.host, screenManager, editValue](UI::EventParams &e) { + auto di = GetI18NCategory(I18NCat::DIALOG); + const std::string quotedHost = "\"" + host + "\""; + const std::string message = ApplySafeSubstitutions(di->T("Are you sure you want to delete %1?"), quotedHost); + screenManager->push(new UI::MessagePopupScreen(di->T("Delete"), message, di->T("Delete"), di->T("Cancel"), [host, editValue](bool confirmed) { + if (confirmed) { + RemoveNoCase(g_Config.vCustomAdhocServerList, host); + RemoveNoCase(g_Config.vCustomAdhocServerListWithRelay, host); + if (*editValue == host) { + // Reset to socom.cc, which will always be in a list. + *editValue = DefaultProAdhocServer(); } } - } - - scroll->Add(content); - parent->Add(scroll); - } - - void update() override { - UI::PopupScreen::update(); - if (statusRequest_ && statusRequest_->Done()) { - std::string json; - statusRequest_->buffer().TakeAll(&json); - games_ = ParseDataJson(json); - statusRequest_.reset(); - RecreateViews(); - } - } - -private: - AdhocServerListEntry entry_; - std::vector games_; - std::shared_ptr statusRequest_; -}; + })); + }); +} class AdhocServerRow : public UI::LinearLayout { public: @@ -303,26 +365,6 @@ private: AdhocServerListEntry entry_; }; -void AddDeleteButton(std::string *editValue, ScreenManager *screenManager, UI::ViewGroup *viewGroup, const AdhocServerListEntry &entry) { - using namespace UI; - Choice *deleteButton = viewGroup->Add(new Choice(ImageID("I_TRASHCAN"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity::G_VCENTER, Margins(0, 0, 10, 0)))); - deleteButton->OnClick.Add([host = entry.host, screenManager, editValue](UI::EventParams &e) { - auto di = GetI18NCategory(I18NCat::DIALOG); - const std::string quotedHost = "\"" + host + "\""; - const std::string message = ApplySafeSubstitutions(di->T("Are you sure you want to delete %1?"), quotedHost); - screenManager->push(new UI::MessagePopupScreen(di->T("Delete"), message, di->T("Delete"), di->T("Cancel"), [host, editValue](bool confirmed) { - if (confirmed) { - RemoveNoCase(g_Config.vCustomAdhocServerList, host); - RemoveNoCase(g_Config.vCustomAdhocServerListWithRelay, host); - if (*editValue == host) { - // Reset to socom.cc, which will always be in a list. - *editValue = DefaultProAdhocServer(); - } - } - })); - }); -} - AdhocServerRow::AdhocServerRow(std::string *editValue, const AdhocServerListEntry &entry, bool showDeleteButton, ScreenManager *screenManager, UI::LayoutParams *layoutParams) : UI::LinearLayout(ORIENT_HORIZONTAL, new UI::LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT, UI::Margins(5.0f, 0.0f))), value_(editValue), entry_(entry) { using namespace UI; diff --git a/UI/AdhocServerScreen.h b/UI/AdhocServerScreen.h index fceaabe66d..e9577f3903 100644 --- a/UI/AdhocServerScreen.h +++ b/UI/AdhocServerScreen.h @@ -9,6 +9,48 @@ #include "Common/UI/PopupScreens.h" #include "Core/Config.h" // for AdhocServerListEntry! #include "Common/UI/Notice.h" +#include "Core/HLE/sceNetAdhoc.h" + +struct AdhocUser { + std::string name; + std::vector pdp_ports; + std::vector ptp_ports; +}; + +struct AdhocGroup { + std::string name; + int usercount; + std::vector users; +}; + +struct AdhocGame { + std::string name; + int usercount; + std::vector groups; + std::vector game_ids; +}; + +// Later, this might also show games-in-progress. +// For now, it's just a simple metadata viewer. +class AdhocServerInfoScreen : public UI::PopupScreen { +public: + AdhocServerInfoScreen(const AdhocServerListEntry &entry); + + const char *tag() const override { return "AdhocServerInfo"; } + +protected: + bool FillVertical() const override { return false; } + UI::Size PopupWidth() const override { return 650; } + bool ShowButtons() const override { return true; } + + void CreatePopupContents(UI::ViewGroup *parent) override; + void update() override; + +private: + AdhocServerListEntry entry_; + std::vector games_; + std::shared_ptr statusRequest_; +}; class AdhocServerScreen : public UI::PopupScreen { public: diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index bcf27da2d9..0026a59303 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1032,6 +1032,15 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti serverRow->Add(new Choice(ImageID("I_EDIT_TEXT"), new LinearLayoutParams(ITEM_HEIGHT, ITEM_HEIGHT)))->OnClick.Add([this](UI::EventParams &) { AskToEditCurrentServer(GetRequesterToken(), screenManager()); }); + } else if (!g_Config.sProAdhocServer.empty()) { + AdhocServerListEntry entry; + if (AdhocGetServerByHost(g_Config.sProAdhocServer, &entry)) { + Choice *status = networkingSettings->Add(new Choice(ApplySafeSubstitutions(n->T("Server status: %1"), g_Config.sProAdhocServer))); + status->SetIconLeft(ImageID("I_INFO")); + status->OnClick.Add([this, entry](UI::EventParams &) { + screenManager()->push(new AdhocServerInfoScreen(entry)); + }); + } } static const char *relayModes[] = {"Auto", "Yes", "No"}; diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index f23aacb3f0..144781408d 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -80,7 +80,7 @@ static void AfterSaveStateAction(SaveState::Status status, std::string_view mess class ScreenshotViewScreen : public UI::PopupScreen { public: ScreenshotViewScreen(const Path &screenshotFilename, std::string_view saveStatePrefix, std::string_view title, int slot, Path gamePath) - : PopupScreen(title), screenshotFilename_(screenshotFilename), saveStatePrefix_(saveStatePrefix), slot_(slot), gamePath_(gamePath), title_(title) {} // PopupScreen will translate Back on its own + : PopupScreen(title), screenshotFilename_(screenshotFilename), saveStatePrefix_(saveStatePrefix), slot_(slot), gamePath_(gamePath), title_(title) {} int GetSlot() const { return slot_; diff --git a/assets/adhoc-servers.json b/assets/adhoc-servers.json index 37a8b8701e..85fcb087b9 100644 --- a/assets/adhoc-servers.json +++ b/assets/adhoc-servers.json @@ -7,7 +7,8 @@ "web": "", "location": "France", "description": "For players looking to play any games", - "data_mode": "AemuPostoffice" + "data_mode": "AemuPostoffice", + "status_xml": "https://www.socom.cc/status.xml" }, { "name": "Madness Gaming Network", diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 362e0c3e42..53bd8fe8c7 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -1044,6 +1044,7 @@ Relay = الترحيل # AI translated Relay server mode = وضع خادم الترحيل # AI translated Send = إرسال Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = حالة الخادم: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = نقل الملفات diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 9b126bb731..a1d93504d4 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -1036,6 +1036,7 @@ Relay = Rejimi Relay server mode = Relay server rejimi # AI translated Send = Göndər Send Discord Presence information = Discord "Bol Varlıq" bilgisini göndər +Server status: %1 = Server vəziyyəti: %1 # AI translated Some network functionality in this game is not working = Bu oyundakı bəzi bağlantı işləvsəlliklər işləmir To play in Infrastructure Mode, you must enter a username = İnfrastruktur Modunda oynamaq üçün işlədici adı yazmalısınız Transfer files = Faylları köçürmək diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index c050f0e5ae..4e50e73772 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -1003,6 +1003,7 @@ Relay = Релей # AI translated Relay server mode = Рэжым сервера перасылкі # AI translated Send = Адправіць Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Статус сервера: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Перадаць файлы diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 2120e984e1..95c09c21ec 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -1036,6 +1036,7 @@ Relay = Реле # AI translated Relay server mode = Режим на релейния сървър # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Статус на сървъра: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Прехвърляне на файлове diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 3133dc1250..075c1601de 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -1036,6 +1036,7 @@ Relay = Relleu # AI translated Relay server mode = Mode de servidor de relleu # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Estat del servidor: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir fitxers diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index e402779966..ecb81591ef 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -1036,6 +1036,7 @@ Relay = Reléového # AI translated Relay server mode = Režim reléového serveru # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Stav serveru: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Přenos souborů diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 6153cf7d0e..37f4a78fe1 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Relayserver-tilstand # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Serverstatus: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Overfør filer diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 618d32bea7..c3bb98b998 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -1035,6 +1035,7 @@ Relay = Relay # AI translated Relay server mode = Relay-Server-Modus # AI translated Send = Senden Send Discord Presence information = Discord "Rich Presence"-Information senden +Server status: %1 = Serverstatus: %1 # AI translated Some network functionality in this game is not working = Einige Netzwerkfunktionen in diesem Spiel funktionieren nicht To play in Infrastructure Mode, you must enter a username = Um im Infrastrukturmodus zu spielen, musst du einen Benutzernamen eingeben Transfer files = Dateien übertragen diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index c70d388e1c..616a0415ad 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Mode server relay # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Status server: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer file diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 2b76659cf4..4c2c439c2d 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -1028,6 +1028,7 @@ Relay = Relay Relay server mode = Relay server mode Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Server status: %1 Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer files diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 13cf24473e..fb314d2eac 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -1037,6 +1037,7 @@ Relay = Retransm. # AI translated Relay server mode = Modo servidor de retransmisión # AI translated Send = Enviar Send Discord Presence information = Enviar información de "Rich Presence" a Discord +Server status: %1 = Estado del servidor: %1 # AI translated Some network functionality in this game is not working = Algunas funciones de red en este juego no funcionan. To play in Infrastructure Mode, you must enter a username = Para jugar en el modo Infraestructura, debes introducir un nombre de usuario Transfer files = Transferir archivos diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 55223d3b56..6c482a04d1 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1036,6 +1036,7 @@ Relay = Retransm. # AI translated Relay server mode = Modo de servidor de retransmisión # AI translated Send = Enviar Send Discord Presence information = Enviar información al Discord "Rich Presence" +Server status: %1 = Estado del servidor: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir archivos diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index f55b784ff8..47de5e2ba7 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -1036,6 +1036,7 @@ Relay = حالت رله # AI translated Relay server mode = حالت سرور رله # AI translated Send = ارسال Send Discord Presence information = ارسال اطلاعات "Rich Presence" به دیسکورد +Server status: %1 = وضعیت سرور: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = انتقال فایل‌ها diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 1e7dd99bf0..4169998985 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -1036,6 +1036,7 @@ Relay = Väylä # AI translated Relay server mode = Väyläpalvelimen tila # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Palvelimen tila: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Siirrä tiedostoja diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index fbe91546f2..94a0cdcf1e 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -1030,6 +1030,7 @@ Relay = Relais Relay server mode = Mode serveur relais Send = Envoyer Send Discord Presence information = Envoyer l'information "Rich Presence" de Discord +Server status: %1 = État du serveur: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transférer des fichiers diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 9e588c73ad..ffe49bb711 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -1036,6 +1036,7 @@ Relay = Retransm. # AI translated Relay server mode = Modo servidor de retransmisión # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Estado do servidor: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir arquivos diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 26149be55a..9fc2ee3448 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -1036,6 +1036,7 @@ Relay = Αναμετάδοση Relay server mode = Λειτουργία διακομιστή αναμετάδοσης # AI translated Send = Send Send Discord Presence information = Αποστολή "Rich Presence" πληροφοριών σε Discord +Server status: %1 = Κατάσταση διακομιστή: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Μεταφορά αρχείων diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index f20508c281..64a2bd12c5 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -1036,6 +1036,7 @@ Relay = מצב שרת ריליי # AI translated Relay server mode = מצב שרת ריליי # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = מצב השרת: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = העבר קבצים diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 8a8194b42d..d2bf227f2f 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -1036,6 +1036,7 @@ Relay = Relay Relay server mode = מצב שרת ריליי # AI translated Send = שלח Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = מצב השרת: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = קבצים העבר diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 7dae131823..7f528d710d 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Način relay servera # AI translated Send = Send Send Discord Presence information = Šalji Discord "Rich Presence" informaciju +Server status: %1 = Status poslužitelja: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Prenesi datoteke diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index d3a7befdab..da98466350 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Relay szerver mód # AI translated Send = Küldés Send Discord Presence information = "Rich Presence" információ küldése Discordnak +Server status: %1 = Szerver állapot: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Fájlok átvitele diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 2daeceb3cb..3e891ed9f9 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Mode server relay # AI translated Send = Kirim Send Discord Presence information = Kirim informasi "Kritik dan Saran" ke Discord +Server status: %1 = Status server: %1 # AI translated Some network functionality in this game is not working = Beberapa fungsi jaringan dalam game ini tidak berfungsi To play in Infrastructure Mode, you must enter a username = Untuk bermain dalam Mode Infrastruktur, Anda harus memasukkan nama pengguna Transfer files = Transfer file diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 1fdef969ea..aeda7d434b 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -1004,6 +1004,7 @@ Relay = Relay # AI translated Relay server mode = Modalità server relay # AI translated Send = Invia Send Discord Presence information = Invia informazioni Discord "Rich Presence" +Server status: %1 = Stato del server: %1 # AI translated Some network functionality in this game is not working = Alcune funzionalità di rete in questo gioco non funzionano To play in Infrastructure Mode, you must enter a username = Per giocare in modalità Infrastruttura, è necessario inserire un nome utente Transfer files = Trasferisci file diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index bef5e5898b..23a6ae7ade 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -1003,6 +1003,7 @@ Relay = リレー # AI translated Relay server mode = リレサーバーモード # AI translated Send = 送信する Send Discord Presence information = Discordのプレゼンス情報を送信する +Server status: %1 = サーバーの状態: %1 # AI translated Some network functionality in this game is not working = このゲームの一部のネットワーク機能が動作していません To play in Infrastructure Mode, you must enter a username = インフラストラクチャモードでプレイするには、ユーザー名を入力する必要があります Transfer files = ファイルを転送 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 060be67f74..e1c91cd45e 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Mode server relay # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Status server: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer file diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 29edd8e797..b0de94deee 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -1003,6 +1003,7 @@ Relay = 릴레이 # AI translated Relay server mode = 릴레이 서버 모드 # AI translated Send = 보내기 Send Discord Presence information = 디스코드 "리치 프레즌스" 정보 보내기 +Server status: %1 = 서버 상태: %1 # AI translated Some network functionality in this game is not working = 이 게임의 일부 네트워크 기능이 작동하지 않았음 To play in Infrastructure Mode, you must enter a username = 인프라 모드에서 플레이하려면 사용자 이름을 입력해야 함 Transfer files = 파일 전송 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 3a7a89c716..1158919be9 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -1017,6 +1017,7 @@ Relay = Relê # AI translated Relay server mode = Rejim serverê relê # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Rewşa serverê: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Pelanên transfer bike diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index db9280b2e3..3a4debcfa1 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = ແບບເຄື່ອງລົດລາ # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = ສະຖານທີ່ສະເລີຍ: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = ເກັບໃສ່ໄຟລ໌ diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 75ca1e1f2e..fa144baa64 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -1036,6 +1036,7 @@ Relay = Relės Relay server mode = Relės serverio režimas # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Serverio būsena: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Perkelti failus diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index cd343de206..a5a3675c92 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -1036,6 +1036,7 @@ Relay = Mod pelayan relay # AI translated Relay server mode = Relay # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Status pelayan: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Pindahkan fail diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index d70623f336..97e4e159c9 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Relayservermodus # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Serverstatus: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Bestanden overdragen diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 1ada649d3a..c317e21610 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Relayservermodus # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Serverstatus: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Overfør filer diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index e5093e1cd6..feba45b0a2 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -1041,6 +1041,7 @@ Relay = Relay # AI translated Relay server mode = Tryb serwera relay # AI translated Send = Wyślij Send Discord Presence information = Przesyłaj informacje Discord Rich Presence +Server status: %1 = Status serwera: %1 # AI translated Some network functionality in this game is not working = Niektóre funkcje sieciowe w tej grze nie działają To play in Infrastructure Mode, you must enter a username = Aby grać w trybie infrastruktury, musisz wprowadzić nazwę użytkownika. Transfer files = Przenieś pliki diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 985833fe74..724c37dff6 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -1028,6 +1028,7 @@ Relay = Transmissão Relay server mode = Modo do servidor de transmissão Send = Enviar Send Discord Presence information = Enviar informação da "Presença Rica" no Discord +Server status: %1 = Status do servidor: %1 # AI translated Some network functionality in this game is not working = Algumas funcionalidades da rede neste jogo não estão funcionando To play in Infrastructure Mode, you must enter a username = Pra jogar no Modo de infra-estrutura você deve inserir um nome de usuário Transfer files = Transferir arquivos diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 2ccafdd964..c42a3d646d 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -1028,6 +1028,7 @@ Relay = Relay # AI translated Relay server mode = Modo de servidor relay # AI translated Send = Enviar Send Discord Presence information = Enviar informação de "Rich Presence" no Discord +Server status: %1 = Estado do servidor: %1 # AI translated Some network functionality in this game is not working = Algumas funcionalidades de rede deste jogo não são compatíveis To play in Infrastructure Mode, you must enter a username = Para jogar no modo infraestrutura, deves inserir um apelido Transfer files = Transferir ficheiros diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 81111d9822..5b020401ec 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -1037,6 +1037,7 @@ Relay = Relay # AI translated Relay server mode = Mod server relay # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Starea serverului: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferați fișiere diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 074396834a..4bb6a6f5ff 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -1003,6 +1003,7 @@ Relay = Режим релея Relay server mode = Режим релейного сервера Send = Отправить Send Discord Presence information = Отправлять информацию об игре в Discord +Server status: %1 = Статус сервера: %1 # AI translated Some network functionality in this game is not working = Некоторые сетевые функции в этой игре не работают To play in Infrastructure Mode, you must enter a username = Для игры в режиме инфраструктуры необходимо ввести имя пользователя Transfer files = Передача файлов diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index b04057db6b..24789df0a6 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -1004,6 +1004,7 @@ Relay = Relay # AI translated Relay server mode = Relayserverläge # AI translated Send = Skicka Send Discord Presence information = Visa Discord "Rich Presence"-information +Server status: %1 = Serverstatus: %1 # AI translated Some network functionality in this game is not working = Viss nätverksfunktionalitet i detta spel fungerar ej To play in Infrastructure Mode, you must enter a username = För att spela i infrastrukturläge måste du ange ett användarnamn Transfer files = Överför filer diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index c53536e9ca..6c5595c0c2 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -1037,6 +1037,7 @@ Relay = Релей # AI translated Relay server mode = Режими сервери релей # AI translated Send = I-Send Send Discord Presence information = Magpadala ng impormasyon sa 'Rich Presence' ni Discord. +Server status: %1 = Вазъи сервер: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Файли интиқол кунед diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 097a65d80b..2c2a6e155a 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1056,6 +1056,7 @@ Relay = รีเลย์ Relay server mode = โหมดเซิร์ฟเวอร์รีเลย์ Send = ส่ง Send Discord Presence information = แสดงชื่อเกมที่กำลังเล่นอยู่ไปยังแอพ Discord +Server status: %1 = สถานะเซิร์ฟเวอร์: %1 # AI translated Some network functionality in this game is not working = ฟังก์ชั่นของเครือข่ายบางอย่างในเกมนี้อาจจะใช้งานไม่ได้ To play in Infrastructure Mode, you must enter a username = การเล่นในโหมด Infrastructure คุณจะต้องป้อนชื่อผู้ใช้งาน Transfer files = โอนไฟล์ diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index e8b1546321..d229e66673 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -1038,6 +1038,7 @@ Relay = Relay # AI translated Relay server mode = Relay sunucu modu # AI translated Send = Gönder Send Discord Presence information = Discord Zengin Varlık Bilgisi Gönder +Server status: %1 = Sunucu durumu: %1 # AI translated Some network functionality in this game is not working = Bu oyundaki bazı ağ işlevleri çalışmıyor To play in Infrastructure Mode, you must enter a username = Altyapı modunda oynamak için bir kullanıcı adı girmelisiniz Transfer files = Dosyaları aktar diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index f164952968..ee60a989ae 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -1036,6 +1036,7 @@ Relay = Релей # AI translated Relay server mode = Режим релейного сервера # AI translated Send = Надіслати Send Discord Presence information = Відправляти інформацію про гру в Діскорд +Server status: %1 = Статус сервера: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Передати файли diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 4ab0033809..15a75864ba 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -1036,6 +1036,7 @@ Relay = Relay # AI translated Relay server mode = Chế độ máy chủ relay # AI translated Send = Send Send Discord Presence information = Send Discord "Rich Presence" information +Server status: %1 = Trạng thái máy chủ: %1 # AI translated Some network functionality in this game is not working = Some network functionality in this game is not working To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Chuyển tệp diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index f122c8c701..b702c4cd2a 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1037,6 +1037,7 @@ Relay = 中继 # AI translated Relay server mode = 中继服务器模式 # AI translated Send = 发送 Send Discord Presence information = Discord 显示在线状态 +Server status: %1 = 服务器状态: %1 # AI translated Some network functionality in this game is not working = 此游戏中的某些网络功能不起作用 To play in Infrastructure Mode, you must enter a username = 您必须输入用户名,才能在基础模式下游玩 Transfer files = 传输文件 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index c251759324..1f0462b0b0 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -1003,6 +1003,7 @@ Relay = 中繼 # AI translated Relay server mode = 中繼伺服器模式 # AI translated Send = 傳送 Send Discord Presence information = 傳送 Discord「Rich Presence」資訊 +Server status: %1 = 伺服器狀態: %1 # AI translated Some network functionality in this game is not working = 此遊戲中的某些網路功能無法工作 To play in Infrastructure Mode, you must enter a username = 您必須輸入使用者名稱,才能在基礎模式下游玩 Transfer files = 傳輸檔案