More upload UI polish

This commit is contained in:
Henrik Rydgård
2025-10-27 11:41:08 +01:00
parent 068f055a36
commit b1d14d8221
55 changed files with 400 additions and 80 deletions
+1 -1
View File
@@ -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;
+10 -11
View File
@@ -3,6 +3,8 @@
#include <cstdint>
#include <cstring>
#include <string_view>
#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;
};
+21 -25
View File
@@ -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<std::mutex> 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(
"<html><head><title>PPSSPP Remote ISO Upload</title></head><body>"
"<h1>Upload ISO File</h1>"
"<form method=\"POST\" enctype=\"multipart/form-data\">"
"<input type=\"file\" name=\"isofile\" accept=\".iso,.cso,.pbp,.chd\" required>"
"<input type=\"submit\" value=\"Upload\">"
"</form>"
"</body></html>");
}
class ProgressTracker {
public:
ProgressTracker(int sessionId) : sessionId_(sessionId) {
ProgressTracker(int sessionId, s64 totalSize) : sessionId_(sessionId) {
std::lock_guard<std::mutex> guard(g_webServerLock);
g_uploadsInProgress[sessionId_] = UploadProgress();
g_uploadsInProgress[sessionId_] = UploadProgress{totalSize};
}
~ProgressTracker() {
std::lock_guard<std::mutex> guard(g_webServerLock);
@@ -531,10 +524,9 @@ public:
void SetFile(std::string_view filename, size_t size) {
std::lock_guard<std::mutex> 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<std::mutex> 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<std::string_view> 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.
+2 -4
View File
@@ -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<UploadProgress> GetUploadsInProgress();
+1
View File
@@ -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_;
+2
View File
@@ -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) {
+73 -19
View File
@@ -1,9 +1,52 @@
#include <cmath>
#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<UIScreen>(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<UIScreen>(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<UploadProgress> 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();
}
}
+2
View File
@@ -43,8 +43,10 @@ protected:
const char *tag() const override { return "Upload"; }
private:
void RecreateStatus();
bool prevRunning_ = false;
std::vector<std::string> localIPs_;
Path targetFolder_;
Instant lastUpdate_;
UI::ViewGroup *statusContainer_ = nullptr;
};
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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.
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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 = شما در حالت آفلاین هستید، به لابی یا سالن آنلاین بروید.
+2
View File
@@ -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
+2
View File
@@ -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.
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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!
+2
View File
@@ -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
+2
View File
@@ -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.
+2
View File
@@ -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 = オフラインモードです。ロビーかホールに移動してください
+2
View File
@@ -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
+2
View File
@@ -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 = 오프라인 모드입니다. 로비 또는 온라인 홀으로 이동합니다.
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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 = Вы в автономном режиме, зайдите в лобби или в комнату в Интернете
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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 = คุณอยู่ในโหมดออฟไลน์ ต้องเข้าไปในล็อบบี้หรือออนไลน์ฮอลล์ก่อน
+2
View File
@@ -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
+2
View File
@@ -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 = Ви перебуваєте в офлайн-режимі, переходите у лоббі чи онлайн-режим
+2
View File
@@ -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
+2
View File
@@ -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 = 您现在处于离线模式,请进入房间或在线大厅
+2
View File
@@ -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 = 您目前處於離線模式,請前往大廳或線上大廳
+38 -7
View File
@@ -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)"><path
d="M 0,0 H 7410 V 3900 H 0"
fill="#b31942"
fill="#bf0a30"
id="path43" /><path
d="m 0,450 h 7410 m 0,600 H 0 m 0,600 h 7410 m 0,600 H 0 m 0,600 h 7410 m 0,600 H 0"
stroke="#ffffff"
stroke-width="300"
id="path44" /><path
d="M 0,0 H 2964 V 2100 H 0"
fill="#0a3161"
fill="#002868"
id="path45" /><g
fill="#ffffff"
id="g95"><path
@@ -4207,7 +4207,34 @@
d="m 81.915403,142.76852 v 10.86136 h 8.347293 v -7.85741 l -2.925402,-3.00395 z m 0.740007,0.74208 h 4.109309 v 2.89284 h 2.757971 v 6.48643 h -6.86728 z m 4.849832,0.49299 1.615922,1.65778 h -1.615922 z m -3.549137,3.50521 -0.0036,0.74208 4.325834,0.0238 0.0041,-0.74259 z m 0,1.63659 -0.0036,0.7426 4.325834,0.0232 0.0041,-0.74207 z m 0,1.70739 -0.0057,0.74208 3.087666,0.0232 0.0062,-0.74207 z" /><path
id="I_FILE_COPY"
style="color:#000000;fill:#ffffff;stroke-width:0.898414;stroke-miterlimit:4.8;-inkscape-stroke:none"
d="M 96.308838 142.38664 L 96.308838 144.03563 L 94.392159 144.03563 L 94.392159 153.79369 L 101.89144 153.79369 L 101.89144 152.1447 L 103.80812 152.1447 L 103.80812 145.08518 L 101.17986 142.38664 L 96.308838 142.38664 z M 96.973914 143.05327 L 100.66568 143.05327 L 100.66568 145.65207 L 103.14356 145.65207 L 103.14356 151.47962 L 96.973914 151.47962 L 96.973914 143.05327 z M 101.33075 143.49613 L 102.78286 144.98545 L 101.33075 144.98545 L 101.33075 143.49613 z M 95.057235 144.70226 L 96.308838 144.70226 L 96.308838 152.1447 L 101.22688 152.1447 L 101.22688 153.12862 L 95.057235 153.12862 L 95.057235 144.70226 z M 98.142318 146.64529 L 98.1387 147.31192 L 102.02528 147.33311 L 102.02942 146.66596 L 98.142318 146.64529 z M 98.142318 148.11549 L 98.1387 148.78263 L 102.02528 148.80382 L 102.02942 148.13719 L 98.142318 148.11549 z M 98.142318 149.64976 L 98.13715 150.31639 L 100.91114 150.33706 L 100.91579 149.67043 L 98.142318 149.64976 z " /></g><path
d="M 96.308838 142.38664 L 96.308838 144.03563 L 94.392159 144.03563 L 94.392159 153.79369 L 101.89144 153.79369 L 101.89144 152.1447 L 103.80812 152.1447 L 103.80812 145.08518 L 101.17986 142.38664 L 96.308838 142.38664 z M 96.973914 143.05327 L 100.66568 143.05327 L 100.66568 145.65207 L 103.14356 145.65207 L 103.14356 151.47962 L 96.973914 151.47962 L 96.973914 143.05327 z M 101.33075 143.49613 L 102.78286 144.98545 L 101.33075 144.98545 L 101.33075 143.49613 z M 95.057235 144.70226 L 96.308838 144.70226 L 96.308838 152.1447 L 101.22688 152.1447 L 101.22688 153.12862 L 95.057235 153.12862 L 95.057235 144.70226 z M 98.142318 146.64529 L 98.1387 147.31192 L 102.02528 147.33311 L 102.02942 146.66596 L 98.142318 146.64529 z M 98.142318 148.11549 L 98.1387 148.78263 L 102.02528 148.80382 L 102.02942 148.13719 L 98.142318 148.11549 z M 98.142318 149.64976 L 98.13715 150.31639 L 100.91114 150.33706 L 100.91579 149.67043 L 98.142318 149.64976 z " /><g
id="I_WEB_BROWSER"
transform="matrix(0.02185176,0,0,0.02185176,130.36271,116.47656)"
style="fill:#ffffff;fill-opacity:1">
<path
class="st0"
d="M 464,32 H 48 C 21.492,32 0,53.492 0,80 v 352 c 0,26.508 21.492,48 48,48 h 416 c 26.508,0 48,-21.492 48,-48 V 80 C 512,53.492 490.508,32 464,32 Z m -19.336,35 c 10.492,0 19,8.508 19,19 0,10.492 -8.508,19 -19,19 -10.492,0 -19,-8.508 -19,-19 0,-10.492 8.508,-19 19,-19 z m -70.5,0 c 10.492,0 19,8.508 19,19 0,10.492 -8.508,19 -19,19 -10.492,0 -19,-8.508 -19,-19 0,-10.492 8.508,-19 19,-19 z m -70.5,0 c 10.492,0 19,8.508 19,19 0,10.492 -8.508,19 -19,19 -10.492,0 -19,-8.508 -19,-19 0,-10.492 8.508,-19 19,-19 z M 472,432 c 0,4.406 -3.586,8 -8,8 H 48 c -4.414,0 -8,-3.594 -8,-8 V 136 h 432 z"
id="path1-6"
style="fill:#ffffff;fill-opacity:1" />
<path
class="st0"
d="m 97.477,326.656 h 16.031 c 0.977,0 1.625,-0.633 1.93,-1.562 l 13.774,-44 h 0.336 l 13.43,44 c 0.328,0.93 0.984,1.562 1.945,1.562 h 16.188 c 0.984,0 1.633,-0.633 1.938,-1.562 l 25.117,-72.656 c 0.313,-0.93 -0.187,-1.562 -1.305,-1.562 h -19.913 c -1.149,0 -1.79,0.484 -2.102,1.562 l -12.313,45.094 h -0.312 l -13.766,-45.094 c -0.336,-1.078 -0.977,-1.562 -2.11,-1.562 h -13.602 c -1.14,0 -1.954,0.484 -2.258,1.562 l -13.454,45.094 h -0.328 L 93.757,252.438 c -0.328,-1.078 -0.953,-1.562 -2.266,-1.562 H 71.586 c -0.992,0 -1.454,0.633 -1.157,1.562 l 25.118,72.656 c 0.32,0.929 0.969,1.562 1.93,1.562 z"
id="path2-1"
style="fill:#ffffff;fill-opacity:1" />
<path
class="st0"
d="m 224.078,326.656 h 16.054 c 0.961,0 1.618,-0.633 1.93,-1.562 l 13.766,-44 h 0.328 l 13.43,44 c 0.336,0.93 0.984,1.562 1.953,1.562 h 16.18 c 0.984,0 1.625,-0.633 1.953,-1.562 l 25.102,-72.656 c 0.313,-0.93 -0.172,-1.562 -1.297,-1.562 H 293.57 c -1.156,0 -1.805,0.484 -2.117,1.562 l -12.313,45.094 h -0.32 l -13.758,-45.094 c -0.336,-1.078 -0.976,-1.562 -2.102,-1.562 h -13.609 c -1.133,0 -1.946,0.484 -2.258,1.562 l -13.445,45.094 h -0.321 l -12.961,-45.094 c -0.313,-1.078 -0.969,-1.562 -2.258,-1.562 h -19.914 c -0.992,0 -1.469,0.633 -1.133,1.562 l 25.094,72.656 c 0.322,0.929 0.97,1.562 1.923,1.562 z"
id="path3-9"
style="fill:#ffffff;fill-opacity:1" />
<path
class="st0"
d="m 350.875,326.656 h 16.047 c 0.953,0 1.601,-0.633 1.922,-1.562 l 13.766,-44 h 0.336 l 13.429,44 c 0.328,0.93 0.969,1.562 1.938,1.562 h 16.195 c 0.977,0 1.625,-0.633 1.946,-1.562 l 25.117,-72.656 c 0.297,-0.93 -0.187,-1.562 -1.296,-1.562 h -19.938 c -1.133,0 -1.782,0.484 -2.094,1.562 l -12.304,45.094 h -0.32 l -13.766,-45.094 c -0.336,-1.078 -0.977,-1.562 -2.102,-1.562 h -13.618 c -1.133,0 -1.938,0.484 -2.25,1.562 l -13.462,45.094 h -0.304 l -12.954,-45.094 c -0.336,-1.078 -0.961,-1.562 -2.266,-1.562 h -19.922 c -0.969,0 -1.454,0.633 -1.141,1.562 l 25.118,72.656 c 0.306,0.929 0.954,1.562 1.923,1.562 z"
id="path4-9"
style="fill:#ffffff;fill-opacity:1" />
</g><path
id="I_WIFI"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.457348"
d="m 91.031704,67.566834 c -1.65526,0 -3.310304,0.625455 -4.57316,1.875848 l 0.65303,0.646386 c 2.161668,-2.139935 5.679067,-2.139935 7.840261,0 l 0.65342,-0.646386 c -1.263086,-1.250393 -2.918291,-1.875848 -4.573551,-1.875848 z m 0,1.829734 c -1.182354,0 -2.364671,0.446301 -3.26671,1.339277 l 0.653029,0.646777 c 1.44142,-1.42647 3.786403,-1.42647 5.227363,0 l 0.653029,-0.646777 c -0.90204,-0.892976 -2.084357,-1.339277 -3.266711,-1.339277 z m 3.91e-4,1.829341 c -0.709389,0 -1.419034,0.267868 -1.96026,0.803879 l 0.653419,0.646777 c 0.72025,-0.713465 1.892588,-0.713465 2.613291,0 l 0.65342,-0.646777 c -0.541222,-0.536011 -1.250481,-0.803879 -1.95987,-0.803879 z m -3.91e-4,1.829344 c -0.236424,0 -0.47301,0.08949 -0.65342,0.268089 l 0.65342,0.646386 0.653421,-0.646386 c -0.180407,-0.178595 -0.416996,-0.268089 -0.653421,-0.268089 z" /></g><path
id="I_GEAR"
style="fill:#ececec;fill-opacity:1;stroke-width:0.019487"
class="st0"
@@ -4215,4 +4242,8 @@
id="I_GEAR_SMALL"
style="fill:#ececec;fill-opacity:1;stroke-width:0.010717"
class="st0"
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" /></svg>
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" /><style
type="text/css"
id="style1">
.st0{fill:#000000;}
</style></svg>

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 208 KiB

+160 -13
View File
@@ -8,7 +8,7 @@
<style>
body {
font-family: system-ui, sans-serif;
background: #f5f7fa;
background: #e7f1ff;
color: #333;
padding: 2em;
max-width: 600px;
@@ -95,10 +95,6 @@
margin-top: 0.5em;
}
pre.inline {
display: inline;
}
.btn input[type="file"] {
display: none; /* hide the native control */
}
@@ -106,12 +102,41 @@
#resetBtn {
display: none; /* initially hidden */
}
.drag-over {
border: 2px dashed #4a90e2;
background-color: #f0f8ff;
}
.drop-zone {
border: 2px dashed #ccc;
border-radius: 10px;
padding: 40px 20px;
text-align: center;
margin: 1em 0;
background-color: #fafafa;
transition: all 0.3s ease;
display: none; /* initially hidden, shown only on supported platforms */
}
.drop-zone-text {
color: #666;
font-size: 1.1em;
margin: 0.5em 0;
}
.fixed-width {
font-family: monospace;
background: #eee;
padding: 2px 4px;
border-radius: 4px;
}
</style>
</head>
<body>
<h1>Upload files to {{ device_name }}</h1>
<p>To folder: <pre class="inline">{{ upload_path }}</pre></p>
<p>Destination folder: <span class="fixed-width">{{ upload_path }}</span></p>
<div class="section">
<label class="btn">
@@ -127,8 +152,19 @@
</button>
</div>
<div id="dropZone" class="drop-zone">
<div class="drop-zone-text">
📁 Drop files here or use the buttons above
</div>
</div>
<div id="fileList"></div>
<div id="uploadedSection" style="display: none;">
<h3>Uploaded Files:</h3>
<div id="uploadedList"></div>
</div>
<div class="section">
<button id="uploadBtn" disabled>Start upload!</button>
</div>
@@ -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);
});
}