diff --git a/Common/Render/TextureAtlas.cpp b/Common/Render/TextureAtlas.cpp index d30fe86c5f..627dd89c96 100644 --- a/Common/Render/TextureAtlas.cpp +++ b/Common/Render/TextureAtlas.cpp @@ -106,7 +106,7 @@ const AtlasImage *Atlas::getImage(ImageID name) const { return nullptr; for (int i = 0; i < num_images; i++) { - if (!strcmp(name.id, images[i].name)) + if (name.id == images[i].name) return &images[i]; } return nullptr; diff --git a/Common/Render/TextureAtlas.h b/Common/Render/TextureAtlas.h index e9b778deda..493a73c3ba 100644 --- a/Common/Render/TextureAtlas.h +++ b/Common/Render/TextureAtlas.h @@ -3,6 +3,8 @@ #include #include +#include + #define ATLAS_MAGIC ('A' | ('T' << 8) | ('L' << 16) | ('A' << 24)) // Metadata file structure v0: @@ -21,34 +23,31 @@ struct Atlas; struct ImageID { public: - ImageID() : id(nullptr) {} - explicit ImageID(const char *_id) : id(_id) {} + ImageID() {} + explicit ImageID(std::string_view _id) : id(_id) {} static inline ImageID invalid() { - return ImageID{ nullptr }; + return ImageID{""}; } bool isValid() const { - return id != nullptr; + return !id.empty(); } bool isInvalid() const { - return id == nullptr; + return id.empty(); } bool operator ==(const ImageID &other) { - return (id == other.id) || !strcmp(id, other.id); + return id == other.id; } bool operator !=(const ImageID &other) { - if (id == other.id) { - return false; - } - return strcmp(id, other.id) != 0; + return id != other.id; } private: - const char *id; + std::string_view id; friend struct Atlas; }; diff --git a/Core/WebServer.cpp b/Core/WebServer.cpp index 2309239aaf..ecd558703c 100644 --- a/Core/WebServer.cpp +++ b/Core/WebServer.cpp @@ -30,6 +30,7 @@ #include "Common/File/FileDescriptor.h" #include "Common/File/DirListing.h" #include "Common/File/VFS/VFS.h" +#include "Common/Data/Text/I18n.h" #include "Common/TimeUtil.h" #include "Common/StringUtils.h" #include "Common/System/System.h" @@ -454,7 +455,13 @@ static void HandleFallback(const http::ServerRequest &request) { } if (serverFlags & WebServerFlags::FILE_UPLOAD) { - if (startsWith(request.resource(), "/upload")) { + Path uploadPath; + { + std::lock_guard guard(g_webServerLock); + uploadPath = g_uploadPath; + } + + if (startsWith(request.resource(), "/upload") && !uploadPath.empty()) { if (ServeAssetFile(request)) { return; } @@ -504,25 +511,11 @@ static void ForwardDebuggerRequest(const http::ServerRequest &request) { } } -static void HandleUploadUI(const http::ServerRequest &request) { - // Read the file from VFS. - AndroidJNIThreadContext jniContext; - request.WriteHttpResponseHeader("1.0", 200, -1, "text/html"); - request.Out()->Push( - "PPSSPP Remote ISO Upload" - "

Upload ISO File

" - "
" - "" - "" - "
" - ""); -} - class ProgressTracker { public: - ProgressTracker(int sessionId) : sessionId_(sessionId) { + ProgressTracker(int sessionId, s64 totalSize) : sessionId_(sessionId) { std::lock_guard guard(g_webServerLock); - g_uploadsInProgress[sessionId_] = UploadProgress(); + g_uploadsInProgress[sessionId_] = UploadProgress{totalSize}; } ~ProgressTracker() { std::lock_guard guard(g_webServerLock); @@ -531,10 +524,9 @@ public: void SetFile(std::string_view filename, size_t size) { std::lock_guard guard(g_webServerLock); auto &upload = g_uploadsInProgress[sessionId_]; - upload.currentFilename = filename; + upload.filename = filename; upload.currentFileSize = size; - upload.uploadedFiles++; - upload.totalBytesBeforeCurrentFile = upload.uploadedBytes; + upload.uploadedBytes = 0; } void AddBytes(size_t bytes) { std::lock_guard guard(g_webServerLock); @@ -559,6 +551,8 @@ static MultiPartResult HandleMultipartPart(const http::ServerRequest &request, s } std::string disposition = request.In()->ReadLine(); + + INFO_LOG(Log::HTTP, "Disposition: %s", disposition.c_str()); std::vector parts; SplitString(disposition, ';', parts); if (parts.size() < 2 || !startsWith(parts[0], "Content-Disposition: form-data")) { @@ -621,7 +615,7 @@ static MultiPartResult HandleMultipartPart(const http::ServerRequest &request, s } } - progress.SetFile(filename); + progress.SetFile(filename, 0); u64 bytesTransferred = 0; char buffer[net::InputSink::BUFFER_SIZE]; while (true) { @@ -631,6 +625,8 @@ static MultiPartResult HandleMultipartPart(const http::ServerRequest &request, s if (fwrite(buffer, 1, readBytes, fp) != readBytes) { ERROR_LOG(Log::HTTP, "Failed to write %d bytes to destination file '%s' - disk full?", (int)readBytes, destPath.ToVisualString().c_str()); fclose(fp); + // Delete the partially written file, so the user doesn't try to play it. + File::Delete(destPath); return MultiPartResult::RequestError; } } @@ -647,7 +643,8 @@ static MultiPartResult HandleMultipartPart(const http::ServerRequest &request, s fclose(fp); } - g_OSD.Show(OSDType::, StringFromFormat("Uploaded '%s' (%d bytes)", filename.c_str(), (int)bytesTransferred), 5.0f); + auto n = GetI18NCategory(I18NCat::NETWORKING); + g_OSD.Show(OSDType::MESSAGE_SUCCESS, ApplySafeSubstitutions(n->T("File transfer complete: %1"), filename)); // NOTE: We already read the boundary above. // However if this is the last part, the boundary will have "--\r\n" after it, otherwise there will be a line break. @@ -708,7 +705,7 @@ static void HandleUploadPost(const http::ServerRequest &request) { } const std::string boundary = contentType.substr(bpos + strlen("boundary=")); - // The total length of the entire multipart thing. + // The total length of the entire multipart thing. This is just above the full size of the upload, so let's use it for progress. u64 contentLength = request.Header().content_length; if (contentLength == 0) { WARN_LOG(Log::HTTP, "Bad content length"); @@ -717,7 +714,7 @@ static void HandleUploadPost(const http::ServerRequest &request) { const int sessionId = g_uploadSessionId.fetch_add(1); - ProgressTracker progress(sessionId); + ProgressTracker progress(sessionId, contentLength); while (true) { MultiPartResult result = HandleMultipartPart(request, boundary, uploadPath, progress); switch (result) { @@ -728,7 +725,6 @@ static void HandleUploadPost(const http::ServerRequest &request) { return; case MultiPartResult::LocalError: request.WriteHttpResponseHeader("1.0", 500, -1, "text/plain"); // Server error - // Disk full etc. return; case MultiPartResult::MoveToNext: // Else just continue to the next part. diff --git a/Core/WebServer.h b/Core/WebServer.h index 36e2bf4e3f..9fd1f4f807 100644 --- a/Core/WebServer.h +++ b/Core/WebServer.h @@ -44,12 +44,10 @@ void WebServerSetUploadPath(const Path &path); int WebServerPort(); struct UploadProgress { - s64 uploadedBytes = 0; s64 totalBytes = 0; - s64 uploadedFiles = 0; // we don't know the count ahead of time + s64 uploadedBytes = 0; s64 currentFileSize = 0; - s64 totalBytesBeforeCurrentFile = 0; - std::string currentFilename; + std::string filename; }; std::vector GetUploadsInProgress(); diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 6b0a5a8388..87da296dad 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -150,6 +150,7 @@ bool GameInfo::Delete() { case IdentifiedFileType::ARCHIVE_RAR: case IdentifiedFileType::ARCHIVE_ZIP: case IdentifiedFileType::ARCHIVE_7Z: + case IdentifiedFileType::UNKNOWN: case IdentifiedFileType::PPSSPP_GE_DUMP: { const Path &fileToRemove = filePath_; diff --git a/UI/UIAtlas.cpp b/UI/UIAtlas.cpp index 673a084939..9a57a20777 100644 --- a/UI/UIAtlas.cpp +++ b/UI/UIAtlas.cpp @@ -141,6 +141,8 @@ static const ImageMeta imageIDs[] = { {"I_FOLDER_UPLOAD", false}, {"I_FILE", false}, {"I_FILE_COPY", false}, + {"I_WEB_BROWSER", false}, + {"I_WIFI", false}, }; static std::string PNGNameFromID(std::string_view id) { diff --git a/UI/UploadScreen.cpp b/UI/UploadScreen.cpp index 3a04bcef49..bea69b4a0c 100644 --- a/UI/UploadScreen.cpp +++ b/UI/UploadScreen.cpp @@ -1,9 +1,52 @@ +#include #include "Common/Net/Resolve.h" #include "Common/System/Request.h" #include "Common/File/DiskFree.h" -#include "UI/UploadScreen.h" #include "Common/StringUtils.h" +#include "Common/Data/Text/Parsers.h" #include "Core/WebServer.h" +#include "UI/UploadScreen.h" + +// Compound view, showing a text with an icon. +class TextWithImage : public UI::LinearLayout { +public: + TextWithImage(ImageID imageID, std::string_view text, UI::LinearLayoutParams *layoutParams = nullptr); +}; + +TextWithImage::TextWithImage(ImageID imageID, std::string_view text, UI::LinearLayoutParams *layoutParams) : UI::LinearLayout(UI::ORIENT_HORIZONTAL, layoutParams) { + using namespace UI; + SetSpacing(8.0f); + if (!layoutParams) { + layoutParams_->width = FILL_PARENT; + layoutParams_->height = ITEM_HEIGHT; + } + if (imageID.isValid()) { + Add(new ImageView(imageID, "", UI::IS_DEFAULT, new LinearLayoutParams(0.0f, UI::Gravity::G_VCENTER))); + } + Add(new TextView(text, new LinearLayoutParams(1.0f, UI::Gravity::G_VCENTER))); +} + +// Compound view, showing a copyable string. +class CopyableText : public UI::LinearLayout { +public: + CopyableText(ImageID imageID, std::string_view text, UI::LinearLayoutParams *layoutParams = nullptr); +}; + +CopyableText::CopyableText(ImageID imageID, std::string_view text, UI::LinearLayoutParams *layoutParams) : UI::LinearLayout(UI::ORIENT_HORIZONTAL, layoutParams) { + using namespace UI; + SetSpacing(8.0f); + if (!layoutParams) { + layoutParams_->width = FILL_PARENT; + layoutParams_->height = ITEM_HEIGHT; + } + if (imageID.isValid()) { + Add(new ImageView(imageID, "", UI::IS_DEFAULT, new LinearLayoutParams(0.0f, UI::Gravity::G_VCENTER))); + } + Add(new TextView(text, new LinearLayoutParams(1.0f, UI::Gravity::G_VCENTER)))->SetBig(true); + Add(new Choice(ImageID("I_FILE_COPY"), new LinearLayoutParams()))->OnClick.Add([text](UI::EventParams &) { + System_CopyStringToClipboard(text); + }); +} UploadScreen::UploadScreen(const Path &targetFolder) : targetFolder_(targetFolder) { net::GetLocalIP4List(localIPs_); @@ -17,36 +60,47 @@ UploadScreen::~UploadScreen() { void UploadScreen::CreateViews() { using namespace UI; - auto co = GetI18NCategory(I18NCat::NETWORKING); + auto n = GetI18NCategory(I18NCat::NETWORKING); root_ = new LinearLayout(ORIENT_VERTICAL); - LinearLayout *topBar = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); - topBar->Add(new Choice(ImageID("I_NAVIGATE_BACK"), new LinearLayoutParams()))->OnClick.Handle(this, &UIScreen::OnBack); + LinearLayout *topBar = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); root_->Add(topBar); + topBar->Add(new Choice(ImageID("I_NAVIGATE_BACK"), new LinearLayoutParams()))->OnClick.Handle(this, &UIScreen::OnBack); + + LinearLayout *container = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(500, FILL_PARENT, 0.0f, UI::Gravity::G_HCENTER, Margins(10))); + root_->Add(container); + + container->Add(new TextWithImage(ImageID("I_FOLDER_UPLOAD"), targetFolder_.ToVisualString())); + container->Add(new Spacer(20.0f)); + if (prevRunning_) { - root_->Add(new TextView(co->T("On your other device, connect to the same network, then go to this URL:"))); + container->Add(new TextWithImage(ImageID("I_WIFI"), n->T("With a web browser on the same network, go to:"))); for (const auto &ip : localIPs_) { std::string url = StringFromFormat("http://%s:%d/upload", ip.c_str(), WebServerPort()); - root_->Add(new TextView(url)); - root_->Add(new Choice(ImageID("I_FILE_COPY")))->OnClick.Add([url](UI::EventParams &) { - System_CopyStringToClipboard(url); - }); + container->Add(new CopyableText(ImageID("I_WEB_BROWSER"), url)); } - } else { - root_->Add(new TextView(co->T("Connecting..."))); } - root_->Add(new TextView(std::string(co->T("Uploading to: ")) + targetFolder_.ToVisualString())); + statusContainer_ = new LinearLayout(ORIENT_VERTICAL); + container->Add(statusContainer_); +} +void UploadScreen::RecreateStatus() { + if (!statusContainer_) { + return; + } + + using namespace UI; + statusContainer_->Clear(); // Show information about current upload streams (there can be multiple, but normally it's just one // where files are uploaded sequentially). std::vector uploads = GetUploadsInProgress(); for (const auto &upload : uploads) { - std::string uploadText = StringFromFormat("%zu / %zu total bytes (%zu files). Current: %s", - upload.uploadedBytes, upload.totalBytes, upload.uploadedFiles, - upload.currentFilename.c_str()); - root_->Add(new TextView(uploadText)); + int percent = upload.totalBytes == 0 ? 0 : (int)(ceil(100.0 * (double)upload.uploadedBytes / (double)upload.totalBytes)); + std::string uploadText = StringFromFormat("%s: %s/%s (%d%%)", upload.filename.c_str(), + NiceSizeFormat(upload.uploadedBytes).c_str(), NiceSizeFormat(upload.totalBytes).c_str(), percent); + statusContainer_->Add(new TextWithImage(ImageID("I_FILE"), uploadText)); } } @@ -58,9 +112,9 @@ void UploadScreen::update() { RecreateViews(); } - // Update in-progress uploads approximately every half second. - if (lastUpdate_.ElapsedSeconds() > 0.5) { - RecreateViews(); + // Update in-progress uploads approximately every quarter of a second. + if (lastUpdate_.ElapsedSeconds() > 0.25) { + RecreateStatus(); lastUpdate_ = Instant::Now(); } } diff --git a/UI/UploadScreen.h b/UI/UploadScreen.h index 8e17d7cdaa..b5acafe555 100644 --- a/UI/UploadScreen.h +++ b/UI/UploadScreen.h @@ -43,8 +43,10 @@ protected: const char *tag() const override { return "Upload"; } private: + void RecreateStatus(); bool prevRunning_ = false; std::vector localIPs_; Path targetFolder_; Instant lastUpdate_; + UI::ViewGroup *statusContainer_ = nullptr; }; diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 502c3566f3..a61c80e46e 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -975,6 +975,7 @@ Error = فشل Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = اکتمال نقل الملف: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = اسم المستضيف @@ -1008,6 +1009,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = باستخدام متصفح ويب على نفس الشبكة، انتقل إلى: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 979e521c3b..77e56211e3 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Fail köçürməsi tamamlandı: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Eyni şəbəkədə veb brauzer ilə daxil olun: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index d95ed362b7..b35bed2e71 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -934,6 +934,7 @@ Error = Памылка Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Перадача файла завершана: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Імя хаста @@ -967,6 +968,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = Можа працаваць не на ўсіх прыладах або ў гульнях, глядзіце вікі. Validating address... = Праверка адраса... +With a web browser on the same network, go to: = З дапамогай вэб-браўзера ў той жа сетцы, перайдзіце па адрасе: WLAN Channel = Канал WLAN You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 94ecd8534d..411fc83378 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -967,6 +967,7 @@ Error = Грешка Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Пренос на файл завършен: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = С веб браузър в същата мрежа, отидете на: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 34c83fcd23..42d391b01f 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Transferència de fitxer completada: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Amb un navegador web a la mateixa xarxa, ves a: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 59b47a6773..43c15efac4 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Přenos souboru dokončen: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = S webovým prohlížečem ve stejné síti přejděte na: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 25ea6e4986..c03df4f9aa 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Filoverførsel færdig: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Med en webbrowser på det samme netværk, gå til: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index c2ef28e4b5..495ca54e00 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -957,6 +957,7 @@ Error = Fehler Failed to Bind Localhost IP = Localhost-IP konnte nicht gebunden werden Failed to Bind Port = Port konnte nicht gebunden werden Failed to connect to Adhoc Server = Verbindung zum Ad-hoc-Server fehlgeschlagen +File transfer completed: %1 = Dateiübertragung abgeschlossen: %1 Forced First Connect = Erzwungene erste Verbindung (Schneller Verbinden) GM: Data from Unknown Port = GM: Daten von unbekanntem Port Hostname = Hostname @@ -990,6 +991,7 @@ UPnP need to be reinitialized = UPnP muss neu initialisiert werden UPnP use original port = UPnP-Original-Port verwenden (aktiviert = PSP-Kompatibilität) UseOriginalPort Tip = Funktioniert möglicherweise nicht mit allen Geräten oder Spielen. Siehe Wiki. Validating address... = Adresse wird validiert... +With a web browser on the same network, go to: = Öffnen Sie mit einem Webbrowser im gleichen Netzwerk: WLAN Channel = WLAN-Kanal You're in Offline Mode, go to lobby or online hall = Du bist im Offline-Modus. Gehe in die Lobby oder Online-Halle. diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 00408e5741..ea82720019 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Transfer file selesai: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Dengan browser web di jaringan yang sama, pergi ke: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 76855bfde8..5b01601bf6 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -958,6 +958,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = File transfer completed: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -991,6 +992,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = With a web browser on the same network, go to: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 8e13be0f04..8f42aeae43 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -968,6 +968,7 @@ Error = Error Failed to Bind Localhost IP = Error al unirse a la IP localhost Failed to Bind Port = Error al vincular puerto Failed to connect to Adhoc Server = Error al conectar al servidor Ad-Hoc +File transfer completed: %1 = Transferencia de archivo completada: %1 Forced First Connect = Primera conexión forzada (más rápida) GM: Data from Unknown Port = GM: Datos de puerto desconocido Hostname = Nombre de host @@ -1001,6 +1002,7 @@ UPnP need to be reinitialized = Es necesario reiniciar UPnP UPnP use original port = UPnP usa puerto original (activado = compatibilidad PSP) UseOriginalPort Tip = Puede que no funcione con todos los dispositivos o juegos, consulta la wiki. Validating address... = Validando dirección... +With a web browser on the same network, go to: = Con un navegador web en la misma red, ve a: WLAN Channel = Canal WLAN You're in Offline Mode, go to lobby or online hall = Estás en modo offline, ve al lobby o a la sala online diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 4378e1e82e..b09a1f7b2f 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Fallo al unirse a la IP localhost Failed to Bind Port = Fallo al unir puerto Failed to connect to Adhoc Server = Fallo al conectar al servidor Adhoc +File transfer completed: %1 = Transferencia de archivo completada: %1 Forced First Connect = Primera conexión forzada (más rápida) GM: Data from Unknown Port = GM: Datos de puerto desconocido Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = La función de UPnP debe reinicializarse. UPnP use original port = Usar puerto UPnP de PSP (activado = más compatible con PSP ) UseOriginalPort Tip = Puede que no funcione para todos los dispositivos o juegos, consulte la wiki. Validating address... = Validando dirección ... +With a web browser on the same network, go to: = Con un navegador web en la misma red, dirígete a: WLAN Channel = Canal WLAN You're in Offline Mode, go to lobby or online hall = Estás en modo fuera de línea, ve al lobby o sala en línea diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index f051092e78..8fbe820a16 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -967,6 +967,7 @@ Error = خطا Failed to Bind Localhost IP = اتصال به IP localhost شکست خورد Failed to Bind Port = اتصال به درگاه شکست خورد Failed to connect to Adhoc Server = اتصال به سرور ادهاک شکست خورد +File transfer completed: %1 = انتقال فایل تمام شد: %1 Forced First Connect = اتصال اول اجباری (اتصال سریع تر) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = نام میزبان @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP باید بازراه‌اندازی شود UPnP use original port = استفاده از درگاه اصلی UPnP (فعال = سازگاری با PSP) UseOriginalPort Tip = ممکن است برای همه دستگاه ها یا بازی ها کار نکند، ویکی را ببینید. Validating address... = اعتبارسنجی نشانی... +With a web browser on the same network, go to: = با یک مرورگر وب در همان شبکه، به: WLAN Channel = کانال WLAN You're in Offline Mode, go to lobby or online hall = شما در حالت آفلاین هستید، به لابی یا سالن آنلاین بروید. diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index d969dfc00d..d6a83e07ad 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Tiedostonsiirto valmis: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Selaimessa, joka on samassa verkossa, siirry: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 3d41c91e2b..237519a3ba 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -967,6 +967,7 @@ Error = Erreur Failed to Bind Localhost IP = Échec de liaison de l'IP localhost Failed to Bind Port = Échec de liaison du port Failed to connect to Adhoc Server = Échec de connexion au serveur ad hoc +File transfer completed: %1 = Transfert de fichier terminé : %1 Forced First Connect = Première connexion forcée (connexion plus rapide) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP doit être réinitialisé UPnP use original port = Utiliser les ports originaux avec UPnP (activé = compatibilité PSP) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validation de l'adresse... +With a web browser on the same network, go to: = Avec un navigateur web sur le même réseau, allez à : WLAN Channel = Canal WLAN You're in Offline Mode, go to lobby or online hall = Vous êtes en mode hors ligne, allez dans le hall en ligne. diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index ea389a5e94..78da604080 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Transferencia de ficheiro completada: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Con un navegador web na mesma rede, vai a: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 8922198139..bed0ecc463 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Η μεταφορά αρχείου ολοκληρώθηκε: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Επικύρωση διεύθυνσης... +With a web browser on the same network, go to: = Με έναν περιηγητή ιστού στο ίδιο δίκτυο, πηγαίνετε σε: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index 3e9a068f90..80eb460aa8 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = העברת קובץ הושלמה: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = עם דפדפן אינטרנט באותה הרשת, עבור אל: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index d19a0bd496..77067679bc 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -964,6 +964,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = הושלמה העברת קובץ: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -997,6 +998,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = עם דפדפן אינטרנט באותה הרשת, עבור אל: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 5a647dbc87..6365cdc094 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Prenos datoteke završen: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Provjeravanje adrese... +With a web browser on the same network, go to: = S web preglednikom na istoj mreži, idite na: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = Trenutno si u "Offline",idi u lobby ili online hall diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index ae0e35d374..414fdf9341 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -967,6 +967,7 @@ Error = Hiba Failed to Bind Localhost IP = Nem sikerült a localhost IP kötése Failed to Bind Port = Nem sikerült a porthoz kötés Failed to connect to Adhoc Server = Nem sikerült csatlakozni az ad hoc szerverhez +File transfer completed: %1 = Fájlátvitel befejeződött: %1 Forced First Connect = Kényszerített első csatlakozás (gyorsabb csatlakozás) GM: Data from Unknown Port = GM: ismeretlen portról származó adat Hostname = Hostnév @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP újra-inicializálás szükséges UPnP use original port = UPnP eredeti portot használja (be = PSP kompatibilitás) UseOriginalPort Tip = Lehet, hogy nem működik az összes eszközön vagy játékhoz, lásd a wiki oldalt. Validating address... = Cím ellenőrzése... +With a web browser on the same network, go to: = Azonos hálózaton lévő webböngészővel, lépjen a következőre: WLAN Channel = WLAN csatorna You're in Offline Mode, go to lobby or online hall = Offline üzemmódban vagy, menj a lobbiba vagy az online terembe! diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 4667e4a6dc..67a6d48d38 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -967,6 +967,7 @@ Error = Kesalahan Failed to Bind Localhost IP = Gagal memuat IP host lokal Failed to Bind Port = Gagal memuat port Failed to connect to Adhoc Server = Gagal terhubung ke server Ad Hoc +File transfer completed: %1 = Transfer file selesai: %1 Forced First Connect = Sambungan pertama paksa (koneksi lebih cepat) GM: Data from Unknown Port = GM: Data dari port tidak dikenal Hostname = Nama Host @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP perlu diinisialisasi ulang UPnP use original port = UPnP menggunakan port asli (diaktifkan = kompatibilitas PSP) UseOriginalPort Tip = Mungkin tidak berfungsi untuk semua perangkat atau permainan, lihat wiki. Validating address... = Validasi alamat... +With a web browser on the same network, go to: = Dengan browser web di jaringan yang sama, buka: WLAN Channel = Saluran WLAN You're in Offline Mode, go to lobby or online hall = Anda dalam mode offline, pergi ke lobi atau aula online diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 74ca54009f..44fa97c751 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -935,6 +935,7 @@ Error = Errore Failed to Bind Localhost IP = Impossibile correlare l'IP localhost Failed to Bind Port = Impossibile correlare la porta Failed to connect to Adhoc Server = Impossibile connettersi al sever ad hoc +File transfer completed: %1 = Trasferimento file completato: %1 Forced First Connect = Prima connessione forzata (connessione più rapida) GM: Data from Unknown Port = GM: Dati da porta sconosciuta Hostname = Nome host @@ -968,6 +969,7 @@ UPnP need to be reinitialized = UPnP dev'essere reinizializzato UPnP use original port = Usa la porta originale di UPnP (attiva = compatibilità PSP) UseOriginalPort Tip = Potrebbe non funzionare per tutti i dispositivi o giochi, controlla la wiki. Validating address... = Convalida indirizzo... +With a web browser on the same network, go to: = Con un browser web sulla stessa rete, vai a: WLAN Channel = Canale WLAN You're in Offline Mode, go to lobby or online hall = Sei in modalità offline, vai alla lobby online. diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 3fc3a60578..1fbba2c237 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -934,6 +934,7 @@ Error = エラー Failed to Bind Localhost IP = ローカルホストIPのバインドに失敗しました Failed to Bind Port = ポートのバインドに失敗しました Failed to connect to Adhoc Server = アドホックサーバーに接続できませんでした +File transfer completed: %1 = ファイル転送が完了しました: %1 Forced First Connect = 強制初期接続 (より速い接続) GM: Data from Unknown Port = GM: 不明なポートからのデータ Hostname = ホストネーム @@ -967,6 +968,7 @@ UPnP need to be reinitialized = UPnPの再初期化が必要です UPnP use original port = UPnPでオリジナルのポートを使用する (有効 = PSP互換) UseOriginalPort Tip = デバイスやゲームによっては動作しない場合がありますので、wikiを参照してください。 Validating address... = アドレスを検証しています... +With a web browser on the same network, go to: = 同じネットワークのWebブラウザで、次のアドレスにアクセスしてください: WLAN Channel = WLANチャネル You're in Offline Mode, go to lobby or online hall = オフラインモードです。ロビーかホールに移動してください diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index ec077f004f..4064dabb58 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Transfer berkas rampung: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Kanthi browser web ing jaringan sing padha, bukak: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index a0ee5ef023..e1955cc777 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -934,6 +934,7 @@ Error = 오류 Failed to Bind Localhost IP = 로컬 호스트 IP를 바인딩하지 못했습니다. Failed to Bind Port = 포트를 바인딩하지 못했습니다. Failed to connect to Adhoc Server = Ad Hoc 서버에 연결하지 못했습니다. +File transfer completed: %1 = 파일 전송 완료: %1 Forced First Connect = 강제 첫 번째 연결 (빠른 연결) GM: Data from Unknown Port = GM: 알 수 없는 포트의 데이터 Hostname = 호스트 이름 @@ -967,6 +968,7 @@ UPnP need to be reinitialized = UPnP를 다시 초기화해야 합니다. UPnP use original port = UPnP는 원래 포트를 사용합니다 (활성화됨 = PSP 호환성) UseOriginalPort Tip = 일부 기기나 게임에서는 작동하지 않을 수 있으므로, 위키를 참조하세요. Validating address... = 주소 검증하는 중... +With a web browser on the same network, go to: = 같은 네트워크의 웹 브라우저에서 다음으로 이동하세요: WLAN Channel = 무선랜 채널 You're in Offline Mode, go to lobby or online hall = 오프라인 모드입니다. 로비 또는 온라인 홀으로 이동합니다. diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 8682aa56bb..e542822427 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -948,6 +948,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Guhertina pelî bi serketinî: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -981,6 +982,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Bi kevneşopê webê li ser heman torê, bibe: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 7ca1efabde..69843b4b71 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = ການໂອນເຟຊ໌ແລ້ວແລ້ວ: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = ກັບບຣາວເຊີບເວບເລັ່ງໃນເຄື່ອນເຊື່ອມໃນສຽງດຽວ, ເຂົ້າໄປທີ່: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index c2ed213fee..9f98475cf2 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Failo perkėlimas baigtas: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Naudodamiesi žiniatinklio naršykle toje pačioje tinkle, eikite į: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 38be643cb7..da0272ab79 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Pemindahan fail selesai: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Dengan pelayar web pada rangkaian yang sama, pergi ke: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 258b3d706c..8acd608053 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Bestandsoverdracht voltooid: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Ga met een webbrowser op hetzelfde netwerk naar: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 7262814ff1..49196ba2b9 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Filoverføring fullført: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Med en nettleser på samme nettverk, gå til: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index dd07e30aa0..d94aee36ff 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -962,6 +962,7 @@ Error = Błąd Failed to Bind Localhost IP = Błąd przy przypisywaniu adresu IP lokalnego hosta Failed to Bind Port = Błąd przy przypisywaniu portu Failed to connect to Adhoc Server = Błąd przy łączeniu z serwerem Ad-Hoc +File transfer completed: %1 = Transfer pliku zakończony: %1 Forced First Connect = Wymuszenie pierwszego połączenie (szybsze łączenie) #GM = Dane z nieznanego portu GM: Data from Unknown Port = GM: Dane z nieznanego portu @@ -996,6 +997,7 @@ UPnP need to be reinitialized = Należy ponownie zainicjować UPnP UPnP use original port = UPnP używa oryginalnego portu (włączone = kompatybilność z PSP) UseOriginalPort Tip = Może nie działać ze wszystkimi grami i/lub urządzeniami. Po więcej informacji udaj się na wiki. Validating address... = Uwierzytelnianie addresu... +With a web browser on the same network, go to: = Za pomocą przeglądarki internetowej w tej samej sieci, przejdź do: WLAN Channel = Kanał WLAN You're in Offline Mode, go to lobby or online hall = Jesteś w trybie offline; wejdź do lobby lub pokoju online diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 698ac2d80f..e972e62422 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -957,6 +957,7 @@ Error = Erro Failed to Bind Localhost IP = Falhou em associar com o IP do hospedeiro local Failed to Bind Port = Falhou em associar com a porta Failed to connect to Adhoc Server = Falhou em conectar ao servidor ad hoc +File transfer completed: %1 = Transferência de arquivo concluída: %1 Forced First Connect = Primeira conexão forçada (conexão mais rápida) GM: Data from Unknown Port = GM: Dados da Porta Desconhecida Hostname = Nome do hospedeiro @@ -990,6 +991,7 @@ UPnP need to be reinitialized = O UPnP precisa ser reinicializado UPnP use original port = O UPnP usa a porta original (ativado = compatibilidade com o PSP) UseOriginalPort Tip = Pode não funcionar com todos os dispositivos ou jogos, veja o wiki. Validating address... = Validando endereço... +With a web browser on the same network, go to: = Com um navegador web na mesma rede, vá para: WLAN Channel = Canal do WLAN You're in Offline Mode, go to lobby or online hall = Você está no modo offline, vá pro lobby ou pro salão online diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 5de2f3c604..4f29715dc3 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -959,6 +959,7 @@ Error = Erro Failed to Bind Localhost IP = Erro ao conectar ao IP do hospedeiro local Failed to Bind Port = Erro ao conectar a porta Failed to connect to Adhoc Server = Erro ao conectar ao servidor Adhoc +File transfer completed: %1 = Transferência de arquivo concluída: %1 Forced First Connect = Primeira conexão forçada (conexão mais rápida) GM: Data from Unknown Port = GM: Dados da Porta Desconhecida Hostname = Nome do Hospedeiro @@ -993,6 +994,7 @@ UPnP use original port = O UPnP usa a porta original (ativado = compatibilidade UseOriginalPort Tip = May not work for all devices or games, see wiki. UseOriginalPort Tip = Poderá não funcionar com todos os dispositivos/jogos, para mais informações, vê a wiki. Validating address... = A validar Endereço... +With a web browser on the same network, go to: = Com um navegador web na mesma rede, dirija-se a: WLAN Channel = Canal do WLAN You're in Offline Mode, go to lobby or online hall = Estás no modo Offline, vai para o lobby/salão Online diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index eb6e54a107..9fde751ec4 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -968,6 +968,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Transferul de fișiere s-a finalizat: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1001,6 +1002,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Cu un browser web pe aceeași rețea, accesați: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 1cf42b4d2c..d8078f91e1 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -934,6 +934,7 @@ Error = Ошибка Failed to Bind Localhost IP = Не удалось привязать адрес для localhost Failed to Bind Port = Не удалось привязать порт Failed to connect to Adhoc Server = Не удалось подключиться к ad-hoc серверу +File transfer completed: %1 = Передача файла завершена: %1 Forced First Connect = Принудительное первое подключение (быстрое подключение) GM: Data from Unknown Port = GM: Данные с неизвестного порта Hostname = Имя хоста @@ -967,6 +968,7 @@ UPnP need to be reinitialized = Необходимо перезапустить UPnP use original port = Использовать оригинальный порт UPnP (включено = совместимость с PSP) UseOriginalPort Tip = Может не работать для всех устройств или игр, смотрите wiki. Validating address... = Проверка адреса... +With a web browser on the same network, go to: = С веб-браузером в той же сети, перейдите по адресу: WLAN Channel = Канал WLAN You're in Offline Mode, go to lobby or online hall = Вы в автономном режиме, зайдите в лобби или в комнату в Интернете diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 00e661119f..4115076fd6 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -935,6 +935,7 @@ Error = Fel Failed to Bind Localhost IP = Misslyckades binda localhost-IP Failed to Bind Port = Misslyckades binda port Failed to connect to Adhoc Server = Misslyckades koppla upp till adhoc-servern +File transfer completed: %1 = Filöverföring slutförd: %1 Forced First Connect = Tvingad första uppkopplining (snabbare uppkoppling) GM: Data from Unknown Port = GM: Data från okänd port Hostname = Hostname @@ -968,6 +969,7 @@ UPnP need to be reinitialized = UPnP behöver ominitialiseras UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = Funkar eventuellt inte för alla enheter eller spel, se wiki. Validating address... = Bekräftar adress... +With a web browser on the same network, go to: = Med en webbläsare på samma nätverk, gå till: WLAN Channel = WLAN-kanal You're in Offline Mode, go to lobby or online hall = Du är i offline-läge, gå till lobbyn eller online-hallen diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 73f299c8c9..08e2fc4f20 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -968,6 +968,7 @@ Error = Error Failed to Bind Localhost IP = Nabigong i-bind ang localhost IP Failed to Bind Port = Nabigong i-bind ang port Failed to connect to Adhoc Server = Nabigong kumonekta sa ad hoc server +File transfer completed: %1 = Мубодилаи файл анҷомид: %1 Forced First Connect = Pinilit muna kumonekta (mabilis kumonekta) GM: Data from Unknown Port = GM: Data mula sa Hindi Kilalang Port Hostname = Pangalan ng host @@ -1001,6 +1002,7 @@ UPnP need to be reinitialized = Kailangang muling simulan ang UPnP UPnP use original port = Gamitin ang orihinal na port ng UPnP (enabled = PSP compatibility) UseOriginalPort Tip = Maaaring hindi gumana para sa lahat ng device o laro, tingnan ang wiki. Validating address... = Pinapatunayan ang address... +With a web browser on the same network, go to: = Бо браузери веб дар шабаκаи ҳамон, гузаред ба: WLAN Channel = Channel ng WLAN You're in Offline Mode, go to lobby or online hall = Nasa offline mode ka, pumunta sa lobby o online hall diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index b3419d66dc..d51524a129 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -986,6 +986,7 @@ Error = มีข้อผิดพลาด Failed to Bind Localhost IP = เชื่อมโยง Localhost IP ไม่สำเร็จ Failed to Bind Port = ล้มเหลวในการเชื่อมโยงพอร์ต Failed to connect to Adhoc Server = ล้มเหลวในการเชื่อมต่อกับเซิร์ฟเวอร์ Adhoc +File transfer completed: %1 = การถ่ายโอนไฟล์เสร็จสิ้น: %1 Forced First Connect = บังคับการเชื่อมต่อในครั้งแรกสุด GM: Data from Unknown Port = GM: ข้อมูลมาจากพอร์ตที่ไม่รู้จัก Hostname = ชื่อหัวห้อง @@ -1019,6 +1020,7 @@ UPnP need to be reinitialized = UPnP จำเป็นต้องเริ่ UPnP use original port = UPnP ใช้พอร์ตค่าเริ่มต้น (เปิดใช้งาน = เล่นกับเครื่อง PSP) UseOriginalPort Tip = อาจจะใช้ไม่ได้ในทุกอุปกรณ์หรือในบางเกม โปรดดูข้อมูลเพิ่มเติมที่ Wiki Validating address... = กำลังตรวจสอบที่อยู่... +With a web browser on the same network, go to: = ด้วยเว็บเบราว์เซอร์ในเครือข่ายเดียวกัน ไปที่: WLAN Channel = ช่องสัญญาณ WLAN You're in Offline Mode, go to lobby or online hall = คุณอยู่ในโหมดออฟไลน์ ต้องเข้าไปในล็อบบี้หรือออนไลน์ฮอลล์ก่อน diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index ffd103ed8d..b442e19ea0 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -969,6 +969,7 @@ Error = Hata Failed to Bind Localhost IP = Yerel ana makine IP'si bağlanamadı Failed to Bind Port = Port bağlanamadı Failed to connect to Adhoc Server = Adhoc sunucusuna bağlanılamadı +File transfer completed: %1 = Dosya aktarımı tamamlandı: %1 Forced First Connect = Zorunlu İlk Bağlantı GM: Data from Unknown Port = GM: Bilinmeyen Porttan Veri Hostname = Ana makine adı @@ -1002,6 +1003,7 @@ UPnP need to be reinitialized = UPnP yeniden başlatılmalı UPnP use original port = UPnP Orijinal Port Kullan UseOriginalPort Tip = Tüm cihazlar veya oyunlarda çalışmayabilir, wiki'ye bakın. Validating address... = Adres doğrulanıyor... +With a web browser on the same network, go to: = Aynı ağda bir web tarayıcısı ile şu adrese gidin: WLAN Channel = WLAN Kanalı You're in Offline Mode, go to lobby or online hall = Çevrimdışı moddasınız, lobiye veya çevrimiçi salona gidin diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index bdc16e8576..5634b3282b 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -967,6 +967,7 @@ Error = Помилка Failed to Bind Localhost IP = Не вдалося прив’язати локальний хост IP Failed to Bind Port = Не вдалося прив’язати порт Failed to connect to Adhoc Server = Не вдалося підключитися до ad hoc сервера +File transfer completed: %1 = Передача файлу завершена: %1 Forced First Connect = Примусове перше підключення (швидше підключення) GM: Data from Unknown Port = GM: Дані з невідомого порту Hostname = Ім'я хоста @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP необхідно повторно іні UPnP use original port = UPnP використовує оригінальний порт (увімкнуто = PSP сумісність) UseOriginalPort Tip = Може працювати не для всіх пристроїв чи ігор, подив. вікі. Validating address... = Підтвердження адреси... +With a web browser on the same network, go to: = За допомогою веб-браузера в тій же мережі перейдіть за адресою: WLAN Channel = WLAN канал You're in Offline Mode, go to lobby or online hall = Ви перебуваєте в офлайн-режимі, переходите у лоббі чи онлайн-режим diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index a21b769f8f..390c7971b8 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -967,6 +967,7 @@ Error = Error Failed to Bind Localhost IP = Failed to bind localhost IP Failed to Bind Port = Failed to bind port Failed to connect to Adhoc Server = Failed to connect to ad hoc server +File transfer completed: %1 = Chuyển file hoàn tất: %1 Forced First Connect = Forced first connect (faster connect) GM: Data from Unknown Port = GM: Data from Unknown Port Hostname = Hostname @@ -1000,6 +1001,7 @@ UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) UseOriginalPort Tip = May not work for all devices or games, see wiki. Validating address... = Validating address... +With a web browser on the same network, go to: = Với trình duyệt web trong cùng một mạng, hãy đi tới: WLAN Channel = WLAN channel You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 8ae75be2d7..96dafdb873 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -967,6 +967,7 @@ Error = 错误 Failed to Bind Localhost IP = 无法绑定本地主机IP Failed to Bind Port = 无法绑定端口 Failed to connect to Adhoc Server = 无法连接Adhoc服务器 +File transfer completed: %1 = 文件传输完成:%1 Forced First Connect = 快速初始化连接 (耗时更短) GM: Data from Unknown Port = GM:来自未知端口的数据 Hostname = 主机名 @@ -1001,6 +1002,7 @@ UPnP need to be reinitialized = UPnP 需要重新初始化 UPnP use original port = UPnP 使用原始端口 (启用=兼容PSP) UseOriginalPort Tip = 可能不适合某些游戏或设备,详见百科页面 Validating address... = 正在验证地址… +With a web browser on the same network, go to: = 在同一网络的Web浏览器中,访问: WLAN Channel = WLAN信道 You're in Offline Mode, go to lobby or online hall = 您现在处于离线模式,请进入房间或在线大厅 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 39a9c992cc..b89b500e55 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -934,6 +934,7 @@ Error = 錯誤 Failed to Bind Localhost IP = 無法繫結本機主機 IP Failed to Bind Port = 無法繫結連接埠 Failed to connect to Adhoc Server = 無法連線至臨機操作伺服器 +File transfer completed: %1 = 檔案傳輸完成:%1 Forced First Connect = 強制首次連線 (更快連線) GM: Data from Unknown Port = GM:來自不明連接埠的資料 Hostname = 主機名稱 @@ -967,6 +968,7 @@ UPnP need to be reinitialized = UPnP 需要重新初始化 UPnP use original port = UPnP 使用原始連接埠 (已啟用 = PSP 相容性) UseOriginalPort Tip = 可能不適用於所有裝置或遊戲,請參閱維基。 Validating address... = 正在驗證位址… +With a web browser on the same network, go to: = 在同一網絡的網頁瀏覽器上,前往: WLAN Channel = WLAN 頻道 You're in Offline Mode, go to lobby or online hall = 您目前處於離線模式,請前往大廳或線上大廳 diff --git a/assets/ui_images/images.svg b/assets/ui_images/images.svg index 1c0450333c..35e7a2d517 100644 --- a/assets/ui_images/images.svg +++ b/assets/ui_images/images.svg @@ -24,9 +24,9 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" - inkscape:zoom="8.0000002" - inkscape:cx="297.18749" - inkscape:cy="545.18749" + inkscape:zoom="2.0000001" + inkscape:cx="355.74999" + inkscape:cy="544.74999" inkscape:window-width="3379" inkscape:window-height="1941" inkscape:window-x="-9" @@ -3941,14 +3941,14 @@ id="I_FLAG_US" transform="matrix(8.4810893e-4,0,0,0.00107427,3.571875,87.312501)"> + + + + + + d="m 151.0159,123.87219 c -0.0724,0 -0.13541,0.0498 -0.15205,0.12023 l -0.13584,0.57634 c -0.22788,0.0528 -0.44164,0.14237 -0.63434,0.2626 l -0.5036,-0.3112 c -0.0616,-0.038 -0.14136,-0.0288 -0.1924,0.0221 l -0.26658,0.26659 c -0.0513,0.0513 -0.0606,0.13083 -0.0225,0.1924 l 0.31148,0.50388 c -0.12024,0.19282 -0.21006,0.40617 -0.26289,0.63405 l -0.57606,0.13614 c -0.0704,0.0167 -0.1205,0.0795 -0.1205,0.15175 v 0.37685 c 0,0.0725 0.05,0.13542 0.1205,0.15205 l 0.57606,0.13612 c 0.0528,0.22789 0.14266,0.44124 0.26289,0.63406 l -0.31148,0.50359 c -0.038,0.0616 -0.0286,0.14165 0.0225,0.19269 l 0.2663,0.26629 c 0.0513,0.0513 0.13101,0.0606 0.19268,0.0225 l 0.5036,-0.31119 c 0.19272,0.12024 0.40646,0.20977 0.63434,0.2626 l 0.13584,0.57635 c 0.0167,0.0705 0.0797,0.12022 0.15205,0.12022 h 0.37685 c 0.0722,0 0.13541,-0.0497 0.15205,-0.12022 l 0.13583,-0.57635 c 0.22778,-0.0528 0.4416,-0.14236 0.63434,-0.2626 l 0.5036,0.31119 c 0.0616,0.0381 0.14126,0.0287 0.1924,-0.0225 l 0.26658,-0.26629 c 0.0512,-0.0512 0.0606,-0.13082 0.0225,-0.1924 l -0.31148,-0.50388 c 0.12024,-0.19273 0.20977,-0.40626 0.26261,-0.63406 l 0.57634,-0.13612 c 0.0706,-0.0167 0.12022,-0.0797 0.12022,-0.15205 v -0.37656 c -1e-5,-0.0724 -0.0497,-0.13541 -0.12022,-0.15204 l -0.57634,-0.13585 c -0.0528,-0.22788 -0.14237,-0.44153 -0.26261,-0.63434 l 0.31148,-0.50388 c 0.0381,-0.0617 0.0288,-0.14116 -0.0225,-0.1924 l -0.26658,-0.2663 c -0.0512,-0.0512 -0.13074,-0.0606 -0.1924,-0.0225 l -0.5036,0.31119 c -0.19282,-0.12023 -0.40646,-0.20977 -0.63434,-0.2626 l -0.13583,-0.57635 c -0.0167,-0.0704 -0.0798,-0.12022 -0.15205,-0.12022 z m 0.18842,1.30078 c 0.79691,0 1.44259,0.64585 1.44259,1.4426 0,0.79672 -0.64568,1.44286 -1.44259,1.44286 -0.79664,0 -1.44259,-0.64614 -1.44259,-1.44286 0,-0.79674 0.64595,-1.4426 1.44259,-1.4426 z m 0,0.68264 c -0.41969,0 -0.75995,0.34019 -0.75995,0.75996 0,0.41976 0.34026,0.76022 0.75995,0.76022 0.41977,0 0.75994,-0.34045 0.75994,-0.76022 0,-0.41978 -0.34017,-0.75996 -0.75994,-0.75996 z" /> diff --git a/assets/upload/index.html b/assets/upload/index.html index febdd98621..b24ff6fb53 100644 --- a/assets/upload/index.html +++ b/assets/upload/index.html @@ -8,7 +8,7 @@

Upload files to {{ device_name }}

-

To folder:

{{ upload_path }}

+

Destination folder: {{ upload_path }}

+
+
+ 📁 Drop files here or use the buttons above +
+
+
+ +
@@ -144,11 +180,37 @@ const uploadBtn = document.getElementById("uploadBtn"); const resetBtn = document.getElementById("resetBtn"); const fileListDiv = document.getElementById("fileList"); + const uploadedSection = document.getElementById("uploadedSection"); + const uploadedListDiv = document.getElementById("uploadedList"); + const dropZone = document.getElementById("dropZone"); const progressBar = document.getElementById("progressBar"); const statusDiv = document.getElementById("status"); const errorDiv = document.getElementById("error"); let files = []; + let uploadedFiles = []; + let droppedFiles = []; + + // Feature detection for drag and drop support + function isDragDropSupported() { + // Check for basic drag and drop API support + const div = document.createElement('div'); + const hasBasicSupport = ('draggable' in div) && ('ondrop' in div); + + // Check if it's a mobile device (where drag/drop from file system is limited) + const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + + // Check if it's a touch-only device + const isTouchOnly = ('ontouchstart' in window) && !window.matchMedia('(pointer: fine)').matches; + + return hasBasicSupport && !isMobile && !isTouchOnly; + } + + // Show drop zone only if drag and drop is supported + if (isDragDropSupported()) { + dropZone.style.display = 'block'; + } + function formatBytes(bytes, decimals = 2) { if (bytes === 0) return '0 B'; const k = 1024; @@ -157,8 +219,28 @@ const size = parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)); return `${size} ${units[i]}`; } + + function updateUploadedList() { + uploadedListDiv.innerHTML = ""; + if (uploadedFiles.length > 0) { + uploadedSection.style.display = "block"; + const list = document.createElement("ul"); + uploadedFiles.forEach(f => { + const li = document.createElement("li"); + const formattedBytes = formatBytes(f.size, 2); + const name = f.webkitRelativePath || f.name; + li.textContent = `${name} (${formattedBytes}) - ✓ Uploaded`; + li.style.color = "#2d7a2d"; + list.appendChild(li); + }); + uploadedListDiv.appendChild(list); + } else { + uploadedSection.style.display = "none"; + } + } + function updateFileList() { - files = [...fileInput.files, ...folderInput.files]; + files = [...fileInput.files, ...folderInput.files, ...droppedFiles]; fileListDiv.innerHTML = ""; if (files.length > 0) { uploadBtn.disabled = false; @@ -181,13 +263,62 @@ fileInput.addEventListener("change", updateFileList); folderInput.addEventListener("change", updateFileList); + // Drag and drop functionality + dropZone.addEventListener("dragover", (e) => { + e.preventDefault(); + dropZone.classList.add("drag-over"); + }); + + dropZone.addEventListener("dragleave", (e) => { + e.preventDefault(); + dropZone.classList.remove("drag-over"); + }); + + dropZone.addEventListener("drop", (e) => { + e.preventDefault(); + dropZone.classList.remove("drag-over"); + + const dt = e.dataTransfer; + const allFiles = Array.from(dt.files); + + // Filter out zero-byte entries (usually folders or invalid entries) + const validFiles = allFiles.filter(file => file.size > 0); + + // Show a message if some files were filtered out + if (allFiles.length > validFiles.length) { + const filteredCount = allFiles.length - validFiles.length; + statusDiv.textContent = `Note: ${filteredCount} folder(s) or empty file(s) were skipped. Only files can be drag/dropped.`; + setTimeout(() => { + if (statusDiv.textContent.includes("folder(s) or empty file(s) were skipped")) { + statusDiv.textContent = ""; + } + }, 8000); + } + + // Add valid dropped files to the existing array + droppedFiles = [...droppedFiles, ...validFiles]; + updateFileList(); + }); + + // Also handle drag/drop on the entire document to prevent browser default behavior + document.addEventListener("dragover", (e) => { + e.preventDefault(); + }); + + document.addEventListener("drop", (e) => { + e.preventDefault(); + }); + resetBtn.addEventListener("click", () => { // Clear the file inputs fileInput.value = ""; folderInput.value = ""; - // Clear the files array and update the display + // Clear all arrays and update displays files = []; + droppedFiles = []; + uploadedFiles = []; updateFileList(); + updateUploadedList(); }); uploadBtn.addEventListener("click", async () => { @@ -199,13 +330,27 @@ progressBar.style.display = "block"; progressBar.value = 0; - for (let i = 0; i < files.length; i++) { - const file = files[i]; - statusDiv.textContent = `Uploading ${file.webkitRelativePath || file.name} (${i + 1}/${files.length})`; + const filesToUpload = [...files]; // Create a copy to iterate over + + // Clear all file sources so files disappear from pending list as they upload + fileInput.value = ""; + folderInput.value = ""; + droppedFiles = []; + files = []; + + for (let i = 0; i < filesToUpload.length; i++) { + const file = filesToUpload[i]; + statusDiv.textContent = `Uploading ${file.webkitRelativePath || file.name} (${i + 1}/${filesToUpload.length})`; try { await uploadFile(file); + // Move successfully uploaded file to uploaded list + uploadedFiles.push(file); + updateUploadedList(); } catch (err) { + // If upload fails, add remaining files back to pending list + files = filesToUpload.slice(i); + updateFileList(); errorDiv.textContent = err.message; progressBar.style.display = "none"; uploadBtn.disabled = false; @@ -213,9 +358,11 @@ } } + // Update the pending files list (should be empty now) + updateFileList(); statusDiv.textContent = "All files uploaded successfully."; progressBar.style.display = "none"; - uploadBtn.disabled = false; + // Note: uploadBtn state is managed by updateFileList() - disabled when no files }); function uploadFile(file) { @@ -226,6 +373,7 @@ // Add custom metadata headers if needed: xhr.setRequestHeader("X-Client-Version", "1.0"); xhr.setRequestHeader("X-Upload-Timestamp", new Date().toISOString()); + xhr.setRequestHeader("X-File-Size", file.size.toString()); xhr.upload.onprogress = e => { if (e.lengthComputable) { @@ -252,7 +400,6 @@ // Try to preserve any directory structure, if supported. const formData = new FormData(); formData.append("file", file, file.webkitRelativePath || file.name); - formData.append("fileSize", file.size.toString()); xhr.send(formData); }); }