From a4c3d4838961b774f5844804304a276b9728d2a7 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Fri, 24 Jun 2011 18:45:39 +0200 Subject: [PATCH 01/26] server shutdown function --- cockatrice/src/abstractclient.cpp | 19 +-- cockatrice/src/abstractclient.h | 2 + cockatrice/src/localserverinterface.h | 3 +- cockatrice/src/tab_admin.cpp | 71 ++++++++- cockatrice/src/tab_admin.h | 20 ++- cockatrice/src/tab_supervisor.cpp | 4 +- cockatrice/src/window_main.cpp | 8 + cockatrice/src/window_main.h | 1 + cockatrice/translations/cockatrice_cs.ts | 156 +++++++++++++------ cockatrice/translations/cockatrice_de.ts | 163 ++++++++++++++------ cockatrice/translations/cockatrice_en.ts | 155 +++++++++++++------ cockatrice/translations/cockatrice_es.ts | 155 +++++++++++++------ cockatrice/translations/cockatrice_fr.ts | 155 +++++++++++++------ cockatrice/translations/cockatrice_ja.ts | 154 ++++++++++++------ cockatrice/translations/cockatrice_pl.ts | 156 +++++++++++++------ cockatrice/translations/cockatrice_pt-br.ts | 155 +++++++++++++------ cockatrice/translations/cockatrice_pt.ts | 155 +++++++++++++------ cockatrice/translations/cockatrice_ru.ts | 156 +++++++++++++------ cockatrice/translations/cockatrice_sk.ts | 156 +++++++++++++------ common/protocol.h | 9 ++ common/protocol_item_ids.h | 32 ++-- common/protocol_items.cpp | 16 +- common/protocol_items.dat | 4 +- common/protocol_items.h | 20 ++- common/protocol_mc.pl | 7 + common/server.cpp | 1 + common/server_protocolhandler.cpp | 13 +- common/server_protocolhandler.h | 3 +- servatrice/src/main.cpp | 4 + servatrice/src/servatrice.cpp | 39 ++++- servatrice/src/servatrice.h | 6 + servatrice/src/serversocketinterface.cpp | 13 +- servatrice/src/serversocketinterface.h | 3 +- 33 files changed, 1410 insertions(+), 604 deletions(-) diff --git a/cockatrice/src/abstractclient.cpp b/cockatrice/src/abstractclient.cpp index 5fb9b433..7edb7a2e 100644 --- a/cockatrice/src/abstractclient.cpp +++ b/cockatrice/src/abstractclient.cpp @@ -32,15 +32,16 @@ void AbstractClient::processProtocolItem(ProtocolItem *item) GenericEvent *genericEvent = qobject_cast(item); if (genericEvent) { switch (genericEvent->getItemId()) { - case ItemId_Event_ConnectionClosed: emit connectionClosedEventReceived(qobject_cast(item)); break; - case ItemId_Event_AddToList: emit addToListEventReceived(qobject_cast(item)); break; - case ItemId_Event_RemoveFromList: emit removeFromListEventReceived(qobject_cast(item)); break; - case ItemId_Event_UserJoined: emit userJoinedEventReceived(qobject_cast(item)); break; - case ItemId_Event_UserLeft: emit userLeftEventReceived(qobject_cast(item)); break; - case ItemId_Event_ServerMessage: emit serverMessageEventReceived(qobject_cast(item)); break; - case ItemId_Event_ListRooms: emit listRoomsEventReceived(qobject_cast(item)); break; - case ItemId_Event_GameJoined: emit gameJoinedEventReceived(qobject_cast(item)); break; - case ItemId_Event_Message: emit messageEventReceived(qobject_cast(item)); break; + case ItemId_Event_ConnectionClosed: emit connectionClosedEventReceived(static_cast(item)); break; + case ItemId_Event_ServerShutdown: emit serverShutdownEventReceived(static_cast(item)); break; + case ItemId_Event_AddToList: emit addToListEventReceived(static_cast(item)); break; + case ItemId_Event_RemoveFromList: emit removeFromListEventReceived(static_cast(item)); break; + case ItemId_Event_UserJoined: emit userJoinedEventReceived(static_cast(item)); break; + case ItemId_Event_UserLeft: emit userLeftEventReceived(static_cast(item)); break; + case ItemId_Event_ServerMessage: emit serverMessageEventReceived(static_cast(item)); break; + case ItemId_Event_ListRooms: emit listRoomsEventReceived(static_cast(item)); break; + case ItemId_Event_GameJoined: emit gameJoinedEventReceived(static_cast(item)); break; + case ItemId_Event_Message: emit messageEventReceived(static_cast(item)); break; } if (genericEvent->getReceiverMayDelete()) delete genericEvent; diff --git a/cockatrice/src/abstractclient.h b/cockatrice/src/abstractclient.h index f43131b5..d896a89d 100644 --- a/cockatrice/src/abstractclient.h +++ b/cockatrice/src/abstractclient.h @@ -21,6 +21,7 @@ class Event_ListRooms; class Event_GameJoined; class Event_Message; class Event_ConnectionClosed; +class Event_ServerShutdown; enum ClientStatus { StatusDisconnected, @@ -43,6 +44,7 @@ signals: void gameEventContainerReceived(GameEventContainer *event); // Generic events void connectionClosedEventReceived(Event_ConnectionClosed *event); + void serverShutdownEventReceived(Event_ServerShutdown *event); void addToListEventReceived(Event_AddToList *event); void removeFromListEventReceived(Event_RemoveFromList *event); void userJoinedEventReceived(Event_UserJoined *event); diff --git a/cockatrice/src/localserverinterface.h b/cockatrice/src/localserverinterface.h index fc23b1b5..26194147 100644 --- a/cockatrice/src/localserverinterface.h +++ b/cockatrice/src/localserverinterface.h @@ -18,8 +18,9 @@ private: ResponseCode cmdDeckDel(Command_DeckDel * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdDeckUpload(Command_DeckUpload * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdDeckDownload(Command_DeckDownload * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } - ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdBanFromServer(Command_BanFromServer * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } + ResponseCode cmdShutdownServer(Command_ShutdownServer * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } + ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } public: LocalServerInterface(LocalServer *_server); ~LocalServerInterface(); diff --git a/cockatrice/src/tab_admin.cpp b/cockatrice/src/tab_admin.cpp index 4ea3a652..08232138 100644 --- a/cockatrice/src/tab_admin.cpp +++ b/cockatrice/src/tab_admin.cpp @@ -1,19 +1,72 @@ +#include #include +#include #include #include #include +#include +#include +#include #include "tab_admin.h" #include "abstractclient.h" #include "protocol_items.h" -TabAdmin::TabAdmin(TabSupervisor *_tabSupervisor, AbstractClient *_client, QWidget *parent) - : Tab(_tabSupervisor, parent), locked(true), client(_client) +ShutdownDialog::ShutdownDialog(QWidget *parent) + : QDialog(parent) +{ + QLabel *reasonLabel = new QLabel(tr("&Reason for shutdown:")); + reasonEdit = new QLineEdit; + reasonLabel->setBuddy(reasonEdit); + QLabel *minutesLabel = new QLabel(tr("&Time until shutdown (minutes):")); + minutesEdit = new QSpinBox; + minutesLabel->setBuddy(minutesEdit); + minutesEdit->setMinimum(0); + minutesEdit->setValue(5); + + QPushButton *okButton = new QPushButton(tr("&OK")); + okButton->setAutoDefault(true); + okButton->setDefault(true); + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); + QPushButton *cancelButton = new QPushButton(tr("&Cancel")); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(okButton); + buttonLayout->addWidget(cancelButton); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(reasonLabel, 0, 0); + mainLayout->addWidget(reasonEdit, 0, 1); + mainLayout->addWidget(minutesLabel, 1, 0); + mainLayout->addWidget(minutesEdit, 1, 1); + mainLayout->addLayout(buttonLayout, 2, 0, 1, 2); + + setLayout(mainLayout); + setWindowTitle(tr("Shut down server")); +} + +QString ShutdownDialog::getReason() const +{ + return reasonEdit->text(); +} + +int ShutdownDialog::getMinutes() const +{ + return minutesEdit->value(); +} + +TabAdmin::TabAdmin(TabSupervisor *_tabSupervisor, AbstractClient *_client, bool _fullAdmin, QWidget *parent) + : Tab(_tabSupervisor, parent), locked(true), client(_client), fullAdmin(_fullAdmin) { updateServerMessageButton = new QPushButton; connect(updateServerMessageButton, SIGNAL(clicked()), this, SLOT(actUpdateServerMessage())); + shutdownServerButton = new QPushButton; + connect(shutdownServerButton, SIGNAL(clicked()), this, SLOT(actShutdownServer())); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(updateServerMessageButton); + vbox->addWidget(shutdownServerButton); vbox->addStretch(); adminGroupBox = new QGroupBox; @@ -38,6 +91,7 @@ TabAdmin::TabAdmin(TabSupervisor *_tabSupervisor, AbstractClient *_client, QWidg void TabAdmin::retranslateUi() { updateServerMessageButton->setText(tr("Update server &message")); + shutdownServerButton->setText(tr("&Shut down server")); adminGroupBox->setTitle(tr("Server administration functions")); unlockButton->setText(tr("&Unlock functions")); @@ -49,10 +103,18 @@ void TabAdmin::actUpdateServerMessage() client->sendCommand(new Command_UpdateServerMessage()); } +void TabAdmin::actShutdownServer() +{ + ShutdownDialog dlg; + if (dlg.exec()) + client->sendCommand(new Command_ShutdownServer(dlg.getReason(), dlg.getMinutes())); +} + void TabAdmin::actUnlock() { if (QMessageBox::question(this, tr("Unlock administration functions"), tr("Do you really want to unlock the administration functions?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - adminGroupBox->setEnabled(true); + if (fullAdmin) + adminGroupBox->setEnabled(true); lockButton->setEnabled(true); unlockButton->setEnabled(false); locked = false; @@ -61,7 +123,8 @@ void TabAdmin::actUnlock() void TabAdmin::actLock() { - adminGroupBox->setEnabled(false); + if (fullAdmin) + adminGroupBox->setEnabled(false); lockButton->setEnabled(false); unlockButton->setEnabled(true); locked = true; diff --git a/cockatrice/src/tab_admin.h b/cockatrice/src/tab_admin.h index 8450d473..a4982bba 100644 --- a/cockatrice/src/tab_admin.h +++ b/cockatrice/src/tab_admin.h @@ -2,27 +2,43 @@ #define TAB_ADMIN_H #include "tab.h" +#include class AbstractClient; class QGroupBox; class QPushButton; +class QSpinBox; +class QLineEdit; + +class ShutdownDialog : public QDialog { + Q_OBJECT +private: + QLineEdit *reasonEdit; + QSpinBox *minutesEdit; +public: + ShutdownDialog(QWidget *parent = 0); + QString getReason() const; + int getMinutes() const; +}; class TabAdmin : public Tab { Q_OBJECT private: bool locked; AbstractClient *client; - QPushButton *updateServerMessageButton; + bool fullAdmin; + QPushButton *updateServerMessageButton, *shutdownServerButton; QGroupBox *adminGroupBox; QPushButton *unlockButton, *lockButton; private slots: void actUpdateServerMessage(); + void actShutdownServer(); void actUnlock(); void actLock(); public: - TabAdmin(TabSupervisor *_tabSupervisor, AbstractClient *_client, QWidget *parent = 0); + TabAdmin(TabSupervisor *_tabSupervisor, AbstractClient *_client, bool _fullAdmin, QWidget *parent = 0); void retranslateUi(); QString getTabText() const { return tr("Administration"); } bool getLocked() const { return locked; } diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index be7751a0..1dfe7d44 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -135,8 +135,8 @@ void TabSupervisor::start(AbstractClient *_client, ServerInfo_User *userInfo) } else tabDeckStorage = 0; - if (userInfo->getUserLevel() & ServerInfo_User::IsAdmin) { - tabAdmin = new TabAdmin(this, client); + if (userInfo->getUserLevel() & ServerInfo_User::IsModerator) { + tabAdmin = new TabAdmin(this, client, (userInfo->getUserLevel() & ServerInfo_User::IsAdmin)); myAddTab(tabAdmin); } else tabAdmin = 0; diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 595e8b8e..7acbe551 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -56,11 +56,18 @@ void MainWindow::processConnectionClosedEvent(Event_ConnectionClosed *event) reasonStr = tr("There are too many concurrent connections from your address."); else if (reason == "banned") reasonStr = tr("Banned by moderator."); + else if (reason == "server_shutdown") + reasonStr = tr("Scheduled server shutdown."); else reasonStr = tr("Unknown reason."); QMessageBox::critical(this, tr("Connection closed"), tr("The server has terminated your connection.\nReason: %1").arg(reasonStr)); } +void MainWindow::processServerShutdownEvent(Event_ServerShutdown *event) +{ + QMessageBox::information(this, tr("Scheduled server shutdown"), tr("The server is going to be restarted in %n minute(s).\nAll running games will be lost.\nReason for shutdown: %1", "", event->getMinutes()).arg(event->getReason())); +} + void MainWindow::statusChanged(ClientStatus _status) { setClientStatusTitle(); @@ -290,6 +297,7 @@ MainWindow::MainWindow(QWidget *parent) client = new RemoteClient(this); connect(client, SIGNAL(connectionClosedEventReceived(Event_ConnectionClosed *)), this, SLOT(processConnectionClosedEvent(Event_ConnectionClosed *))); + connect(client, SIGNAL(serverShutdownEventReceived(Event_ServerShutdown *)), this, SLOT(processServerShutdownEvent(Event_ServerShutdown *))); connect(client, SIGNAL(serverError(ResponseCode)), this, SLOT(serverError(ResponseCode))); connect(client, SIGNAL(socketError(const QString &)), this, SLOT(socketError(const QString &))); connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout())); diff --git a/cockatrice/src/window_main.h b/cockatrice/src/window_main.h index 9ca62ba8..4d8b45d6 100644 --- a/cockatrice/src/window_main.h +++ b/cockatrice/src/window_main.h @@ -36,6 +36,7 @@ private slots: void updateTabMenu(QMenu *menu); void statusChanged(ClientStatus _status); void processConnectionClosedEvent(Event_ConnectionClosed *event); + void processServerShutdownEvent(Event_ServerShutdown *event); void serverTimeout(); void serverError(ResponseCode r); void socketError(const QString &errorStr); diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index 1ce8de4b..bea2660e 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -1390,216 +1390,237 @@ + Scheduled server shutdown. + + + + Unknown reason. - + Connection closed - + The server has terminated your connection. Reason: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + + Number of players - + Please enter the number of players. - - + + Player %1 - + About Cockatrice - + Version %1 - + Authors: - + Translators: - + Spanish: - + Portugese (Portugal): - + Portugese (Brazil): - + French: - + Japanese: - + Russian: - + Czech: - + Slovak: - - + - - + + + Error - + Server timeout - + Invalid login data. - + There is already an active session using this user name. Please close that session first and re-login. - + Socket error: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. - + Connecting to %1... - + Disconnected - + Logged in at %1 - + &Connect... - + &Disconnect - + Start &local game... - + &Deck editor - + &Full screen - + Ctrl+F - + &Settings... - + &Exit - + &Cockatrice - + &About Cockatrice - + &Help - + Are you sure? - + There are still open games. Are you sure you want to quit? @@ -2705,40 +2726,73 @@ Local version is %1, remote version is %2. + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + + + + + Shut down server + + + TabAdmin - + Update server &message - + + &Shut down server + + + + Server administration functions - + &Unlock functions - + &Lock functions - + Unlock administration functions - + Do you really want to unlock the administration functions? - + Administration diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 85e2d47b..33c22939 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -2140,138 +2140,162 @@ + Scheduled server shutdown. + Planmäßige Serverabschaltung. + + + Unknown reason. Unbekannter Grund. - + Connection closed Verbindung geschlossen - + The server has terminated your connection. Reason: %1 Der Server hat Ihre Verbindung beendet. Grund: %1 - + + Scheduled server shutdown + Planmäßige Serverabschaltung + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + Der Server wird in %n Minute neu gestartet. +Alle laufenden Spiele werden beendet. +Grund für die Abschaltung: %1 + Der Server wird in %n Minuten neu gestartet. +Alle laufenden Spiele werden beendet. +Grund für die Abschaltung: %1 + + + + Number of players Spieleranzahl - + Please enter the number of players. Bitte die Spieleranzahl eingeben: - - + + Player %1 Spieler %1 - + About Cockatrice Über Cockatrice - + Version %1 Version %1 - + Authors: Autoren: - + Translators: Übersetzer: - + Spanish: Spanisch: - + Portugese (Portugal): Portugiesisch (Portugal): - + Portugese (Brazil): Portugiesisch (Brasilien): - + French: Französisch: - + Japanese: Japanisch: - + Russian: Russisch: - + Czech: Tschechisch: - + Slovak: Slowakisch: - - + - - + + + Error Fehler - + Server timeout Server Zeitüberschreitung - + Invalid login data. Ungültige Anmeldedaten. - + There is already an active session using this user name. Please close that session first and re-login. Es gibt bereits eine aktive Verbindung mit diesem Benutzernamen. Bitte schließen Sie diese Verbindung zuerst und versuchen Sie es dann erneut. - + Socket error: %1 Netzwerkfehler: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Sie versuchen sich an einem veralteten Server anzumelden. Bitte verwenden Sie eine ältere Cockatrice-Version oder melden Sie sich an einem aktuellen Server an. Lokale Version ist %1, Serverversion ist %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. Ihr Cockatrice-Client ist veraltet. Bitte laden Sie sich die neueste Version herunter. @@ -2282,52 +2306,52 @@ Lokale Version ist %1, Serverversion ist %2. Protokollversionen stimmen nicht überein. Lokale Version: %1, Serverversion: %2. - + Connecting to %1... Verbinde zu %1... - + Disconnected nicht verbunden - + Logged in at %1 Angemeldet bei %1 - + &Connect... &Verbinden... - + &Disconnect Verbindung &trennen - + Start &local game... &Lokales Spiel starten... - + &About Cockatrice &Über Cockatrice - + &Help &Hilfe - + Are you sure? Sind Sie sicher? - + There are still open games. Are you sure you want to quit? Es gibt noch offene Spiele. Wollen Sie das Programm wirklich beenden? @@ -2344,27 +2368,27 @@ Lokale Version ist %1, Serverversion ist %2. Spiel ver&lassen - + &Deck editor &Deck-Editor - + &Full screen &Vollbild - + Ctrl+F Ctrl+F - + &Settings... &Einstellungen... - + &Exit &Beenden @@ -2377,7 +2401,7 @@ Lokale Version ist %1, Serverversion ist %2. Esc - + &Cockatrice &Cockatrice @@ -4021,40 +4045,77 @@ Lokale Version ist %1, Serverversion ist %2. Langer Name + + ShutdownDialog + + + &Reason for shutdown: + G&rund für die Abschaltung: + + + + &Time until shutdown (minutes): + &Zeit bis zur Abschaltung (Minuten): + + + + &OK + &OK + + + + &Cancel + &Abbrechen + + + + Shut down server + Server abschalten + + TabAdmin - + Update server &message Server&nachricht aktualisieren - + Shut down server + Server abschalten + + + + &Shut down server + &Server abschalten + + + Server administration functions Funktionen zur Serverwartung - + &Unlock functions &Sperre aufheben - + &Lock functions Funktionen s&perren - + Unlock administration functions Wartungsfunktionen entsperren - + Do you really want to unlock the administration functions? Möchten Sie wirklich die Sperre der Wartungsfunktionen aufheben? - + Administration Wartung diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 415aa3fd..a0cd85a4 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -1390,216 +1390,236 @@ + Scheduled server shutdown. + + + + Unknown reason. - + Connection closed - + The server has terminated your connection. Reason: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + Number of players - + Please enter the number of players. - - + + Player %1 - + About Cockatrice - + Version %1 - + Authors: - + Translators: - + Spanish: - + Portugese (Portugal): - + Portugese (Brazil): - + French: - + Japanese: - + Russian: - + Czech: - + Slovak: - - + - - + + + Error - + Server timeout - + Invalid login data. - + There is already an active session using this user name. Please close that session first and re-login. - + Socket error: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. - + Connecting to %1... - + Disconnected - + Logged in at %1 - + &Connect... - + &Disconnect - + Start &local game... - + &Deck editor - + &Full screen - + Ctrl+F - + &Settings... - + &Exit - + &Cockatrice - + &About Cockatrice - + &Help - + Are you sure? - + There are still open games. Are you sure you want to quit? @@ -2712,40 +2732,73 @@ Local version is %1, remote version is %2. + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + + + + + Shut down server + + + TabAdmin - + Update server &message - + + &Shut down server + + + + Server administration functions - + &Unlock functions - + &Lock functions - + Unlock administration functions - + Do you really want to unlock the administration functions? - + Administration diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 116265d5..60757984 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -1755,138 +1755,158 @@ + Scheduled server shutdown. + + + + Unknown reason. Motivo desconocido. - + Connection closed Conexión cerrada - + The server has terminated your connection. Reason: %1 El servidor ha finalizado tu conexión. Motivo: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + Number of players Número de jugadores - + Please enter the number of players. Por favor, introduzca el número de jugadores. - - + + Player %1 Jugador %1 - + About Cockatrice Acerca de Cockatrice - + Version %1 Versión %1 - + Authors: Autores: - + Translators: Traductores: - + Spanish: Español: - + Portugese (Portugal): Portugués (Portugal): - + Portugese (Brazil): Portugués (Brasil): - + French: Francés: - + Japanese: Japonés: - + Russian: Ruso: - + Czech: - + Slovak: - - + - - + + + Error Error - + Server timeout Tiempo de espera del servidor agotado - + Invalid login data. Datos de conexión invalidos. - + There is already an active session using this user name. Please close that session first and re-login. Ya existe una sesión activa usando ese nombre de usuario. Por favor, cierra esa sesión primero y reintentalo. - + Socket error: %1 Error del Socket: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Estás intentando conectar a un servidor obsoleto. Por favor, usa una versión anterior de Cockatrice o conecta a un servidor apropiado. La versión local es %1, la versión remota es %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. Tu cliente de Cockatrice esta obsoleto. Por favor, actualiza tu versión de Cockatrice. @@ -1897,82 +1917,82 @@ La versión local es %1, la versión remota es %2. La versión del protocolo es diferente. Version local: %1, version remota: %2. - + Connecting to %1... Conectando a %1... - + Disconnected Desconectado - + Logged in at %1 Conectado en %1 - + &Connect... &Conectar... - + &Disconnect &Desconectar - + Start &local game... Empezar partida &local... - + &Deck editor Editor de &mazos - + &Full screen &Pantalla completa - + Ctrl+F CTRL+F - + &Settings... &Preferencias... - + &Exit &Salir - + &Cockatrice &Cockatrice - + &About Cockatrice &Acerca de Cockatrice - + &Help A&yuda - + Are you sure? ¿Estás seguro? - + There are still open games. Are you sure you want to quit? Todavía hay partidas abiertas. ¿Estás seguro que quieres salir? @@ -3140,40 +3160,73 @@ La versión local es %1, la versión remota es %2. Nombre largo + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + &Aceptar + + + + &Cancel + &Cancelar + + + + Shut down server + + + TabAdmin - + Update server &message Actualizar &mensaje del servidor - + + &Shut down server + + + + Server administration functions Funciones de administración del servidor - + &Unlock functions &Desbloquear funciones - + &Lock functions &Bloquear funciones - + Unlock administration functions Desbloquear funciones de administración - + Do you really want to unlock the administration functions? ¿Realmente quieres desbloquear las funciones de administración? - + Administration Administración diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index de17833e..3573db24 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -1595,23 +1595,23 @@ MainWindow - + Number of players Nombre de joueurs - + Please enter the number of players. Entrez s'il vous plait le nombre de joueurs. - - + + Player %1 Joueur %1 - + About Cockatrice à propos de Cockatrice @@ -1620,67 +1620,67 @@ <font size="8"><b>Cockatrice</b></font><br>Version %1<br><br><br><b>Auteurs:</b><br>Max-Wilhelm Bruker<br>Marcus Schütz<br>Marius van Zundert<br><br><b>Tranducteurs:</b><br>Espagnol: Gocho<br>Portugais: Milton Gonçalves<br>Portugais: Milton Gonçalves<br>Français: Yannick HAMMER<br> - + Version %1 Version %1 - + Authors: Auteurs: - + Translators: Traducteurs: - + Spanish: Espagnol: - + Portugese (Portugal): Portugais (Portugal): - + Portugese (Brazil): Portugais (Brésil): - + French: Français: - + Japanese: Japonais: - - + - - + + + Error Erreur - + Server timeout Délai de la demande dépassé - + Invalid login data. Information de connexion érronée. - + Socket error: %1 Erreur de socket: %1 @@ -1700,136 +1700,156 @@ + Scheduled server shutdown. + + + + Unknown reason. Raison inconnue. - + Connection closed Connection fermée - + The server has terminated your connection. Reason: %1 Le serveur a coupé votre connexion. Raison: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + Russian: putted "France" instead of "Russe" -> meant that I must put the translation laguage country, isn't it? France: - + Czech: - + Slovak: - + There is already an active session using this user name. Please close that session first and re-login. Il y a déjà une session ouvert avec le même pseudo. Fermez cette session puis re-connectez-vous. - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Vous tentez de vous connecter à un serveur obsolète. Chargez la nouvelle version de Cockatrice ou connectez-vous à un serveur approprié. La version la plus récente est %1, l'ancienne version est %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. Votre client Cockatrice est obsolète. Veuillez charger la nouvelle version. La version la plus récente est %1, l'ancienne version est %2. - + Connecting to %1... Connexion à %1... - + Disconnected Déconnecté - + Logged in at %1 Connecté à %1 - + &Connect... à verifier &Connecter... - + &Disconnect &Déconnecter - + Start &local game... Démarrer une partie &locale... - + &Deck editor Éditeur de &deck - + &Full screen &Plein écran - + Ctrl+F Ctrl+F - + &Settings... &Paramètres... - + &Exit &Quitter - + &Cockatrice &Cockatrice - + &About Cockatrice À propos de Cock&atrice - + &Help A&ide - + Are you sure? Êtes-vous sûr? - + There are still open games. Are you sure you want to quit? Il y a encore des parties en cours. Êtes-vous sûr de vouloir quitter? @@ -2999,40 +3019,73 @@ La version la plus récente est %1, l'ancienne version est %2.Nom complet + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + &OK + + + + &Cancel + &Annuler + + + + Shut down server + + + TabAdmin - + Update server &message Mettre à jour le &message du serveur - + + &Shut down server + + + + Server administration functions Fonctions d'administration du serveur - + &Unlock functions &Débloquer fonctions - + &Lock functions &Bloquer fonctions - + Unlock administration functions Débloquer fonctions d'administration - + Do you really want to unlock the administration functions? Êtes-vous sûr de vouloir débloquer les fonctions d'administration? - + Administration Administration diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index 4ae3575c..73682c83 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -1443,220 +1443,239 @@ + Scheduled server shutdown. + + + + Unknown reason. 不明な理由. - + Connection closed 通信切断 - + The server has terminated your connection. Reason: %1 サーバーはあなたの接続を切断しました. 理由: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + Number of players プレイヤー人数 - + Please enter the number of players. プレイヤーの人数を入れてください. - - + + Player %1 プレイヤー %1 - + About Cockatrice Cockatriceについて - + Version %1 - + Authors: 著者: - + Translators: 翻訳者: - + Spanish: スペイン語: - + Portugese (Portugal): ポルトガル語(ポルトガル): - + Portugese (Brazil): ポルトガル語(ブラジル): - + French: フランス語: - + Japanese: 日本語: - + Russian: ロシア語: - + Czech: - + Slovak: - - + - - + + + Error エラー - + Server timeout サーバータイムアウト - + Invalid login data. 無効なログインデータです. - + There is already an active session using this user name. Please close that session first and re-login. これはすでにこのユーザー名で使われているアクティブなセッションです. まずこのセッションを閉じてログインしなおしてください. - + Socket error: %1 ソケットエラー: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. あなたは古いVerのサーバーに接続しようとしています.CockatriceのVerをダウングレードするか適正なサーバーに接続してください. ローカルVer %1,リモートVer %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. あなたのCockatriceのVerが古いです.Cockatriceをアップデートしてください. ローカルVer %1,リモートVer %2. - + Connecting to %1... %1へ接続しています... - + Disconnected 切断されました - + Logged in at %1 %1にログイン中 - + &Connect... 接続... - + &Disconnect 切断 - + Start &local game... ローカルゲームを開始... - + &Deck editor デッキエディター - + &Full screen フルスクリーン - + Ctrl+F - + &Settings... 設定... - + &Exit 終了 - + &Cockatrice - + &About Cockatrice - + &Help ヘルプ - + Are you sure? よろしいですか? - + There are still open games. Are you sure you want to quit? ゲームがまだ開いています.本当に退出しますか? @@ -2779,40 +2798,73 @@ Local version is %1, remote version is %2. 正式名称 + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + + + + + Shut down server + + + TabAdmin - + Update server &message サーバー更新&メッセージ - + + &Shut down server + + + + Server administration functions サーバー管理機能 - + &Unlock functions 機能をアンロックする - + &Lock functions 機能をロックする - + Unlock administration functions 管理機能をアンロックする - + Do you really want to unlock the administration functions? 本当に管理機能をアンロックしますか? - + Administration 管理者 diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index bdaa8263..093c6668 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -1390,216 +1390,237 @@ + Scheduled server shutdown. + + + + Unknown reason. - + Connection closed - + The server has terminated your connection. Reason: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + + Number of players - + Please enter the number of players. - - + + Player %1 - + About Cockatrice - + Version %1 - + Authors: - + Translators: - + Spanish: - + Portugese (Portugal): - + Portugese (Brazil): - + French: - + Japanese: - + Russian: - + Czech: - + Slovak: - - + - - + + + Error - + Server timeout - + Invalid login data. - + There is already an active session using this user name. Please close that session first and re-login. - + Socket error: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. - + Connecting to %1... - + Disconnected - + Logged in at %1 - + &Connect... - + &Disconnect - + Start &local game... - + &Deck editor - + &Full screen - + Ctrl+F - + &Settings... - + &Exit - + &Cockatrice - + &About Cockatrice - + &Help - + Are you sure? - + There are still open games. Are you sure you want to quit? @@ -2705,40 +2726,73 @@ Local version is %1, remote version is %2. + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + + + + + Shut down server + + + TabAdmin - + Update server &message - + + &Shut down server + + + + Server administration functions - + &Unlock functions - + &Lock functions - + Unlock administration functions - + Do you really want to unlock the administration functions? - + Administration diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index c0549f8d..8dd17c58 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -1598,23 +1598,23 @@ MainWindow - + Number of players Número de jogadores - + Please enter the number of players. Por favor, entre o número de jogadores. - - + + Player %1 Jogador %1 - + About Cockatrice Sobre o Cockatrice @@ -1623,72 +1623,72 @@ <font size="8"><b>Cockatrice</b></font><br>Version %1<br><br><br><b>Authors:</b><br>Max-Wilhelm Bruker<br>Marcus Schütz<br>Marius van Zundert<br><br><b>Translators:</b><br>Spanish: Gocho<br>Portugese: Milton Gonçalves<br>Brazilian Portuguese: Thiago Queiroz<br> - + Version %1 Versão %1 - + Authors: Autores: - + Translators: Tradutores: - + Spanish: Espanhol: - + Portugese (Portugal): Português (Portugal): - + Portugese (Brazil): Português (Brasil): - + French: Francês: - + Japanese: Japonês: - + Russian: Russo: - - + - - + + + Error Erro - + Server timeout Tempo esgotado do servidor - + Invalid login data. Informações de login inválidas. - + Socket error: %1 Erro de ligação:%1 @@ -1708,129 +1708,149 @@ + Scheduled server shutdown. + + + + Unknown reason. Razão desconhecida. - + Connection closed Conexão fechada - + The server has terminated your connection. Reason: %1 O servidor terminou sua conexão. Razão: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + Czech: - + Slovak: - + There is already an active session using this user name. Please close that session first and re-login. Já existe uma sessão ativa usando este nome de usuário. Por favor, feche a sessão primeiro e logue novamente. - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Você está tentando conectar a um servidor obsoleto. Por favor, faça um downgrade na versão do seu Cockatrice ou conecte-se ao servidor correto. A versão local é %1 e a versão remota é %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. A versão do seu Cockatrice é obsoleta. Por favor, atualize a sua versão. A versão local é %1 e a versão remota é %2. - + Connecting to %1... Conectando a %1... - + Disconnected Desconectado - + Logged in at %1 Logado em %1 - + &Connect... &Conectar... - + &Disconnect &Desconectar - + Start &local game... Iniciar jogo &local... - + &Deck editor Editor de &decks - + &Full screen Tela &cheia - + Ctrl+F Ctrl+F - + &Settings... &Configurações... - + &Exit &Sair - + &Cockatrice &Cockatrice - + &About Cockatrice So&bre o Cockatrice - + &Help &Ajuda - + Are you sure? Você tem certeza? - + There are still open games. Are you sure you want to quit? Ainda existem jogos abertos. Você tem certeza que deseja sair? @@ -2982,40 +3002,73 @@ A versão local é %1 e a versão remota é %2. Nome longo + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + &OK + + + + &Cancel + &Cancelar + + + + Shut down server + + + TabAdmin - + Update server &message &Atualizar mensagem do servidor - + + &Shut down server + + + + Server administration functions Funções do administrador do servidor - + &Unlock functions &Desbloquear funções - + &Lock functions &Bloquear funções - + Unlock administration functions Desbloquear funções do administrador - + Do you really want to unlock the administration functions? Você quer mesmo desbloquear as funções do administrador? - + Administration Administração diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index 9b7dac82..7ed23d1b 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -1598,23 +1598,23 @@ MainWindow - + Number of players Número de jogadores - + Please enter the number of players. Por favor introduza o número de jogadores. - - + + Player %1 Jogador %1 - + About Cockatrice Sobre o Cockatrice @@ -1623,22 +1623,22 @@ <font size="8"><b>Cockatrice</b></font><br>Versão %1<br><br><br><b>Autores:</b><br>Max-Wilhelm Bruker<br>Marcus Schütz<br>Marius van Zundert<br><br><b>Tradutores:</b><br>Espanhol: Gocho<br>Português: Milton Gonçalves<br> - + Version %1 Versão %1 - + Authors: Autores: - + Translators: Tradutores: - + Spanish: Espanhol: @@ -1647,52 +1647,52 @@ Português: - + Portugese (Portugal): Português (Portugal): - + Portugese (Brazil): Português (Brasil): - + French: Francês: - + Japanese: Japonês: - + Russian: Russo: - - + - - + + + Error Erro - + Server timeout Tempo do servidor esgotado - + Invalid login data. Informação de login incorrecta. - + Socket error: %1 Erro de ligação:%1 @@ -1712,129 +1712,149 @@ + Scheduled server shutdown. + + + + Unknown reason. Razão desconhecida. - + Connection closed Ligação terminada - + The server has terminated your connection. Reason: %1 O servidor terminou a sua ligação. Motivo: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + Czech: - + Slovak: - + There is already an active session using this user name. Please close that session first and re-login. Já existe uma sessão activa com este nome de utilizador. Por favor termine essa sessão e volte a ligar-se. - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Está a tentar ligar-se a um servidor obsoleto. Por favor faça downgrade à sua versão do Cockatrice ou ligue-se a servidor adequado. Versão local é %1, versão remota é %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. A sua versão do Cockatrice é obsoleta. Por favor actualize-a. Versão local é %1, versão remota é %2. - + Connecting to %1... Ligando a %1... - + Disconnected Desligado - + Logged in at %1 Logado em %1 - + &Connect... &Ligar... - + &Disconnect &Desligar - + Start &local game... Começar &jogo local... - + &Deck editor &Editor de decks - + &Full screen Ecrã &inteiro - + Ctrl+F Ctrl+F - + &Settings... &Configurações... - + &Exit &Sair - + &Cockatrice &Cockatrice - + &About Cockatrice S&obre o Cockatrice - + &Help &Ajuda - + Are you sure? Tens a certeza? - + There are still open games. Are you sure you want to quit? Ainda há jogos abertos. Tem a certeza que deseja sair? @@ -2986,40 +3006,73 @@ Versão local é %1, versão remota é %2. Nome longo + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + &Cancelar + + + + Shut down server + + + TabAdmin - + Update server &message &Actualizar mensagem do servidor - + + &Shut down server + + + + Server administration functions Funções do administrador do servidor - + &Unlock functions &Desbloquear funções - + &Lock functions &Bloquear funções - + Unlock administration functions Desbloquear funções de administração - + Do you really want to unlock the administration functions? Quer mesmo desbloquear as funçõesde administração? - + Administration Administração diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index 1f5e95e5..9d7920e1 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -1544,220 +1544,241 @@ + Scheduled server shutdown. + + + + Unknown reason. Неизвестная причина. - + Connection closed Соединение прервано - + The server has terminated your connection. Reason: %1 Ваше подключение было прервано сервером. Причина: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + + Number of players Количество игроков - + Please enter the number of players. Введите количество игроков. - - + + Player %1 Игрок %1 - + About Cockatrice О программе - + Version %1 Версия %1 - + Authors: Разработчики: - + Translators: Переводчики: - + Spanish: Испанский: - + Portugese (Portugal): Португальский: - + Portugese (Brazil): Португальский (Brazil): - + French: Французский: - + Japanese: Японский: - + Russian: Русский: - + Czech: - + Slovak: - - + - - + + + Error Ошибка - + Server timeout Временная ошибка - + Invalid login data. Неверный логин/пароль. - + There is already an active session using this user name. Please close that session first and re-login. Пользователь с таким именем уже подключен. Пожалуйста, закройте это подключение и войдите заново. - + Socket error: %1 Ошибка сокета: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. Вы пытаетесь подключиться к несуществующему серверу. Пожалуйста, обновите Cockatrice или выберите другой сервер. Локальная версия %1, удаленная версия %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. Ваш клиент Cockatrice устарел. Пожалуйста, обновите Cockatrice. Локальная версия %1, удаленная версия %2. - + Connecting to %1... Подключение к %1... - + Disconnected Подключение прервано - + Logged in at %1 Подключено к %1 - + &Connect... &Подключение... - + &Disconnect П&рервать подключение - + Start &local game... &Начать локальную игру... - + &Deck editor Редактор &колод - + &Full screen П&олный экран - + Ctrl+F - + &Settings... Н&астройки - + &Exit &Выход - + &Cockatrice - + &About Cockatrice О про&грамме - + &Help &Справка - + Are you sure? Вы уверены? - + There are still open games. Are you sure you want to quit? Вы подключены к игре. Выйти? @@ -2903,40 +2924,73 @@ Local version is %1, remote version is %2. Полное название + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + &Ок + + + + &Cancel + &Отмена + + + + Shut down server + + + TabAdmin - + Update server &message Обновить сооб&щения сервера - + + &Shut down server + + + + Server administration functions Функции администрирования сервера - + &Unlock functions &Разблокировать функции - + &Lock functions &Заблокировать функции - + Unlock administration functions Разблокировать административные права - + Do you really want to unlock the administration functions? Вы действительно хотите разблокировать административные права? - + Administration Администрирование diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 30324e93..835301f8 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -1390,216 +1390,237 @@ + Scheduled server shutdown. + + + + Unknown reason. - + Connection closed - + The server has terminated your connection. Reason: %1 - + + Scheduled server shutdown + + + + + The server is going to be restarted in %n minute(s). +All running games will be lost. +Reason for shutdown: %1 + + + + + + + + Number of players - + Please enter the number of players. - - + + Player %1 - + About Cockatrice - + Version %1 - + Authors: - + Translators: - + Spanish: - + Portugese (Portugal): - + Portugese (Brazil): - + French: - + Japanese: - + Russian: - + Czech: - + Slovak: - - + - - + + + Error - + Server timeout - + Invalid login data. - + There is already an active session using this user name. Please close that session first and re-login. - + Socket error: %1 - + You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server. Local version is %1, remote version is %2. - + Your Cockatrice client is obsolete. Please update your Cockatrice version. Local version is %1, remote version is %2. - + Connecting to %1... - + Disconnected - + Logged in at %1 - + &Connect... - + &Disconnect - + Start &local game... - + &Deck editor - + &Full screen - + Ctrl+F - + &Settings... - + &Exit - + &Cockatrice - + &About Cockatrice - + &Help - + Are you sure? - + There are still open games. Are you sure you want to quit? @@ -2705,40 +2726,73 @@ Local version is %1, remote version is %2. + + ShutdownDialog + + + &Reason for shutdown: + + + + + &Time until shutdown (minutes): + + + + + &OK + + + + + &Cancel + + + + + Shut down server + + + TabAdmin - + Update server &message - + + &Shut down server + + + + Server administration functions - + &Unlock functions - + &Lock functions - + Unlock administration functions - + Do you really want to unlock the administration functions? - + Administration diff --git a/common/protocol.h b/common/protocol.h index b72deb10..0cb067ee 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -167,6 +167,15 @@ public: void setGameId(int _gameId) { static_cast(itemMap.value("game_id"))->setData(_gameId); } }; +class ModeratorCommand : public Command { + Q_OBJECT +public: + ModeratorCommand(const QString &_cmdName) + : Command(_cmdName) + { + } +}; + class AdminCommand : public Command { Q_OBJECT public: diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index 2d89e883..b00687cf 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -65,19 +65,21 @@ ItemId_Event_DumpZone = 1063, ItemId_Event_StopDumpZone = 1064, ItemId_Event_RemoveFromList = 1065, ItemId_Event_ServerMessage = 1066, -ItemId_Event_ConnectionClosed = 1067, -ItemId_Event_Message = 1068, -ItemId_Event_GameJoined = 1069, -ItemId_Event_UserLeft = 1070, -ItemId_Event_LeaveRoom = 1071, -ItemId_Event_RoomSay = 1072, -ItemId_Context_ReadyStart = 1073, -ItemId_Context_Concede = 1074, -ItemId_Context_DeckSelect = 1075, -ItemId_Context_UndoDraw = 1076, -ItemId_Context_MoveCard = 1077, -ItemId_Context_Mulligan = 1078, -ItemId_Command_UpdateServerMessage = 1079, -ItemId_Command_BanFromServer = 1080, -ItemId_Other = 1081 +ItemId_Event_ServerShutdown = 1067, +ItemId_Event_ConnectionClosed = 1068, +ItemId_Event_Message = 1069, +ItemId_Event_GameJoined = 1070, +ItemId_Event_UserLeft = 1071, +ItemId_Event_LeaveRoom = 1072, +ItemId_Event_RoomSay = 1073, +ItemId_Context_ReadyStart = 1074, +ItemId_Context_Concede = 1075, +ItemId_Context_DeckSelect = 1076, +ItemId_Context_UndoDraw = 1077, +ItemId_Context_MoveCard = 1078, +ItemId_Context_Mulligan = 1079, +ItemId_Command_UpdateServerMessage = 1080, +ItemId_Command_ShutdownServer = 1081, +ItemId_Command_BanFromServer = 1082, +ItemId_Other = 1083 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 17aea383..69de7319 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -398,6 +398,12 @@ Event_ServerMessage::Event_ServerMessage(const QString &_message) { insertItem(new SerializableItem_String("message", _message)); } +Event_ServerShutdown::Event_ServerShutdown(const QString &_reason, int _minutes) + : GenericEvent("server_shutdown") +{ + insertItem(new SerializableItem_String("reason", _reason)); + insertItem(new SerializableItem_Int("minutes", _minutes)); +} Event_ConnectionClosed::Event_ConnectionClosed(const QString &_reason) : GenericEvent("connection_closed") { @@ -467,8 +473,14 @@ Command_UpdateServerMessage::Command_UpdateServerMessage() : AdminCommand("update_server_message") { } +Command_ShutdownServer::Command_ShutdownServer(const QString &_reason, int _minutes) + : AdminCommand("shutdown_server") +{ + insertItem(new SerializableItem_String("reason", _reason)); + insertItem(new SerializableItem_Int("minutes", _minutes)); +} Command_BanFromServer::Command_BanFromServer(const QString &_userName, int _minutes) - : AdminCommand("ban_from_server") + : ModeratorCommand("ban_from_server") { insertItem(new SerializableItem_String("user_name", _userName)); insertItem(new SerializableItem_Int("minutes", _minutes)); @@ -541,6 +553,7 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("game_eventstop_dump_zone", Event_StopDumpZone::newItem); itemNameHash.insert("generic_eventremove_from_list", Event_RemoveFromList::newItem); itemNameHash.insert("generic_eventserver_message", Event_ServerMessage::newItem); + itemNameHash.insert("generic_eventserver_shutdown", Event_ServerShutdown::newItem); itemNameHash.insert("generic_eventconnection_closed", Event_ConnectionClosed::newItem); itemNameHash.insert("generic_eventmessage", Event_Message::newItem); itemNameHash.insert("generic_eventgame_joined", Event_GameJoined::newItem); @@ -554,5 +567,6 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("game_event_contextmove_card", Context_MoveCard::newItem); itemNameHash.insert("game_event_contextmulligan", Context_Mulligan::newItem); itemNameHash.insert("cmdupdate_server_message", Command_UpdateServerMessage::newItem); + itemNameHash.insert("cmdshutdown_server", Command_ShutdownServer::newItem); itemNameHash.insert("cmdban_from_server", Command_BanFromServer::newItem); } diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 73369c6b..14e486c9 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -64,6 +64,7 @@ 3:stop_dump_zone:i,zone_owner_id:s,zone 4:remove_from_list:s,list:s,user_name 4:server_message:s,message +4:server_shutdown:s,reason:i,minutes 4:connection_closed:s,reason 4:message:s,sender_name:s,receiver_name:s,text 4:game_joined:i,game_id:s,game_description:i,player_id:b,spectator:b,spectators_can_talk:b,spectators_see_everything:b,resuming @@ -77,4 +78,5 @@ 6:move_card 6:mulligan:i,number 7:update_server_message -7:ban_from_server:s,user_name:i,minutes \ No newline at end of file +7:shutdown_server:s,reason:i,minutes +8:ban_from_server:s,user_name:i,minutes \ No newline at end of file diff --git a/common/protocol_items.h b/common/protocol_items.h index d58d3dec..d03a7825 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -598,6 +598,15 @@ public: static SerializableItem *newItem() { return new Event_ServerMessage; } int getItemId() const { return ItemId_Event_ServerMessage; } }; +class Event_ServerShutdown : public GenericEvent { + Q_OBJECT +public: + Event_ServerShutdown(const QString &_reason = QString(), int _minutes = -1); + QString getReason() const { return static_cast(itemMap.value("reason"))->getData(); }; + int getMinutes() const { return static_cast(itemMap.value("minutes"))->getData(); }; + static SerializableItem *newItem() { return new Event_ServerShutdown; } + int getItemId() const { return ItemId_Event_ServerShutdown; } +}; class Event_ConnectionClosed : public GenericEvent { Q_OBJECT public: @@ -706,7 +715,16 @@ public: static SerializableItem *newItem() { return new Command_UpdateServerMessage; } int getItemId() const { return ItemId_Command_UpdateServerMessage; } }; -class Command_BanFromServer : public AdminCommand { +class Command_ShutdownServer : public AdminCommand { + Q_OBJECT +public: + Command_ShutdownServer(const QString &_reason = QString(), int _minutes = -1); + QString getReason() const { return static_cast(itemMap.value("reason"))->getData(); }; + int getMinutes() const { return static_cast(itemMap.value("minutes"))->getData(); }; + static SerializableItem *newItem() { return new Command_ShutdownServer; } + int getItemId() const { return ItemId_Command_ShutdownServer; } +}; +class Command_BanFromServer : public ModeratorCommand { Q_OBJECT public: Command_BanFromServer(const QString &_userName = QString(), int _minutes = -1); diff --git a/common/protocol_mc.pl b/common/protocol_mc.pl index 31e85b1f..2b1c96b7 100755 --- a/common/protocol_mc.pl +++ b/common/protocol_mc.pl @@ -80,6 +80,13 @@ while () { $parentConstructorCall = "$baseClass(\"$name1\")"; $constructorParamsH = ""; $constructorParamsCpp = ""; + } elsif ($type == 8) { + $type = 'cmd'; + $namePrefix = 'Command'; + $baseClass = 'ModeratorCommand'; + $parentConstructorCall = "$baseClass(\"$name1\")"; + $constructorParamsH = ""; + $constructorParamsCpp = ""; } $className = $namePrefix . '_' . $name2; $itemEnum .= "ItemId_$className = " . ++$itemId . ",\n"; diff --git a/common/server.cpp b/common/server.cpp index a7e4c683..e4c68ff9 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -23,6 +23,7 @@ #include "server_room.h" #include "server_protocolhandler.h" #include "protocol_datastructures.h" +#include #include Server::Server(QObject *parent) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index a3ced63a..10729b8b 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -142,6 +142,17 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm default: return RespInvalidCommand; } } + ModeratorCommand *moderatorCommand = qobject_cast(command); + if (moderatorCommand) { + qDebug() << "received ModeratorCommand"; + if (!(userInfo->getUserLevel() & ServerInfo_User::IsModerator)) + return RespLoginNeeded; + + switch (command->getItemId()) { + case ItemId_Command_BanFromServer: return cmdBanFromServer(static_cast(command), cont); + default: return RespInvalidCommand; + } + } AdminCommand *adminCommand = qobject_cast(command); if (adminCommand) { qDebug() << "received AdminCommand"; @@ -149,8 +160,8 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm return RespLoginNeeded; switch (command->getItemId()) { + case ItemId_Command_ShutdownServer: return cmdShutdownServer(static_cast(command), cont); case ItemId_Command_UpdateServerMessage: return cmdUpdateServerMessage(static_cast(command), cont); - case ItemId_Command_BanFromServer: return cmdBanFromServer(static_cast(command), cont); default: return RespInvalidCommand; } } diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index c65d8d02..5817da22 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -87,8 +87,9 @@ private: ResponseCode cmdDumpZone(Command_DumpZone *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); ResponseCode cmdStopDumpZone(Command_StopDumpZone *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); ResponseCode cmdRevealCards(Command_RevealCards *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player); - virtual ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont) = 0; virtual ResponseCode cmdBanFromServer(Command_BanFromServer *cmd, CommandContainer *cont) = 0; + virtual ResponseCode cmdShutdownServer(Command_ShutdownServer *cmd, CommandContainer *cont) = 0; + virtual ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont) = 0; ResponseCode processCommandHelper(Command *command, CommandContainer *cont); private slots: diff --git a/servatrice/src/main.cpp b/servatrice/src/main.cpp index a36e3332..6c16c965 100644 --- a/servatrice/src/main.cpp +++ b/servatrice/src/main.cpp @@ -130,12 +130,16 @@ int main(int argc, char *argv[]) testRNG(); Servatrice server(settings); + QObject::connect(&server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection); std::cerr << "-------------------------" << std::endl; std::cerr << "Server initialized." << std::endl; int retval = app.exec(); + std::cerr << "Server quit." << std::endl; + std::cerr << "-------------------------" << std::endl; + delete rng; delete settings; diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index eaca1de6..0cc2dd96 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -44,7 +44,7 @@ void Servatrice_TcpServer::incomingConnection(int socketDescriptor) } Servatrice::Servatrice(QSettings *_settings, QObject *parent) - : Server(parent), dbMutex(QMutex::Recursive), settings(_settings), uptime(0) + : Server(parent), dbMutex(QMutex::Recursive), settings(_settings), uptime(0), shutdownTimer(0) { pingClock = new QTimer(this); connect(pingClock, SIGNAL(timeout()), this, SIGNAL(pingClockTimeout())); @@ -119,6 +119,7 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent) Servatrice::~Servatrice() { prepareDestroy(); + QSqlDatabase::database().close(); } bool Servatrice::openDatabase() @@ -233,7 +234,7 @@ ServerInfo_User *Servatrice::evalUserQueryResult(const QSqlQuery &query, bool co int userLevel = ServerInfo_User::IsUser | ServerInfo_User::IsRegistered; if (is_admin == 1) - userLevel |= ServerInfo_User::IsAdmin; + userLevel |= ServerInfo_User::IsAdmin | ServerInfo_User::IsModerator; else if (is_admin == 2) userLevel |= ServerInfo_User::IsModerator; @@ -388,4 +389,38 @@ void Servatrice::statusUpdate() execSqlQuery(query); } +void Servatrice::scheduleShutdown(const QString &reason, int minutes) +{ + QMutexLocker locker(&serverMutex); + + shutdownReason = reason; + shutdownMinutes = minutes + 1; + if (minutes > 0) { + shutdownTimer = new QTimer; + connect(shutdownTimer, SIGNAL(timeout()), this, SLOT(shutdownTimeout())); + shutdownTimer->start(60000); + } + shutdownTimeout(); +} + +void Servatrice::shutdownTimeout() +{ + QMutexLocker locker(&serverMutex); + + --shutdownMinutes; + + GenericEvent *event; + if (shutdownMinutes) + event = new Event_ServerShutdown(shutdownReason, shutdownMinutes); + else + event = new Event_ConnectionClosed("server_shutdown"); + + for (int i = 0; i < clients.size(); ++i) + clients[i]->sendProtocolItem(event, false); + delete event; + + if (!shutdownMinutes) + deleteLater(); +} + const QString Servatrice::versionString = "Servatrice 0.20110527"; diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index f1174c91..1a3d1d09 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -50,6 +50,7 @@ class Servatrice : public Server private slots: void statusUpdate(); void updateBanTimer(); + void shutdownTimeout(); public: QMutex dbMutex; static const QString versionString; @@ -76,6 +77,7 @@ public: bool getUserBanned(Server_ProtocolHandler *client, const QString &userName) const; void addAddressBan(const QHostAddress &address, int minutes) { addressBanList.append(QPair(address, minutes)); } void addNameBan(const QString &name, int minutes) { nameBanList.append(QPair(name, minutes)); } + void scheduleShutdown(const QString &reason, int minutes); protected: bool userExists(const QString &user); AuthenticationResult checkUserPassword(const QString &user, const QString &password); @@ -92,6 +94,10 @@ private: int maxGameInactivityTime, maxPlayerInactivityTime; int maxUsersPerAddress, messageCountingInterval, maxMessageCountPerInterval, maxMessageSizePerInterval, maxGamesPerUser; ServerInfo_User *evalUserQueryResult(const QSqlQuery &query, bool complete); + + QString shutdownReason; + int shutdownMinutes; + QTimer *shutdownTimer; }; #endif diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index f02747ca..14628a42 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -454,8 +454,8 @@ ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd, C return RespNothing; } -// ADMIN FUNCTIONS. -// Permission is checked by the calling function. +// MODERATOR FUNCTIONS. +// May be called by admins and moderators. Permission is checked by the calling function. ResponseCode ServerSocketInterface::cmdUpdateServerMessage(Command_UpdateServerMessage * /*cmd*/, CommandContainer * /*cont*/) { @@ -463,6 +463,15 @@ ResponseCode ServerSocketInterface::cmdUpdateServerMessage(Command_UpdateServerM return RespOk; } +// ADMIN FUNCTIONS. +// Permission is checked by the calling function. + +ResponseCode ServerSocketInterface::cmdShutdownServer(Command_ShutdownServer *cmd, CommandContainer * /*cont*/) +{ + servatrice->scheduleShutdown(cmd->getReason(), cmd->getMinutes()); + return RespOk; +} + ResponseCode ServerSocketInterface::cmdBanFromServer(Command_BanFromServer *cmd, CommandContainer * /*cont*/) { QString userName = cmd->getUserName(); diff --git a/servatrice/src/serversocketinterface.h b/servatrice/src/serversocketinterface.h index 8f7b937e..a155b421 100644 --- a/servatrice/src/serversocketinterface.h +++ b/servatrice/src/serversocketinterface.h @@ -66,8 +66,9 @@ private: ResponseCode cmdDeckUpload(Command_DeckUpload *cmd, CommandContainer *cont); DeckList *getDeckFromDatabase(int deckId); ResponseCode cmdDeckDownload(Command_DeckDownload *cmd, CommandContainer *cont); - ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont); ResponseCode cmdBanFromServer(Command_BanFromServer *cmd, CommandContainer *cont); + ResponseCode cmdShutdownServer(Command_ShutdownServer *cmd, CommandContainer *cont); + ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont); public: ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent = 0); ~ServerSocketInterface(); From cc795a2dd73357e9370e2d39ee8d9ad8e55e5bf7 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 25 Jun 2011 01:26:20 +0200 Subject: [PATCH 02/26] don't call alert() when a message in a public chat is received --- cockatrice/src/tab.h | 2 +- cockatrice/src/tab_room.cpp | 2 +- cockatrice/src/tab_supervisor.cpp | 7 ++++--- cockatrice/src/tab_supervisor.h | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cockatrice/src/tab.h b/cockatrice/src/tab.h index 31fdcbab..5f50813c 100644 --- a/cockatrice/src/tab.h +++ b/cockatrice/src/tab.h @@ -9,7 +9,7 @@ class TabSupervisor; class Tab : public QWidget { Q_OBJECT signals: - void userEvent(); + void userEvent(bool globalEvent = true); protected: QMenu *tabMenu; TabSupervisor *tabSupervisor; diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index f40458cd..d72e13ef 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -262,5 +262,5 @@ void TabRoom::processLeaveRoomEvent(Event_LeaveRoom *event) void TabRoom::processSayEvent(Event_RoomSay *event) { chatView->appendMessage(event->getPlayerName(), event->getMessage()); - emit userEvent(); + emit userEvent(false); } diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index 1dfe7d44..c9cdc5d5 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -101,7 +101,7 @@ void TabSupervisor::retranslateUi() int TabSupervisor::myAddTab(Tab *tab) { - connect(tab, SIGNAL(userEvent()), this, SLOT(tabUserEvent())); + connect(tab, SIGNAL(userEvent(bool)), this, SLOT(tabUserEvent(bool))); return addTab(tab, tab->getTabText()); } @@ -299,14 +299,15 @@ void TabSupervisor::talkLeft(TabMessage *tab) removeTab(indexOf(tab)); } -void TabSupervisor::tabUserEvent() +void TabSupervisor::tabUserEvent(bool globalEvent) { Tab *tab = static_cast(sender()); if (tab != currentWidget()) { tab->setContentsChanged(true); setTabIcon(indexOf(tab), *tabChangedIcon); } - QApplication::alert(this); + if (globalEvent) + QApplication::alert(this); } void TabSupervisor::processRoomEvent(RoomEvent *event) diff --git a/cockatrice/src/tab_supervisor.h b/cockatrice/src/tab_supervisor.h index 439ac1f8..5d7a2c9b 100644 --- a/cockatrice/src/tab_supervisor.h +++ b/cockatrice/src/tab_supervisor.h @@ -78,7 +78,7 @@ private slots: void processUserLeft(const QString &userName); void processUserJoined(const QString &userName); void talkLeft(TabMessage *tab); - void tabUserEvent(); + void tabUserEvent(bool globalEvent); void processRoomEvent(RoomEvent *event); void processGameEventContainer(GameEventContainer *cont); void processMessageEvent(Event_Message *event); From d892d320eabf542664efb61970a86eaefa5593b6 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 25 Jun 2011 15:58:38 +0200 Subject: [PATCH 03/26] dynamic compression support --- cockatrice/src/localserverinterface.h | 3 +- cockatrice/src/remoteclient.cpp | 1 + common/protocol.cpp | 4 +- common/serializable_item.cpp | 49 ++++++++++++++++++++++-- common/serializable_item.h | 8 +++- common/server_protocolhandler.cpp | 20 ++++++++-- common/server_protocolhandler.h | 1 + servatrice/src/serversocketinterface.cpp | 9 ++++- servatrice/src/serversocketinterface.h | 3 ++ 9 files changed, 85 insertions(+), 13 deletions(-) diff --git a/cockatrice/src/localserverinterface.h b/cockatrice/src/localserverinterface.h index 26194147..1db97412 100644 --- a/cockatrice/src/localserverinterface.h +++ b/cockatrice/src/localserverinterface.h @@ -21,12 +21,13 @@ private: ResponseCode cmdBanFromServer(Command_BanFromServer * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdShutdownServer(Command_ShutdownServer * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage * /*cmd*/, CommandContainer * /*cont*/) { return RespFunctionNotAllowed; } +protected: + bool getCompressionSupport() const { return false; } public: LocalServerInterface(LocalServer *_server); ~LocalServerInterface(); void sendProtocolItem(ProtocolItem *item, bool deleteItem = true); - signals: void itemToClient(ProtocolItem *item); public slots: diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index fac63019..8f084487 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -83,6 +83,7 @@ void RemoteClient::readData() xmlWriter->writeStartDocument(); xmlWriter->writeStartElement("cockatrice_client_stream"); xmlWriter->writeAttribute("version", QString::number(ProtocolItem::protocolVersion)); + xmlWriter->writeAttribute("comp", "1"); topLevelItem = new TopLevelProtocolItem; connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); diff --git a/common/protocol.cpp b/common/protocol.cpp index fe3997ad..1129116e 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -74,7 +74,7 @@ TopLevelProtocolItem::TopLevelProtocolItem() bool TopLevelProtocolItem::readCurrentItem(QXmlStreamReader *xml) { if (currentItem) { - if (currentItem->readElement(xml)) { + if (currentItem->read(xml)) { emit protocolItemReceived(currentItem); currentItem = 0; } @@ -92,6 +92,8 @@ bool TopLevelProtocolItem::readElement(QXmlStreamReader *xml) currentItem = dynamic_cast(getNewItem(childName + childSubType)); if (!currentItem) currentItem = new ProtocolItem_Invalid; + if (xml->attributes().value("comp").toString().toInt() == 1) + currentItem->setCompressed(true); readCurrentItem(xml); } diff --git a/common/serializable_item.cpp b/common/serializable_item.cpp index 9c1a7c81..42c14251 100644 --- a/common/serializable_item.cpp +++ b/common/serializable_item.cpp @@ -1,7 +1,8 @@ #include "serializable_item.h" #include #include -#include +#include + QHash SerializableItem::itemNameHash; SerializableItem *SerializableItem::getNewItem(const QString &name) @@ -16,6 +17,32 @@ void SerializableItem::registerSerializableItem(const QString &name, NewItemFunc itemNameHash.insert(name, func); } +bool SerializableItem::read(QXmlStreamReader *xml) +{ + if (!compressed) + return readElement(xml); + if (xml->isEndElement() && (xml->name() == itemType)) { + QByteArray uncompressedData = "" + qUncompress(QByteArray::fromBase64(compressedData)) + ""; + compressedData.clear(); + QBuffer compressedBuffer(&uncompressedData); + compressedBuffer.open(QIODevice::ReadOnly); + QXmlStreamReader *xml2 = new QXmlStreamReader(&compressedBuffer); + while (!xml2->atEnd()) { + xml2->readNext(); + if (xml2->name() == "d") + continue; + readElement(xml2); + } + delete xml2; + compressedBuffer.close(); + + return readElement(xml); + } else { + compressedData.append(xml->text().toString()); + return false; + } +} + bool SerializableItem::readElement(QXmlStreamReader *xml) { if (xml->isEndElement() && (xml->name() == itemType)) @@ -31,7 +58,19 @@ void SerializableItem::write(QXmlStreamWriter *xml) xml->writeStartElement(itemType); if (!itemSubType.isEmpty()) xml->writeAttribute("type", itemSubType); - writeElement(xml); + if (compressed) { + xml->writeAttribute("comp", "1"); + + QBuffer compressBuffer; + compressBuffer.open(QIODevice::WriteOnly); + QXmlStreamWriter *xml2 = new QXmlStreamWriter(&compressBuffer); + writeElement(xml2); + delete xml2; + compressBuffer.close(); + + xml->writeCharacters(qCompress(compressBuffer.data()).toBase64()); + } else + writeElement(xml); xml->writeEndElement(); } @@ -47,7 +86,7 @@ SerializableItem_Map::~SerializableItem_Map() bool SerializableItem_Map::readElement(QXmlStreamReader *xml) { if (currentItem) { - if (currentItem->readElement(xml)) + if (currentItem->read(xml)) currentItem = 0; return false; } else if (firstItem) @@ -57,6 +96,7 @@ bool SerializableItem_Map::readElement(QXmlStreamReader *xml) else if (xml->isStartElement()) { QString childName = xml->name().toString(); QString childSubType = xml->attributes().value("type").toString(); + bool childCompressed = xml->attributes().value("comp").toString().toInt() == 1; currentItem = itemMap.value(childName); if (!currentItem) { currentItem = getNewItem(childName + childSubType); @@ -64,7 +104,8 @@ bool SerializableItem_Map::readElement(QXmlStreamReader *xml) if (!currentItem) currentItem = new SerializableItem_Invalid(childName); } - if (currentItem->readElement(xml)) + currentItem->setCompressed(childCompressed); + if (currentItem->read(xml)) currentItem = 0; } return SerializableItem::readElement(xml); diff --git a/common/serializable_item.h b/common/serializable_item.h index 979ebb98..50da5e36 100644 --- a/common/serializable_item.h +++ b/common/serializable_item.h @@ -15,6 +15,10 @@ class QXmlStreamWriter; class SerializableItem : public QObject { Q_OBJECT +private: + bool compressed; + QByteArray compressedData; + QXmlStreamReader *compressedReader; protected: typedef SerializableItem *(*NewItemFunction)(); static QHash itemNameHash; @@ -23,7 +27,7 @@ protected: bool firstItem; public: SerializableItem(const QString &_itemType, const QString &_itemSubType = QString()) - : QObject(), itemType(_itemType), itemSubType(_itemSubType), firstItem(true) { } + : QObject(), compressed(false), itemType(_itemType), itemSubType(_itemSubType), firstItem(true) { } static void registerSerializableItem(const QString &name, NewItemFunction func); static SerializableItem *getNewItem(const QString &name); const QString &getItemType() const { return itemType; } @@ -31,6 +35,8 @@ public: virtual bool readElement(QXmlStreamReader *xml); virtual void writeElement(QXmlStreamWriter *xml) = 0; virtual bool isEmpty() const = 0; + void setCompressed(bool _compressed) { compressed = _compressed; } + bool read(QXmlStreamReader *xml); void write(QXmlStreamWriter *xml); }; diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 10729b8b..b461f833 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -286,7 +286,10 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd, CommandContain if (authState == WouldOverwriteOldSession) return RespWouldOverwriteOldSession; - enqueueProtocolItem(new Event_ServerMessage(server->getLoginMessage())); + ProtocolItem *serverMessage = new Event_ServerMessage(server->getLoginMessage()); + if (getCompressionSupport()) + serverMessage->setCompressed(true); + enqueueProtocolItem(serverMessage); QList _buddyList, _ignoreList; if (authState == PasswordRight) { @@ -303,7 +306,10 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd, CommandContain _ignoreList.append(new ServerInfo_User(ignoreIterator.next().value())); } - cont->setResponse(new Response_Login(cont->getCmdId(), RespOk, new ServerInfo_User(userInfo, true), _buddyList, _ignoreList)); + ProtocolResponse *resp = new Response_Login(cont->getCmdId(), RespOk, new ServerInfo_User(userInfo, true), _buddyList, _ignoreList); + if (getCompressionSupport()) + resp->setCompressed(true); + cont->setResponse(resp); return RespNothing; } @@ -395,7 +401,10 @@ ResponseCode Server_ProtocolHandler::cmdJoinRoom(Command_JoinRoom *cmd, CommandC } } - cont->setResponse(new Response_JoinRoom(cont->getCmdId(), RespOk, r->getInfo(true))); + ServerInfo_Room *info = r->getInfo(true); + if (getCompressionSupport()) + info->setCompressed(true); + cont->setResponse(new Response_JoinRoom(cont->getCmdId(), RespOk, info)); return RespNothing; } @@ -444,7 +453,10 @@ ResponseCode Server_ProtocolHandler::cmdListUsers(Command_ListUsers * /*cmd*/, C acceptsUserListChanges = true; - cont->setResponse(new Response_ListUsers(cont->getCmdId(), RespOk, resultList)); + ProtocolResponse *resp = new Response_ListUsers(cont->getCmdId(), RespOk, resultList); + if (getCompressionSupport()) + resp->setCompressed(true); + cont->setResponse(resp); return RespNothing; } diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index 5817da22..a73c3008 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -30,6 +30,7 @@ protected: QMap buddyList, ignoreList; void prepareDestroy(); + virtual bool getCompressionSupport() const = 0; private: QList itemQueue; QList messageSizeOverTime, messageCountOverTime; diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 14628a42..769e6588 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -33,7 +33,7 @@ #include "server_logger.h" ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent) - : Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), topLevelItem(0) + : Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), topLevelItem(0), compressionSupport(false) { xmlWriter = new QXmlStreamWriter(&xmlBuffer); xmlReader = new QXmlStreamReader; @@ -101,6 +101,8 @@ void ServerSocketInterface::readClient() if (topLevelItem) topLevelItem->readElement(xmlReader); else if (xmlReader->isStartElement() && (xmlReader->name().toString() == "cockatrice_client_stream")) { + if (xmlReader->attributes().value("comp").toString().toInt() == 1) + compressionSupport = true; topLevelItem = new TopLevelProtocolItem; connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); } @@ -295,7 +297,10 @@ ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList * /*cmd*/, Comm if (!deckListHelper(root)) return RespContextError; - cont->setResponse(new Response_DeckList(cont->getCmdId(), RespOk, root)); + ProtocolResponse *resp = new Response_DeckList(cont->getCmdId(), RespOk, root); + if (getCompressionSupport()) + resp->setCompressed(true); + cont->setResponse(resp); return RespNothing; } diff --git a/servatrice/src/serversocketinterface.h b/servatrice/src/serversocketinterface.h index a155b421..14cf7030 100644 --- a/servatrice/src/serversocketinterface.h +++ b/servatrice/src/serversocketinterface.h @@ -51,6 +51,7 @@ private: QXmlStreamReader *xmlReader; QString xmlBuffer; TopLevelProtocolItem *topLevelItem; + bool compressionSupport; int getUserIdInDB(const QString &name) const; ResponseCode cmdAddToList(Command_AddToList *cmd, CommandContainer *cont); @@ -69,6 +70,8 @@ private: ResponseCode cmdBanFromServer(Command_BanFromServer *cmd, CommandContainer *cont); ResponseCode cmdShutdownServer(Command_ShutdownServer *cmd, CommandContainer *cont); ResponseCode cmdUpdateServerMessage(Command_UpdateServerMessage *cmd, CommandContainer *cont); +protected: + bool getCompressionSupport() const { return compressionSupport; } public: ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent = 0); ~ServerSocketInterface(); From 4b84168bdaaa24b080db08c205077ae2d15f805d Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 25 Jun 2011 17:50:28 +0200 Subject: [PATCH 04/26] client/server version bump; eventConnectionStateChanged --- cockatrice/src/main.h | 2 +- cockatrice/src/messagelogwidget.cpp | 9 + cockatrice/src/messagelogwidget.h | 1 + cockatrice/src/player.cpp | 6 + cockatrice/src/player.h | 3 + cockatrice/translations/cockatrice_cs.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_de.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_en.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_es.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_fr.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_ja.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_pl.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_pt-br.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_pt.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_ru.ts | 198 ++++++++++---------- cockatrice/translations/cockatrice_sk.ts | 198 ++++++++++---------- common/protocol_item_ids.h | 79 ++++---- common/protocol_items.cpp | 6 + common/protocol_items.dat | 1 + common/protocol_items.h | 8 + common/server_game.cpp | 7 + common/server_game.h | 1 + common/server_protocolhandler.cpp | 5 +- servatrice/src/servatrice.cpp | 2 +- 24 files changed, 1232 insertions(+), 1076 deletions(-) diff --git a/cockatrice/src/main.h b/cockatrice/src/main.h index f8e5a147..3e7ad1ea 100644 --- a/cockatrice/src/main.h +++ b/cockatrice/src/main.h @@ -9,7 +9,7 @@ extern CardDatabase *db; extern QTranslator *translator; const QString translationPrefix = "cockatrice"; -const QString versionString = "0.20110303"; +const QString versionString = "0.20110625"; void installNewTranslator(); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index be218d6b..9bb86706 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -117,6 +117,14 @@ void MessageLogWidget::logGameStart() append(tr("The game has started.")); } +void MessageLogWidget::logConnectionStateChanged(Player *player, bool connectionState) +{ + if (connectionState) + append(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); + else + append(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); +} + void MessageLogWidget::logSay(Player *player, QString message) { append(QString("getLocal() ? "red" : "#0000fe") + QString("\">%1: %2").arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(message))); @@ -499,6 +507,7 @@ void MessageLogWidget::containerProcessingDone() void MessageLogWidget::connectToPlayer(Player *player) { + connect(player, SIGNAL(logConnectionStateChanged(Player *, bool)), this, SLOT(logConnectionStateChanged(Player *, bool))); connect(player, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString))); connect(player, SIGNAL(logShuffle(Player *, CardZone *)), this, SLOT(logShuffle(Player *, CardZone *))); connect(player, SIGNAL(logRollDie(Player *, int, int)), this, SLOT(logRollDie(Player *, int, int))); diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index fe548547..efc8f6b5 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -65,6 +65,7 @@ public slots: void logNotReadyStart(Player *player); void logConcede(Player *player); void logGameStart(); + void logConnectionStateChanged(Player *player, bool connectionState); void logSay(Player *player, QString message); void logSpectatorSay(QString spectatorName, QString message); void logShuffle(Player *player, CardZone *zone); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 7ebf9cdf..6dc53152 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -706,6 +706,11 @@ void Player::setCardAttrHelper(GameEventContext *context, CardItem *card, const } } +void Player::eventConnectionStateChanged(Event_ConnectionStateChanged *event) +{ + emit logConnectionStateChanged(this, event->getConnected()); +} + void Player::eventSay(Event_Say *event) { emit logSay(this, event->getMessage()); @@ -1036,6 +1041,7 @@ void Player::processGameEvent(GameEvent *event, GameEventContext *context) { qDebug() << "player event: id=" << event->getItemId(); switch (event->getItemId()) { + case ItemId_Event_ConnectionStateChanged: eventConnectionStateChanged(static_cast(event)); break; case ItemId_Event_Say: eventSay(static_cast(event)); break; case ItemId_Event_Shuffle: eventShuffle(static_cast(event)); break; case ItemId_Event_RollDie: eventRollDie(static_cast(event)); break; diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 8645d70f..72f19c26 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -26,6 +26,7 @@ class CommandContainer; class GameCommand; class GameEvent; class GameEventContext; +class Event_ConnectionStateChanged; class Event_Say; class Event_Shuffle; class Event_RollDie; @@ -69,6 +70,7 @@ class Player : public QObject, public QGraphicsItem { signals: void newCardAdded(AbstractCardItem *card); // Log events + void logConnectionStateChanged(Player *player, bool connectionState); void logSay(Player *player, QString message); void logShuffle(Player *player, CardZone *zone); void logRollDie(Player *player, int sides, int roll); @@ -176,6 +178,7 @@ private: void initSayMenu(); + void eventConnectionStateChanged(Event_ConnectionStateChanged *event); void eventSay(Event_Say *event); void eventShuffle(Event_Shuffle *event); void eventRollDie(Event_RollDie *event); diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index bea2660e..43f214c8 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -1718,17 +1718,27 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1737,188 +1747,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1927,57 +1937,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1986,7 +1996,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -1995,7 +2005,7 @@ Local version is %1, remote version is %2. - + red @@ -2004,7 +2014,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2013,7 +2023,7 @@ Local version is %1, remote version is %2. - + green @@ -2022,162 +2032,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2536,7 +2546,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2561,27 +2571,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 33c22939..38e34348 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -2485,8 +2485,8 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten - - + + a card eine Karte @@ -2629,12 +2629,22 @@ Lokale Version ist %1, Serverversion ist %2. %1 hat das Spiel aufgegeben. - + + %1 has restored connection to the game. + %1 ist wieder mit dem Spiel verbunden. + + + + %1 has lost connection to the game. + %1 hat die Verbindung zum Spiel verloren. + + + %1 shuffles %2. %1 mischt %2. - + %1 rolls a %2 with a %3-sided die. %1 würfelt eine %2 mit einem %3-seitigen Würfel. @@ -2647,7 +2657,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten. - + %1 draws %n card(s). %1 zieht eine Karte. @@ -2655,182 +2665,182 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 undoes his last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes her last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes his last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + %1 undoes her last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + from table vom Spielfeld - + from graveyard aus dem Friedhof - + from exile aus dem Exil - + from hand von der Hand - + the bottom card of his library die unterste Karte seiner Bibliothek - + the bottom card of her library die unterste Karte ihrer Bibliothek - + from the bottom of his library , die unterste Karte seiner Bibliothek, - + from the bottom of her library , die unterste Karte ihrer Bibliothek, - + the top card of his library die oberste Karte seiner Bibliothek - + the top card of her library die oberste Karte ihrer Bibliothek - + from the top of his library , die oberste Karte seiner Bibliothek, - + from the top of her library , die oberste Karte ihrer Bibliothek, - + from library aus der Bibliothek - + from sideboard aus dem Sideboard - + from the stack vom Stapel - + %1 gives %2 control over %3. %1 überlässt %2 die Kontrolle über %3. - + %1 puts %2 into play tapped%3. %1 bringt %2 getappt%3 ins Spiel. - + %1 puts %2 into play%3. %1 bringt %2%3 ins Spiel. - + %1 puts %2%3 into graveyard. %1 legt %2%3 auf den Friedhof. - + %1 exiles %2%3. %1 schickt %2%3 ins Exil. - + %1 moves %2%3 to hand. %1 nimmt %2%3 auf die Hand. - + %1 puts %2%3 into his library. %1 legt %2%3 in seine Bibliothek. - + %1 puts %2%3 into her library. %1 legt %2%3 in ihre Bibliothek. - + %1 puts %2%3 on bottom of his library. %1 legt %2%3 unter seine Bibliothek. - + %1 puts %2%3 on bottom of her library. %1 legt %2%3 unter ihre Bibliothek. - + %1 puts %2%3 on top of his library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 on top of her library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 into his library at position %4. %1 legt %2%3 in seine Bibliothek an %4. Stelle. - + %1 puts %2%3 into her library at position %4. %1 legt %2%3 in ihre Bibliothek an %4. Stelle. - + %1 moves %2%3 to sideboard. %1 legt %2%3 in sein Sideboard. - + %1 plays %2%3. %1 spielt %2%3 aus. - + %1 takes a mulligan to %n. %1 nimmt einen Mulligan auf %n. @@ -2838,52 +2848,52 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 draws his initial hand. %1 zieht seine Starthand. - + %1 draws her initial hand. %1 zieht ihre Starthand. - + %1 flips %2 face-down. %1 wendet %2 auf die Rückseite. - + %1 flips %2 face-up. %1 wendet %2 auf die Vorderseite. - + %1 destroys %2. %1 zerstört %2. - + %1 attaches %2 to %3's %4. %1 legt %2 an %3s %4 an. - + %1 unattaches %2. %1 löst %2 ab. - + %1 creates token: %2%3. %1 erstellt Token: %2%3. - + %1 points from %2's %3 to %4. %1 zeigt von %2s %3 auf %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 legt eine %2 Marke auf %3 (jetzt %4). @@ -2891,7 +2901,7 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 entfernt eine %2 Marke von %3 (jetzt %4). @@ -2899,27 +2909,27 @@ Lokale Version ist %1, Serverversion ist %2. - + her permanents ihre bleibenden Karten - + %1 randomly reveals %2%3 to %4. %1 zeigt %4 zufällig %2%3 vor. - + %1 randomly reveals %2%3. %1 zeigt zufällig %2%3 offen vor. - + %1 reveals %2%3 to %4. %1 zeigt %4 %2%3 vor. - + %1 reveals %2%3. %1 zeigt %2%3 offen vor. @@ -2928,7 +2938,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 erstellt einen Spielstein: %2 (%3). - + %1 points from %2's %3 to %4's %5. %1 zeigt von %2s %3 auf %4s %5. @@ -2947,7 +2957,7 @@ Lokale Version ist %1, Serverversion ist %2. - + red rote @@ -2955,7 +2965,7 @@ Lokale Version ist %1, Serverversion ist %2. - + yellow gelbe @@ -2963,7 +2973,7 @@ Lokale Version ist %1, Serverversion ist %2. - + green grüne @@ -2971,22 +2981,22 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 sets counter %2 to %3 (%4%5). %1 setzt Zähler %2 auf %3 (%4%5). - + %1 sets PT of %2 to %3. %1 setzt Kampfwerte von %2 auf %3. - + %1 sets annotation of %2 to %3. %1 versieht %2 mit dem Hinweis %3. - + %1 is looking at the top %2 cards %3. %1 sieht sich die obersten %2 Karten %3 an. @@ -3083,7 +3093,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4). - + %1 %2 %3. %1 %2 %3. @@ -3096,22 +3106,22 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich die obersten %2 Karten %3 an. - + %1 is looking at %2. %1 sieht sich %2 an. - + %1 stops looking at %2. %1 sieht sich %2 nicht mehr an. - + %1 reveals %2 to %3. %1 zeigt %3 %2. - + %1 reveals %2. %1 zeigt %2 offen vor. @@ -3132,7 +3142,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 zeigt %2 aus %3 offen vor. - + ending phase die Zugendphase @@ -3161,57 +3171,57 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich %2s %3 nicht mehr an - + It is now %1's turn. %1 ist am Zug. - + untap step das Enttappsegment - + upkeep step das Versorgungssegment - + draw step das Ziehsegment - + first main phase die erste Hauptphase - + beginning of combat step das Anfangssegment der Kampfphase - + declare attackers step das Angreifer-Deklarieren-Segment - + declare blockers step das Blocker-Deklarieren-Segment - + combat damage step das Kampfschadenssegment - + end of combat step das Endsegment der Kampfphase - + second main phase die zweite Hauptphase @@ -3220,7 +3230,7 @@ Lokale Version ist %1, Serverversion ist %2. das Ende-des-Zuges-Segment - + It is now the %1. Es ist nun %1. @@ -3229,12 +3239,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 bewegt %2 %3 nach %4 - + taps tappt - + untaps enttappt @@ -3259,7 +3269,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4) - + his permanents seine bleibenden Karten @@ -3272,12 +3282,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 setzt Zähler "%2" auf %3 (%4%5) - + %1 sets %2 to not untap normally. %1 setzt %2 auf explizites Enttappen. - + %1 sets %2 to untap normally. %1 setzt %2 auf normales Enttappen. @@ -3792,7 +3802,7 @@ Lokale Version ist %1, Serverversion ist %2. - + Number: Anzahl: @@ -3807,27 +3817,27 @@ Lokale Version ist %1, Serverversion ist %2. Oberste Karten ins Exil schicken - + Set power/toughness Kampfwerte setzen - + Please enter the new PT: Bitte die neuen Kampfwerte eingeben: - + Set annotation Hinweis setzen - + Please enter the new annotation: Bitte den Hinweis eingeben: - + Set counters Setze Zählmarken diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index a0cd85a4..02e8057d 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -1667,17 +1667,27 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). %1 draws a card. @@ -1685,208 +1695,208 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - + + a card - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 points from %2's %3 to %4's %5. @@ -1905,7 +1915,7 @@ Local version is %1, remote version is %2. - + red @@ -1913,7 +1923,7 @@ Local version is %1, remote version is %2. - + yellow @@ -1921,7 +1931,7 @@ Local version is %1, remote version is %2. - + green @@ -1929,22 +1939,22 @@ Local version is %1, remote version is %2. - + %1 sets counter %2 to %3 (%4%5). - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. @@ -1999,7 +2009,7 @@ Local version is %1, remote version is %2. - + %1 takes a mulligan to %n. @@ -2007,32 +2017,32 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 destroys %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 places a %2 counter on %3 (now %4). @@ -2040,7 +2050,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 removes a %2 counter from %3 (now %4). @@ -2048,142 +2058,142 @@ Local version is %1, remote version is %2. - + her permanents - + %1 %2 %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + ending phase - + It is now %1's turn. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - + taps - + untaps - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + his permanents @@ -2542,7 +2552,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2567,27 +2577,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 60757984..adb9e23a 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -2040,17 +2040,27 @@ La versión local es %1, la versión remota es %2. %1 ya no está listo para empezar el juego. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. %1 sacó un %2 con un dado de %3 caras. - + %1 draws %n card(s). %1 roba %n carta. @@ -2058,208 +2068,208 @@ La versión local es %1, la versión remota es %2. - + %1 undoes his last draw. %1 deshace su último robo. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 deshace su último robo (%2). - + %1 undoes her last draw (%2). - + from table de la mesa - + from graveyard del cementerio - + from exile del exilio - + from hand de la mano - + the bottom card of his library el fondo de la biblioteca - + the bottom card of her library - + from the bottom of his library del fondo de la biblioteca - + from the bottom of her library - + the top card of his library la parte superior de la biblioteca - + the top card of her library - + from the top of his library de la parte superior de la biblioteca - + from the top of her library - + from library de la biblioteca - + from sideboard de la reserva - + from the stack de la pila - + %1 gives %2 control over %3. %1 entrega a %2 el control sobre %3. - + %1 puts %2 into play tapped%3. %1 pone %2 en juego%3 girado. - + %1 puts %2 into play%3. %1 pone %2 en juego%3. - + %1 puts %2%3 into graveyard. %1 pone %2%3 en el cementerio. - + %1 exiles %2%3. %1 exilia %2%3. - + %1 moves %2%3 to hand. %1 mueve %2%3 a la mano. - + %1 puts %2%3 into his library. %1 pone %2%3 en la biblioteca. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 pone %2%3 en la parte inferior de su biblioteca. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 pone %2%3 en la parte superior de su biblioteca. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 pone %2%3 en su biblioteca en la posición %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 mueve %2%3 a la reserva. - + %1 plays %2%3. %1 juega %2%3. - - + + a card una carta - + %1 flips %2 face-down. %1 voltea %2 boca abajo. - + %1 flips %2 face-up. %1 voltea %2 boca arriba. - + %1 attaches %2 to %3's %4. %1 anexa %2 a el %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 points from %2's %3 to %4's %5. %1 apunta desde el %3 de %2 al %5 de %4. @@ -2278,7 +2288,7 @@ La versión local es %1, la versión remota es %2. - + red rojo @@ -2286,7 +2296,7 @@ La versión local es %1, la versión remota es %2. - + yellow amarillo @@ -2294,7 +2304,7 @@ La versión local es %1, la versión remota es %2. - + green verde @@ -2302,22 +2312,22 @@ La versión local es %1, la versión remota es %2. - + %1 sets counter %2 to %3 (%4%5). %1 establece los contadores de %2 a %3 (%4%5). - + %1 sets PT of %2 to %3. %1 establece F/R de %2 a %3. - + %1 sets annotation of %2 to %3. %1 establece la anotación de %2 a %3. - + %1 is looking at the top %2 cards %3. %1 esta mirando las primeras %2 cartas de %3. @@ -2380,22 +2390,22 @@ La versión local es %1, la versión remota es %2. %1 roba %2 cartas. - + %1 destroys %2. %1 destruye %2. - + %1 creates token: %2%3. %1 crea una ficha: %2%3. - + %1 points from %2's %3 to %4. %1 apunta desde el %3 de %2 a %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 pone %n %2 contador en %3 (ahora %4). @@ -2403,7 +2413,7 @@ La versión local es %1, la versión remota es %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 remueve %n %2 contador en %3 (ahora %4). @@ -2411,37 +2421,37 @@ La versión local es %1, la versión remota es %2. - + %1 %2 %3. %1 %2 %3. - + %1 is looking at %2. %1 está mirando: %2. - + %1 stops looking at %2. %1 termina de mirar: %2. - + %1 reveals %2 to %3. %1 revela %2 a %3. - + %1 reveals %2. %1 revela %2. - + ending phase fase de fin de turno - + It is now %1's turn. Es el turno de %1. @@ -2450,7 +2460,7 @@ La versión local es %1, la versión remota es %2. %1 baraja su biblioteca. - + %1 takes a mulligan to %n. @@ -2458,117 +2468,117 @@ La versión local es %1, la versión remota es %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + her permanents - + %1 randomly reveals %2%3 to %4. %1 revela aleatoriamente %2%3 a %4. - + %1 randomly reveals %2%3. %1 revela aleatoriamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 a %4. - + %1 reveals %2%3. %1 revela %2%3. - + untap step paso de enderezar - + upkeep step paso de mantenimiento - + draw step paso de robar - + first main phase primera fase principal - + beginning of combat step paso de inicio de combate - + declare attackers step paso de declarar atacantes - + declare blockers step paso de declarar bloqueadores - + combat damage step paso de daño de combate - + end of combat step paso de fin de combate - + second main phase segunda fase principal - + It is now the %1. Ahora es el %1. - + taps gira - + untaps endereza - + %1 sets %2 to not untap normally. %1 establece que %2 no se endereze normalmente. - + %1 sets %2 to untap normally. %1 establece que %2 se endereze normalmente. - + his permanents sus permanentes @@ -2935,7 +2945,7 @@ La versión local es %1, la versión remota es %2. - + Number: Número: @@ -2960,27 +2970,27 @@ La versión local es %1, la versión remota es %2. Número de caras: - + Set power/toughness Establecer fuerza/resistencia - + Please enter the new PT: Por favor, introduzca la nueva F/R: - + Set annotation Escribir anotación - + Please enter the new annotation: Por favor, introduza la nueva anotación: - + Set counters Establecer contadores diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index 3573db24..c8950757 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -1952,7 +1952,7 @@ La version la plus récente est %1, l'ancienne version est %2.%1 mélange sa bibliothèque. - + %1 rolls a %2 with a %3-sided die. is it always a dice? %1 lance un %2 à %3 faces. @@ -1966,169 +1966,179 @@ La version la plus récente est %1, l'ancienne version est %2.%1 pioche %2 cartes. - + from table depuis le champ de bataille - + from graveyard depuis son cimetière - + from exile depuis la zone exil - + from hand depuis sa main - + the bottom card of his library la carte du dessous de sa bibliothèque - + the bottom card of her library - + from the bottom of his library du dessous de sa bibliothèque - + from the bottom of her library - + the top card of his library le carte du dessus de sa bibliothèque - + the top card of her library - + from the top of his library du dessus de sa bibliothèque - + from the top of her library - + from library depuis sa bibliothèque - + from sideboard depuis sa réserve - + from the stack depuis la pile - + %1 puts %2 into play tapped%3. %1 met %2 en jeu engagé%3. - + %1 puts %2 into play%3. what is %3? plz exemple (resp. by Ranma : XX met island en jeu -depuis sa main-.) %1 met %2 en jeu %3. - + %1 puts %2%3 into graveyard. %1 met %2%3 dans son cimetière. - + %1 exiles %2%3. %1 exile %2%3. - + %1 moves %2%3 to hand. %1 met %2%3 dans sa main. - + %1 puts %2%3 into his library. %1 met %2%3 dans sa bibliothèque. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 met %2%3 en-dessous de sa bibliothèque. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 met %2%3 au-dessus de sa bibliothèque. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 met %2%3 dans sa bibliothèque à la position n°%4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 met %2%3 à sa réserve. - + %1 plays %2%3. %1 joue %2%3. - - + + a card une carte - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 draws %n card(s). %1 pioche %n carte. @@ -2136,32 +2146,32 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 undoes his last draw. %1 annule sa dernière pioche. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 annule sa dernière pioche (%2). - + %1 undoes her last draw (%2). - + %1 gives %2 control over %3. %1 donne le contrôle de %2 à %3. - + %1 takes a mulligan to %n. @@ -2169,54 +2179,54 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. %1 retourne %2 face cachée. - + %1 flips %2 face-up. %1 retourne %2 face visible. - + %1 destroys %2. %1 détruit %2. - + %1 attaches %2 to %3's %4. need exemple (Resp'.by Ranma: JoueurA attache Adventuring Gear sur -Plated Geopede- de -JoueurB-.) %1 attache %2 sur %4 de %3. - + %1 unattaches %2. %1 détache %2. - + %1 creates token: %2%3. %1 crée un jeton %2%3. - + %1 points from %2's %3 to %4. need exemple %1 désigne le %3 de %2 à %4. - + %1 points from %2's %3 to %4's %5. need exemple %1 désigne le %3 de %2 à %5 de %4. @@ -2238,7 +2248,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 places %n %2 counter(s) on %3 (now %4). %1 met %n %2 marqueur sur %3 (maintenant %4). @@ -2246,7 +2256,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 retire %n %2 marqueur de %3 (maintenant %4). @@ -2254,7 +2264,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + red rouge @@ -2262,7 +2272,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + yellow jaune @@ -2270,7 +2280,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + green vert @@ -2278,169 +2288,169 @@ La version la plus récente est %1, l'ancienne version est %2. - + his permanents ses permanents - + her permanents - + %1 %2 %3. wtf ? %1 %2 %3. - + taps engage - + untaps dégage - + %1 sets counter %2 to %3 (%4%5). need exemple %1 met les marqueurs %2 à %3 (%4%5). - + %1 sets %2 to not untap normally. need exemple %2 de %1 ne se dégagera pas lors de l'étape de dégagement. - + %1 sets %2 to untap normally. %2 de %1 se dégagera lors de l'étape de dégagement. - + %1 sets PT of %2 to %3. exemple plz %1 change la F/E de %2 à %3. - + %1 sets annotation of %2 to %3. %1 met l'annotation %3 à %2. - + %1 is looking at the top %2 cards %3. exemple plz %1 regarde les %2 cartes du dessus %3. - + %1 is looking at %2. exemple plz %1 regarde %2. - + %1 stops looking at %2. need exemple to be sure %1 arrête de regarder %2. - + %1 reveals %2 to %3. %1 révèle %2 à %3. - + %1 reveals %2. %1 révèle %2. - + %1 randomly reveals %2%3 to %4. %1 révèle au hasard %2%3 à %4. - + %1 randomly reveals %2%3. %1 révèle au hasard %2%3. - + %1 reveals %2%3 to %4. %1 révèle %2%3 à %4. - + %1 reveals %2%3. %1 révèle %2%3. - + It is now %1's turn. C'est maintenant le tour de %1. - + untap step étape de dégagement - + upkeep step étape d'entretien - + draw step étape de pioche - + first main phase première phase principale - + beginning of combat step étape de début du combat - + declare attackers step étape de déclaration des attaquants - + declare blockers step étape de déclaration des bloqueurs - + combat damage step étape de répartition et de résolution des blessures - + end of combat step étape de fin de combat - + second main phase seconde phase principale - + ending phase phase de fin de tour - + It is now the %1. need exemple C'est maintenant %1. @@ -2800,7 +2810,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + Number: Nombre: @@ -2825,28 +2835,28 @@ La version la plus récente est %1, l'ancienne version est %2.Nombre de faces: - + Set power/toughness Fixer force/endurance - + Please enter the new PT: maybe better with / Entrer la nouvelle F/E: - + Set annotation Mettre une note - + Please enter the new annotation: Entrez la nouvelle note: - + Set counters Mettre des marqueurs diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index 73682c83..d3bf6ce8 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -1723,225 +1723,235 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - + + a card - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 points from %2's %3 to %4's %5. @@ -1958,43 +1968,43 @@ Local version is %1, remote version is %2. - + red - + yellow - + green - + %1 sets counter %2 to %3 (%4%5). - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. @@ -2049,188 +2059,188 @@ Local version is %1, remote version is %2. - + %1 takes a mulligan to %n. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 destroys %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 places %n %2 counter(s) on %3 (now %4). - + %1 removes %n %2 counter(s) from %3 (now %4). - + her permanents - + %1 %2 %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + ending phase - + It is now %1's turn. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - + taps - + untaps - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + his permanents @@ -2589,7 +2599,7 @@ Local version is %1, remote version is %2. - + Number: 枚数 @@ -2614,27 +2624,27 @@ Local version is %1, remote version is %2. 面の数: - + Set power/toughness パワーとタフネスを設定する - + Please enter the new PT: 新しいP/Tを入力してください - + Set annotation 補足を付ける - + Please enter the new annotation: 新しい補足を付けてください - + Set counters カウンターを設定する diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 093c6668..4a1f9307 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -1718,17 +1718,27 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1737,188 +1747,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1927,57 +1937,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1986,7 +1996,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -1995,7 +2005,7 @@ Local version is %1, remote version is %2. - + red @@ -2004,7 +2014,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2013,7 +2023,7 @@ Local version is %1, remote version is %2. - + green @@ -2022,162 +2032,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2536,7 +2546,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2561,27 +2571,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index 8dd17c58..ea855248 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -1898,17 +1898,27 @@ A versão local é %1 e a versão remota é %2. %1 não está mais pronto para começar o jogo. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. %1 tirou um %2 com um dado de %3 lados. - + %1 draws %n card(s). %1 compra %n card. @@ -1916,208 +1926,208 @@ A versão local é %1 e a versão remota é %2. - + %1 undoes his last draw. %1 desfaz sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz sua última compra (%2). - + %1 undoes her last draw (%2). - + from table vindo do campo de batalha - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library o card do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library vindo do fundo do seu grimório - + from the bottom of her library - + the top card of his library o card do topo do seu grimório - + the top card of her library - + from the top of his library vindo do topo do seu grimório - + from the top of her library - + from library vindo do grimório - + from sideboard vindo do sideboard - + from the stack vindo da pilha - + %1 gives %2 control over %3. %1 dá controle para %2 sobre %3. - + %1 puts %2 into play tapped%3. %1 põe %2 em jogo virado%3. - + %1 puts %2 into play%3. %1 põe %2 no campo de batalha %3. - + %1 puts %2%3 into graveyard. %1 põe %2 no cemitério%3. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2 para a mão%3. - + %1 puts %2%3 into his library. %1 põe %2 no seu grimório%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 põe %2 no fundo do seu grimório%3. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 põe %2 no topo do seu grimório%3. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 põe %2 no seu grimório na posição %4%3. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2 para o sideboard%3. - + %1 plays %2%3. %1 põe %2 na pilha%3. - - + + a card um card - + %1 flips %2 face-down. %1 vira %2 para baixo. - + %1 flips %2 face-up. %1 vira %2 para cima. - + %1 attaches %2 to %3's %4. %1 anexa %2 a %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 points from %2's %3 to %4's %5. %1 aponta para %5 de %4 com %3 de %2. @@ -2136,7 +2146,7 @@ A versão local é %1 e a versão remota é %2. - + red vermelho @@ -2144,7 +2154,7 @@ A versão local é %1 e a versão remota é %2. - + yellow amarelo @@ -2152,7 +2162,7 @@ A versão local é %1 e a versão remota é %2. - + green verde @@ -2160,22 +2170,22 @@ A versão local é %1 e a versão remota é %2. - + %1 sets counter %2 to %3 (%4%5). %1 altera o marcador %2 para %3 (%4%5). - + %1 sets PT of %2 to %3. %1 altera o P/R de %2 para %3. - + %1 sets annotation of %2 to %3. %1 altera a nota de %2 para%3. - + %1 is looking at the top %2 cards %3. %1 está olhando para os %2 cards do topo %3. @@ -2238,22 +2248,22 @@ A versão local é %1 e a versão remota é %2. %1 compra %2 cards. - + %1 destroys %2. %1 destrói %2. - + %1 creates token: %2%3. %1 cria a ficha: %2%3. - + %1 points from %2's %3 to %4. %1 aponta para %4 com %3 de %2 . - + %1 places %n %2 counter(s) on %3 (now %4). %1 põe %n marcador %2 em %3 (agora %4). @@ -2261,7 +2271,7 @@ A versão local é %1 e a versão remota é %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 tira %n marcador %2 em %3 (agora %4). @@ -2269,37 +2279,37 @@ A versão local é %1 e a versão remota é %2. - + %1 %2 %3. %1 %2 %3. - + %1 is looking at %2. %1 está olhando para %2. - + %1 stops looking at %2. %1 para de olhar para %2. - + %1 reveals %2 to %3. %1 revela %2 para %3. - + %1 reveals %2. %1 revela %2. - + ending phase fase final - + It is now %1's turn. Agora é o turno de %1. @@ -2308,7 +2318,7 @@ A versão local é %1 e a versão remota é %2. %1 embaralha o seu grimório. - + %1 takes a mulligan to %n. @@ -2316,117 +2326,117 @@ A versão local é %1 e a versão remota é %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + her permanents - + %1 randomly reveals %2%3 to %4. %1 revela aleatoriamente %2%3. para %4. - + %1 randomly reveals %2%3. %1 revela aleatoriamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 para %4. - + %1 reveals %2%3. %1 revela %2%3. - + untap step etapa de desvirar - + upkeep step etapa de manutenção - + draw step etapa de compra - + first main phase primeira fase principal - + beginning of combat step etapa de início de combate - + declare attackers step etapa de declaracão de atacantes - + declare blockers step etapa de declaração de bloqueadores - + combat damage step etapa de dano de combate - + end of combat step etapa de fim de combate - + second main phase segunda fase principal - + It is now the %1. Agora é a %1. - + taps vira - + untaps desvira - + %1 sets %2 to not untap normally. %1 define que %2 não desvira normalmente. - + %1 sets %2 to untap normally. %1 define que %2 desvira normalmente. - + his permanents as suas permanentes @@ -2785,7 +2795,7 @@ A versão local é %1 e a versão remota é %2. - + Number: Número: @@ -2810,27 +2820,27 @@ A versão local é %1 e a versão remota é %2. Número de lados: - + Set power/toughness Alterar poder/resistência - + Please enter the new PT: Por favor, entre com o novo P/R: - + Set annotation Alterar nota - + Please enter the new annotation: Por favor, entre com a nova nota: - + Set counters Alterar marcadores diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index 7ed23d1b..ed2d3b20 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -1956,7 +1956,7 @@ Versão local é %1, versão remota é %2. %1 baralha o grimório. - + %1 rolls a %2 with a %3-sided die. %1 obteve %2 com um dado de %3 faces. @@ -1969,157 +1969,157 @@ Versão local é %1, versão remota é %2. %1 compra %2 cartas. - + from table vindo da mesa - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library a carta do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library do fundo do seu grimório - + from the bottom of her library - + the top card of his library a carta do topo do seu grimório - + the top card of her library - + from the top of his library do topo do seu grimório - + from the top of her library - + from library do grimório - + from sideboard do sideboard - + from the stack da pilha - + %1 puts %2 into play tapped%3. %1 coloca %2 em jogo virado(a)%3. - + %1 puts %2 into play%3. %1 coloca %2 em jogo %3. - + %1 puts %2%3 into graveyard. %1 coloca %2%3 no cemitério. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2%3 para a mão. - + %1 puts %2%3 into his library. %1 coloca %2%3 no seu grimório. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 coloca %2%3 no fundo do seu grimório. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 coloca %2%3 no topo do seu grimório. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 coloca %2%3 no seu grimório na posição %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2%3 para o sideboard. - + %1 plays %2%3. %1 joga %2%3. - + %1 takes a mulligan to %n. @@ -2127,17 +2127,17 @@ Versão local é %1, versão remota é %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 places %n %2 counter(s) on %3 (now %4). %1 coloca %n %2 marcador em %3 (agora com %4). @@ -2145,7 +2145,7 @@ Versão local é %1, versão remota é %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 remove %n %2 marcador de %3 (agora com %4). @@ -2153,18 +2153,28 @@ Versão local é %1, versão remota é %2. - - + + a card uma carta - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 draws %n card(s). %1 compra %n carta. @@ -2172,67 +2182,67 @@ Versão local é %1, versão remota é %2. - + %1 undoes his last draw. %1 desfaz a sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz a sua última compra (%2). - + %1 undoes her last draw (%2). - + %1 gives %2 control over %3. %1 dá controlo sobre %3 a %2. - + %1 flips %2 face-down. %1 volta a face de %2 para baixo. - + %1 flips %2 face-up. %1 volta a face de %2 para cima. - + %1 destroys %2. %1 destrói %2. - + %1 attaches %2 to %3's %4. %1 anexa %2 a %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 creates token: %2%3. %1 cria ficha: %2%3. - + %1 points from %2's %3 to %4. %1 aponta de %3 de %2 para %4. - + %1 points from %2's %3 to %4's %5. %1 aponta de %3 de %2 para %5 de %4. @@ -2251,7 +2261,7 @@ Versão local é %1, versão remota é %2. - + red vermelho @@ -2259,7 +2269,7 @@ Versão local é %1, versão remota é %2. - + yellow amarelo @@ -2267,7 +2277,7 @@ Versão local é %1, versão remota é %2. - + green verde @@ -2275,162 +2285,162 @@ Versão local é %1, versão remota é %2. - + his permanents as suas permanentes - + her permanents - + %1 %2 %3. %1 %2 %3. - + taps vira - + untaps desvira - + %1 sets counter %2 to %3 (%4%5). %1 altera o número de marcadores %2 para %3(%4%5). - + %1 sets %2 to not untap normally. %1 define %2 para não desvirar normalmente. - + %1 sets %2 to untap normally. %1 define %2 para desvirar normalmente. - + %1 sets PT of %2 to %3. %1 define o P/R de %2 como %3. - + %1 sets annotation of %2 to %3. %1 coloca uma nota de %2 em%3. - + %1 is looking at the top %2 cards %3. %1 está a olhar para as %2 cartas do topo %3. - + %1 is looking at %2. %1 está a olhar para %2. - + %1 stops looking at %2. %1 para de olhar para %2. - + %1 reveals %2 to %3. %1 revela %2 a %3. - + %1 reveals %2. %1 revela %2. - + %1 randomly reveals %2%3 to %4. %1 revela aleatoreamente %2%3. a %4. - + %1 randomly reveals %2%3. %1 revela aleatoreamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 a %4. - + %1 reveals %2%3. %1 revela %2%3. - + It is now %1's turn. É agora o turno de %1. - + untap step Etapa de Desvirar - + upkeep step Etapa de Manutenção - + draw step Etapa de Compra - + first main phase 1ª Fase Principal (pré-combate) - + beginning of combat step Etapa de Início de Combate - + declare attackers step Etapa de Declaração de Atacantes - + declare blockers step Etapa de Declaração de Bloqueadores - + combat damage step Etapa de Dano de Combate - + end of combat step Etapa de Fim de Combate - + second main phase 2ª Fase Principal (pós-combate) - + ending phase Fase Final - + It is now the %1. É agora a %1. @@ -2789,7 +2799,7 @@ Versão local é %1, versão remota é %2. - + Number: Número: @@ -2814,27 +2824,27 @@ Versão local é %1, versão remota é %2. Número de faces: - + Set power/toughness Definir poder/resistência - + Please enter the new PT: Por favor introduza o novo P/R: - + Set annotation Colocar nota - + Please enter the new annotation: Por favor introduza a nova nota: - + Set counters Definir marcadores diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index 9d7920e1..43d41057 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -1880,7 +1880,7 @@ Local version is %1, remote version is %2. %1 размешивает библиотеку. - + %1 rolls a %2 with a %3-sided die. %1 выкинул %2 / %3. @@ -1893,168 +1893,168 @@ Local version is %1, remote version is %2. %1 взял %2 карт. - + %1 undoes his last draw. %1 отменил последнее взятие. - + %1 undoes his last draw (%2). %1 отменил %2 последних взятий. - + from table с поля битвы - + from graveyard из кладбища - + from exile из изгнания - + from hand из руки - + the bottom card of his library нижнюю карту своей библиотеки - + from the bottom of his library со дна своей библиотеки - + the top card of his library верхнюю карту своей библиотеки - + from the top of his library с верха своей библиотеки - + from library из библиотеки - + from sideboard из сайда - + from the stack из стека - - + + a card карту - + %1 gives %2 control over %3. %1 передает %2 контроль над %3. - + %1 puts %2 into play%3. %1 поместил %2 на поле битвы %3. - + %1 puts %2%3 into graveyard. %1 поместил %2%3 на кладбище. - + %1 exiles %2%3. %1 изгоняет %2%3. - + %1 moves %2%3 to hand. %1 поместил %2%3 в руку. - + %1 puts %2%3 into his library. %1 поместил %2%3 в свою библиотеку. - + %1 puts %2%3 on bottom of his library. %1 поместил %2%3 на дно своей библиотеки. - + %1 puts %2%3 on top of his library. %1 поместил %2%3 на верх своей библиотеки. - + %1 puts %2%3 into his library at position %4. %1 поместил %2%3 в свою библиотеку %4 сверху. - + %1 moves %2%3 to sideboard. %1 поместил %2%3 в сайд. - + %1 plays %2%3. %1 разыгрывает %2%3. - + %1 flips %2 face-down. %1 перевернул %2 лицом вниз. - + %1 flips %2 face-up. %1 перевернул %2 лицом вверх. - + %1 destroys %2. %1 уничтожил %2. - + %1 attaches %2 to %3's %4. %1 присоединил %2 к %4 игрока %3. - + %1 unattaches %2. %1 отсоединил %2. - + %1 creates token: %2%3. %1 создал фишку: %2%3. - + %1 points from %2's %3 to %4. %1 указывает с %3 контролируемого %2 на %4. - + %1 points from %2's %3 to %4's %5. %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. @@ -2075,12 +2075,22 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 draws %n card(s). %1 взял %n карту. @@ -2089,62 +2099,62 @@ Local version is %1, remote version is %2. - + %1 undoes her last draw. - + %1 undoes her last draw (%2). - + the bottom card of her library - + from the bottom of her library - + the top card of her library - + from the top of her library - + %1 puts %2 into play tapped%3. %1 положил %2 повернутым на поле битвы%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into her library at position %4. - + %1 takes a mulligan to %n. @@ -2153,17 +2163,17 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 places %n %2 counter(s) on %3 (now %4). %1 поместил %n %2 жетон на %3 (теперь %4). @@ -2172,7 +2182,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 снял %n %2 жетон с %3 (теперь %4). @@ -2181,7 +2191,7 @@ Local version is %1, remote version is %2. - + red красный @@ -2190,7 +2200,7 @@ Local version is %1, remote version is %2. - + yellow желтый @@ -2199,7 +2209,7 @@ Local version is %1, remote version is %2. - + green зеленый @@ -2208,162 +2218,162 @@ Local version is %1, remote version is %2. - + his permanents свои перманенты - + her permanents - + %1 %2 %3. %1 %2 %3. - + taps повернул - + untaps развернул - + %1 sets counter %2 to %3 (%4%5). %1 установил жетон %2 на %3 (%4%5). - + %1 sets %2 to not untap normally. %2 теперь не разворачивается как обычно (%1). - + %1 sets %2 to untap normally. %2 теперь разворачивается как обычно (%1). - + %1 sets PT of %2 to %3. %1 установил Силу/Защиту %2 %3. - + %1 sets annotation of %2 to %3. %1 сделал пометку на %2 "%3". - + %1 is looking at the top %2 cards %3. %1 смотрит верхние %2 карт библиотеки %3. - + %1 is looking at %2. %1 просматривает %2. - + %1 stops looking at %2. %1 закончил просматривать %2. - + %1 reveals %2 to %3. %1 показывает его %2 %3. - + %1 reveals %2. %1 открыл его %2. - + %1 randomly reveals %2%3 to %4. %1 показывает случайно выбранную%3 карту (%2) %4. - + %1 randomly reveals %2%3. %1 открывает случайно выбранную%3 карту (%2). - + %1 reveals %2%3 to %4. %1 показывает%2%3 %4. - + %1 reveals %2%3. %1 открывает%2%3. - + It is now %1's turn. Ход игрока %1. - + untap step шаг разворота - + upkeep step шаг поддержки - + draw step шаг взятия карты - + first main phase первая главная фаза - + beginning of combat step шаг начала битвы - + declare attackers step шаг назначения атакующих - + declare blockers step шаг назначения блокирующих - + combat damage step шаг нанесения повреждений - + end of combat step шаг завершения битвы - + second main phase вторая главная фаза - + ending phase заключительный шаг - + It is now the %1. Сейчас %1. @@ -2722,7 +2732,7 @@ Local version is %1, remote version is %2. - + Number: Количество: @@ -2747,27 +2757,27 @@ Local version is %1, remote version is %2. Количество граней: - + Set power/toughness Установить Силу/Защиту - + Please enter the new PT: Введите новые Силу/Защиту: - + Set annotation Пометка - + Please enter the new annotation: Введите текст: - + Set counters Установить жетоны diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 835301f8..aca97b8b 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -1718,17 +1718,27 @@ Local version is %1, remote version is %2. - + + %1 has restored connection to the game. + + + + + %1 has lost connection to the game. + + + + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1737,188 +1747,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1927,57 +1937,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1986,7 +1996,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -1995,7 +2005,7 @@ Local version is %1, remote version is %2. - + red @@ -2004,7 +2014,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2013,7 +2023,7 @@ Local version is %1, remote version is %2. - + green @@ -2022,162 +2032,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2536,7 +2546,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2561,27 +2571,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index b00687cf..cbec3eb0 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -43,43 +43,44 @@ ItemId_Command_SetActivePhase = 1041, ItemId_Command_DumpZone = 1042, ItemId_Command_StopDumpZone = 1043, ItemId_Command_RevealCards = 1044, -ItemId_Event_Say = 1045, -ItemId_Event_Leave = 1046, -ItemId_Event_GameClosed = 1047, -ItemId_Event_Kicked = 1048, -ItemId_Event_Shuffle = 1049, -ItemId_Event_RollDie = 1050, -ItemId_Event_MoveCard = 1051, -ItemId_Event_FlipCard = 1052, -ItemId_Event_DestroyCard = 1053, -ItemId_Event_AttachCard = 1054, -ItemId_Event_CreateToken = 1055, -ItemId_Event_DeleteArrow = 1056, -ItemId_Event_SetCardAttr = 1057, -ItemId_Event_SetCardCounter = 1058, -ItemId_Event_SetCounter = 1059, -ItemId_Event_DelCounter = 1060, -ItemId_Event_SetActivePlayer = 1061, -ItemId_Event_SetActivePhase = 1062, -ItemId_Event_DumpZone = 1063, -ItemId_Event_StopDumpZone = 1064, -ItemId_Event_RemoveFromList = 1065, -ItemId_Event_ServerMessage = 1066, -ItemId_Event_ServerShutdown = 1067, -ItemId_Event_ConnectionClosed = 1068, -ItemId_Event_Message = 1069, -ItemId_Event_GameJoined = 1070, -ItemId_Event_UserLeft = 1071, -ItemId_Event_LeaveRoom = 1072, -ItemId_Event_RoomSay = 1073, -ItemId_Context_ReadyStart = 1074, -ItemId_Context_Concede = 1075, -ItemId_Context_DeckSelect = 1076, -ItemId_Context_UndoDraw = 1077, -ItemId_Context_MoveCard = 1078, -ItemId_Context_Mulligan = 1079, -ItemId_Command_UpdateServerMessage = 1080, -ItemId_Command_ShutdownServer = 1081, -ItemId_Command_BanFromServer = 1082, -ItemId_Other = 1083 +ItemId_Event_ConnectionStateChanged = 1045, +ItemId_Event_Say = 1046, +ItemId_Event_Leave = 1047, +ItemId_Event_GameClosed = 1048, +ItemId_Event_Kicked = 1049, +ItemId_Event_Shuffle = 1050, +ItemId_Event_RollDie = 1051, +ItemId_Event_MoveCard = 1052, +ItemId_Event_FlipCard = 1053, +ItemId_Event_DestroyCard = 1054, +ItemId_Event_AttachCard = 1055, +ItemId_Event_CreateToken = 1056, +ItemId_Event_DeleteArrow = 1057, +ItemId_Event_SetCardAttr = 1058, +ItemId_Event_SetCardCounter = 1059, +ItemId_Event_SetCounter = 1060, +ItemId_Event_DelCounter = 1061, +ItemId_Event_SetActivePlayer = 1062, +ItemId_Event_SetActivePhase = 1063, +ItemId_Event_DumpZone = 1064, +ItemId_Event_StopDumpZone = 1065, +ItemId_Event_RemoveFromList = 1066, +ItemId_Event_ServerMessage = 1067, +ItemId_Event_ServerShutdown = 1068, +ItemId_Event_ConnectionClosed = 1069, +ItemId_Event_Message = 1070, +ItemId_Event_GameJoined = 1071, +ItemId_Event_UserLeft = 1072, +ItemId_Event_LeaveRoom = 1073, +ItemId_Event_RoomSay = 1074, +ItemId_Context_ReadyStart = 1075, +ItemId_Context_Concede = 1076, +ItemId_Context_DeckSelect = 1077, +ItemId_Context_UndoDraw = 1078, +ItemId_Context_MoveCard = 1079, +ItemId_Context_Mulligan = 1080, +ItemId_Command_UpdateServerMessage = 1081, +ItemId_Command_ShutdownServer = 1082, +ItemId_Command_BanFromServer = 1083, +ItemId_Other = 1084 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 69de7319..b92a182b 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -255,6 +255,11 @@ Command_RevealCards::Command_RevealCards(int _gameId, const QString &_zoneName, insertItem(new SerializableItem_Int("card_id", _cardId)); insertItem(new SerializableItem_Int("player_id", _playerId)); } +Event_ConnectionStateChanged::Event_ConnectionStateChanged(int _playerId, bool _connected) + : GameEvent("connection_state_changed", _playerId) +{ + insertItem(new SerializableItem_Bool("connected", _connected)); +} Event_Say::Event_Say(int _playerId, const QString &_message) : GameEvent("say", _playerId) { @@ -531,6 +536,7 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("cmddump_zone", Command_DumpZone::newItem); itemNameHash.insert("cmdstop_dump_zone", Command_StopDumpZone::newItem); itemNameHash.insert("cmdreveal_cards", Command_RevealCards::newItem); + itemNameHash.insert("game_eventconnection_state_changed", Event_ConnectionStateChanged::newItem); itemNameHash.insert("game_eventsay", Event_Say::newItem); itemNameHash.insert("game_eventleave", Event_Leave::newItem); itemNameHash.insert("game_eventgame_closed", Event_GameClosed::newItem); diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 14e486c9..ab83e15a 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -42,6 +42,7 @@ 2:dump_zone:i,player_id:s,zone_name:i,number_cards 2:stop_dump_zone:i,player_id:s,zone_name 2:reveal_cards:s,zone_name:i,card_id:i,player_id +3:connection_state_changed:b,connected 3:say:s,message 3:leave 3:game_closed diff --git a/common/protocol_items.h b/common/protocol_items.h index d03a7825..810357a8 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -389,6 +389,14 @@ public: static SerializableItem *newItem() { return new Command_RevealCards; } int getItemId() const { return ItemId_Command_RevealCards; } }; +class Event_ConnectionStateChanged : public GameEvent { + Q_OBJECT +public: + Event_ConnectionStateChanged(int _playerId = -1, bool _connected = false); + bool getConnected() const { return static_cast(itemMap.value("connected"))->getData(); }; + static SerializableItem *newItem() { return new Event_ConnectionStateChanged; } + int getItemId() const { return ItemId_Event_ConnectionStateChanged; } +}; class Event_Say : public GameEvent { Q_OBJECT public: diff --git a/common/server_game.cpp b/common/server_game.cpp index 74e65ed9..85b3a151 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -341,6 +341,13 @@ void Server_Game::nextTurn() setActivePlayer(keys[listPos]); } +void Server_Game::postConnectionStatusUpdate(Server_Player *player, bool connectionStatus) +{ + QMutexLocker locker(&gameMutex); + + sendGameEvent(new Event_ConnectionStateChanged(player->getPlayerId(), connectionStatus)); +} + QList Server_Game::getGameState(Server_Player *playerWhosAsking) const { QMutexLocker locker(&gameMutex); diff --git a/common/server_game.h b/common/server_game.h index 2042a444..b34301d4 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -88,6 +88,7 @@ public: void setActivePlayer(int _activePlayer); void setActivePhase(int _activePhase); void nextTurn(); + void postConnectionStatusUpdate(Server_Player *player, bool connectionStatus); QList getGameState(Server_Player *playerWhosAsking) const; void sendGameEvent(GameEvent *event, GameEventContext *context = 0, Server_Player *exclude = 0); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index b461f833..b929edb6 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -46,8 +46,10 @@ void Server_ProtocolHandler::prepareDestroy() if ((authState == UnknownUser) || p->getSpectator()) g->removePlayer(p); - else + else { p->setProtocolHandler(0); + g->postConnectionStatusUpdate(p, false); + } } gameListMutex.unlock(); @@ -392,6 +394,7 @@ ResponseCode Server_ProtocolHandler::cmdJoinRoom(Command_JoinRoom *cmd, CommandC for (int j = 0; j < gamePlayers.size(); ++j) if (gamePlayers[j]->getUserInfo()->getName() == userInfo->getName()) { gamePlayers[j]->setProtocolHandler(this); + game->postConnectionStatusUpdate(gamePlayers[j], true); games.insert(game->getGameId(), QPair(game, gamePlayers[j])); enqueueProtocolItem(new Event_GameJoined(game->getGameId(), game->getDescription(), gamePlayers[j]->getPlayerId(), gamePlayers[j]->getSpectator(), game->getSpectatorsCanTalk(), game->getSpectatorsSeeEverything(), true)); diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 0cc2dd96..fffc1cec 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -423,4 +423,4 @@ void Servatrice::shutdownTimeout() deleteLater(); } -const QString Servatrice::versionString = "Servatrice 0.20110527"; +const QString Servatrice::versionString = "Servatrice 0.20110625"; From 05ebb83ba4276aba863b59db32a2a2f1a6ac759a Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 25 Jun 2011 21:21:19 +0200 Subject: [PATCH 05/26] improved banning; added [url] and [card] tags for chat --- cockatrice/cockatrice.pro | 1 + cockatrice/src/chatview.cpp | 144 +++++++- cockatrice/src/chatview.h | 26 +- cockatrice/src/localserver.h | 2 +- cockatrice/src/messagelogwidget.cpp | 200 ++++------- cockatrice/src/messagelogwidget.h | 21 +- cockatrice/src/tab.cpp | 30 ++ cockatrice/src/tab.h | 8 +- cockatrice/src/tab_game.cpp | 29 +- cockatrice/src/tab_game.h | 5 +- cockatrice/src/tab_message.cpp | 4 +- cockatrice/src/tab_room.cpp | 4 +- cockatrice/src/tab_supervisor.cpp | 4 +- cockatrice/src/userlist.cpp | 54 ++- cockatrice/src/userlist.h | 14 + cockatrice/translations/cockatrice_cs.ts | 361 ++++++++++--------- cockatrice/translations/cockatrice_de.ts | 362 +++++++++++--------- cockatrice/translations/cockatrice_en.ts | 361 ++++++++++--------- cockatrice/translations/cockatrice_es.ts | 357 ++++++++++--------- cockatrice/translations/cockatrice_fr.ts | 357 ++++++++++--------- cockatrice/translations/cockatrice_ja.ts | 356 ++++++++++--------- cockatrice/translations/cockatrice_pl.ts | 361 ++++++++++--------- cockatrice/translations/cockatrice_pt-br.ts | 357 ++++++++++--------- cockatrice/translations/cockatrice_pt.ts | 357 ++++++++++--------- cockatrice/translations/cockatrice_ru.ts | 357 ++++++++++--------- cockatrice/translations/cockatrice_sk.ts | 361 ++++++++++--------- common/protocol_items.cpp | 3 +- common/protocol_items.dat | 2 +- common/protocol_items.h | 3 +- common/server.cpp | 2 +- common/server.h | 3 +- common/server_protocolhandler.cpp | 2 - servatrice/servatrice.sql | 10 +- servatrice/src/servatrice.cpp | 35 +- servatrice/src/servatrice.h | 5 +- servatrice/src/serversocketinterface.cpp | 16 +- 36 files changed, 2501 insertions(+), 2073 deletions(-) create mode 100644 cockatrice/src/tab.cpp diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index 04599409..b126f14a 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -136,6 +136,7 @@ SOURCES += src/abstractcounter.cpp \ src/gamescene.cpp \ src/arrowitem.cpp \ src/arrowtarget.cpp \ + src/tab.cpp \ src/tab_server.cpp \ src/tab_room.cpp \ src/tab_message.cpp \ diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index 625301e3..700313ee 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -2,34 +2,41 @@ #include #include #include +#include +#include #include "chatview.h" -ChatView::ChatView(const QString &_ownName, QWidget *parent) - : QTextEdit(parent), ownName(_ownName) +ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent) + : QTextBrowser(parent), ownName(_ownName), showTimestamps(_showTimestamps) { - setTextInteractionFlags(Qt::TextSelectableByMouse); + setReadOnly(true); + setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse); + setOpenLinks(false); + connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(openLink(const QUrl &))); } -void ChatView::appendMessage(QString sender, const QString &message) +void ChatView::appendMessage(QString sender, QString message) { QTextCursor cursor(document()->lastBlock()); cursor.movePosition(QTextCursor::End); QTextBlockFormat blockFormat; - blockFormat.setBottomMargin(3); + blockFormat.setBottomMargin(2); cursor.insertBlock(blockFormat); - QTextCharFormat timeFormat; - timeFormat.setForeground(Qt::black); - cursor.setCharFormat(timeFormat); - cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm] ")); + if (showTimestamps) { + QTextCharFormat timeFormat; + timeFormat.setForeground(Qt::black); + cursor.setCharFormat(timeFormat); + cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm] ")); + } QTextCharFormat senderFormat; if (sender == ownName) { senderFormat.setFontWeight(QFont::Bold); senderFormat.setForeground(Qt::red); } else - senderFormat.setForeground(Qt::blue); + senderFormat.setForeground(QColor(0, 0, 254)); cursor.setCharFormat(senderFormat); if (!sender.isEmpty()) sender.append(": "); @@ -39,7 +46,122 @@ void ChatView::appendMessage(QString sender, const QString &message) if (sender.isEmpty()) messageFormat.setForeground(Qt::darkGreen); cursor.setCharFormat(messageFormat); - cursor.insertText(message); + + int from = 0, index = 0; + while ((index = message.indexOf('[', from)) != -1) { + cursor.insertText(message.left(index)); + message = message.mid(index); + if (message.isEmpty()) + break; + + if (message.startsWith("[card]")) { + message = message.mid(6); + QTextCharFormat tempFormat = messageFormat; + tempFormat.setForeground(Qt::blue); + cursor.setCharFormat(tempFormat); + int closeTagIndex = message.indexOf("[/card]"); + cursor.insertText(message.left(closeTagIndex)); + cursor.setCharFormat(messageFormat); + if (closeTagIndex == -1) + message.clear(); + else + message = message.mid(closeTagIndex + 7); + } else if (message.startsWith("[url]")) { + message = message.mid(5); + int closeTagIndex = message.indexOf("[/url]"); + QString url = message.left(closeTagIndex); + if (!url.startsWith("http://")) + url.prepend("http://"); + QTextCharFormat tempFormat = messageFormat; + tempFormat.setForeground(QColor(0, 0, 254)); + tempFormat.setAnchor(true); + tempFormat.setAnchorHref(url); + cursor.setCharFormat(tempFormat); + cursor.insertText(url); + cursor.setCharFormat(messageFormat); + if (closeTagIndex == -1) + message.clear(); + else + message = message.mid(closeTagIndex + 6); + } else + from = 1; + } + if (!message.isEmpty()) + cursor.insertText(message); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } + +void ChatView::enterEvent(QEvent * /*event*/) +{ + setMouseTracking(true); +} + +void ChatView::leaveEvent(QEvent * /*event*/) +{ + setMouseTracking(false); +} + +QTextFragment ChatView::getFragmentUnderMouse(const QPoint &pos) const +{ + QTextCursor cursor(cursorForPosition(pos)); + QTextBlock block(cursor.block()); + QTextBlock::iterator it; + for (it = block.begin(); !(it.atEnd()); ++it) { + QTextFragment frag = it.fragment(); + if (frag.contains(cursor.position())) + return frag; + } + return QTextFragment(); +} + +QString ChatView::getCardNameUnderMouse(QTextFragment frag) const +{ + if (frag.charFormat().foreground().color() == Qt::blue) + return frag.text(); + return QString(); +} + +QString ChatView::getCardNameUnderMouse(const QPoint &pos) const +{ + return getCardNameUnderMouse(getFragmentUnderMouse(pos)); +} + +void ChatView::mouseMoveEvent(QMouseEvent *event) +{ + QTextFragment frag = getFragmentUnderMouse(event->pos()); + QString cardName = getCardNameUnderMouse(frag); + if (!cardName.isEmpty()) { + viewport()->setCursor(Qt::PointingHandCursor); + emit cardNameHovered(cardName); + } else if (frag.charFormat().isAnchor()) + viewport()->setCursor(Qt::PointingHandCursor); + else + viewport()->setCursor(Qt::IBeamCursor); + + QTextBrowser::mouseMoveEvent(event); +} + +void ChatView::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::MidButton) { + QString cardName = getCardNameUnderMouse(event->pos()); + if (!cardName.isEmpty()) + emit showCardInfoPopup(event->globalPos(), cardName); + } + + QTextBrowser::mousePressEvent(event); +} + +void ChatView::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::MidButton) + emit deleteCardInfoPopup(); + + QTextBrowser::mouseReleaseEvent(event); +} + +void ChatView::openLink(const QUrl &link) +{ + QDesktopServices::openUrl(link); +} diff --git a/cockatrice/src/chatview.h b/cockatrice/src/chatview.h index bd7e763a..c17f2375 100644 --- a/cockatrice/src/chatview.h +++ b/cockatrice/src/chatview.h @@ -1,18 +1,36 @@ #ifndef CHATVIEW_H #define CHATVIEW_H -#include +#include +#include class QTextTable; +class QMouseEvent; -class ChatView : public QTextEdit { +class ChatView : public QTextBrowser { Q_OBJECT; private: QTextTable *table; QString ownName; + bool showTimestamps; + QTextFragment getFragmentUnderMouse(const QPoint &pos) const; + QString getCardNameUnderMouse(QTextFragment frag) const; + QString getCardNameUnderMouse(const QPoint &pos) const; +private slots: + void openLink(const QUrl &link); public: - ChatView(const QString &_ownName, QWidget *parent = 0); - void appendMessage(QString sender, const QString &message); + ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent = 0); + void appendMessage(QString sender, QString message); +protected: + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); +signals: + void cardNameHovered(QString cardName); + void showCardInfoPopup(QPoint pos, QString cardName); + void deleteCardInfoPopup(); }; #endif \ No newline at end of file diff --git a/cockatrice/src/localserver.h b/cockatrice/src/localserver.h index b68e4f25..406b3bff 100644 --- a/cockatrice/src/localserver.h +++ b/cockatrice/src/localserver.h @@ -11,7 +11,7 @@ class LocalServer : public Server public: LocalServer(QObject *parent = 0); ~LocalServer(); - AuthenticationResult checkUserPassword(const QString & /*user*/, const QString & /*password*/) { return UnknownUser; } + AuthenticationResult checkUserPassword(Server_ProtocolHandler * /*handler*/, const QString & /*user*/, const QString & /*password*/) { return UnknownUser; } QString getLoginMessage() const { return QString(); } bool getGameShouldPing() const { return false; } int getMaxGameInactivityTime() const { return 9999999; } diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 9bb86706..216fe138 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -1,11 +1,9 @@ #include "messagelogwidget.h" #include "player.h" #include "cardzone.h" -#include "cardinfowidget.h" #include "protocol_items.h" #include "soundengine.h" -#include -#include +#include QString MessageLogWidget::sanitizeHtml(QString dirty) const { @@ -15,6 +13,20 @@ QString MessageLogWidget::sanitizeHtml(QString dirty) const .replace(">", ">"); } +void MessageLogWidget::myAppend(const QString &message) +{ + QTextCursor cursor(document()->lastBlock()); + cursor.movePosition(QTextCursor::End); + + QTextBlockFormat blockFormat; + blockFormat.setBottomMargin(2); + cursor.insertBlock(blockFormat); + + cursor.insertHtml(message); + + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); +} + bool MessageLogWidget::isFemale(Player *player) const { return player->getUserInfo()->getGender() == ServerInfo_User::Female; @@ -22,129 +34,129 @@ bool MessageLogWidget::isFemale(Player *player) const void MessageLogWidget::logConnecting(QString hostname) { - append(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); + myAppend(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); } void MessageLogWidget::logConnected() { - append(tr("Connected.")); + myAppend(tr("Connected.")); } void MessageLogWidget::logDisconnected() { - append(tr("Disconnected from server.")); + myAppend(tr("Disconnected from server.")); } void MessageLogWidget::logSocketError(const QString &errorString) { - append(sanitizeHtml(errorString)); + myAppend(sanitizeHtml(errorString)); } void MessageLogWidget::logServerError(ResponseCode response) { switch (response) { - case RespWrongPassword: append(tr("Invalid password.")); break; + case RespWrongPassword: myAppend(tr("Invalid password.")); break; default: ; } } void MessageLogWidget::logProtocolVersionMismatch(int clientVersion, int serverVersion) { - append(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion)); + myAppend(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion)); } void MessageLogWidget::logProtocolError() { - append(tr("Protocol error.")); + myAppend(tr("Protocol error.")); } void MessageLogWidget::logGameJoined(int gameId) { - append(tr("You have joined game #%1.").arg(gameId)); + myAppend(tr("You have joined game #%1.").arg(gameId)); } void MessageLogWidget::logJoin(Player *player) { soundEngine->notification(); - append(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logLeave(Player *player) { - append(tr("%1 has left the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has left the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameClosed() { - append(tr("The game has been closed.")); + myAppend(tr("The game has been closed.")); } void MessageLogWidget::logJoinSpectator(QString name) { - append(tr("%1 is now watching the game.").arg(sanitizeHtml(name))); + myAppend(tr("%1 is now watching the game.").arg(sanitizeHtml(name))); } void MessageLogWidget::logLeaveSpectator(QString name) { - append(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); + myAppend(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); } void MessageLogWidget::logDeckSelect(Player *player, int deckId) { if (deckId == -1) - append(tr("%1 has loaded a local deck.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has loaded a local deck.").arg(sanitizeHtml(player->getName()))); else - append(tr("%1 has loaded deck #%2.").arg(sanitizeHtml(player->getName())).arg(deckId)); + myAppend(tr("%1 has loaded deck #%2.").arg(sanitizeHtml(player->getName())).arg(deckId)); } void MessageLogWidget::logReadyStart(Player *player) { - append(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logNotReadyStart(Player *player) { - append(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logConcede(Player *player) { - append(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameStart() { - append(tr("The game has started.")); + myAppend(tr("The game has started.")); } void MessageLogWidget::logConnectionStateChanged(Player *player, bool connectionState) { if (connectionState) - append(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); else - append(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logSay(Player *player, QString message) { - append(QString("getLocal() ? "red" : "#0000fe") + QString("\">%1: %2").arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(message))); + appendMessage(player->getName(), message); } void MessageLogWidget::logSpectatorSay(QString spectatorName, QString message) { - append(QString("%1: %2").arg(sanitizeHtml(spectatorName)).arg(sanitizeHtml(message))); + myAppend(QString("%1: %2").arg(sanitizeHtml(spectatorName)).arg(sanitizeHtml(message))); } void MessageLogWidget::logShuffle(Player *player, CardZone *zone) { soundEngine->shuffle(); if (currentContext != MessageContext_Mulligan) - append(tr("%1 shuffles %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + myAppend(tr("%1 shuffles %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); } void MessageLogWidget::logRollDie(Player *player, int sides, int roll) { - append(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); + myAppend(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); } void MessageLogWidget::logDrawCards(Player *player, int number) @@ -153,16 +165,16 @@ void MessageLogWidget::logDrawCards(Player *player, int number) mulliganPlayer = player; else { soundEngine->draw(); - append(tr("%1 draws %n card(s).", "", number).arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 draws %n card(s).", "", number).arg(sanitizeHtml(player->getName()))); } } void MessageLogWidget::logUndoDraw(Player *player, QString cardName) { if (cardName.isEmpty()) - append((isFemale(player) ? tr("%1 undoes her last draw.") : tr("%1 undoes his last draw.")).arg(sanitizeHtml(player->getName()))); + myAppend((isFemale(player) ? tr("%1 undoes her last draw.") : tr("%1 undoes his last draw.")).arg(sanitizeHtml(player->getName()))); else - append((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + myAppend((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } QPair MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const @@ -227,7 +239,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) cardStr = QString("%1").arg(sanitizeHtml(cardName)); if (attributes.startZone->getPlayer() != attributes.targetZone->getPlayer()) { - append(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr)); + myAppend(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr)); return; } @@ -260,7 +272,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) finalStr = tr("%1 plays %2%3."); } - append(finalStr.arg(sanitizeHtml(attributes.player->getName())).arg(cardStr).arg(fromStr).arg(attributes.newX)); + myAppend(finalStr.arg(sanitizeHtml(attributes.player->getName())).arg(cardStr).arg(fromStr).arg(attributes.newX)); } void MessageLogWidget::logMoveCard(Player *player, CardItem *card, CardZone *startZone, int oldX, CardZone *targetZone, int newX) @@ -280,50 +292,50 @@ void MessageLogWidget::logMulligan(Player *player, int number) return; if (number > -1) - append(tr("%1 takes a mulligan to %n.", "", number).arg(sanitizeHtml(player->getName()))); + myAppend(tr("%1 takes a mulligan to %n.", "", number).arg(sanitizeHtml(player->getName()))); else - append((isFemale(player) ? tr("%1 draws her initial hand.") : tr("%1 draws his initial hand.")).arg(sanitizeHtml(player->getName()))); + myAppend((isFemale(player) ? tr("%1 draws her initial hand.") : tr("%1 draws his initial hand.")).arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logFlipCard(Player *player, QString cardName, bool faceDown) { if (faceDown) - append(tr("%1 flips %2 face-down.").arg(sanitizeHtml(player->getName())).arg(cardName)); + myAppend(tr("%1 flips %2 face-down.").arg(sanitizeHtml(player->getName())).arg(cardName)); else - append(tr("%1 flips %2 face-up.").arg(sanitizeHtml(player->getName())).arg(cardName)); + myAppend(tr("%1 flips %2 face-up.").arg(sanitizeHtml(player->getName())).arg(cardName)); } void MessageLogWidget::logDestroyCard(Player *player, QString cardName) { - append(tr("%1 destroys %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + myAppend(tr("%1 destroys %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logAttachCard(Player *player, QString cardName, Player *targetPlayer, QString targetCardName) { - append(tr("%1 attaches %2 to %3's %4.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); + myAppend(tr("%1 attaches %2 to %3's %4.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); } void MessageLogWidget::logUnattachCard(Player *player, QString cardName) { - append(tr("%1 unattaches %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + myAppend(tr("%1 unattaches %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logCreateToken(Player *player, QString cardName, QString pt) { - append(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); + myAppend(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); } void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool playerTarget) { if (playerTarget) - append(tr("%1 points from %2's %3 to %4.") + myAppend(tr("%1 points from %2's %3 to %4.") .arg(sanitizeHtml(player->getName())) .arg(sanitizeHtml(startPlayer->getName())) .arg(sanitizeHtml(startCard)) .arg(sanitizeHtml(targetPlayer->getName())) ); else - append(tr("%1 points from %2's %3 to %4's %5.") + myAppend(tr("%1 points from %2's %3 to %4's %5.") .arg(sanitizeHtml(player->getName())) .arg(sanitizeHtml(startPlayer->getName())) .arg(sanitizeHtml(startCard)) @@ -349,7 +361,7 @@ void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int c default: ; } - append(finalStr.arg(sanitizeHtml(player->getName())).arg(colorStr).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(value)); + myAppend(finalStr.arg(sanitizeHtml(player->getName())).arg(colorStr).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(value)); } void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) @@ -367,13 +379,13 @@ void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) cardStr = isFemale(player) ? tr("her permanents") : tr("his permanents"); else cardStr = QString("%1").arg(sanitizeHtml(card->getName())); - append(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); + myAppend(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); } } void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue) { - append(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); + myAppend(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); } void MessageLogWidget::logSetDoesntUntap(Player *player, CardItem *card, bool doesntUntap) @@ -383,7 +395,7 @@ void MessageLogWidget::logSetDoesntUntap(Player *player, CardItem *card, bool do finalStr = tr("%1 sets %2 to not untap normally."); else finalStr = tr("%1 sets %2 to untap normally."); - append(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); + myAppend(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); } void MessageLogWidget::logSetPT(Player *player, CardItem *card, QString newPT) @@ -391,26 +403,26 @@ void MessageLogWidget::logSetPT(Player *player, CardItem *card, QString newPT) if (currentContext == MessageContext_MoveCard) moveCardPT.insert(card, newPT); else - append(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); + myAppend(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); } void MessageLogWidget::logSetAnnotation(Player *player, CardItem *card, QString newAnnotation) { - append(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); + myAppend(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); } void MessageLogWidget::logDumpZone(Player *player, CardZone *zone, int numberCards) { if (numberCards != -1) - append(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); + myAppend(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); else - append(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); + myAppend(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); } void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone) { QString zoneName = zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative); - append(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); + myAppend(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); } void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer) @@ -433,28 +445,28 @@ void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId if (cardId == -1) { if (otherPlayer) - append(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); + myAppend(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); else - append(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + myAppend(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); } else if (cardId == -2) { if (otherPlayer) - append(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + myAppend(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); else - append(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + myAppend(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); } else { if (otherPlayer) - append(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + myAppend(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); else - append(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + myAppend(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); } } void MessageLogWidget::logSetActivePlayer(Player *player) { soundEngine->notification(); - append(QString()); - append("" + tr("It is now %1's turn.").arg(player->getName()) + ""); - append(QString()); + myAppend(QString()); + myAppend("" + tr("It is now %1's turn.").arg(player->getName()) + ""); + myAppend(QString()); } void MessageLogWidget::logSetActivePhase(int phase) @@ -474,7 +486,7 @@ void MessageLogWidget::logSetActivePhase(int phase) case 9: phaseName = tr("second main phase"); break; case 10: phaseName = tr("ending phase"); break; } - append("" + tr("It is now the %1.").arg(phaseName) + ""); + myAppend("" + tr("It is now the %1.").arg(phaseName) + ""); } void MessageLogWidget::containerProcessingStarted(GameEventContext *_context) @@ -531,67 +543,7 @@ void MessageLogWidget::connectToPlayer(Player *player) connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *))); } -MessageLogWidget::MessageLogWidget(QWidget *parent) - : QTextEdit(parent) +MessageLogWidget::MessageLogWidget(const QString &_ownName, QWidget *parent) + : ChatView(_ownName, false, parent) { - setReadOnly(true); -} - -void MessageLogWidget::enterEvent(QEvent * /*event*/) -{ - setMouseTracking(true); -} - -void MessageLogWidget::leaveEvent(QEvent * /*event*/) -{ - setMouseTracking(false); -} - -QString MessageLogWidget::getCardNameUnderMouse(const QPoint &pos) const -{ - QTextCursor cursor(cursorForPosition(pos)); - QTextBlock block(cursor.block()); - QTextBlock::iterator it; - for (it = block.begin(); !(it.atEnd()); ++it) { - QTextFragment frag = it.fragment(); - if (!frag.contains(cursor.position())) - continue; - - if (frag.charFormat().foreground().color() == Qt::blue) - return frag.text(); - - break; - } - return QString(); -} - -void MessageLogWidget::mouseMoveEvent(QMouseEvent *event) -{ - QString cardName = getCardNameUnderMouse(event->pos()); - if (!cardName.isEmpty()) { - viewport()->setCursor(Qt::PointingHandCursor); - emit cardNameHovered(cardName); - } else - viewport()->setCursor(Qt::IBeamCursor); - - QTextEdit::mouseMoveEvent(event); -} - -void MessageLogWidget::mousePressEvent(QMouseEvent *event) -{ - if (event->button() == Qt::MidButton) { - QString cardName = getCardNameUnderMouse(event->pos()); - if (!cardName.isEmpty()) - emit showCardInfoPopup(event->globalPos(), cardName); - } - - QTextEdit::mousePressEvent(event); -} - -void MessageLogWidget::mouseReleaseEvent(QMouseEvent *event) -{ - if (event->button() == Qt::MidButton) - emit deleteCardInfoPopup(); - - QTextEdit::mouseReleaseEvent(event); } diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index efc8f6b5..c99851af 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -1,15 +1,13 @@ #ifndef MESSAGELOGWIDGET_H #define MESSAGELOGWIDGET_H -#include +#include "chatview.h" #include #include "translation.h" #include "protocol_datastructures.h" class Player; class CardZone; -class QMouseEvent; -class QEvent; class CardInfoWidget; class GameEventContext; class CardItem; @@ -24,16 +22,15 @@ struct LogMoveCard { int newX; }; -class MessageLogWidget : public QTextEdit { +class MessageLogWidget : public ChatView { Q_OBJECT private: enum MessageContext { MessageContext_None, MessageContext_MoveCard, MessageContext_Mulligan }; - CardInfoWidget *infoWidget; QString sanitizeHtml(QString dirty) const; + void myAppend(const QString &message); bool isFemale(Player *player) const; QPair getFromStr(CardZone *zone, QString cardName, int position) const; - QString getCardNameUnderMouse(const QPoint &pos) const; MessageContext currentContext; QList moveCardQueue; @@ -42,10 +39,6 @@ private: Player *mulliganPlayer; int mulliganNumber; -signals: - void cardNameHovered(QString cardName); - void showCardInfoPopup(QPoint pos, QString cardName); - void deleteCardInfoPopup(); public slots: void logConnecting(QString hostname); void logConnected(); @@ -96,13 +89,7 @@ public slots: void containerProcessingDone(); public: void connectToPlayer(Player *player); - MessageLogWidget(QWidget *parent = 0); -protected: - void enterEvent(QEvent *event); - void leaveEvent(QEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); + MessageLogWidget(const QString &_ownName, QWidget *parent = 0); }; #endif diff --git a/cockatrice/src/tab.cpp b/cockatrice/src/tab.cpp new file mode 100644 index 00000000..e85d4091 --- /dev/null +++ b/cockatrice/src/tab.cpp @@ -0,0 +1,30 @@ +#include "tab.h" +#include "cardinfowidget.h" +#include +#include + +Tab::Tab(TabSupervisor *_tabSupervisor, QWidget *parent) + : QWidget(parent), tabMenu(0), tabSupervisor(_tabSupervisor), contentsChanged(false), infoPopup(0) +{ +} + +void Tab::showCardInfoPopup(const QPoint &pos, const QString &cardName) +{ + infoPopup = new CardInfoWidget(CardInfoWidget::ModePopUp, 0, Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint); + infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents); + infoPopup->setCard(cardName); + QRect screenRect = qApp->desktop()->screenGeometry(this); + infoPopup->move( + qMax(screenRect.left(), qMin(pos.x() - infoPopup->width() / 2, screenRect.left() + screenRect.width() - infoPopup->width())), + qMax(screenRect.top(), qMin(pos.y() - infoPopup->height() / 2, screenRect.top() + screenRect.height() - infoPopup->height())) + ); + infoPopup->show(); +} + +void Tab::deleteCardInfoPopup() +{ + if (infoPopup) { + infoPopup->deleteLater(); + infoPopup = 0; + } +} diff --git a/cockatrice/src/tab.h b/cockatrice/src/tab.h index 5f50813c..ac4b0ea5 100644 --- a/cockatrice/src/tab.h +++ b/cockatrice/src/tab.h @@ -5,6 +5,7 @@ class QMenu; class TabSupervisor; +class CardInfoWidget; class Tab : public QWidget { Q_OBJECT @@ -13,11 +14,14 @@ signals: protected: QMenu *tabMenu; TabSupervisor *tabSupervisor; +protected slots: + void showCardInfoPopup(const QPoint &pos, const QString &cardName); + void deleteCardInfoPopup(); private: bool contentsChanged; + CardInfoWidget *infoPopup; public: - Tab(TabSupervisor *_tabSupervisor, QWidget *parent = 0) - : QWidget(parent), tabMenu(0), tabSupervisor(_tabSupervisor), contentsChanged(false) { } + Tab(TabSupervisor *_tabSupervisor, QWidget *parent = 0); QMenu *getTabMenu() const { return tabMenu; } bool getContentsChanged() const { return contentsChanged; } void setContentsChanged(bool _contentsChanged) { contentsChanged = _contentsChanged; } diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index e8018c98..04c15c50 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -5,8 +5,6 @@ #include #include #include -#include -#include #include "tab_game.h" #include "cardinfowidget.h" #include "playerlistwidget.h" @@ -160,8 +158,8 @@ void DeckViewContainer::setDeck(DeckList *deck) readyStartButton->setEnabled(true); } -TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming) - : Tab(_tabSupervisor), clients(_clients), gameId(_gameId), gameDescription(_gameDescription), localPlayerId(_localPlayerId), spectator(_spectator), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), started(false), resuming(_resuming), currentPhase(-1), infoPopup(0) +TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, const QString &_userName, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming) + : Tab(_tabSupervisor), clients(_clients), gameId(_gameId), gameDescription(_gameDescription), localPlayerId(_localPlayerId), spectator(_spectator), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), started(false), resuming(_resuming), currentPhase(-1) { phasesToolbar = new PhasesToolbar; phasesToolbar->hide(); @@ -178,7 +176,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client timeElapsedLabel = new QLabel; timeElapsedLabel->setAlignment(Qt::AlignCenter); - messageLog = new MessageLogWidget; + messageLog = new MessageLogWidget(_userName); connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfo, SLOT(setCard(QString))); connect(messageLog, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); connect(messageLog, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); @@ -779,24 +777,3 @@ Player *TabGame::getActiveLocalPlayer() const return 0; } - -void TabGame::showCardInfoPopup(const QPoint &pos, const QString &cardName) -{ - infoPopup = new CardInfoWidget(CardInfoWidget::ModePopUp, 0, Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint); - infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents); - infoPopup->setCard(cardName); - QRect screenRect = qApp->desktop()->screenGeometry(this); - infoPopup->move( - qMax(screenRect.left(), qMin(pos.x() - infoPopup->width() / 2, screenRect.left() + screenRect.width() - infoPopup->width())), - qMax(screenRect.top(), qMin(pos.y() - infoPopup->height() / 2, screenRect.top() + screenRect.height() - infoPopup->height())) - ); - infoPopup->show(); -} - -void TabGame::deleteCardInfoPopup() -{ - if (infoPopup) { - infoPopup->deleteLater(); - infoPopup = 0; - } -} diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index 5982b42b..289451f1 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -100,7 +100,6 @@ private: int activePlayer; QSplitter *splitter; - CardInfoWidget *infoPopup; CardInfoWidget *cardInfo; PlayerListWidget *playerListWidget; QLabel *timeElapsedLabel; @@ -147,8 +146,6 @@ signals: void openMessageDialog(const QString &userName, bool focus); private slots: void newCardAdded(AbstractCardItem *card); - void showCardInfoPopup(const QPoint &pos, const QString &cardName); - void deleteCardInfoPopup(); void actConcede(); void actLeaveGame(); @@ -158,7 +155,7 @@ private slots: void actNextPhase(); void actNextTurn(); public: - TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming); + TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, const QString &_userName, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming); ~TabGame(); void retranslateUi(); void closeRequest(); diff --git a/cockatrice/src/tab_message.cpp b/cockatrice/src/tab_message.cpp index 03fb401f..c79fbfee 100644 --- a/cockatrice/src/tab_message.cpp +++ b/cockatrice/src/tab_message.cpp @@ -11,7 +11,9 @@ TabMessage::TabMessage(TabSupervisor *_tabSupervisor, AbstractClient *_client, const QString &_ownName, const QString &_userName) : Tab(_tabSupervisor), client(_client), userName(_userName), userOnline(true) { - chatView = new ChatView(_ownName); + chatView = new ChatView(_ownName, true); + connect(chatView, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); + connect(chatView, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); sayEdit = new QLineEdit; connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage())); diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index d72e13ef..621b4b08 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -137,7 +137,9 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, const Q userList = new UserList(tabSupervisor, client, UserList::RoomList); connect(userList, SIGNAL(openMessageDialog(const QString &, bool)), this, SIGNAL(openMessageDialog(const QString &, bool))); - chatView = new ChatView(ownName); + chatView = new ChatView(ownName, true); + connect(chatView, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); + connect(chatView, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); sayLabel = new QLabel; sayEdit = new QLineEdit; sayLabel->setBuddy(sayEdit); diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index c9cdc5d5..10e33aff 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -221,7 +221,7 @@ void TabSupervisor::addCloseButtonToTab(Tab *tab, int tabIndex) void TabSupervisor::gameJoined(Event_GameJoined *event) { - TabGame *tab = new TabGame(this, QList() << client, event->getGameId(), event->getGameDescription(), event->getPlayerId(), event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); + TabGame *tab = new TabGame(this, QList() << client, event->getGameId(), event->getGameDescription(), event->getPlayerId(), userName, event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *))); connect(tab, SIGNAL(openMessageDialog(const QString &, bool)), this, SLOT(addMessageTab(const QString &, bool))); int tabIndex = myAddTab(tab); @@ -232,7 +232,7 @@ void TabSupervisor::gameJoined(Event_GameJoined *event) void TabSupervisor::localGameJoined(Event_GameJoined *event) { - TabGame *tab = new TabGame(this, localClients, event->getGameId(), event->getGameDescription(), event->getPlayerId(), event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); + TabGame *tab = new TabGame(this, localClients, event->getGameId(), event->getGameDescription(), event->getPlayerId(), QString(), event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *))); int tabIndex = myAddTab(tab); addCloseButtonToTab(tab, tabIndex); diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index c904513c..02a04a6e 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -10,6 +10,53 @@ #include #include #include +#include +#include +#include +#include +#include + +BanDialog::BanDialog(QWidget *parent) + : QDialog(parent) +{ + QLabel *durationLabel = new QLabel(tr("Please enter the duration of the ban (in minutes).\nEnter 0 for an indefinite ban.")); + durationEdit = new QSpinBox; + durationEdit->setMinimum(0); + durationEdit->setValue(5); + QLabel *reasonLabel = new QLabel(tr("Please enter the reason for the ban.\nThis is only saved for moderators and cannot be seen by the banned person.")); + reasonEdit = new QPlainTextEdit; + + QPushButton *okButton = new QPushButton(tr("&OK")); + okButton->setAutoDefault(true); + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); + QPushButton *cancelButton = new QPushButton(tr("&Cancel")); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(okButton); + buttonLayout->addWidget(cancelButton); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->addWidget(durationLabel); + vbox->addWidget(durationEdit); + vbox->addWidget(reasonLabel); + vbox->addWidget(reasonEdit); + vbox->addLayout(buttonLayout); + + setLayout(vbox); + setWindowTitle(tr("Ban user from server")); +} + +int BanDialog::getMinutes() const +{ + return durationEdit->value(); +} + +QString BanDialog::getReason() const +{ + return reasonEdit->toPlainText(); +} UserListItemDelegate::UserListItemDelegate(QObject *const parent) : QStyledItemDelegate(parent) @@ -215,10 +262,9 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) else if (actionClicked == aRemoveFromIgnoreList) client->sendCommand(new Command_RemoveFromList("ignore", userName)); else if (actionClicked == aBan) { - bool ok; - int minutes = QInputDialog::getInt(this, tr("Duration"), tr("Please enter the duration of the ban (in minutes).\nEnter 0 for an indefinite ban."), 0, 0, 2147483647, 10, &ok); - if (ok) - client->sendCommand(new Command_BanFromServer(userName, minutes)); + BanDialog dlg(this); + if (dlg.exec()) + client->sendCommand(new Command_BanFromServer(userName, dlg.getMinutes(), dlg.getReason())); } delete menu; diff --git a/cockatrice/src/userlist.h b/cockatrice/src/userlist.h index a611bf5d..a40fca0f 100644 --- a/cockatrice/src/userlist.h +++ b/cockatrice/src/userlist.h @@ -1,6 +1,7 @@ #ifndef USERLIST_H #define USERLIST_H +#include #include #include #include @@ -9,6 +10,19 @@ class QTreeWidget; class ServerInfo_User; class AbstractClient; class TabSupervisor; +class QSpinBox; +class QPlainTextEdit; + +class BanDialog : public QDialog { + Q_OBJECT +private: + QSpinBox *durationEdit; + QPlainTextEdit *reasonEdit; +public: + BanDialog(QWidget *parent = 0); + int getMinutes() const; + QString getReason() const; +}; class UserListItemDelegate : public QStyledItemDelegate { public: diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index 43f214c8..db45c0b2 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -121,6 +121,36 @@ + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + + + + + Ban user from server + + + CardDatabaseModel @@ -787,22 +817,22 @@ DeckViewContainer - + Load &local deck - + Load d&eck from server - + Ready to s&tart - + Load deck @@ -1628,117 +1658,117 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... - + Connected. - + Disconnected from server. - + Invalid password. - + Protocol version mismatch. Client: %1, Server: %2 - + Protocol error. - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 is not ready to start the game any more. - + %1 has conceded the game. - + The game has started. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1747,188 +1777,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1937,57 +1967,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1996,7 +2026,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -2005,7 +2035,7 @@ Local version is %1, remote version is %2. - + red @@ -2014,7 +2044,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2023,7 +2053,7 @@ Local version is %1, remote version is %2. - + green @@ -2032,162 +2062,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2877,137 +2907,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases - + &Game - + Next &phase - + Ctrl+Space - + Next &turn - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows - + Ctrl+R - + &Concede - + F2 - + &Leave game - + Ctrl+Q - + &Say: - + Concede - + Are you sure you want to concede this game? - + Leave game - + Are you sure you want to leave this game? - + Kicked - + You have been kicked out of the game. - + Game %1: %2 @@ -3015,27 +3045,27 @@ Please enter a name: TabMessage - + Personal &talk - + &Leave - + This user is ignoring you. - + %1 has left the server. - + %1 has joined the server. @@ -3048,27 +3078,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3178,71 +3208,60 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + User &details - + Direct &chat - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server - - - Duration - - - - - Please enter the duration of the ban (in minutes). -Enter 0 for an indefinite ban. - - WndDeckEditor diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 38e34348..ce769bac 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -156,6 +156,42 @@ Pfad auswählen + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Bitte geben Sie die Dauer des Banns ein (in Minuten). +Geben Sie 0 ein für einen unbefristeten Bann. + + + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. + Bitte geben Sie den Grund für den Bann ein. Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nicht gesehen werden. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + Bitte geben Sie den Grund für den Bann ein. +Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nicht gesehen werden. + + + + &OK + &OK + + + + &Cancel + &Abbrechen + + + + Ban user from server + Benutzer vom Server bannen + + CardDatabaseModel @@ -1209,22 +1245,22 @@ DeckViewContainer - + Load &local deck &Lokales Deck laden - + Load d&eck from server Deck vom Server l&aden - + Ready to s&tart Bereit zum S&tarten - + Load deck Deck laden @@ -2429,22 +2465,22 @@ Lokale Version ist %1, Serverversion ist %2. MessageLogWidget - + Connecting to %1... Verbinde zu %1... - + Connected. Verbunden. - + Disconnected from server. Verbindung zum Server getrennt. - + Invalid password. Ungültiges Passwort. @@ -2485,8 +2521,8 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten - - + + a card eine Karte @@ -2543,7 +2579,7 @@ Lokale Version ist %1, Serverversion ist %2. %1s Sideboard - + The game has started. Das Spiel hat begonnen. @@ -2564,87 +2600,87 @@ Lokale Version ist %1, Serverversion ist %2. Protokollversion stimmt nicht überein. - + Protocol version mismatch. Client: %1, Server: %2 - + Protocol error. Protokollfehler. - + You have joined game #%1. Sie sind dem Spiel %1 beigetreten. - + %1 has joined the game. %1 ist dem Spiel beigetreten. - + %1 has left the game. %1 hat das Spiel verlassen. - + The game has been closed. Das Spiel wurde geschlossen. - + %1 is now watching the game. %1 schaut nun dem Spiel zu. - + %1 is not watching the game any more. %1 schaut dem Spiel nicht mehr zu. - + %1 has loaded a local deck. %1 hat ein lokales Deck geladen. - + %1 has loaded deck #%2. %1 hat das Deck Nr. %2 geladen. - + %1 is ready to start the game. %1 ist bereit, das Spiel zu starten. - + %1 is not ready to start the game any more. %1 ist nicht mehr bereit, das Spiel zu starten. - + %1 has conceded the game. %1 hat das Spiel aufgegeben. - + %1 has restored connection to the game. %1 ist wieder mit dem Spiel verbunden. - + %1 has lost connection to the game. %1 hat die Verbindung zum Spiel verloren. - + %1 shuffles %2. %1 mischt %2. - + %1 rolls a %2 with a %3-sided die. %1 würfelt eine %2 mit einem %3-seitigen Würfel. @@ -2657,7 +2693,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten. - + %1 draws %n card(s). %1 zieht eine Karte. @@ -2665,182 +2701,182 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 undoes his last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes her last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes his last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + %1 undoes her last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + from table vom Spielfeld - + from graveyard aus dem Friedhof - + from exile aus dem Exil - + from hand von der Hand - + the bottom card of his library die unterste Karte seiner Bibliothek - + the bottom card of her library die unterste Karte ihrer Bibliothek - + from the bottom of his library , die unterste Karte seiner Bibliothek, - + from the bottom of her library , die unterste Karte ihrer Bibliothek, - + the top card of his library die oberste Karte seiner Bibliothek - + the top card of her library die oberste Karte ihrer Bibliothek - + from the top of his library , die oberste Karte seiner Bibliothek, - + from the top of her library , die oberste Karte ihrer Bibliothek, - + from library aus der Bibliothek - + from sideboard aus dem Sideboard - + from the stack vom Stapel - + %1 gives %2 control over %3. %1 überlässt %2 die Kontrolle über %3. - + %1 puts %2 into play tapped%3. %1 bringt %2 getappt%3 ins Spiel. - + %1 puts %2 into play%3. %1 bringt %2%3 ins Spiel. - + %1 puts %2%3 into graveyard. %1 legt %2%3 auf den Friedhof. - + %1 exiles %2%3. %1 schickt %2%3 ins Exil. - + %1 moves %2%3 to hand. %1 nimmt %2%3 auf die Hand. - + %1 puts %2%3 into his library. %1 legt %2%3 in seine Bibliothek. - + %1 puts %2%3 into her library. %1 legt %2%3 in ihre Bibliothek. - + %1 puts %2%3 on bottom of his library. %1 legt %2%3 unter seine Bibliothek. - + %1 puts %2%3 on bottom of her library. %1 legt %2%3 unter ihre Bibliothek. - + %1 puts %2%3 on top of his library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 on top of her library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 into his library at position %4. %1 legt %2%3 in seine Bibliothek an %4. Stelle. - + %1 puts %2%3 into her library at position %4. %1 legt %2%3 in ihre Bibliothek an %4. Stelle. - + %1 moves %2%3 to sideboard. %1 legt %2%3 in sein Sideboard. - + %1 plays %2%3. %1 spielt %2%3 aus. - + %1 takes a mulligan to %n. %1 nimmt einen Mulligan auf %n. @@ -2848,52 +2884,52 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 draws his initial hand. %1 zieht seine Starthand. - + %1 draws her initial hand. %1 zieht ihre Starthand. - + %1 flips %2 face-down. %1 wendet %2 auf die Rückseite. - + %1 flips %2 face-up. %1 wendet %2 auf die Vorderseite. - + %1 destroys %2. %1 zerstört %2. - + %1 attaches %2 to %3's %4. %1 legt %2 an %3s %4 an. - + %1 unattaches %2. %1 löst %2 ab. - + %1 creates token: %2%3. %1 erstellt Token: %2%3. - + %1 points from %2's %3 to %4. %1 zeigt von %2s %3 auf %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 legt eine %2 Marke auf %3 (jetzt %4). @@ -2901,7 +2937,7 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 entfernt eine %2 Marke von %3 (jetzt %4). @@ -2909,27 +2945,27 @@ Lokale Version ist %1, Serverversion ist %2. - + her permanents ihre bleibenden Karten - + %1 randomly reveals %2%3 to %4. %1 zeigt %4 zufällig %2%3 vor. - + %1 randomly reveals %2%3. %1 zeigt zufällig %2%3 offen vor. - + %1 reveals %2%3 to %4. %1 zeigt %4 %2%3 vor. - + %1 reveals %2%3. %1 zeigt %2%3 offen vor. @@ -2938,7 +2974,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 erstellt einen Spielstein: %2 (%3). - + %1 points from %2's %3 to %4's %5. %1 zeigt von %2s %3 auf %4s %5. @@ -2957,7 +2993,7 @@ Lokale Version ist %1, Serverversion ist %2. - + red rote @@ -2965,7 +3001,7 @@ Lokale Version ist %1, Serverversion ist %2. - + yellow gelbe @@ -2973,7 +3009,7 @@ Lokale Version ist %1, Serverversion ist %2. - + green grüne @@ -2981,22 +3017,22 @@ Lokale Version ist %1, Serverversion ist %2. - + %1 sets counter %2 to %3 (%4%5). %1 setzt Zähler %2 auf %3 (%4%5). - + %1 sets PT of %2 to %3. %1 setzt Kampfwerte von %2 auf %3. - + %1 sets annotation of %2 to %3. %1 versieht %2 mit dem Hinweis %3. - + %1 is looking at the top %2 cards %3. %1 sieht sich die obersten %2 Karten %3 an. @@ -3093,7 +3129,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4). - + %1 %2 %3. %1 %2 %3. @@ -3106,22 +3142,22 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich die obersten %2 Karten %3 an. - + %1 is looking at %2. %1 sieht sich %2 an. - + %1 stops looking at %2. %1 sieht sich %2 nicht mehr an. - + %1 reveals %2 to %3. %1 zeigt %3 %2. - + %1 reveals %2. %1 zeigt %2 offen vor. @@ -3142,7 +3178,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 zeigt %2 aus %3 offen vor. - + ending phase die Zugendphase @@ -3171,57 +3207,57 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich %2s %3 nicht mehr an - + It is now %1's turn. %1 ist am Zug. - + untap step das Enttappsegment - + upkeep step das Versorgungssegment - + draw step das Ziehsegment - + first main phase die erste Hauptphase - + beginning of combat step das Anfangssegment der Kampfphase - + declare attackers step das Angreifer-Deklarieren-Segment - + declare blockers step das Blocker-Deklarieren-Segment - + combat damage step das Kampfschadenssegment - + end of combat step das Endsegment der Kampfphase - + second main phase die zweite Hauptphase @@ -3230,7 +3266,7 @@ Lokale Version ist %1, Serverversion ist %2. das Ende-des-Zuges-Segment - + It is now the %1. Es ist nun %1. @@ -3239,12 +3275,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 bewegt %2 %3 nach %4 - + taps tappt - + untaps enttappt @@ -3269,7 +3305,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4) - + his permanents seine bleibenden Karten @@ -3282,12 +3318,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 setzt Zähler "%2" auf %3 (%4%5) - + %1 sets %2 to not untap normally. %1 setzt %2 auf explizites Enttappen. - + %1 sets %2 to untap normally. %1 setzt %2 auf normales Enttappen. @@ -4220,107 +4256,107 @@ Bitte geben Sie einen Namen ein: TabGame - + F5 F5 - + F6 F6 - + F7 F7 - + F8 F8 - + F9 F9 - + F10 F10 - + &Phases &Phasen - + &Game Spi&el - + Next &phase Nächste &Phase - + Ctrl+Space Ctrl+Space - + Next &turn Nächster &Zug - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Lokale Pfeile entfernen - + Ctrl+R Ctrl+R - + &Concede - + F2 F2 - + &Leave game Spiel ver&lassen - + Ctrl+Q Ctrl+Q - + Kicked Herausgeworfen - + You have been kicked out of the game. Sie wurden aus dem Spiel geworfen. @@ -4341,7 +4377,7 @@ Bitte geben Sie einen Namen ein: Spiel s&tarten - + &Say: &Sagen: @@ -4354,22 +4390,22 @@ Bitte geben Sie einen Namen ein: Esc - + Concede Aufgeben - + Are you sure you want to concede this game? Sind Sie sicher, dass Sie das Spiel aufgeben möchten? - + Leave game Spiel verlassen - + Are you sure you want to leave this game? Sind Sie sicher, dass Sie das Spiel verlassen möchten? @@ -4378,7 +4414,7 @@ Bitte geben Sie einen Namen ein: Deck laden - + Game %1: %2 Spiel %1: %2 @@ -4386,27 +4422,27 @@ Bitte geben Sie einen Namen ein: TabMessage - + Personal &talk Persönliches &Gespräch - + &Leave Ver&lassen - + This user is ignoring you. Dieser Benutzer ignoriert Sie. - + %1 has left the server. %1 hat den Server verlassen. - + %1 has joined the server. %1 hat den Server betreten. @@ -4419,27 +4455,27 @@ Bitte geben Sie einen Namen ein: TabRoom - + &Say: &Sagen: - + Chat Unterhaltung - + &Room &Raum - + &Leave room Raum ver&lassen - + You are flooding the chat. Please wait a couple of seconds. Sie überfluten den Chatraum. Bitte warten Sie ein paar Sekunden. @@ -4576,70 +4612,68 @@ Bitte geben Sie einen Namen ein: UserList - + Users online: %1 Benutzer online: %1 - + Users in this room: %1 Benutzer in diesem Raum: %1 - + Buddies online: %1 / %2 Freunde online: %1 / %2 - + Ignored users online: %1 / %2 Ignorierte Benutzer online: %1 / %2 - + User &details Benutzer&details - + Direct &chat &Persönliches Gespräch - + Add to &buddy list Zur &Freundesliste hinzufügen - + Remove from &buddy list Von &Freundesliste entfernen - + Add to &ignore list &Ignorieren - + Remove from &ignore list Nicht mehr &ignorieren - + Ban from &server Vom &Server bannen - Duration - Dauer + Dauer - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Bitte geben Sie die Dauer des Banns ein (in Minuten). + Bitte geben Sie die Dauer des Banns ein (in Minuten). Geben Sie 0 ein für einen unbefristeten Bann. diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 02e8057d..c0d65f99 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -121,6 +121,36 @@ + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + + + + + Ban user from server + + + CardDatabaseModel @@ -787,22 +817,22 @@ DeckViewContainer - + Load &local deck - + Load d&eck from server - + Ready to s&tart - + Load deck @@ -1627,67 +1657,67 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... - + Disconnected from server. - + Invalid password. - + Protocol error. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 is not ready to start the game any more. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). %1 draws a card. @@ -1695,208 +1725,208 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - + + a card - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 points from %2's %3 to %4's %5. @@ -1915,7 +1945,7 @@ Local version is %1, remote version is %2. - + red @@ -1923,7 +1953,7 @@ Local version is %1, remote version is %2. - + yellow @@ -1931,7 +1961,7 @@ Local version is %1, remote version is %2. - + green @@ -1939,77 +1969,77 @@ Local version is %1, remote version is %2. - + %1 sets counter %2 to %3 (%4%5). - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + The game has started. - + Connected. - + Protocol version mismatch. Client: %1, Server: %2 - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 has conceded the game. - + %1 takes a mulligan to %n. @@ -2017,32 +2047,32 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 destroys %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 places a %2 counter on %3 (now %4). @@ -2050,7 +2080,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 removes a %2 counter from %3 (now %4). @@ -2058,142 +2088,142 @@ Local version is %1, remote version is %2. - + her permanents - + %1 %2 %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + ending phase - + It is now %1's turn. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - + taps - + untaps - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + his permanents @@ -2883,137 +2913,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases - + &Game - + Next &phase - + Ctrl+Space - + Next &turn - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows - + Ctrl+R - + &Concede - + F2 - + &Leave game - + Ctrl+Q - + &Say: - + Concede - + Are you sure you want to concede this game? - + Leave game - + Are you sure you want to leave this game? - + Kicked - + You have been kicked out of the game. - + Game %1: %2 @@ -3021,27 +3051,27 @@ Please enter a name: TabMessage - + Personal &talk - + &Leave - + This user is ignoring you. - + %1 has left the server. - + %1 has joined the server. @@ -3054,27 +3084,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3184,71 +3214,60 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + User &details - + Direct &chat - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server - - - Duration - - - - - Please enter the duration of the ban (in minutes). -Enter 0 for an indefinite ban. - - WndDeckEditor diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index adb9e23a..d39522e9 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -129,6 +129,37 @@ Elija ruta + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Por favor, introduce la duración del ban (en minutos) +Indica 0 para un ban indefinido. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + &Aceptar + + + + &Cancel + &Cancelar + + + + Ban user from server + + + CardDatabaseModel @@ -1129,22 +1160,22 @@ DeckViewContainer - + Load &local deck Cargar mazo &local - + Load d&eck from server Cargar mazo del &servidor - + Ready to s&tart Listo para &empezar - + Load deck Cargar mazo @@ -2000,67 +2031,67 @@ La versión local es %1, la versión remota es %2. MessageLogWidget - + Connecting to %1... Conectando a %1... - + Disconnected from server. Desconectado del servidor. - + Invalid password. Contraseña incorrecta. - + Protocol error. Error del protocolo. - + The game has been closed. La partida ha sido cerrada. - + %1 is now watching the game. %1 está ahora observando la partida. - + %1 is not watching the game any more. %1 ya no está observado más la partida. - + %1 is not ready to start the game any more. %1 ya no está listo para empezar el juego. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. %1 sacó un %2 con un dado de %3 caras. - + %1 draws %n card(s). %1 roba %n carta. @@ -2068,208 +2099,208 @@ La versión local es %1, la versión remota es %2. - + %1 undoes his last draw. %1 deshace su último robo. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 deshace su último robo (%2). - + %1 undoes her last draw (%2). - + from table de la mesa - + from graveyard del cementerio - + from exile del exilio - + from hand de la mano - + the bottom card of his library el fondo de la biblioteca - + the bottom card of her library - + from the bottom of his library del fondo de la biblioteca - + from the bottom of her library - + the top card of his library la parte superior de la biblioteca - + the top card of her library - + from the top of his library de la parte superior de la biblioteca - + from the top of her library - + from library de la biblioteca - + from sideboard de la reserva - + from the stack de la pila - + %1 gives %2 control over %3. %1 entrega a %2 el control sobre %3. - + %1 puts %2 into play tapped%3. %1 pone %2 en juego%3 girado. - + %1 puts %2 into play%3. %1 pone %2 en juego%3. - + %1 puts %2%3 into graveyard. %1 pone %2%3 en el cementerio. - + %1 exiles %2%3. %1 exilia %2%3. - + %1 moves %2%3 to hand. %1 mueve %2%3 a la mano. - + %1 puts %2%3 into his library. %1 pone %2%3 en la biblioteca. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 pone %2%3 en la parte inferior de su biblioteca. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 pone %2%3 en la parte superior de su biblioteca. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 pone %2%3 en su biblioteca en la posición %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 mueve %2%3 a la reserva. - + %1 plays %2%3. %1 juega %2%3. - - + + a card una carta - + %1 flips %2 face-down. %1 voltea %2 boca abajo. - + %1 flips %2 face-up. %1 voltea %2 boca arriba. - + %1 attaches %2 to %3's %4. %1 anexa %2 a el %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 points from %2's %3 to %4's %5. %1 apunta desde el %3 de %2 al %5 de %4. @@ -2288,7 +2319,7 @@ La versión local es %1, la versión remota es %2. - + red rojo @@ -2296,7 +2327,7 @@ La versión local es %1, la versión remota es %2. - + yellow amarillo @@ -2304,7 +2335,7 @@ La versión local es %1, la versión remota es %2. - + green verde @@ -2312,72 +2343,72 @@ La versión local es %1, la versión remota es %2. - + %1 sets counter %2 to %3 (%4%5). %1 establece los contadores de %2 a %3 (%4%5). - + %1 sets PT of %2 to %3. %1 establece F/R de %2 a %3. - + %1 sets annotation of %2 to %3. %1 establece la anotación de %2 a %3. - + %1 is looking at the top %2 cards %3. %1 esta mirando las primeras %2 cartas de %3. - + The game has started. La partida ha comenzado. - + Connected. Conectado. - + Protocol version mismatch. Client: %1, Server: %2 La versión del protocolo es diferente. Cliente: %1, Servidor: %2 - + You have joined game #%1. Te has unido a la partida #%1. - + %1 has joined the game. %1 se ha unido a la partida. - + %1 has left the game. %1 ha dejado la partida. - + %1 has loaded a local deck. %1 ha cargado un mazo local. - + %1 has loaded deck #%2. %1 ha cargado el mazo #%2. - + %1 is ready to start the game. %1 está preparado para empezar la partida. - + %1 has conceded the game. %1 ha concedido la partida. @@ -2390,22 +2421,22 @@ La versión local es %1, la versión remota es %2. %1 roba %2 cartas. - + %1 destroys %2. %1 destruye %2. - + %1 creates token: %2%3. %1 crea una ficha: %2%3. - + %1 points from %2's %3 to %4. %1 apunta desde el %3 de %2 a %4. - + %1 places %n %2 counter(s) on %3 (now %4). %1 pone %n %2 contador en %3 (ahora %4). @@ -2413,7 +2444,7 @@ La versión local es %1, la versión remota es %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 remueve %n %2 contador en %3 (ahora %4). @@ -2421,37 +2452,37 @@ La versión local es %1, la versión remota es %2. - + %1 %2 %3. %1 %2 %3. - + %1 is looking at %2. %1 está mirando: %2. - + %1 stops looking at %2. %1 termina de mirar: %2. - + %1 reveals %2 to %3. %1 revela %2 a %3. - + %1 reveals %2. %1 revela %2. - + ending phase fase de fin de turno - + It is now %1's turn. Es el turno de %1. @@ -2460,7 +2491,7 @@ La versión local es %1, la versión remota es %2. %1 baraja su biblioteca. - + %1 takes a mulligan to %n. @@ -2468,117 +2499,117 @@ La versión local es %1, la versión remota es %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + her permanents - + %1 randomly reveals %2%3 to %4. %1 revela aleatoriamente %2%3 a %4. - + %1 randomly reveals %2%3. %1 revela aleatoriamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 a %4. - + %1 reveals %2%3. %1 revela %2%3. - + untap step paso de enderezar - + upkeep step paso de mantenimiento - + draw step paso de robar - + first main phase primera fase principal - + beginning of combat step paso de inicio de combate - + declare attackers step paso de declarar atacantes - + declare blockers step paso de declarar bloqueadores - + combat damage step paso de daño de combate - + end of combat step paso de fin de combate - + second main phase segunda fase principal - + It is now the %1. Ahora es el %1. - + taps gira - + untaps endereza - + %1 sets %2 to not untap normally. %1 establece que %2 no se endereze normalmente. - + %1 sets %2 to untap normally. %1 establece que %2 se endereze normalmente. - + his permanents sus permanentes @@ -3331,137 +3362,137 @@ Por favor, introduzca un nombre: TabGame - + F5 F5 - + F6 F6 - + F7 F7 - + F8 F8 - + F9 F9 - + F10 F10 - + &Phases &Fases - + &Game &Partida - + Next &phase Próxima &fase - + Ctrl+Space Ctrl+Space - + Next &turn Próximo &turno - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Retirar todas las flechas locales - + Ctrl+R Ctrl+R - + &Concede &Conceder - + F2 F2 - + &Leave game &Abandonar la partida - + Ctrl+Q Ctrl+Q - + &Say: &Decir: - + Concede Conceder - + Are you sure you want to concede this game? ¿Estás seguro de que quieres conceder esta partida? - + Leave game Abandonar la partida - + Are you sure you want to leave this game? ¿Estás seguro de que quieres abandonar la partida? - + Kicked Expulsado - + You have been kicked out of the game. Has sido expulsado de la partida. - + Game %1: %2 Partida %1: %2 @@ -3469,27 +3500,27 @@ Por favor, introduzca un nombre: TabMessage - + Personal &talk &Conversación personal - + &Leave &Cerrar - + This user is ignoring you. Este usuario está ignorandote. - + %1 has left the server. %1 ha abandonado el servidor. - + %1 has joined the server. %1 se ha unido al servidor. @@ -3502,27 +3533,27 @@ Por favor, introduzca un nombre: TabRoom - + &Say: &Decir: - + Chat Chat - + &Room &Sala - + &Leave room &Dejar sala - + You are flooding the chat. Please wait a couple of seconds. Estás floodeando el chat. Por favor, espera unos segundos. @@ -3644,70 +3675,68 @@ Por favor, introduzca un nombre: UserList - + Users online: %1 Usuarios online: %1 - + Users in this room: %1 Usuarios en esta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuarios ignorados online: %1 / %2 - + User &details &Detalles del usuario - + Direct &chat &Chat privado - + Add to &buddy list Añadir a la lista de &amigos - + Remove from &buddy list Quitar de la lista de &amigos - + Add to &ignore list Añadir a la lista de &ignorados - + Remove from &ignore list Quitar de la lista de &ignorados - + Ban from &server Banear del &servidor - Duration - Duración + Duración - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Por favor, introduce la duración del ban (en minutos) + Por favor, introduce la duración del ban (en minutos) Indica 0 para un ban indefinido. diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index c8950757..ecdd4519 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -121,6 +121,37 @@ Choisir le chemin + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Entrez la durée de temps du ban (en minutes). +Entrez 0 pour une durée illimitée du ban. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + &OK + + + + &Cancel + &Annuler + + + + Ban user from server + + + CardDatabaseModel @@ -991,22 +1022,22 @@ DeckViewContainer - + Load &local deck Charger un deck &local - + Load d&eck from server Charger un d&eck depuis le serveur - + Ready to s&tart P&rêt à démarrer - + Load deck Charger deck @@ -1857,93 +1888,93 @@ La version la plus récente est %1, l'ancienne version est %2. MessageLogWidget - + Connecting to %1... Connexion à %1... - + Connected. Connecté. - + Disconnected from server. Déconnecté du serveur. - + Invalid password. Mot de passe invalide. - + Protocol version mismatch. Client: %1, Server: %2 Version de protocole différente. Version locale: %1 ,version distante: %2 - + Protocol error. Erreur de protocole. - + You have joined game #%1. Vous avez rejoint la partie #%1. - + %1 has joined the game. %1 a rejoint la partie. - + %1 has left the game. %1 a quitté la partie. - + The game has been closed. La partie a été fermée. - + %1 is now watching the game. %1 est maintenant spectateur. - + %1 is not watching the game any more. %1 n'est plus spectateur. - + %1 has loaded a local deck. %1 a chargé un deck local. - + %1 has loaded deck #%2. %1 a chargé le deck #%2. - + %1 is ready to start the game. %1 est prêt à démarrer la partie. - + %1 is not ready to start the game any more. %1 n'est plus prêt à démarrer la partie. - + %1 has conceded the game. partie ou jeu %1 a concédé la partie. - + The game has started. La partie commence. @@ -1952,7 +1983,7 @@ La version la plus récente est %1, l'ancienne version est %2.%1 mélange sa bibliothèque. - + %1 rolls a %2 with a %3-sided die. is it always a dice? %1 lance un %2 à %3 faces. @@ -1966,179 +1997,179 @@ La version la plus récente est %1, l'ancienne version est %2.%1 pioche %2 cartes. - + from table depuis le champ de bataille - + from graveyard depuis son cimetière - + from exile depuis la zone exil - + from hand depuis sa main - + the bottom card of his library la carte du dessous de sa bibliothèque - + the bottom card of her library - + from the bottom of his library du dessous de sa bibliothèque - + from the bottom of her library - + the top card of his library le carte du dessus de sa bibliothèque - + the top card of her library - + from the top of his library du dessus de sa bibliothèque - + from the top of her library - + from library depuis sa bibliothèque - + from sideboard depuis sa réserve - + from the stack depuis la pile - + %1 puts %2 into play tapped%3. %1 met %2 en jeu engagé%3. - + %1 puts %2 into play%3. what is %3? plz exemple (resp. by Ranma : XX met island en jeu -depuis sa main-.) %1 met %2 en jeu %3. - + %1 puts %2%3 into graveyard. %1 met %2%3 dans son cimetière. - + %1 exiles %2%3. %1 exile %2%3. - + %1 moves %2%3 to hand. %1 met %2%3 dans sa main. - + %1 puts %2%3 into his library. %1 met %2%3 dans sa bibliothèque. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 met %2%3 en-dessous de sa bibliothèque. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 met %2%3 au-dessus de sa bibliothèque. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 met %2%3 dans sa bibliothèque à la position n°%4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 met %2%3 à sa réserve. - + %1 plays %2%3. %1 joue %2%3. - - + + a card une carte - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 draws %n card(s). %1 pioche %n carte. @@ -2146,32 +2177,32 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 undoes his last draw. %1 annule sa dernière pioche. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 annule sa dernière pioche (%2). - + %1 undoes her last draw (%2). - + %1 gives %2 control over %3. %1 donne le contrôle de %2 à %3. - + %1 takes a mulligan to %n. @@ -2179,54 +2210,54 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. %1 retourne %2 face cachée. - + %1 flips %2 face-up. %1 retourne %2 face visible. - + %1 destroys %2. %1 détruit %2. - + %1 attaches %2 to %3's %4. need exemple (Resp'.by Ranma: JoueurA attache Adventuring Gear sur -Plated Geopede- de -JoueurB-.) %1 attache %2 sur %4 de %3. - + %1 unattaches %2. %1 détache %2. - + %1 creates token: %2%3. %1 crée un jeton %2%3. - + %1 points from %2's %3 to %4. need exemple %1 désigne le %3 de %2 à %4. - + %1 points from %2's %3 to %4's %5. need exemple %1 désigne le %3 de %2 à %5 de %4. @@ -2248,7 +2279,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 places %n %2 counter(s) on %3 (now %4). %1 met %n %2 marqueur sur %3 (maintenant %4). @@ -2256,7 +2287,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 retire %n %2 marqueur de %3 (maintenant %4). @@ -2264,7 +2295,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + red rouge @@ -2272,7 +2303,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + yellow jaune @@ -2280,7 +2311,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + green vert @@ -2288,169 +2319,169 @@ La version la plus récente est %1, l'ancienne version est %2. - + his permanents ses permanents - + her permanents - + %1 %2 %3. wtf ? %1 %2 %3. - + taps engage - + untaps dégage - + %1 sets counter %2 to %3 (%4%5). need exemple %1 met les marqueurs %2 à %3 (%4%5). - + %1 sets %2 to not untap normally. need exemple %2 de %1 ne se dégagera pas lors de l'étape de dégagement. - + %1 sets %2 to untap normally. %2 de %1 se dégagera lors de l'étape de dégagement. - + %1 sets PT of %2 to %3. exemple plz %1 change la F/E de %2 à %3. - + %1 sets annotation of %2 to %3. %1 met l'annotation %3 à %2. - + %1 is looking at the top %2 cards %3. exemple plz %1 regarde les %2 cartes du dessus %3. - + %1 is looking at %2. exemple plz %1 regarde %2. - + %1 stops looking at %2. need exemple to be sure %1 arrête de regarder %2. - + %1 reveals %2 to %3. %1 révèle %2 à %3. - + %1 reveals %2. %1 révèle %2. - + %1 randomly reveals %2%3 to %4. %1 révèle au hasard %2%3 à %4. - + %1 randomly reveals %2%3. %1 révèle au hasard %2%3. - + %1 reveals %2%3 to %4. %1 révèle %2%3 à %4. - + %1 reveals %2%3. %1 révèle %2%3. - + It is now %1's turn. C'est maintenant le tour de %1. - + untap step étape de dégagement - + upkeep step étape d'entretien - + draw step étape de pioche - + first main phase première phase principale - + beginning of combat step étape de début du combat - + declare attackers step étape de déclaration des attaquants - + declare blockers step étape de déclaration des bloqueurs - + combat damage step étape de répartition et de résolution des blessures - + end of combat step étape de fin de combat - + second main phase seconde phase principale - + ending phase phase de fin de tour - + It is now the %1. need exemple C'est maintenant %1. @@ -3190,137 +3221,137 @@ Entrez un nom s'il vous plaît: TabGame - + F5 F5 - + F6 F6 - + F7 F7 - + F8 F8 - + F9 F9 - + F10 F10 - + &Phases - + &Game &Partie - + Next &phase &Prochaine phase - + Ctrl+Space Ctrl+Space - + Next &turn Prochain &Tour - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Retirer toutes les flèches locales - + Ctrl+R Ctrl+R - + &Concede &Concéder - + F2 F2 - + &Leave game &Quitter la partie - + Ctrl+Q Ctrl+Q - + &Say: &Dire: - + Concede Concéder - + Are you sure you want to concede this game? Êtes-vous sûr de vouloir concéder la partie? - + Leave game Quitter la partie - + Are you sure you want to leave this game? Êtes-vous sûr de vouloir quitter la partie? - + Kicked Exclu - + You have been kicked out of the game. Vous avez été exclu de la partie. - + Game %1: %2 Partie %1:%2 @@ -3328,28 +3359,28 @@ Entrez un nom s'il vous plaît: TabMessage - + Personal &talk need exemple &Discussion privée - + &Leave &Quitter - + This user is ignoring you. Cet utilisateur vous a ignoré. - + %1 has left the server. %1 a quitté le serveur. - + %1 has joined the server. %1 a rejoint le serveur. @@ -3362,27 +3393,27 @@ Entrez un nom s'il vous plaît: TabRoom - + &Say: &Dire: - + Chat Chat - + &Room &Salon - + &Leave room &Quitter le salon - + You are flooding the chat. Please wait a couple of seconds. Vous floodez le chat. Veuillez patienter quelques secondes. @@ -3505,70 +3536,68 @@ Entrez un nom s'il vous plaît: UserList - + Users online: %1 Utilisateurs en ligne:%1 - + Users in this room: %1 Utilisateurs dans ce salon: %1 - + Buddies online: %1 / %2 Amis connectés; %1 / %2 - + Ignored users online: %1 / %2 Personnes sur liste noire connectés: %1 / %2 - + User &details &Détails utilisateur - + Direct &chat &Chat direct - + Add to &buddy list Ajouter à la liste d'&amis - + Remove from &buddy list Retirer de la liste d'&amis - + Add to &ignore list Ajouter à la liste &noire - + Remove from &ignore list Retirer de la liste &noire - + Ban from &server Bannir du &serveur - Duration - Durée + Durée - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Entrez la durée de temps du ban (en minutes). + Entrez la durée de temps du ban (en minutes). Entrez 0 pour une durée illimitée du ban. diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index d3bf6ce8..5f63f561 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -126,6 +126,36 @@ 画像の指定 + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + バンする期間を入力してください(分単位).0でバンを解除します. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + + + + + Ban user from server + + + CardDatabaseModel @@ -835,22 +865,22 @@ DeckViewContainer - + Load &local deck ローカルからデッキをロード - + Load d&eck from server サーバーからデッキをロード - + Ready to s&tart 開始準備完了 - + Load deck デッキをロード @@ -1683,275 +1713,275 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... - + Disconnected from server. - + Invalid password. - + Protocol error. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 is not ready to start the game any more. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - + + a card - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 points from %2's %3 to %4's %5. @@ -1968,279 +1998,279 @@ Local version is %1, remote version is %2. - + red - + yellow - + green - + %1 sets counter %2 to %3 (%4%5). - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + The game has started. - + Connected. - + Protocol version mismatch. Client: %1, Server: %2 - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 has conceded the game. - + %1 takes a mulligan to %n. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 destroys %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 places %n %2 counter(s) on %3 (now %4). - + %1 removes %n %2 counter(s) from %3 (now %4). - + her permanents - + %1 %2 %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + ending phase - + It is now %1's turn. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - + taps - + untaps - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + his permanents @@ -2968,137 +2998,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases フェイズ - + &Game ゲーム - + Next &phase 次のフェイズ - + Ctrl+Space - + Next &turn 次のターン - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows 全ての矢印を消す - + Ctrl+R - + &Concede 投了する - + F2 - + &Leave game ゲームを退出する - + Ctrl+Q - + &Say: 発言する - + Concede 投了する - + Are you sure you want to concede this game? 本当にこのゲームに投了しますか? - + Leave game ゲームから退出する - + Are you sure you want to leave this game? 本当にこのゲームから退出しますか? - + Kicked キック - + You have been kicked out of the game. あなたはこのゲームからキックされました. - + Game %1: %2 ゲーム %1: %2 @@ -3106,27 +3136,27 @@ Please enter a name: TabMessage - + Personal &talk 個人会話 - + &Leave 退出する - + This user is ignoring you. このユーザーはあなたを無視しています. - + %1 has left the server. %1はサーバーから退出しました. - + %1 has joined the server. %1がサーバーに参加しました. @@ -3139,27 +3169,27 @@ Please enter a name: TabRoom - + &Say: 発言する - + Chat チャット - + &Room 部屋 - + &Leave room 部屋から出る - + You are flooding the chat. Please wait a couple of seconds. あなたはチャットルームから弾かれました.少々お待ちください. @@ -3281,70 +3311,68 @@ Please enter a name: UserList - + Users online: %1 ユーザー オンライン: %1 - + Users in this room: %1 部屋のユーザー数: %1 - + Buddies online: %1 / %2 フレンドオンライン: %1 / %2 - + Ignored users online: %1 / %2 無視ユーザーオンライン: %1 / %2 - + User &details ユーザー補足 - + Direct &chat 個人チャット - + Add to &buddy list フレンドリストに追加 - + Remove from &buddy list フレンドリストから削除 - + Add to &ignore list 無視リストに追加 - + Remove from &ignore list 無視リストから削除 - + Ban from &server サーバーからバンする - Duration - 期間 + 期間 - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - バンする期間を入力してください(分単位).0でバンを解除します. + バンする期間を入力してください(分単位).0でバンを解除します. diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 4a1f9307..564e6ac2 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -121,6 +121,36 @@ + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + + + + + Ban user from server + + + CardDatabaseModel @@ -787,22 +817,22 @@ DeckViewContainer - + Load &local deck - + Load d&eck from server - + Ready to s&tart - + Load deck @@ -1628,117 +1658,117 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... - + Connected. - + Disconnected from server. - + Invalid password. - + Protocol version mismatch. Client: %1, Server: %2 - + Protocol error. - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 is not ready to start the game any more. - + %1 has conceded the game. - + The game has started. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1747,188 +1777,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1937,57 +1967,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1996,7 +2026,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -2005,7 +2035,7 @@ Local version is %1, remote version is %2. - + red @@ -2014,7 +2044,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2023,7 +2053,7 @@ Local version is %1, remote version is %2. - + green @@ -2032,162 +2062,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2877,137 +2907,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases - + &Game - + Next &phase - + Ctrl+Space - + Next &turn - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows - + Ctrl+R - + &Concede - + F2 - + &Leave game - + Ctrl+Q - + &Say: - + Concede - + Are you sure you want to concede this game? - + Leave game - + Are you sure you want to leave this game? - + Kicked - + You have been kicked out of the game. - + Game %1: %2 @@ -3015,27 +3045,27 @@ Please enter a name: TabMessage - + Personal &talk - + &Leave - + This user is ignoring you. - + %1 has left the server. - + %1 has joined the server. @@ -3048,27 +3078,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3178,71 +3208,60 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + User &details - + Direct &chat - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server - - - Duration - - - - - Please enter the duration of the ban (in minutes). -Enter 0 for an indefinite ban. - - WndDeckEditor diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index ea855248..e94fc66b 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -125,6 +125,37 @@ Escolher caminho + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Por favor, digite a duração do banimento (em minutos). +Digite 0 para banir indefinidamente. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + &OK + + + + &Cancel + &Cancelar + + + + Ban user from server + + + CardDatabaseModel @@ -995,22 +1026,22 @@ DeckViewContainer - + Load &local deck Carregar dec&k local - + Load d&eck from server Carregar deck do &servidor - + Ready to s&tart &Pronto para começar - + Load deck Carregar deck @@ -1858,67 +1889,67 @@ A versão local é %1 e a versão remota é %2. MessageLogWidget - + Connecting to %1... Conectando a %1... - + Disconnected from server. Desconectado do servidor. - + Invalid password. Senha incorreta. - + Protocol error. Erro de protocolo. - + The game has been closed. O jogo foi fechado. - + %1 is now watching the game. %1 está assistindo o jogo agora. - + %1 is not watching the game any more. %1 não está mais assistindo o jogo. - + %1 is not ready to start the game any more. %1 não está mais pronto para começar o jogo. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. %1 tirou um %2 com um dado de %3 lados. - + %1 draws %n card(s). %1 compra %n card. @@ -1926,208 +1957,208 @@ A versão local é %1 e a versão remota é %2. - + %1 undoes his last draw. %1 desfaz sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz sua última compra (%2). - + %1 undoes her last draw (%2). - + from table vindo do campo de batalha - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library o card do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library vindo do fundo do seu grimório - + from the bottom of her library - + the top card of his library o card do topo do seu grimório - + the top card of her library - + from the top of his library vindo do topo do seu grimório - + from the top of her library - + from library vindo do grimório - + from sideboard vindo do sideboard - + from the stack vindo da pilha - + %1 gives %2 control over %3. %1 dá controle para %2 sobre %3. - + %1 puts %2 into play tapped%3. %1 põe %2 em jogo virado%3. - + %1 puts %2 into play%3. %1 põe %2 no campo de batalha %3. - + %1 puts %2%3 into graveyard. %1 põe %2 no cemitério%3. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2 para a mão%3. - + %1 puts %2%3 into his library. %1 põe %2 no seu grimório%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 põe %2 no fundo do seu grimório%3. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 põe %2 no topo do seu grimório%3. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 põe %2 no seu grimório na posição %4%3. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2 para o sideboard%3. - + %1 plays %2%3. %1 põe %2 na pilha%3. - - + + a card um card - + %1 flips %2 face-down. %1 vira %2 para baixo. - + %1 flips %2 face-up. %1 vira %2 para cima. - + %1 attaches %2 to %3's %4. %1 anexa %2 a %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 points from %2's %3 to %4's %5. %1 aponta para %5 de %4 com %3 de %2. @@ -2146,7 +2177,7 @@ A versão local é %1 e a versão remota é %2. - + red vermelho @@ -2154,7 +2185,7 @@ A versão local é %1 e a versão remota é %2. - + yellow amarelo @@ -2162,7 +2193,7 @@ A versão local é %1 e a versão remota é %2. - + green verde @@ -2170,72 +2201,72 @@ A versão local é %1 e a versão remota é %2. - + %1 sets counter %2 to %3 (%4%5). %1 altera o marcador %2 para %3 (%4%5). - + %1 sets PT of %2 to %3. %1 altera o P/R de %2 para %3. - + %1 sets annotation of %2 to %3. %1 altera a nota de %2 para%3. - + %1 is looking at the top %2 cards %3. %1 está olhando para os %2 cards do topo %3. - + The game has started. O jogo começou. - + Connected. Conectado. - + Protocol version mismatch. Client: %1, Server: %2 Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 - + You have joined game #%1. Você entrou no jogo nº %1. - + %1 has joined the game. %1 entrou no jogo. - + %1 has left the game. %1 saiu do jogo. - + %1 has loaded a local deck. %1 carregou um deck local. - + %1 has loaded deck #%2. %1 carregou o deck nº %2. - + %1 is ready to start the game. %1 está pronto para começar o jogo. - + %1 has conceded the game. %1 concedeu o jogo. @@ -2248,22 +2279,22 @@ A versão local é %1 e a versão remota é %2. %1 compra %2 cards. - + %1 destroys %2. %1 destrói %2. - + %1 creates token: %2%3. %1 cria a ficha: %2%3. - + %1 points from %2's %3 to %4. %1 aponta para %4 com %3 de %2 . - + %1 places %n %2 counter(s) on %3 (now %4). %1 põe %n marcador %2 em %3 (agora %4). @@ -2271,7 +2302,7 @@ A versão local é %1 e a versão remota é %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 tira %n marcador %2 em %3 (agora %4). @@ -2279,37 +2310,37 @@ A versão local é %1 e a versão remota é %2. - + %1 %2 %3. %1 %2 %3. - + %1 is looking at %2. %1 está olhando para %2. - + %1 stops looking at %2. %1 para de olhar para %2. - + %1 reveals %2 to %3. %1 revela %2 para %3. - + %1 reveals %2. %1 revela %2. - + ending phase fase final - + It is now %1's turn. Agora é o turno de %1. @@ -2318,7 +2349,7 @@ A versão local é %1 e a versão remota é %2. %1 embaralha o seu grimório. - + %1 takes a mulligan to %n. @@ -2326,117 +2357,117 @@ A versão local é %1 e a versão remota é %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + her permanents - + %1 randomly reveals %2%3 to %4. %1 revela aleatoriamente %2%3. para %4. - + %1 randomly reveals %2%3. %1 revela aleatoriamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 para %4. - + %1 reveals %2%3. %1 revela %2%3. - + untap step etapa de desvirar - + upkeep step etapa de manutenção - + draw step etapa de compra - + first main phase primeira fase principal - + beginning of combat step etapa de início de combate - + declare attackers step etapa de declaracão de atacantes - + declare blockers step etapa de declaração de bloqueadores - + combat damage step etapa de dano de combate - + end of combat step etapa de fim de combate - + second main phase segunda fase principal - + It is now the %1. Agora é a %1. - + taps vira - + untaps desvira - + %1 sets %2 to not untap normally. %1 define que %2 não desvira normalmente. - + %1 sets %2 to untap normally. %1 define que %2 desvira normalmente. - + his permanents as suas permanentes @@ -3173,137 +3204,137 @@ Por favor, entre um nome: TabGame - + F5 F5 - + F6 F6 - + F7 F7 - + F8 F8 - + F9 F9 - + F10 F10 - + &Phases &Etapas - + &Game &Jogo - + Next &phase Próxima &etapa - + Ctrl+Space Ctrl+Espaço - + Next &turn Próximo &turno - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Apagar todas as setas locais - + Ctrl+R Ctrl+R - + &Concede &Conceder - + F2 F2 - + &Leave game &Sair do jogo - + Ctrl+Q Ctrl+Q - + &Say: &Falar: - + Concede Conceder - + Are you sure you want to concede this game? Você tem certeza que deseja conceder este jogo? - + Leave game Sair do jogo - + Are you sure you want to leave this game? Você tem certeza que deseja sair deste jogo? - + Kicked Chutado - + You have been kicked out of the game. Você foi chutado do jogo. - + Game %1: %2 Jogo %1: %2 @@ -3311,27 +3342,27 @@ Por favor, entre um nome: TabMessage - + Personal &talk Chat &privado - + &Leave &Sair - + This user is ignoring you. Este usuário está ignorando você. - + %1 has left the server. %1 saiu do servidor. - + %1 has joined the server. %1 entrou no servidor. @@ -3344,27 +3375,27 @@ Por favor, entre um nome: TabRoom - + &Say: &Falar: - + Chat Chat - + &Room &Sala - + &Leave room S&air da sala - + You are flooding the chat. Please wait a couple of seconds. Você está flodando o chat. Por favor, espere alguns segundos. @@ -3486,70 +3517,68 @@ Por favor, entre um nome: UserList - + Users online: %1 Usuários online: %1 - + Users in this room: %1 Usuários nesta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuários ignorados online: %1 / %2 - + User &details &Detalhes do usuário - + Direct &chat &Chat direto - + Add to &buddy list Adicionar à &lista de amigos - + Remove from &buddy list Remover da li&sta de amigos - + Add to &ignore list Adicionar à li&sta dos ignorados - + Remove from &ignore list Remover da lista dos i&gnorados - + Ban from &server Ban&ir do servidor - Duration - Duração + Duração - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Por favor, digite a duração do banimento (em minutos). + Por favor, digite a duração do banimento (em minutos). Digite 0 para banir indefinidamente. diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index ed2d3b20..ea4aa904 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -125,6 +125,37 @@ Escolher directório + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Por favor introduza a duração do banimento (em minutos). +Introduza 0 para um banimento indefinido. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + &Cancelar + + + + Ban user from server + + + CardDatabaseModel @@ -995,22 +1026,22 @@ DeckViewContainer - + Load &local deck Carregar deck l&ocal - + Load d&eck from server Carregar deck do &servidor - + Ready to s&tart &Pronto para começar - + Load deck Carregar deck @@ -1862,92 +1893,92 @@ Versão local é %1, versão remota é %2. MessageLogWidget - + Connecting to %1... Ligando a %1... - + Connected. Ligado. - + Disconnected from server. Desligado do servidor. - + Invalid password. Password incorrecto. - + Protocol version mismatch. Client: %1, Server: %2 Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 - + Protocol error. Erro de protocolo. - + You have joined game #%1. Você entrou no jogo #%1. - + %1 has joined the game. %1 entrou no jogo. - + %1 has left the game. %1 abandonou o jogo. - + The game has been closed. Este jogo foi encerrado. - + %1 is now watching the game. %1 está agora a ver o jogo. - + %1 is not watching the game any more. %1 já não está a ver o jogo. - + %1 has loaded a local deck. %1 carregou um deck local. - + %1 has loaded deck #%2. %1 carregou o deck #%2. - + %1 is ready to start the game. %1 está pronto a começar o jogo. - + %1 is not ready to start the game any more. %1 já não está pronto a começar o jogo. - + %1 has conceded the game. %1 concedeu o jogo. - + The game has started. O jogo começou. @@ -1956,7 +1987,7 @@ Versão local é %1, versão remota é %2. %1 baralha o grimório. - + %1 rolls a %2 with a %3-sided die. %1 obteve %2 com um dado de %3 faces. @@ -1969,157 +2000,157 @@ Versão local é %1, versão remota é %2. %1 compra %2 cartas. - + from table vindo da mesa - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library a carta do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library do fundo do seu grimório - + from the bottom of her library - + the top card of his library a carta do topo do seu grimório - + the top card of her library - + from the top of his library do topo do seu grimório - + from the top of her library - + from library do grimório - + from sideboard do sideboard - + from the stack da pilha - + %1 puts %2 into play tapped%3. %1 coloca %2 em jogo virado(a)%3. - + %1 puts %2 into play%3. %1 coloca %2 em jogo %3. - + %1 puts %2%3 into graveyard. %1 coloca %2%3 no cemitério. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2%3 para a mão. - + %1 puts %2%3 into his library. %1 coloca %2%3 no seu grimório. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 coloca %2%3 no fundo do seu grimório. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 coloca %2%3 no topo do seu grimório. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 coloca %2%3 no seu grimório na posição %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2%3 para o sideboard. - + %1 plays %2%3. %1 joga %2%3. - + %1 takes a mulligan to %n. @@ -2127,17 +2158,17 @@ Versão local é %1, versão remota é %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 places %n %2 counter(s) on %3 (now %4). %1 coloca %n %2 marcador em %3 (agora com %4). @@ -2145,7 +2176,7 @@ Versão local é %1, versão remota é %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 remove %n %2 marcador de %3 (agora com %4). @@ -2153,28 +2184,28 @@ Versão local é %1, versão remota é %2. - - + + a card uma carta - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 draws %n card(s). %1 compra %n carta. @@ -2182,67 +2213,67 @@ Versão local é %1, versão remota é %2. - + %1 undoes his last draw. %1 desfaz a sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz a sua última compra (%2). - + %1 undoes her last draw (%2). - + %1 gives %2 control over %3. %1 dá controlo sobre %3 a %2. - + %1 flips %2 face-down. %1 volta a face de %2 para baixo. - + %1 flips %2 face-up. %1 volta a face de %2 para cima. - + %1 destroys %2. %1 destrói %2. - + %1 attaches %2 to %3's %4. %1 anexa %2 a %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 creates token: %2%3. %1 cria ficha: %2%3. - + %1 points from %2's %3 to %4. %1 aponta de %3 de %2 para %4. - + %1 points from %2's %3 to %4's %5. %1 aponta de %3 de %2 para %5 de %4. @@ -2261,7 +2292,7 @@ Versão local é %1, versão remota é %2. - + red vermelho @@ -2269,7 +2300,7 @@ Versão local é %1, versão remota é %2. - + yellow amarelo @@ -2277,7 +2308,7 @@ Versão local é %1, versão remota é %2. - + green verde @@ -2285,162 +2316,162 @@ Versão local é %1, versão remota é %2. - + his permanents as suas permanentes - + her permanents - + %1 %2 %3. %1 %2 %3. - + taps vira - + untaps desvira - + %1 sets counter %2 to %3 (%4%5). %1 altera o número de marcadores %2 para %3(%4%5). - + %1 sets %2 to not untap normally. %1 define %2 para não desvirar normalmente. - + %1 sets %2 to untap normally. %1 define %2 para desvirar normalmente. - + %1 sets PT of %2 to %3. %1 define o P/R de %2 como %3. - + %1 sets annotation of %2 to %3. %1 coloca uma nota de %2 em%3. - + %1 is looking at the top %2 cards %3. %1 está a olhar para as %2 cartas do topo %3. - + %1 is looking at %2. %1 está a olhar para %2. - + %1 stops looking at %2. %1 para de olhar para %2. - + %1 reveals %2 to %3. %1 revela %2 a %3. - + %1 reveals %2. %1 revela %2. - + %1 randomly reveals %2%3 to %4. %1 revela aleatoreamente %2%3. a %4. - + %1 randomly reveals %2%3. %1 revela aleatoreamente %2%3. - + %1 reveals %2%3 to %4. %1 revela %2%3 a %4. - + %1 reveals %2%3. %1 revela %2%3. - + It is now %1's turn. É agora o turno de %1. - + untap step Etapa de Desvirar - + upkeep step Etapa de Manutenção - + draw step Etapa de Compra - + first main phase 1ª Fase Principal (pré-combate) - + beginning of combat step Etapa de Início de Combate - + declare attackers step Etapa de Declaração de Atacantes - + declare blockers step Etapa de Declaração de Bloqueadores - + combat damage step Etapa de Dano de Combate - + end of combat step Etapa de Fim de Combate - + second main phase 2ª Fase Principal (pós-combate) - + ending phase Fase Final - + It is now the %1. É agora a %1. @@ -3177,137 +3208,137 @@ Por favor introduza um nome: TabGame - + F5 F5 - + F6 F6 - + F7 F7 - + F8 F8 - + F9 F9 - + F10 F10 - + &Phases Fa&ses - + &Game &Jogo - + Next &phase Próxima &fase - + Ctrl+Space Ctrl+Space - + Next &turn Próximo &turno - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Remover todas as setas locais - + Ctrl+R Ctrl+R - + &Concede &Conceder - + F2 F2 - + &Leave game Sair do &jogo - + Ctrl+Q Ctrl+Q - + &Say: &Dizer: - + Concede Conceder - + Are you sure you want to concede this game? Tem a certeza que deseja conceder este jogo? - + Leave game Sair do jogo - + Are you sure you want to leave this game? Tem a certeza que deseja sair deste jogo? - + Kicked Expulso - + You have been kicked out of the game. Você foi expulso do jogo. - + Game %1: %2 Jogo %1: %2 @@ -3315,27 +3346,27 @@ Por favor introduza um nome: TabMessage - + Personal &talk Conversação &privada - + &Leave &Abandonar - + This user is ignoring you. Este utilizador esta a ignorar-te. - + %1 has left the server. %1 abandonou o servidor. - + %1 has joined the server. %1 entrou no servidor. @@ -3348,27 +3379,27 @@ Por favor introduza um nome: TabRoom - + &Say: &Dizer: - + Chat - + &Room &Sala - + &Leave room &Abandonar a sala - + You are flooding the chat. Please wait a couple of seconds. Estás a inundar o chat .Por favor aguarde alguns segundos. @@ -3490,70 +3521,68 @@ Por favor introduza um nome: UserList - + Users online: %1 Utilizadores online: %1 - + Users in this room: %1 Utilizadores nesta sala:%1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Utilizadores ignorados online %1 / %2 - + User &details Detalhes do &utilizador - + Direct &chat Conversação &directa - + Add to &buddy list Adicionar a lista de &amigos - + Remove from &buddy list Remover da lista de &amigos - + Add to &ignore list Adicionar a lista a &ignorar - + Remove from &ignore list Remover da lista a &ignorar - + Ban from &server Banir do &servidor - Duration - Duração + Duração - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Por favor introduza a duração do banimento (em minutos). + Por favor introduza a duração do banimento (em minutos). Introduza 0 para um banimento indefinido. diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index 43d41057..94e9d03a 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -121,6 +121,37 @@ Выберите путь + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + Введите продолжительность бана (в минутах). +Введите 0 чтобы забанить пожизненно. + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + &Ок + + + + &Cancel + &Отмена + + + + Ban user from server + + + CardDatabaseModel @@ -941,22 +972,22 @@ DeckViewContainer - + Load &local deck Загрузить &колоду с диска - + Load d&eck from server Загрузить к&олоду с сервера - + Ready to s&tart &Готов - + Load deck Загрузить колоду @@ -1786,92 +1817,92 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... Подключение к %1... - + Connected. Подключено. - + Disconnected from server. Нет соединения с сервером. - + Invalid password. Неверный пароль. - + Protocol version mismatch. Client: %1, Server: %2 Несовпадение версий. Клиент: %1, Сервер: %2 - + Protocol error. Ошибка протокола. - + You have joined game #%1. Вы присоединились к игре #%1. - + %1 has joined the game. %1 присоединился к игре. - + %1 has left the game. %1 покиул игру. - + The game has been closed. Игра закрыта. - + %1 is now watching the game. %1 вошел как зритель. - + %1 is not watching the game any more. %1 покинул зрительскую ложу. - + %1 has loaded a local deck. %1 загрузил колоду с диска. - + %1 has loaded deck #%2. %1 загрузил колоду #%2. - + %1 is ready to start the game. %1 готов начать игру. - + %1 is not ready to start the game any more. %1 все еще не готов. - + %1 has conceded the game. %1 решил сдаться. - + The game has started. Игра началась. @@ -1880,7 +1911,7 @@ Local version is %1, remote version is %2. %1 размешивает библиотеку. - + %1 rolls a %2 with a %3-sided die. %1 выкинул %2 / %3. @@ -1893,168 +1924,168 @@ Local version is %1, remote version is %2. %1 взял %2 карт. - + %1 undoes his last draw. %1 отменил последнее взятие. - + %1 undoes his last draw (%2). %1 отменил %2 последних взятий. - + from table с поля битвы - + from graveyard из кладбища - + from exile из изгнания - + from hand из руки - + the bottom card of his library нижнюю карту своей библиотеки - + from the bottom of his library со дна своей библиотеки - + the top card of his library верхнюю карту своей библиотеки - + from the top of his library с верха своей библиотеки - + from library из библиотеки - + from sideboard из сайда - + from the stack из стека - - + + a card карту - + %1 gives %2 control over %3. %1 передает %2 контроль над %3. - + %1 puts %2 into play%3. %1 поместил %2 на поле битвы %3. - + %1 puts %2%3 into graveyard. %1 поместил %2%3 на кладбище. - + %1 exiles %2%3. %1 изгоняет %2%3. - + %1 moves %2%3 to hand. %1 поместил %2%3 в руку. - + %1 puts %2%3 into his library. %1 поместил %2%3 в свою библиотеку. - + %1 puts %2%3 on bottom of his library. %1 поместил %2%3 на дно своей библиотеки. - + %1 puts %2%3 on top of his library. %1 поместил %2%3 на верх своей библиотеки. - + %1 puts %2%3 into his library at position %4. %1 поместил %2%3 в свою библиотеку %4 сверху. - + %1 moves %2%3 to sideboard. %1 поместил %2%3 в сайд. - + %1 plays %2%3. %1 разыгрывает %2%3. - + %1 flips %2 face-down. %1 перевернул %2 лицом вниз. - + %1 flips %2 face-up. %1 перевернул %2 лицом вверх. - + %1 destroys %2. %1 уничтожил %2. - + %1 attaches %2 to %3's %4. %1 присоединил %2 к %4 игрока %3. - + %1 unattaches %2. %1 отсоединил %2. - + %1 creates token: %2%3. %1 создал фишку: %2%3. - + %1 points from %2's %3 to %4. %1 указывает с %3 контролируемого %2 на %4. - + %1 points from %2's %3 to %4's %5. %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. @@ -2075,22 +2106,22 @@ Local version is %1, remote version is %2. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 draws %n card(s). %1 взял %n карту. @@ -2099,62 +2130,62 @@ Local version is %1, remote version is %2. - + %1 undoes her last draw. - + %1 undoes her last draw (%2). - + the bottom card of her library - + from the bottom of her library - + the top card of her library - + from the top of her library - + %1 puts %2 into play tapped%3. %1 положил %2 повернутым на поле битвы%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into her library at position %4. - + %1 takes a mulligan to %n. @@ -2163,17 +2194,17 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 places %n %2 counter(s) on %3 (now %4). %1 поместил %n %2 жетон на %3 (теперь %4). @@ -2182,7 +2213,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). %1 снял %n %2 жетон с %3 (теперь %4). @@ -2191,7 +2222,7 @@ Local version is %1, remote version is %2. - + red красный @@ -2200,7 +2231,7 @@ Local version is %1, remote version is %2. - + yellow желтый @@ -2209,7 +2240,7 @@ Local version is %1, remote version is %2. - + green зеленый @@ -2218,162 +2249,162 @@ Local version is %1, remote version is %2. - + his permanents свои перманенты - + her permanents - + %1 %2 %3. %1 %2 %3. - + taps повернул - + untaps развернул - + %1 sets counter %2 to %3 (%4%5). %1 установил жетон %2 на %3 (%4%5). - + %1 sets %2 to not untap normally. %2 теперь не разворачивается как обычно (%1). - + %1 sets %2 to untap normally. %2 теперь разворачивается как обычно (%1). - + %1 sets PT of %2 to %3. %1 установил Силу/Защиту %2 %3. - + %1 sets annotation of %2 to %3. %1 сделал пометку на %2 "%3". - + %1 is looking at the top %2 cards %3. %1 смотрит верхние %2 карт библиотеки %3. - + %1 is looking at %2. %1 просматривает %2. - + %1 stops looking at %2. %1 закончил просматривать %2. - + %1 reveals %2 to %3. %1 показывает его %2 %3. - + %1 reveals %2. %1 открыл его %2. - + %1 randomly reveals %2%3 to %4. %1 показывает случайно выбранную%3 карту (%2) %4. - + %1 randomly reveals %2%3. %1 открывает случайно выбранную%3 карту (%2). - + %1 reveals %2%3 to %4. %1 показывает%2%3 %4. - + %1 reveals %2%3. %1 открывает%2%3. - + It is now %1's turn. Ход игрока %1. - + untap step шаг разворота - + upkeep step шаг поддержки - + draw step шаг взятия карты - + first main phase первая главная фаза - + beginning of combat step шаг начала битвы - + declare attackers step шаг назначения атакующих - + declare blockers step шаг назначения блокирующих - + combat damage step шаг нанесения повреждений - + end of combat step шаг завершения битвы - + second main phase вторая главная фаза - + ending phase заключительный шаг - + It is now the %1. Сейчас %1. @@ -3076,137 +3107,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases &Фазы - + &Game &Игра - + Next &phase Следующая &фаза - + Ctrl+Space - + Next &turn Следующий &ход - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows &Удалить все указатели - + Ctrl+R - + &Concede Сда&юсь! - + F2 - + &Leave game Покинуть и&гру - + Ctrl+Q - + &Say: Ска&зать: - + Concede Сдаться - + Are you sure you want to concede this game? Испугался? - + Leave game Покинуть игру - + Are you sure you want to leave this game? Вы уверены, что хотите уйти? - + Kicked Выкинут - + You have been kicked out of the game. Вас выкинули из игры. - + Game %1: %2 Игра %1: %2 @@ -3214,27 +3245,27 @@ Please enter a name: TabMessage - + Personal &talk Личная &беседа - + &Leave &Покинуть - + This user is ignoring you. Этот пользователь добавил вас в игнор-лист. - + %1 has left the server. %1 отключился. - + %1 has joined the server. %1 зашел на сервер. @@ -3247,27 +3278,27 @@ Please enter a name: TabRoom - + &Say: &Сказать: - + Chat Чат - + &Room &Комната - + &Leave room &Покинуть комнату - + You are flooding the chat. Please wait a couple of seconds. Кажется, Вы нафлудили. Пожалуйста, подождите пару секунд. @@ -3381,70 +3412,68 @@ Please enter a name: UserList - + Users online: %1 Пользователей онлайн: %1 - + Users in this room: %1 Пользователей в этой комнате: %1 - + Buddies online: %1 / %2 Друзей онлайн: %1 / %2 - + Ignored users online: %1 / %2 Игнорируемых пользователей онлайн: %1 / %2 - + User &details Данные о &пользователе - + Direct &chat Обратиться &лично - + Add to &buddy list Добавить в список &друзей - + Remove from &buddy list &Удалить из друзей - + Add to &ignore list Добавить в &игнор-лист - + Remove from &ignore list Удалить и&з игнор-листа - + Ban from &server За&банить на сервере - Duration - Продолжительность + Продолжительность - Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - Введите продолжительность бана (в минутах). + Введите продолжительность бана (в минутах). Введите 0 чтобы забанить пожизненно. diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index aca97b8b..596131a7 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -121,6 +121,36 @@ + + BanDialog + + + Please enter the duration of the ban (in minutes). +Enter 0 for an indefinite ban. + + + + + Please enter the reason for the ban. +This is only saved for moderators and cannot be seen by the banned person. + + + + + &OK + + + + + &Cancel + + + + + Ban user from server + + + CardDatabaseModel @@ -787,22 +817,22 @@ DeckViewContainer - + Load &local deck - + Load d&eck from server - + Ready to s&tart - + Load deck @@ -1628,117 +1658,117 @@ Local version is %1, remote version is %2. MessageLogWidget - + Connecting to %1... - + Connected. - + Disconnected from server. - + Invalid password. - + Protocol version mismatch. Client: %1, Server: %2 - + Protocol error. - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 is not ready to start the game any more. - + %1 has conceded the game. - + The game has started. - + %1 has restored connection to the game. - + %1 has lost connection to the game. - + %1 shuffles %2. - + %1 rolls a %2 with a %3-sided die. - + %1 draws %n card(s). @@ -1747,188 +1777,188 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. @@ -1937,57 +1967,57 @@ Local version is %1, remote version is %2. - + %1 draws his initial hand. - + %1 draws her initial hand. - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 destroys %2. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 points from %2's %3 to %4's %5. - + %1 places %n %2 counter(s) on %3 (now %4). @@ -1996,7 +2026,7 @@ Local version is %1, remote version is %2. - + %1 removes %n %2 counter(s) from %3 (now %4). @@ -2005,7 +2035,7 @@ Local version is %1, remote version is %2. - + red @@ -2014,7 +2044,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2023,7 +2053,7 @@ Local version is %1, remote version is %2. - + green @@ -2032,162 +2062,162 @@ Local version is %1, remote version is %2. - + his permanents - + her permanents - + %1 %2 %3. - + taps - + untaps - + %1 sets counter %2 to %3 (%4%5). - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + %1 reveals %2 to %3. - + %1 reveals %2. - + %1 randomly reveals %2%3 to %4. - + %1 randomly reveals %2%3. - + %1 reveals %2%3 to %4. - + %1 reveals %2%3. - + It is now %1's turn. - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -2877,137 +2907,137 @@ Please enter a name: TabGame - + F5 - + F6 - + F7 - + F8 - + F9 - + F10 - + &Phases - + &Game - + Next &phase - + Ctrl+Space - + Next &turn - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows - + Ctrl+R - + &Concede - + F2 - + &Leave game - + Ctrl+Q - + &Say: - + Concede - + Are you sure you want to concede this game? - + Leave game - + Are you sure you want to leave this game? - + Kicked - + You have been kicked out of the game. - + Game %1: %2 @@ -3015,27 +3045,27 @@ Please enter a name: TabMessage - + Personal &talk - + &Leave - + This user is ignoring you. - + %1 has left the server. - + %1 has joined the server. @@ -3048,27 +3078,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3178,71 +3208,60 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + User &details - + Direct &chat - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server - - - Duration - - - - - Please enter the duration of the ban (in minutes). -Enter 0 for an indefinite ban. - - WndDeckEditor diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index b92a182b..33670ef4 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -484,11 +484,12 @@ Command_ShutdownServer::Command_ShutdownServer(const QString &_reason, int _minu insertItem(new SerializableItem_String("reason", _reason)); insertItem(new SerializableItem_Int("minutes", _minutes)); } -Command_BanFromServer::Command_BanFromServer(const QString &_userName, int _minutes) +Command_BanFromServer::Command_BanFromServer(const QString &_userName, int _minutes, const QString &_reason) : ModeratorCommand("ban_from_server") { insertItem(new SerializableItem_String("user_name", _userName)); insertItem(new SerializableItem_Int("minutes", _minutes)); + insertItem(new SerializableItem_String("reason", _reason)); } void ProtocolItem::initializeHashAuto() { diff --git a/common/protocol_items.dat b/common/protocol_items.dat index ab83e15a..2e0f8603 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -80,4 +80,4 @@ 6:mulligan:i,number 7:update_server_message 7:shutdown_server:s,reason:i,minutes -8:ban_from_server:s,user_name:i,minutes \ No newline at end of file +8:ban_from_server:s,user_name:i,minutes:s,reason \ No newline at end of file diff --git a/common/protocol_items.h b/common/protocol_items.h index 810357a8..efeb7f93 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -735,9 +735,10 @@ public: class Command_BanFromServer : public ModeratorCommand { Q_OBJECT public: - Command_BanFromServer(const QString &_userName = QString(), int _minutes = -1); + Command_BanFromServer(const QString &_userName = QString(), int _minutes = -1, const QString &_reason = QString()); QString getUserName() const { return static_cast(itemMap.value("user_name"))->getData(); }; int getMinutes() const { return static_cast(itemMap.value("minutes"))->getData(); }; + QString getReason() const { return static_cast(itemMap.value("reason"))->getData(); }; static SerializableItem *newItem() { return new Command_BanFromServer; } int getItemId() const { return ItemId_Command_BanFromServer; } }; diff --git a/common/server.cpp b/common/server.cpp index e4c68ff9..07f7c7cf 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -52,7 +52,7 @@ AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString QMutexLocker locker(&serverMutex); if (name.size() > 35) name = name.left(35); - AuthenticationResult authState = checkUserPassword(name, password); + AuthenticationResult authState = checkUserPassword(session, name, password); if (authState == PasswordWrong) return authState; diff --git a/common/server.h b/common/server.h index 1c35f5a1..d2f15e76 100644 --- a/common/server.h +++ b/common/server.h @@ -43,7 +43,6 @@ public: virtual QMap getBuddyList(const QString &name) = 0; virtual QMap getIgnoreList(const QString &name) = 0; - virtual bool getUserBanned(Server_ProtocolHandler * /*client*/, const QString & /*userName*/) const { return false; } protected: void prepareDestroy(); QList clients; @@ -51,7 +50,7 @@ protected: QMap rooms; virtual bool userExists(const QString &user) = 0; - virtual AuthenticationResult checkUserPassword(const QString &user, const QString &password) = 0; + virtual AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password) = 0; virtual ServerInfo_User *getUserData(const QString &name) = 0; int getUsersCount() const; int getGamesCount() const; diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index b929edb6..de50435a 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -280,8 +280,6 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd, CommandContain QString userName = cmd->getUsername().simplified(); if (userName.isEmpty() || (userInfo != 0)) return RespContextError; - if (server->getUserBanned(this, userName)) - return RespWrongPassword; authState = server->loginUser(this, userName, cmd->getPassword()); if (authState == PasswordWrong) return RespWrongPassword; diff --git a/servatrice/servatrice.sql b/servatrice/servatrice.sql index 06effa01..7bd64c58 100644 --- a/servatrice/servatrice.sql +++ b/servatrice/servatrice.sql @@ -111,7 +111,6 @@ CREATE TABLE IF NOT EXISTS `cockatrice_users` ( `avatar_bmp` blob NOT NULL, `registrationDate` datetime NOT NULL, `active` tinyint(1) NOT NULL, - `banned` tinyint(1) NOT NULL, `token` char(32) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) @@ -149,3 +148,12 @@ CREATE TABLE `cockatrice_buddylist` ( KEY `id_user2` (`id_user2`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; +CREATE TABLE `cockatrice_bans` ( + `id_user` int(7) unsigned zerofill NOT NULL, + `id_admin` int(7) unsigned zerofill NOT NULL, + `time_from` datetime NOT NULL, + `minutes` int(6) NOT NULL, + `reason` text NOT NULL, + KEY `id_user` (`id_user`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index fffc1cec..1bb126e5 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -169,25 +169,32 @@ bool Servatrice::execSqlQuery(QSqlQuery &query) return false; } -AuthenticationResult Servatrice::checkUserPassword(const QString &user, const QString &password) +AuthenticationResult Servatrice::checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password) { + serverMutex.lock(); + QHostAddress address = static_cast(handler)->getPeerAddress(); + for (int i = 0; i < addressBanList.size(); ++i) + if (address == addressBanList[i].first) + return PasswordWrong; + serverMutex.unlock(); + QMutexLocker locker(&dbMutex); const QString method = settings->value("authentication/method").toString(); if (method == "none") return UnknownUser; else if (method == "sql") { checkSql(); - + QSqlQuery query; - query.prepare("select banned, password from " + dbPrefix + "_users where name = :name and active = 1"); + query.prepare("select a.password, timediff(now(), date_add(b.time_from, interval b.minutes minute)) < 0, b.minutes <=> 0 from " + dbPrefix + "_users a left join " + dbPrefix + "_bans b on b.id_user = a.id and b.time_from = (select max(c.time_from) from " + dbPrefix + "_bans c where c.id_user = a.id) where a.name = :name and a.active = 1"); query.bindValue(":name", user); if (!execSqlQuery(query)) return PasswordWrong; if (query.next()) { - if (query.value(0).toInt()) + if (query.value(1).toInt() || query.value(2).toInt()) return PasswordWrong; - if (query.value(1).toString() == password) + if (query.value(0).toString() == password) return PasswordRight; else return PasswordWrong; @@ -325,19 +332,6 @@ QMap Servatrice::getIgnoreList(const QString &name) return result; } -bool Servatrice::getUserBanned(Server_ProtocolHandler *client, const QString &userName) const -{ - QMutexLocker locker(&serverMutex); - QHostAddress address = static_cast(client)->getPeerAddress(); - for (int i = 0; i < addressBanList.size(); ++i) - if (address == addressBanList[i].first) - return true; - for (int i = 0; i < nameBanList.size(); ++i) - if (userName == nameBanList[i].first) - return true; - return false; -} - void Servatrice::updateBanTimer() { QMutexLocker locker(&serverMutex); @@ -346,11 +340,6 @@ void Servatrice::updateBanTimer() addressBanList.removeAt(i); else ++i; - for (int i = 0; i < nameBanList.size(); ) - if (--(nameBanList[i].second) <= 0) - nameBanList.removeAt(i); - else - ++i; } void Servatrice::updateLoginMessage() diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 1a3d1d09..5a2fb1b8 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -74,13 +74,11 @@ public: int getUsersWithAddress(const QHostAddress &address) const; QMap getBuddyList(const QString &name); QMap getIgnoreList(const QString &name); - bool getUserBanned(Server_ProtocolHandler *client, const QString &userName) const; void addAddressBan(const QHostAddress &address, int minutes) { addressBanList.append(QPair(address, minutes)); } - void addNameBan(const QString &name, int minutes) { nameBanList.append(QPair(name, minutes)); } void scheduleShutdown(const QString &reason, int minutes); protected: bool userExists(const QString &user); - AuthenticationResult checkUserPassword(const QString &user, const QString &password); + AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password); private: QTimer *pingClock, *statusUpdateClock, *banTimeoutClock; QTcpServer *tcpServer; @@ -90,7 +88,6 @@ private: int serverId; int uptime; QList > addressBanList; - QList > nameBanList; int maxGameInactivityTime, maxPlayerInactivityTime; int maxUsersPerAddress, messageCountingInterval, maxMessageCountPerInterval, maxMessageSizePerInterval, maxGamesPerUser; ServerInfo_User *evalUserQueryResult(const QSqlQuery &query, bool complete); diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 769e6588..895fcee2 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -488,14 +488,14 @@ ResponseCode ServerSocketInterface::cmdBanFromServer(Command_BanFromServer *cmd, ServerSocketInterface *user = static_cast(server->getUsers().value(userName)); if (user->getUserInfo()->getUserLevel() & ServerInfo_User::IsRegistered) { // Registered users can be banned by name. - if (minutes == 0) { - QMutexLocker locker(&servatrice->dbMutex); - QSqlQuery query; - query.prepare("update " + servatrice->getDbPrefix() + "_users set banned=1 where name = :name"); - query.bindValue(":name", userName); - servatrice->execSqlQuery(query); - } else - servatrice->addNameBan(userName, minutes); + QMutexLocker locker(&servatrice->dbMutex); + QSqlQuery query; + query.prepare("insert into " + servatrice->getDbPrefix() + "_bans (id_user, id_admin, time_from, minutes, reason) values(:id_user, :id_admin, NOW(), :minutes, :reason)"); + query.bindValue(":id_user", getUserIdInDB(userName)); + query.bindValue(":id_admin", getUserIdInDB(userInfo->getName())); + query.bindValue(":minutes", minutes); + query.bindValue(":reason", cmd->getReason()); + servatrice->execSqlQuery(query); } else { // Unregistered users must be banned by IP address. // Indefinite address bans are not reasonable -> default to 30 minutes. From 7bfa3e6d3ad32bc42c1b173fa1c45e7edb316eba Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 25 Jun 2011 23:42:16 +0200 Subject: [PATCH 06/26] cuckoo --- cockatrice/src/messagelogwidget.cpp | 2 +- cockatrice/src/soundengine.cpp | 7 ++++++- cockatrice/src/soundengine.h | 1 + sounds/cuckoo.wav | Bin 0 -> 43340 bytes 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 sounds/cuckoo.wav diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 216fe138..fa69419f 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -77,7 +77,7 @@ void MessageLogWidget::logGameJoined(int gameId) void MessageLogWidget::logJoin(Player *player) { - soundEngine->notification(); + soundEngine->cuckoo(); myAppend(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); } diff --git a/cockatrice/src/soundengine.cpp b/cockatrice/src/soundengine.cpp index 5daeae9a..247567cc 100644 --- a/cockatrice/src/soundengine.cpp +++ b/cockatrice/src/soundengine.cpp @@ -25,7 +25,7 @@ SoundEngine::SoundEngine(QObject *parent) void SoundEngine::cacheData() { static const QStringList fileNames = QStringList() - << "notification" << "draw" << "playcard" << "shuffle" << "tap" << "untap"; + << "notification" << "draw" << "playcard" << "shuffle" << "tap" << "untap" << "cuckoo"; for (int i = 0; i < fileNames.size(); ++i) { QFile file(settingsCache->getSoundPath() + "/" + fileNames[i] + ".raw"); file.open(QIODevice::ReadOnly); @@ -75,3 +75,8 @@ void SoundEngine::untap() { playSound("untap"); } + +void SoundEngine::cuckoo() +{ + playSound("cuckoo"); +} diff --git a/cockatrice/src/soundengine.h b/cockatrice/src/soundengine.h index 312a476b..d65b3f2d 100644 --- a/cockatrice/src/soundengine.h +++ b/cockatrice/src/soundengine.h @@ -25,6 +25,7 @@ public slots: void shuffle(); void tap(); void untap(); + void cuckoo(); }; extern SoundEngine *soundEngine; diff --git a/sounds/cuckoo.wav b/sounds/cuckoo.wav new file mode 100644 index 0000000000000000000000000000000000000000..5eba46f976c5b40f8371e2a048cd9bdfb0efe564 GIT binary patch literal 43340 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 siEX`1O? Date: Mon, 27 Jun 2011 14:42:57 +0200 Subject: [PATCH 07/26] limit game name length to 50 characters --- common/server_protocolhandler.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index de50435a..d1df0177 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -475,7 +475,10 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd, Comm for (int i = 0; i < gameTypeList.size(); ++i) gameTypes.append(gameTypeList[i]->getData()); - Server_Game *game = room->createGame(cmd->getDescription(), cmd->getPassword(), cmd->getMaxPlayers(), gameTypes, cmd->getOnlyBuddies(), cmd->getOnlyRegistered(), cmd->getSpectatorsAllowed(), cmd->getSpectatorsNeedPassword(), cmd->getSpectatorsCanTalk(), cmd->getSpectatorsSeeEverything(), this); + QString description = cmd->getDescription(); + if (description.size() > 50) + description = description.left(50); + Server_Game *game = room->createGame(description, cmd->getPassword(), cmd->getMaxPlayers(), gameTypes, cmd->getOnlyBuddies(), cmd->getOnlyRegistered(), cmd->getSpectatorsAllowed(), cmd->getSpectatorsNeedPassword(), cmd->getSpectatorsCanTalk(), cmd->getSpectatorsSeeEverything(), this); Server_Player *creator = game->getPlayers().values().first(); From aa38733f0393e9a6c9fc5b3ae5e749e4227b6771 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 27 Jun 2011 14:50:07 +0200 Subject: [PATCH 08/26] fixed Server_Card::resetState --- common/server_card.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/server_card.cpp b/common/server_card.cpp index 4c47f20d..3d34ac53 100644 --- a/common/server_card.cpp +++ b/common/server_card.cpp @@ -39,8 +39,8 @@ void Server_Card::resetState() counters.clear(); setTapped(false); setAttacking(false); - power = 0; - toughness = 0; + power = -1; + toughness = -1; setAnnotation(QString()); setDoesntUntap(false); } From d2d06b853f2fe2becc9a5a533a6eeff698c5089d Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 27 Jun 2011 15:29:17 +0200 Subject: [PATCH 09/26] edit field for minimum number of players to allow multi-column layout for --- cockatrice/src/dlg_settings.cpp | 11 +++++++++++ cockatrice/src/dlg_settings.h | 4 +++- cockatrice/src/gamescene.cpp | 4 +++- cockatrice/src/settingscache.cpp | 8 ++++++++ cockatrice/src/settingscache.h | 4 ++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/cockatrice/src/dlg_settings.cpp b/cockatrice/src/dlg_settings.cpp index 3f1c5a3d..01d4445a 100644 --- a/cockatrice/src/dlg_settings.cpp +++ b/cockatrice/src/dlg_settings.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "carddatabase.h" #include "dlg_settings.h" #include "main.h" @@ -242,8 +243,17 @@ AppearanceSettingsPage::AppearanceSettingsPage() invertVerticalCoordinateCheckBox->setChecked(settingsCache->getInvertVerticalCoordinate()); connect(invertVerticalCoordinateCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setInvertVerticalCoordinate(int))); + minPlayersForMultiColumnLayoutLabel = new QLabel; + minPlayersForMultiColumnLayoutEdit = new QSpinBox; + minPlayersForMultiColumnLayoutEdit->setMinimum(2); + minPlayersForMultiColumnLayoutEdit->setValue(settingsCache->getMinPlayersForMultiColumnLayout()); + connect(minPlayersForMultiColumnLayoutEdit, SIGNAL(valueChanged(int)), settingsCache, SLOT(setMinPlayersForMultiColumnLayout(int))); + minPlayersForMultiColumnLayoutLabel->setBuddy(minPlayersForMultiColumnLayoutEdit); + QGridLayout *tableGrid = new QGridLayout; tableGrid->addWidget(invertVerticalCoordinateCheckBox, 0, 0, 1, 2); + tableGrid->addWidget(minPlayersForMultiColumnLayoutLabel, 1, 0, 1, 1); + tableGrid->addWidget(minPlayersForMultiColumnLayoutEdit, 1, 1, 1, 1); tableGroupBox = new QGroupBox; tableGroupBox->setLayout(tableGrid); @@ -289,6 +299,7 @@ void AppearanceSettingsPage::retranslateUi() tableGroupBox->setTitle(tr("Table grid layout")); invertVerticalCoordinateCheckBox->setText(tr("Invert vertical coordinate")); + minPlayersForMultiColumnLayoutLabel->setText(tr("Minimum player count for multi-column layout:")); zoneViewGroupBox->setTitle(tr("Zone view layout")); zoneViewSortByNameCheckBox->setText(tr("Sort by name")); diff --git a/cockatrice/src/dlg_settings.h b/cockatrice/src/dlg_settings.h index 859376d6..f7bd1a52 100644 --- a/cockatrice/src/dlg_settings.h +++ b/cockatrice/src/dlg_settings.h @@ -14,6 +14,7 @@ class QGroupBox; class QCheckBox; class QLabel; class QCloseEvent; +class QSpinBox; class AbstractSettingsPage : public QWidget { public: @@ -65,10 +66,11 @@ signals: void playerAreaBgChanged(const QString &path); void cardBackPicturePathChanged(const QString &path); private: - QLabel *handBgLabel, *stackBgLabel, *tableBgLabel, *playerAreaBgLabel, *cardBackPicturePathLabel; + QLabel *handBgLabel, *stackBgLabel, *tableBgLabel, *playerAreaBgLabel, *cardBackPicturePathLabel, *minPlayersForMultiColumnLayoutLabel; QLineEdit *handBgEdit, *stackBgEdit, *tableBgEdit, *playerAreaBgEdit, *cardBackPicturePathEdit; QCheckBox *displayCardNamesCheckBox, *horizontalHandCheckBox, *invertVerticalCoordinateCheckBox, *zoneViewSortByNameCheckBox, *zoneViewSortByTypeCheckBox; QGroupBox *zoneBgGroupBox, *cardsGroupBox, *handGroupBox, *tableGroupBox, *zoneViewGroupBox; + QSpinBox *minPlayersForMultiColumnLayoutEdit; public: AppearanceSettingsPage(); void retranslateUi(); diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp index 8785adcc..8a8dd17c 100644 --- a/cockatrice/src/gamescene.cpp +++ b/cockatrice/src/gamescene.cpp @@ -3,6 +3,7 @@ #include "zoneviewwidget.h" #include "zoneviewzone.h" #include "phasestoolbar.h" +#include "settingscache.h" #include #include #include @@ -14,6 +15,7 @@ GameScene::GameScene(PhasesToolbar *_phasesToolbar, QObject *parent) { animationTimer = new QBasicTimer; addItem(phasesToolbar); + connect(settingsCache, SIGNAL(minPlayersForMultiColumnLayoutChanged()), this, SLOT(rearrange())); } GameScene::~GameScene() @@ -59,7 +61,7 @@ void GameScene::rearrange() if (firstPlayer == -1) firstPlayer = 0; const int playersCount = playersPlaying.size(); - const int columns = playersCount < 4 ? 1 : 2; + const int columns = playersCount < settingsCache->getMinPlayersForMultiColumnLayout() ? 1 : 2; const int rows = ceil((qreal) playersCount / columns); qreal sceneHeight = 0, sceneWidth = -playerAreaSpacing; diff --git a/cockatrice/src/settingscache.cpp b/cockatrice/src/settingscache.cpp index f7494d76..8c3cee47 100644 --- a/cockatrice/src/settingscache.cpp +++ b/cockatrice/src/settingscache.cpp @@ -24,6 +24,7 @@ SettingsCache::SettingsCache() displayCardNames = settings->value("cards/displaycardnames", true).toBool(); horizontalHand = settings->value("hand/horizontal", true).toBool(); invertVerticalCoordinate = settings->value("table/invert_vertical", false).toBool(); + minPlayersForMultiColumnLayout = settings->value("interface/min_players_multicolumn", 5).toInt(); tapAnimation = settings->value("cards/tapanimation", true).toBool(); zoneViewSortByName = settings->value("zoneview/sortbyname", true).toBool(); @@ -143,6 +144,13 @@ void SettingsCache::setInvertVerticalCoordinate(int _invertVerticalCoordinate) emit invertVerticalCoordinateChanged(); } +void SettingsCache::setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout) +{ + minPlayersForMultiColumnLayout = _minPlayersForMultiColumnLayout; + settings->setValue("interface/min_players_multicolumn", minPlayersForMultiColumnLayout); + emit minPlayersForMultiColumnLayoutChanged(); +} + void SettingsCache::setTapAnimation(int _tapAnimation) { tapAnimation = _tapAnimation; diff --git a/cockatrice/src/settingscache.h b/cockatrice/src/settingscache.h index c834716a..b3f1ae6c 100644 --- a/cockatrice/src/settingscache.h +++ b/cockatrice/src/settingscache.h @@ -20,6 +20,7 @@ signals: void displayCardNamesChanged(); void horizontalHandChanged(); void invertVerticalCoordinateChanged(); + void minPlayersForMultiColumnLayoutChanged(); void soundPathChanged(); private: QSettings *settings; @@ -34,6 +35,7 @@ private: bool displayCardNames; bool horizontalHand; bool invertVerticalCoordinate; + int minPlayersForMultiColumnLayout; bool tapAnimation; bool zoneViewSortByName, zoneViewSortByType; bool soundEnabled; @@ -57,6 +59,7 @@ public: bool getDisplayCardNames() const { return displayCardNames; } bool getHorizontalHand() const { return horizontalHand; } bool getInvertVerticalCoordinate() const { return invertVerticalCoordinate; } + int getMinPlayersForMultiColumnLayout() const { return minPlayersForMultiColumnLayout; } bool getTapAnimation() const { return tapAnimation; } bool getZoneViewSortByName() const { return zoneViewSortByName; } bool getZoneViewSortByType() const { return zoneViewSortByType; } @@ -80,6 +83,7 @@ public slots: void setDisplayCardNames(int _displayCardNames); void setHorizontalHand(int _horizontalHand); void setInvertVerticalCoordinate(int _invertVerticalCoordinate); + void setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout); void setTapAnimation(int _tapAnimation); void setZoneViewSortByName(int _zoneViewSortByName); void setZoneViewSortByType(int _zoneViewSortByType); From 9f098f2a6d9509b5641ca108874fec75c7760c09 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 28 Jun 2011 00:15:19 +0200 Subject: [PATCH 10/26] translation update --- cockatrice/translations/cockatrice_cs.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_de.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_en.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_es.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_fr.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_ja.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_pl.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_pt-br.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_pt.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_ru.ts | 121 ++++++++++---------- cockatrice/translations/cockatrice_sk.ts | 121 ++++++++++---------- 11 files changed, 693 insertions(+), 638 deletions(-) diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index db45c0b2..a3f47786 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures - + Path to hand background: - + Path to stack background: - + Path to table background: - + Path to player info background: - + Path to picture of card back: - + Card rendering - + Display card names on cards having a picture - + Hand layout - + Display hand horizontally (wastes space) - + Table grid layout - + Invert vertical coordinate - + + Minimum player count for multi-column layout: + + + + Zone view layout - + Sort by name - + Sort by type - - - - - + + + + + Choose path @@ -786,12 +791,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General @@ -1138,59 +1143,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error - + Your card database is invalid. Would you like to go back and set the correct path? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? - + Settings - + General - + Appearance - + User interface - + Deck editor - + Messages - + &Close @@ -1358,50 +1363,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English - - - + + + Choose path - + Personal settings - + Language: - + Download card pictures on the fly - + Paths - + Decks directory: - + Pictures directory: - + Path to card database: @@ -2225,22 +2230,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + Add message - + Message: - + &Add - + &Remove @@ -3170,37 +3175,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings - + &Double-click cards to play them (instead of single-click) - + Animation settings - + &Tap/untap animation - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index ce769bac..6ca4c184 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -60,66 +60,71 @@ AppearanceSettingsPage - + Zone background pictures Hintergrundbilder für Kartenzonen - + Path to hand background: Hintergrundbild für die Hand: - + Path to stack background: Hintergrundbild für den Stapel: - + Path to table background: Hintergrundbild für das Spielfeld: - + Path to player info background: Hintergrundbild für den Spielerbereich: - + Path to picture of card back: Pfad zum Bild der Kartenrückseite: - + Card rendering Kartendarstellung - + Display card names on cards having a picture Kartennamen darstellen auch bei Karten, die Bilder haben - + Hand layout Kartenhand - + Display hand horizontally (wastes space) Hand horizonal anzeigen (verschwendet Platz) - + Table grid layout Spielfeldraster + + + Minimum player count for multi-column layout: + Mindestspielerzahl für mehrspaltige Anordnung: + Economical layout Platzsparende Anordnung - + Invert vertical coordinate Vertikale Koordinate umkehren @@ -128,17 +133,17 @@ Platzsparende Anordnung - + Zone view layout Aussehen des Zonenbetrachters - + Sort by name nach Namen sortieren - + Sort by type nach Kartentypen sortieren @@ -147,11 +152,11 @@ standardmäßig alphabetisch sortieren - - - - - + + + + + Choose path Pfad auswählen @@ -1199,12 +1204,12 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) Karten&preisfunktionen anschalten (benutzt Daten von blacklotusproject.com) - + General Allgemeines @@ -1612,9 +1617,9 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic DlgSettings - - - + + + Error Fehler @@ -1631,52 +1636,52 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic Der Pfad zum Kartenbilderverzeichnis ist ungültig. - + Your card database is invalid. Would you like to go back and set the correct path? Ihre Kartendatenbank ist ungültig. Möchten Sie zurückgehen und den korrekten Pfad einstellen? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? Der Pfad zu Ihrem Deckordner ist ungültig. Möchten Sie zurückgehen und den korrekten Pfad einstellen? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? Der Pfad zu Ihrem Kartenbilderordner ist ungültig. Möchten Sie zurückgehen und den korrekten Pfad einstellen? - + Settings Einstellungen - + General Allgemeines - + Appearance Erscheinungsbild - + User interface Bedienung - + Deck editor Deckeditor - + Messages Nachrichten - + &Close S&chließen @@ -2114,50 +2119,50 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GeneralSettingsPage - - - + + + Choose path Pfad auswählen - + Personal settings Persönliche Einstellungen - + Language: Sprache: - + Download card pictures on the fly Kartenbilder dynamisch herunterladen - + Paths Pfade - + Decks directory: Verzeichnis mit Decklisten: - + Pictures directory: Verzeichnis mit Bilddateien: - + Path to card database: Pfad zur Kartendatenbank: - - + + English Deutsch @@ -3339,12 +3344,12 @@ Lokale Version ist %1, Serverversion ist %2. MessagesSettingsPage - + &Add &Hinzufügen - + &Remove &Entfernen @@ -3357,12 +3362,12 @@ Lokale Version ist %1, Serverversion ist %2. Entfernen - + Add message Nachricht hinzufügen - + Message: Nachricht: @@ -4574,37 +4579,37 @@ Bitte geben Sie einen Namen ein: UserInterfaceSettingsPage - + General interface settings Allgemeine Bedienung - + &Double-click cards to play them (instead of single-click) Karten durch &Doppelklick ausspielen (statt Einzelklick) - + Animation settings Animationseinstellungen - + &Tap/untap animation Animiertes &Tappen/Enttappen - + Enable &sounds &Sound anschalten - + Path to sounds directory: Pfad zum Verzeichnis mit den Sounddateien: - + Choose path Pfad auswählen diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index c0d65f99..3fcd278e 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures - + Path to hand background: - + Path to stack background: - + Path to table background: - + Path to player info background: - + Path to picture of card back: - + Card rendering - + Display card names on cards having a picture - + Hand layout - + Display hand horizontally (wastes space) - + Table grid layout - + Invert vertical coordinate - + + Minimum player count for multi-column layout: + + + + Zone view layout - + Sort by name - + Sort by type - - - - - + + + + + Choose path @@ -786,12 +791,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General @@ -1138,59 +1143,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error - + Your card database is invalid. Would you like to go back and set the correct path? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? - + Settings - + General - + Appearance - + User interface - + Deck editor - + Messages - + &Close @@ -1358,50 +1363,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - - + + + Choose path - + Personal settings - + Language: - + Download card pictures on the fly - + Paths - + Decks directory: - + Pictures directory: - + Path to card database: - - + + English English @@ -2231,22 +2236,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + &Add - + &Remove - + Add message - + Message: @@ -3176,37 +3181,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings - + &Double-click cards to play them (instead of single-click) - + Animation settings - + &Tap/untap animation - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index d39522e9..e5e199b2 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -37,66 +37,71 @@ AppearanceSettingsPage - + Zone background pictures Imagenes de la zona de fondo - + Path to hand background: Ruta a la imagen de fondo de la mano: - + Path to stack background: Ruta a la imagen de fondo de la pila: - + Path to table background: Ruta a la imagen de fondo de la mesa: - + Path to player info background: Ruta a la imagen de fondo de la información del jugador: - + Path to picture of card back: Ruta al reverso de las cartas: - + Card rendering Renderizado de las cartas - + Display card names on cards having a picture Mostrar nombre de las cartas en aquellas que tengan imagen - + Hand layout Disposición de la mano - + Display hand horizontally (wastes space) Mostrar la mano horizontalmente (desperdicia espacio) - + Table grid layout Disposición de la rejilla de la mesa + + + Minimum player count for multi-column layout: + + Economical layout Disposición Económica - + Invert vertical coordinate Invertir coordenada vertical @@ -105,26 +110,26 @@ Disposición económica - + Zone view layout Distribución de la zona de visionado - + Sort by name Ordenar por nombre - + Sort by type Ordenar por tipo - - - - - + + + + + Choose path Elija ruta @@ -1129,12 +1134,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General General @@ -1488,9 +1493,9 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error Error @@ -1507,52 +1512,52 @@ This is only saved for moderators and cannot be seen by the banned person.La ruta a tu directorio de imagenes de las cartas es invalida. - + Your card database is invalid. Would you like to go back and set the correct path? Tu base de datos de cartas es invalida. ¿Deseas volver y seleccionar la ruta correcta? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? La ruta a tu directorio de mazos es invalida. ¿Deseas volver y seleccionar la ruta correcta? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? La ruta a tu directorio de imagenes de las cartas es invalida.¿Deseas volver y seleccionar la ruta correcta? - + Settings Preferencias - + General General - + Appearance Apariencia - + User interface Interfaz de usuario - + Deck editor - + Messages Mensajes - + &Close &Cerrar @@ -1724,50 +1729,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - - + + + Choose path Elija ruta - + Personal settings Preferencias personales - + Language: Idioma: - + Download card pictures on the fly Descargar imagenes de las cartas al vuelo - + Paths Rutas - + Decks directory: Directorio de mazos: - + Pictures directory: Directorio de imagenes: - + Path to card database: Ruta a la base de datos de las cartas: - - + + English Español @@ -2617,22 +2622,22 @@ La versión local es %1, la versión remota es %2. MessagesSettingsPage - + &Add &Añadir - + &Remove &Quitar - + Add message Añadir mensaje - + Message: Mensaje: @@ -3637,37 +3642,37 @@ Por favor, introduzca un nombre: UserInterfaceSettingsPage - + General interface settings Preferencias generales de la interfaz - + &Double-click cards to play them (instead of single-click) &Doble click en las cartas para jugarlas (en lugar de un solo click) - + Animation settings Opciones de animación - + &Tap/untap animation Animación de &girar/enderezar - + Enable &sounds - + Path to sounds directory: - + Choose path Elija ruta diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index ecdd4519..1aec9f3c 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures Zone images de fond - + Path to hand background: Chemin pour les images de fond de main: - + Path to stack background: Chemin pour les images de fond de pile: - + Path to table background: Chemin pour les images d'arrière-plan: - + Path to player info background: Chemin pour les images de fond d'affichage d'informations: - + Path to picture of card back: Chemin pour les images de dos des cartes: - + Card rendering Rendu des cartes - + Display card names on cards having a picture Afficher le nom des cartes ayant une image - + Hand layout Disposition de la main - + Display hand horizontally (wastes space) Montrer la main horizontalement - + Table grid layout Disposition en forme de grille - + Invert vertical coordinate Inverser la disposition du champ de bataille - + + Minimum player count for multi-column layout: + + + + Zone view layout Voir disposition de la zone - + Sort by name Tri par nom - + Sort by type Tri par type - - - - - + + + + + Choose path Choisir le chemin @@ -991,12 +996,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General Géneral @@ -1350,59 +1355,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error Erreur - + Your card database is invalid. Would you like to go back and set the correct path? Votre base de carte est invalide. Souhaitez-vous redéfinir le chemin d'accès? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? Le chemin d'accès pour le répertoire de votre deck est invalide. Souhaitez-vous redéfinir le chemin d'accès? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? Le chemin d'accès pour le répertoire de vos images est invalide. Souhaitez-vous redéfinir le chemin d'accès? - + Settings Paramètres - + General Géneral - + Appearance Apparence - + User interface Interface utilisateur - + Deck editor - + Messages Messages - + &Close &Fermer @@ -1575,50 +1580,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English Français - - - + + + Choose path Choisir chemin d'accès - + Personal settings Paramètres personnels - + Language: Langue: - + Download card pictures on the fly Charger les images de cartes à la volée - + Paths Chemins - + Decks directory: Répertoire des decks: - + Pictures directory: Répertoire des images: - + Path to card database: Chemin vers la base de cartes: @@ -2490,22 +2495,22 @@ La version la plus récente est %1, l'ancienne version est %2. MessagesSettingsPage - + Add message Ajouter message - + Message: Message: - + &Add &Ajouter - + &Remove &Enlever @@ -3498,37 +3503,37 @@ Entrez un nom s'il vous plaît: UserInterfaceSettingsPage - + General interface settings Réglages généraux de l'interface - + &Double-click cards to play them (instead of single-click) &Double cliquer sur la carte pour la jouer (au lieu d'un simple clic) - + Animation settings Réglage des animations - + &Tap/untap animation &Animation d'engagement et de dégagement - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index 5f63f561..f6d1b9c0 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -37,58 +37,58 @@ AppearanceSettingsPage - + Zone background pictures 背景画像の設定 - + Path to hand background: 手札の背景画像へのパス: - + Path to stack background: スタックゾーンの背景画像へのパス: - + Path to table background: テーブルの背景画像へのパス: - + Path to player info background: プレイヤー画像へのパス: - + Path to picture of card back: カード背面画像へのパス: - + Card rendering カードレンダリング - + Display card names on cards having a picture やや不明 画像持ちカードのカードネームを表示する - + Hand layout 手札のレイアウト - + Display hand horizontally (wastes space) 手札を横に並べる(スペースを消費します) - + Table grid layout テーブルグリッドのレイアウト @@ -97,31 +97,36 @@ 省スペースレイアウト(カード間間隔を細かくできます) - + Invert vertical coordinate 垂直反転調整 - + + Minimum player count for multi-column layout: + + + + Zone view layout ゾーンビューレイアウト - + Sort by name 名前で整列 - + Sort by type タイプで整列 - - - - - + + + + + Choose path 画像の指定 @@ -834,12 +839,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General 全般 @@ -1186,59 +1191,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error エラー - + Your card database is invalid. Would you like to go back and set the correct path? あなたのカードデータベースは無効です.前に戻って正しいパスを設定してください. - + The path to your deck directory is invalid. Would you like to go back and set the correct path? あなたのデッキディレクトリへのパスは無効です.前に戻って正しいパスを設定してください. - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? あなたのカード画像ディレクトリへのパスは無効です.前に戻って正しいパスを設定してください. - + Settings 設定 - + General 全般 - + Appearance 外観 - + User interface ユーザーインターフェース - + Deck editor - + Messages メッセージ - + &Close @@ -1410,50 +1415,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - - + + + Choose path パスを選択 - + Personal settings 個人設定 - + Language: 言語: - + Download card pictures on the fly - + Paths パス - + Decks directory: デッキディレクトリ: - + Pictures directory: カード画像のディレクトリ: - + Path to card database: カードデータベースのパス: - - + + English Japanese @@ -2278,22 +2283,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + &Add 追加 - + &Remove 削除 - + Add message メッセージを追加する - + Message: メッセージ: @@ -3273,37 +3278,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings インターフェース総合設定 - + &Double-click cards to play them (instead of single-click) ダブルクリックでカードをプレイする(シングルクリックの代わり) - + Animation settings アニメーション設定 - + &Tap/untap animation タップ/アンタップアニメーション - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 564e6ac2..07fd6510 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures - + Path to hand background: - + Path to stack background: - + Path to table background: - + Path to player info background: - + Path to picture of card back: - + Card rendering - + Display card names on cards having a picture - + Hand layout - + Display hand horizontally (wastes space) - + Table grid layout - + Invert vertical coordinate - + + Minimum player count for multi-column layout: + + + + Zone view layout - + Sort by name - + Sort by type - - - - - + + + + + Choose path @@ -786,12 +791,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General @@ -1138,59 +1143,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error - + Your card database is invalid. Would you like to go back and set the correct path? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? - + Settings - + General - + Appearance - + User interface - + Deck editor - + Messages - + &Close @@ -1358,50 +1363,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English - - - + + + Choose path - + Personal settings - + Language: - + Download card pictures on the fly - + Paths - + Decks directory: - + Pictures directory: - + Path to card database: @@ -2225,22 +2230,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + Add message - + Message: - + &Add - + &Remove @@ -3170,37 +3175,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings - + &Double-click cards to play them (instead of single-click) - + Animation settings - + &Tap/untap animation - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index e94fc66b..478d43f9 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -37,57 +37,57 @@ AppearanceSettingsPage - + Zone background pictures Imagens de fundo das zonas - + Path to hand background: Caminho para o fundo da mão: - + Path to stack background: Caminho para o fundo da pilha: - + Path to table background: Caminho para o fundo da mesa: - + Path to player info background: Caminho para o fundo das informações do jogador: - + Path to picture of card back: Caminho para a imagem do verso dos cards: - + Card rendering Renderização do card - + Display card names on cards having a picture Mostrar o nome dos cards nos cards que tem imagem - + Hand layout Layout da mão - + Display hand horizontally (wastes space) Mostrar a mão na horizontal (desperdiça espaço) - + Table grid layout Layout do campo de batalha @@ -96,31 +96,36 @@ Layout econômico - + Invert vertical coordinate Inverter a coordenada vertical - + + Minimum player count for multi-column layout: + + + + Zone view layout Layout de vista da zona - + Sort by name Ordenar por nome - + Sort by type Ordenar por tipo - - - - - + + + + + Choose path Escolher caminho @@ -995,12 +1000,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General Geral @@ -1354,59 +1359,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error Erro - + Your card database is invalid. Would you like to go back and set the correct path? O seu banco de dados de cards é inválido. Você gostaria de voltar e corrigir o caminho? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? O caminho para a sua pasta de decks é inválido. Você gostaria de voltar e corrigir o caminho? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? O caminho para a sua pasta de imagens de cards é inválido. Você gostaria de voltar e corrigir o caminho? - + Settings Configurações - + General Geral - + Appearance Aparência - + User interface Interface do usuário - + Deck editor - + Messages Mensagens - + &Close &Fechar @@ -1578,50 +1583,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - - + + + Choose path Escolher caminho - + Personal settings Configurações pessoais - + Language: Língua: - + Download card pictures on the fly Baixar a imagem dos cards em tempo real - + Paths Caminhos - + Decks directory: Pasta de decks: - + Pictures directory: Pasta de imagens: - + Path to card database: Caminho para o banco de dados dos cards: - - + + English Português do Brasil @@ -2475,22 +2480,22 @@ A versão local é %1 e a versão remota é %2. MessagesSettingsPage - + &Add &Adicionar - + &Remove &Remover - + Add message Adicionar mensagem - + Message: Mensagem: @@ -3479,37 +3484,37 @@ Por favor, entre um nome: UserInterfaceSettingsPage - + General interface settings Configurações gerais de interface - + &Double-click cards to play them (instead of single-click) &Duplo clique nos cards para jogá-los (ao invés de clique simples) - + Animation settings Configurações de animação - + &Tap/untap animation Animação de &virar/desvirar - + Enable &sounds - + Path to sounds directory: - + Choose path Escolher caminho diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index ea4aa904..67609431 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -37,57 +37,57 @@ AppearanceSettingsPage - + Zone background pictures Zona das imagens de fundo - + Path to hand background: Directório da imagem de fundo da mão: - + Path to stack background: Directório da imagem de fundo da pilha: - + Path to table background: Directório da imagem de fundo do campo de batalha: - + Path to player info background: Directório da imagem de fundo da informação de jogador: - + Path to picture of card back: Directório da imagem do verso da carta: - + Card rendering Rendering da carta - + Display card names on cards having a picture Mostrar o nome em cartas com imagem - + Hand layout Disposição da Mão - + Display hand horizontally (wastes space) Mostrar mão horizontalmente (desperdiça espaço) - + Table grid layout Esquema da mesa @@ -96,31 +96,36 @@ Esquema económico - + Invert vertical coordinate Inverter coordenada vertical - + + Minimum player count for multi-column layout: + + + + Zone view layout Distribuição da zona de vizualização - + Sort by name Ordenar por nome - + Sort by type Ordenar por tipo - - - - - + + + + + Choose path Escolher directório @@ -995,12 +1000,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General Geral @@ -1354,59 +1359,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error Erro - + Your card database is invalid. Would you like to go back and set the correct path? A sua base de dados é inválida. Gostaria de voltar atrás e corrigir o directório? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? O directório do seu deck é inválido. Gostaria de voltar atrás e corrigir o directório? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? O directório das imagens das cartas é inválido. Gostaria de voltar atrás e corrigir o directório? - + Settings Definições - + General Geral - + Appearance Aparência - + User interface Interface do utilizador - + Deck editor - + Messages Mensagens - + &Close &Fechar @@ -1578,50 +1583,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English Português - - - + + + Choose path Escolher directório - + Personal settings Defenições pessoais - + Language: Língua: - + Download card pictures on the fly Baixar a imagem das cartas ao passar - + Paths Directórios - + Decks directory: Directório dos decks: - + Pictures directory: Directório das imagens: - + Path to card database: Directório da base de dados de cartas: @@ -2479,22 +2484,22 @@ Versão local é %1, versão remota é %2. MessagesSettingsPage - + Add message Adicionar mensagem - + Message: Mensagem: - + &Add &Adicionar - + &Remove &Remover @@ -3483,37 +3488,37 @@ Por favor introduza um nome: UserInterfaceSettingsPage - + General interface settings Configurações gerais da interface - + &Double-click cards to play them (instead of single-click) Clicar &duas vezes nas cartas para as jogar (ao invés de clicar apenas uma vez) - + Animation settings Configurações de Animações - + &Tap/untap animation Animação de &virar/desvirar - + Enable &sounds - + Path to sounds directory: - + Choose path Escolher directório diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index 94e9d03a..af264167 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures Фоновые изображения - + Path to hand background: Рука: - + Path to stack background: Стек: - + Path to table background: Поле битвы: - + Path to player info background: Панель игрока: - + Path to picture of card back: Рубашки карт: - + Card rendering Отрисовка карт - + Display card names on cards having a picture Отображать название карты поверх изображения - + Hand layout Расположение руки - + Display hand horizontally (wastes space) Отбражать руку горизонтально - + Table grid layout Сетка - + Invert vertical coordinate Инвертировать вертикальные координату - + + Minimum player count for multi-column layout: + + + + Zone view layout Сортировка карт - + Sort by name Сортировать по имени - + Sort by type Сортировать по типу - - - - - + + + + + Choose path Выберите путь @@ -941,12 +946,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General Основные @@ -1293,59 +1298,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error Ошибка - + Your card database is invalid. Would you like to go back and set the correct path? База карт не найдена. Вернуться и задать правильный путь? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? Ваши колоды отсутствуют в указанной папке. Вернуться и задать правильный путь? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? Изображения карт не найдены. Вернуться и задать правильный путь? - + Settings Настройки - + General Основные - + Appearance Внешний вид - + User interface Интерфейс - + Deck editor - + Messages Сообщения - + &Close &Закрыть @@ -1513,50 +1518,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English Русский - - - + + + Choose path Путь - + Personal settings Личные настройки - + Language: Язык: - + Download card pictures on the fly Загружать изображения карт на лету - + Paths Расположение - + Decks directory: Колоды: - + Pictures directory: Изображения карт: - + Path to card database: Путь к базе карт: @@ -2412,22 +2417,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + Add message Добавить сообщение - + Message: Сообщение: - + &Add &Добавить - + &Remove &Удалить @@ -3374,37 +3379,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings Основные настройки интерфейса - + &Double-click cards to play them (instead of single-click) &Двойной клик чтобы разыграть карту (вместо одинарного) - + Animation settings Настройки анимации - + &Tap/untap animation &Анимировать поворот/разворот карты - + Enable &sounds - + Path to sounds directory: - + Choose path diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 596131a7..63a3c840 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -37,86 +37,91 @@ AppearanceSettingsPage - + Zone background pictures - + Path to hand background: - + Path to stack background: - + Path to table background: - + Path to player info background: - + Path to picture of card back: - + Card rendering - + Display card names on cards having a picture - + Hand layout - + Display hand horizontally (wastes space) - + Table grid layout - + Invert vertical coordinate - + + Minimum player count for multi-column layout: + + + + Zone view layout - + Sort by name - + Sort by type - - - - - + + + + + Choose path @@ -786,12 +791,12 @@ This is only saved for moderators and cannot be seen by the banned person. DeckEditorSettingsPage - + Enable &price tag feature (using data from blacklotusproject.com) - + General @@ -1138,59 +1143,59 @@ This is only saved for moderators and cannot be seen by the banned person. DlgSettings - - - + + + Error - + Your card database is invalid. Would you like to go back and set the correct path? - + The path to your deck directory is invalid. Would you like to go back and set the correct path? - + The path to your card pictures directory is invalid. Would you like to go back and set the correct path? - + Settings - + General - + Appearance - + User interface - + Deck editor - + Messages - + &Close @@ -1358,50 +1363,50 @@ This is only saved for moderators and cannot be seen by the banned person. GeneralSettingsPage - - + + English - - - + + + Choose path - + Personal settings - + Language: - + Download card pictures on the fly - + Paths - + Decks directory: - + Pictures directory: - + Path to card database: @@ -2225,22 +2230,22 @@ Local version is %1, remote version is %2. MessagesSettingsPage - + Add message - + Message: - + &Add - + &Remove @@ -3170,37 +3175,37 @@ Please enter a name: UserInterfaceSettingsPage - + General interface settings - + &Double-click cards to play them (instead of single-click) - + Animation settings - + &Tap/untap animation - + Enable &sounds - + Path to sounds directory: - + Choose path From 0120d2a0195ed040d02e2198d282d7a9a5d76289 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 28 Jun 2011 02:37:49 +0200 Subject: [PATCH 11/26] cardInfoPopup fix; chatView fix --- cockatrice/src/abstractcarditem.cpp | 7 ++++++- cockatrice/src/abstractcarditem.h | 3 ++- cockatrice/src/cardinfowidget.cpp | 7 +++---- cockatrice/src/cardinfowidget.h | 5 +---- cockatrice/src/chatview.cpp | 14 ++++++++++---- cockatrice/src/chatview.h | 5 +++-- cockatrice/src/messagelogwidget.cpp | 2 +- cockatrice/src/player.cpp | 2 ++ cockatrice/src/tab.cpp | 8 +++++--- cockatrice/src/tab.h | 2 +- cockatrice/src/tab_game.cpp | 4 ++-- cockatrice/src/tab_message.cpp | 2 +- cockatrice/src/tab_room.cpp | 2 +- 13 files changed, 38 insertions(+), 25 deletions(-) diff --git a/cockatrice/src/abstractcarditem.cpp b/cockatrice/src/abstractcarditem.cpp index 020b6dfc..20e7c8e9 100644 --- a/cockatrice/src/abstractcarditem.cpp +++ b/cockatrice/src/abstractcarditem.cpp @@ -26,6 +26,7 @@ AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, QGraphi AbstractCardItem::~AbstractCardItem() { qDebug() << "AbstractCardItem destructor:" << name; + emit deleteCardInfoPopup(name); } QRectF AbstractCardItem::boundingRect() const @@ -157,6 +158,10 @@ void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * void AbstractCardItem::setName(const QString &_name) { + if (name == _name) + return; + + emit deleteCardInfoPopup(name); disconnect(info, 0, this, 0); name = _name; info = db->getCard(name); @@ -213,7 +218,7 @@ void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void AbstractCardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::MidButton) - emit deleteCardInfoPopup(); + emit deleteCardInfoPopup(name); // This function ensures the parent function doesn't mess around with our selection. event->accept(); diff --git a/cockatrice/src/abstractcarditem.h b/cockatrice/src/abstractcarditem.h index c1345564..e11bdf85 100644 --- a/cockatrice/src/abstractcarditem.h +++ b/cockatrice/src/abstractcarditem.h @@ -30,7 +30,7 @@ private slots: signals: void hovered(AbstractCardItem *card); void showCardInfoPopup(QPoint pos, QString cardName); - void deleteCardInfoPopup(); + void deleteCardInfoPopup(QString cardName); public: enum { Type = typeCard }; int type() const { return Type; } @@ -50,6 +50,7 @@ public: bool getTapped() const { return tapped; } void setTapped(bool _tapped, bool canAnimate = false); void processHoverEvent(); + void deleteCardInfoPopup() { emit deleteCardInfoPopup(name); } protected: QSizeF getTranslatedSize(QPainter *painter) const; void transformPainter(QPainter *painter, const QSizeF &translatedSize, int angle); diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 37b14edf..1ce584b2 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -172,8 +172,7 @@ void CardInfoWidget::resizeEvent(QResizeEvent * /*event*/) } } -void CardInfoWidget::mouseReleaseEvent(QMouseEvent *event) +QString CardInfoWidget::getCardName() const { - if ((event->button() == Qt::MidButton) && (mode == ModePopUp)) - emit mouseReleased(); -} + return nameLabel2->text(); +} \ No newline at end of file diff --git a/cockatrice/src/cardinfowidget.h b/cockatrice/src/cardinfowidget.h index 819f514b..21ee7ccd 100644 --- a/cockatrice/src/cardinfowidget.h +++ b/cockatrice/src/cardinfowidget.h @@ -39,6 +39,7 @@ private: public: CardInfoWidget(ResizeMode _mode, QWidget *parent = 0, Qt::WindowFlags f = 0); void retranslateUi(); + QString getCardName() const; public slots: void setCard(CardInfo *card); @@ -50,12 +51,8 @@ private slots: void updatePixmap(); void minimizeClicked(int newMinimized); -signals: - void mouseReleased(); - protected: void resizeEvent(QResizeEvent *event); - void mouseReleaseEvent(QMouseEvent *event); }; #endif diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index 700313ee..1b5b1e0f 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -15,7 +15,7 @@ ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *paren connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(openLink(const QUrl &))); } -void ChatView::appendMessage(QString sender, QString message) +void ChatView::appendMessage(QString sender, QString message, QColor playerColor, bool playerBold) { QTextCursor cursor(document()->lastBlock()); cursor.movePosition(QTextCursor::End); @@ -35,8 +35,14 @@ void ChatView::appendMessage(QString sender, QString message) if (sender == ownName) { senderFormat.setFontWeight(QFont::Bold); senderFormat.setForeground(Qt::red); - } else - senderFormat.setForeground(QColor(0, 0, 254)); + } else { + if (playerColor == QColor()) + senderFormat.setForeground(QColor(0, 0, 254)); + else + senderFormat.setForeground(playerColor); + if (playerBold) + senderFormat.setFontWeight(QFont::Bold); + } cursor.setCharFormat(senderFormat); if (!sender.isEmpty()) sender.append(": "); @@ -156,7 +162,7 @@ void ChatView::mousePressEvent(QMouseEvent *event) void ChatView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::MidButton) - emit deleteCardInfoPopup(); + emit deleteCardInfoPopup(QString("_")); QTextBrowser::mouseReleaseEvent(event); } diff --git a/cockatrice/src/chatview.h b/cockatrice/src/chatview.h index c17f2375..5f944532 100644 --- a/cockatrice/src/chatview.h +++ b/cockatrice/src/chatview.h @@ -3,6 +3,7 @@ #include #include +#include class QTextTable; class QMouseEvent; @@ -20,7 +21,7 @@ private slots: void openLink(const QUrl &link); public: ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent = 0); - void appendMessage(QString sender, QString message); + void appendMessage(QString sender, QString message, QColor playerColor = QColor(), bool playerBold = false); protected: void enterEvent(QEvent *event); void leaveEvent(QEvent *event); @@ -30,7 +31,7 @@ protected: signals: void cardNameHovered(QString cardName); void showCardInfoPopup(QPoint pos, QString cardName); - void deleteCardInfoPopup(); + void deleteCardInfoPopup(QString cardName); }; #endif \ No newline at end of file diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index fa69419f..9b5f92bb 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -139,7 +139,7 @@ void MessageLogWidget::logConnectionStateChanged(Player *player, bool connection void MessageLogWidget::logSay(Player *player, QString message) { - appendMessage(player->getName(), message); + appendMessage(player->getName(), message, QColor(), true); } void MessageLogWidget::logSpectatorSay(QString spectatorName, QString message) diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 6dc53152..fc794bd3 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -867,6 +867,8 @@ void Player::eventMoveCard(Event_MoveCard *event, GameEventContext *context) CardItem *card = startZone->takeCard(position, event->getCardId(), startZone != targetZone); if (!card) return; + if (startZone != targetZone) + card->deleteCardInfoPopup(); card->setName(event->getCardName()); if (card->getAttachedTo() && (startZone != targetZone)) { diff --git a/cockatrice/src/tab.cpp b/cockatrice/src/tab.cpp index e85d4091..2eed9b54 100644 --- a/cockatrice/src/tab.cpp +++ b/cockatrice/src/tab.cpp @@ -21,10 +21,12 @@ void Tab::showCardInfoPopup(const QPoint &pos, const QString &cardName) infoPopup->show(); } -void Tab::deleteCardInfoPopup() +void Tab::deleteCardInfoPopup(const QString &cardName) { if (infoPopup) { - infoPopup->deleteLater(); - infoPopup = 0; + if ((infoPopup->getCardName() == cardName) || (cardName == "_")) { + infoPopup->deleteLater(); + infoPopup = 0; + } } } diff --git a/cockatrice/src/tab.h b/cockatrice/src/tab.h index ac4b0ea5..3fefde1a 100644 --- a/cockatrice/src/tab.h +++ b/cockatrice/src/tab.h @@ -16,7 +16,7 @@ protected: TabSupervisor *tabSupervisor; protected slots: void showCardInfoPopup(const QPoint &pos, const QString &cardName); - void deleteCardInfoPopup(); + void deleteCardInfoPopup(const QString &cardName); private: bool contentsChanged; CardInfoWidget *infoPopup; diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 04c15c50..2e38baf7 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -179,7 +179,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client messageLog = new MessageLogWidget(_userName); connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfo, SLOT(setCard(QString))); connect(messageLog, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); - connect(messageLog, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); + connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); sayLabel = new QLabel; sayEdit = new QLineEdit; sayLabel->setBuddy(sayEdit); @@ -745,7 +745,7 @@ void TabGame::newCardAdded(AbstractCardItem *card) { connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *))); connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); - connect(card, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); + connect(card, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); } CardItem *TabGame::getCard(int playerId, const QString &zoneName, int cardId) const diff --git a/cockatrice/src/tab_message.cpp b/cockatrice/src/tab_message.cpp index c79fbfee..f4efd7f5 100644 --- a/cockatrice/src/tab_message.cpp +++ b/cockatrice/src/tab_message.cpp @@ -13,7 +13,7 @@ TabMessage::TabMessage(TabSupervisor *_tabSupervisor, AbstractClient *_client, c { chatView = new ChatView(_ownName, true); connect(chatView, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); - connect(chatView, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); + connect(chatView, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); sayEdit = new QLineEdit; connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage())); diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index 621b4b08..b1d23c93 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -139,7 +139,7 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, const Q chatView = new ChatView(ownName, true); connect(chatView, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); - connect(chatView, SIGNAL(deleteCardInfoPopup()), this, SLOT(deleteCardInfoPopup())); + connect(chatView, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); sayLabel = new QLabel; sayEdit = new QLineEdit; sayLabel->setBuddy(sayEdit); From a86f6ba5b8a8305f491d48c22bb37a4b4e1a6a48 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 02:14:08 +0200 Subject: [PATCH 12/26] minor change --- cockatrice/src/messagelogwidget.cpp | 2 +- common/server_protocolhandler.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 9b5f92bb..9b452bf8 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -144,7 +144,7 @@ void MessageLogWidget::logSay(Player *player, QString message) void MessageLogWidget::logSpectatorSay(QString spectatorName, QString message) { - myAppend(QString("%1: %2").arg(sanitizeHtml(spectatorName)).arg(sanitizeHtml(message))); + appendMessage(spectatorName, message, QColor(), false); } void MessageLogWidget::logShuffle(Player *player, CardZone *zone) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index d1df0177..4ec2a5c1 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -476,8 +476,8 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd, Comm gameTypes.append(gameTypeList[i]->getData()); QString description = cmd->getDescription(); - if (description.size() > 50) - description = description.left(50); + if (description.size() > 60) + description = description.left(60); Server_Game *game = room->createGame(description, cmd->getPassword(), cmd->getMaxPlayers(), gameTypes, cmd->getOnlyBuddies(), cmd->getOnlyRegistered(), cmd->getSpectatorsAllowed(), cmd->getSpectatorsNeedPassword(), cmd->getSpectatorsCanTalk(), cmd->getSpectatorsSeeEverything(), this); Server_Player *creator = game->getPlayers().values().first(); From 438c26e0c16322122a964d00f0cc990cbf239748 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 02:31:05 +0200 Subject: [PATCH 13/26] DlgCreateGame: max length for description edit --- cockatrice/src/dlg_creategame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cockatrice/src/dlg_creategame.cpp b/cockatrice/src/dlg_creategame.cpp index b96c93a1..0d5b69f4 100644 --- a/cockatrice/src/dlg_creategame.cpp +++ b/cockatrice/src/dlg_creategame.cpp @@ -17,6 +17,7 @@ DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, const QMapsetBuddy(descriptionEdit); + descriptionEdit->setMaxLength(60); maxPlayersLabel = new QLabel(tr("P&layers:")); maxPlayersEdit = new QSpinBox(); From be12a0b3a9342959b9eb1dfd79d42957f7587411 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 14:36:10 +0200 Subject: [PATCH 14/26] preliminary showGamesOfUser support --- cockatrice/src/userlist.cpp | 7 +- common/protocol.cpp | 7 ++ common/protocol.h | 24 +++-- common/protocol_datastructures.cpp | 3 +- common/protocol_datastructures.h | 2 +- common/protocol_item_ids.h | 161 +++++++++++++++-------------- common/protocol_items.cpp | 6 ++ common/protocol_items.dat | 1 + common/protocol_items.h | 8 ++ common/server_game.cpp | 14 ++- common/server_game.h | 1 + common/server_protocolhandler.cpp | 23 +++++ common/server_protocolhandler.h | 1 + common/server_room.cpp | 14 +++ common/server_room.h | 2 + 15 files changed, 183 insertions(+), 91 deletions(-) diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index 02a04a6e..419d8b78 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -219,6 +219,7 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) aUserName->setEnabled(false); QAction *aDetails = new QAction(tr("User &details"), this); QAction *aChat = new QAction(tr("Direct &chat"), this); + QAction *aShowGames = new QAction(tr("Show this user's &games"), this); QAction *aAddToBuddyList = new QAction(tr("Add to &buddy list"), this); QAction *aRemoveFromBuddyList = new QAction(tr("Remove from &buddy list"), this); QAction *aAddToIgnoreList = new QAction(tr("Add to &ignore list"), this); @@ -257,7 +258,11 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) client->sendCommand(new Command_AddToList("buddy", userName)); else if (actionClicked == aRemoveFromBuddyList) client->sendCommand(new Command_RemoveFromList("buddy", userName)); - else if (actionClicked == aAddToIgnoreList) + else if (actionClicked == aShowGames) { + Command *cmd = new Command_GetGamesOfUser(userName); + connect(cmd, SIGNAL(responseReceived(ProtocolResponse *)), this, SLOT(gamesOfUserReceived(ProtocolResponse *))); + client->sendCommand(cmd); + } else if (actionClicked == aAddToIgnoreList) client->sendCommand(new Command_AddToList("ignore", userName)); else if (actionClicked == aRemoveFromIgnoreList) client->sendCommand(new Command_RemoveFromList("ignore", userName)); diff --git a/common/protocol.cpp b/common/protocol.cpp index 1129116e..205f2b2a 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -44,6 +44,7 @@ void ProtocolItem::initializeHash() ProtocolResponse::initializeHash(); registerSerializableItem("respjoin_room", Response_JoinRoom::newItem); registerSerializableItem("resplist_users", Response_ListUsers::newItem); + registerSerializableItem("respget_games_of_user", Response_GetGamesOfUser::newItem); registerSerializableItem("respget_user_info", Response_GetUserInfo::newItem); registerSerializableItem("respdeck_list", Response_DeckList::newItem); registerSerializableItem("respdeck_download", Response_DeckDownload::newItem); @@ -296,6 +297,12 @@ Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Dec insertItem(_root); } +Response_GetGamesOfUser::Response_GetGamesOfUser(int _cmdId, ResponseCode _responseCode, const QList &_gameList) +{ + for (int i = 0; i < _gameList.size(); ++i) + itemList.append(_gameList[i]); +} + Response_GetUserInfo::Response_GetUserInfo(int _cmdId, ResponseCode _responseCode, ServerInfo_User *_user) : ProtocolResponse(_cmdId, _responseCode, "get_user_info") { diff --git a/common/protocol.h b/common/protocol.h index 0cb067ee..1feda02f 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -42,13 +42,14 @@ enum ItemId { ItemId_Event_Ping = ItemId_Other + 212, ItemId_Event_AddToList = ItemId_Other + 213, ItemId_Response_ListUsers = ItemId_Other + 300, - ItemId_Response_GetUserInfo = ItemId_Other + 301, - ItemId_Response_DeckList = ItemId_Other + 302, - ItemId_Response_DeckDownload = ItemId_Other + 303, - ItemId_Response_DeckUpload = ItemId_Other + 304, - ItemId_Response_DumpZone = ItemId_Other + 305, - ItemId_Response_JoinRoom = ItemId_Other + 306, - ItemId_Response_Login = ItemId_Other + 307, + ItemId_Response_GetGamesOfUser = ItemId_Other + 301, + ItemId_Response_GetUserInfo = ItemId_Other + 302, + ItemId_Response_DeckList = ItemId_Other + 303, + ItemId_Response_DeckDownload = ItemId_Other + 304, + ItemId_Response_DeckUpload = ItemId_Other + 305, + ItemId_Response_DumpZone = ItemId_Other + 306, + ItemId_Response_JoinRoom = ItemId_Other + 307, + ItemId_Response_Login = ItemId_Other + 308, ItemId_Invalid = ItemId_Other + 1000 }; @@ -282,6 +283,15 @@ public: QList getUserList() const { return typecastItemList(); } }; +class Response_GetGamesOfUser : public ProtocolResponse { + Q_OBJECT +public: + Response_GetGamesOfUser(int _cmdId = -1, ResponseCode _responseCode = RespOk, const QList &_gameList = QList()); + int getItemId() const { return ItemId_Response_GetGamesOfUser; } + static SerializableItem *newItem() { return new Response_GetGamesOfUser; } + QList getGameList() const { return typecastItemList(); } +}; + class Response_GetUserInfo : public ProtocolResponse { Q_OBJECT public: diff --git a/common/protocol_datastructures.cpp b/common/protocol_datastructures.cpp index aaf16467..3e4564c8 100644 --- a/common/protocol_datastructures.cpp +++ b/common/protocol_datastructures.cpp @@ -40,9 +40,10 @@ ServerInfo_UserList::ServerInfo_UserList(const QString &_itemType, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) +ServerInfo_Game::ServerInfo_Game(int _roomId, int _gameId, const QString &_description, bool _hasPassword, int _playerCount, int _maxPlayers, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) : SerializableItem_Map("game") { + insertItem(new SerializableItem_Int("room_id", _roomId)); insertItem(new SerializableItem_Int("game_id", _gameId)); insertItem(new SerializableItem_String("description", _description)); insertItem(new SerializableItem_Bool("has_password", _hasPassword)); diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h index 02f5336c..40ab6751 100644 --- a/common/protocol_datastructures.h +++ b/common/protocol_datastructures.h @@ -69,7 +69,7 @@ public: class ServerInfo_Game : public SerializableItem_Map { public: - ServerInfo_Game(int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); + ServerInfo_Game(int _roomId = -1, int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); static SerializableItem *newItem() { return new ServerInfo_Game; } int getGameId() const { return static_cast(itemMap.value("game_id"))->getData(); } QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); } diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index cbec3eb0..6d6cb37b 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -3,84 +3,85 @@ ItemId_Command_Ping = 1001, ItemId_Command_Login = 1002, ItemId_Command_Message = 1003, ItemId_Command_ListUsers = 1004, -ItemId_Command_GetUserInfo = 1005, -ItemId_Command_AddToList = 1006, -ItemId_Command_RemoveFromList = 1007, -ItemId_Command_DeckList = 1008, -ItemId_Command_DeckNewDir = 1009, -ItemId_Command_DeckDelDir = 1010, -ItemId_Command_DeckDel = 1011, -ItemId_Command_DeckDownload = 1012, -ItemId_Command_ListRooms = 1013, -ItemId_Command_JoinRoom = 1014, -ItemId_Command_LeaveRoom = 1015, -ItemId_Command_RoomSay = 1016, -ItemId_Command_JoinGame = 1017, -ItemId_Command_KickFromGame = 1018, -ItemId_Command_LeaveGame = 1019, -ItemId_Command_Say = 1020, -ItemId_Command_Shuffle = 1021, -ItemId_Command_Mulligan = 1022, -ItemId_Command_RollDie = 1023, -ItemId_Command_DrawCards = 1024, -ItemId_Command_UndoDraw = 1025, -ItemId_Command_FlipCard = 1026, -ItemId_Command_AttachCard = 1027, -ItemId_Command_CreateToken = 1028, -ItemId_Command_CreateArrow = 1029, -ItemId_Command_DeleteArrow = 1030, -ItemId_Command_SetCardAttr = 1031, -ItemId_Command_SetCardCounter = 1032, -ItemId_Command_IncCardCounter = 1033, -ItemId_Command_ReadyStart = 1034, -ItemId_Command_Concede = 1035, -ItemId_Command_IncCounter = 1036, -ItemId_Command_CreateCounter = 1037, -ItemId_Command_SetCounter = 1038, -ItemId_Command_DelCounter = 1039, -ItemId_Command_NextTurn = 1040, -ItemId_Command_SetActivePhase = 1041, -ItemId_Command_DumpZone = 1042, -ItemId_Command_StopDumpZone = 1043, -ItemId_Command_RevealCards = 1044, -ItemId_Event_ConnectionStateChanged = 1045, -ItemId_Event_Say = 1046, -ItemId_Event_Leave = 1047, -ItemId_Event_GameClosed = 1048, -ItemId_Event_Kicked = 1049, -ItemId_Event_Shuffle = 1050, -ItemId_Event_RollDie = 1051, -ItemId_Event_MoveCard = 1052, -ItemId_Event_FlipCard = 1053, -ItemId_Event_DestroyCard = 1054, -ItemId_Event_AttachCard = 1055, -ItemId_Event_CreateToken = 1056, -ItemId_Event_DeleteArrow = 1057, -ItemId_Event_SetCardAttr = 1058, -ItemId_Event_SetCardCounter = 1059, -ItemId_Event_SetCounter = 1060, -ItemId_Event_DelCounter = 1061, -ItemId_Event_SetActivePlayer = 1062, -ItemId_Event_SetActivePhase = 1063, -ItemId_Event_DumpZone = 1064, -ItemId_Event_StopDumpZone = 1065, -ItemId_Event_RemoveFromList = 1066, -ItemId_Event_ServerMessage = 1067, -ItemId_Event_ServerShutdown = 1068, -ItemId_Event_ConnectionClosed = 1069, -ItemId_Event_Message = 1070, -ItemId_Event_GameJoined = 1071, -ItemId_Event_UserLeft = 1072, -ItemId_Event_LeaveRoom = 1073, -ItemId_Event_RoomSay = 1074, -ItemId_Context_ReadyStart = 1075, -ItemId_Context_Concede = 1076, -ItemId_Context_DeckSelect = 1077, -ItemId_Context_UndoDraw = 1078, -ItemId_Context_MoveCard = 1079, -ItemId_Context_Mulligan = 1080, -ItemId_Command_UpdateServerMessage = 1081, -ItemId_Command_ShutdownServer = 1082, -ItemId_Command_BanFromServer = 1083, -ItemId_Other = 1084 +ItemId_Command_GetGamesOfUser = 1005, +ItemId_Command_GetUserInfo = 1006, +ItemId_Command_AddToList = 1007, +ItemId_Command_RemoveFromList = 1008, +ItemId_Command_DeckList = 1009, +ItemId_Command_DeckNewDir = 1010, +ItemId_Command_DeckDelDir = 1011, +ItemId_Command_DeckDel = 1012, +ItemId_Command_DeckDownload = 1013, +ItemId_Command_ListRooms = 1014, +ItemId_Command_JoinRoom = 1015, +ItemId_Command_LeaveRoom = 1016, +ItemId_Command_RoomSay = 1017, +ItemId_Command_JoinGame = 1018, +ItemId_Command_KickFromGame = 1019, +ItemId_Command_LeaveGame = 1020, +ItemId_Command_Say = 1021, +ItemId_Command_Shuffle = 1022, +ItemId_Command_Mulligan = 1023, +ItemId_Command_RollDie = 1024, +ItemId_Command_DrawCards = 1025, +ItemId_Command_UndoDraw = 1026, +ItemId_Command_FlipCard = 1027, +ItemId_Command_AttachCard = 1028, +ItemId_Command_CreateToken = 1029, +ItemId_Command_CreateArrow = 1030, +ItemId_Command_DeleteArrow = 1031, +ItemId_Command_SetCardAttr = 1032, +ItemId_Command_SetCardCounter = 1033, +ItemId_Command_IncCardCounter = 1034, +ItemId_Command_ReadyStart = 1035, +ItemId_Command_Concede = 1036, +ItemId_Command_IncCounter = 1037, +ItemId_Command_CreateCounter = 1038, +ItemId_Command_SetCounter = 1039, +ItemId_Command_DelCounter = 1040, +ItemId_Command_NextTurn = 1041, +ItemId_Command_SetActivePhase = 1042, +ItemId_Command_DumpZone = 1043, +ItemId_Command_StopDumpZone = 1044, +ItemId_Command_RevealCards = 1045, +ItemId_Event_ConnectionStateChanged = 1046, +ItemId_Event_Say = 1047, +ItemId_Event_Leave = 1048, +ItemId_Event_GameClosed = 1049, +ItemId_Event_Kicked = 1050, +ItemId_Event_Shuffle = 1051, +ItemId_Event_RollDie = 1052, +ItemId_Event_MoveCard = 1053, +ItemId_Event_FlipCard = 1054, +ItemId_Event_DestroyCard = 1055, +ItemId_Event_AttachCard = 1056, +ItemId_Event_CreateToken = 1057, +ItemId_Event_DeleteArrow = 1058, +ItemId_Event_SetCardAttr = 1059, +ItemId_Event_SetCardCounter = 1060, +ItemId_Event_SetCounter = 1061, +ItemId_Event_DelCounter = 1062, +ItemId_Event_SetActivePlayer = 1063, +ItemId_Event_SetActivePhase = 1064, +ItemId_Event_DumpZone = 1065, +ItemId_Event_StopDumpZone = 1066, +ItemId_Event_RemoveFromList = 1067, +ItemId_Event_ServerMessage = 1068, +ItemId_Event_ServerShutdown = 1069, +ItemId_Event_ConnectionClosed = 1070, +ItemId_Event_Message = 1071, +ItemId_Event_GameJoined = 1072, +ItemId_Event_UserLeft = 1073, +ItemId_Event_LeaveRoom = 1074, +ItemId_Event_RoomSay = 1075, +ItemId_Context_ReadyStart = 1076, +ItemId_Context_Concede = 1077, +ItemId_Context_DeckSelect = 1078, +ItemId_Context_UndoDraw = 1079, +ItemId_Context_MoveCard = 1080, +ItemId_Context_Mulligan = 1081, +ItemId_Command_UpdateServerMessage = 1082, +ItemId_Command_ShutdownServer = 1083, +ItemId_Command_BanFromServer = 1084, +ItemId_Other = 1085 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 33670ef4..db7ffc1a 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -21,6 +21,11 @@ Command_ListUsers::Command_ListUsers() : Command("list_users") { } +Command_GetGamesOfUser::Command_GetGamesOfUser(const QString &_userName) + : Command("get_games_of_user") +{ + insertItem(new SerializableItem_String("user_name", _userName)); +} Command_GetUserInfo::Command_GetUserInfo(const QString &_userName) : Command("get_user_info") { @@ -497,6 +502,7 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("cmdlogin", Command_Login::newItem); itemNameHash.insert("cmdmessage", Command_Message::newItem); itemNameHash.insert("cmdlist_users", Command_ListUsers::newItem); + itemNameHash.insert("cmdget_games_of_user", Command_GetGamesOfUser::newItem); itemNameHash.insert("cmdget_user_info", Command_GetUserInfo::newItem); itemNameHash.insert("cmdadd_to_list", Command_AddToList::newItem); itemNameHash.insert("cmdremove_from_list", Command_RemoveFromList::newItem); diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 2e0f8603..71695932 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -2,6 +2,7 @@ 0:login:s,username:s,password 0:message:s,user_name:s,text 0:list_users +0:get_games_of_user:s,user_name 0:get_user_info:s,user_name 0:add_to_list:s,list:s,user_name 0:remove_from_list:s,list:s,user_name diff --git a/common/protocol_items.h b/common/protocol_items.h index efeb7f93..48401ee3 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -35,6 +35,14 @@ public: static SerializableItem *newItem() { return new Command_ListUsers; } int getItemId() const { return ItemId_Command_ListUsers; } }; +class Command_GetGamesOfUser : public Command { + Q_OBJECT +public: + Command_GetGamesOfUser(const QString &_userName = QString()); + QString getUserName() const { return static_cast(itemMap.value("user_name"))->getData(); }; + static SerializableItem *newItem() { return new Command_GetGamesOfUser; } + int getItemId() const { return ItemId_Command_GetGamesOfUser; } +}; class Command_GetUserInfo : public Command { Q_OBJECT public: diff --git a/common/server_game.cpp b/common/server_game.cpp index 85b3a151..bc14c7e9 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -214,6 +214,17 @@ ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_passw return RespOk; } +bool Server_Game::containsUser(const QString &userName) const +{ + QMutexLocker locker(&gameMutex); + + QMapIterator playerIterator(players); + while (playerIterator.hasNext()) + if (playerIterator.next().value()->getUserInfo()->getName() == userName) + return true; + return false; +} + Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate) { QMutexLocker locker(&gameMutex); @@ -479,7 +490,7 @@ ServerInfo_Game *Server_Game::getInfo() const if (players.isEmpty()) // Game is closing - return new ServerInfo_Game(getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); + return new ServerInfo_Game(room->getId(), getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); else { // Game is open @@ -488,6 +499,7 @@ ServerInfo_Game *Server_Game::getInfo() const gameTypeList.append(new GameTypeId(gameTypes[i])); return new ServerInfo_Game( + room->getId(), getGameId(), getDescription(), !getPassword().isEmpty(), diff --git a/common/server_game.h b/common/server_game.h index b34301d4..f3d761f3 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -77,6 +77,7 @@ public: bool getSpectatorsCanTalk() const { return spectatorsCanTalk; } bool getSpectatorsSeeEverything() const { return spectatorsSeeEverything; } ResponseCode checkJoin(ServerInfo_User *user, const QString &_password, bool spectator); + bool containsUser(const QString &userName) const; Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true); void removePlayer(Server_Player *player); void removeArrowsToPlayer(Server_Player *player); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index d1df0177..8236cf6e 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -179,6 +179,7 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm case ItemId_Command_DeckDel: return cmdDeckDel(static_cast(command), cont); case ItemId_Command_DeckUpload: return cmdDeckUpload(static_cast(command), cont); case ItemId_Command_DeckDownload: return cmdDeckDownload(static_cast(command), cont); + case ItemId_Command_GetGamesOfUser: return cmdGetGamesOfUser(static_cast(command), cont); case ItemId_Command_GetUserInfo: return cmdGetUserInfo(static_cast(command), cont); case ItemId_Command_ListRooms: return cmdListRooms(static_cast(command), cont); case ItemId_Command_JoinRoom: return cmdJoinRoom(static_cast(command), cont); @@ -330,6 +331,28 @@ ResponseCode Server_ProtocolHandler::cmdMessage(Command_Message *cmd, CommandCon return RespOk; } +ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(Command_GetGamesOfUser *cmd, CommandContainer *cont) +{ + if (authState == PasswordWrong) + return RespLoginNeeded; + + server->serverMutex.lock(); + if (!server->getUsers().contains(cmd->getUserName())) + return RespNameNotFound; + + QList gameList; + QMapIterator roomIterator(server->getRooms()); + while (roomIterator.hasNext()) + gameList.append(roomIterator.next().value()->getGamesOfUser(cmd->getUserName())); + server->serverMutex.unlock(); + + ProtocolResponse *resp = new Response_GetGamesOfUser(cont->getCmdId(), RespOk, gameList); + if (getCompressionSupport()) + resp->setCompressed(true); + cont->setResponse(resp); + return RespNothing; +} + ResponseCode Server_ProtocolHandler::cmdGetUserInfo(Command_GetUserInfo *cmd, CommandContainer *cont) { if (authState == PasswordWrong) diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index a73c3008..1902f1d8 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -50,6 +50,7 @@ private: virtual ResponseCode cmdDeckDel(Command_DeckDel *cmd, CommandContainer *cont) = 0; virtual ResponseCode cmdDeckUpload(Command_DeckUpload *cmd, CommandContainer *cont) = 0; virtual ResponseCode cmdDeckDownload(Command_DeckDownload *cmd, CommandContainer *cont) = 0; + ResponseCode cmdGetGamesOfUser(Command_GetGamesOfUser *cmd, CommandContainer *cont); ResponseCode cmdGetUserInfo(Command_GetUserInfo *cmd, CommandContainer *cont); ResponseCode cmdListRooms(Command_ListRooms *cmd, CommandContainer *cont); ResponseCode cmdJoinRoom(Command_JoinRoom *cmd, CommandContainer *cont); diff --git a/common/server_room.cpp b/common/server_room.cpp index b954fa81..77030bff 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -130,3 +130,17 @@ int Server_Room::getGamesCreatedByUser(const QString &userName) const ++result; return result; } + +QList Server_Room::getGamesOfUser(const QString &userName) const +{ + QMutexLocker locker(&roomMutex); + + QList result; + QMapIterator gamesIterator(games); + while (gamesIterator.hasNext()) { + Server_Game *game = gamesIterator.next().value(); + if (game->containsUser(userName)) + result.append(game->getInfo()); + } + return result; +} diff --git a/common/server_room.h b/common/server_room.h index b99b626f..96712ac6 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -11,6 +11,7 @@ class Server_ProtocolHandler; class RoomEvent; class ServerInfo_User; class ServerInfo_Room; +class ServerInfo_Game; class Server_Game; class Server; @@ -39,6 +40,7 @@ public: Server *getServer() const; ServerInfo_Room *getInfo(bool complete) const; int getGamesCreatedByUser(const QString &name) const; + QList getGamesOfUser(const QString &name) const; void addClient(Server_ProtocolHandler *client); void removeClient(Server_ProtocolHandler *client); From abd5425796173d0ea554e60f15044569dea3831c Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 16:43:19 +0200 Subject: [PATCH 15/26] finished getGamesOfUser function --- cockatrice/cockatrice.pro | 3 + cockatrice/src/gamesmodel.cpp | 41 +++-- cockatrice/src/gamesmodel.h | 8 +- cockatrice/src/tab_room.cpp | 116 +----------- cockatrice/src/tab_room.h | 32 +--- cockatrice/src/userlist.cpp | 33 +++- cockatrice/src/userlist.h | 2 + cockatrice/translations/cockatrice_cs.ts | 189 +++++++++++--------- cockatrice/translations/cockatrice_de.ts | 173 ++++++++++-------- cockatrice/translations/cockatrice_en.ts | 189 +++++++++++--------- cockatrice/translations/cockatrice_es.ts | 173 ++++++++++-------- cockatrice/translations/cockatrice_fr.ts | 175 ++++++++++-------- cockatrice/translations/cockatrice_ja.ts | 173 ++++++++++-------- cockatrice/translations/cockatrice_pl.ts | 189 +++++++++++--------- cockatrice/translations/cockatrice_pt-br.ts | 173 ++++++++++-------- cockatrice/translations/cockatrice_pt.ts | 175 ++++++++++-------- cockatrice/translations/cockatrice_ru.ts | 175 ++++++++++-------- cockatrice/translations/cockatrice_sk.ts | 189 +++++++++++--------- common/protocol.cpp | 25 ++- common/protocol.h | 10 +- common/protocol_datastructures.h | 3 +- common/server_protocolhandler.cpp | 16 +- common/server_room.cpp | 8 +- common/server_room.h | 2 +- 24 files changed, 1221 insertions(+), 1051 deletions(-) diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index b126f14a..5902e418 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -28,6 +28,8 @@ HEADERS += src/abstractcounter.h \ src/handcounter.h \ src/carddatabase.h \ src/gameview.h \ + src/gameselector.h \ + src/gametypemap.h \ src/decklistmodel.h \ src/dlg_load_deck_from_clipboard.h \ src/dlg_load_remote_deck.h \ @@ -114,6 +116,7 @@ SOURCES += src/abstractcounter.cpp \ src/handcounter.cpp \ src/carddatabase.cpp \ src/gameview.cpp \ + src/gameselector.cpp \ src/decklistmodel.cpp \ src/dlg_load_deck_from_clipboard.cpp \ src/dlg_load_remote_deck.cpp \ diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index 700877f2..9aff702b 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -1,8 +1,8 @@ #include "gamesmodel.h" #include "protocol_datastructures.h" -GamesModel::GamesModel(const QMap &_gameTypes, QObject *parent) - : QAbstractTableModel(parent), gameTypes(_gameTypes) +GamesModel::GamesModel(const QMap &_rooms, const QMap &_gameTypes, QObject *parent) + : QAbstractTableModel(parent), rooms(_rooms), gameTypes(_gameTypes) { } @@ -30,17 +30,19 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const ServerInfo_Game *g = gameList[index.row()]; switch (index.column()) { - case 0: return g->getDescription(); - case 1: return g->getCreatorInfo()->getName(); - case 2: { + case 0: return rooms.value(g->getRoomId()); + case 1: return g->getDescription(); + case 2: return g->getCreatorInfo()->getName(); + case 3: { QStringList result; QList gameTypeList = g->getGameTypes(); + GameTypeMap gameTypeMap = gameTypes.value(g->getRoomId()); for (int i = 0; i < gameTypeList.size(); ++i) - result.append(gameTypes.value(gameTypeList[i]->getData())); + result.append(gameTypeMap.value(gameTypeList[i]->getData())); return result.join(", "); } - case 3: return g->getHasPassword() ? (g->getSpectatorsNeedPassword() ? tr("yes") : tr("yes, free for spectators")) : tr("no"); - case 4: { + case 4: return g->getHasPassword() ? (g->getSpectatorsNeedPassword() ? tr("yes") : tr("yes, free for spectators")) : tr("no"); + case 5: { QStringList result; if (g->getOnlyBuddies()) result.append(tr("buddies only")); @@ -48,8 +50,8 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const result.append(tr("reg. users only")); return result.join(", "); } - case 5: return QString("%1/%2").arg(g->getPlayerCount()).arg(g->getMaxPlayers()); - case 6: return g->getSpectatorsAllowed() ? QVariant(g->getSpectatorCount()) : QVariant(tr("not allowed")); + case 6: return QString("%1/%2").arg(g->getPlayerCount()).arg(g->getMaxPlayers()); + case 7: return g->getSpectatorsAllowed() ? QVariant(g->getSpectatorCount()) : QVariant(tr("not allowed")); default: return QVariant(); } } @@ -59,13 +61,14 @@ QVariant GamesModel::headerData(int section, Qt::Orientation orientation, int ro if ((role != Qt::DisplayRole) || (orientation != Qt::Horizontal)) return QVariant(); switch (section) { - case 0: return tr("Description"); - case 1: return tr("Creator"); - case 2: return tr("Game type"); - case 3: return tr("Password"); - case 4: return tr("Restrictions"); - case 5: return tr("Players"); - case 6: return tr("Spectators"); + case 0: return tr("Room"); + case 1: return tr("Description"); + case 2: return tr("Creator"); + case 3: return tr("Game type"); + case 4: return tr("Password"); + case 5: return tr("Restrictions"); + case 6: return tr("Players"); + case 7: return tr("Spectators"); default: return QVariant(); } } @@ -82,7 +85,7 @@ void GamesModel::updateGameList(ServerInfo_Game *_game) for (int i = 0; i < oldGameTypeList.size(); ++i) gameTypeList.append(new GameTypeId(oldGameTypeList[i]->getData())); - ServerInfo_Game *game = new ServerInfo_Game(_game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), gameTypeList, new ServerInfo_User(_game->getCreatorInfo()), _game->getOnlyBuddies(), _game->getOnlyRegistered(), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); + ServerInfo_Game *game = new ServerInfo_Game(_game->getRoomId(), _game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), gameTypeList, new ServerInfo_User(_game->getCreatorInfo()), _game->getOnlyBuddies(), _game->getOnlyRegistered(), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); for (int i = 0; i < gameList.size(); i++) if (gameList[i]->getGameId() == game->getGameId()) { if (game->getPlayerCount() == 0) { @@ -92,7 +95,7 @@ void GamesModel::updateGameList(ServerInfo_Game *_game) } else { delete gameList[i]; gameList[i] = game; - emit dataChanged(index(i, 0), index(i, 4)); + emit dataChanged(index(i, 0), index(i, 7)); } return; } diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index a7f4fe68..6be0d140 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -4,6 +4,7 @@ #include #include #include +#include "gametypemap.h" class ServerInfo_Game; @@ -11,12 +12,13 @@ class GamesModel : public QAbstractTableModel { Q_OBJECT private: QList gameList; - QMap gameTypes; + QMap rooms; + QMap gameTypes; public: - GamesModel(const QMap &_gameTypes, QObject *parent = 0); + GamesModel(const QMap &_rooms, const QMap &_gameTypes, QObject *parent = 0); ~GamesModel(); int rowCount(const QModelIndex &parent = QModelIndex()) const { return parent.isValid() ? 0 : gameList.size(); } - int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 7; } + int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 8; } QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index b1d23c93..7fbce5a7 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -4,127 +4,17 @@ #include #include #include -#include #include #include -#include #include #include -#include "dlg_creategame.h" #include "tab_supervisor.h" #include "tab_room.h" #include "userlist.h" #include "abstractclient.h" #include "protocol_items.h" -#include "gamesmodel.h" #include "chatview.h" - -GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, QWidget *parent) - : QGroupBox(parent), client(_client), room(_room) -{ - gameListView = new QTreeView; - gameListModel = new GamesModel(room->getGameTypes(), this); - gameListProxyModel = new GamesProxyModel(this); - gameListProxyModel->setSourceModel(gameListModel); - gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); - gameListView->setModel(gameListProxyModel); - gameListView->header()->setResizeMode(0, QHeaderView::ResizeToContents); - gameListView->setSortingEnabled(true); - - showFullGamesCheckBox = new QCheckBox; - createButton = new QPushButton; - joinButton = new QPushButton; - spectateButton = new QPushButton; - QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addWidget(showFullGamesCheckBox); - buttonLayout->addStretch(); - buttonLayout->addWidget(createButton); - buttonLayout->addWidget(joinButton); - buttonLayout->addWidget(spectateButton); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addWidget(gameListView); - mainLayout->addLayout(buttonLayout); - - retranslateUi(); - setLayout(mainLayout); - - setMinimumWidth((qreal) (gameListView->columnWidth(0) * gameListModel->columnCount()) / 1.5); - setMinimumHeight(200); - - connect(showFullGamesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showFullGamesChanged(int))); - connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate())); - connect(joinButton, SIGNAL(clicked()), this, SLOT(actJoin())); - connect(spectateButton, SIGNAL(clicked()), this, SLOT(actJoin())); -} - -void GameSelector::showFullGamesChanged(int state) -{ - gameListProxyModel->setFullGamesVisible(state); -} - -void GameSelector::actCreate() -{ - DlgCreateGame dlg(client, room->getRoomId(), room->getGameTypes(), this); - dlg.exec(); -} - -void GameSelector::checkResponse(ResponseCode response) -{ - createButton->setEnabled(true); - joinButton->setEnabled(true); - spectateButton->setEnabled(true); - - switch (response) { - case RespWrongPassword: QMessageBox::critical(this, tr("Error"), tr("Wrong password.")); break; - case RespSpectatorsNotAllowed: QMessageBox::critical(this, tr("Error"), tr("Spectators are not allowed in this game.")); break; - case RespGameFull: QMessageBox::critical(this, tr("Error"), tr("The game is already full.")); break; - case RespNameNotFound: QMessageBox::critical(this, tr("Error"), tr("The game does not exist any more.")); break; - case RespUserLevelTooLow: QMessageBox::critical(this, tr("Error"), tr("This game is only open to registered users.")); break; - case RespOnlyBuddies: QMessageBox::critical(this, tr("Error"), tr("This game is only open to its creator's buddies.")); break; - case RespInIgnoreList: QMessageBox::critical(this, tr("Error"), tr("You are being ignored by the creator of this game.")); break; - default: ; - } -} - -void GameSelector::actJoin() -{ - bool spectator = sender() == spectateButton; - - QModelIndex ind = gameListView->currentIndex(); - if (!ind.isValid()) - return; - ServerInfo_Game *game = gameListModel->getGame(ind.data(Qt::UserRole).toInt()); - QString password; - if (game->getHasPassword() && !(spectator && !game->getSpectatorsNeedPassword())) { - bool ok; - password = QInputDialog::getText(this, tr("Join game"), tr("Password:"), QLineEdit::Password, QString(), &ok); - if (!ok) - return; - } - - Command_JoinGame *commandJoinGame = new Command_JoinGame(room->getRoomId(), game->getGameId(), password, spectator); - connect(commandJoinGame, SIGNAL(finished(ResponseCode)), this, SLOT(checkResponse(ResponseCode))); - client->sendCommand(commandJoinGame); - - createButton->setEnabled(false); - joinButton->setEnabled(false); - spectateButton->setEnabled(false); -} - -void GameSelector::retranslateUi() -{ - setTitle(tr("Games")); - showFullGamesCheckBox->setText(tr("Show &full games")); - createButton->setText(tr("C&reate")); - joinButton->setText(tr("&Join")); - spectateButton->setText(tr("J&oin as spectator")); -} - -void GameSelector::processGameInfo(ServerInfo_Game *info) -{ - gameListModel->updateGameList(info); -} +#include "gameselector.h" TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, const QString &_ownName, ServerInfo_Room *info) : Tab(_tabSupervisor), client(_client), roomId(info->getRoomId()), roomName(info->getName()), ownName(_ownName) @@ -133,7 +23,9 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, const Q for (int i = 0; i < gameTypeList.size(); ++i) gameTypes.insert(gameTypeList[i]->getGameTypeId(), gameTypeList[i]->getDescription()); - gameSelector = new GameSelector(client, this); + QMap tempMap; + tempMap.insert(info->getRoomId(), gameTypes); + gameSelector = new GameSelector(client, this, QMap(), tempMap); userList = new UserList(tabSupervisor, client, UserList::RoomList); connect(userList, SIGNAL(openMessageDialog(const QString &, bool)), this, SIGNAL(openMessageDialog(const QString &, bool))); diff --git a/cockatrice/src/tab_room.h b/cockatrice/src/tab_room.h index 9c19542f..37e6a3d1 100644 --- a/cockatrice/src/tab_room.h +++ b/cockatrice/src/tab_room.h @@ -2,20 +2,16 @@ #define TAB_ROOM_H #include "tab.h" -#include "protocol_datastructures.h" #include +#include class AbstractClient; class UserList; class QLabel; class ChatView; class QLineEdit; -class QTreeView; class QPushButton; class QTextTable; -class QCheckBox; -class GamesModel; -class GamesProxyModel; class RoomEvent; class ServerInfo_Room; class ServerInfo_Game; @@ -24,31 +20,7 @@ class Event_JoinRoom; class Event_LeaveRoom; class Event_RoomSay; class ProtocolResponse; -class TabRoom; - -class GameSelector : public QGroupBox { - Q_OBJECT -private slots: - void showFullGamesChanged(int state); - void actCreate(); - void actJoin(); - void checkResponse(ResponseCode response); -signals: - void gameJoined(int gameId); -private: - AbstractClient *client; - TabRoom *room; - - QTreeView *gameListView; - GamesModel *gameListModel; - GamesProxyModel *gameListProxyModel; - QPushButton *createButton, *joinButton, *spectateButton; - QCheckBox *showFullGamesCheckBox; -public: - GameSelector(AbstractClient *_client, TabRoom *_room, QWidget *parent = 0); - void retranslateUi(); - void processGameInfo(ServerInfo_Game *info); -}; +class GameSelector; class TabRoom : public Tab { Q_OBJECT diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index 419d8b78..20b60992 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -5,6 +5,7 @@ #include "pixmapgenerator.h" #include "userinfobox.h" #include "protocol_items.h" +#include "gameselector.h" #include #include #include @@ -210,6 +211,35 @@ void UserList::userClicked(QTreeWidgetItem *item, int /*column*/) emit openMessageDialog(item->data(2, Qt::UserRole).toString(), true); } +void UserList::gamesOfUserReceived(ProtocolResponse *resp) +{ + Command_GetGamesOfUser *command = static_cast(sender()); + Response_GetGamesOfUser *response = qobject_cast(resp); + if (!response) + return; + + QMap gameTypeMap; + QMap roomMap; + const QList roomList = response->getRoomList(); + for (int i = 0; i < roomList.size(); ++i) { + roomMap.insert(roomList[i]->getRoomId(), roomList[i]->getName()); + const QList gameTypeList = roomList[i]->getGameTypeList(); + GameTypeMap tempMap; + for (int j = 0; j < gameTypeList.size(); ++j) + tempMap.insert(gameTypeList[j]->getGameTypeId(), gameTypeList[j]->getDescription()); + gameTypeMap.insert(roomList[i]->getRoomId(), tempMap); + } + + GameSelector *selector = new GameSelector(client, 0, roomMap, gameTypeMap); + const QList gameList = response->getGameList(); + for (int i = 0; i < gameList.size(); ++i) + selector->processGameInfo(gameList[i]); + + selector->setWindowTitle(tr("%1's games").arg(command->getUserName())); + selector->setAttribute(Qt::WA_DeleteOnClose); + selector->show(); +} + void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) { const QString &userName = index.sibling(index.row(), 2).data(Qt::UserRole).toString(); @@ -230,6 +260,7 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) menu->addAction(aUserName); menu->addSeparator(); menu->addAction(aDetails); + menu->addAction(aShowGames); menu->addAction(aChat); if ((userLevel & ServerInfo_User::IsRegistered) && (tabSupervisor->getUserLevel() & ServerInfo_User::IsRegistered)) { menu->addSeparator(); @@ -260,7 +291,7 @@ void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) client->sendCommand(new Command_RemoveFromList("buddy", userName)); else if (actionClicked == aShowGames) { Command *cmd = new Command_GetGamesOfUser(userName); - connect(cmd, SIGNAL(responseReceived(ProtocolResponse *)), this, SLOT(gamesOfUserReceived(ProtocolResponse *))); + connect(cmd, SIGNAL(finished(ProtocolResponse *)), this, SLOT(gamesOfUserReceived(ProtocolResponse *))); client->sendCommand(cmd); } else if (actionClicked == aAddToIgnoreList) client->sendCommand(new Command_AddToList("ignore", userName)); diff --git a/cockatrice/src/userlist.h b/cockatrice/src/userlist.h index a40fca0f..c71ddc31 100644 --- a/cockatrice/src/userlist.h +++ b/cockatrice/src/userlist.h @@ -12,6 +12,7 @@ class AbstractClient; class TabSupervisor; class QSpinBox; class QPlainTextEdit; +class ProtocolResponse; class BanDialog : public QDialog { Q_OBJECT @@ -52,6 +53,7 @@ private: void setUserOnline(QTreeWidgetItem *user, bool online); private slots: void userClicked(QTreeWidgetItem *item, int column); + void gamesOfUserReceived(ProtocolResponse *resp); signals: void openMessageDialog(const QString &userName, bool focus); void addBuddy(const QString &userName); diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index a3f47786..0b328cc0 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -129,29 +129,29 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel - + Ban user from server @@ -926,82 +926,82 @@ This is only saved for moderators and cannot be seen by the banned person. - + P&layers: - + Game type - + &Password: - + Only &buddies can join - + Only &registered users can join - + Joining restrictions - + &Spectators allowed - + Spectators &need a password to join - + Spectators can &chat - + Spectators see &everything - + Spectators - + &OK - + &Cancel - + Create game - + Error - + Server error. @@ -1203,83 +1203,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error - + + Please join the appropriate room first. + + + + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + C&reate - + &Join - + J&oin as spectator @@ -1295,67 +1301,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes - + yes, free for spectators - + no - + buddies only - + reg. users only - + not allowed - - - Description - - - - - Creator - - - Game type + Room - Password + Description - Restrictions + Creator - Players + Game type + Password + + + + + Restrictions + + + + + Players + + + + Spectators @@ -2581,7 +2592,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2606,27 +2617,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters @@ -3083,27 +3094,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3213,57 +3224,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + + %1's games + + + + User &details - + Direct &chat - + + Show this user's &games + + + + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 6ca4c184..735b3c3b 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -164,7 +164,7 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Bitte geben Sie die Dauer des Banns ein (in Minuten). @@ -175,24 +175,24 @@ Geben Sie 0 ein für einen unbefristeten Bann. Bitte geben Sie den Grund für den Bann ein. Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nicht gesehen werden. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. Bitte geben Sie den Grund für den Bann ein. Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nicht gesehen werden. - + &OK &OK - + &Cancel &Abbrechen - + Ban user from server Benutzer vom Server bannen @@ -1361,42 +1361,42 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Beschreibung: - + &Password: &Passwort: - + P&layers: &Spieler: - + Game type Spieltyp - + Only &buddies can join Nur &Freunde können teilnehmen - + Only &registered users can join Nur &registrierte Benutzer können teilnehmen - + Joining restrictions Teilnahmebedingungen - + &Spectators allowed &Zuschauer zugelassen - + Spectators &need a password to join Zuschauer brauchen &auch ein Passwort @@ -1405,37 +1405,37 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic Zuschauer können sp&rechen - + Spectators can &chat Zuschauer können s&chreiben - + Spectators see &everything Zuschauer sehen &alles - + Spectators Zuschauer - + &OK &OK - + &Cancel &Abbruch - + Create game Spiel erstellen - + Error Fehler @@ -1444,7 +1444,7 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic Ungültige Anzahl an Spielern. - + Server error. Serverfehler. @@ -1947,23 +1947,24 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GameSelector - + C&reate Spiel e&rstellen - + &Join &Teilnehmen - - - - - - - + + + + + + + + Error Fehler @@ -1972,57 +1973,62 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic XXX - + + Please join the appropriate room first. + Bitte betreten Sie erst den entsprechenden Raum. + + + Wrong password. Falsches Passwort. - + Spectators are not allowed in this game. In diesem Spiel sind keine Zuschauer zugelassen. - + The game is already full. Das Spiel ist bereits voll. - + The game does not exist any more. Dieses Spiel gibt es nicht mehr. - + This game is only open to registered users. Dieses Spiel kann nur von registrierten Benutzern betreten werden. - + This game is only open to its creator's buddies. Dieses Spiel kann nur von Freunden des Erstellers betreten werden. - + You are being ignored by the creator of this game. Der Ersteller dieses Spiels ignoriert Sie. - + Join game Spiel beitreten - + Password: Passwort: - + Games Spiele - + Show &full games &Volle Spiele anzeigen @@ -2031,7 +2037,7 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Volle Spiele anzeigen - + J&oin as spectator &Zuschauen @@ -2047,12 +2053,12 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GamesModel - + yes ja - + no nein @@ -2061,57 +2067,62 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic Spiel ID - + Creator Ersteller - + Description Beschreibung - + yes, free for spectators ja, außer für Zuschauer - + buddies only nur Freunde - + reg. users only nur reg. Benutzer - + not allowed nicht erlaubt + Room + Raum + + + Game type Spieltyp - + Password Passwort - + Restrictions Bedingungen - + Players Spieler - + Spectators Zuschauer @@ -3843,7 +3854,7 @@ Lokale Version ist %1, Serverversion ist %2. - + Number: Anzahl: @@ -3858,27 +3869,27 @@ Lokale Version ist %1, Serverversion ist %2. Oberste Karten ins Exil schicken - + Set power/toughness Kampfwerte setzen - + Please enter the new PT: Bitte die neuen Kampfwerte eingeben: - + Set annotation Hinweis setzen - + Please enter the new annotation: Bitte den Hinweis eingeben: - + Set counters Setze Zählmarken @@ -4460,27 +4471,27 @@ Bitte geben Sie einen Namen ein: TabRoom - + &Say: &Sagen: - + Chat Unterhaltung - + &Room &Raum - + &Leave room Raum ver&lassen - + You are flooding the chat. Please wait a couple of seconds. Sie überfluten den Chatraum. Bitte warten Sie ein paar Sekunden. @@ -4617,57 +4628,67 @@ Bitte geben Sie einen Namen ein: UserList - + Users online: %1 Benutzer online: %1 - + Users in this room: %1 Benutzer in diesem Raum: %1 - + Buddies online: %1 / %2 Freunde online: %1 / %2 - + Ignored users online: %1 / %2 Ignorierte Benutzer online: %1 / %2 - + + %1's games + %1s Spiele + + + User &details Benutzer&details - + Direct &chat &Persönliches Gespräch - + + Show this user's &games + Spiele dieses &Benutzers anzeigen + + + Add to &buddy list Zur &Freundesliste hinzufügen - + Remove from &buddy list Von &Freundesliste entfernen - + Add to &ignore list &Ignorieren - + Remove from &ignore list Nicht mehr &ignorieren - + Ban from &server Vom &Server bannen diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 3fcd278e..87989e2c 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -129,29 +129,29 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel - + Ban user from server @@ -926,82 +926,82 @@ This is only saved for moderators and cannot be seen by the banned person. - + &Password: - + P&layers: - + Game type - + Only &buddies can join - + Only &registered users can join - + Joining restrictions - + &Spectators allowed - + Spectators &need a password to join - + Spectators can &chat - + Spectators see &everything - + Spectators - + &OK - + &Cancel - + Create game - + Error - + Server error. @@ -1203,83 +1203,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate - + &Join - - - - - - - + + + + + + + + Error - + + Please join the appropriate room first. + + + + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + J&oin as spectator @@ -1295,67 +1301,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes - + no - + Creator - + Description - + yes, free for spectators - + buddies only - + reg. users only - + not allowed - Game type - - - - - Password - - - - - Restrictions + Room - Players + Game type + Password + + + + + Restrictions + + + + + Players + + + + Spectators @@ -2587,7 +2598,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2612,27 +2623,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters @@ -3089,27 +3100,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3219,57 +3230,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + + %1's games + + + + User &details - + Direct &chat - + + Show this user's &games + + + + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index e5e199b2..877347b7 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -137,30 +137,30 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Por favor, introduce la duración del ban (en minutos) Indica 0 para un ban indefinido. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK &Aceptar - + &Cancel &Cancelar - + Ban user from server @@ -1276,82 +1276,82 @@ This is only saved for moderators and cannot be seen by the banned person.&Descripción: - + &Password: &Contraseña: - + P&layers: &Jugadores: - + Game type Tipo de partida - + Only &buddies can join Sólo los &amigos pueden participar - + Only &registered users can join Sólo los usuarios &registrados pueden participar - + Joining restrictions Restricciones de participación - + &Spectators allowed Permitir e&spectadores - + Spectators &need a password to join Los espectadores &necesitan contraseña para unirse - + Spectators can &chat Los espectadores pueden &chatear - + Spectators see &everything Los espectadores pueden verlo &todo - + Spectators Espectadores - + &OK &Aceptar - + &Cancel &Cancelar - + Create game Crear partida - + Error Error - + Server error. Error del servidor. @@ -1565,78 +1565,84 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate C&rear - + &Join E&ntrar - - - - - - - + + + + + + + + Error Error - + + Please join the appropriate room first. + + + + Wrong password. Contraseña incorrecta. - + Spectators are not allowed in this game. No se permiten espectadores en esta partida. - + The game is already full. La partida no tiene plazas libres. - + The game does not exist any more. La partida ya no existe. - + This game is only open to registered users. Esta partida está abierta sólo a usuarios registrados. - + This game is only open to its creator's buddies. Esta partida está abierta sólo a los amigos del creador. - + You are being ignored by the creator of this game. Estas siendo ignorado por el creador de la partida. - + Join game Entrar en la partida - + Password: Contraseña: - + Games Partidas - + Show &full games Ver partidas &sin plazas libres @@ -1645,7 +1651,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Ver partidas sin plazas libres - + J&oin as spectator Entrar como e&spectador @@ -1661,67 +1667,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes - + no no - + Creator Creador - + Description Descripción - + yes, free for spectators sí, libre para espectadores - + buddies only solo amigos - + reg. users only solo usuarios registrados - + not allowed no permitido + Room + Sala + + + Game type Tipo de partida - + Password Contraseña - + Restrictions Restricciones - + Players Jugadores - + Spectators Espectadores @@ -2981,7 +2992,7 @@ La versión local es %1, la versión remota es %2. - + Number: Número: @@ -3006,27 +3017,27 @@ La versión local es %1, la versión remota es %2. Número de caras: - + Set power/toughness Establecer fuerza/resistencia - + Please enter the new PT: Por favor, introduzca la nueva F/R: - + Set annotation Escribir anotación - + Please enter the new annotation: Por favor, introduza la nueva anotación: - + Set counters Establecer contadores @@ -3538,27 +3549,27 @@ Por favor, introduzca un nombre: TabRoom - + &Say: &Decir: - + Chat Chat - + &Room &Sala - + &Leave room &Dejar sala - + You are flooding the chat. Please wait a couple of seconds. Estás floodeando el chat. Por favor, espera unos segundos. @@ -3680,57 +3691,67 @@ Por favor, introduzca un nombre: UserList - + Users online: %1 Usuarios online: %1 - + Users in this room: %1 Usuarios en esta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuarios ignorados online: %1 / %2 - + + %1's games + + + + User &details &Detalles del usuario - + Direct &chat &Chat privado - + + Show this user's &games + + + + Add to &buddy list Añadir a la lista de &amigos - + Remove from &buddy list Quitar de la lista de &amigos - + Add to &ignore list Añadir a la lista de &ignorados - + Remove from &ignore list Quitar de la lista de &ignorados - + Ban from &server Banear del &servidor diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index 1aec9f3c..2df8edd4 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -129,30 +129,30 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Entrez la durée de temps du ban (en minutes). Entrez 0 pour une durée illimitée du ban. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK &OK - + &Cancel &Annuler - + Ban user from server @@ -1138,82 +1138,82 @@ This is only saved for moderators and cannot be seen by the banned person.&Description: - + &Password: Mot de &Passe: - + P&layers: &Joueurs: - + Game type Type de partie - + Only &buddies can join Seuls les &amis peuvent rejoindre - + Only &registered users can join Seules les personnes en&registrées peuvent rejoindre - + Joining restrictions Conditions pour rejoindre - + &Spectators allowed &Spectateurs autorisés - + Spectators &need a password to join Les spectateurs ont besoin d'un &mot de passe pour rejoindre - + Spectators can &chat Les spectateurs peuvent dis&cuter - + Spectators see &everything Les spectateurs p&euvent tout voir - + Spectators Spectateurs - + &OK &OK - + &Cancel &Annuler - + Create game Créer partie - + Error Erreur - + Server error. Erreur serveur. @@ -1415,68 +1415,74 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error Erreur - + + Please join the appropriate room first. + + + + Wrong password. Mot de passe erroné. - + Spectators are not allowed in this game. Les spectateurs ne sont pas autorisés dans cette partie. - + The game is already full. Cette partie est déjà pleine. - + The game does not exist any more. La partie n'existe plus. - + This game is only open to registered users. Cette partie n'est accessible qu'aux joueurs enregistrés. - + This game is only open to its creator's buddies. Cette partie n'est accessible qu'aux amis. - + You are being ignored by the creator of this game. Vous avez été ignoré par le créateur de la partie. - + Join game Rejoindre partie - + Password: Mot de passe: - + Games Parties - + Show &full games Montrer &toutes les parties @@ -1486,17 +1492,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Montrer toutes les parties - + C&reate C&réer - + &Join Re&joindre - + J&oin as spectator Rej&oindre en tant que spectateur @@ -1512,67 +1518,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes oui - + yes, free for spectators oui, libre pour les spectateurs - + no non - + buddies only invités uniquement - + reg. users only joueurs enregistrés uniquement - + not allowed non autorisé - + + Room + Salon + + + Description Description - + Creator Créateur - + Game type Type de jeu - + Password Mot de passe - + Restrictions Restrictions - + Players Joueurs - + Spectators Spectateurs @@ -2846,7 +2857,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + Number: Nombre: @@ -2871,28 +2882,28 @@ La version la plus récente est %1, l'ancienne version est %2.Nombre de faces: - + Set power/toughness Fixer force/endurance - + Please enter the new PT: maybe better with / Entrer la nouvelle F/E: - + Set annotation Mettre une note - + Please enter the new annotation: Entrez la nouvelle note: - + Set counters Mettre des marqueurs @@ -3398,27 +3409,27 @@ Entrez un nom s'il vous plaît: TabRoom - + &Say: &Dire: - + Chat Chat - + &Room &Salon - + &Leave room &Quitter le salon - + You are flooding the chat. Please wait a couple of seconds. Vous floodez le chat. Veuillez patienter quelques secondes. @@ -3541,57 +3552,67 @@ Entrez un nom s'il vous plaît: UserList - + Users online: %1 Utilisateurs en ligne:%1 - + Users in this room: %1 Utilisateurs dans ce salon: %1 - + Buddies online: %1 / %2 Amis connectés; %1 / %2 - + Ignored users online: %1 / %2 Personnes sur liste noire connectés: %1 / %2 - + + %1's games + + + + User &details &Détails utilisateur - + Direct &chat &Chat direct - + + Show this user's &games + + + + Add to &buddy list Ajouter à la liste d'&amis - + Remove from &buddy list Retirer de la liste d'&amis - + Add to &ignore list Ajouter à la liste &noire - + Remove from &ignore list Retirer de la liste &noire - + Ban from &server Bannir du &serveur diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index f6d1b9c0..c9f0a6e9 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -134,29 +134,29 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. バンする期間を入力してください(分単位).0でバンを解除します. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel - + Ban user from server @@ -974,82 +974,82 @@ This is only saved for moderators and cannot be seen by the banned person.説明: - + &Password: パスワード: - + P&layers: プレイヤー人数: - + Game type ゲームタイプ - + Only &buddies can join フレンドのみ参加可能 - + Only &registered users can join 登録済みプレイヤーのみ参加可能 - + Joining restrictions 参加制限 - + &Spectators allowed 観戦者を許可する - + Spectators &need a password to join 観戦者は参加にパスワードが必要 - + Spectators can &chat 観戦者はチャットに参加できる - + Spectators see &everything 観戦者は全て見れる - + Spectators 観戦者 - + &OK - + &Cancel - + Create game 部屋を作る - + Error エラー - + Server error. サーバーエラー. @@ -1251,78 +1251,84 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate 部屋を作る - + &Join 参加する - - - - - - - + + + + + + + + Error エラー - + + Please join the appropriate room first. + + + + Wrong password. パスワードが間違っています. - + Spectators are not allowed in this game. この試合は観戦者は許可されていません. - + The game is already full. このゲームはすでに満員です. - + The game does not exist any more. このゲームはもう存在しません. - + This game is only open to registered users. このゲームは登録済みプレイヤーにのみ公開されています. - + This game is only open to its creator's buddies. このゲームは作成者のフレンドのみに公開されています. - + You are being ignored by the creator of this game. あなたはこのゲームの作成者によって拒否されています. - + Join game 参加 - + Password: パスワード: - + Games ゲーム - + Show &full games 全てのゲームを見る @@ -1331,7 +1337,7 @@ This is only saved for moderators and cannot be seen by the banned person.全てのゲームを見る - + J&oin as spectator 観戦者として参加 @@ -1347,67 +1353,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes あり - + no なし - + Creator 作成者 - + Description 説明 - + yes, free for spectators あり,観戦は自由 - + buddies only フレンドのみ - + reg. users only 登録済みユーザーのみ - + not allowed 不許可 + Room + 部屋 + + + Game type ゲームタイプ - + Password パスワード - + Restrictions 制限 - + Players プレイヤー - + Spectators 観戦者 @@ -2634,7 +2645,7 @@ Local version is %1, remote version is %2. - + Number: 枚数 @@ -2659,27 +2670,27 @@ Local version is %1, remote version is %2. 面の数: - + Set power/toughness パワーとタフネスを設定する - + Please enter the new PT: 新しいP/Tを入力してください - + Set annotation 補足を付ける - + Please enter the new annotation: 新しい補足を付けてください - + Set counters カウンターを設定する @@ -3174,27 +3185,27 @@ Please enter a name: TabRoom - + &Say: 発言する - + Chat チャット - + &Room 部屋 - + &Leave room 部屋から出る - + You are flooding the chat. Please wait a couple of seconds. あなたはチャットルームから弾かれました.少々お待ちください. @@ -3316,57 +3327,67 @@ Please enter a name: UserList - + Users online: %1 ユーザー オンライン: %1 - + Users in this room: %1 部屋のユーザー数: %1 - + Buddies online: %1 / %2 フレンドオンライン: %1 / %2 - + Ignored users online: %1 / %2 無視ユーザーオンライン: %1 / %2 - + + %1's games + + + + User &details ユーザー補足 - + Direct &chat 個人チャット - + + Show this user's &games + + + + Add to &buddy list フレンドリストに追加 - + Remove from &buddy list フレンドリストから削除 - + Add to &ignore list 無視リストに追加 - + Remove from &ignore list 無視リストから削除 - + Ban from &server サーバーからバンする diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 07fd6510..492dbed2 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -129,29 +129,29 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel - + Ban user from server @@ -926,82 +926,82 @@ This is only saved for moderators and cannot be seen by the banned person. - + P&layers: - + Game type - + &Password: - + Only &buddies can join - + Only &registered users can join - + Joining restrictions - + &Spectators allowed - + Spectators &need a password to join - + Spectators can &chat - + Spectators see &everything - + Spectators - + &OK - + &Cancel - + Create game - + Error - + Server error. @@ -1203,83 +1203,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error - + + Please join the appropriate room first. + + + + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + C&reate - + &Join - + J&oin as spectator @@ -1295,67 +1301,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes - + yes, free for spectators - + no - + buddies only - + reg. users only - + not allowed - - - Description - - - - - Creator - - - Game type + Room - Password + Description - Restrictions + Creator - Players + Game type + Password + + + + + Restrictions + + + + + Players + + + + Spectators @@ -2581,7 +2592,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2606,27 +2617,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters @@ -3083,27 +3094,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3213,57 +3224,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + + %1's games + + + + User &details - + Direct &chat - + + Show this user's &games + + + + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index 478d43f9..0404d46d 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -133,30 +133,30 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Por favor, digite a duração do banimento (em minutos). Digite 0 para banir indefinidamente. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK &OK - + &Cancel &Cancelar - + Ban user from server @@ -1142,82 +1142,82 @@ This is only saved for moderators and cannot be seen by the banned person.&Descrição: - + &Password: S&enha: - + P&layers: &Jogadores: - + Game type Tipo de jogo - + Only &buddies can join Apenas ami&gos podem entrar - + Only &registered users can join Apenas usuários re&gistrados podem entrar - + Joining restrictions Restrições para entrar - + &Spectators allowed &Permitir visitantes - + Spectators &need a password to join Visitantes &precisam de senha para entrar - + Spectators can &chat Visitantes podem c&onversar - + Spectators see &everything Visitantes podem ver &tudo - + Spectators Visitantes - + &OK &OK - + &Cancel &Cancelar - + Create game Criar jogo - + Error Erro - + Server error. Erro do servidor. @@ -1419,78 +1419,84 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate &Criar - + &Join &Entrar - - - - - - - + + + + + + + + Error Erro - + + Please join the appropriate room first. + + + + Wrong password. Senha incorreta. - + Spectators are not allowed in this game. Não são permitidos visitantes neste jogo. - + The game is already full. O jogo está cheio. - + The game does not exist any more. O jogo não existe mais. - + This game is only open to registered users. Este jogo é aberto apenas para usuários registrados. - + This game is only open to its creator's buddies. Este jogo é aberto apenas para os amigos de quem criou o jogo. - + You are being ignored by the creator of this game. Você está sendo ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Senha: - + Games Jogos - + Show &full games &Mostrar os jogos cheios @@ -1499,7 +1505,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar os jogos cheios - + J&oin as spectator E&ntrar como visitante @@ -1515,67 +1521,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes sim - + no não - + Creator Criador - + Description Descrição - + yes, free for spectators sim, livre para visitantes - + buddies only apenas amigos - + reg. users only usuários reg. apenas - + not allowed não permitidos + Room + Sala + + + Game type Tipo de jogo - + Password Senha - + Restrictions Restrições - + Players Jogadores - + Spectators Visitantes @@ -2831,7 +2842,7 @@ A versão local é %1 e a versão remota é %2. - + Number: Número: @@ -2856,27 +2867,27 @@ A versão local é %1 e a versão remota é %2. Número de lados: - + Set power/toughness Alterar poder/resistência - + Please enter the new PT: Por favor, entre com o novo P/R: - + Set annotation Alterar nota - + Please enter the new annotation: Por favor, entre com a nova nota: - + Set counters Alterar marcadores @@ -3380,27 +3391,27 @@ Por favor, entre um nome: TabRoom - + &Say: &Falar: - + Chat Chat - + &Room &Sala - + &Leave room S&air da sala - + You are flooding the chat. Please wait a couple of seconds. Você está flodando o chat. Por favor, espere alguns segundos. @@ -3522,57 +3533,67 @@ Por favor, entre um nome: UserList - + Users online: %1 Usuários online: %1 - + Users in this room: %1 Usuários nesta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuários ignorados online: %1 / %2 - + + %1's games + + + + User &details &Detalhes do usuário - + Direct &chat &Chat direto - + + Show this user's &games + + + + Add to &buddy list Adicionar à &lista de amigos - + Remove from &buddy list Remover da li&sta de amigos - + Add to &ignore list Adicionar à li&sta dos ignorados - + Remove from &ignore list Remover da lista dos i&gnorados - + Ban from &server Ban&ir do servidor diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index 67609431..351b8b98 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -133,30 +133,30 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Por favor introduza a duração do banimento (em minutos). Introduza 0 para um banimento indefinido. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel &Cancelar - + Ban user from server @@ -1142,82 +1142,82 @@ This is only saved for moderators and cannot be seen by the banned person.&Descrição: - + &Password: &Password: - + P&layers: &Jogadores: - + Game type Tipo de jogo - + Only &buddies can join Apenas &amigos podem entrar - + Only &registered users can join Apenas utilizadores &registados podem entrar - + Joining restrictions Restrições para ligar - + &Spectators allowed &Espectadores permitidos - + Spectators &need a password to join Espectadores &necessitam de password para aceder - + Spectators can &chat Espectadores podem c&onversar - + Spectators see &everything Espectadores podem ver &tudo - + Spectators Espectadores - + &OK O&K - + &Cancel &Cancelar - + Create game Criar jogo - + Error Erro - + Server error. Erro do servidor. @@ -1419,68 +1419,74 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error Erro - + + Please join the appropriate room first. + + + + Wrong password. Password incorrecta. - + Spectators are not allowed in this game. Não são permitidos espectadores neste jogo. - + The game is already full. O jogo já se encontra cheio. - + The game does not exist any more. O jogo já não existe. - + This game is only open to registered users. Este jogo só está aberto a utilizadores registados. - + This game is only open to its creator's buddies. Este jogo só está aberto aos amigos do seu criador. - + You are being ignored by the creator of this game. Você está a ser ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Password: - + Games Jogos - + Show &full games &Mostrar jogos cheios @@ -1489,17 +1495,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar jogos cheios - + C&reate &Criar - + &Join &Entrar - + J&oin as spectator Entrar como &espectador @@ -1515,67 +1521,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes sim - + yes, free for spectators sim, livre para espectadores - + no não - + buddies only amigos apenas - + reg. users only utilizadores registados apenas - + not allowed não permitidos - + + Room + Sala + + + Description Descrição - + Creator Criador - + Game type Tipo de jogo - + Password Password - + Restrictions Restrições - + Players Jogadores - + Spectators Espectadores @@ -2835,7 +2846,7 @@ Versão local é %1, versão remota é %2. - + Number: Número: @@ -2860,27 +2871,27 @@ Versão local é %1, versão remota é %2. Número de faces: - + Set power/toughness Definir poder/resistência - + Please enter the new PT: Por favor introduza o novo P/R: - + Set annotation Colocar nota - + Please enter the new annotation: Por favor introduza a nova nota: - + Set counters Definir marcadores @@ -3384,27 +3395,27 @@ Por favor introduza um nome: TabRoom - + &Say: &Dizer: - + Chat - + &Room &Sala - + &Leave room &Abandonar a sala - + You are flooding the chat. Please wait a couple of seconds. Estás a inundar o chat .Por favor aguarde alguns segundos. @@ -3526,57 +3537,67 @@ Por favor introduza um nome: UserList - + Users online: %1 Utilizadores online: %1 - + Users in this room: %1 Utilizadores nesta sala:%1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Utilizadores ignorados online %1 / %2 - + + %1's games + + + + User &details Detalhes do &utilizador - + Direct &chat Conversação &directa - + + Show this user's &games + + + + Add to &buddy list Adicionar a lista de &amigos - + Remove from &buddy list Remover da lista de &amigos - + Add to &ignore list Adicionar a lista a &ignorar - + Remove from &ignore list Remover da lista a &ignorar - + Ban from &server Banir do &servidor diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index af264167..8f875c2a 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -129,30 +129,30 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. Введите продолжительность бана (в минутах). Введите 0 чтобы забанить пожизненно. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK &Ок - + &Cancel &Отмена - + Ban user from server @@ -1081,82 +1081,82 @@ This is only saved for moderators and cannot be seen by the banned person.&Подпись: - + &Password: &Пароль: - + P&layers: &Количество игроков: - + Game type Формат игры - + Only &buddies can join Только для &своих - + Only &registered users can join Только для &зарег. пользователей - + Joining restrictions Ограничения - + &Spectators allowed &Разрешить зрителей - + Spectators &need a password to join Требовать &пароль у зрителей - + Spectators can &chat Позволить зрителям &комментировать - + Spectators see &everything Показывать зрителям &все - + Spectators Зрители - + &OK &Ок - + &Cancel &Отмена - + Create game Создать игру - + Error Ошибка - + Server error. Ошибка сервера. @@ -1358,83 +1358,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error Ошибка - + + Please join the appropriate room first. + + + + Wrong password. Неверный пароль. - + Spectators are not allowed in this game. В эту игру не пускают зрителей. - + The game is already full. Все места заняты! =Ь - + The game does not exist any more. Эта игра была удалена. - + This game is only open to registered users. Доступно только для зарегистрированных. - + This game is only open to its creator's buddies. Доступно только для друзей. - + You are being ignored by the creator of this game. Вы добавлены в игнор-лист данного игрока. - + Join game Присоединиться - + Password: Пароль: - + Games Игры - + Show &full games Показывать &текущие - + C&reate С&оздать - + &Join &Присоединиться - + J&oin as spectator П&рисоединиться как зритель @@ -1450,67 +1456,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes да - + yes, free for spectators да, свободно для зрителей - + no нет - + buddies only только свои - + reg. users only только зарег. - + not allowed Не допускаются - + + Room + Комната + + + Description Подпись - + Creator Создал - + Game type Формат игры - + Password Пароль - + Restrictions Ограничения - + Players Количество игроков - + Spectators Зрители @@ -2768,7 +2779,7 @@ Local version is %1, remote version is %2. - + Number: Количество: @@ -2793,27 +2804,27 @@ Local version is %1, remote version is %2. Количество граней: - + Set power/toughness Установить Силу/Защиту - + Please enter the new PT: Введите новые Силу/Защиту: - + Set annotation Пометка - + Please enter the new annotation: Введите текст: - + Set counters Установить жетоны @@ -3283,27 +3294,27 @@ Please enter a name: TabRoom - + &Say: &Сказать: - + Chat Чат - + &Room &Комната - + &Leave room &Покинуть комнату - + You are flooding the chat. Please wait a couple of seconds. Кажется, Вы нафлудили. Пожалуйста, подождите пару секунд. @@ -3417,57 +3428,67 @@ Please enter a name: UserList - + Users online: %1 Пользователей онлайн: %1 - + Users in this room: %1 Пользователей в этой комнате: %1 - + Buddies online: %1 / %2 Друзей онлайн: %1 / %2 - + Ignored users online: %1 / %2 Игнорируемых пользователей онлайн: %1 / %2 - + + %1's games + + + + User &details Данные о &пользователе - + Direct &chat Обратиться &лично - + + Show this user's &games + + + + Add to &buddy list Добавить в список &друзей - + Remove from &buddy list &Удалить из друзей - + Add to &ignore list Добавить в &игнор-лист - + Remove from &ignore list Удалить и&з игнор-листа - + Ban from &server За&банить на сервере diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 63a3c840..dddb7465 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -129,29 +129,29 @@ BanDialog - + Please enter the duration of the ban (in minutes). Enter 0 for an indefinite ban. - + Please enter the reason for the ban. This is only saved for moderators and cannot be seen by the banned person. - + &OK - + &Cancel - + Ban user from server @@ -926,82 +926,82 @@ This is only saved for moderators and cannot be seen by the banned person. - + P&layers: - + Game type - + &Password: - + Only &buddies can join - + Only &registered users can join - + Joining restrictions - + &Spectators allowed - + Spectators &need a password to join - + Spectators can &chat - + Spectators see &everything - + Spectators - + &OK - + &Cancel - + Create game - + Error - + Server error. @@ -1203,83 +1203,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - + + + + + + + + Error - + + Please join the appropriate room first. + + + + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + C&reate - + &Join - + J&oin as spectator @@ -1295,67 +1301,72 @@ This is only saved for moderators and cannot be seen by the banned person. GamesModel - + yes - + yes, free for spectators - + no - + buddies only - + reg. users only - + not allowed - - - Description - - - - - Creator - - - Game type + Room - Password + Description - Restrictions + Creator - Players + Game type + Password + + + + + Restrictions + + + + + Players + + + + Spectators @@ -2581,7 +2592,7 @@ Local version is %1, remote version is %2. - + Number: @@ -2606,27 +2617,27 @@ Local version is %1, remote version is %2. - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters @@ -3083,27 +3094,27 @@ Please enter a name: TabRoom - + &Say: - + Chat - + &Room - + &Leave room - + You are flooding the chat. Please wait a couple of seconds. @@ -3213,57 +3224,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + + %1's games + + + + User &details - + Direct &chat - + + Show this user's &games + + + + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/common/protocol.cpp b/common/protocol.cpp index 205f2b2a..85c581d0 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -257,6 +257,7 @@ void ProtocolResponse::initializeHash() { responseHash.insert(QString(), RespNothing); responseHash.insert("ok", RespOk); + responseHash.insert("not_in_room", RespNotInRoom); responseHash.insert("internal_error", RespInternalError); responseHash.insert("invalid_command", RespInvalidCommand); responseHash.insert("name_not_found", RespNameNotFound); @@ -297,12 +298,34 @@ Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Dec insertItem(_root); } -Response_GetGamesOfUser::Response_GetGamesOfUser(int _cmdId, ResponseCode _responseCode, const QList &_gameList) +Response_GetGamesOfUser::Response_GetGamesOfUser(int _cmdId, ResponseCode _responseCode, const QList &_roomList, const QList &_gameList) + : ProtocolResponse(_cmdId, _responseCode, "get_games_of_user") { + roomList = _roomList; + for (int i = 0; i < _roomList.size(); ++i) + itemList.append(_roomList[i]); + + gameList = _gameList; for (int i = 0; i < _gameList.size(); ++i) itemList.append(_gameList[i]); } +void Response_GetGamesOfUser::extractData() +{ + for (int i = 0; i < itemList.size(); ++i) { + ServerInfo_Room *room = dynamic_cast(itemList[i]); + if (room) { + roomList.append(room); + continue; + } + ServerInfo_Game *game = dynamic_cast(itemList[i]); + if (game) { + gameList.append(game); + continue; + } + } +} + Response_GetUserInfo::Response_GetUserInfo(int _cmdId, ResponseCode _responseCode, ServerInfo_User *_user) : ProtocolResponse(_cmdId, _responseCode, "get_user_info") { diff --git a/common/protocol.h b/common/protocol.h index 1feda02f..beb09d49 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -285,11 +285,17 @@ public: class Response_GetGamesOfUser : public ProtocolResponse { Q_OBJECT +private: + QList gameList; + QList roomList; +protected: + void extractData(); public: - Response_GetGamesOfUser(int _cmdId = -1, ResponseCode _responseCode = RespOk, const QList &_gameList = QList()); + Response_GetGamesOfUser(int _cmdId = -1, ResponseCode _responseCode = RespOk, const QList &_roomList = QList(), const QList &_gameList = QList()); int getItemId() const { return ItemId_Response_GetGamesOfUser; } static SerializableItem *newItem() { return new Response_GetGamesOfUser; } - QList getGameList() const { return typecastItemList(); } + QList getRoomList() const { return roomList; } + QList getGameList() const { return gameList; } }; class Response_GetUserInfo : public ProtocolResponse { diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h index 40ab6751..6ad7cd09 100644 --- a/common/protocol_datastructures.h +++ b/common/protocol_datastructures.h @@ -8,7 +8,7 @@ class DeckList; -enum ResponseCode { RespNothing, RespOk, RespInternalError, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespFunctionNotAllowed, RespGameNotStarted, RespGameFull, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed, RespOnlyBuddies, RespUserLevelTooLow, RespInIgnoreList, RespWouldOverwriteOldSession, RespChatFlood }; +enum ResponseCode { RespNothing, RespOk, RespNotInRoom, RespInternalError, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespFunctionNotAllowed, RespGameNotStarted, RespGameFull, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed, RespOnlyBuddies, RespUserLevelTooLow, RespInIgnoreList, RespWouldOverwriteOldSession, RespChatFlood }; // PrivateZone: Contents of the zone are always visible to the owner, // but not to anyone else. @@ -71,6 +71,7 @@ class ServerInfo_Game : public SerializableItem_Map { public: ServerInfo_Game(int _roomId = -1, int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); static SerializableItem *newItem() { return new ServerInfo_Game; } + int getRoomId() const { return static_cast(itemMap.value("room_id"))->getData(); } int getGameId() const { return static_cast(itemMap.value("game_id"))->getData(); } QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); } bool getHasPassword() const { return static_cast(itemMap.value("has_password"))->getData(); } diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index e6cadb58..974869e7 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -80,7 +80,7 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm Server_Room *room = rooms.value(roomCommand->getRoomId(), 0); if (!room) - return RespNameNotFound; + return RespNotInRoom; QMutexLocker locker(&room->roomMutex); @@ -101,7 +101,7 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm gameListMutex.lock(); if (!games.contains(gameCommand->getGameId())) { qDebug() << "invalid game"; - return RespNameNotFound; + return RespNotInRoom; } QPair gamePair = games.value(gameCommand->getGameId()); Server_Game *game = gamePair.first; @@ -340,13 +340,19 @@ ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(Command_GetGamesOfUser *c if (!server->getUsers().contains(cmd->getUserName())) return RespNameNotFound; + QList roomList; QList gameList; QMapIterator roomIterator(server->getRooms()); - while (roomIterator.hasNext()) - gameList.append(roomIterator.next().value()->getGamesOfUser(cmd->getUserName())); + while (roomIterator.hasNext()) { + Server_Room *room = roomIterator.next().value(); + room->roomMutex.lock(); + roomList.append(room->getInfo(false, true)); + gameList.append(room->getGamesOfUser(cmd->getUserName())); + room->roomMutex.unlock(); + } server->serverMutex.unlock(); - ProtocolResponse *resp = new Response_GetGamesOfUser(cont->getCmdId(), RespOk, gameList); + ProtocolResponse *resp = new Response_GetGamesOfUser(cont->getCmdId(), RespOk, roomList, gameList); if (getCompressionSupport()) resp->setCompressed(true); cont->setResponse(resp); diff --git a/common/server_room.cpp b/common/server_room.cpp index 77030bff..9e9aa571 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -26,7 +26,7 @@ Server *Server_Room::getServer() const return static_cast(parent()); } -ServerInfo_Room *Server_Room::getInfo(bool complete) const +ServerInfo_Room *Server_Room::getInfo(bool complete, bool showGameTypes) const { QMutexLocker locker(&roomMutex); @@ -40,10 +40,10 @@ ServerInfo_Room *Server_Room::getInfo(bool complete) const for (int i = 0; i < size(); ++i) userList.append(new ServerInfo_User(at(i)->getUserInfo(), false)); - + } + if (complete || showGameTypes) for (int i = 0; i < gameTypes.size(); ++i) gameTypeList.append(new ServerInfo_GameType(i, gameTypes[i])); - } return new ServerInfo_Room(id, name, description, games.size(), size(), autoJoin, gameList, userList, gameTypeList); } @@ -133,8 +133,6 @@ int Server_Room::getGamesCreatedByUser(const QString &userName) const QList Server_Room::getGamesOfUser(const QString &userName) const { - QMutexLocker locker(&roomMutex); - QList result; QMapIterator gamesIterator(games); while (gamesIterator.hasNext()) { diff --git a/common/server_room.h b/common/server_room.h index 96712ac6..663c9cee 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -38,7 +38,7 @@ public: QString getJoinMessage() const { return joinMessage; } const QMap &getGames() const { return games; } Server *getServer() const; - ServerInfo_Room *getInfo(bool complete) const; + ServerInfo_Room *getInfo(bool complete, bool showGameTypes = false) const; int getGamesCreatedByUser(const QString &name) const; QList getGamesOfUser(const QString &name) const; From 9727a389560306873eeff8989e44479f4474ee8c Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 2 Jul 2011 16:44:12 +0200 Subject: [PATCH 16/26] added missing files --- cockatrice/src/gameselector.cpp | 131 ++++++++++++++++++++++++++++++++ cockatrice/src/gameselector.h | 41 ++++++++++ cockatrice/src/gametypemap.h | 8 ++ sounds/cuckoo.raw | Bin 0 -> 43296 bytes 4 files changed, 180 insertions(+) create mode 100644 cockatrice/src/gameselector.cpp create mode 100644 cockatrice/src/gameselector.h create mode 100644 cockatrice/src/gametypemap.h create mode 100644 sounds/cuckoo.raw diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp new file mode 100644 index 00000000..9ca8a7e3 --- /dev/null +++ b/cockatrice/src/gameselector.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "dlg_creategame.h" +#include "abstractclient.h" +#include "protocol_items.h" +#include "gameselector.h" +#include "gamesmodel.h" + +GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, const QMap &_rooms, const QMap &_gameTypes, QWidget *parent) + : QGroupBox(parent), client(_client), room(_room) +{ + gameListView = new QTreeView; + gameListModel = new GamesModel(_rooms, _gameTypes, this); + gameListProxyModel = new GamesProxyModel(this); + gameListProxyModel->setSourceModel(gameListModel); + gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); + gameListView->setModel(gameListProxyModel); + gameListView->setSortingEnabled(true); + if (_room) + gameListView->header()->hideSection(0); + gameListView->header()->setResizeMode(1, QHeaderView::ResizeToContents); + + showFullGamesCheckBox = new QCheckBox; + if (room) + createButton = new QPushButton; + else + createButton = 0; + joinButton = new QPushButton; + spectateButton = new QPushButton; + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addWidget(showFullGamesCheckBox); + buttonLayout->addStretch(); + if (room) + buttonLayout->addWidget(createButton); + buttonLayout->addWidget(joinButton); + buttonLayout->addWidget(spectateButton); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(gameListView); + mainLayout->addLayout(buttonLayout); + + retranslateUi(); + setLayout(mainLayout); + + setMinimumWidth((qreal) (gameListView->columnWidth(0) * gameListModel->columnCount()) / 1.5); + setMinimumHeight(200); + + connect(showFullGamesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showFullGamesChanged(int))); + connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate())); + connect(joinButton, SIGNAL(clicked()), this, SLOT(actJoin())); + connect(spectateButton, SIGNAL(clicked()), this, SLOT(actJoin())); +} + +void GameSelector::showFullGamesChanged(int state) +{ + gameListProxyModel->setFullGamesVisible(state); +} + +void GameSelector::actCreate() +{ + DlgCreateGame dlg(client, room->getRoomId(), room->getGameTypes(), this); + dlg.exec(); +} + +void GameSelector::checkResponse(ResponseCode response) +{ + if (createButton) + createButton->setEnabled(true); + joinButton->setEnabled(true); + spectateButton->setEnabled(true); + + switch (response) { + case RespNotInRoom: QMessageBox::critical(this, tr("Error"), tr("Please join the appropriate room first.")); break; + case RespWrongPassword: QMessageBox::critical(this, tr("Error"), tr("Wrong password.")); break; + case RespSpectatorsNotAllowed: QMessageBox::critical(this, tr("Error"), tr("Spectators are not allowed in this game.")); break; + case RespGameFull: QMessageBox::critical(this, tr("Error"), tr("The game is already full.")); break; + case RespNameNotFound: QMessageBox::critical(this, tr("Error"), tr("The game does not exist any more.")); break; + case RespUserLevelTooLow: QMessageBox::critical(this, tr("Error"), tr("This game is only open to registered users.")); break; + case RespOnlyBuddies: QMessageBox::critical(this, tr("Error"), tr("This game is only open to its creator's buddies.")); break; + case RespInIgnoreList: QMessageBox::critical(this, tr("Error"), tr("You are being ignored by the creator of this game.")); break; + default: ; + } +} + +void GameSelector::actJoin() +{ + bool spectator = sender() == spectateButton; + + QModelIndex ind = gameListView->currentIndex(); + if (!ind.isValid()) + return; + ServerInfo_Game *game = gameListModel->getGame(ind.data(Qt::UserRole).toInt()); + QString password; + if (game->getHasPassword() && !(spectator && !game->getSpectatorsNeedPassword())) { + bool ok; + password = QInputDialog::getText(this, tr("Join game"), tr("Password:"), QLineEdit::Password, QString(), &ok); + if (!ok) + return; + } + + Command_JoinGame *commandJoinGame = new Command_JoinGame(game->getRoomId(), game->getGameId(), password, spectator); + connect(commandJoinGame, SIGNAL(finished(ResponseCode)), this, SLOT(checkResponse(ResponseCode))); + client->sendCommand(commandJoinGame); + + if (createButton) + createButton->setEnabled(false); + joinButton->setEnabled(false); + spectateButton->setEnabled(false); +} + +void GameSelector::retranslateUi() +{ + setTitle(tr("Games")); + showFullGamesCheckBox->setText(tr("Show &full games")); + if (createButton) + createButton->setText(tr("C&reate")); + joinButton->setText(tr("&Join")); + spectateButton->setText(tr("J&oin as spectator")); +} + +void GameSelector::processGameInfo(ServerInfo_Game *info) +{ + gameListModel->updateGameList(info); +} + diff --git a/cockatrice/src/gameselector.h b/cockatrice/src/gameselector.h new file mode 100644 index 00000000..4a178bc3 --- /dev/null +++ b/cockatrice/src/gameselector.h @@ -0,0 +1,41 @@ +#ifndef GAMESELECTOR_H +#define GAMESELECTOR_H + +#include +#include "protocol_datastructures.h" +#include "tab_room.h" +#include "gametypemap.h" + +class QTreeView; +class GamesModel; +class GamesProxyModel; +class QPushButton; +class QCheckBox; +class AbstractClient; +class TabRoom; + +class GameSelector : public QGroupBox { + Q_OBJECT +private slots: + void showFullGamesChanged(int state); + void actCreate(); + void actJoin(); + void checkResponse(ResponseCode response); +signals: + void gameJoined(int gameId); +private: + AbstractClient *client; + TabRoom *room; + + QTreeView *gameListView; + GamesModel *gameListModel; + GamesProxyModel *gameListProxyModel; + QPushButton *createButton, *joinButton, *spectateButton; + QCheckBox *showFullGamesCheckBox; +public: + GameSelector(AbstractClient *_client, TabRoom *_room, const QMap &_rooms, const QMap &_gameTypes, QWidget *parent = 0); + void retranslateUi(); + void processGameInfo(ServerInfo_Game *info); +}; + +#endif \ No newline at end of file diff --git a/cockatrice/src/gametypemap.h b/cockatrice/src/gametypemap.h new file mode 100644 index 00000000..fce16175 --- /dev/null +++ b/cockatrice/src/gametypemap.h @@ -0,0 +1,8 @@ +#ifndef GAMETYPEMAP_H +#define GAMETYPEMAP_H + +#include + +typedef QMap GameTypeMap; + +#endif \ No newline at end of file diff --git a/sounds/cuckoo.raw b/sounds/cuckoo.raw new file mode 100644 index 0000000000000000000000000000000000000000..52f0cbb60b4d0a924d31b6e985777779021ac760 GIT binary patch literal 43296 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 BTwDME literal 0 HcmV?d00001 From 898623f1ba8b87b7e38495bd2e46efef59c7279a Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sun, 3 Jul 2011 16:45:52 +0200 Subject: [PATCH 17/26] filter running games; minor server code cleanup --- cockatrice/src/gameselector.cpp | 24 ++++++++-- cockatrice/src/gameselector.h | 3 +- cockatrice/src/gamesmodel.cpp | 15 ++++-- cockatrice/src/gamesmodel.h | 2 + cockatrice/translations/cockatrice_cs.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_de.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_en.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_es.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_fr.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_ja.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_pl.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_pt-br.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_pt.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_ru.ts | 51 +++++++++++---------- cockatrice/translations/cockatrice_sk.ts | 51 +++++++++++---------- common/protocol_datastructures.cpp | 3 +- common/protocol_datastructures.h | 3 +- common/server_card.cpp | 4 +- common/server_card.h | 2 +- common/server_cardzone.cpp | 12 ++--- common/server_cardzone.h | 2 +- common/server_game.cpp | 5 +- common/server_player.cpp | 6 +-- common/server_protocolhandler.cpp | 16 +++---- 24 files changed, 369 insertions(+), 289 deletions(-) diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp index 9ca8a7e3..9c165d26 100644 --- a/cockatrice/src/gameselector.cpp +++ b/cockatrice/src/gameselector.cpp @@ -27,23 +27,34 @@ GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, const QMapheader()->setResizeMode(1, QHeaderView::ResizeToContents); showFullGamesCheckBox = new QCheckBox; + showRunningGamesCheckBox = new QCheckBox; + + QVBoxLayout *filterLayout = new QVBoxLayout; + filterLayout->addWidget(showFullGamesCheckBox); + filterLayout->addWidget(showRunningGamesCheckBox); + if (room) createButton = new QPushButton; else createButton = 0; joinButton = new QPushButton; spectateButton = new QPushButton; + QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addWidget(showFullGamesCheckBox); - buttonLayout->addStretch(); if (room) buttonLayout->addWidget(createButton); buttonLayout->addWidget(joinButton); buttonLayout->addWidget(spectateButton); + buttonLayout->setAlignment(Qt::AlignTop); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->addLayout(filterLayout); + hbox->addStretch(); + hbox->addLayout(buttonLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(gameListView); - mainLayout->addLayout(buttonLayout); + mainLayout->addLayout(hbox); retranslateUi(); setLayout(mainLayout); @@ -52,6 +63,7 @@ GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, const QMapsetFullGamesVisible(state); } +void GameSelector::showRunningGamesChanged(int state) +{ + gameListProxyModel->setRunningGamesVisible(state); +} + void GameSelector::actCreate() { DlgCreateGame dlg(client, room->getRoomId(), room->getGameTypes(), this); @@ -118,6 +135,7 @@ void GameSelector::retranslateUi() { setTitle(tr("Games")); showFullGamesCheckBox->setText(tr("Show &full games")); + showRunningGamesCheckBox->setText(tr("Show &running games")); if (createButton) createButton->setText(tr("C&reate")); joinButton->setText(tr("&Join")); diff --git a/cockatrice/src/gameselector.h b/cockatrice/src/gameselector.h index 4a178bc3..cf603b33 100644 --- a/cockatrice/src/gameselector.h +++ b/cockatrice/src/gameselector.h @@ -18,6 +18,7 @@ class GameSelector : public QGroupBox { Q_OBJECT private slots: void showFullGamesChanged(int state); + void showRunningGamesChanged(int state); void actCreate(); void actJoin(); void checkResponse(ResponseCode response); @@ -31,7 +32,7 @@ private: GamesModel *gameListModel; GamesProxyModel *gameListProxyModel; QPushButton *createButton, *joinButton, *spectateButton; - QCheckBox *showFullGamesCheckBox; + QCheckBox *showFullGamesCheckBox, *showRunningGamesCheckBox; public: GameSelector(AbstractClient *_client, TabRoom *_room, const QMap &_rooms, const QMap &_gameTypes, QWidget *parent = 0); void retranslateUi(); diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index 9aff702b..fc8e7d55 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -85,7 +85,7 @@ void GamesModel::updateGameList(ServerInfo_Game *_game) for (int i = 0; i < oldGameTypeList.size(); ++i) gameTypeList.append(new GameTypeId(oldGameTypeList[i]->getData())); - ServerInfo_Game *game = new ServerInfo_Game(_game->getRoomId(), _game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), gameTypeList, new ServerInfo_User(_game->getCreatorInfo()), _game->getOnlyBuddies(), _game->getOnlyRegistered(), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); + ServerInfo_Game *game = new ServerInfo_Game(_game->getRoomId(), _game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), _game->getStarted(), gameTypeList, new ServerInfo_User(_game->getCreatorInfo()), _game->getOnlyBuddies(), _game->getOnlyRegistered(), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); for (int i = 0; i < gameList.size(); i++) if (gameList[i]->getGameId() == game->getGameId()) { if (game->getPlayerCount() == 0) { @@ -118,17 +118,22 @@ void GamesProxyModel::setFullGamesVisible(bool _fullGamesVisible) invalidateFilter(); } +void GamesProxyModel::setRunningGamesVisible(bool _runningGamesVisible) +{ + runningGamesVisible = _runningGamesVisible; + invalidateFilter(); +} + bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourceParent*/) const { - if (fullGamesVisible) - return true; - GamesModel *model = qobject_cast(sourceModel()); if (!model) return false; ServerInfo_Game *game = model->getGame(sourceRow); - if (game->getPlayerCount() == game->getMaxPlayers()) + if ((game->getPlayerCount() == game->getMaxPlayers()) && !fullGamesVisible) + return false; + if (game->getStarted() && !runningGamesVisible) return false; return true; diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index 6be0d140..8461faf6 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -30,9 +30,11 @@ class GamesProxyModel : public QSortFilterProxyModel { Q_OBJECT private: bool fullGamesVisible; + bool runningGamesVisible; public: GamesProxyModel(QObject *parent = 0); void setFullGamesVisible(bool _fullGamesVisible); + void setRunningGamesVisible(bool _runningGamesVisible); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; }; diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index 0b328cc0..a5a99653 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -1203,89 +1203,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + + Show &running games + + + + C&reate - + &Join - + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 735b3c3b..c423fa68 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -1947,24 +1947,24 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GameSelector - + C&reate Spiel e&rstellen - + &Join &Teilnehmen - - - - - - - - + + + + + + + + Error Fehler @@ -1973,71 +1973,76 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic XXX - + Please join the appropriate room first. Bitte betreten Sie erst den entsprechenden Raum. - + Wrong password. Falsches Passwort. - + Spectators are not allowed in this game. In diesem Spiel sind keine Zuschauer zugelassen. - + The game is already full. Das Spiel ist bereits voll. - + The game does not exist any more. Dieses Spiel gibt es nicht mehr. - + This game is only open to registered users. Dieses Spiel kann nur von registrierten Benutzern betreten werden. - + This game is only open to its creator's buddies. Dieses Spiel kann nur von Freunden des Erstellers betreten werden. - + You are being ignored by the creator of this game. Der Ersteller dieses Spiels ignoriert Sie. - + Join game Spiel beitreten - + Password: Passwort: - + Games Spiele - + Show &full games &Volle Spiele anzeigen + + + Show &running games + &Laufende Spiele anzeigen + &Show full games &Volle Spiele anzeigen - + J&oin as spectator &Zuschauen diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 87989e2c..5693f33d 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -1203,89 +1203,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate - + &Join - - - - - - - - + + + + + + + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + + Show &running games + + + + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 877347b7..1e091cca 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -1565,93 +1565,98 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate C&rear - + &Join E&ntrar - - - - - - - - + + + + + + + + Error Error - + Please join the appropriate room first. - + Wrong password. Contraseña incorrecta. - + Spectators are not allowed in this game. No se permiten espectadores en esta partida. - + The game is already full. La partida no tiene plazas libres. - + The game does not exist any more. La partida ya no existe. - + This game is only open to registered users. Esta partida está abierta sólo a usuarios registrados. - + This game is only open to its creator's buddies. Esta partida está abierta sólo a los amigos del creador. - + You are being ignored by the creator of this game. Estas siendo ignorado por el creador de la partida. - + Join game Entrar en la partida - + Password: Contraseña: - + Games Partidas - + Show &full games Ver partidas &sin plazas libres + + + Show &running games + + &Show full games &Ver partidas sin plazas libres - + J&oin as spectator Entrar como e&spectador diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index 2df8edd4..a6c656f4 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -1415,94 +1415,99 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error Erreur - + Please join the appropriate room first. - + Wrong password. Mot de passe erroné. - + Spectators are not allowed in this game. Les spectateurs ne sont pas autorisés dans cette partie. - + The game is already full. Cette partie est déjà pleine. - + The game does not exist any more. La partie n'existe plus. - + This game is only open to registered users. Cette partie n'est accessible qu'aux joueurs enregistrés. - + This game is only open to its creator's buddies. Cette partie n'est accessible qu'aux amis. - + You are being ignored by the creator of this game. Vous avez été ignoré par le créateur de la partie. - + Join game Rejoindre partie - + Password: Mot de passe: - + Games Parties - + Show &full games Montrer &toutes les parties + + + Show &running games + + &Show full games toutes ou complèetes? &Montrer toutes les parties - + C&reate C&réer - + &Join Re&joindre - + J&oin as spectator Rej&oindre en tant que spectateur diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index c9f0a6e9..6d4c3aa9 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -1251,93 +1251,98 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate 部屋を作る - + &Join 参加する - - - - - - - - + + + + + + + + Error エラー - + Please join the appropriate room first. - + Wrong password. パスワードが間違っています. - + Spectators are not allowed in this game. この試合は観戦者は許可されていません. - + The game is already full. このゲームはすでに満員です. - + The game does not exist any more. このゲームはもう存在しません. - + This game is only open to registered users. このゲームは登録済みプレイヤーにのみ公開されています. - + This game is only open to its creator's buddies. このゲームは作成者のフレンドのみに公開されています. - + You are being ignored by the creator of this game. あなたはこのゲームの作成者によって拒否されています. - + Join game 参加 - + Password: パスワード: - + Games ゲーム - + Show &full games 全てのゲームを見る + + + Show &running games + + &Show full games 全てのゲームを見る - + J&oin as spectator 観戦者として参加 diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 492dbed2..3ba27c1e 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -1203,89 +1203,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + + Show &running games + + + + C&reate - + &Join - + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index 0404d46d..4f370793 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -1419,93 +1419,98 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate &Criar - + &Join &Entrar - - - - - - - - + + + + + + + + Error Erro - + Please join the appropriate room first. - + Wrong password. Senha incorreta. - + Spectators are not allowed in this game. Não são permitidos visitantes neste jogo. - + The game is already full. O jogo está cheio. - + The game does not exist any more. O jogo não existe mais. - + This game is only open to registered users. Este jogo é aberto apenas para usuários registrados. - + This game is only open to its creator's buddies. Este jogo é aberto apenas para os amigos de quem criou o jogo. - + You are being ignored by the creator of this game. Você está sendo ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Senha: - + Games Jogos - + Show &full games &Mostrar os jogos cheios + + + Show &running games + + &Show full games &Mostrar os jogos cheios - + J&oin as spectator E&ntrar como visitante diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index 351b8b98..a985f0b9 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -1419,93 +1419,98 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error Erro - + Please join the appropriate room first. - + Wrong password. Password incorrecta. - + Spectators are not allowed in this game. Não são permitidos espectadores neste jogo. - + The game is already full. O jogo já se encontra cheio. - + The game does not exist any more. O jogo já não existe. - + This game is only open to registered users. Este jogo só está aberto a utilizadores registados. - + This game is only open to its creator's buddies. Este jogo só está aberto aos amigos do seu criador. - + You are being ignored by the creator of this game. Você está a ser ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Password: - + Games Jogos - + Show &full games &Mostrar jogos cheios + + + Show &running games + + &Show full games &Mostrar jogos cheios - + C&reate &Criar - + &Join &Entrar - + J&oin as spectator Entrar como &espectador diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index 8f875c2a..ff02c2a1 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -1358,89 +1358,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error Ошибка - + Please join the appropriate room first. - + Wrong password. Неверный пароль. - + Spectators are not allowed in this game. В эту игру не пускают зрителей. - + The game is already full. Все места заняты! =Ь - + The game does not exist any more. Эта игра была удалена. - + This game is only open to registered users. Доступно только для зарегистрированных. - + This game is only open to its creator's buddies. Доступно только для друзей. - + You are being ignored by the creator of this game. Вы добавлены в игнор-лист данного игрока. - + Join game Присоединиться - + Password: Пароль: - + Games Игры - + Show &full games Показывать &текущие - + + Show &running games + + + + C&reate С&оздать - + &Join &Присоединиться - + J&oin as spectator П&рисоединиться как зритель diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index dddb7465..1a1beeac 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -1203,89 +1203,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - - - - - - - + + + + + + + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + + Show &running games + + + + C&reate - + &Join - + J&oin as spectator diff --git a/common/protocol_datastructures.cpp b/common/protocol_datastructures.cpp index 3e4564c8..7d68434a 100644 --- a/common/protocol_datastructures.cpp +++ b/common/protocol_datastructures.cpp @@ -40,7 +40,7 @@ ServerInfo_UserList::ServerInfo_UserList(const QString &_itemType, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) +ServerInfo_Game::ServerInfo_Game(int _roomId, int _gameId, const QString &_description, bool _hasPassword, int _playerCount, int _maxPlayers, bool _started, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _onlyBuddies, bool _onlyRegistered, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) : SerializableItem_Map("game") { insertItem(new SerializableItem_Int("room_id", _roomId)); @@ -49,6 +49,7 @@ ServerInfo_Game::ServerInfo_Game(int _roomId, int _gameId, const QString &_descr insertItem(new SerializableItem_Bool("has_password", _hasPassword)); insertItem(new SerializableItem_Int("player_count", _playerCount)); insertItem(new SerializableItem_Int("max_players", _maxPlayers)); + insertItem(new SerializableItem_Bool("started", _started)); if (!_creatorInfo) _creatorInfo = new ServerInfo_User; insertItem(_creatorInfo); diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h index 6ad7cd09..a3843a3d 100644 --- a/common/protocol_datastructures.h +++ b/common/protocol_datastructures.h @@ -69,7 +69,7 @@ public: class ServerInfo_Game : public SerializableItem_Map { public: - ServerInfo_Game(int _roomId = -1, int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); + ServerInfo_Game(int _roomId = -1, int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, bool _started = false, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _onlyBuddies = false, bool _onlyRegistered = false, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); static SerializableItem *newItem() { return new ServerInfo_Game; } int getRoomId() const { return static_cast(itemMap.value("room_id"))->getData(); } int getGameId() const { return static_cast(itemMap.value("game_id"))->getData(); } @@ -77,6 +77,7 @@ public: bool getHasPassword() const { return static_cast(itemMap.value("has_password"))->getData(); } int getPlayerCount() const { return static_cast(itemMap.value("player_count"))->getData(); } int getMaxPlayers() const { return static_cast(itemMap.value("max_players"))->getData(); } + bool getStarted() const { return static_cast(itemMap.value("started"))->getData(); } QList getGameTypes() const { return typecastItemList(); } ServerInfo_User *getCreatorInfo() const { return static_cast(itemMap.value("user")); } bool getOnlyBuddies() const { return static_cast(itemMap.value("only_buddies"))->getData(); } diff --git a/common/server_card.cpp b/common/server_card.cpp index 3d34ac53..6cafdd90 100644 --- a/common/server_card.cpp +++ b/common/server_card.cpp @@ -19,8 +19,8 @@ ***************************************************************************/ #include "server_card.h" -Server_Card::Server_Card(QString _name, int _id, int _coord_x, int _coord_y) - : id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), tapped(false), attacking(false), facedown(false), color(QString()), power(-1), toughness(-1), annotation(QString()), destroyOnZoneChange(false), doesntUntap(false), parentCard(0) +Server_Card::Server_Card(QString _name, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone) + : zone(_zone), id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), tapped(false), attacking(false), facedown(false), color(QString()), power(-1), toughness(-1), annotation(QString()), destroyOnZoneChange(false), doesntUntap(false), parentCard(0) { } diff --git a/common/server_card.h b/common/server_card.h index de84d21c..a908befa 100644 --- a/common/server_card.h +++ b/common/server_card.h @@ -46,7 +46,7 @@ private: Server_Card *parentCard; QList attachedCards; public: - Server_Card(QString _name, int _id, int _coord_x, int _coord_y); + Server_Card(QString _name, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone = 0); ~Server_Card(); Server_CardZone *getZone() const { return zone; } diff --git a/common/server_cardzone.cpp b/common/server_cardzone.cpp index 8738afab..dd1db3ee 100644 --- a/common/server_cardzone.cpp +++ b/common/server_cardzone.cpp @@ -52,10 +52,12 @@ int Server_CardZone::removeCard(Server_Card *card) int index = cards.indexOf(card); cards.removeAt(index); + card->setZone(0); + return index; } -Server_Card *Server_CardZone::getCard(int id, bool remove, int *position) +Server_Card *Server_CardZone::getCard(int id, int *position) { QMutexLocker locker(&player->getGame()->gameMutex); @@ -65,10 +67,6 @@ Server_Card *Server_CardZone::getCard(int id, bool remove, int *position) while (CardIterator.hasNext()) { Server_Card *tmp = CardIterator.next(); if (tmp->getId() == id) { - if (remove) { - cards.removeAt(i); - tmp->setZone(0); - } if (position) *position = i; return tmp; @@ -80,10 +78,6 @@ Server_Card *Server_CardZone::getCard(int id, bool remove, int *position) if ((id >= cards.size()) || (id < 0)) return NULL; Server_Card *tmp = cards[id]; - if (remove) { - cards.removeAt(id); - tmp->setZone(0); - } if (position) *position = id; return tmp; diff --git a/common/server_cardzone.h b/common/server_cardzone.h index 62a129a1..898e89c7 100644 --- a/common/server_cardzone.h +++ b/common/server_cardzone.h @@ -41,7 +41,7 @@ public: ~Server_CardZone(); int removeCard(Server_Card *card); - Server_Card *getCard(int id, bool remove, int *position = NULL); + Server_Card *getCard(int id, int *position = NULL); int getCardsBeingLookedAt() const { return cardsBeingLookedAt; } void setCardsBeingLookedAt(int _cardsBeingLookedAt) { cardsBeingLookedAt = _cardsBeingLookedAt; } diff --git a/common/server_game.cpp b/common/server_game.cpp index bc14c7e9..5838e3f9 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -160,6 +160,8 @@ void Server_Game::doStartGameIfReady() */ activePlayer = -1; nextTurn(); + + room->broadcastGameListUpdate(this); } void Server_Game::startGameIfReady() @@ -490,7 +492,7 @@ ServerInfo_Game *Server_Game::getInfo() const if (players.isEmpty()) // Game is closing - return new ServerInfo_Game(room->getId(), getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); + return new ServerInfo_Game(room->getId(), getGameId(), QString(), false, 0, getMaxPlayers(), false, QList(), 0, false, 0); else { // Game is open @@ -505,6 +507,7 @@ ServerInfo_Game *Server_Game::getInfo() const !getPassword().isEmpty(), getPlayerCount(), getMaxPlayers(), + gameStarted, gameTypeList, new ServerInfo_User(getCreatorInfo(), false), onlyBuddies, diff --git a/common/server_player.cpp b/common/server_player.cpp index e5695380..3a9899a9 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -127,7 +127,7 @@ void Server_Player::setupZones() if (!currentCard) continue; for (int k = 0; k < currentCard->getNumber(); ++k) - z->cards.append(new Server_Card(currentCard->getName(), nextCardId++, 0, 0)); + z->cards.append(new Server_Card(currentCard->getName(), nextCardId++, 0, 0, z)); } } @@ -334,7 +334,7 @@ ResponseCode Server_Player::moveCard(CommandContainer *cont, Server_CardZone *st QMap cardProperties; for (int i = 0; i < _cards.size(); ++i) { int position; - Server_Card *card = startzone->getCard(_cards[i]->getCardId(), false, &position); + Server_Card *card = startzone->getCard(_cards[i]->getCardId(), &position); if (!card) return RespNameNotFound; if (!card->getAttachedCards().isEmpty() && !targetzone->isColumnEmpty(x, y)) @@ -510,7 +510,7 @@ ResponseCode Server_Player::setCardAttrHelper(CommandContainer *cont, const QStr return RespInvalidCommand; } } else { - Server_Card *card = zone->getCard(cardId, false); + Server_Card *card = zone->getCard(cardId); if (!card) return RespNameNotFound; result = card->setAttribute(attrName, attrValue, false); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 974869e7..2db83126 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -768,7 +768,7 @@ ResponseCode Server_ProtocolHandler::cmdFlipCard(Command_FlipCard *cmd, CommandC if (!zone->hasCoords()) return RespContextError; - Server_Card *card = zone->getCard(cmd->getCardId(), false); + Server_Card *card = zone->getCard(cmd->getCardId()); if (!card) return RespNameNotFound; @@ -797,7 +797,7 @@ ResponseCode Server_ProtocolHandler::cmdAttachCard(Command_AttachCard *cmd, Comm if (!startzone) return RespNameNotFound; - Server_Card *card = startzone->getCard(cmd->getCardId(), false); + Server_Card *card = startzone->getCard(cmd->getCardId()); if (!card) return RespNameNotFound; @@ -819,7 +819,7 @@ ResponseCode Server_ProtocolHandler::cmdAttachCard(Command_AttachCard *cmd, Comm // Possibly a flag will have to be introduced for this sometime. if (!targetzone->hasCoords()) return RespContextError; - targetCard = targetzone->getCard(cmd->getTargetCardId(), false); + targetCard = targetzone->getCard(cmd->getTargetCardId()); if (targetCard) if (targetCard->getParentCard()) return RespContextError; @@ -929,14 +929,14 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co return RespNameNotFound; if (startZone->getType() != PublicZone) return RespContextError; - Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false); + Server_Card *startCard = startZone->getCard(cmd->getStartCardId()); if (!startCard) return RespNameNotFound; Server_Card *targetCard = 0; if (!playerTarget) { if (targetZone->getType() != PublicZone) return RespContextError; - targetCard = targetZone->getCard(cmd->getTargetCardId(), false); + targetCard = targetZone->getCard(cmd->getTargetCardId()); } Server_ArrowTarget *targetItem; @@ -1015,7 +1015,7 @@ ResponseCode Server_ProtocolHandler::cmdSetCardCounter(Command_SetCardCounter *c if (!zone->hasCoords()) return RespContextError; - Server_Card *card = zone->getCard(cmd->getCardId(), false); + Server_Card *card = zone->getCard(cmd->getCardId()); if (!card) return RespNameNotFound; @@ -1042,7 +1042,7 @@ ResponseCode Server_ProtocolHandler::cmdIncCardCounter(Command_IncCardCounter *c if (!zone->hasCoords()) return RespContextError; - Server_Card *card = zone->getCard(cmd->getCardId(), false); + Server_Card *card = zone->getCard(cmd->getCardId()); if (!card) return RespNameNotFound; @@ -1255,7 +1255,7 @@ ResponseCode Server_ProtocolHandler::cmdRevealCards(Command_RevealCards *cmd, Co return RespContextError; cardsToReveal.append(zone->cards.at(rng->getNumber(0, zone->cards.size() - 1))); } else { - Server_Card *card = zone->getCard(cmd->getCardId(), false); + Server_Card *card = zone->getCard(cmd->getCardId()); if (!card) return RespNameNotFound; cardsToReveal.append(card); From fd171fa260359aeff2f59fb37d9dbd3a6d0e4ef6 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sun, 3 Jul 2011 17:10:24 +0200 Subject: [PATCH 18/26] servatrice Qt 4.4 compile fix --- common/server_protocolhandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 2db83126..9c752e8a 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -347,7 +347,7 @@ ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(Command_GetGamesOfUser *c Server_Room *room = roomIterator.next().value(); room->roomMutex.lock(); roomList.append(room->getInfo(false, true)); - gameList.append(room->getGamesOfUser(cmd->getUserName())); + gameList << room->getGamesOfUser(cmd->getUserName()); room->roomMutex.unlock(); } server->serverMutex.unlock(); From 83e2e3666a296ec3766fd92980fae4a74edecb89 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 4 Jul 2011 17:14:48 +0200 Subject: [PATCH 19/26] server memory leak fixed --- common/server_protocolhandler.cpp | 1 + servatrice/src/main.cpp | 5 +++-- servatrice/src/servatrice.cpp | 11 +++++++---- servatrice/src/serversocketinterface.cpp | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 9c752e8a..5e4ba775 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -405,6 +405,7 @@ ResponseCode Server_ProtocolHandler::cmdJoinRoom(Command_JoinRoom *cmd, CommandC if (!r) return RespNameNotFound; + QMutexLocker serverLocker(&server->serverMutex); QMutexLocker roomLocker(&r->roomMutex); r->addClient(this); rooms.insert(r->getId(), r); diff --git a/servatrice/src/main.cpp b/servatrice/src/main.cpp index 6c16c965..247111be 100644 --- a/servatrice/src/main.cpp +++ b/servatrice/src/main.cpp @@ -129,8 +129,8 @@ int main(int argc, char *argv[]) if (testRandom) testRNG(); - Servatrice server(settings); - QObject::connect(&server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection); + Servatrice *server = new Servatrice(settings); + QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()), Qt::QueuedConnection); std::cerr << "-------------------------" << std::endl; std::cerr << "Server initialized." << std::endl; @@ -142,6 +142,7 @@ int main(int argc, char *argv[]) delete rng; delete settings; + delete loggerThread; return retval; } diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 1bb126e5..a19475c1 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -66,7 +66,7 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent) } bool threaded = settings->value("server/threaded", false).toInt(); - tcpServer = new Servatrice_TcpServer(this, threaded); + tcpServer = new Servatrice_TcpServer(this, threaded, this); int port = settings->value("server/port", 4747).toInt(); qDebug() << "Starting server on port" << port; if (tcpServer->listen(QHostAddress::Any, port)) @@ -364,17 +364,20 @@ void Servatrice::updateLoginMessage() void Servatrice::statusUpdate() { - QMutexLocker locker(&dbMutex); + const int uc = getUsersCount(); // for correct mutex locking order + const int gc = getGamesCount(); + uptime += statusUpdateClock->interval() / 1000; + QMutexLocker locker(&dbMutex); checkSql(); QSqlQuery query; query.prepare("insert into " + dbPrefix + "_uptime (id_server, timest, uptime, users_count, games_count) values(:id, NOW(), :uptime, :users_count, :games_count)"); query.bindValue(":id", serverId); query.bindValue(":uptime", uptime); - query.bindValue(":users_count", getUsersCount()); - query.bindValue(":games_count", getGamesCount()); + query.bindValue(":users_count", uc); + query.bindValue(":games_count", gc); execSqlQuery(query); } diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 895fcee2..1e83693e 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -69,6 +69,7 @@ ServerSocketInterface::~ServerSocketInterface() delete xmlReader; delete socket; socket = 0; + delete topLevelItem; } void ServerSocketInterface::processProtocolItem(ProtocolItem *item) From c4a2229ae4511ef54d088573d84fa381271f52f9 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 5 Jul 2011 01:49:15 +0200 Subject: [PATCH 20/26] added debug stuff --- common/server.cpp | 4 +++- common/server_protocolhandler.cpp | 1 + servatrice/src/servatrice.cpp | 2 +- servatrice/src/serversocketinterface.cpp | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/server.cpp b/common/server.cpp index 07f7c7cf..70451018 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -74,6 +74,7 @@ AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString session->setUserInfo(data); users.insert(name, session); + qDebug() << "Server::loginUser: name=" << name; Event_UserJoined *event = new Event_UserJoined(new ServerInfo_User(data, false)); for (int i = 0; i < clients.size(); ++i) @@ -103,8 +104,9 @@ void Server::removeClient(Server_ProtocolHandler *client) delete event; users.remove(data->getName()); + qDebug() << "Server::removeClient: name=" << data->getName(); } - qDebug() << "Server::removeClient: " << clients.size() << "clients; " << users.size() << "users left"; + qDebug() << "Server::removeClient:" << clients.size() << "clients; " << users.size() << "users left"; } void Server::broadcastRoomUpdate() diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 9c752e8a..58d02740 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -321,6 +321,7 @@ ResponseCode Server_ProtocolHandler::cmdMessage(Command_Message *cmd, CommandCon QString receiver = cmd->getUserName(); Server_ProtocolHandler *userHandler = server->getUsers().value(receiver); + qDebug() << "cmdMessage: recv=" << receiver << (userHandler == 0 ? "not found" : "found"); if (!userHandler) return RespNameNotFound; if (userHandler->getIgnoreList().contains(userInfo->getName())) diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 1bb126e5..e5f7afa6 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -186,7 +186,7 @@ AuthenticationResult Servatrice::checkUserPassword(Server_ProtocolHandler *handl checkSql(); QSqlQuery query; - query.prepare("select a.password, timediff(now(), date_add(b.time_from, interval b.minutes minute)) < 0, b.minutes <=> 0 from " + dbPrefix + "_users a left join " + dbPrefix + "_bans b on b.id_user = a.id and b.time_from = (select max(c.time_from) from " + dbPrefix + "_bans c where c.id_user = a.id) where a.name = :name and a.active = 1"); + query.prepare("select a.password, time_to_sec(timediff(now(), date_add(b.time_from, interval b.minutes minute))) < 0, b.minutes <=> 0 from " + dbPrefix + "_users a left join " + dbPrefix + "_bans b on b.id_user = a.id and b.time_from = (select max(c.time_from) from " + dbPrefix + "_bans c where c.id_user = a.id) where a.name = :name and a.active = 1"); query.bindValue(":name", user); if (!execSqlQuery(query)) return PasswordWrong; diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 895fcee2..4fe5bb3a 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -494,7 +494,7 @@ ResponseCode ServerSocketInterface::cmdBanFromServer(Command_BanFromServer *cmd, query.bindValue(":id_user", getUserIdInDB(userName)); query.bindValue(":id_admin", getUserIdInDB(userInfo->getName())); query.bindValue(":minutes", minutes); - query.bindValue(":reason", cmd->getReason()); + query.bindValue(":reason", cmd->getReason() + "\n"); servatrice->execSqlQuery(query); } else { // Unregistered users must be banned by IP address. From ef42c7518a13f9b17a6ebda43925078d53357a1b Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 5 Jul 2011 12:44:39 +0200 Subject: [PATCH 21/26] added argentina to countries --- cockatrice/cockatrice.qrc | 1 + cockatrice/resources/countries/ar.svg | 109 ++++++++++++++++++++++++++ cockatrice/src/localserver.h | 1 + common/server.h | 1 + servatrice/src/servatrice.cpp | 2 +- servatrice/src/servatrice.h | 2 + 6 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 cockatrice/resources/countries/ar.svg diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc index 55356130..3a75a53d 100644 --- a/cockatrice/cockatrice.qrc +++ b/cockatrice/cockatrice.qrc @@ -55,6 +55,7 @@ translations/cockatrice_pl.qm translations/cockatrice_sk.qm + resources/countries/ar.svg resources/countries/at.svg resources/countries/au.svg resources/countries/be.svg diff --git a/cockatrice/resources/countries/ar.svg b/cockatrice/resources/countries/ar.svg new file mode 100644 index 00000000..543196fc --- /dev/null +++ b/cockatrice/resources/countries/ar.svg @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/cockatrice/src/localserver.h b/cockatrice/src/localserver.h index 406b3bff..cf24b438 100644 --- a/cockatrice/src/localserver.h +++ b/cockatrice/src/localserver.h @@ -16,6 +16,7 @@ public: bool getGameShouldPing() const { return false; } int getMaxGameInactivityTime() const { return 9999999; } int getMaxPlayerInactivityTime() const { return 9999999; } + bool getThreaded() const { return false; } LocalServerInterface *newConnection(); protected: diff --git a/common/server.h b/common/server.h index d2f15e76..de8dd2a5 100644 --- a/common/server.h +++ b/common/server.h @@ -40,6 +40,7 @@ public: virtual int getMaxMessageCountPerInterval() const { return 0; } virtual int getMaxMessageSizePerInterval() const { return 0; } virtual int getMaxGamesPerUser() const { return 0; } + virtual bool getThreaded() const = 0; virtual QMap getBuddyList(const QString &name) = 0; virtual QMap getIgnoreList(const QString &name) = 0; diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index a19475c1..48134b5f 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -65,7 +65,7 @@ Servatrice::Servatrice(QSettings *_settings, QObject *parent) statusUpdateClock->start(statusUpdateTime); } - bool threaded = settings->value("server/threaded", false).toInt(); + threaded = settings->value("server/threaded", false).toInt(); tcpServer = new Servatrice_TcpServer(this, threaded, this); int port = settings->value("server/port", 4747).toInt(); qDebug() << "Starting server on port" << port; diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 5a2fb1b8..8dae2c91 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -68,6 +68,7 @@ public: int getMaxMessageCountPerInterval() const { return maxMessageCountPerInterval; } int getMaxMessageSizePerInterval() const { return maxMessageSizePerInterval; } int getMaxGamesPerUser() const { return maxGamesPerUser; } + bool getThreaded() const { return threaded; } QString getDbPrefix() const { return dbPrefix; } void updateLoginMessage(); ServerInfo_User *getUserData(const QString &name); @@ -86,6 +87,7 @@ private: QString dbPrefix; QSettings *settings; int serverId; + bool threaded; int uptime; QList > addressBanList; int maxGameInactivityTime, maxPlayerInactivityTime; From add47315d52b78af40f39199c64d5ed1586f3c44 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 5 Jul 2011 21:02:24 +0200 Subject: [PATCH 22/26] added drawArrow context menu item --- cockatrice/src/carditem.cpp | 56 ++++--- cockatrice/src/carditem.h | 5 +- cockatrice/translations/cockatrice_cs.ts | 157 ++++++++++---------- cockatrice/translations/cockatrice_de.ts | 119 ++++++++------- cockatrice/translations/cockatrice_en.ts | 157 ++++++++++---------- cockatrice/translations/cockatrice_es.ts | 119 ++++++++------- cockatrice/translations/cockatrice_fr.ts | 119 ++++++++------- cockatrice/translations/cockatrice_ja.ts | 119 ++++++++------- cockatrice/translations/cockatrice_pl.ts | 157 ++++++++++---------- cockatrice/translations/cockatrice_pt-br.ts | 119 ++++++++------- cockatrice/translations/cockatrice_pt.ts | 119 ++++++++------- cockatrice/translations/cockatrice_ru.ts | 119 ++++++++------- cockatrice/translations/cockatrice_sk.ts | 157 ++++++++++---------- 13 files changed, 799 insertions(+), 723 deletions(-) diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 86194390..afc15e8c 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -34,6 +34,8 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _reve connect(aAttach, SIGNAL(triggered()), this, SLOT(actAttach())); aUnattach = new QAction(this); connect(aUnattach, SIGNAL(triggered()), this, SLOT(actUnattach())); + aDrawArrow = new QAction(this); + connect(aDrawArrow, SIGNAL(triggered()), this, SLOT(actDrawArrow())); aIncP = new QAction(this); connect(aIncP, SIGNAL(triggered()), this, SLOT(actIncP())); aDecP = new QAction(this); @@ -172,6 +174,7 @@ void CardItem::updateCardMenu() cardMenu->addAction(aAttach); if (attachedTo) cardMenu->addAction(aUnattach); + cardMenu->addAction(aDrawArrow); cardMenu->addSeparator(); cardMenu->addMenu(ptMenu); cardMenu->addAction(aSetAnnotation); @@ -186,6 +189,9 @@ void CardItem::updateCardMenu() cardMenu->addAction(aSetCounter[i]); } cardMenu->addSeparator(); + } else if (zone->getName() == "stack") { + cardMenu->addAction(aDrawArrow); + cardMenu->addMenu(moveMenu); } else { cardMenu->addAction(aPlay); cardMenu->addMenu(moveMenu); @@ -209,6 +215,7 @@ void CardItem::retranslateUi() aAttach->setText(tr("&Attach to card...")); aAttach->setShortcut(tr("Ctrl+A")); aUnattach->setText(tr("Unattac&h")); + aDrawArrow->setText(tr("&Draw arrow...")); ptMenu->setTitle(tr("&Power / toughness")); aIncP->setText(tr("&Increase power")); aIncP->setShortcut(tr("Ctrl++")); @@ -399,13 +406,35 @@ void CardItem::deleteDragItem() dragItem = NULL; } +void CardItem::drawArrow(const QColor &arrowColor) +{ + if (static_cast(owner->parent())->getSpectator()) + return; + + Player *arrowOwner = static_cast(owner->parent())->getActiveLocalPlayer(); + ArrowDragItem *arrow = new ArrowDragItem(arrowOwner, this, arrowColor); + scene()->addItem(arrow); + arrow->grabMouse(); + + QListIterator itemIterator(scene()->selectedItems()); + while (itemIterator.hasNext()) { + CardItem *c = qgraphicsitem_cast(itemIterator.next()); + if (!c || (c == this)) + continue; + if (c->getZone() != zone) + continue; + + ArrowDragItem *childArrow = new ArrowDragItem(arrowOwner, c, arrowColor); + scene()->addItem(childArrow); + arrow->addChildArrow(childArrow); + } +} + void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (event->buttons().testFlag(Qt::RightButton)) { if ((event->screenPos() - event->buttonDownScreenPos(Qt::RightButton)).manhattanLength() < 2 * QApplication::startDragDistance()) return; - if (static_cast(owner->parent())->getSpectator()) - return; QColor arrowColor = Qt::red; if (event->modifiers().testFlag(Qt::ControlModifier)) @@ -415,23 +444,7 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) else if (event->modifiers().testFlag(Qt::ShiftModifier)) arrowColor = Qt::green; - Player *arrowOwner = static_cast(owner->parent())->getActiveLocalPlayer(); - ArrowDragItem *arrow = new ArrowDragItem(arrowOwner, this, arrowColor); - scene()->addItem(arrow); - arrow->grabMouse(); - - QListIterator itemIterator(scene()->selectedItems()); - while (itemIterator.hasNext()) { - CardItem *c = qgraphicsitem_cast(itemIterator.next()); - if (!c || (c == this)) - continue; - if (c->getZone() != zone) - continue; - - ArrowDragItem *childArrow = new ArrowDragItem(arrowOwner, c, arrowColor); - scene()->addItem(childArrow); - arrow->addChildArrow(childArrow); - } + drawArrow(arrowColor); } else if (event->buttons().testFlag(Qt::LeftButton)) { if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance()) return; @@ -547,6 +560,11 @@ void CardItem::actUnattach() owner->actUnattach(static_cast(sender())); } +void CardItem::actDrawArrow() +{ + drawArrow(Qt::red); +} + void CardItem::actIncP() { owner->actIncPT(1, 0); diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index 88b19d6f..6c02a4bb 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -9,6 +9,7 @@ class CardZone; class ServerInfo_Card; class Player; class QAction; +class QColor; const int MAX_COUNTERS_ON_CARD = 999; @@ -33,17 +34,19 @@ private: QList aAddCounter, aSetCounter, aRemoveCounter; QAction *aPlay, *aHide, - *aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aSetPT, *aIncP, *aDecP, *aIncT, *aDecT, *aIncPT, *aDecPT, *aSetAnnotation, *aFlip, *aClone, + *aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aDrawArrow, *aSetPT, *aIncP, *aDecP, *aIncT, *aDecT, *aIncPT, *aDecPT, *aSetAnnotation, *aFlip, *aClone, *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile; QMenu *cardMenu, *ptMenu, *moveMenu; void playCard(bool faceDown); + void drawArrow(const QColor &arrowColor); void prepareDelete(); private slots: void cardMenuAction(); void actCardCounterTrigger(); void actAttach(); void actUnattach(); + void actDrawArrow(); void actSetPT(); void actIncP(); void actDecP(); diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index a5a99653..9a24bb02 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -230,197 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - - - &Power / toughness - - - - - &Increase power - - - - - Ctrl++ - - - &Decrease power + &Draw arrow... - Ctrl+- + &Power / toughness - I&ncrease toughness + &Increase power - Alt++ + Ctrl++ - D&ecrease toughness + &Decrease power - Alt+- + Ctrl+- - In&crease power and toughness + I&ncrease toughness - Ctrl+Alt++ + Alt++ - Dec&rease power and toughness + D&ecrease toughness - Ctrl+Alt+- + Alt+- - Set &power and toughness... + In&crease power and toughness - Ctrl+P + Ctrl+Alt++ - &Set annotation... + Dec&rease power and toughness + + + + + Ctrl+Alt+- - red + Set &power and toughness... - yellow + Ctrl+P - green + &Set annotation... - &Add counter (%1) + red + + + + + yellow - &Remove counter (%1) + green - &Set counters (%1)... - - - - - &top of library + &Add counter (%1) - &bottom of library - - - - - &graveyard + &Remove counter (%1) - Ctrl+Del + &Set counters (%1)... - &exile + &top of library + + + + + &bottom of library + &graveyard + + + + + Ctrl+Del + + + + + &exile + + + + &Move to @@ -1203,94 +1208,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index c423fa68..0b07c46f 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -279,57 +279,57 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic CardItem - + &Play &Ausspielen - + &Hide &Verstecken - + &Tap &Tappen - + &Untap E&nttappen - + Toggle &normal untapping N&ormales Enttappen umschalten - + &Flip &Umdrehen - + &Clone &Kopieren - + Ctrl+H Ctrl+H - + &Attach to card... &An Karte anlegen... - + Ctrl+A Ctrl+A - + Unattac&h &Von Karte lösen @@ -338,142 +338,147 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Kampfwerte setzen... - + + &Draw arrow... + &Pfeil zeichnen... + + + &Power / toughness &Kampfwerte - + &Increase power &Stärke erhöhen - + Ctrl++ Ctrl++ - + &Decrease power S&tärke senken - + Ctrl+- Ctrl+- - + I&ncrease toughness &Widerstandskraft erhöhen - + Alt++ Alt++ - + D&ecrease toughness W&iderstandskraft senken - + Alt+- Alt+- - + In&crease power and toughness Stärke und Widerstandskraft &erhöhen - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Stärke und Widerstandskraft s&enken - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... &Kampfwerte setzen... - + Ctrl+P Ctrl+P - + &Set annotation... &Hinweis setzen... - + red rot - + yellow gelb - + green grün - + &Add counter (%1) Zählmarke &hinzufügen (%1) - + &Remove counter (%1) Zählmarke &entfernen (%1) - + &Set counters (%1)... Zählmarken &setzen (%1)... - + &top of library &auf die Bibliothek - + &bottom of library &unter die Bibliothek - + &graveyard in den &Friedhof - + Ctrl+Del Ctrl+Del - + &exile ins &Exil - + &Move to &Verschieben @@ -1947,24 +1952,24 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GameSelector - + C&reate Spiel e&rstellen - + &Join &Teilnehmen - - + + Error Fehler @@ -1973,67 +1978,67 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic XXX - + Please join the appropriate room first. Bitte betreten Sie erst den entsprechenden Raum. - + Wrong password. Falsches Passwort. - + Spectators are not allowed in this game. In diesem Spiel sind keine Zuschauer zugelassen. - + The game is already full. Das Spiel ist bereits voll. - + The game does not exist any more. Dieses Spiel gibt es nicht mehr. - + This game is only open to registered users. Dieses Spiel kann nur von registrierten Benutzern betreten werden. - + This game is only open to its creator's buddies. Dieses Spiel kann nur von Freunden des Erstellers betreten werden. - + You are being ignored by the creator of this game. Der Ersteller dieses Spiels ignoriert Sie. - + Join game Spiel beitreten - + Password: Passwort: - + Games Spiele - + Show &full games &Volle Spiele anzeigen - + Show &running games &Laufende Spiele anzeigen @@ -2042,7 +2047,7 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Volle Spiele anzeigen - + J&oin as spectator &Zuschauen diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 5693f33d..e6cc8293 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -230,197 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - - - &Power / toughness - - - - - &Increase power - - - - - Ctrl++ - - - &Decrease power + &Draw arrow... - Ctrl+- + &Power / toughness - I&ncrease toughness + &Increase power - Alt++ + Ctrl++ - D&ecrease toughness + &Decrease power - Alt+- + Ctrl+- - In&crease power and toughness + I&ncrease toughness - Ctrl+Alt++ + Alt++ - Dec&rease power and toughness + D&ecrease toughness - Ctrl+Alt+- + Alt+- - Set &power and toughness... + In&crease power and toughness - Ctrl+P + Ctrl+Alt++ - &Set annotation... + Dec&rease power and toughness + + + + + Ctrl+Alt+- - red + Set &power and toughness... - yellow + Ctrl+P - green + &Set annotation... - &Add counter (%1) + red + + + + + yellow - &Remove counter (%1) + green - &Set counters (%1)... - - - - - &top of library + &Add counter (%1) - &bottom of library - - - - - &graveyard + &Remove counter (%1) - Ctrl+Del + &Set counters (%1)... - &exile + &top of library + + + + + &bottom of library + &graveyard + + + + + Ctrl+Del + + + + + &exile + + + + &Move to @@ -1203,94 +1208,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate - + &Join - - + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 1e091cca..100047e4 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -239,57 +239,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jugar - + &Hide &Ocultar - + &Tap &Girar - + &Untap &Enderezar - + Toggle &normal untapping Alternar enderezamiento &normal - + &Flip &Voltear - + &Clone &Clonar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar a una carta... - + Ctrl+A Ctrl+A - + Unattac&h Desane&xar @@ -298,142 +298,147 @@ This is only saved for moderators and cannot be seen by the banned person.Establecer &F/R... - + + &Draw arrow... + + + + &Power / toughness &Fuerza / resistencia - + &Increase power &Incrementar fuerza - + Ctrl++ Ctrl++ - + &Decrease power &Decrementar fuerza - + Ctrl+- Ctrl+- - + I&ncrease toughness I&ncrementar resistencia - + Alt++ Alt++ - + D&ecrease toughness D&ecrementar resistencia - + Alt+- Alt+- - + In&crease power and toughness In&crementar fuerza y resistencia - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Dec&rementar fuerza y resistencia - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Establecer &fuerza y resistencia... - + Ctrl+P Ctrl+P - + &Set annotation... E&scribir anotación... - + red rojo - + yellow amarillo - + green verde - + &Add counter (%1) &Añadir contador (%1) - + &Remove counter (%1) &Quitar contador (%1) - + &Set counters (%1)... E&stablecer contadores (%1)... - + &top of library &parte superior de la biblioteca - + &bottom of library &fondo de la biblioteca - + &graveyard &cementerio - + Ctrl+Del Ctrl+Del - + &exile &exilio - + &Move to &Mover a @@ -1565,89 +1570,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate C&rear - + &Join E&ntrar - - + + Error Error - + Please join the appropriate room first. - + Wrong password. Contraseña incorrecta. - + Spectators are not allowed in this game. No se permiten espectadores en esta partida. - + The game is already full. La partida no tiene plazas libres. - + The game does not exist any more. La partida ya no existe. - + This game is only open to registered users. Esta partida está abierta sólo a usuarios registrados. - + This game is only open to its creator's buddies. Esta partida está abierta sólo a los amigos del creador. - + You are being ignored by the creator of this game. Estas siendo ignorado por el creador de la partida. - + Join game Entrar en la partida - + Password: Contraseña: - + Games Partidas - + Show &full games Ver partidas &sin plazas libres - + Show &running games @@ -1656,7 +1661,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Ver partidas sin plazas libres - + J&oin as spectator Entrar como e&spectador diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index a6c656f4..3c10129c 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -231,57 +231,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jouer - + &Hide &Cacher - + &Tap &Engager - + &Untap &Dégager - + Toggle &normal untapping Activer/ Désactiver le dégagement &normal - + &Flip &Retourner la carte - + &Clone &Copier une carte - + Ctrl+H - + &Attach to card... &Attacher à la carte... - + Ctrl+A Ctrl+A - + Unattac&h Détac&her @@ -290,142 +290,147 @@ This is only saved for moderators and cannot be seen by the banned person.Fixer &F/E... - + + &Draw arrow... + + + + &Power / toughness F&orce / Endurance - + &Increase power &Augmenter force - + Ctrl++ Ctrl++ - + &Decrease power &Diminuer force - + Ctrl+- Ctrl+- - + I&ncrease toughness A&ugmenter endurance - + Alt++ Alt++ - + D&ecrease toughness D&iminuer endurance - + Alt+- Alt+- - + In&crease power and toughness Au&gmenter la force et l'endurance - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Di&minuer la force et l'endurance - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Fi&xer la force et l'endurance... - + Ctrl+P Ctrl+P - + &Set annotation... A&jouter note... - + red rouge - + yellow jaune - + green vert - + &Add counter (%1) &Ajouter compteur (%1) - + &Remove counter (%1) &Retirer compteur (%1) - + &Set counters (%1)... &Fixer marqueurs (%1)... - + &top of library dessus de la &Bibliothèque - + &bottom of library &dessous de la bibliothèque - + &graveyard &cimetière - + Ctrl+Del Ctrl+Del - + &exile &exiler - + &Move to &Aller @@ -1415,79 +1420,79 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error Erreur - + Please join the appropriate room first. - + Wrong password. Mot de passe erroné. - + Spectators are not allowed in this game. Les spectateurs ne sont pas autorisés dans cette partie. - + The game is already full. Cette partie est déjà pleine. - + The game does not exist any more. La partie n'existe plus. - + This game is only open to registered users. Cette partie n'est accessible qu'aux joueurs enregistrés. - + This game is only open to its creator's buddies. Cette partie n'est accessible qu'aux amis. - + You are being ignored by the creator of this game. Vous avez été ignoré par le créateur de la partie. - + Join game Rejoindre partie - + Password: Mot de passe: - + Games Parties - + Show &full games Montrer &toutes les parties - + Show &running games @@ -1497,17 +1502,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Montrer toutes les parties - + C&reate C&réer - + &Join Re&joindre - + J&oin as spectator Rej&oindre en tant que spectateur diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index 6d4c3aa9..5bd20b46 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -235,58 +235,58 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play プレイ - + &Hide テスト版のため確認取れず再度チェック 裏にしてプレイ - + &Tap タップ - + &Untap アンタップ - + Toggle &normal untapping 通常のアンタップをしない - + &Flip 裏にする - + &Clone 複製する - + Ctrl+H - + &Attach to card... カードに付ける... - + Ctrl+A - + Unattac&h 取り外す @@ -295,142 +295,147 @@ This is only saved for moderators and cannot be seen by the banned person.P/Tを決める... - + + &Draw arrow... + + + + &Power / toughness パワー / タフネス - + &Increase power パワーを上げる - + Ctrl++ - + &Decrease power パワーを下げる - + Ctrl+- - + I&ncrease toughness タフネスを上げる - + Alt++ - + D&ecrease toughness タフネスを下げる - + Alt+- - + In&crease power and toughness パワーとタフネスを上げる - + Ctrl+Alt++ - + Dec&rease power and toughness パワーとタフネスを下げる - + Ctrl+Alt+- - + Set &power and toughness... パワーとタフネスを設定する... - + Ctrl+P - + &Set annotation... 注釈を付ける... - + red - + yellow - + green - + &Add counter (%1) カウンターを乗せる (%1) - + &Remove counter (%1) カウンターを取り除く (%1) - + &Set counters (%1)... カウンターの数を決める (%1)... - + &top of library ライブラリーの一番上へ - + &bottom of library ライブラリーの一番下へ - + &graveyard 墓地へ - + Ctrl+Del - + &exile 追放領域へ - + &Move to 移動させる @@ -1251,89 +1256,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate 部屋を作る - + &Join 参加する - - + + Error エラー - + Please join the appropriate room first. - + Wrong password. パスワードが間違っています. - + Spectators are not allowed in this game. この試合は観戦者は許可されていません. - + The game is already full. このゲームはすでに満員です. - + The game does not exist any more. このゲームはもう存在しません. - + This game is only open to registered users. このゲームは登録済みプレイヤーにのみ公開されています. - + This game is only open to its creator's buddies. このゲームは作成者のフレンドのみに公開されています. - + You are being ignored by the creator of this game. あなたはこのゲームの作成者によって拒否されています. - + Join game 参加 - + Password: パスワード: - + Games ゲーム - + Show &full games 全てのゲームを見る - + Show &running games @@ -1342,7 +1347,7 @@ This is only saved for moderators and cannot be seen by the banned person.全てのゲームを見る - + J&oin as spectator 観戦者として参加 diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 3ba27c1e..2994392a 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -230,197 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - - - &Power / toughness - - - - - &Increase power - - - - - Ctrl++ - - - &Decrease power + &Draw arrow... - Ctrl+- + &Power / toughness - I&ncrease toughness + &Increase power - Alt++ + Ctrl++ - D&ecrease toughness + &Decrease power - Alt+- + Ctrl+- - In&crease power and toughness + I&ncrease toughness - Ctrl+Alt++ + Alt++ - Dec&rease power and toughness + D&ecrease toughness - Ctrl+Alt+- + Alt+- - Set &power and toughness... + In&crease power and toughness - Ctrl+P + Ctrl+Alt++ - &Set annotation... + Dec&rease power and toughness + + + + + Ctrl+Alt+- - red + Set &power and toughness... - yellow + Ctrl+P - green + &Set annotation... - &Add counter (%1) + red + + + + + yellow - &Remove counter (%1) + green - &Set counters (%1)... - - - - - &top of library + &Add counter (%1) - &bottom of library - - - - - &graveyard + &Remove counter (%1) - Ctrl+Del + &Set counters (%1)... - &exile + &top of library + + + + + &bottom of library + &graveyard + + + + + Ctrl+Del + + + + + &exile + + + + &Move to @@ -1203,94 +1208,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index 4f370793..7f4c14cb 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -235,57 +235,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jogar - + &Hide &Ocultar - + &Tap &Virar - + &Untap &Desvirar - + Toggle &normal untapping &Trocar o modo de desvirar - + &Flip Virar a &face - + &Clone Clo&nar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar ao card... - + Ctrl+A Ctrl+A - + Unattac&h De&sanexar @@ -294,142 +294,147 @@ This is only saved for moderators and cannot be seen by the banned person.Alterar &P/R... - + + &Draw arrow... + + + + &Power / toughness Po&der / resistência - + &Increase power Au&mentar poder - + Ctrl++ Ctrl++ - + &Decrease power Dimi&nuir poder - + Ctrl+- Ctrl+- - + I&ncrease toughness A&umentar resistência - + Alt++ Alt++ - + D&ecrease toughness D&iminuir resistência - + Alt+- Alt+- - + In&crease power and toughness Aumen&tar poder e resistência - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Diminuir p&oder e resistência - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Alterar poder e resis&tência... - + Ctrl+P Ctrl+P - + &Set annotation... Alterar &nota... - + red vermelho - + yellow amarelo - + green verde - + &Add counter (%1) Adicionar &marcador (%1) - + &Remove counter (%1) &Remover marcador (%1) - + &Set counters (%1)... &Alterar marcadores (%1)... - + &top of library topo do &grimório - + &bottom of library &fundo do grimório - + &graveyard &cemitério - + Ctrl+Del Ctrl+Del - + &exile &exílio - + &Move to Mo&ver para @@ -1419,89 +1424,89 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate &Criar - + &Join &Entrar - - + + Error Erro - + Please join the appropriate room first. - + Wrong password. Senha incorreta. - + Spectators are not allowed in this game. Não são permitidos visitantes neste jogo. - + The game is already full. O jogo está cheio. - + The game does not exist any more. O jogo não existe mais. - + This game is only open to registered users. Este jogo é aberto apenas para usuários registrados. - + This game is only open to its creator's buddies. Este jogo é aberto apenas para os amigos de quem criou o jogo. - + You are being ignored by the creator of this game. Você está sendo ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Senha: - + Games Jogos - + Show &full games &Mostrar os jogos cheios - + Show &running games @@ -1510,7 +1515,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar os jogos cheios - + J&oin as spectator E&ntrar como visitante diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index a985f0b9..d4240541 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -235,57 +235,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jogar - + &Hide Esco&nder - + &Tap &Virar - + &Untap Desv&irar - + Toggle &normal untapping A&lterar desvirar normalmente - + &Flip Vol&tar - + &Clone Copi&ar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar a carta... - + Ctrl+A Ctrl+A - + Unattac&h De&sanexar @@ -294,142 +294,147 @@ This is only saved for moderators and cannot be seen by the banned person.Definir &P/R... - + + &Draw arrow... + + + + &Power / toughness &Poder / resistência - + &Increase power &Aumentar poder - + Ctrl++ Ctrl++ - + &Decrease power &Diminuir poder - + Ctrl+- Ctrl+- - + I&ncrease toughness A&umentar resistência - + Alt++ Alt++ - + D&ecrease toughness Di&minuir resistência - + Alt+- Alt+- - + In&crease power and toughness Aumen&tar poder e resistência - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Dimin&uir poder e resistência - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Definir &poder e resistência... - + Ctrl+P Ctrl+P - + &Set annotation... Colocar &nota... - + red vermelho - + yellow amarelo - + green verde - + &Add counter (%1) Adicionar &marcador (%1) - + &Remove counter (%1) &Remover marcador (%1) - + &Set counters (%1)... &Denifir marcadores (%1)... - + &top of library Topo do &grimório - + &bottom of library &Fundo do grimório - + &graveyard &Cemitério - + Ctrl+Del Ctrl+Del - + &exile &Exílio - + &Move to M&over para @@ -1419,79 +1424,79 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error Erro - + Please join the appropriate room first. - + Wrong password. Password incorrecta. - + Spectators are not allowed in this game. Não são permitidos espectadores neste jogo. - + The game is already full. O jogo já se encontra cheio. - + The game does not exist any more. O jogo já não existe. - + This game is only open to registered users. Este jogo só está aberto a utilizadores registados. - + This game is only open to its creator's buddies. Este jogo só está aberto aos amigos do seu criador. - + You are being ignored by the creator of this game. Você está a ser ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Password: - + Games Jogos - + Show &full games &Mostrar jogos cheios - + Show &running games @@ -1500,17 +1505,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar jogos cheios - + C&reate &Criar - + &Join &Entrar - + J&oin as spectator Entrar como &espectador diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index ff02c2a1..b467a4e0 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -231,57 +231,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Разыграть - + &Hide &Cкрыть - + &Tap &Повернуть - + &Untap &Развернуть - + Toggle &normal untapping (Не) &Разворачивать как обычно - + &Flip &Рубашкой вверх (вниз) - + &Clone &Клонировать - + Ctrl+H Ctrl+H - + &Attach to card... &Прикрепить к... - + Ctrl+A - + Unattac&h &Открепить @@ -290,142 +290,147 @@ This is only saved for moderators and cannot be seen by the banned person.Установить &Силу/Защиту... - + + &Draw arrow... + + + + &Power / toughness &Сила / защита - + &Increase power &Увеличить силу - + Ctrl++ - + &Decrease power У&меньшить силу - + Ctrl+- - + I&ncrease toughness У&величить защиту - + Alt++ - + D&ecrease toughness Уменьшить &защиту - + Alt+- - + In&crease power and toughness Увеличить силу &и защиту - + Ctrl+Alt++ - + Dec&rease power and toughness Уменьшить силу и за&щиту - + Ctrl+Alt+- - + Set &power and toughness... Уст&ановить силу / защиту... - + Ctrl+P - + &Set annotation... &Пометить... - + red Красный - + yellow Желтый - + green Зеленый - + &Add counter (%1) &Добавить жетон (%1) - + &Remove counter (%1) &Убрать жетон (%1) - + &Set counters (%1)... &Установить жетоны (%1)... - + &top of library &Наверх библиотеки - + &bottom of library &Вниз библиотеки - + &graveyard &На кладбище - + Ctrl+Del - + &exile &Изгнать - + &Move to &Переместить... @@ -1358,94 +1363,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error Ошибка - + Please join the appropriate room first. - + Wrong password. Неверный пароль. - + Spectators are not allowed in this game. В эту игру не пускают зрителей. - + The game is already full. Все места заняты! =Ь - + The game does not exist any more. Эта игра была удалена. - + This game is only open to registered users. Доступно только для зарегистрированных. - + This game is only open to its creator's buddies. Доступно только для друзей. - + You are being ignored by the creator of this game. Вы добавлены в игнор-лист данного игрока. - + Join game Присоединиться - + Password: Пароль: - + Games Игры - + Show &full games Показывать &текущие - + Show &running games - + C&reate С&оздать - + &Join &Присоединиться - + J&oin as spectator П&рисоединиться как зритель diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 1a1beeac..59267fe5 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -230,197 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - - - &Power / toughness - - - - - &Increase power - - - - - Ctrl++ - - - &Decrease power + &Draw arrow... - Ctrl+- + &Power / toughness - I&ncrease toughness + &Increase power - Alt++ + Ctrl++ - D&ecrease toughness + &Decrease power - Alt+- + Ctrl+- - In&crease power and toughness + I&ncrease toughness - Ctrl+Alt++ + Alt++ - Dec&rease power and toughness + D&ecrease toughness - Ctrl+Alt+- + Alt+- - Set &power and toughness... + In&crease power and toughness - Ctrl+P + Ctrl+Alt++ - &Set annotation... + Dec&rease power and toughness + + + + + Ctrl+Alt+- - red + Set &power and toughness... - yellow + Ctrl+P - green + &Set annotation... - &Add counter (%1) + red + + + + + yellow - &Remove counter (%1) + green - &Set counters (%1)... - - - - - &top of library + &Add counter (%1) - &bottom of library - - - - - &graveyard + &Remove counter (%1) - Ctrl+Del + &Set counters (%1)... - &exile + &top of library + + + + + &bottom of library + &graveyard + + + + + Ctrl+Del + + + + + &exile + + + + &Move to @@ -1203,94 +1208,94 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - - + + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator From fccc91818d675a6f754764692c7146fd49d6521d Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 5 Jul 2011 21:33:03 +0200 Subject: [PATCH 23/26] chatview improvement --- cockatrice/src/chatview.cpp | 20 ++++- cockatrice/src/chatview.h | 5 +- cockatrice/src/messagelogwidget.cpp | 126 ++++++++++++---------------- cockatrice/src/messagelogwidget.h | 1 - 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index 1b5b1e0f..fba78601 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -1,13 +1,12 @@ #include #include -#include #include #include #include #include "chatview.h" ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent) - : QTextBrowser(parent), ownName(_ownName), showTimestamps(_showTimestamps) + : QTextBrowser(parent), evenNumber(false), ownName(_ownName), showTimestamps(_showTimestamps) { setReadOnly(true); setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse); @@ -15,15 +14,30 @@ ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *paren connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(openLink(const QUrl &))); } -void ChatView::appendMessage(QString sender, QString message, QColor playerColor, bool playerBold) +QTextCursor ChatView::prepareBlock() { QTextCursor cursor(document()->lastBlock()); cursor.movePosition(QTextCursor::End); QTextBlockFormat blockFormat; + if ((evenNumber = !evenNumber)) + blockFormat.setBackground(palette().alternateBase()); blockFormat.setBottomMargin(2); cursor.insertBlock(blockFormat); + return cursor; +} + +void ChatView::appendHtml(const QString &html) +{ + prepareBlock().insertHtml(html); + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); +} + +void ChatView::appendMessage(QString sender, QString message, QColor playerColor, bool playerBold) +{ + QTextCursor cursor = prepareBlock(); + if (showTimestamps) { QTextCharFormat timeFormat; timeFormat.setForeground(Qt::black); diff --git a/cockatrice/src/chatview.h b/cockatrice/src/chatview.h index 5f944532..1be07621 100644 --- a/cockatrice/src/chatview.h +++ b/cockatrice/src/chatview.h @@ -3,6 +3,7 @@ #include #include +#include #include class QTextTable; @@ -11,16 +12,18 @@ class QMouseEvent; class ChatView : public QTextBrowser { Q_OBJECT; private: - QTextTable *table; + bool evenNumber; QString ownName; bool showTimestamps; QTextFragment getFragmentUnderMouse(const QPoint &pos) const; QString getCardNameUnderMouse(QTextFragment frag) const; QString getCardNameUnderMouse(const QPoint &pos) const; + QTextCursor prepareBlock(); private slots: void openLink(const QUrl &link); public: ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent = 0); + void appendHtml(const QString &html); void appendMessage(QString sender, QString message, QColor playerColor = QColor(), bool playerBold = false); protected: void enterEvent(QEvent *event); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 9b452bf8..8f18cdc8 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -13,20 +13,6 @@ QString MessageLogWidget::sanitizeHtml(QString dirty) const .replace(">", ">"); } -void MessageLogWidget::myAppend(const QString &message) -{ - QTextCursor cursor(document()->lastBlock()); - cursor.movePosition(QTextCursor::End); - - QTextBlockFormat blockFormat; - blockFormat.setBottomMargin(2); - cursor.insertBlock(blockFormat); - - cursor.insertHtml(message); - - verticalScrollBar()->setValue(verticalScrollBar()->maximum()); -} - bool MessageLogWidget::isFemale(Player *player) const { return player->getUserInfo()->getGender() == ServerInfo_User::Female; @@ -34,107 +20,107 @@ bool MessageLogWidget::isFemale(Player *player) const void MessageLogWidget::logConnecting(QString hostname) { - myAppend(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); + appendHtml(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); } void MessageLogWidget::logConnected() { - myAppend(tr("Connected.")); + appendHtml(tr("Connected.")); } void MessageLogWidget::logDisconnected() { - myAppend(tr("Disconnected from server.")); + appendHtml(tr("Disconnected from server.")); } void MessageLogWidget::logSocketError(const QString &errorString) { - myAppend(sanitizeHtml(errorString)); + appendHtml(sanitizeHtml(errorString)); } void MessageLogWidget::logServerError(ResponseCode response) { switch (response) { - case RespWrongPassword: myAppend(tr("Invalid password.")); break; + case RespWrongPassword: appendHtml(tr("Invalid password.")); break; default: ; } } void MessageLogWidget::logProtocolVersionMismatch(int clientVersion, int serverVersion) { - myAppend(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion)); + appendHtml(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion)); } void MessageLogWidget::logProtocolError() { - myAppend(tr("Protocol error.")); + appendHtml(tr("Protocol error.")); } void MessageLogWidget::logGameJoined(int gameId) { - myAppend(tr("You have joined game #%1.").arg(gameId)); + appendHtml(tr("You have joined game #%1.").arg(gameId)); } void MessageLogWidget::logJoin(Player *player) { soundEngine->cuckoo(); - myAppend(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logLeave(Player *player) { - myAppend(tr("%1 has left the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has left the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameClosed() { - myAppend(tr("The game has been closed.")); + appendHtml(tr("The game has been closed.")); } void MessageLogWidget::logJoinSpectator(QString name) { - myAppend(tr("%1 is now watching the game.").arg(sanitizeHtml(name))); + appendHtml(tr("%1 is now watching the game.").arg(sanitizeHtml(name))); } void MessageLogWidget::logLeaveSpectator(QString name) { - myAppend(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); + appendHtml(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); } void MessageLogWidget::logDeckSelect(Player *player, int deckId) { if (deckId == -1) - myAppend(tr("%1 has loaded a local deck.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has loaded a local deck.").arg(sanitizeHtml(player->getName()))); else - myAppend(tr("%1 has loaded deck #%2.").arg(sanitizeHtml(player->getName())).arg(deckId)); + appendHtml(tr("%1 has loaded deck #%2.").arg(sanitizeHtml(player->getName())).arg(deckId)); } void MessageLogWidget::logReadyStart(Player *player) { - myAppend(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logNotReadyStart(Player *player) { - myAppend(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logConcede(Player *player) { - myAppend(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameStart() { - myAppend(tr("The game has started.")); + appendHtml(tr("The game has started.")); } void MessageLogWidget::logConnectionStateChanged(Player *player, bool connectionState) { if (connectionState) - myAppend(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); else - myAppend(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logSay(Player *player, QString message) @@ -151,12 +137,12 @@ void MessageLogWidget::logShuffle(Player *player, CardZone *zone) { soundEngine->shuffle(); if (currentContext != MessageContext_Mulligan) - myAppend(tr("%1 shuffles %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + appendHtml(tr("%1 shuffles %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); } void MessageLogWidget::logRollDie(Player *player, int sides, int roll) { - myAppend(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); + appendHtml(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); } void MessageLogWidget::logDrawCards(Player *player, int number) @@ -165,16 +151,16 @@ void MessageLogWidget::logDrawCards(Player *player, int number) mulliganPlayer = player; else { soundEngine->draw(); - myAppend(tr("%1 draws %n card(s).", "", number).arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 draws %n card(s).", "", number).arg(sanitizeHtml(player->getName()))); } } void MessageLogWidget::logUndoDraw(Player *player, QString cardName) { if (cardName.isEmpty()) - myAppend((isFemale(player) ? tr("%1 undoes her last draw.") : tr("%1 undoes his last draw.")).arg(sanitizeHtml(player->getName()))); + appendHtml((isFemale(player) ? tr("%1 undoes her last draw.") : tr("%1 undoes his last draw.")).arg(sanitizeHtml(player->getName()))); else - myAppend((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + appendHtml((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } QPair MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const @@ -239,7 +225,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) cardStr = QString("%1").arg(sanitizeHtml(cardName)); if (attributes.startZone->getPlayer() != attributes.targetZone->getPlayer()) { - myAppend(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr)); + appendHtml(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr)); return; } @@ -272,7 +258,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) finalStr = tr("%1 plays %2%3."); } - myAppend(finalStr.arg(sanitizeHtml(attributes.player->getName())).arg(cardStr).arg(fromStr).arg(attributes.newX)); + appendHtml(finalStr.arg(sanitizeHtml(attributes.player->getName())).arg(cardStr).arg(fromStr).arg(attributes.newX)); } void MessageLogWidget::logMoveCard(Player *player, CardItem *card, CardZone *startZone, int oldX, CardZone *targetZone, int newX) @@ -292,50 +278,50 @@ void MessageLogWidget::logMulligan(Player *player, int number) return; if (number > -1) - myAppend(tr("%1 takes a mulligan to %n.", "", number).arg(sanitizeHtml(player->getName()))); + appendHtml(tr("%1 takes a mulligan to %n.", "", number).arg(sanitizeHtml(player->getName()))); else - myAppend((isFemale(player) ? tr("%1 draws her initial hand.") : tr("%1 draws his initial hand.")).arg(sanitizeHtml(player->getName()))); + appendHtml((isFemale(player) ? tr("%1 draws her initial hand.") : tr("%1 draws his initial hand.")).arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logFlipCard(Player *player, QString cardName, bool faceDown) { if (faceDown) - myAppend(tr("%1 flips %2 face-down.").arg(sanitizeHtml(player->getName())).arg(cardName)); + appendHtml(tr("%1 flips %2 face-down.").arg(sanitizeHtml(player->getName())).arg(cardName)); else - myAppend(tr("%1 flips %2 face-up.").arg(sanitizeHtml(player->getName())).arg(cardName)); + appendHtml(tr("%1 flips %2 face-up.").arg(sanitizeHtml(player->getName())).arg(cardName)); } void MessageLogWidget::logDestroyCard(Player *player, QString cardName) { - myAppend(tr("%1 destroys %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + appendHtml(tr("%1 destroys %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logAttachCard(Player *player, QString cardName, Player *targetPlayer, QString targetCardName) { - myAppend(tr("%1 attaches %2 to %3's %4.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); + appendHtml(tr("%1 attaches %2 to %3's %4.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); } void MessageLogWidget::logUnattachCard(Player *player, QString cardName) { - myAppend(tr("%1 unattaches %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + appendHtml(tr("%1 unattaches %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logCreateToken(Player *player, QString cardName, QString pt) { - myAppend(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); + appendHtml(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); } void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool playerTarget) { if (playerTarget) - myAppend(tr("%1 points from %2's %3 to %4.") + appendHtml(tr("%1 points from %2's %3 to %4.") .arg(sanitizeHtml(player->getName())) .arg(sanitizeHtml(startPlayer->getName())) .arg(sanitizeHtml(startCard)) .arg(sanitizeHtml(targetPlayer->getName())) ); else - myAppend(tr("%1 points from %2's %3 to %4's %5.") + appendHtml(tr("%1 points from %2's %3 to %4's %5.") .arg(sanitizeHtml(player->getName())) .arg(sanitizeHtml(startPlayer->getName())) .arg(sanitizeHtml(startCard)) @@ -361,7 +347,7 @@ void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int c default: ; } - myAppend(finalStr.arg(sanitizeHtml(player->getName())).arg(colorStr).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(value)); + appendHtml(finalStr.arg(sanitizeHtml(player->getName())).arg(colorStr).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(value)); } void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) @@ -379,13 +365,13 @@ void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) cardStr = isFemale(player) ? tr("her permanents") : tr("his permanents"); else cardStr = QString("%1").arg(sanitizeHtml(card->getName())); - myAppend(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); + appendHtml(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); } } void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue) { - myAppend(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); + appendHtml(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); } void MessageLogWidget::logSetDoesntUntap(Player *player, CardItem *card, bool doesntUntap) @@ -395,7 +381,7 @@ void MessageLogWidget::logSetDoesntUntap(Player *player, CardItem *card, bool do finalStr = tr("%1 sets %2 to not untap normally."); else finalStr = tr("%1 sets %2 to untap normally."); - myAppend(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); + appendHtml(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); } void MessageLogWidget::logSetPT(Player *player, CardItem *card, QString newPT) @@ -403,26 +389,26 @@ void MessageLogWidget::logSetPT(Player *player, CardItem *card, QString newPT) if (currentContext == MessageContext_MoveCard) moveCardPT.insert(card, newPT); else - myAppend(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); + appendHtml(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); } void MessageLogWidget::logSetAnnotation(Player *player, CardItem *card, QString newAnnotation) { - myAppend(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); + appendHtml(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); } void MessageLogWidget::logDumpZone(Player *player, CardZone *zone, int numberCards) { if (numberCards != -1) - myAppend(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); + appendHtml(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); else - myAppend(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); + appendHtml(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); } void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone) { QString zoneName = zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative); - myAppend(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); + appendHtml(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); } void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer) @@ -445,28 +431,26 @@ void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId if (cardId == -1) { if (otherPlayer) - myAppend(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); + appendHtml(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); else - myAppend(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + appendHtml(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); } else if (cardId == -2) { if (otherPlayer) - myAppend(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + appendHtml(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); else - myAppend(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + appendHtml(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); } else { if (otherPlayer) - myAppend(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + appendHtml(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); else - myAppend(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + appendHtml(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); } } void MessageLogWidget::logSetActivePlayer(Player *player) { soundEngine->notification(); - myAppend(QString()); - myAppend("" + tr("It is now %1's turn.").arg(player->getName()) + ""); - myAppend(QString()); + appendHtml("
" + tr("It is now %1's turn.").arg(player->getName()) + "
"); } void MessageLogWidget::logSetActivePhase(int phase) @@ -486,7 +470,7 @@ void MessageLogWidget::logSetActivePhase(int phase) case 9: phaseName = tr("second main phase"); break; case 10: phaseName = tr("ending phase"); break; } - myAppend("" + tr("It is now the %1.").arg(phaseName) + ""); + appendHtml("" + tr("It is now the %1.").arg(phaseName) + ""); } void MessageLogWidget::containerProcessingStarted(GameEventContext *_context) diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index c99851af..69848965 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -28,7 +28,6 @@ private: enum MessageContext { MessageContext_None, MessageContext_MoveCard, MessageContext_Mulligan }; QString sanitizeHtml(QString dirty) const; - void myAppend(const QString &message); bool isFemale(Player *player) const; QPair getFromStr(CardZone *zone, QString cardName, int position) const; MessageContext currentContext; From 09d0e65d1d71393ec0a4298bb9d7f4b7970b9755 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 5 Jul 2011 22:40:03 +0200 Subject: [PATCH 24/26] more visual improvements --- cockatrice/src/chatview.cpp | 31 +++++++++++++++++++++---------- cockatrice/src/chatview.h | 3 ++- cockatrice/src/gameselector.cpp | 1 + cockatrice/src/userlist.cpp | 1 + 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index fba78601..9aecfd1e 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -6,7 +6,7 @@ #include "chatview.h" ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *parent) - : QTextBrowser(parent), evenNumber(false), ownName(_ownName), showTimestamps(_showTimestamps) + : QTextBrowser(parent), evenNumber(true), ownName(_ownName), showTimestamps(_showTimestamps) { setReadOnly(true); setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse); @@ -14,16 +14,20 @@ ChatView::ChatView(const QString &_ownName, bool _showTimestamps, QWidget *paren connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(openLink(const QUrl &))); } -QTextCursor ChatView::prepareBlock() +QTextCursor ChatView::prepareBlock(bool same) { + lastSender.clear(); + QTextCursor cursor(document()->lastBlock()); cursor.movePosition(QTextCursor::End); - - QTextBlockFormat blockFormat; - if ((evenNumber = !evenNumber)) - blockFormat.setBackground(palette().alternateBase()); - blockFormat.setBottomMargin(2); - cursor.insertBlock(blockFormat); + if (!same) { + QTextBlockFormat blockFormat; + if ((evenNumber = !evenNumber)) + blockFormat.setBackground(palette().alternateBase()); + blockFormat.setBottomMargin(2); + cursor.insertBlock(blockFormat); + } else + cursor.insertHtml("
"); return cursor; } @@ -36,11 +40,16 @@ void ChatView::appendHtml(const QString &html) void ChatView::appendMessage(QString sender, QString message, QColor playerColor, bool playerBold) { - QTextCursor cursor = prepareBlock(); + bool sameSender = (sender == lastSender) && !lastSender.isEmpty(); + QTextCursor cursor = prepareBlock(sameSender); + lastSender = sender; if (showTimestamps) { QTextCharFormat timeFormat; - timeFormat.setForeground(Qt::black); + if (sameSender) + timeFormat.setForeground(Qt::transparent); + else + timeFormat.setForeground(Qt::black); cursor.setCharFormat(timeFormat); cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm] ")); } @@ -57,6 +66,8 @@ void ChatView::appendMessage(QString sender, QString message, QColor playerColor if (playerBold) senderFormat.setFontWeight(QFont::Bold); } + if (sameSender) + senderFormat.setForeground(Qt::transparent); cursor.setCharFormat(senderFormat); if (!sender.isEmpty()) sender.append(": "); diff --git a/cockatrice/src/chatview.h b/cockatrice/src/chatview.h index 1be07621..33c583c6 100644 --- a/cockatrice/src/chatview.h +++ b/cockatrice/src/chatview.h @@ -12,13 +12,14 @@ class QMouseEvent; class ChatView : public QTextBrowser { Q_OBJECT; private: + QString lastSender; bool evenNumber; QString ownName; bool showTimestamps; QTextFragment getFragmentUnderMouse(const QPoint &pos) const; QString getCardNameUnderMouse(QTextFragment frag) const; QString getCardNameUnderMouse(const QPoint &pos) const; - QTextCursor prepareBlock(); + QTextCursor prepareBlock(bool same = false); private slots: void openLink(const QUrl &link); public: diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp index 9c165d26..1feb63d0 100644 --- a/cockatrice/src/gameselector.cpp +++ b/cockatrice/src/gameselector.cpp @@ -22,6 +22,7 @@ GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, const QMapsetSortCaseSensitivity(Qt::CaseInsensitive); gameListView->setModel(gameListProxyModel); gameListView->setSortingEnabled(true); + gameListView->setAlternatingRowColors(true); if (_room) gameListView->header()->hideSection(0); gameListView->header()->setResizeMode(1, QHeaderView::ResizeToContents); diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index 20b60992..71101f48 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -107,6 +107,7 @@ UserList::UserList(TabSupervisor *_tabSupervisor, AbstractClient *_client, UserL userTree->setRootIsDecorated(false); userTree->setIconSize(QSize(20, 12)); userTree->setItemDelegate(itemDelegate); + userTree->setAlternatingRowColors(true); connect(userTree, SIGNAL(itemActivated(QTreeWidgetItem *, int)), this, SLOT(userClicked(QTreeWidgetItem *, int))); QVBoxLayout *vbox = new QVBoxLayout; From 9090bc333cefa3d91f957c13c6a2f7e1a1eaba10 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Wed, 6 Jul 2011 01:22:09 +0200 Subject: [PATCH 25/26] new phase buttons by capthauq --- .../resources/phases/icon_phase_cleanup.svg | 935 ++------ .../phases/icon_phase_combat_attackers.svg | 265 +-- .../phases/icon_phase_combat_blockers.svg | 2111 +++++++++++++++-- .../phases/icon_phase_combat_damage.svg | 277 +-- .../phases/icon_phase_combat_end.svg | 572 +++-- .../phases/icon_phase_combat_start.svg | 601 +++-- .../resources/phases/icon_phase_draw.svg | 382 ++- .../resources/phases/icon_phase_main1.svg | 214 +- .../resources/phases/icon_phase_main2.svg | 370 +-- .../resources/phases/icon_phase_nextturn.svg | 191 +- .../resources/phases/icon_phase_untap.svg | 318 +-- .../resources/phases/icon_phase_upkeep.svg | 321 +-- .../phases_old/icon_phase_cleanup.svg | 749 ++++++ .../icon_phase_combat_attackers.svg | 162 ++ .../phases_old/icon_phase_combat_blockers.svg | 181 ++ .../phases_old/icon_phase_combat_damage.svg | 169 ++ .../phases_old/icon_phase_combat_end.svg | 253 ++ .../phases_old/icon_phase_combat_start.svg | 253 ++ .../resources/phases_old/icon_phase_draw.svg | 192 ++ .../resources/phases_old/icon_phase_main1.svg | 135 ++ .../resources/phases_old/icon_phase_main2.svg | 135 ++ .../phases_old/icon_phase_nextturn.svg | 89 + .../resources/phases_old/icon_phase_untap.svg | 198 ++ .../phases_old/icon_phase_upkeep.svg | 159 ++ 24 files changed, 6557 insertions(+), 2675 deletions(-) create mode 100644 cockatrice/resources/phases_old/icon_phase_cleanup.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_combat_attackers.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_combat_blockers.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_combat_damage.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_combat_end.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_combat_start.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_draw.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_main1.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_main2.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_nextturn.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_untap.svg create mode 100644 cockatrice/resources/phases_old/icon_phase_upkeep.svg diff --git a/cockatrice/resources/phases/icon_phase_cleanup.svg b/cockatrice/resources/phases/icon_phase_cleanup.svg index a675d66f..9786daca 100644 --- a/cockatrice/resources/phases/icon_phase_cleanup.svg +++ b/cockatrice/resources/phases/icon_phase_cleanup.svg @@ -1,749 +1,186 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_combat_attackers.svg b/cockatrice/resources/phases/icon_phase_combat_attackers.svg index 540107ac..d7483253 100644 --- a/cockatrice/resources/phases/icon_phase_combat_attackers.svg +++ b/cockatrice/resources/phases/icon_phase_combat_attackers.svg @@ -1,162 +1,103 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_combat_blockers.svg b/cockatrice/resources/phases/icon_phase_combat_blockers.svg index 6344ef6b..6602eaef 100644 --- a/cockatrice/resources/phases/icon_phase_combat_blockers.svg +++ b/cockatrice/resources/phases/icon_phase_combat_blockers.svg @@ -1,181 +1,1930 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_combat_damage.svg b/cockatrice/resources/phases/icon_phase_combat_damage.svg index 8536764e..aa356e2a 100644 --- a/cockatrice/resources/phases/icon_phase_combat_damage.svg +++ b/cockatrice/resources/phases/icon_phase_combat_damage.svg @@ -1,169 +1,108 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_combat_end.svg b/cockatrice/resources/phases/icon_phase_combat_end.svg index 9e7b8950..bbbbf9bf 100644 --- a/cockatrice/resources/phases/icon_phase_combat_end.svg +++ b/cockatrice/resources/phases/icon_phase_combat_end.svg @@ -1,253 +1,319 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_combat_start.svg b/cockatrice/resources/phases/icon_phase_combat_start.svg index 996571d7..b80b571d 100644 --- a/cockatrice/resources/phases/icon_phase_combat_start.svg +++ b/cockatrice/resources/phases/icon_phase_combat_start.svg @@ -1,253 +1,348 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_draw.svg b/cockatrice/resources/phases/icon_phase_draw.svg index 51918274..4d106219 100644 --- a/cockatrice/resources/phases/icon_phase_draw.svg +++ b/cockatrice/resources/phases/icon_phase_draw.svg @@ -1,192 +1,190 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_main1.svg b/cockatrice/resources/phases/icon_phase_main1.svg index 264cef39..48fce651 100644 --- a/cockatrice/resources/phases/icon_phase_main1.svg +++ b/cockatrice/resources/phases/icon_phase_main1.svg @@ -1,135 +1,79 @@ - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_main2.svg b/cockatrice/resources/phases/icon_phase_main2.svg index 50f77fa7..61be736e 100644 --- a/cockatrice/resources/phases/icon_phase_main2.svg +++ b/cockatrice/resources/phases/icon_phase_main2.svg @@ -1,135 +1,235 @@ - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_nextturn.svg b/cockatrice/resources/phases/icon_phase_nextturn.svg index 3cfd19ab..302a57d6 100644 --- a/cockatrice/resources/phases/icon_phase_nextturn.svg +++ b/cockatrice/resources/phases/icon_phase_nextturn.svg @@ -1,89 +1,102 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_untap.svg b/cockatrice/resources/phases/icon_phase_untap.svg index 2f4d8173..3d316ab0 100644 --- a/cockatrice/resources/phases/icon_phase_untap.svg +++ b/cockatrice/resources/phases/icon_phase_untap.svg @@ -1,198 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases/icon_phase_upkeep.svg b/cockatrice/resources/phases/icon_phase_upkeep.svg index 5a06aae9..2317a937 100644 --- a/cockatrice/resources/phases/icon_phase_upkeep.svg +++ b/cockatrice/resources/phases/icon_phase_upkeep.svg @@ -1,159 +1,162 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_cleanup.svg b/cockatrice/resources/phases_old/icon_phase_cleanup.svg new file mode 100644 index 00000000..a675d66f --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_cleanup.svg @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_combat_attackers.svg b/cockatrice/resources/phases_old/icon_phase_combat_attackers.svg new file mode 100644 index 00000000..540107ac --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_combat_attackers.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_combat_blockers.svg b/cockatrice/resources/phases_old/icon_phase_combat_blockers.svg new file mode 100644 index 00000000..6344ef6b --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_combat_blockers.svg @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_combat_damage.svg b/cockatrice/resources/phases_old/icon_phase_combat_damage.svg new file mode 100644 index 00000000..8536764e --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_combat_damage.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_combat_end.svg b/cockatrice/resources/phases_old/icon_phase_combat_end.svg new file mode 100644 index 00000000..9e7b8950 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_combat_end.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_combat_start.svg b/cockatrice/resources/phases_old/icon_phase_combat_start.svg new file mode 100644 index 00000000..996571d7 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_combat_start.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_draw.svg b/cockatrice/resources/phases_old/icon_phase_draw.svg new file mode 100644 index 00000000..51918274 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_draw.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_main1.svg b/cockatrice/resources/phases_old/icon_phase_main1.svg new file mode 100644 index 00000000..264cef39 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_main1.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_main2.svg b/cockatrice/resources/phases_old/icon_phase_main2.svg new file mode 100644 index 00000000..50f77fa7 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_main2.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_nextturn.svg b/cockatrice/resources/phases_old/icon_phase_nextturn.svg new file mode 100644 index 00000000..3cfd19ab --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_nextturn.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_untap.svg b/cockatrice/resources/phases_old/icon_phase_untap.svg new file mode 100644 index 00000000..2f4d8173 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_untap.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/cockatrice/resources/phases_old/icon_phase_upkeep.svg b/cockatrice/resources/phases_old/icon_phase_upkeep.svg new file mode 100644 index 00000000..5a06aae9 --- /dev/null +++ b/cockatrice/resources/phases_old/icon_phase_upkeep.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + From f10d9c9bec168529a56d976e3667591600589b30 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Wed, 6 Jul 2011 18:45:56 +0200 Subject: [PATCH 26/26] strip newlines from msg in cmdRoomSay; improved i18n in MessageLogWidget --- cockatrice/src/messagelogwidget.cpp | 506 +++++-- cockatrice/src/messagelogwidget.h | 10 +- cockatrice/src/tab_game.cpp | 4 +- cockatrice/src/tab_game.h | 2 +- cockatrice/src/tab_supervisor.cpp | 24 +- cockatrice/src/tab_supervisor.h | 5 +- cockatrice/translations/cockatrice_cs.ts | 1224 +++++++++++----- cockatrice/translations/cockatrice_de.ts | 1184 +++++++++++++--- cockatrice/translations/cockatrice_en.ts | 1251 ++++++++++++----- cockatrice/translations/cockatrice_es.ts | 1209 ++++++++++++---- cockatrice/translations/cockatrice_fr.ts | 1393 ++++++++++++++----- cockatrice/translations/cockatrice_ja.ts | 1222 +++++++++++----- cockatrice/translations/cockatrice_pl.ts | 1224 +++++++++++----- cockatrice/translations/cockatrice_pt-br.ts | 1209 ++++++++++++---- cockatrice/translations/cockatrice_pt.ts | 1187 ++++++++++++---- cockatrice/translations/cockatrice_ru.ts | 1218 ++++++++++++---- cockatrice/translations/cockatrice_sk.ts | 1224 +++++++++++----- common/server_protocolhandler.cpp | 3 +- 18 files changed, 10655 insertions(+), 3444 deletions(-) diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 8f18cdc8..98b61c90 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -18,58 +18,29 @@ bool MessageLogWidget::isFemale(Player *player) const return player->getUserInfo()->getGender() == ServerInfo_User::Female; } -void MessageLogWidget::logConnecting(QString hostname) -{ - appendHtml(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); -} - -void MessageLogWidget::logConnected() -{ - appendHtml(tr("Connected.")); -} - -void MessageLogWidget::logDisconnected() -{ - appendHtml(tr("Disconnected from server.")); -} - -void MessageLogWidget::logSocketError(const QString &errorString) -{ - appendHtml(sanitizeHtml(errorString)); -} - -void MessageLogWidget::logServerError(ResponseCode response) -{ - switch (response) { - case RespWrongPassword: appendHtml(tr("Invalid password.")); break; - default: ; - } -} - -void MessageLogWidget::logProtocolVersionMismatch(int clientVersion, int serverVersion) -{ - appendHtml(tr("Protocol version mismatch. Client: %1, Server: %2").arg(clientVersion).arg(serverVersion)); -} - -void MessageLogWidget::logProtocolError() -{ - appendHtml(tr("Protocol error.")); -} - void MessageLogWidget::logGameJoined(int gameId) { - appendHtml(tr("You have joined game #%1.").arg(gameId)); + if (female) + appendHtml(tr("You have joined game #%1.", "female").arg(gameId)); + else + appendHtml(tr("You have joined game #%1.", "male").arg(gameId)); } void MessageLogWidget::logJoin(Player *player) { soundEngine->cuckoo(); - appendHtml(tr("%1 has joined the game.").arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 has joined the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has joined the game.", "male").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logLeave(Player *player) { - appendHtml(tr("%1 has left the game.").arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 has left the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has left the game.", "male").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameClosed() @@ -89,25 +60,41 @@ void MessageLogWidget::logLeaveSpectator(QString name) void MessageLogWidget::logDeckSelect(Player *player, int deckId) { - if (deckId == -1) - appendHtml(tr("%1 has loaded a local deck.").arg(sanitizeHtml(player->getName()))); - else - appendHtml(tr("%1 has loaded deck #%2.").arg(sanitizeHtml(player->getName())).arg(deckId)); + if (deckId == -1) { + if (isFemale(player)) + appendHtml(tr("%1 has loaded a local deck.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has loaded a local deck.", "male").arg(sanitizeHtml(player->getName()))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 has loaded deck #%2.", "female").arg(sanitizeHtml(player->getName())).arg(deckId)); + else + appendHtml(tr("%1 has loaded deck #%2.", "male").arg(sanitizeHtml(player->getName())).arg(deckId)); + } } void MessageLogWidget::logReadyStart(Player *player) { - appendHtml(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 is ready to start the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 is ready to start the game.", "male").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logNotReadyStart(Player *player) { - appendHtml(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 is not ready to start the game any more.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 is not ready to start the game any more.", "male").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logConcede(Player *player) { - appendHtml(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 has conceded the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has conceded the game.", "male").arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logGameStart() @@ -117,10 +104,17 @@ void MessageLogWidget::logGameStart() void MessageLogWidget::logConnectionStateChanged(Player *player, bool connectionState) { - if (connectionState) - appendHtml(tr("%1 has restored connection to the game.").arg(sanitizeHtml(player->getName()))); - else - appendHtml(tr("%1 has lost connection to the game.").arg(sanitizeHtml(player->getName()))); + if (connectionState) { + if (isFemale(player)) + appendHtml(tr("%1 has restored connection to the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has restored connection to the game.", "male").arg(sanitizeHtml(player->getName()))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 has lost connection to the game.", "female").arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 has lost connection to the game.", "male").arg(sanitizeHtml(player->getName()))); + } } void MessageLogWidget::logSay(Player *player, QString message) @@ -136,13 +130,20 @@ void MessageLogWidget::logSpectatorSay(QString spectatorName, QString message) void MessageLogWidget::logShuffle(Player *player, CardZone *zone) { soundEngine->shuffle(); - if (currentContext != MessageContext_Mulligan) - appendHtml(tr("%1 shuffles %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + if (currentContext != MessageContext_Mulligan) { + if (isFemale(player)) + appendHtml(tr("%1 shuffles %2.", "female").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + else + appendHtml(tr("%1 shuffles %2.", "male").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + } } void MessageLogWidget::logRollDie(Player *player, int sides, int roll) { - appendHtml(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); + if (isFemale(player)) + appendHtml(tr("%1 rolls a %2 with a %3-sided die.", "female").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); + else + appendHtml(tr("%1 rolls a %2 with a %3-sided die.", "male").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); } void MessageLogWidget::logDrawCards(Player *player, int number) @@ -151,7 +152,10 @@ void MessageLogWidget::logDrawCards(Player *player, int number) mulliganPlayer = player; else { soundEngine->draw(); - appendHtml(tr("%1 draws %n card(s).", "", number).arg(sanitizeHtml(player->getName()))); + if (isFemale(player)) + appendHtml(tr("%1 draws %n card(s).", "female", number).arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 draws %n card(s).", "male", number).arg(sanitizeHtml(player->getName()))); } } @@ -277,57 +281,200 @@ void MessageLogWidget::logMulligan(Player *player, int number) if (!player) return; - if (number > -1) - appendHtml(tr("%1 takes a mulligan to %n.", "", number).arg(sanitizeHtml(player->getName()))); - else + if (number > -1) { + if (isFemale(player)) + appendHtml(tr("%1 takes a mulligan to %n.", "female", number).arg(sanitizeHtml(player->getName()))); + else + appendHtml(tr("%1 takes a mulligan to %n.", "male", number).arg(sanitizeHtml(player->getName()))); + } else appendHtml((isFemale(player) ? tr("%1 draws her initial hand.") : tr("%1 draws his initial hand.")).arg(sanitizeHtml(player->getName()))); } void MessageLogWidget::logFlipCard(Player *player, QString cardName, bool faceDown) { - if (faceDown) - appendHtml(tr("%1 flips %2 face-down.").arg(sanitizeHtml(player->getName())).arg(cardName)); - else - appendHtml(tr("%1 flips %2 face-up.").arg(sanitizeHtml(player->getName())).arg(cardName)); + if (faceDown) { + if (isFemale(player)) + appendHtml(tr("%1 flips %2 face-down.", "female").arg(sanitizeHtml(player->getName())).arg(cardName)); + else + appendHtml(tr("%1 flips %2 face-down.", "male").arg(sanitizeHtml(player->getName())).arg(cardName)); + } else { + if (isFemale(player)) + appendHtml(tr("%1 flips %2 face-up.", "female").arg(sanitizeHtml(player->getName())).arg(cardName)); + else + appendHtml(tr("%1 flips %2 face-up.", "male").arg(sanitizeHtml(player->getName())).arg(cardName)); + } } void MessageLogWidget::logDestroyCard(Player *player, QString cardName) { - appendHtml(tr("%1 destroys %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + if (isFemale(player)) + appendHtml(tr("%1 destroys %2.", "female").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + else + appendHtml(tr("%1 destroys %2.", "male").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logAttachCard(Player *player, QString cardName, Player *targetPlayer, QString targetCardName) { - appendHtml(tr("%1 attaches %2 to %3's %4.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); + QString str; + if (isFemale(player)) { + if (isFemale(targetPlayer)) + str = tr("%1 attaches %2 to %3's %4.", "p1 female, p2 female"); + else + str = tr("%1 attaches %2 to %3's %4.", "p1 female, p2 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 attaches %2 to %3's %4.", "p1 male, p2 female"); + else + str = tr("%1 attaches %2 to %3's %4.", "p1 male, p2 male"); + } + + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(sanitizeHtml(targetPlayer->getName())).arg(QString("%1").arg(sanitizeHtml(targetCardName)))); } void MessageLogWidget::logUnattachCard(Player *player, QString cardName) { - appendHtml(tr("%1 unattaches %2.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + if (isFemale(player)) + appendHtml(tr("%1 unattaches %2.", "female").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); + else + appendHtml(tr("%1 unattaches %2.", "male").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } void MessageLogWidget::logCreateToken(Player *player, QString cardName, QString pt) { - appendHtml(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); + if (isFemale(player)) + appendHtml(tr("%1 creates token: %2%3.", "female").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); + else + appendHtml(tr("%1 creates token: %2%3.", "male").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); } void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool playerTarget) { - if (playerTarget) - appendHtml(tr("%1 points from %2's %3 to %4.") - .arg(sanitizeHtml(player->getName())) - .arg(sanitizeHtml(startPlayer->getName())) - .arg(sanitizeHtml(startCard)) - .arg(sanitizeHtml(targetPlayer->getName())) - ); - else - appendHtml(tr("%1 points from %2's %3 to %4's %5.") - .arg(sanitizeHtml(player->getName())) - .arg(sanitizeHtml(startPlayer->getName())) - .arg(sanitizeHtml(startCard)) - .arg(sanitizeHtml(targetPlayer->getName())) - .arg(sanitizeHtml(targetCard)) - ); + startCard = QString("%1").arg(sanitizeHtml(startCard)); + targetCard = QString("%1").arg(sanitizeHtml(targetCard)); + QString str; + if (playerTarget) { + if ((player == startPlayer) && (player == targetPlayer)) { + if (isFemale(player)) + str = tr("%1 points from her %2 to herself.", "female"); + else + str = tr("%1 points from his %2 to himself.", "male"); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(startCard)); + } else if (player == startPlayer) { + if (isFemale(player)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from her %2 to %3.", "p1 female, p2 female"); + else + str = tr("%1 points from her %2 to %3.", "p1 female, p2 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from his %2 to %3.", "p1 male, p2 female"); + else + str = tr("%1 points from his %2 to %3.", "p1 male, p2 male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(startCard).arg(sanitizeHtml(targetPlayer->getName()))); + } else if (player == targetPlayer) { + if (isFemale(player)) { + if (isFemale(startPlayer)) + str = tr("%1 points from %2's %3 to herself.", "card owner female, target female"); + else + str = tr("%1 points from %2's %3 to herself.", "card owner male, target female"); + } else { + if (isFemale(startPlayer)) + str = tr("%1 points from %2's %3 to himself.", "card owner female, target male"); + else + str = tr("%1 points from %2's %3 to himself.", "card owner male, target male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(startPlayer->getName())).arg(startCard)); + } else { + if (isFemale(player)) { + if (isFemale(startPlayer)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4.", "p1 female, p2 female, p3 female"); + else + str = tr("%1 points from %2's %3 to %4.", "p1 female, p2 female, p3 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4.", "p1 female, p2 male, p3 female"); + else + str = tr("%1 points from %2's %3 to %4.", "p1 female, p2 male, p3 male"); + } + } else { + if (isFemale(startPlayer)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4.", "p1 male, p2 female, p3 female"); + else + str = tr("%1 points from %2's %3 to %4.", "p1 male, p2 female, p3 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4.", "p1 male, p2 male, p3 female"); + else + str = tr("%1 points from %2's %3 to %4.", "p1 male, p2 male, p3 male"); + } + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(startPlayer->getName())).arg(startCard).arg(sanitizeHtml(targetPlayer->getName()))); + } + } else { + if ((player == startPlayer) && (player == targetPlayer)) { + if (isFemale(player)) + str = tr("%1 points from her %2 to her %3.", "female"); + else + str = tr("%1 points from his %2 to his %3.", "male"); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(startCard).arg(targetCard)); + } else if (player == startPlayer) { + if (isFemale(player)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from her %2 to %3's %4.", "p1 female, p2 female"); + else + str = tr("%1 points from her %2 to %3's %4.", "p1 female, p2 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from his %2 to %3's %4.", "p1 male, p2 female"); + else + str = tr("%1 points from his %2 to %3's %4.", "p1 male, p2 male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(startCard).arg(sanitizeHtml(targetPlayer->getName())).arg(targetCard)); + } else if (player == targetPlayer) { + if (isFemale(player)) { + if (isFemale(startPlayer)) + str = tr("%1 points from %2's %3 to her own %4.", "card owner female, target female"); + else + str = tr("%1 points from %2's %3 to her own %4.", "card owner male, target female"); + } else { + if (isFemale(startPlayer)) + str = tr("%1 points from %2's %3 to his own %4.", "card owner female, target male"); + else + str = tr("%1 points from %2's %3 to his own %4.", "card owner male, target male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(startPlayer->getName())).arg(startCard).arg(targetCard)); + } else { + if (isFemale(player)) { + if (isFemale(startPlayer)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4's %5.", "p1 female, p2 female, p3 female"); + else + str = tr("%1 points from %2's %3 to %4's %5.", "p1 female, p2 female, p3 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4's %5.", "p1 female, p2 male, p3 female"); + else + str = tr("%1 points from %2's %3 to %4's %5.", "p1 female, p2 male, p3 male"); + } + } else { + if (isFemale(startPlayer)) { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4's %5.", "p1 male, p2 female, p3 female"); + else + str = tr("%1 points from %2's %3 to %4's %5.", "p1 male, p2 female, p3 male"); + } else { + if (isFemale(targetPlayer)) + str = tr("%1 points from %2's %3 to %4's %5.", "p1 male, p2 male, p3 female"); + else + str = tr("%1 points from %2's %3 to %4's %5.", "p1 male, p2 male, p3 male"); + } + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(startPlayer->getName())).arg(startCard).arg(sanitizeHtml(targetPlayer->getName())).arg(targetCard)); + } + } } void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue) @@ -335,10 +482,17 @@ void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int c QString finalStr, colorStr; int delta = abs(oldValue - value); - if (value > oldValue) - finalStr = tr("%1 places %n %2 counter(s) on %3 (now %4).", "", delta); - else - finalStr = tr("%1 removes %n %2 counter(s) from %3 (now %4).", "", delta); + if (value > oldValue) { + if (isFemale(player)) + finalStr = tr("%1 places %n %2 counter(s) on %3 (now %4).", "female", delta); + else + finalStr = tr("%1 places %n %2 counter(s) on %3 (now %4).", "male", delta); + } else { + if (isFemale(player)) + finalStr = tr("%1 removes %n %2 counter(s) from %3 (now %4).", "female", delta); + else + finalStr = tr("%1 removes %n %2 counter(s) from %3 (now %4).", "male", delta); + } switch (counterId) { case 0: colorStr = tr("red", "", delta); break; @@ -360,55 +514,111 @@ void MessageLogWidget::logSetTapped(Player *player, CardItem *card, bool tapped) if (currentContext == MessageContext_MoveCard) moveCardTapped.insert(card, tapped); else { - QString cardStr; - if (!card) - cardStr = isFemale(player) ? tr("her permanents") : tr("his permanents"); - else - cardStr = QString("%1").arg(sanitizeHtml(card->getName())); - appendHtml(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); + QString str; + if (!card) { + if (isFemale(player)) { + if (tapped) + str = tr("%1 taps her permanents.", "female"); + else + str = tr("%1 untaps her permanents.", "female"); + } else { + if (tapped) + str = tr("%1 taps his permanents.", "male"); + else + str = tr("%1 untaps his permanents.", "male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName()))); + } else { + if (isFemale(player)) { + if (tapped) + str = tr("%1 taps %2.", "female"); + else + str = tr("%1 untaps %2.", "female"); + } else { + if (tapped) + str = tr("%1 taps %2.", "male"); + else + str = tr("%1 untaps %2.", "male"); + } + QString cardStr = QString("%1").arg(sanitizeHtml(card->getName())); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(cardStr)); + } } } void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue) { - appendHtml(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); + QString str; + if (isFemale(player)) + str = tr("%1 sets counter %2 to %3 (%4%5).", "female"); + else + str = tr("%1 sets counter %2 to %3 (%4%5).", "male"); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(counterName))).arg(QString("%1").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue)); } void MessageLogWidget::logSetDoesntUntap(Player *player, CardItem *card, bool doesntUntap) { - QString finalStr; - if (doesntUntap) - finalStr = tr("%1 sets %2 to not untap normally."); - else - finalStr = tr("%1 sets %2 to untap normally."); - appendHtml(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); + QString str; + if (doesntUntap) { + if (isFemale(player)) + str = tr("%1 sets %2 to not untap normally.", "female"); + else + str = tr("%1 sets %2 to not untap normally.", "male"); + } else { + if (isFemale(player)) + str = tr("%1 sets %2 to untap normally.", "female"); + else + str = tr("%1 sets %2 to untap normally.", "male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName())))); } void MessageLogWidget::logSetPT(Player *player, CardItem *card, QString newPT) { if (currentContext == MessageContext_MoveCard) moveCardPT.insert(card, newPT); - else - appendHtml(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); + else { + QString str; + if (isFemale(player)) + str = tr("%1 sets PT of %2 to %3.", "female"); + else + str = tr("%1 sets PT of %2 to %3.", "male"); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newPT)))); + } } void MessageLogWidget::logSetAnnotation(Player *player, CardItem *card, QString newAnnotation) { - appendHtml(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); + QString str; + if (isFemale(player)) + str = tr("%1 sets annotation of %2 to %3.", "female"); + else + str = tr("%1 sets annotation of %2 to %3.", "male"); + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(card->getName()))).arg(QString("%1").arg(sanitizeHtml(newAnnotation)))); } void MessageLogWidget::logDumpZone(Player *player, CardZone *zone, int numberCards) { - if (numberCards != -1) - appendHtml(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); - else - appendHtml(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); + if (numberCards != -1) { + if (isFemale(player)) + appendHtml(tr("%1 is looking at the top %2 cards %3.", "female").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); + else + appendHtml(tr("%1 is looking at the top %2 cards %3.", "male").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseGenitive))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 is looking at %2.", "female").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); + else + appendHtml(tr("%1 is looking at %2.", "male").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative))); + } } void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone) { QString zoneName = zone->getTranslatedName(zone->getPlayer() == player, CaseAccusative); - appendHtml(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); + if (isFemale(player)) + appendHtml(tr("%1 stops looking at %2.", "female").arg(sanitizeHtml(player->getName())).arg(zoneName)); + else + appendHtml(tr("%1 stops looking at %2.", "male").arg(sanitizeHtml(player->getName())).arg(zoneName)); } void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer) @@ -429,28 +639,80 @@ void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId else cardStr = QString("%1").arg(sanitizeHtml(cardName)); + QString str; if (cardId == -1) { - if (otherPlayer) - appendHtml(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); - else - appendHtml(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + if (otherPlayer) { + if (isFemale(player)) { + if (isFemale(otherPlayer)) + str = tr("%1 reveals %2 to %3.", "p1 female, p2 female"); + else + str = tr("%1 reveals %2 to %3.", "p1 female, p2 male"); + } else { + if (isFemale(otherPlayer)) + str = tr("%1 reveals %2 to %3.", "p1 male, p2 female"); + else + str = tr("%1 reveals %2 to %3.", "p1 male, p2 male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 reveals %2.", "female").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + else + appendHtml(tr("%1 reveals %2.", "male").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + } } else if (cardId == -2) { - if (otherPlayer) - appendHtml(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); - else - appendHtml(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + if (otherPlayer) { + if (isFemale(player)) { + if (isFemale(otherPlayer)) + str = tr("%1 randomly reveals %2%3 to %4.", "p1 female, p2 female"); + else + str = tr("%1 randomly reveals %2%3 to %4.", "p1 female, p2 male"); + } else { + if (isFemale(otherPlayer)) + str = tr("%1 randomly reveals %2%3 to %4.", "p1 male, p2 female"); + else + str = tr("%1 randomly reveals %2%3 to %4.", "p1 male, p2 male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 randomly reveals %2%3.", "female").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + else + appendHtml(tr("%1 randomly reveals %2%3.", "male").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + } } else { - if (otherPlayer) - appendHtml(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); - else - appendHtml(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + if (otherPlayer) { + if (isFemale(player)) { + if (isFemale(otherPlayer)) + str = tr("%1 reveals %2%3 to %4.", "p1 female, p2 female"); + else + str = tr("%1 reveals %2%3 to %4.", "p1 female, p2 male"); + } else { + if (isFemale(otherPlayer)) + str = tr("%1 reveals %2%3 to %4.", "p1 male, p2 female"); + else + str = tr("%1 reveals %2%3 to %4.", "p1 male, p2 male"); + } + appendHtml(str.arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + } else { + if (isFemale(player)) + appendHtml(tr("%1 reveals %2%3.", "female").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + else + appendHtml(tr("%1 reveals %2%3.", "male").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + } } } void MessageLogWidget::logSetActivePlayer(Player *player) { soundEngine->notification(); - appendHtml("
" + tr("It is now %1's turn.").arg(player->getName()) + "
"); + + QString str; + if (isFemale(player)) + str = tr("It is now %1's turn.", "female"); + else + str = tr("It is now %1's turn.", "male"); + appendHtml("
" + str.arg(player->getName()) + "
"); } void MessageLogWidget::logSetActivePhase(int phase) @@ -527,7 +789,7 @@ void MessageLogWidget::connectToPlayer(Player *player) connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *))); } -MessageLogWidget::MessageLogWidget(const QString &_ownName, QWidget *parent) - : ChatView(_ownName, false, parent) +MessageLogWidget::MessageLogWidget(const QString &_ownName, bool _female, QWidget *parent) + : ChatView(_ownName, false, parent), female(_female) { } diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index 69848965..37d4a242 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -31,6 +31,7 @@ private: bool isFemale(Player *player) const; QPair getFromStr(CardZone *zone, QString cardName, int position) const; MessageContext currentContext; + bool female; QList moveCardQueue; QMap moveCardPT; @@ -39,13 +40,6 @@ private: Player *mulliganPlayer; int mulliganNumber; public slots: - void logConnecting(QString hostname); - void logConnected(); - void logDisconnected(); - void logSocketError(const QString &errorString); - void logServerError(ResponseCode response); - void logProtocolVersionMismatch(int clientVersion, int serverVersion); - void logProtocolError(); void logGameJoined(int gameId); void logJoin(Player *player); void logLeave(Player *player); @@ -88,7 +82,7 @@ public slots: void containerProcessingDone(); public: void connectToPlayer(Player *player); - MessageLogWidget(const QString &_ownName, QWidget *parent = 0); + MessageLogWidget(const QString &_ownName, bool _female, QWidget *parent = 0); }; #endif diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 2e38baf7..9b15e0de 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -158,7 +158,7 @@ void DeckViewContainer::setDeck(DeckList *deck) readyStartButton->setEnabled(true); } -TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, const QString &_userName, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming) +TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, ServerInfo_User *_userInfo, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming) : Tab(_tabSupervisor), clients(_clients), gameId(_gameId), gameDescription(_gameDescription), localPlayerId(_localPlayerId), spectator(_spectator), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), started(false), resuming(_resuming), currentPhase(-1) { phasesToolbar = new PhasesToolbar; @@ -176,7 +176,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client timeElapsedLabel = new QLabel; timeElapsedLabel->setAlignment(Qt::AlignCenter); - messageLog = new MessageLogWidget(_userName); + messageLog = new MessageLogWidget(_userInfo->getName(), _userInfo->getGender() == ServerInfo_User::Female); connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfo, SLOT(setCard(QString))); connect(messageLog, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index 289451f1..a5eb5db9 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -155,7 +155,7 @@ private slots: void actNextPhase(); void actNextTurn(); public: - TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, const QString &_userName, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming); + TabGame(TabSupervisor *_tabSupervisor, QList &_clients, int _gameId, const QString &_gameDescription, int _localPlayerId, ServerInfo_User *_userInfo, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming); ~TabGame(); void retranslateUi(); void closeRequest(); diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index 10e33aff..824d149d 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -105,11 +105,10 @@ int TabSupervisor::myAddTab(Tab *tab) return addTab(tab, tab->getTabText()); } -void TabSupervisor::start(AbstractClient *_client, ServerInfo_User *userInfo) +void TabSupervisor::start(AbstractClient *_client, ServerInfo_User *_userInfo) { client = _client; - userName = userInfo->getName(); - userLevel = userInfo->getUserLevel(); + userInfo = new ServerInfo_User(_userInfo); connect(client, SIGNAL(roomEventReceived(RoomEvent *)), this, SLOT(processRoomEvent(RoomEvent *))); connect(client, SIGNAL(gameEventContainerReceived(GameEventContainer *)), this, SLOT(processGameEventContainer(GameEventContainer *))); @@ -146,6 +145,7 @@ void TabSupervisor::start(AbstractClient *_client, ServerInfo_User *userInfo) void TabSupervisor::startLocal(const QList &_clients) { + userInfo = new ServerInfo_User; localClients = _clients; for (int i = 0; i < localClients.size(); ++i) connect(localClients[i], SIGNAL(gameEventContainerReceived(GameEventContainer *)), this, SLOT(processGameEventContainer(GameEventContainer *))); @@ -192,6 +192,9 @@ void TabSupervisor::stop() while (messageIterator.hasNext()) messageIterator.next().value()->deleteLater(); messageTabs.clear(); + + delete userInfo; + userInfo = 0; } void TabSupervisor::updatePingTime(int value, int max) @@ -221,7 +224,7 @@ void TabSupervisor::addCloseButtonToTab(Tab *tab, int tabIndex) void TabSupervisor::gameJoined(Event_GameJoined *event) { - TabGame *tab = new TabGame(this, QList() << client, event->getGameId(), event->getGameDescription(), event->getPlayerId(), userName, event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); + TabGame *tab = new TabGame(this, QList() << client, event->getGameId(), event->getGameDescription(), event->getPlayerId(), userInfo, event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *))); connect(tab, SIGNAL(openMessageDialog(const QString &, bool)), this, SLOT(addMessageTab(const QString &, bool))); int tabIndex = myAddTab(tab); @@ -232,7 +235,7 @@ void TabSupervisor::gameJoined(Event_GameJoined *event) void TabSupervisor::localGameJoined(Event_GameJoined *event) { - TabGame *tab = new TabGame(this, localClients, event->getGameId(), event->getGameDescription(), event->getPlayerId(), QString(), event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); + TabGame *tab = new TabGame(this, localClients, event->getGameId(), event->getGameDescription(), event->getPlayerId(), userInfo, event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming()); connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *))); int tabIndex = myAddTab(tab); addCloseButtonToTab(tab, tabIndex); @@ -258,7 +261,7 @@ void TabSupervisor::gameLeft(TabGame *tab) void TabSupervisor::addRoomTab(ServerInfo_Room *info, bool setCurrent) { - TabRoom *tab = new TabRoom(this, client, userName, info); + TabRoom *tab = new TabRoom(this, client, userInfo->getName(), info); connect(tab, SIGNAL(roomClosing(TabRoom *)), this, SLOT(roomLeft(TabRoom *))); connect(tab, SIGNAL(openMessageDialog(const QString &, bool)), this, SLOT(addMessageTab(const QString &, bool))); int tabIndex = myAddTab(tab); @@ -278,10 +281,10 @@ void TabSupervisor::roomLeft(TabRoom *tab) TabMessage *TabSupervisor::addMessageTab(const QString &receiverName, bool focus) { - if (receiverName == userName) + if (receiverName == userInfo->getName()) return 0; - TabMessage *tab = new TabMessage(this, client, userName, receiverName); + TabMessage *tab = new TabMessage(this, client, userInfo->getName(), receiverName); connect(tab, SIGNAL(talkClosing(TabMessage *)), this, SLOT(talkLeft(TabMessage *))); int tabIndex = myAddTab(tab); addCloseButtonToTab(tab, tabIndex); @@ -372,3 +375,8 @@ bool TabSupervisor::getAdminLocked() const return true; return tabAdmin->getLocked(); } + +int TabSupervisor::getUserLevel() const +{ + return userInfo->getUserLevel(); +} diff --git a/cockatrice/src/tab_supervisor.h b/cockatrice/src/tab_supervisor.h index 5d7a2c9b..0a38d5f8 100644 --- a/cockatrice/src/tab_supervisor.h +++ b/cockatrice/src/tab_supervisor.h @@ -37,8 +37,7 @@ protected: class TabSupervisor : public QTabWidget { Q_OBJECT private: - QString userName; - int userLevel; + ServerInfo_User *userInfo; QIcon *tabChangedIcon; AbstractClient *client; QList localClients; @@ -61,7 +60,7 @@ public: int getGameCount() const { return gameTabs.size(); } TabUserLists *getUserListsTab() const { return tabUserLists; } bool getAdminLocked() const; - int getUserLevel() const { return userLevel; } + int getUserLevel() const; signals: void setMenu(QMenu *menu); void localGameEnded(); diff --git a/cockatrice/translations/cockatrice_cs.ts b/cockatrice/translations/cockatrice_cs.ts index 9a24bb02..fd328067 100644 --- a/cockatrice/translations/cockatrice_cs.ts +++ b/cockatrice/translations/cockatrice_cs.ts @@ -230,202 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - + &Draw arrow... - + &Power / toughness - + &Increase power - + Ctrl++ - + &Decrease power - + Ctrl+- - + I&ncrease toughness - + Alt++ - + D&ecrease toughness - + Alt+- - + In&crease power and toughness - + Ctrl+Alt++ - + Dec&rease power and toughness - + Ctrl+Alt+- - + Set &power and toughness... - + Ctrl+P - + &Set annotation... - + red - + yellow - + green - + &Add counter (%1) - + &Remove counter (%1) - + &Set counters (%1)... - + &top of library - + &bottom of library - + &graveyard - + Ctrl+Del - + &exile - + &Move to @@ -1208,7 +1208,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1216,86 +1215,87 @@ This is only saved for moderators and cannot be seen by the banned person. + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator @@ -1684,118 +1684,183 @@ Local version is %1, remote version is %2. MessageLogWidget - - Connecting to %1... - - - - - Connected. - - - - - Disconnected from server. - - - - - Invalid password. - - - - - Protocol version mismatch. Client: %1, Server: %2 - - - - - Protocol error. - - - - - You have joined game #%1. - - - - - %1 has joined the game. - - - - - %1 has left the game. - - - - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - - %1 has loaded a local deck. - - - - - %1 has loaded deck #%2. - - - - - %1 is ready to start the game. - - - - - %1 is not ready to start the game any more. - - - - - %1 has conceded the game. - - - - + The game has started. - + + You have joined game #%1. + female + + + + + You have joined game #%1. + male + + + + + %1 has joined the game. + female + + + + + %1 has joined the game. + male + + + + + %1 has left the game. + female + + + + + %1 has left the game. + male + + + + + %1 has loaded a local deck. + female + + + + + %1 has loaded a local deck. + male + + + + + %1 has loaded deck #%2. + female + + + + + %1 has loaded deck #%2. + male + + + + + %1 is ready to start the game. + female + + + + + %1 is ready to start the game. + male + + + + + %1 is not ready to start the game any more. + female + + + + + %1 is not ready to start the game any more. + male + + + + + %1 has conceded the game. + female + + + + + %1 has conceded the game. + male + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female - %1 has lost connection to the game. - - - - %1 shuffles %2. + male - + %1 rolls a %2 with a %3-sided die. + female + + + + + %1 rolls a %2 with a %3-sided die. + male - + %1 draws %n card(s). + female + + + + + + + + + %1 draws %n card(s). + male @@ -1803,189 +1868,200 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. + female + + + + + + + + + %1 takes a mulligan to %n. + male @@ -1994,74 +2070,620 @@ Local version is %1, remote version is %2. + %1 flips %2 face-down. + female + + + + + %1 flips %2 face-down. + male + + + + + %1 flips %2 face-up. + female + + + + + %1 flips %2 face-up. + male + + + + + %1 destroys %2. + female + + + + + %1 destroys %2. + male + + + + + %1 unattaches %2. + female + + + + + %1 unattaches %2. + male + + + + + %1 creates token: %2%3. + female + + + + + %1 creates token: %2%3. + male + + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + + + + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + + + + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + + + + + %1 sets counter %2 to %3 (%4%5). + male + + + + + %1 sets %2 to not untap normally. + female + + + + + %1 sets %2 to not untap normally. + male + + + + + %1 sets %2 to untap normally. + female + + + + + %1 sets %2 to untap normally. + male + + + + + %1 sets PT of %2 to %3. + female + + + + + %1 sets PT of %2 to %3. + male + + + + + %1 sets annotation of %2 to %3. + female + + + + + %1 sets annotation of %2 to %3. + male + + + + + %1 is looking at the top %2 cards %3. + female + + + + + %1 is looking at the top %2 cards %3. + male + + + + + %1 is looking at %2. + female + + + + + %1 is looking at %2. + male + + + + + %1 stops looking at %2. + female + + + + + %1 stops looking at %2. + male + + + + + %1 reveals %2 to %3. + p1 female, p2 female + + + + + %1 reveals %2 to %3. + p1 female, p2 male + + + + + %1 reveals %2 to %3. + p1 male, p2 female + + + + + %1 reveals %2 to %3. + p1 male, p2 male + + + + + %1 reveals %2. + female + + + + + %1 reveals %2. + male + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 randomly reveals %2%3. + female + + + + + %1 randomly reveals %2%3. + male + + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 reveals %2%3. + female + + + + + %1 reveals %2%3. + male + + + + + It is now %1's turn. + female + + + + + It is now %1's turn. + male + + + + %1 draws his initial hand. - + %1 draws her initial hand. - - %1 flips %2 face-down. - - - - - %1 flips %2 face-up. - - - - - %1 destroys %2. - - - - + %1 attaches %2 to %3's %4. + p1 female, p2 female - - %1 unattaches %2. + + %1 attaches %2 to %3's %4. + p1 female, p2 male - - %1 creates token: %2%3. + + %1 attaches %2 to %3's %4. + p1 male, p2 female - - %1 points from %2's %3 to %4. - - - - - %1 points from %2's %3 to %4's %5. + + %1 attaches %2 to %3's %4. + p1 male, p2 male - - %1 places %n %2 counter(s) on %3 (now %4). - - - - - - - - - %1 removes %n %2 counter(s) from %3 (now %4). - - - - - - - - + red @@ -2070,7 +2692,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2079,7 +2701,7 @@ Local version is %1, remote version is %2. - + green @@ -2088,162 +2710,62 @@ Local version is %1, remote version is %2. - - his permanents - - - - - her permanents - - - - - %1 %2 %3. - - - - - taps - - - - - untaps - - - - - %1 sets counter %2 to %3 (%4%5). - - - - - %1 sets %2 to not untap normally. - - - - - %1 sets %2 to untap normally. - - - - - %1 sets PT of %2 to %3. - - - - - %1 sets annotation of %2 to %3. - - - - - %1 is looking at the top %2 cards %3. - - - - - %1 is looking at %2. - - - - - %1 stops looking at %2. - - - - - %1 reveals %2 to %3. - - - - - %1 reveals %2. - - - - - %1 randomly reveals %2%3 to %4. - - - - - %1 randomly reveals %2%3. - - - - - %1 reveals %2%3 to %4. - - - - - %1 reveals %2%3. - - - - - It is now %1's turn. - - - - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -3234,67 +3756,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + %1's games - + User &details - + Direct &chat - + Show this user's &games - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 0b07c46f..cd581e18 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -279,57 +279,57 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic CardItem - + &Play &Ausspielen - + &Hide &Verstecken - + &Tap &Tappen - + &Untap E&nttappen - + Toggle &normal untapping N&ormales Enttappen umschalten - + &Flip &Umdrehen - + &Clone &Kopieren - + Ctrl+H Ctrl+H - + &Attach to card... &An Karte anlegen... - + Ctrl+A Ctrl+A - + Unattac&h &Von Karte lösen @@ -338,147 +338,147 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Kampfwerte setzen... - + &Draw arrow... &Pfeil zeichnen... - + &Power / toughness &Kampfwerte - + &Increase power &Stärke erhöhen - + Ctrl++ Ctrl++ - + &Decrease power S&tärke senken - + Ctrl+- Ctrl+- - + I&ncrease toughness &Widerstandskraft erhöhen - + Alt++ Alt++ - + D&ecrease toughness W&iderstandskraft senken - + Alt+- Alt+- - + In&crease power and toughness Stärke und Widerstandskraft &erhöhen - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Stärke und Widerstandskraft s&enken - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... &Kampfwerte setzen... - + Ctrl+P Ctrl+P - + &Set annotation... &Hinweis setzen... - + red rot - + yellow gelb - + green grün - + &Add counter (%1) Zählmarke &hinzufügen (%1) - + &Remove counter (%1) Zählmarke &entfernen (%1) - + &Set counters (%1)... Zählmarken &setzen (%1)... - + &top of library &auf die Bibliothek - + &bottom of library &unter die Bibliothek - + &graveyard in den &Friedhof - + Ctrl+Del Ctrl+Del - + &exile ins &Exil - + &Move to &Verschieben @@ -1952,17 +1952,16 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic GameSelector - + C&reate Spiel e&rstellen - + &Join &Teilnehmen - @@ -1970,6 +1969,7 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic + Error Fehler @@ -1978,67 +1978,67 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic XXX - + Please join the appropriate room first. Bitte betreten Sie erst den entsprechenden Raum. - + Wrong password. Falsches Passwort. - + Spectators are not allowed in this game. In diesem Spiel sind keine Zuschauer zugelassen. - + The game is already full. Das Spiel ist bereits voll. - + The game does not exist any more. Dieses Spiel gibt es nicht mehr. - + This game is only open to registered users. Dieses Spiel kann nur von registrierten Benutzern betreten werden. - + This game is only open to its creator's buddies. Dieses Spiel kann nur von Freunden des Erstellers betreten werden. - + You are being ignored by the creator of this game. Der Ersteller dieses Spiels ignoriert Sie. - + Join game Spiel beitreten - + Password: Passwort: - + Games Spiele - + Show &full games &Volle Spiele anzeigen - + Show &running games &Laufende Spiele anzeigen @@ -2047,7 +2047,7 @@ Dies wird nur für Moderatoren gespeichert und kann von der gebannten Person nic &Volle Spiele anzeigen - + J&oin as spectator &Zuschauen @@ -2491,24 +2491,20 @@ Lokale Version ist %1, Serverversion ist %2. MessageLogWidget - Connecting to %1... - Verbinde zu %1... + Verbinde zu %1... - Connected. - Verbunden. + Verbunden. - Disconnected from server. - Verbindung zum Server getrennt. + Verbindung zum Server getrennt. - Invalid password. - Ungültiges Passwort. + Ungültiges Passwort. You have joined the game. Player list: @@ -2547,8 +2543,8 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten - - + + a card eine Karte @@ -2605,7 +2601,7 @@ Lokale Version ist %1, Serverversion ist %2. %1s Sideboard - + The game has started. Das Spiel hat begonnen. @@ -2626,89 +2622,71 @@ Lokale Version ist %1, Serverversion ist %2. Protokollversion stimmt nicht überein. - - Protocol version mismatch. Client: %1, Server: %2 - - - - Protocol error. - Protokollfehler. + Protokollfehler. - You have joined game #%1. - Sie sind dem Spiel %1 beigetreten. + Sie sind dem Spiel %1 beigetreten. - %1 has joined the game. - %1 ist dem Spiel beigetreten. + %1 ist dem Spiel beigetreten. - %1 has left the game. - %1 hat das Spiel verlassen. + %1 hat das Spiel verlassen. - + The game has been closed. Das Spiel wurde geschlossen. - + %1 is now watching the game. %1 schaut nun dem Spiel zu. - + %1 is not watching the game any more. %1 schaut dem Spiel nicht mehr zu. - %1 has loaded a local deck. - %1 hat ein lokales Deck geladen. + %1 hat ein lokales Deck geladen. - %1 has loaded deck #%2. - %1 hat das Deck Nr. %2 geladen. + %1 hat das Deck Nr. %2 geladen. - %1 is ready to start the game. - %1 ist bereit, das Spiel zu starten. + %1 ist bereit, das Spiel zu starten. - %1 is not ready to start the game any more. - %1 ist nicht mehr bereit, das Spiel zu starten. + %1 ist nicht mehr bereit, das Spiel zu starten. - %1 has conceded the game. - %1 hat das Spiel aufgegeben. + %1 hat das Spiel aufgegeben. - %1 has restored connection to the game. - %1 ist wieder mit dem Spiel verbunden. + %1 ist wieder mit dem Spiel verbunden. - %1 has lost connection to the game. - %1 hat die Verbindung zum Spiel verloren. + %1 hat die Verbindung zum Spiel verloren. - %1 shuffles %2. - %1 mischt %2. + %1 mischt %2. - %1 rolls a %2 with a %3-sided die. - %1 würfelt eine %2 mit einem %3-seitigen Würfel. + %1 würfelt eine %2 mit einem %3-seitigen Würfel. %1 draws a card. @@ -2719,191 +2697,362 @@ Lokale Version ist %1, Serverversion ist %2. %1 zieht %2 Karten. - %1 draws %n card(s). + + %1 zieht eine Karte. + %1 zieht %n Karten. + + + + + You have joined game #%1. + female + Sie sind dem Spiel %1 beigetreten. + + + + You have joined game #%1. + male + Sie sind dem Spiel %1 beigetreten. + + + + %1 has joined the game. + female + %1 ist dem Spiel beigetreten. + + + + %1 has joined the game. + male + %1 ist dem Spiel beigetreten. + + + + %1 has left the game. + female + %1 hat das Spiel verlassen. + + + + %1 has left the game. + male + %1 hat das Spiel verlassen. + + + + %1 has loaded a local deck. + female + %1 hat ein lokales Deck geladen. + + + + %1 has loaded a local deck. + male + %1 hat ein lokales Deck geladen. + + + + %1 has loaded deck #%2. + female + %1 hat das Deck Nr. %2 geladen. + + + + %1 has loaded deck #%2. + male + %1 hat das Deck Nr. %2 geladen. + + + + %1 is ready to start the game. + female + %1 ist bereit, das Spiel zu starten. + + + + %1 is ready to start the game. + male + %1 ist bereit, das Spiel zu starten. + + + + %1 is not ready to start the game any more. + female + %1 ist nicht mehr bereit, das Spiel zu starten. + + + + %1 is not ready to start the game any more. + male + %1 ist nicht mehr bereit, das Spiel zu starten. + + + + %1 has conceded the game. + female + %1 hat das Spiel aufgegeben. + + + + %1 has conceded the game. + male + %1 hat das Spiel aufgegeben. + + + + %1 has restored connection to the game. + female + %1 ist wieder mit dem Spiel verbunden. + + + + %1 has restored connection to the game. + male + %1 ist wieder mit dem Spiel verbunden. + + + + %1 has lost connection to the game. + female + %1 hat die Verbindung zum Spiel verloren. + + + + %1 has lost connection to the game. + male + %1 hat die Verbindung zum Spiel verloren. + + + + %1 shuffles %2. + female + %1 mischt %2. + + + + %1 shuffles %2. + male + %1 mischt %2. + + + + %1 rolls a %2 with a %3-sided die. + female + %1 würfelt eine %2 mit einem %3-seitigen Würfel. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 würfelt eine %2 mit einem %3-seitigen Würfel. + + + + %1 draws %n card(s). + female + + %1 zieht eine Karte. + %1 zieht %n Karten. + + + + + %1 draws %n card(s). + male %1 zieht eine Karte. %1 zieht %n Karten. - + %1 undoes his last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes her last draw. %1 legt die zuletzt gezogene Karte zurück. - + %1 undoes his last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + %1 undoes her last draw (%2). %1 legt die zuletzt gezogene Karte zurück (%2). - + from table vom Spielfeld - + from graveyard aus dem Friedhof - + from exile aus dem Exil - + from hand von der Hand - + the bottom card of his library die unterste Karte seiner Bibliothek - + the bottom card of her library die unterste Karte ihrer Bibliothek - + from the bottom of his library , die unterste Karte seiner Bibliothek, - + from the bottom of her library , die unterste Karte ihrer Bibliothek, - + the top card of his library die oberste Karte seiner Bibliothek - + the top card of her library die oberste Karte ihrer Bibliothek - + from the top of his library , die oberste Karte seiner Bibliothek, - + from the top of her library , die oberste Karte ihrer Bibliothek, - + from library aus der Bibliothek - + from sideboard aus dem Sideboard - + from the stack vom Stapel - + %1 gives %2 control over %3. %1 überlässt %2 die Kontrolle über %3. - + %1 puts %2 into play tapped%3. %1 bringt %2 getappt%3 ins Spiel. - + %1 puts %2 into play%3. %1 bringt %2%3 ins Spiel. - + %1 puts %2%3 into graveyard. %1 legt %2%3 auf den Friedhof. - + %1 exiles %2%3. %1 schickt %2%3 ins Exil. - + %1 moves %2%3 to hand. %1 nimmt %2%3 auf die Hand. - + %1 puts %2%3 into his library. %1 legt %2%3 in seine Bibliothek. - + %1 puts %2%3 into her library. %1 legt %2%3 in ihre Bibliothek. - + %1 puts %2%3 on bottom of his library. %1 legt %2%3 unter seine Bibliothek. - + %1 puts %2%3 on bottom of her library. %1 legt %2%3 unter ihre Bibliothek. - + %1 puts %2%3 on top of his library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 on top of her library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 into his library at position %4. %1 legt %2%3 in seine Bibliothek an %4. Stelle. - + %1 puts %2%3 into her library at position %4. %1 legt %2%3 in ihre Bibliothek an %4. Stelle. - + %1 moves %2%3 to sideboard. %1 legt %2%3 in sein Sideboard. - + %1 plays %2%3. %1 spielt %2%3 aus. - + %1 takes a mulligan to %n. + female + + %1 nimmt einen Mulligan auf %n. + %1 nimmt einen Mulligan auf %n. + + + + + %1 takes a mulligan to %n. + male %1 nimmt einen Mulligan auf %n. %1 nimmt einen Mulligan auf %n. @@ -2911,98 +3060,700 @@ Lokale Version ist %1, Serverversion ist %2. - %1 draws his initial hand. - %1 zieht seine Starthand. - - - - %1 draws her initial hand. - %1 zieht ihre Starthand. - - - %1 flips %2 face-down. + female %1 wendet %2 auf die Rückseite. - + + %1 flips %2 face-down. + male + %1 wendet %2 auf die Rückseite. + + + %1 flips %2 face-up. + female %1 wendet %2 auf die Vorderseite. - + + %1 flips %2 face-up. + male + %1 wendet %2 auf die Vorderseite. + + + %1 destroys %2. + female + %1 zerstört %2. + + + + %1 destroys %2. + male %1 zerstört %2. - %1 attaches %2 to %3's %4. + female + %1 legt %2 an %3s %4 an. + + + %1 attaches %2 to %3's %4. + male + %1 legt %2 an %3s %4 an. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female %1 legt %2 an %3s %4 an. - + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 legt %2 an %3s %4 an. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 legt %2 an %3s %4 an. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 legt %2 an %3s %4 an. + + + %1 unattaches %2. + female %1 löst %2 ab. - + + %1 unattaches %2. + male + %1 löst %2 ab. + + + %1 creates token: %2%3. + female %1 erstellt Token: %2%3. - + + %1 creates token: %2%3. + male + %1 erstellt Token: %2%3. + + + + %1 points from her %2 to herself. + female + %1 zeigt von ihrem %2 auf sich selbst. + + + + %1 points from his %2 to himself. + male + %1 zeigt von seinem %2 auf sich selbst. + + + + %1 points from her %2 to %3. + p1 female, p2 female + %1 zeigt von ihrem %2 auf %3. + + + + %1 points from her %2 to %3. + p1 female, p2 male + %1 zeigt von ihrem %2 auf %3. + + + + %1 points from his %2 to %3. + p1 male, p2 female + %1 zeigt von seinem %2 auf %3. + + + + %1 points from his %2 to %3. + p1 male, p2 male + %1 zeigt von seinem %2 auf %3. + + + + %1 points from %2's %3 to herself. + card owner female, target female + %1 zeigt von %2s %3 auf sich selbst. + + + + %1 points from %2's %3 to herself. + card owner male, target female + %1 zeigt von %2s %3 auf sich selbst. + + + + %1 points from %2's %3 to himself. + card owner female, target male + %1 zeigt von %2s %3 auf sich selbst. + + + + %1 points from %2's %3 to himself. + card owner male, target male + %1 zeigt von %2s %3 auf sich selbst. + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female %1 zeigt von %2s %3 auf %4. + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 zeigt von %2s %3 auf %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 zeigt von %2s %3 auf %4. + + + + %1 points from her %2 to her %3. + female + %1 zeigt von ihrem %2 auf ihren %3. + + + + %1 points from his %2 to his %3. + male + %1 zeigt von seinem %2 auf seinen %3. + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + %1 zeigt von ihrem %2 auf %3s %4. + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + %1 zeigt von ihrem %2 auf %3s %4. + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + %1 zeigt von seinem %2 auf %3s %4. + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + %1 zeigt von seinem %2 auf %3s %4. + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + %1 zeigt von %2s %3 auf ihren eigenen %4. + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + %1 zeigt von %2s %3 auf ihren eigenen %4. + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + %1 zeigt von %2s %3 auf seinen eigenen %4. + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + %1 zeigt von %2s %3 auf seinen eigenen %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 zeigt von %2s %3 auf %4s %5. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 zeigt von %2s %3 auf %4s %5. + - + %1 places %n %2 counter(s) on %3 (now %4). + female %1 legt eine %2 Marke auf %3 (jetzt %4). %1 legt %n %2 Marken auf %3 (jetzt %4). - + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 legt eine %2 Marke auf %3 (jetzt %4). + %1 legt %n %2 Marken auf %3 (jetzt %4). + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 entfernt eine %2 Marke von %3 (jetzt %4). + %1 entfernt %n %2 Marken von %3 (jetzt %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male %1 entfernt eine %2 Marke von %3 (jetzt %4). %1 entfernt %n %2 Marken von %3 (jetzt %4). - - her permanents - ihre bleibenden Karten + + %1 taps her permanents. + female + %1 tappt ihre bleibenden Karten. - + + %1 untaps her permanents. + female + %1 enttappt ihre bleibenden Karten. + + + + %1 taps his permanents. + male + %1 tappt seine bleibenden Karten. + + + + %1 untaps his permanents. + male + %1 enttappt seine bleibenden Karten. + + + + %1 taps %2. + female + %1 tappt %2. + + + + %1 untaps %2. + female + %1 enttappt %2. + + + + %1 taps %2. + male + %1 tappt %2. + + + + %1 untaps %2. + male + %1 enttappt %2. + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 setzt Zähler %2 auf %3 (%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 setzt Zähler %2 auf %3 (%4%5). + + + + %1 sets %2 to not untap normally. + female + %1 setzt %2 auf explizites Enttappen. + + + + %1 sets %2 to not untap normally. + male + %1 setzt %2 auf explizites Enttappen. + + + + %1 sets %2 to untap normally. + female + %1 setzt %2 auf normales Enttappen. + + + + %1 sets %2 to untap normally. + male + %1 setzt %2 auf normales Enttappen. + + + + %1 sets PT of %2 to %3. + female + %1 setzt Kampfwerte von %2 auf %3. + + + + %1 sets PT of %2 to %3. + male + %1 setzt Kampfwerte von %2 auf %3. + + + + %1 sets annotation of %2 to %3. + female + %1 versieht %2 mit dem Hinweis %3. + + + + %1 sets annotation of %2 to %3. + male + %1 versieht %2 mit dem Hinweis %3. + + + + %1 is looking at the top %2 cards %3. + female + %1 sieht sich die obersten %2 Karten %3 an. + + + + %1 is looking at the top %2 cards %3. + male + %1 sieht sich die obersten %2 Karten %3 an. + + + + %1 is looking at %2. + female + %1 sieht sich %2 an. + + + + %1 is looking at %2. + male + %1 sieht sich %2 an. + + + + %1 stops looking at %2. + female + %1 sieht sich %2 nicht mehr an. + + + + %1 stops looking at %2. + male + %1 sieht sich %2 nicht mehr an. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 zeigt %3 %2. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 zeigt %3 %2. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 zeigt %3 %2. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 zeigt %3 %2. + + + + %1 reveals %2. + female + %1 zeigt %2 offen vor. + + + + %1 reveals %2. + male + %1 zeigt %2 offen vor. + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female %1 zeigt %4 zufällig %2%3 vor. - + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 zeigt %4 zufällig %2%3 vor. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 zeigt %4 zufällig %2%3 vor. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 zeigt %4 zufällig %2%3 vor. + + + %1 randomly reveals %2%3. + female %1 zeigt zufällig %2%3 offen vor. - + + %1 randomly reveals %2%3. + male + %1 zeigt zufällig %2%3 offen vor. + + + %1 reveals %2%3 to %4. + p1 female, p2 female %1 zeigt %4 %2%3 vor. - + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 zeigt %4 %2%3 vor. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 zeigt %4 %2%3 vor. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 zeigt %4 %2%3 vor. + + + %1 reveals %2%3. + female %1 zeigt %2%3 offen vor. + + + %1 reveals %2%3. + male + %1 zeigt %2%3 offen vor. + + + + It is now %1's turn. + female + %1 ist am Zug. + + + + It is now %1's turn. + male + %1 ist am Zug. + + + %1 takes a mulligan to %n. + + %1 nimmt einen Mulligan auf %n. + %1 nimmt einen Mulligan auf %n. + + + + + %1 draws his initial hand. + %1 zieht seine Starthand. + + + + %1 draws her initial hand. + %1 zieht ihre Starthand. + + + %1 flips %2 face-down. + %1 wendet %2 auf die Rückseite. + + + %1 flips %2 face-up. + %1 wendet %2 auf die Vorderseite. + + + %1 destroys %2. + %1 zerstört %2. + + + %1 attaches %2 to %3's %4. + %1 legt %2 an %3s %4 an. + + + %1 unattaches %2. + %1 löst %2 ab. + + + %1 creates token: %2%3. + %1 erstellt Token: %2%3. + + + %1 points from %2's %3 to %4. + %1 zeigt von %2s %3 auf %4. + + + %1 places %n %2 counter(s) on %3 (now %4). + + %1 legt eine %2 Marke auf %3 (jetzt %4). + %1 legt %n %2 Marken auf %3 (jetzt %4). + + + + %1 removes %n %2 counter(s) from %3 (now %4). + + %1 entfernt eine %2 Marke von %3 (jetzt %4). + %1 entfernt %n %2 Marken von %3 (jetzt %4). + + + + her permanents + ihre bleibenden Karten + + + %1 randomly reveals %2%3 to %4. + %1 zeigt %4 zufällig %2%3 vor. + + + %1 randomly reveals %2%3. + %1 zeigt zufällig %2%3 offen vor. + + + %1 reveals %2%3 to %4. + %1 zeigt %4 %2%3 vor. + + + %1 reveals %2%3. + %1 zeigt %2%3 offen vor. + %1 creates token: %2 (%3). %1 erstellt einen Spielstein: %2 (%3). - %1 points from %2's %3 to %4's %5. - %1 zeigt von %2s %3 auf %4s %5. + %1 zeigt von %2s %3 auf %4s %5. %1 places %n counter(s) (%2) on %3 (now %4). @@ -3019,7 +3770,7 @@ Lokale Version ist %1, Serverversion ist %2. - + red rote @@ -3027,7 +3778,7 @@ Lokale Version ist %1, Serverversion ist %2. - + yellow gelbe @@ -3035,7 +3786,7 @@ Lokale Version ist %1, Serverversion ist %2. - + green grüne @@ -3043,24 +3794,20 @@ Lokale Version ist %1, Serverversion ist %2. - %1 sets counter %2 to %3 (%4%5). - %1 setzt Zähler %2 auf %3 (%4%5). + %1 setzt Zähler %2 auf %3 (%4%5). - %1 sets PT of %2 to %3. - %1 setzt Kampfwerte von %2 auf %3. + %1 setzt Kampfwerte von %2 auf %3. - %1 sets annotation of %2 to %3. - %1 versieht %2 mit dem Hinweis %3. + %1 versieht %2 mit dem Hinweis %3. - %1 is looking at the top %2 cards %3. - %1 sieht sich die obersten %2 Karten %3 an. + %1 sieht sich die obersten %2 Karten %3 an. from graveyard @@ -3155,9 +3902,8 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4). - %1 %2 %3. - %1 %2 %3. + %1 %2 %3. %1 sets counter "%2" to %3 (%4%5). @@ -3168,24 +3914,20 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich die obersten %2 Karten %3 an. - %1 is looking at %2. - %1 sieht sich %2 an. + %1 sieht sich %2 an. - %1 stops looking at %2. - %1 sieht sich %2 nicht mehr an. + %1 sieht sich %2 nicht mehr an. - %1 reveals %2 to %3. - %1 zeigt %3 %2. + %1 zeigt %3 %2. - %1 reveals %2. - %1 zeigt %2 offen vor. + %1 zeigt %2 offen vor. %1 randomly reveals %2 from %3 to %4. @@ -3204,7 +3946,7 @@ Lokale Version ist %1, Serverversion ist %2. %1 zeigt %2 aus %3 offen vor. - + ending phase die Zugendphase @@ -3233,57 +3975,56 @@ Lokale Version ist %1, Serverversion ist %2. %1 sieht sich %2s %3 nicht mehr an - It is now %1's turn. - %1 ist am Zug. + %1 ist am Zug. - + untap step das Enttappsegment - + upkeep step das Versorgungssegment - + draw step das Ziehsegment - + first main phase die erste Hauptphase - + beginning of combat step das Anfangssegment der Kampfphase - + declare attackers step das Angreifer-Deklarieren-Segment - + declare blockers step das Blocker-Deklarieren-Segment - + combat damage step das Kampfschadenssegment - + end of combat step das Endsegment der Kampfphase - + second main phase die zweite Hauptphase @@ -3292,7 +4033,7 @@ Lokale Version ist %1, Serverversion ist %2. das Ende-des-Zuges-Segment - + It is now the %1. Es ist nun %1. @@ -3301,14 +4042,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 bewegt %2 %3 nach %4 - taps - tappt + tappt - untaps - enttappt + enttappt %1 creates token: <font color="blue">%2</font> @@ -3331,9 +4070,8 @@ Lokale Version ist %1, Serverversion ist %2. %1 entfernt %2 Zählmarken von %3 (jetzt %4) - his permanents - seine bleibenden Karten + seine bleibenden Karten %1 %2 %3 @@ -3344,14 +4082,12 @@ Lokale Version ist %1, Serverversion ist %2. %1 setzt Zähler "%2" auf %3 (%4%5) - %1 sets %2 to not untap normally. - %1 setzt %2 auf explizites Enttappen. + %1 setzt %2 auf explizites Enttappen. - %1 sets %2 to untap normally. - %1 setzt %2 auf normales Enttappen. + %1 setzt %2 auf normales Enttappen. %1 is looking at the top %2 cards of %3's %4 @@ -4638,67 +5374,67 @@ Bitte geben Sie einen Namen ein: UserList - + Users online: %1 Benutzer online: %1 - + Users in this room: %1 Benutzer in diesem Raum: %1 - + Buddies online: %1 / %2 Freunde online: %1 / %2 - + Ignored users online: %1 / %2 Ignorierte Benutzer online: %1 / %2 - + %1's games %1s Spiele - + User &details Benutzer&details - + Direct &chat &Persönliches Gespräch - + Show this user's &games Spiele dieses &Benutzers anzeigen - + Add to &buddy list Zur &Freundesliste hinzufügen - + Remove from &buddy list Von &Freundesliste entfernen - + Add to &ignore list &Ignorieren - + Remove from &ignore list Nicht mehr &ignorieren - + Ban from &server Vom &Server bannen diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index e6cc8293..4c6421f1 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -230,202 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - + &Draw arrow... - + &Power / toughness - + &Increase power - + Ctrl++ - + &Decrease power - + Ctrl+- - + I&ncrease toughness - + Alt++ - + D&ecrease toughness - + Alt+- - + In&crease power and toughness - + Ctrl+Alt++ - + Dec&rease power and toughness - + Ctrl+Alt+- - + Set &power and toughness... - + Ctrl+P - + &Set annotation... - + red - + yellow - + green - + &Add counter (%1) - + &Remove counter (%1) - + &Set counters (%1)... - + &top of library - + &bottom of library - + &graveyard - + Ctrl+Del - + &exile - + &Move to @@ -1208,17 +1208,16 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate - + &Join - @@ -1226,76 +1225,77 @@ This is only saved for moderators and cannot be seen by the banned person. + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + J&oin as spectator @@ -1683,277 +1683,962 @@ Local version is %1, remote version is %2. MessageLogWidget - - Connecting to %1... - - - - - Disconnected from server. - - - - - Invalid password. - - - - - Protocol error. - - - - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - - - %1 is not ready to start the game any more. - - - - - %1 has restored connection to the game. - - - - - %1 has lost connection to the game. - - - - - %1 shuffles %2. - - - - - %1 rolls a %2 with a %3-sided die. - - - %1 draws %n card(s). - + %1 draws a card. %1 draws %n cards. - + + You have joined game #%1. + female + + + + + You have joined game #%1. + male + + + + + %1 has joined the game. + female + + + + + %1 has joined the game. + male + + + + + %1 has left the game. + female + + + + + %1 has left the game. + male + + + + + %1 has loaded a local deck. + female + + + + + %1 has loaded a local deck. + male + + + + + %1 has loaded deck #%2. + female + + + + + %1 has loaded deck #%2. + male + + + + + %1 is ready to start the game. + female + + + + + %1 is ready to start the game. + male + + + + + %1 is not ready to start the game any more. + female + + + + + %1 is not ready to start the game any more. + male + + + + + %1 has conceded the game. + female + + + + + %1 has conceded the game. + male + + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female + + + + + %1 shuffles %2. + male + + + + + %1 rolls a %2 with a %3-sided die. + female + + + + + %1 rolls a %2 with a %3-sided die. + male + + + + + %1 draws %n card(s). + female + + %1 draws a card. + %1 draws %n cards. + + + + + %1 draws %n card(s). + male + + %1 draws a card. + %1 draws %n cards. + + + + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - - - a card - + + + %1 takes a mulligan to %n. + female + + + + + + + + %1 takes a mulligan to %n. + male + + + + - + %1 flips %2 face-down. + female - + + %1 flips %2 face-down. + male + + + + %1 flips %2 face-up. + female - - %1 attaches %2 to %3's %4. + + %1 flips %2 face-up. + male - + + %1 destroys %2. + female + + + + + %1 destroys %2. + male + + + + %1 unattaches %2. + female - + + %1 unattaches %2. + male + + + + + %1 creates token: %2%3. + female + + + + + %1 creates token: %2%3. + male + + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + %1 places a %2 counter on %3 (now %4). + %1 places %n %2 counters on %3 (now %4). + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 places a %2 counter on %3 (now %4). + %1 places %n %2 counters on %3 (now %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 removes a %2 counter from %3 (now %4). + %1 removes %n %2 counters from %3 (now %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + %1 removes a %2 counter from %3 (now %4). + %1 removes %n %2 counters from %3 (now %4). + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + + + + + %1 sets counter %2 to %3 (%4%5). + male + + + + + %1 sets %2 to not untap normally. + female + + + + + %1 sets %2 to not untap normally. + male + + + + + %1 sets %2 to untap normally. + female + + + + + %1 sets %2 to untap normally. + male + + + + + %1 sets PT of %2 to %3. + female + + + + + %1 sets PT of %2 to %3. + male + + + + + %1 sets annotation of %2 to %3. + female + + + + + %1 sets annotation of %2 to %3. + male + + + + + %1 is looking at the top %2 cards %3. + female + + + + + %1 is looking at the top %2 cards %3. + male + + + + + %1 is looking at %2. + female + + + + + %1 is looking at %2. + male + + + + + %1 stops looking at %2. + female + + + + + %1 stops looking at %2. + male + + + + + %1 reveals %2 to %3. + p1 female, p2 female + + + + + %1 reveals %2 to %3. + p1 female, p2 male + + + + + %1 reveals %2 to %3. + p1 male, p2 female + + + + + %1 reveals %2 to %3. + p1 male, p2 male + + + + + %1 reveals %2. + female + + + + + %1 reveals %2. + male + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 randomly reveals %2%3. + female + + + + + %1 randomly reveals %2%3. + male + + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 reveals %2%3. + female + + + + + %1 reveals %2%3. + male + + + + + It is now %1's turn. + female + + + + + It is now %1's turn. + male + + + + + + a card @@ -1971,7 +2656,7 @@ Local version is %1, remote version is %2. - + red @@ -1979,7 +2664,7 @@ Local version is %1, remote version is %2. - + yellow @@ -1987,7 +2672,7 @@ Local version is %1, remote version is %2. - + green @@ -1995,264 +2680,118 @@ Local version is %1, remote version is %2. - - %1 sets counter %2 to %3 (%4%5). - - - - - %1 sets PT of %2 to %3. - - - - - %1 sets annotation of %2 to %3. - - - - - %1 is looking at the top %2 cards %3. - - - - + The game has started. - - Connected. - - - - - Protocol version mismatch. Client: %1, Server: %2 - - - - - You have joined game #%1. - - - - - %1 has joined the game. - - - - - %1 has left the game. - - - - - %1 has loaded a local deck. - - - - - %1 has loaded deck #%2. - - - - - %1 is ready to start the game. - - - - - %1 has conceded the game. - - - - - %1 takes a mulligan to %n. - - - - - - - + %1 draws his initial hand. - + %1 draws her initial hand. - - - %1 destroys %2. - - - - - %1 creates token: %2%3. - - - - - %1 points from %2's %3 to %4. - - - %1 places %n %2 counter(s) on %3 (now %4). - + %1 places a %2 counter on %3 (now %4). %1 places %n %2 counters on %3 (now %4). - %1 removes %n %2 counter(s) from %3 (now %4). - + %1 removes a %2 counter from %3 (now %4). %1 removes %n %2 counters from %3 (now %4). - - her permanents - - - - - %1 %2 %3. - - - - - %1 is looking at %2. - - - - - %1 stops looking at %2. - - - - - %1 reveals %2 to %3. - - - - - %1 reveals %2. - - - - + ending phase - - It is now %1's turn. - - - - - %1 randomly reveals %2%3 to %4. - - - - - %1 randomly reveals %2%3. - - - - - %1 reveals %2%3 to %4. - - - - - %1 reveals %2%3. - - - - + untap step - + + %1 attaches %2 to %3's %4. + p1 female, p2 female + + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + + + + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - - - taps - - - - - untaps - - - - - %1 sets %2 to not untap normally. - - - - - %1 sets %2 to untap normally. - - - - - his permanents - - MessagesSettingsPage @@ -3240,67 +3779,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + %1's games - + User &details - + Direct &chat - + Show this user's &games - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 100047e4..cee81068 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -239,57 +239,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jugar - + &Hide &Ocultar - + &Tap &Girar - + &Untap &Enderezar - + Toggle &normal untapping Alternar enderezamiento &normal - + &Flip &Voltear - + &Clone &Clonar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar a una carta... - + Ctrl+A Ctrl+A - + Unattac&h Desane&xar @@ -298,147 +298,147 @@ This is only saved for moderators and cannot be seen by the banned person.Establecer &F/R... - + &Draw arrow... - + &Power / toughness &Fuerza / resistencia - + &Increase power &Incrementar fuerza - + Ctrl++ Ctrl++ - + &Decrease power &Decrementar fuerza - + Ctrl+- Ctrl+- - + I&ncrease toughness I&ncrementar resistencia - + Alt++ Alt++ - + D&ecrease toughness D&ecrementar resistencia - + Alt+- Alt+- - + In&crease power and toughness In&crementar fuerza y resistencia - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Dec&rementar fuerza y resistencia - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Establecer &fuerza y resistencia... - + Ctrl+P Ctrl+P - + &Set annotation... E&scribir anotación... - + red rojo - + yellow amarillo - + green verde - + &Add counter (%1) &Añadir contador (%1) - + &Remove counter (%1) &Quitar contador (%1) - + &Set counters (%1)... E&stablecer contadores (%1)... - + &top of library &parte superior de la biblioteca - + &bottom of library &fondo de la biblioteca - + &graveyard &cementerio - + Ctrl+Del Ctrl+Del - + &exile &exilio - + &Move to &Mover a @@ -1570,17 +1570,16 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate C&rear - + &Join E&ntrar - @@ -1588,71 +1587,72 @@ This is only saved for moderators and cannot be seen by the banned person. + Error Error - + Please join the appropriate room first. - + Wrong password. Contraseña incorrecta. - + Spectators are not allowed in this game. No se permiten espectadores en esta partida. - + The game is already full. La partida no tiene plazas libres. - + The game does not exist any more. La partida ya no existe. - + This game is only open to registered users. Esta partida está abierta sólo a usuarios registrados. - + This game is only open to its creator's buddies. Esta partida está abierta sólo a los amigos del creador. - + You are being ignored by the creator of this game. Estas siendo ignorado por el creador de la partida. - + Join game Entrar en la partida - + Password: Contraseña: - + Games Partidas - + Show &full games Ver partidas &sin plazas libres - + Show &running games @@ -1661,7 +1661,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Ver partidas sin plazas libres - + J&oin as spectator Entrar como e&spectador @@ -2057,278 +2057,1041 @@ La versión local es %1, la versión remota es %2. MessageLogWidget - Connecting to %1... - Conectando a %1... + Conectando a %1... - Disconnected from server. - Desconectado del servidor. + Desconectado del servidor. - Invalid password. - Contraseña incorrecta. + Contraseña incorrecta. - Protocol error. - Error del protocolo. + Error del protocolo. - + The game has been closed. La partida ha sido cerrada. - + %1 is now watching the game. %1 está ahora observando la partida. - + %1 is not watching the game any more. %1 ya no está observado más la partida. - %1 is not ready to start the game any more. - %1 ya no está listo para empezar el juego. + %1 ya no está listo para empezar el juego. - - %1 has restored connection to the game. - - - - - %1 has lost connection to the game. - - - - - %1 shuffles %2. - - - - %1 rolls a %2 with a %3-sided die. - %1 sacó un %2 con un dado de %3 caras. + %1 sacó un %2 con un dado de %3 caras. - %1 draws %n card(s). - + %1 roba %n carta. %1 roba %n cartas. - + + You have joined game #%1. + female + Te has unido a la partida #%1. + + + + You have joined game #%1. + male + Te has unido a la partida #%1. + + + + %1 has joined the game. + female + %1 se ha unido a la partida. + + + + %1 has joined the game. + male + %1 se ha unido a la partida. + + + + %1 has left the game. + female + %1 ha dejado la partida. + + + + %1 has left the game. + male + %1 ha dejado la partida. + + + + %1 has loaded a local deck. + female + %1 ha cargado un mazo local. + + + + %1 has loaded a local deck. + male + %1 ha cargado un mazo local. + + + + %1 has loaded deck #%2. + female + %1 ha cargado el mazo #%2. + + + + %1 has loaded deck #%2. + male + %1 ha cargado el mazo #%2. + + + + %1 is ready to start the game. + female + %1 está preparado para empezar la partida. + + + + %1 is ready to start the game. + male + %1 está preparado para empezar la partida. + + + + %1 is not ready to start the game any more. + female + %1 ya no está listo para empezar el juego. + + + + %1 is not ready to start the game any more. + male + %1 ya no está listo para empezar el juego. + + + + %1 has conceded the game. + female + %1 ha concedido la partida. + + + + %1 has conceded the game. + male + %1 ha concedido la partida. + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female + + + + + %1 shuffles %2. + male + + + + + %1 rolls a %2 with a %3-sided die. + female + %1 sacó un %2 con un dado de %3 caras. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 sacó un %2 con un dado de %3 caras. + + + + %1 draws %n card(s). + female + + %1 roba %n carta. + %1 roba %n cartas. + + + + + %1 draws %n card(s). + male + + %1 roba %n carta. + %1 roba %n cartas. + + + + %1 undoes his last draw. %1 deshace su último robo. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 deshace su último robo (%2). - + %1 undoes her last draw (%2). - + from table de la mesa - + from graveyard del cementerio - + from exile del exilio - + from hand de la mano - + the bottom card of his library el fondo de la biblioteca - + the bottom card of her library - + from the bottom of his library del fondo de la biblioteca - + from the bottom of her library - + the top card of his library la parte superior de la biblioteca - + the top card of her library - + from the top of his library de la parte superior de la biblioteca - + from the top of her library - + from library de la biblioteca - + from sideboard de la reserva - + from the stack de la pila - + %1 gives %2 control over %3. %1 entrega a %2 el control sobre %3. - + %1 puts %2 into play tapped%3. %1 pone %2 en juego%3 girado. - + %1 puts %2 into play%3. %1 pone %2 en juego%3. - + %1 puts %2%3 into graveyard. %1 pone %2%3 en el cementerio. - + %1 exiles %2%3. %1 exilia %2%3. - + %1 moves %2%3 to hand. %1 mueve %2%3 a la mano. - + %1 puts %2%3 into his library. %1 pone %2%3 en la biblioteca. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 pone %2%3 en la parte inferior de su biblioteca. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 pone %2%3 en la parte superior de su biblioteca. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 pone %2%3 en su biblioteca en la posición %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 mueve %2%3 a la reserva. - + %1 plays %2%3. %1 juega %2%3. + + + %1 takes a mulligan to %n. + female + + + + + + + + %1 takes a mulligan to %n. + male + + + + + - - + + %1 flips %2 face-down. + female + %1 voltea %2 boca abajo. + + + + %1 flips %2 face-down. + male + %1 voltea %2 boca abajo. + + + + %1 flips %2 face-up. + female + %1 voltea %2 boca arriba. + + + + %1 flips %2 face-up. + male + %1 voltea %2 boca arriba. + + + + %1 destroys %2. + female + %1 destruye %2. + + + + %1 destroys %2. + male + %1 destruye %2. + + + %1 attaches %2 to %3's %4. + female + %1 anexa %2 a el %4 de %3. + + + %1 attaches %2 to %3's %4. + male + %1 anexa %2 a el %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female + %1 anexa %2 a el %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 anexa %2 a el %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 anexa %2 a el %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 anexa %2 a el %4 de %3. + + + + %1 unattaches %2. + female + %1 desanexa %2. + + + + %1 unattaches %2. + male + %1 desanexa %2. + + + + %1 creates token: %2%3. + female + %1 crea una ficha: %2%3. + + + + %1 creates token: %2%3. + male + %1 crea una ficha: %2%3. + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 apunta desde el %3 de %2 a %4. + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 apunta desde el %3 de %2 al %5 de %4. + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + %1 pone %n %2 contador en %3 (ahora %4). + %1 pone %n %2 contadores en %3 (ahora %4). + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 pone %n %2 contador en %3 (ahora %4). + %1 pone %n %2 contadores en %3 (ahora %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 remueve %n %2 contador en %3 (ahora %4). + %1 remueve %n %2 contadores en %3 (ahora %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + %1 remueve %n %2 contador en %3 (ahora %4). + %1 remueve %n %2 contadores en %3 (ahora %4). + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 establece los contadores de %2 a %3 (%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 establece los contadores de %2 a %3 (%4%5). + + + + %1 sets %2 to not untap normally. + female + %1 establece que %2 no se endereze normalmente. + + + + %1 sets %2 to not untap normally. + male + %1 establece que %2 no se endereze normalmente. + + + + %1 sets %2 to untap normally. + female + %1 establece que %2 se endereze normalmente. + + + + %1 sets %2 to untap normally. + male + %1 establece que %2 se endereze normalmente. + + + + %1 sets PT of %2 to %3. + female + %1 establece F/R de %2 a %3. + + + + %1 sets PT of %2 to %3. + male + %1 establece F/R de %2 a %3. + + + + %1 sets annotation of %2 to %3. + female + %1 establece la anotación de %2 a %3. + + + + %1 sets annotation of %2 to %3. + male + %1 establece la anotación de %2 a %3. + + + + %1 is looking at the top %2 cards %3. + female + %1 esta mirando las primeras %2 cartas de %3. + + + + %1 is looking at the top %2 cards %3. + male + %1 esta mirando las primeras %2 cartas de %3. + + + + %1 is looking at %2. + female + %1 está mirando: %2. + + + + %1 is looking at %2. + male + %1 está mirando: %2. + + + + %1 stops looking at %2. + female + %1 termina de mirar: %2. + + + + %1 stops looking at %2. + male + %1 termina de mirar: %2. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 revela %2 a %3. + + + + %1 reveals %2. + female + %1 revela %2. + + + + %1 reveals %2. + male + %1 revela %2. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + %1 revela aleatoriamente %2%3 a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 revela aleatoriamente %2%3 a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 revela aleatoriamente %2%3 a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 revela aleatoriamente %2%3 a %4. + + + + %1 randomly reveals %2%3. + female + %1 revela aleatoriamente %2%3. + + + + %1 randomly reveals %2%3. + male + %1 revela aleatoriamente %2%3. + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 revela %2%3 a %4. + + + + %1 reveals %2%3. + female + %1 revela %2%3. + + + + %1 reveals %2%3. + male + %1 revela %2%3. + + + + It is now %1's turn. + female + Es el turno de %1. + + + + It is now %1's turn. + male + Es el turno de %1. + + + + a card una carta - %1 flips %2 face-down. - %1 voltea %2 boca abajo. + %1 voltea %2 boca abajo. - %1 flips %2 face-up. - %1 voltea %2 boca arriba. + %1 voltea %2 boca arriba. - %1 attaches %2 to %3's %4. - %1 anexa %2 a el %4 de %3. + %1 anexa %2 a el %4 de %3. - %1 unattaches %2. - %1 desanexa %2. + %1 desanexa %2. - %1 points from %2's %3 to %4's %5. - %1 apunta desde el %3 de %2 al %5 de %4. + %1 apunta desde el %3 de %2 al %5 de %4. %1 places %n counter(s) (%2) on %3 (now %4). @@ -2345,7 +3108,7 @@ La versión local es %1, la versión remota es %2. - + red rojo @@ -2353,7 +3116,7 @@ La versión local es %1, la versión remota es %2. - + yellow amarillo @@ -2361,7 +3124,7 @@ La versión local es %1, la versión remota es %2. - + green verde @@ -2369,74 +3132,61 @@ La versión local es %1, la versión remota es %2. - %1 sets counter %2 to %3 (%4%5). - %1 establece los contadores de %2 a %3 (%4%5). + %1 establece los contadores de %2 a %3 (%4%5). - %1 sets PT of %2 to %3. - %1 establece F/R de %2 a %3. + %1 establece F/R de %2 a %3. - %1 sets annotation of %2 to %3. - %1 establece la anotación de %2 a %3. + %1 establece la anotación de %2 a %3. - %1 is looking at the top %2 cards %3. - %1 esta mirando las primeras %2 cartas de %3. + %1 esta mirando las primeras %2 cartas de %3. - + The game has started. La partida ha comenzado. - Connected. - Conectado. + Conectado. - Protocol version mismatch. Client: %1, Server: %2 - La versión del protocolo es diferente. Cliente: %1, Servidor: %2 + La versión del protocolo es diferente. Cliente: %1, Servidor: %2 - You have joined game #%1. - Te has unido a la partida #%1. + Te has unido a la partida #%1. - %1 has joined the game. - %1 se ha unido a la partida. + %1 se ha unido a la partida. - %1 has left the game. - %1 ha dejado la partida. + %1 ha dejado la partida. - %1 has loaded a local deck. - %1 ha cargado un mazo local. + %1 ha cargado un mazo local. - %1 has loaded deck #%2. - %1 ha cargado el mazo #%2. + %1 ha cargado el mazo #%2. - %1 is ready to start the game. - %1 está preparado para empezar la partida. + %1 está preparado para empezar la partida. - %1 has conceded the game. - %1 ha concedido la partida. + %1 ha concedido la partida. %1 draws a card. @@ -2447,197 +3197,164 @@ La versión local es %1, la versión remota es %2. %1 roba %2 cartas. - %1 destroys %2. - %1 destruye %2. + %1 destruye %2. - %1 creates token: %2%3. - %1 crea una ficha: %2%3. + %1 crea una ficha: %2%3. - %1 points from %2's %3 to %4. - %1 apunta desde el %3 de %2 a %4. + %1 apunta desde el %3 de %2 a %4. - %1 places %n %2 counter(s) on %3 (now %4). - + %1 pone %n %2 contador en %3 (ahora %4). %1 pone %n %2 contadores en %3 (ahora %4). - %1 removes %n %2 counter(s) from %3 (now %4). - + %1 remueve %n %2 contador en %3 (ahora %4). %1 remueve %n %2 contadores en %3 (ahora %4). - %1 %2 %3. - %1 %2 %3. + %1 %2 %3. - %1 is looking at %2. - %1 está mirando: %2. + %1 está mirando: %2. - %1 stops looking at %2. - %1 termina de mirar: %2. + %1 termina de mirar: %2. - %1 reveals %2 to %3. - %1 revela %2 a %3. + %1 revela %2 a %3. - %1 reveals %2. - %1 revela %2. + %1 revela %2. - + ending phase fase de fin de turno - It is now %1's turn. - Es el turno de %1. + Es el turno de %1. %1 shuffles his library. %1 baraja su biblioteca. - - - %1 takes a mulligan to %n. - - - - - - + %1 draws his initial hand. - + %1 draws her initial hand. - - her permanents - - - - %1 randomly reveals %2%3 to %4. - %1 revela aleatoriamente %2%3 a %4. + %1 revela aleatoriamente %2%3 a %4. - %1 randomly reveals %2%3. - %1 revela aleatoriamente %2%3. + %1 revela aleatoriamente %2%3. - %1 reveals %2%3 to %4. - %1 revela %2%3 a %4. + %1 revela %2%3 a %4. - %1 reveals %2%3. - %1 revela %2%3. + %1 revela %2%3. - + untap step paso de enderezar - + upkeep step paso de mantenimiento - + draw step paso de robar - + first main phase primera fase principal - + beginning of combat step paso de inicio de combate - + declare attackers step paso de declarar atacantes - + declare blockers step paso de declarar bloqueadores - + combat damage step paso de daño de combate - + end of combat step paso de fin de combate - + second main phase segunda fase principal - + It is now the %1. Ahora es el %1. - taps - gira + gira - untaps - endereza + endereza - %1 sets %2 to not untap normally. - %1 establece que %2 no se endereze normalmente. + %1 establece que %2 no se endereze normalmente. - %1 sets %2 to untap normally. - %1 establece que %2 se endereze normalmente. + %1 establece que %2 se endereze normalmente. - his permanents - sus permanentes + sus permanentes @@ -3701,67 +4418,67 @@ Por favor, introduzca un nombre: UserList - + Users online: %1 Usuarios online: %1 - + Users in this room: %1 Usuarios en esta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuarios ignorados online: %1 / %2 - + %1's games - + User &details &Detalles del usuario - + Direct &chat &Chat privado - + Show this user's &games - + Add to &buddy list Añadir a la lista de &amigos - + Remove from &buddy list Quitar de la lista de &amigos - + Add to &ignore list Añadir a la lista de &ignorados - + Remove from &ignore list Quitar de la lista de &ignorados - + Ban from &server Banear del &servidor diff --git a/cockatrice/translations/cockatrice_fr.ts b/cockatrice/translations/cockatrice_fr.ts index 3c10129c..301f3217 100644 --- a/cockatrice/translations/cockatrice_fr.ts +++ b/cockatrice/translations/cockatrice_fr.ts @@ -231,57 +231,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jouer - + &Hide &Cacher - + &Tap &Engager - + &Untap &Dégager - + Toggle &normal untapping Activer/ Désactiver le dégagement &normal - + &Flip &Retourner la carte - + &Clone &Copier une carte - + Ctrl+H - + &Attach to card... &Attacher à la carte... - + Ctrl+A Ctrl+A - + Unattac&h Détac&her @@ -290,147 +290,147 @@ This is only saved for moderators and cannot be seen by the banned person.Fixer &F/E... - + &Draw arrow... - + &Power / toughness F&orce / Endurance - + &Increase power &Augmenter force - + Ctrl++ Ctrl++ - + &Decrease power &Diminuer force - + Ctrl+- Ctrl+- - + I&ncrease toughness A&ugmenter endurance - + Alt++ Alt++ - + D&ecrease toughness D&iminuer endurance - + Alt+- Alt+- - + In&crease power and toughness Au&gmenter la force et l'endurance - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Di&minuer la force et l'endurance - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Fi&xer la force et l'endurance... - + Ctrl+P Ctrl+P - + &Set annotation... A&jouter note... - + red rouge - + yellow jaune - + green vert - + &Add counter (%1) &Ajouter compteur (%1) - + &Remove counter (%1) &Retirer compteur (%1) - + &Set counters (%1)... &Fixer marqueurs (%1)... - + &top of library dessus de la &Bibliothèque - + &bottom of library &dessous de la bibliothèque - + &graveyard &cimetière - + Ctrl+Del Ctrl+Del - + &exile &exiler - + &Move to &Aller @@ -1420,7 +1420,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1428,71 +1427,72 @@ This is only saved for moderators and cannot be seen by the banned person. + Error Erreur - + Please join the appropriate room first. - + Wrong password. Mot de passe erroné. - + Spectators are not allowed in this game. Les spectateurs ne sont pas autorisés dans cette partie. - + The game is already full. Cette partie est déjà pleine. - + The game does not exist any more. La partie n'existe plus. - + This game is only open to registered users. Cette partie n'est accessible qu'aux joueurs enregistrés. - + This game is only open to its creator's buddies. Cette partie n'est accessible qu'aux amis. - + You are being ignored by the creator of this game. Vous avez été ignoré par le créateur de la partie. - + Join game Rejoindre partie - + Password: Mot de passe: - + Games Parties - + Show &full games Montrer &toutes les parties - + Show &running games @@ -1502,17 +1502,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Montrer toutes les parties - + C&reate C&réer - + &Join Re&joindre - + J&oin as spectator Rej&oindre en tant que spectateur @@ -1914,93 +1914,79 @@ La version la plus récente est %1, l'ancienne version est %2. MessageLogWidget - Connecting to %1... - Connexion à %1... + Connexion à %1... - Connected. - Connecté. + Connecté. - Disconnected from server. - Déconnecté du serveur. + Déconnecté du serveur. - Invalid password. - Mot de passe invalide. + Mot de passe invalide. - Protocol version mismatch. Client: %1, Server: %2 - Version de protocole différente. Version locale: %1 ,version distante: %2 + Version de protocole différente. Version locale: %1 ,version distante: %2 - Protocol error. - Erreur de protocole. + Erreur de protocole. - You have joined game #%1. - Vous avez rejoint la partie #%1. + Vous avez rejoint la partie #%1. - %1 has joined the game. - %1 a rejoint la partie. + %1 a rejoint la partie. - %1 has left the game. - %1 a quitté la partie. + %1 a quitté la partie. - + The game has been closed. La partie a été fermée. - + %1 is now watching the game. %1 est maintenant spectateur. - + %1 is not watching the game any more. %1 n'est plus spectateur. - %1 has loaded a local deck. - %1 a chargé un deck local. + %1 a chargé un deck local. - %1 has loaded deck #%2. - %1 a chargé le deck #%2. + %1 a chargé le deck #%2. - %1 is ready to start the game. - %1 est prêt à démarrer la partie. + %1 est prêt à démarrer la partie. - %1 is not ready to start the game any more. - %1 n'est plus prêt à démarrer la partie. + %1 n'est plus prêt à démarrer la partie. - %1 has conceded the game. partie ou jeu - %1 a concédé la partie. + %1 a concédé la partie. - + The game has started. La partie commence. @@ -2009,10 +1995,9 @@ La version la plus récente est %1, l'ancienne version est %2.%1 mélange sa bibliothèque. - %1 rolls a %2 with a %3-sided die. is it always a dice? - %1 lance un %2 à %3 faces. + %1 lance un %2 à %3 faces. %1 draws a card. @@ -2023,213 +2008,331 @@ La version la plus récente est %1, l'ancienne version est %2.%1 pioche %2 cartes. - - from table - depuis le champ de bataille + + You have joined game #%1. + female + Vous avez rejoint la partie #%1. - - from graveyard - depuis son cimetière + + You have joined game #%1. + male + Vous avez rejoint la partie #%1. - - from exile - depuis la zone exil + + %1 has joined the game. + female + %1 a rejoint la partie. - - from hand - depuis sa main + + %1 has joined the game. + male + %1 a rejoint la partie. - - the bottom card of his library - la carte du dessous de sa bibliothèque + + %1 has left the game. + female + %1 a quitté la partie. - - the bottom card of her library + + %1 has left the game. + male + %1 a quitté la partie. + + + + %1 has loaded a local deck. + female + %1 a chargé un deck local. + + + + %1 has loaded a local deck. + male + %1 a chargé un deck local. + + + + %1 has loaded deck #%2. + female + %1 a chargé le deck #%2. + + + + %1 has loaded deck #%2. + male + %1 a chargé le deck #%2. + + + + %1 is ready to start the game. + female + %1 est prêt à démarrer la partie. + + + + %1 is ready to start the game. + male + %1 est prêt à démarrer la partie. + + + + %1 is not ready to start the game any more. + female + %1 n'est plus prêt à démarrer la partie. + + + + %1 is not ready to start the game any more. + male + %1 n'est plus prêt à démarrer la partie. + + + + %1 has conceded the game. + female + %1 a concédé la partie. + + + + %1 has conceded the game. + male + %1 a concédé la partie. + + + + %1 has restored connection to the game. + female - - from the bottom of his library - du dessous de sa bibliothèque - - - - from the bottom of her library + + %1 has restored connection to the game. + male - - the top card of his library - le carte du dessus de sa bibliothèque - - - - the top card of her library + + %1 has lost connection to the game. + female - - from the top of his library - du dessus de sa bibliothèque - - - - from the top of her library + + %1 has lost connection to the game. + male - - - from library - depuis sa bibliothèque - - - - from sideboard - depuis sa réserve - - - - from the stack - depuis la pile - - - - %1 puts %2 into play tapped%3. - %1 met %2 en jeu engagé%3. - - - - %1 puts %2 into play%3. - what is %3? plz exemple (resp. by Ranma : XX met island en jeu -depuis sa main-.) - %1 met %2 en jeu %3. - - - - %1 puts %2%3 into graveyard. - %1 met %2%3 dans son cimetière. - - - - %1 exiles %2%3. - %1 exile %2%3. - - - - %1 moves %2%3 to hand. - %1 met %2%3 dans sa main. - - - - %1 puts %2%3 into his library. - %1 met %2%3 dans sa bibliothèque. - - - - %1 puts %2%3 into her library. - - - - - %1 puts %2%3 on bottom of his library. - %1 met %2%3 en-dessous de sa bibliothèque. - - - - %1 puts %2%3 on bottom of her library. - - - - - %1 puts %2%3 on top of his library. - %1 met %2%3 au-dessus de sa bibliothèque. - - - - %1 puts %2%3 on top of her library. - - - - - %1 puts %2%3 into his library at position %4. - %1 met %2%3 dans sa bibliothèque à la position n°%4. - - - - %1 puts %2%3 into her library at position %4. - - - - - %1 moves %2%3 to sideboard. - %1 met %2%3 à sa réserve. - - - - %1 plays %2%3. - %1 joue %2%3. - - - - - a card - une carte - - %1 has restored connection to the game. + %1 shuffles %2. + female - %1 has lost connection to the game. + %1 shuffles %2. + male - - %1 shuffles %2. - + + %1 rolls a %2 with a %3-sided die. + female + %1 lance un %2 à %3 faces. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 lance un %2 à %3 faces. - + %1 draws %n card(s). - + female + + %1 pioche %n carte. + %1 pioche %n cartes. + + + + + %1 draws %n card(s). + male + %1 pioche %n carte. %1 pioche %n cartes. - - %1 undoes his last draw. - %1 annule sa dernière pioche. + + from table + depuis le champ de bataille - - %1 undoes her last draw. + + from graveyard + depuis son cimetière + + + + from exile + depuis la zone exil + + + + from hand + depuis sa main + + + + the bottom card of his library + la carte du dessous de sa bibliothèque + + + + the bottom card of her library - - %1 undoes his last draw (%2). - %1 annule sa dernière pioche (%2). + + from the bottom of his library + du dessous de sa bibliothèque - - %1 undoes her last draw (%2). + + from the bottom of her library + + + the top card of his library + le carte du dessus de sa bibliothèque + + + + the top card of her library + + + + + from the top of his library + du dessus de sa bibliothèque + + + + from the top of her library + + + + + from library + depuis sa bibliothèque + + + + from sideboard + depuis sa réserve + + + + from the stack + depuis la pile + + + + %1 puts %2 into play tapped%3. + %1 met %2 en jeu engagé%3. + - %1 gives %2 control over %3. - %1 donne le contrôle de %2 à %3. + %1 puts %2 into play%3. + what is %3? plz exemple (resp. by Ranma : XX met island en jeu -depuis sa main-.) + %1 met %2 en jeu %3. + + + + %1 puts %2%3 into graveyard. + %1 met %2%3 dans son cimetière. + + + + %1 exiles %2%3. + %1 exile %2%3. + + + + %1 moves %2%3 to hand. + %1 met %2%3 dans sa main. + + + + %1 puts %2%3 into his library. + %1 met %2%3 dans sa bibliothèque. + + + + %1 puts %2%3 into her library. + + + + + %1 puts %2%3 on bottom of his library. + %1 met %2%3 en-dessous de sa bibliothèque. + + + + %1 puts %2%3 on bottom of her library. + + + + + %1 puts %2%3 on top of his library. + %1 met %2%3 au-dessus de sa bibliothèque. + + + + %1 puts %2%3 on top of her library. + + + + + %1 puts %2%3 into his library at position %4. + %1 met %2%3 dans sa bibliothèque à la position n°%4. + + + + %1 puts %2%3 into her library at position %4. + + + + + %1 moves %2%3 to sideboard. + %1 met %2%3 à sa réserve. + + + + %1 plays %2%3. + %1 joue %2%3. - + %1 takes a mulligan to %n. + female + + + + + + + + %1 takes a mulligan to %n. + male @@ -2237,56 +2340,696 @@ La version la plus récente est %1, l'ancienne version est %2. + %1 flips %2 face-down. + female + %1 retourne %2 face cachée. + + + + %1 flips %2 face-down. + male + %1 retourne %2 face cachée. + + + + %1 flips %2 face-up. + female + %1 retourne %2 face visible. + + + + %1 flips %2 face-up. + male + %1 retourne %2 face visible. + + + + %1 destroys %2. + female + %1 détruit %2. + + + + %1 destroys %2. + male + %1 détruit %2. + + + %1 attaches %2 to %3's %4. + female + %1 attache %2 sur %4 de %3. + + + %1 attaches %2 to %3's %4. + male + %1 attache %2 sur %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female + %1 attache %2 sur %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 attache %2 sur %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 attache %2 sur %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 attache %2 sur %4 de %3. + + + + %1 unattaches %2. + female + %1 détache %2. + + + + %1 unattaches %2. + male + %1 détache %2. + + + + %1 creates token: %2%3. + female + %1 crée un jeton %2%3. + + + + %1 creates token: %2%3. + male + %1 crée un jeton %2%3. + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 désigne le %3 de %2 à %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 désigne le %3 de %2 à %4. + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 désigne le %3 de %2 à %5 de %4. + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + %1 met %n %2 marqueur sur %3 (maintenant %4). + %1 met %n %2 marqueurs sur %3 (maintenant %4). + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 met %n %2 marqueur sur %3 (maintenant %4). + %1 met %n %2 marqueurs sur %3 (maintenant %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 retire %n %2 marqueur de %3 (maintenant %4). + %1 retire %n %2 marqueurs de %3 (maintenant %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + %1 retire %n %2 marqueur de %3 (maintenant %4). + %1 retire %n %2 marqueurs de %3 (maintenant %4). + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 met les marqueurs %2 à %3 (%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 met les marqueurs %2 à %3 (%4%5). + + + + %1 sets %2 to not untap normally. + female + %2 de %1 ne se dégagera pas lors de l'étape de dégagement. + + + + %1 sets %2 to not untap normally. + male + %2 de %1 ne se dégagera pas lors de l'étape de dégagement. + + + + %1 sets %2 to untap normally. + female + %2 de %1 se dégagera lors de l'étape de dégagement. + + + + %1 sets %2 to untap normally. + male + %2 de %1 se dégagera lors de l'étape de dégagement. + + + + %1 sets PT of %2 to %3. + female + %1 change la F/E de %2 à %3. + + + + %1 sets PT of %2 to %3. + male + %1 change la F/E de %2 à %3. + + + + %1 sets annotation of %2 to %3. + female + %1 met l'annotation %3 à %2. + + + + %1 sets annotation of %2 to %3. + male + %1 met l'annotation %3 à %2. + + + + %1 is looking at the top %2 cards %3. + female + %1 regarde les %2 cartes du dessus %3. + + + + %1 is looking at the top %2 cards %3. + male + %1 regarde les %2 cartes du dessus %3. + + + + %1 is looking at %2. + female + %1 regarde %2. + + + + %1 is looking at %2. + male + %1 regarde %2. + + + + %1 stops looking at %2. + female + %1 arrête de regarder %2. + + + + %1 stops looking at %2. + male + %1 arrête de regarder %2. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 révèle %2 à %3. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 révèle %2 à %3. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 révèle %2 à %3. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 révèle %2 à %3. + + + + %1 reveals %2. + female + %1 révèle %2. + + + + %1 reveals %2. + male + %1 révèle %2. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + %1 révèle au hasard %2%3 à %4. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 révèle au hasard %2%3 à %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 révèle au hasard %2%3 à %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 révèle au hasard %2%3 à %4. + + + + %1 randomly reveals %2%3. + female + %1 révèle au hasard %2%3. + + + + %1 randomly reveals %2%3. + male + %1 révèle au hasard %2%3. + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + %1 révèle %2%3 à %4. + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 révèle %2%3 à %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 révèle %2%3 à %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 révèle %2%3 à %4. + + + + %1 reveals %2%3. + female + %1 révèle %2%3. + + + + %1 reveals %2%3. + male + %1 révèle %2%3. + + + + It is now %1's turn. + female + C'est maintenant le tour de %1. + + + + It is now %1's turn. + male + C'est maintenant le tour de %1. + + + + + a card + une carte + + + %1 draws %n card(s). + + %1 pioche %n carte. + %1 pioche %n cartes. + + + + + %1 undoes his last draw. + %1 annule sa dernière pioche. + + + + %1 undoes her last draw. + + + + + %1 undoes his last draw (%2). + %1 annule sa dernière pioche (%2). + + + + %1 undoes her last draw (%2). + + + + + %1 gives %2 control over %3. + %1 donne le contrôle de %2 à %3. + + + %1 draws his initial hand. - + %1 draws her initial hand. - %1 flips %2 face-down. - %1 retourne %2 face cachée. + %1 retourne %2 face cachée. - %1 flips %2 face-up. - %1 retourne %2 face visible. + %1 retourne %2 face visible. - %1 destroys %2. - %1 détruit %2. + %1 détruit %2. - %1 attaches %2 to %3's %4. need exemple (Resp'.by Ranma: JoueurA attache Adventuring Gear sur -Plated Geopede- de -JoueurB-.) - %1 attache %2 sur %4 de %3. + %1 attache %2 sur %4 de %3. - %1 unattaches %2. - %1 détache %2. + %1 détache %2. - %1 creates token: %2%3. - %1 crée un jeton %2%3. + %1 crée un jeton %2%3. - %1 points from %2's %3 to %4. need exemple - %1 désigne le %3 de %2 à %4. + %1 désigne le %3 de %2 à %4. - %1 points from %2's %3 to %4's %5. need exemple - %1 désigne le %3 de %2 à %5 de %4. + %1 désigne le %3 de %2 à %5 de %4. %1 places %n counter(s) (%2) on %3 (now %4). @@ -2305,23 +3048,21 @@ La version la plus récente est %1, l'ancienne version est %2. - %1 places %n %2 counter(s) on %3 (now %4). - + %1 met %n %2 marqueur sur %3 (maintenant %4). %1 met %n %2 marqueurs sur %3 (maintenant %4). - %1 removes %n %2 counter(s) from %3 (now %4). - + %1 retire %n %2 marqueur de %3 (maintenant %4). %1 retire %n %2 marqueurs de %3 (maintenant %4). - + red rouge @@ -2329,7 +3070,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + yellow jaune @@ -2337,7 +3078,7 @@ La version la plus récente est %1, l'ancienne version est %2. - + green vert @@ -2345,169 +3086,145 @@ La version la plus récente est %1, l'ancienne version est %2. - his permanents - ses permanents + ses permanents - - her permanents - - - - %1 %2 %3. wtf ? - %1 %2 %3. + %1 %2 %3. - taps - engage + engage - untaps - dégage + dégage - %1 sets counter %2 to %3 (%4%5). need exemple - %1 met les marqueurs %2 à %3 (%4%5). + %1 met les marqueurs %2 à %3 (%4%5). - %1 sets %2 to not untap normally. need exemple - %2 de %1 ne se dégagera pas lors de l'étape de dégagement. + %2 de %1 ne se dégagera pas lors de l'étape de dégagement. - %1 sets %2 to untap normally. - %2 de %1 se dégagera lors de l'étape de dégagement. + %2 de %1 se dégagera lors de l'étape de dégagement. - %1 sets PT of %2 to %3. exemple plz - %1 change la F/E de %2 à %3. + %1 change la F/E de %2 à %3. - %1 sets annotation of %2 to %3. - %1 met l'annotation %3 à %2. + %1 met l'annotation %3 à %2. - %1 is looking at the top %2 cards %3. exemple plz - %1 regarde les %2 cartes du dessus %3. + %1 regarde les %2 cartes du dessus %3. - %1 is looking at %2. exemple plz - %1 regarde %2. + %1 regarde %2. - %1 stops looking at %2. need exemple to be sure - %1 arrête de regarder %2. + %1 arrête de regarder %2. - %1 reveals %2 to %3. - %1 révèle %2 à %3. + %1 révèle %2 à %3. - %1 reveals %2. - %1 révèle %2. + %1 révèle %2. - %1 randomly reveals %2%3 to %4. - %1 révèle au hasard %2%3 à %4. + %1 révèle au hasard %2%3 à %4. - %1 randomly reveals %2%3. - %1 révèle au hasard %2%3. + %1 révèle au hasard %2%3. - %1 reveals %2%3 to %4. - %1 révèle %2%3 à %4. + %1 révèle %2%3 à %4. - %1 reveals %2%3. - %1 révèle %2%3. + %1 révèle %2%3. - It is now %1's turn. - C'est maintenant le tour de %1. + C'est maintenant le tour de %1. - + untap step étape de dégagement - + upkeep step étape d'entretien - + draw step étape de pioche - + first main phase première phase principale - + beginning of combat step étape de début du combat - + declare attackers step étape de déclaration des attaquants - + declare blockers step étape de déclaration des bloqueurs - + combat damage step étape de répartition et de résolution des blessures - + end of combat step étape de fin de combat - + second main phase seconde phase principale - + ending phase phase de fin de tour - + It is now the %1. need exemple C'est maintenant %1. @@ -3562,67 +4279,67 @@ Entrez un nom s'il vous plaît: UserList - + Users online: %1 Utilisateurs en ligne:%1 - + Users in this room: %1 Utilisateurs dans ce salon: %1 - + Buddies online: %1 / %2 Amis connectés; %1 / %2 - + Ignored users online: %1 / %2 Personnes sur liste noire connectés: %1 / %2 - + %1's games - + User &details &Détails utilisateur - + Direct &chat &Chat direct - + Show this user's &games - + Add to &buddy list Ajouter à la liste d'&amis - + Remove from &buddy list Retirer de la liste d'&amis - + Add to &ignore list Ajouter à la liste &noire - + Remove from &ignore list Retirer de la liste &noire - + Ban from &server Bannir du &serveur diff --git a/cockatrice/translations/cockatrice_ja.ts b/cockatrice/translations/cockatrice_ja.ts index 5bd20b46..5470b772 100644 --- a/cockatrice/translations/cockatrice_ja.ts +++ b/cockatrice/translations/cockatrice_ja.ts @@ -235,58 +235,58 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play プレイ - + &Hide テスト版のため確認取れず再度チェック 裏にしてプレイ - + &Tap タップ - + &Untap アンタップ - + Toggle &normal untapping 通常のアンタップをしない - + &Flip 裏にする - + &Clone 複製する - + Ctrl+H - + &Attach to card... カードに付ける... - + Ctrl+A - + Unattac&h 取り外す @@ -295,147 +295,147 @@ This is only saved for moderators and cannot be seen by the banned person.P/Tを決める... - + &Draw arrow... - + &Power / toughness パワー / タフネス - + &Increase power パワーを上げる - + Ctrl++ - + &Decrease power パワーを下げる - + Ctrl+- - + I&ncrease toughness タフネスを上げる - + Alt++ - + D&ecrease toughness タフネスを下げる - + Alt+- - + In&crease power and toughness パワーとタフネスを上げる - + Ctrl+Alt++ - + Dec&rease power and toughness パワーとタフネスを下げる - + Ctrl+Alt+- - + Set &power and toughness... パワーとタフネスを設定する... - + Ctrl+P - + &Set annotation... 注釈を付ける... - + red - + yellow - + green - + &Add counter (%1) カウンターを乗せる (%1) - + &Remove counter (%1) カウンターを取り除く (%1) - + &Set counters (%1)... カウンターの数を決める (%1)... - + &top of library ライブラリーの一番上へ - + &bottom of library ライブラリーの一番下へ - + &graveyard 墓地へ - + Ctrl+Del - + &exile 追放領域へ - + &Move to 移動させる @@ -1256,17 +1256,16 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate 部屋を作る - + &Join 参加する - @@ -1274,71 +1273,72 @@ This is only saved for moderators and cannot be seen by the banned person. + Error エラー - + Please join the appropriate room first. - + Wrong password. パスワードが間違っています. - + Spectators are not allowed in this game. この試合は観戦者は許可されていません. - + The game is already full. このゲームはすでに満員です. - + The game does not exist any more. このゲームはもう存在しません. - + This game is only open to registered users. このゲームは登録済みプレイヤーにのみ公開されています. - + This game is only open to its creator's buddies. このゲームは作成者のフレンドのみに公開されています. - + You are being ignored by the creator of this game. あなたはこのゲームの作成者によって拒否されています. - + Join game 参加 - + Password: パスワード: - + Games ゲーム - + Show &full games 全てのゲームを見る - + Show &running games @@ -1347,7 +1347,7 @@ This is only saved for moderators and cannot be seen by the banned person.全てのゲームを見る - + J&oin as spectator 観戦者として参加 @@ -1739,276 +1739,947 @@ Local version is %1, remote version is %2. MessageLogWidget - - Connecting to %1... - - - - - Disconnected from server. - - - - - Invalid password. - - - - - Protocol error. - - - - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + + You have joined game #%1. + female + + + + + You have joined game #%1. + male + + + + + %1 has joined the game. + female + + + + + %1 has joined the game. + male + + + + + %1 has left the game. + female + + + + + %1 has left the game. + male + + + + + %1 has loaded a local deck. + female + + + + + %1 has loaded a local deck. + male + + + + + %1 has loaded deck #%2. + female + + + + + %1 has loaded deck #%2. + male + + + + + %1 is ready to start the game. + female + + + + + %1 is ready to start the game. + male + + + + %1 is not ready to start the game any more. - + female + + + + + %1 is not ready to start the game any more. + male + + + + + %1 has conceded the game. + female + + + + + %1 has conceded the game. + male + + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + - %1 has restored connection to the game. + %1 shuffles %2. + female - %1 has lost connection to the game. - - - - %1 shuffles %2. + male - + %1 rolls a %2 with a %3-sided die. - + female + + + + + %1 rolls a %2 with a %3-sided die. + male + - + %1 draws %n card(s). - + female + + + + + + + %1 draws %n card(s). + male + - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - - - - a card - + + + %1 takes a mulligan to %n. + female + + + + + + + %1 takes a mulligan to %n. + male + + + - + %1 flips %2 face-down. - + female + - + + %1 flips %2 face-down. + male + + + + %1 flips %2 face-up. - + female + - - %1 attaches %2 to %3's %4. - + + %1 flips %2 face-up. + male + - + + %1 destroys %2. + female + + + + + %1 destroys %2. + male + + + + %1 unattaches %2. - + female + - + + %1 unattaches %2. + male + + + + + %1 creates token: %2%3. + female + + + + + %1 creates token: %2%3. + male + + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + + + + + %1 sets counter %2 to %3 (%4%5). + male + + + + + %1 sets %2 to not untap normally. + female + + + + + %1 sets %2 to not untap normally. + male + + + + + %1 sets %2 to untap normally. + female + + + + + %1 sets %2 to untap normally. + male + + + + + %1 sets PT of %2 to %3. + female + + + + + %1 sets PT of %2 to %3. + male + + + + + %1 sets annotation of %2 to %3. + female + + + + + %1 sets annotation of %2 to %3. + male + + + + + %1 is looking at the top %2 cards %3. + female + + + + + %1 is looking at the top %2 cards %3. + male + + + + + %1 is looking at %2. + female + + + + + %1 is looking at %2. + male + + + + + %1 stops looking at %2. + female + + + + + %1 stops looking at %2. + male + + + + + %1 reveals %2 to %3. + p1 female, p2 female + + + + + %1 reveals %2 to %3. + p1 female, p2 male + + + + + %1 reveals %2 to %3. + p1 male, p2 female + + + + + %1 reveals %2 to %3. + p1 male, p2 male + + + + + %1 reveals %2. + female + + + + + %1 reveals %2. + male + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 randomly reveals %2%3. + female + + + + + %1 randomly reveals %2%3. + male + + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 reveals %2%3. + female + + + + + %1 reveals %2%3. + male + + + + + It is now %1's turn. + female + + + + + It is now %1's turn. + male + + + + + + a card @@ -2024,282 +2695,125 @@ Local version is %1, remote version is %2. - + red - + yellow - + green - - %1 sets counter %2 to %3 (%4%5). - - - - - %1 sets PT of %2 to %3. - - - - - %1 sets annotation of %2 to %3. - - - - - %1 is looking at the top %2 cards %3. - - - - + The game has started. - - Connected. - - - - - Protocol version mismatch. Client: %1, Server: %2 - - - - - You have joined game #%1. - - - - - %1 has joined the game. - - - - - %1 has left the game. - - - - - %1 has loaded a local deck. - - - - - %1 has loaded deck #%2. - - - - - %1 is ready to start the game. - - - - - %1 has conceded the game. - - - - - %1 takes a mulligan to %n. - - - - - - + %1 draws his initial hand. - + %1 draws her initial hand. - - %1 destroys %2. - - - - - %1 creates token: %2%3. - - - - - %1 points from %2's %3 to %4. - - - - - %1 places %n %2 counter(s) on %3 (now %4). - - - - - - - %1 removes %n %2 counter(s) from %3 (now %4). - - - - - - - her permanents - - - - - %1 %2 %3. - - - - - %1 is looking at %2. - - - - - %1 stops looking at %2. - - - - - %1 reveals %2 to %3. - - - - - %1 reveals %2. - - - - + ending phase - - It is now %1's turn. - - - - - %1 randomly reveals %2%3 to %4. - - - - - %1 randomly reveals %2%3. - - - - - %1 reveals %2%3 to %4. - - - - - %1 reveals %2%3. - - - - + untap step - + + %1 attaches %2 to %3's %4. + p1 female, p2 female + + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + + + + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - - - taps - - - - - untaps - - - - - %1 sets %2 to not untap normally. - - - - - %1 sets %2 to untap normally. - - - - - his permanents - - MessagesSettingsPage @@ -3337,67 +3851,67 @@ Please enter a name: UserList - + Users online: %1 ユーザー オンライン: %1 - + Users in this room: %1 部屋のユーザー数: %1 - + Buddies online: %1 / %2 フレンドオンライン: %1 / %2 - + Ignored users online: %1 / %2 無視ユーザーオンライン: %1 / %2 - + %1's games - + User &details ユーザー補足 - + Direct &chat 個人チャット - + Show this user's &games - + Add to &buddy list フレンドリストに追加 - + Remove from &buddy list フレンドリストから削除 - + Add to &ignore list 無視リストに追加 - + Remove from &ignore list 無視リストから削除 - + Ban from &server サーバーからバンする diff --git a/cockatrice/translations/cockatrice_pl.ts b/cockatrice/translations/cockatrice_pl.ts index 2994392a..f13d9e82 100644 --- a/cockatrice/translations/cockatrice_pl.ts +++ b/cockatrice/translations/cockatrice_pl.ts @@ -230,202 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - + &Draw arrow... - + &Power / toughness - + &Increase power - + Ctrl++ - + &Decrease power - + Ctrl+- - + I&ncrease toughness - + Alt++ - + D&ecrease toughness - + Alt+- - + In&crease power and toughness - + Ctrl+Alt++ - + Dec&rease power and toughness - + Ctrl+Alt+- - + Set &power and toughness... - + Ctrl+P - + &Set annotation... - + red - + yellow - + green - + &Add counter (%1) - + &Remove counter (%1) - + &Set counters (%1)... - + &top of library - + &bottom of library - + &graveyard - + Ctrl+Del - + &exile - + &Move to @@ -1208,7 +1208,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1216,86 +1215,87 @@ This is only saved for moderators and cannot be seen by the banned person. + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator @@ -1684,118 +1684,183 @@ Local version is %1, remote version is %2. MessageLogWidget - - Connecting to %1... - - - - - Connected. - - - - - Disconnected from server. - - - - - Invalid password. - - - - - Protocol version mismatch. Client: %1, Server: %2 - - - - - Protocol error. - - - - - You have joined game #%1. - - - - - %1 has joined the game. - - - - - %1 has left the game. - - - - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - - %1 has loaded a local deck. - - - - - %1 has loaded deck #%2. - - - - - %1 is ready to start the game. - - - - - %1 is not ready to start the game any more. - - - - - %1 has conceded the game. - - - - + The game has started. - + + You have joined game #%1. + female + + + + + You have joined game #%1. + male + + + + + %1 has joined the game. + female + + + + + %1 has joined the game. + male + + + + + %1 has left the game. + female + + + + + %1 has left the game. + male + + + + + %1 has loaded a local deck. + female + + + + + %1 has loaded a local deck. + male + + + + + %1 has loaded deck #%2. + female + + + + + %1 has loaded deck #%2. + male + + + + + %1 is ready to start the game. + female + + + + + %1 is ready to start the game. + male + + + + + %1 is not ready to start the game any more. + female + + + + + %1 is not ready to start the game any more. + male + + + + + %1 has conceded the game. + female + + + + + %1 has conceded the game. + male + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female - %1 has lost connection to the game. - - - - %1 shuffles %2. + male - + %1 rolls a %2 with a %3-sided die. + female + + + + + %1 rolls a %2 with a %3-sided die. + male - + %1 draws %n card(s). + female + + + + + + + + + %1 draws %n card(s). + male @@ -1803,189 +1868,200 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. + female + + + + + + + + + %1 takes a mulligan to %n. + male @@ -1994,74 +2070,620 @@ Local version is %1, remote version is %2. + %1 flips %2 face-down. + female + + + + + %1 flips %2 face-down. + male + + + + + %1 flips %2 face-up. + female + + + + + %1 flips %2 face-up. + male + + + + + %1 destroys %2. + female + + + + + %1 destroys %2. + male + + + + + %1 unattaches %2. + female + + + + + %1 unattaches %2. + male + + + + + %1 creates token: %2%3. + female + + + + + %1 creates token: %2%3. + male + + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + + + + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + + + + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + + + + + %1 sets counter %2 to %3 (%4%5). + male + + + + + %1 sets %2 to not untap normally. + female + + + + + %1 sets %2 to not untap normally. + male + + + + + %1 sets %2 to untap normally. + female + + + + + %1 sets %2 to untap normally. + male + + + + + %1 sets PT of %2 to %3. + female + + + + + %1 sets PT of %2 to %3. + male + + + + + %1 sets annotation of %2 to %3. + female + + + + + %1 sets annotation of %2 to %3. + male + + + + + %1 is looking at the top %2 cards %3. + female + + + + + %1 is looking at the top %2 cards %3. + male + + + + + %1 is looking at %2. + female + + + + + %1 is looking at %2. + male + + + + + %1 stops looking at %2. + female + + + + + %1 stops looking at %2. + male + + + + + %1 reveals %2 to %3. + p1 female, p2 female + + + + + %1 reveals %2 to %3. + p1 female, p2 male + + + + + %1 reveals %2 to %3. + p1 male, p2 female + + + + + %1 reveals %2 to %3. + p1 male, p2 male + + + + + %1 reveals %2. + female + + + + + %1 reveals %2. + male + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 randomly reveals %2%3. + female + + + + + %1 randomly reveals %2%3. + male + + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 reveals %2%3. + female + + + + + %1 reveals %2%3. + male + + + + + It is now %1's turn. + female + + + + + It is now %1's turn. + male + + + + %1 draws his initial hand. - + %1 draws her initial hand. - - %1 flips %2 face-down. - - - - - %1 flips %2 face-up. - - - - - %1 destroys %2. - - - - + %1 attaches %2 to %3's %4. + p1 female, p2 female - - %1 unattaches %2. + + %1 attaches %2 to %3's %4. + p1 female, p2 male - - %1 creates token: %2%3. + + %1 attaches %2 to %3's %4. + p1 male, p2 female - - %1 points from %2's %3 to %4. - - - - - %1 points from %2's %3 to %4's %5. + + %1 attaches %2 to %3's %4. + p1 male, p2 male - - %1 places %n %2 counter(s) on %3 (now %4). - - - - - - - - - %1 removes %n %2 counter(s) from %3 (now %4). - - - - - - - - + red @@ -2070,7 +2692,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2079,7 +2701,7 @@ Local version is %1, remote version is %2. - + green @@ -2088,162 +2710,62 @@ Local version is %1, remote version is %2. - - his permanents - - - - - her permanents - - - - - %1 %2 %3. - - - - - taps - - - - - untaps - - - - - %1 sets counter %2 to %3 (%4%5). - - - - - %1 sets %2 to not untap normally. - - - - - %1 sets %2 to untap normally. - - - - - %1 sets PT of %2 to %3. - - - - - %1 sets annotation of %2 to %3. - - - - - %1 is looking at the top %2 cards %3. - - - - - %1 is looking at %2. - - - - - %1 stops looking at %2. - - - - - %1 reveals %2 to %3. - - - - - %1 reveals %2. - - - - - %1 randomly reveals %2%3 to %4. - - - - - %1 randomly reveals %2%3. - - - - - %1 reveals %2%3 to %4. - - - - - %1 reveals %2%3. - - - - - It is now %1's turn. - - - - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -3234,67 +3756,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + %1's games - + User &details - + Direct &chat - + Show this user's &games - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/cockatrice/translations/cockatrice_pt-br.ts b/cockatrice/translations/cockatrice_pt-br.ts index 7f4c14cb..9c018f04 100644 --- a/cockatrice/translations/cockatrice_pt-br.ts +++ b/cockatrice/translations/cockatrice_pt-br.ts @@ -235,57 +235,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jogar - + &Hide &Ocultar - + &Tap &Virar - + &Untap &Desvirar - + Toggle &normal untapping &Trocar o modo de desvirar - + &Flip Virar a &face - + &Clone Clo&nar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar ao card... - + Ctrl+A Ctrl+A - + Unattac&h De&sanexar @@ -294,147 +294,147 @@ This is only saved for moderators and cannot be seen by the banned person.Alterar &P/R... - + &Draw arrow... - + &Power / toughness Po&der / resistência - + &Increase power Au&mentar poder - + Ctrl++ Ctrl++ - + &Decrease power Dimi&nuir poder - + Ctrl+- Ctrl+- - + I&ncrease toughness A&umentar resistência - + Alt++ Alt++ - + D&ecrease toughness D&iminuir resistência - + Alt+- Alt+- - + In&crease power and toughness Aumen&tar poder e resistência - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Diminuir p&oder e resistência - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Alterar poder e resis&tência... - + Ctrl+P Ctrl+P - + &Set annotation... Alterar &nota... - + red vermelho - + yellow amarelo - + green verde - + &Add counter (%1) Adicionar &marcador (%1) - + &Remove counter (%1) &Remover marcador (%1) - + &Set counters (%1)... &Alterar marcadores (%1)... - + &top of library topo do &grimório - + &bottom of library &fundo do grimório - + &graveyard &cemitério - + Ctrl+Del Ctrl+Del - + &exile &exílio - + &Move to Mo&ver para @@ -1424,17 +1424,16 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - + C&reate &Criar - + &Join &Entrar - @@ -1442,71 +1441,72 @@ This is only saved for moderators and cannot be seen by the banned person. + Error Erro - + Please join the appropriate room first. - + Wrong password. Senha incorreta. - + Spectators are not allowed in this game. Não são permitidos visitantes neste jogo. - + The game is already full. O jogo está cheio. - + The game does not exist any more. O jogo não existe mais. - + This game is only open to registered users. Este jogo é aberto apenas para usuários registrados. - + This game is only open to its creator's buddies. Este jogo é aberto apenas para os amigos de quem criou o jogo. - + You are being ignored by the creator of this game. Você está sendo ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Senha: - + Games Jogos - + Show &full games &Mostrar os jogos cheios - + Show &running games @@ -1515,7 +1515,7 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar os jogos cheios - + J&oin as spectator E&ntrar como visitante @@ -1915,278 +1915,1041 @@ A versão local é %1 e a versão remota é %2. MessageLogWidget - Connecting to %1... - Conectando a %1... + Conectando a %1... - Disconnected from server. - Desconectado do servidor. + Desconectado do servidor. - Invalid password. - Senha incorreta. + Senha incorreta. - Protocol error. - Erro de protocolo. + Erro de protocolo. - + The game has been closed. O jogo foi fechado. - + %1 is now watching the game. %1 está assistindo o jogo agora. - + %1 is not watching the game any more. %1 não está mais assistindo o jogo. - %1 is not ready to start the game any more. - %1 não está mais pronto para começar o jogo. + %1 não está mais pronto para começar o jogo. - - %1 has restored connection to the game. - - - - - %1 has lost connection to the game. - - - - - %1 shuffles %2. - - - - %1 rolls a %2 with a %3-sided die. - %1 tirou um %2 com um dado de %3 lados. + %1 tirou um %2 com um dado de %3 lados. - %1 draws %n card(s). - + %1 compra %n card. %1 compra %n cards. - + + You have joined game #%1. + female + Você entrou no jogo nº %1. + + + + You have joined game #%1. + male + Você entrou no jogo nº %1. + + + + %1 has joined the game. + female + %1 entrou no jogo. + + + + %1 has joined the game. + male + %1 entrou no jogo. + + + + %1 has left the game. + female + %1 saiu do jogo. + + + + %1 has left the game. + male + %1 saiu do jogo. + + + + %1 has loaded a local deck. + female + %1 carregou um deck local. + + + + %1 has loaded a local deck. + male + %1 carregou um deck local. + + + + %1 has loaded deck #%2. + female + %1 carregou o deck nº %2. + + + + %1 has loaded deck #%2. + male + %1 carregou o deck nº %2. + + + + %1 is ready to start the game. + female + %1 está pronto para começar o jogo. + + + + %1 is ready to start the game. + male + %1 está pronto para começar o jogo. + + + + %1 is not ready to start the game any more. + female + %1 não está mais pronto para começar o jogo. + + + + %1 is not ready to start the game any more. + male + %1 não está mais pronto para começar o jogo. + + + + %1 has conceded the game. + female + %1 concedeu o jogo. + + + + %1 has conceded the game. + male + %1 concedeu o jogo. + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female + + + + + %1 shuffles %2. + male + + + + + %1 rolls a %2 with a %3-sided die. + female + %1 tirou um %2 com um dado de %3 lados. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 tirou um %2 com um dado de %3 lados. + + + + %1 draws %n card(s). + female + + %1 compra %n card. + %1 compra %n cards. + + + + + %1 draws %n card(s). + male + + %1 compra %n card. + %1 compra %n cards. + + + + %1 undoes his last draw. %1 desfaz sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz sua última compra (%2). - + %1 undoes her last draw (%2). - + from table vindo do campo de batalha - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library o card do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library vindo do fundo do seu grimório - + from the bottom of her library - + the top card of his library o card do topo do seu grimório - + the top card of her library - + from the top of his library vindo do topo do seu grimório - + from the top of her library - + from library vindo do grimório - + from sideboard vindo do sideboard - + from the stack vindo da pilha - + %1 gives %2 control over %3. %1 dá controle para %2 sobre %3. - + %1 puts %2 into play tapped%3. %1 põe %2 em jogo virado%3. - + %1 puts %2 into play%3. %1 põe %2 no campo de batalha %3. - + %1 puts %2%3 into graveyard. %1 põe %2 no cemitério%3. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2 para a mão%3. - + %1 puts %2%3 into his library. %1 põe %2 no seu grimório%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 põe %2 no fundo do seu grimório%3. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 põe %2 no topo do seu grimório%3. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 põe %2 no seu grimório na posição %4%3. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2 para o sideboard%3. - + %1 plays %2%3. %1 põe %2 na pilha%3. + + + %1 takes a mulligan to %n. + female + + + + + + + + %1 takes a mulligan to %n. + male + + + + + - - + + %1 flips %2 face-down. + female + %1 vira %2 para baixo. + + + + %1 flips %2 face-down. + male + %1 vira %2 para baixo. + + + + %1 flips %2 face-up. + female + %1 vira %2 para cima. + + + + %1 flips %2 face-up. + male + %1 vira %2 para cima. + + + + %1 destroys %2. + female + %1 destrói %2. + + + + %1 destroys %2. + male + %1 destrói %2. + + + %1 attaches %2 to %3's %4. + female + %1 anexa %2 a %4 de %3. + + + %1 attaches %2 to %3's %4. + male + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 anexa %2 a %4 de %3. + + + + %1 unattaches %2. + female + %1 desanexa %2. + + + + %1 unattaches %2. + male + %1 desanexa %2. + + + + %1 creates token: %2%3. + female + %1 cria a ficha: %2%3. + + + + %1 creates token: %2%3. + male + %1 cria a ficha: %2%3. + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 aponta para %4 com %3 de %2 . + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 aponta para %4 com %3 de %2 . + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 aponta para %5 de %4 com %3 de %2. + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + %1 põe %n marcador %2 em %3 (agora %4). + %1 põe %n marcadores %2 em %3 (agora %4). + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 põe %n marcador %2 em %3 (agora %4). + %1 põe %n marcadores %2 em %3 (agora %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 tira %n marcador %2 em %3 (agora %4). + %1 tira %n marcadores %2 em %3 (agora %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + %1 tira %n marcador %2 em %3 (agora %4). + %1 tira %n marcadores %2 em %3 (agora %4). + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 altera o marcador %2 para %3 (%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 altera o marcador %2 para %3 (%4%5). + + + + %1 sets %2 to not untap normally. + female + %1 define que %2 não desvira normalmente. + + + + %1 sets %2 to not untap normally. + male + %1 define que %2 não desvira normalmente. + + + + %1 sets %2 to untap normally. + female + %1 define que %2 desvira normalmente. + + + + %1 sets %2 to untap normally. + male + %1 define que %2 desvira normalmente. + + + + %1 sets PT of %2 to %3. + female + %1 altera o P/R de %2 para %3. + + + + %1 sets PT of %2 to %3. + male + %1 altera o P/R de %2 para %3. + + + + %1 sets annotation of %2 to %3. + female + %1 altera a nota de %2 para%3. + + + + %1 sets annotation of %2 to %3. + male + %1 altera a nota de %2 para%3. + + + + %1 is looking at the top %2 cards %3. + female + %1 está olhando para os %2 cards do topo %3. + + + + %1 is looking at the top %2 cards %3. + male + %1 está olhando para os %2 cards do topo %3. + + + + %1 is looking at %2. + female + %1 está olhando para %2. + + + + %1 is looking at %2. + male + %1 está olhando para %2. + + + + %1 stops looking at %2. + female + %1 para de olhar para %2. + + + + %1 stops looking at %2. + male + %1 para de olhar para %2. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 revela %2 para %3. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 revela %2 para %3. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 revela %2 para %3. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 revela %2 para %3. + + + + %1 reveals %2. + female + %1 revela %2. + + + + %1 reveals %2. + male + %1 revela %2. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + %1 revela aleatoriamente %2%3. para %4. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 revela aleatoriamente %2%3. para %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 revela aleatoriamente %2%3. para %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 revela aleatoriamente %2%3. para %4. + + + + %1 randomly reveals %2%3. + female + %1 revela aleatoriamente %2%3. + + + + %1 randomly reveals %2%3. + male + %1 revela aleatoriamente %2%3. + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + %1 revela %2%3 para %4. + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 revela %2%3 para %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 revela %2%3 para %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 revela %2%3 para %4. + + + + %1 reveals %2%3. + female + %1 revela %2%3. + + + + %1 reveals %2%3. + male + %1 revela %2%3. + + + + It is now %1's turn. + female + Agora é o turno de %1. + + + + It is now %1's turn. + male + Agora é o turno de %1. + + + + a card um card - %1 flips %2 face-down. - %1 vira %2 para baixo. + %1 vira %2 para baixo. - %1 flips %2 face-up. - %1 vira %2 para cima. + %1 vira %2 para cima. - %1 attaches %2 to %3's %4. - %1 anexa %2 a %4 de %3. + %1 anexa %2 a %4 de %3. - %1 unattaches %2. - %1 desanexa %2. + %1 desanexa %2. - %1 points from %2's %3 to %4's %5. - %1 aponta para %5 de %4 com %3 de %2. + %1 aponta para %5 de %4 com %3 de %2. %1 places %n counter(s) (%2) on %3 (now %4). @@ -2203,7 +2966,7 @@ A versão local é %1 e a versão remota é %2. - + red vermelho @@ -2211,7 +2974,7 @@ A versão local é %1 e a versão remota é %2. - + yellow amarelo @@ -2219,7 +2982,7 @@ A versão local é %1 e a versão remota é %2. - + green verde @@ -2227,74 +2990,61 @@ A versão local é %1 e a versão remota é %2. - %1 sets counter %2 to %3 (%4%5). - %1 altera o marcador %2 para %3 (%4%5). + %1 altera o marcador %2 para %3 (%4%5). - %1 sets PT of %2 to %3. - %1 altera o P/R de %2 para %3. + %1 altera o P/R de %2 para %3. - %1 sets annotation of %2 to %3. - %1 altera a nota de %2 para%3. + %1 altera a nota de %2 para%3. - %1 is looking at the top %2 cards %3. - %1 está olhando para os %2 cards do topo %3. + %1 está olhando para os %2 cards do topo %3. - + The game has started. O jogo começou. - Connected. - Conectado. + Conectado. - Protocol version mismatch. Client: %1, Server: %2 - Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 + Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 - You have joined game #%1. - Você entrou no jogo nº %1. + Você entrou no jogo nº %1. - %1 has joined the game. - %1 entrou no jogo. + %1 entrou no jogo. - %1 has left the game. - %1 saiu do jogo. + %1 saiu do jogo. - %1 has loaded a local deck. - %1 carregou um deck local. + %1 carregou um deck local. - %1 has loaded deck #%2. - %1 carregou o deck nº %2. + %1 carregou o deck nº %2. - %1 is ready to start the game. - %1 está pronto para começar o jogo. + %1 está pronto para começar o jogo. - %1 has conceded the game. - %1 concedeu o jogo. + %1 concedeu o jogo. %1 draws a card. @@ -2305,197 +3055,164 @@ A versão local é %1 e a versão remota é %2. %1 compra %2 cards. - %1 destroys %2. - %1 destrói %2. + %1 destrói %2. - %1 creates token: %2%3. - %1 cria a ficha: %2%3. + %1 cria a ficha: %2%3. - %1 points from %2's %3 to %4. - %1 aponta para %4 com %3 de %2 . + %1 aponta para %4 com %3 de %2 . - %1 places %n %2 counter(s) on %3 (now %4). - + %1 põe %n marcador %2 em %3 (agora %4). %1 põe %n marcadores %2 em %3 (agora %4). - %1 removes %n %2 counter(s) from %3 (now %4). - + %1 tira %n marcador %2 em %3 (agora %4). %1 tira %n marcadores %2 em %3 (agora %4). - %1 %2 %3. - %1 %2 %3. + %1 %2 %3. - %1 is looking at %2. - %1 está olhando para %2. + %1 está olhando para %2. - %1 stops looking at %2. - %1 para de olhar para %2. + %1 para de olhar para %2. - %1 reveals %2 to %3. - %1 revela %2 para %3. + %1 revela %2 para %3. - %1 reveals %2. - %1 revela %2. + %1 revela %2. - + ending phase fase final - It is now %1's turn. - Agora é o turno de %1. + Agora é o turno de %1. %1 shuffles his library. %1 embaralha o seu grimório. - - - %1 takes a mulligan to %n. - - - - - - + %1 draws his initial hand. - + %1 draws her initial hand. - - her permanents - - - - %1 randomly reveals %2%3 to %4. - %1 revela aleatoriamente %2%3. para %4. + %1 revela aleatoriamente %2%3. para %4. - %1 randomly reveals %2%3. - %1 revela aleatoriamente %2%3. + %1 revela aleatoriamente %2%3. - %1 reveals %2%3 to %4. - %1 revela %2%3 para %4. + %1 revela %2%3 para %4. - %1 reveals %2%3. - %1 revela %2%3. + %1 revela %2%3. - + untap step etapa de desvirar - + upkeep step etapa de manutenção - + draw step etapa de compra - + first main phase primeira fase principal - + beginning of combat step etapa de início de combate - + declare attackers step etapa de declaracão de atacantes - + declare blockers step etapa de declaração de bloqueadores - + combat damage step etapa de dano de combate - + end of combat step etapa de fim de combate - + second main phase segunda fase principal - + It is now the %1. Agora é a %1. - taps - vira + vira - untaps - desvira + desvira - %1 sets %2 to not untap normally. - %1 define que %2 não desvira normalmente. + %1 define que %2 não desvira normalmente. - %1 sets %2 to untap normally. - %1 define que %2 desvira normalmente. + %1 define que %2 desvira normalmente. - his permanents - as suas permanentes + as suas permanentes @@ -3543,67 +4260,67 @@ Por favor, entre um nome: UserList - + Users online: %1 Usuários online: %1 - + Users in this room: %1 Usuários nesta sala: %1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Usuários ignorados online: %1 / %2 - + %1's games - + User &details &Detalhes do usuário - + Direct &chat &Chat direto - + Show this user's &games - + Add to &buddy list Adicionar à &lista de amigos - + Remove from &buddy list Remover da li&sta de amigos - + Add to &ignore list Adicionar à li&sta dos ignorados - + Remove from &ignore list Remover da lista dos i&gnorados - + Ban from &server Ban&ir do servidor diff --git a/cockatrice/translations/cockatrice_pt.ts b/cockatrice/translations/cockatrice_pt.ts index d4240541..db115aa2 100644 --- a/cockatrice/translations/cockatrice_pt.ts +++ b/cockatrice/translations/cockatrice_pt.ts @@ -235,57 +235,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Jogar - + &Hide Esco&nder - + &Tap &Virar - + &Untap Desv&irar - + Toggle &normal untapping A&lterar desvirar normalmente - + &Flip Vol&tar - + &Clone Copi&ar - + Ctrl+H Ctrl+H - + &Attach to card... Ane&xar a carta... - + Ctrl+A Ctrl+A - + Unattac&h De&sanexar @@ -294,147 +294,147 @@ This is only saved for moderators and cannot be seen by the banned person.Definir &P/R... - + &Draw arrow... - + &Power / toughness &Poder / resistência - + &Increase power &Aumentar poder - + Ctrl++ Ctrl++ - + &Decrease power &Diminuir poder - + Ctrl+- Ctrl+- - + I&ncrease toughness A&umentar resistência - + Alt++ Alt++ - + D&ecrease toughness Di&minuir resistência - + Alt+- Alt+- - + In&crease power and toughness Aumen&tar poder e resistência - + Ctrl+Alt++ Ctrl+Alt++ - + Dec&rease power and toughness Dimin&uir poder e resistência - + Ctrl+Alt+- Ctrl+Alt+- - + Set &power and toughness... Definir &poder e resistência... - + Ctrl+P Ctrl+P - + &Set annotation... Colocar &nota... - + red vermelho - + yellow amarelo - + green verde - + &Add counter (%1) Adicionar &marcador (%1) - + &Remove counter (%1) &Remover marcador (%1) - + &Set counters (%1)... &Denifir marcadores (%1)... - + &top of library Topo do &grimório - + &bottom of library &Fundo do grimório - + &graveyard &Cemitério - + Ctrl+Del Ctrl+Del - + &exile &Exílio - + &Move to M&over para @@ -1424,7 +1424,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1432,71 +1431,72 @@ This is only saved for moderators and cannot be seen by the banned person. + Error Erro - + Please join the appropriate room first. - + Wrong password. Password incorrecta. - + Spectators are not allowed in this game. Não são permitidos espectadores neste jogo. - + The game is already full. O jogo já se encontra cheio. - + The game does not exist any more. O jogo já não existe. - + This game is only open to registered users. Este jogo só está aberto a utilizadores registados. - + This game is only open to its creator's buddies. Este jogo só está aberto aos amigos do seu criador. - + You are being ignored by the creator of this game. Você está a ser ignorado pelo criador deste jogo. - + Join game Entrar no jogo - + Password: Password: - + Games Jogos - + Show &full games &Mostrar jogos cheios - + Show &running games @@ -1505,17 +1505,17 @@ This is only saved for moderators and cannot be seen by the banned person.&Mostrar jogos cheios - + C&reate &Criar - + &Join &Entrar - + J&oin as spectator Entrar como &espectador @@ -1919,92 +1919,78 @@ Versão local é %1, versão remota é %2. MessageLogWidget - Connecting to %1... - Ligando a %1... + Ligando a %1... - Connected. - Ligado. + Ligado. - Disconnected from server. - Desligado do servidor. + Desligado do servidor. - Invalid password. - Password incorrecto. + Password incorrecto. - Protocol version mismatch. Client: %1, Server: %2 - Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 + Versão dos protocolos incompatível. Versão do utilizador:%1, versão do servidor:%2 - Protocol error. - Erro de protocolo. + Erro de protocolo. - You have joined game #%1. - Você entrou no jogo #%1. + Você entrou no jogo #%1. - %1 has joined the game. - %1 entrou no jogo. + %1 entrou no jogo. - %1 has left the game. - %1 abandonou o jogo. + %1 abandonou o jogo. - + The game has been closed. Este jogo foi encerrado. - + %1 is now watching the game. %1 está agora a ver o jogo. - + %1 is not watching the game any more. %1 já não está a ver o jogo. - %1 has loaded a local deck. - %1 carregou um deck local. + %1 carregou um deck local. - %1 has loaded deck #%2. - %1 carregou o deck #%2. + %1 carregou o deck #%2. - %1 is ready to start the game. - %1 está pronto a começar o jogo. + %1 está pronto a começar o jogo. - %1 is not ready to start the game any more. - %1 já não está pronto a começar o jogo. + %1 já não está pronto a começar o jogo. - %1 has conceded the game. - %1 concedeu o jogo. + %1 concedeu o jogo. - + The game has started. O jogo começou. @@ -2013,9 +1999,8 @@ Versão local é %1, versão remota é %2. %1 baralha o grimório. - %1 rolls a %2 with a %3-sided die. - %1 obteve %2 com um dado de %3 faces. + %1 obteve %2 com um dado de %3 faces. %1 draws a card. @@ -2026,158 +2011,330 @@ Versão local é %1, versão remota é %2. %1 compra %2 cartas. - + + You have joined game #%1. + female + Você entrou no jogo #%1. + + + + You have joined game #%1. + male + Você entrou no jogo #%1. + + + + %1 has joined the game. + female + %1 entrou no jogo. + + + + %1 has joined the game. + male + %1 entrou no jogo. + + + + %1 has left the game. + female + %1 abandonou o jogo. + + + + %1 has left the game. + male + %1 abandonou o jogo. + + + + %1 has loaded a local deck. + female + %1 carregou um deck local. + + + + %1 has loaded a local deck. + male + %1 carregou um deck local. + + + + %1 has loaded deck #%2. + female + %1 carregou o deck #%2. + + + + %1 has loaded deck #%2. + male + %1 carregou o deck #%2. + + + + %1 is ready to start the game. + female + %1 está pronto a começar o jogo. + + + + %1 is ready to start the game. + male + %1 está pronto a começar o jogo. + + + + %1 is not ready to start the game any more. + female + %1 já não está pronto a começar o jogo. + + + + %1 is not ready to start the game any more. + male + %1 já não está pronto a começar o jogo. + + + + %1 has conceded the game. + female + %1 concedeu o jogo. + + + + %1 has conceded the game. + male + %1 concedeu o jogo. + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female + + + + + %1 shuffles %2. + male + + + + + %1 rolls a %2 with a %3-sided die. + female + %1 obteve %2 com um dado de %3 faces. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 obteve %2 com um dado de %3 faces. + + + + %1 draws %n card(s). + female + + %1 compra %n carta. + %1 compra %n cartas. + + + + + %1 draws %n card(s). + male + + %1 compra %n carta. + %1 compra %n cartas. + + + + from table vindo da mesa - + from graveyard vindo do cemitério - + from exile vindo do exílio - + from hand vindo da mão - + the bottom card of his library a carta do fundo do seu grimório - + the bottom card of her library - + from the bottom of his library do fundo do seu grimório - + from the bottom of her library - + the top card of his library a carta do topo do seu grimório - + the top card of her library - + from the top of his library do topo do seu grimório - + from the top of her library - + from library do grimório - + from sideboard do sideboard - + from the stack da pilha - + %1 puts %2 into play tapped%3. %1 coloca %2 em jogo virado(a)%3. - + %1 puts %2 into play%3. %1 coloca %2 em jogo %3. - + %1 puts %2%3 into graveyard. %1 coloca %2%3 no cemitério. - + %1 exiles %2%3. %1 exila %2%3. - + %1 moves %2%3 to hand. %1 move %2%3 para a mão. - + %1 puts %2%3 into his library. %1 coloca %2%3 no seu grimório. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. %1 coloca %2%3 no fundo do seu grimório. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. %1 coloca %2%3 no topo do seu grimório. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. %1 coloca %2%3 no seu grimório na posição %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. %1 move %2%3 para o sideboard. - + %1 plays %2%3. %1 joga %2%3. - + %1 takes a mulligan to %n. + female + + + + + + + + %1 takes a mulligan to %n. + male @@ -2185,123 +2342,707 @@ Versão local é %1, versão remota é %2. - %1 draws his initial hand. + %1 flips %2 face-down. + female + %1 volta a face de %2 para baixo. + + + + %1 flips %2 face-down. + male + %1 volta a face de %2 para baixo. + + + + %1 flips %2 face-up. + female + %1 volta a face de %2 para cima. + + + + %1 flips %2 face-up. + male + %1 volta a face de %2 para cima. + + + + %1 destroys %2. + female + %1 destrói %2. + + + + %1 destroys %2. + male + %1 destrói %2. + + + %1 attaches %2 to %3's %4. + female + %1 anexa %2 a %4 de %3. + + + %1 attaches %2 to %3's %4. + male + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 anexa %2 a %4 de %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 anexa %2 a %4 de %3. + + + + %1 unattaches %2. + female + %1 desanexa %2. + + + + %1 unattaches %2. + male + %1 desanexa %2. + + + + %1 creates token: %2%3. + female + %1 cria ficha: %2%3. + + + + %1 creates token: %2%3. + male + %1 cria ficha: %2%3. + + + + %1 points from her %2 to herself. + female - - %1 draws her initial hand. + + %1 points from his %2 to himself. + male + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 aponta de %3 de %2 para %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 aponta de %3 de %2 para %4. + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 aponta de %3 de %2 para %5 de %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 aponta de %3 de %2 para %5 de %4. + - + %1 places %n %2 counter(s) on %3 (now %4). - + female + %1 coloca %n %2 marcador em %3 (agora com %4). %1 coloca %n %2 marcadores em %3 (agora com %4). - + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 coloca %n %2 marcador em %3 (agora com %4). + %1 coloca %n %2 marcadores em %3 (agora com %4). + + + + %1 removes %n %2 counter(s) from %3 (now %4). - + female + + %1 remove %n %2 marcador de %3 (agora com %4). + %1 remove %n %2 marcadores de %3 (agora com %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + %1 remove %n %2 marcador de %3 (agora com %4). %1 remove %n %2 marcadores de %3 (agora com %4). - - - a card - uma carta - - - - %1 has restored connection to the game. + + %1 taps her permanents. + female - - %1 has lost connection to the game. + + %1 untaps her permanents. + female - - %1 shuffles %2. + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 altera o número de marcadores %2 para %3(%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 altera o número de marcadores %2 para %3(%4%5). + + + + %1 sets %2 to not untap normally. + female + %1 define %2 para não desvirar normalmente. + + + + %1 sets %2 to not untap normally. + male + %1 define %2 para não desvirar normalmente. + + + + %1 sets %2 to untap normally. + female + %1 define %2 para desvirar normalmente. + + + + %1 sets %2 to untap normally. + male + %1 define %2 para desvirar normalmente. + + + + %1 sets PT of %2 to %3. + female + %1 define o P/R de %2 como %3. + + + + %1 sets PT of %2 to %3. + male + %1 define o P/R de %2 como %3. + + + + %1 sets annotation of %2 to %3. + female + %1 coloca uma nota de %2 em%3. + + + + %1 sets annotation of %2 to %3. + male + %1 coloca uma nota de %2 em%3. + + + + %1 is looking at the top %2 cards %3. + female + %1 está a olhar para as %2 cartas do topo %3. + + + + %1 is looking at the top %2 cards %3. + male + %1 está a olhar para as %2 cartas do topo %3. + + + + %1 is looking at %2. + female + %1 está a olhar para %2. + + + + %1 is looking at %2. + male + %1 está a olhar para %2. + + + + %1 stops looking at %2. + female + %1 para de olhar para %2. + + + + %1 stops looking at %2. + male + %1 para de olhar para %2. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 revela %2 a %3. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 revela %2 a %3. + + + + %1 reveals %2. + female + %1 revela %2. + + + + %1 reveals %2. + male + %1 revela %2. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + %1 revela aleatoreamente %2%3. a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 revela aleatoreamente %2%3. a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 revela aleatoreamente %2%3. a %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 revela aleatoreamente %2%3. a %4. + + + + %1 randomly reveals %2%3. + female + %1 revela aleatoreamente %2%3. + + + + %1 randomly reveals %2%3. + male + %1 revela aleatoreamente %2%3. + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 revela %2%3 a %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 revela %2%3 a %4. + + + + %1 reveals %2%3. + female + %1 revela %2%3. + + + + %1 reveals %2%3. + male + %1 revela %2%3. + + + + It is now %1's turn. + female + É agora o turno de %1. + + + + It is now %1's turn. + male + É agora o turno de %1. + + + + %1 draws his initial hand. + + + + + %1 draws her initial hand. - + %1 places %n %2 counter(s) on %3 (now %4). + + %1 coloca %n %2 marcador em %3 (agora com %4). + %1 coloca %n %2 marcadores em %3 (agora com %4). + + + + %1 removes %n %2 counter(s) from %3 (now %4). + + %1 remove %n %2 marcador de %3 (agora com %4). + %1 remove %n %2 marcadores de %3 (agora com %4). + + + + + + a card + uma carta + + %1 draws %n card(s). - + %1 compra %n carta. %1 compra %n cartas. - + %1 undoes his last draw. %1 desfaz a sua última compra. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). %1 desfaz a sua última compra (%2). - + %1 undoes her last draw (%2). - + %1 gives %2 control over %3. %1 dá controlo sobre %3 a %2. - %1 flips %2 face-down. - %1 volta a face de %2 para baixo. + %1 volta a face de %2 para baixo. - %1 flips %2 face-up. - %1 volta a face de %2 para cima. + %1 volta a face de %2 para cima. - %1 destroys %2. - %1 destrói %2. + %1 destrói %2. - %1 attaches %2 to %3's %4. - %1 anexa %2 a %4 de %3. + %1 anexa %2 a %4 de %3. - %1 unattaches %2. - %1 desanexa %2. + %1 desanexa %2. - %1 creates token: %2%3. - %1 cria ficha: %2%3. + %1 cria ficha: %2%3. - %1 points from %2's %3 to %4. - %1 aponta de %3 de %2 para %4. + %1 aponta de %3 de %2 para %4. - %1 points from %2's %3 to %4's %5. - %1 aponta de %3 de %2 para %5 de %4. + %1 aponta de %3 de %2 para %5 de %4. %1 places %n counter(s) (%2) on %3 (now %4). @@ -2318,7 +3059,7 @@ Versão local é %1, versão remota é %2. - + red vermelho @@ -2326,7 +3067,7 @@ Versão local é %1, versão remota é %2. - + yellow amarelo @@ -2334,7 +3075,7 @@ Versão local é %1, versão remota é %2. - + green verde @@ -2342,162 +3083,138 @@ Versão local é %1, versão remota é %2. - his permanents - as suas permanentes + as suas permanentes - - her permanents - - - - %1 %2 %3. - %1 %2 %3. + %1 %2 %3. - taps - vira + vira - untaps - desvira + desvira - %1 sets counter %2 to %3 (%4%5). - %1 altera o número de marcadores %2 para %3(%4%5). + %1 altera o número de marcadores %2 para %3(%4%5). - %1 sets %2 to not untap normally. - %1 define %2 para não desvirar normalmente. + %1 define %2 para não desvirar normalmente. - %1 sets %2 to untap normally. - %1 define %2 para desvirar normalmente. + %1 define %2 para desvirar normalmente. - %1 sets PT of %2 to %3. - %1 define o P/R de %2 como %3. + %1 define o P/R de %2 como %3. - %1 sets annotation of %2 to %3. - %1 coloca uma nota de %2 em%3. + %1 coloca uma nota de %2 em%3. - %1 is looking at the top %2 cards %3. - %1 está a olhar para as %2 cartas do topo %3. + %1 está a olhar para as %2 cartas do topo %3. - %1 is looking at %2. - %1 está a olhar para %2. + %1 está a olhar para %2. - %1 stops looking at %2. - %1 para de olhar para %2. + %1 para de olhar para %2. - %1 reveals %2 to %3. - %1 revela %2 a %3. + %1 revela %2 a %3. - %1 reveals %2. - %1 revela %2. + %1 revela %2. - %1 randomly reveals %2%3 to %4. - %1 revela aleatoreamente %2%3. a %4. + %1 revela aleatoreamente %2%3. a %4. - %1 randomly reveals %2%3. - %1 revela aleatoreamente %2%3. + %1 revela aleatoreamente %2%3. - %1 reveals %2%3 to %4. - %1 revela %2%3 a %4. + %1 revela %2%3 a %4. - %1 reveals %2%3. - %1 revela %2%3. + %1 revela %2%3. - It is now %1's turn. - É agora o turno de %1. + É agora o turno de %1. - + untap step Etapa de Desvirar - + upkeep step Etapa de Manutenção - + draw step Etapa de Compra - + first main phase 1ª Fase Principal (pré-combate) - + beginning of combat step Etapa de Início de Combate - + declare attackers step Etapa de Declaração de Atacantes - + declare blockers step Etapa de Declaração de Bloqueadores - + combat damage step Etapa de Dano de Combate - + end of combat step Etapa de Fim de Combate - + second main phase 2ª Fase Principal (pós-combate) - + ending phase Fase Final - + It is now the %1. É agora a %1. @@ -3547,67 +4264,67 @@ Por favor introduza um nome: UserList - + Users online: %1 Utilizadores online: %1 - + Users in this room: %1 Utilizadores nesta sala:%1 - + Buddies online: %1 / %2 Amigos online: %1 / %2 - + Ignored users online: %1 / %2 Utilizadores ignorados online %1 / %2 - + %1's games - + User &details Detalhes do &utilizador - + Direct &chat Conversação &directa - + Show this user's &games - + Add to &buddy list Adicionar a lista de &amigos - + Remove from &buddy list Remover da lista de &amigos - + Add to &ignore list Adicionar a lista a &ignorar - + Remove from &ignore list Remover da lista a &ignorar - + Ban from &server Banir do &servidor diff --git a/cockatrice/translations/cockatrice_ru.ts b/cockatrice/translations/cockatrice_ru.ts index b467a4e0..a32a425d 100644 --- a/cockatrice/translations/cockatrice_ru.ts +++ b/cockatrice/translations/cockatrice_ru.ts @@ -231,57 +231,57 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play &Разыграть - + &Hide &Cкрыть - + &Tap &Повернуть - + &Untap &Развернуть - + Toggle &normal untapping (Не) &Разворачивать как обычно - + &Flip &Рубашкой вверх (вниз) - + &Clone &Клонировать - + Ctrl+H Ctrl+H - + &Attach to card... &Прикрепить к... - + Ctrl+A - + Unattac&h &Открепить @@ -290,147 +290,147 @@ This is only saved for moderators and cannot be seen by the banned person.Установить &Силу/Защиту... - + &Draw arrow... - + &Power / toughness &Сила / защита - + &Increase power &Увеличить силу - + Ctrl++ - + &Decrease power У&меньшить силу - + Ctrl+- - + I&ncrease toughness У&величить защиту - + Alt++ - + D&ecrease toughness Уменьшить &защиту - + Alt+- - + In&crease power and toughness Увеличить силу &и защиту - + Ctrl+Alt++ - + Dec&rease power and toughness Уменьшить силу и за&щиту - + Ctrl+Alt+- - + Set &power and toughness... Уст&ановить силу / защиту... - + Ctrl+P - + &Set annotation... &Пометить... - + red Красный - + yellow Желтый - + green Зеленый - + &Add counter (%1) &Добавить жетон (%1) - + &Remove counter (%1) &Убрать жетон (%1) - + &Set counters (%1)... &Установить жетоны (%1)... - + &top of library &Наверх библиотеки - + &bottom of library &Вниз библиотеки - + &graveyard &На кладбище - + Ctrl+Del - + &exile &Изгнать - + &Move to &Переместить... @@ -1363,7 +1363,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1371,86 +1370,87 @@ This is only saved for moderators and cannot be seen by the banned person. + Error Ошибка - + Please join the appropriate room first. - + Wrong password. Неверный пароль. - + Spectators are not allowed in this game. В эту игру не пускают зрителей. - + The game is already full. Все места заняты! =Ь - + The game does not exist any more. Эта игра была удалена. - + This game is only open to registered users. Доступно только для зарегистрированных. - + This game is only open to its creator's buddies. Доступно только для друзей. - + You are being ignored by the creator of this game. Вы добавлены в игнор-лист данного игрока. - + Join game Присоединиться - + Password: Пароль: - + Games Игры - + Show &full games Показывать &текущие - + Show &running games - + C&reate С&оздать - + &Join &Присоединиться - + J&oin as spectator П&рисоединиться как зритель @@ -1843,92 +1843,78 @@ Local version is %1, remote version is %2. MessageLogWidget - Connecting to %1... - Подключение к %1... + Подключение к %1... - Connected. - Подключено. + Подключено. - Disconnected from server. - Нет соединения с сервером. + Нет соединения с сервером. - Invalid password. - Неверный пароль. + Неверный пароль. - Protocol version mismatch. Client: %1, Server: %2 - Несовпадение версий. Клиент: %1, Сервер: %2 + Несовпадение версий. Клиент: %1, Сервер: %2 - Protocol error. - Ошибка протокола. + Ошибка протокола. - You have joined game #%1. - Вы присоединились к игре #%1. + Вы присоединились к игре #%1. - %1 has joined the game. - %1 присоединился к игре. + %1 присоединился к игре. - %1 has left the game. - %1 покиул игру. + %1 покиул игру. - + The game has been closed. Игра закрыта. - + %1 is now watching the game. %1 вошел как зритель. - + %1 is not watching the game any more. %1 покинул зрительскую ложу. - %1 has loaded a local deck. - %1 загрузил колоду с диска. + %1 загрузил колоду с диска. - %1 has loaded deck #%2. - %1 загрузил колоду #%2. + %1 загрузил колоду #%2. - %1 is ready to start the game. - %1 готов начать игру. + %1 готов начать игру. - %1 is not ready to start the game any more. - %1 все еще не готов. + %1 все еще не готов. - %1 has conceded the game. - %1 решил сдаться. + %1 решил сдаться. - + The game has started. Игра началась. @@ -1937,9 +1923,8 @@ Local version is %1, remote version is %2. %1 размешивает библиотеку. - %1 rolls a %2 with a %3-sided die. - %1 выкинул %2 / %3. + %1 выкинул %2 / %3. %1 draws a card. @@ -1950,170 +1935,960 @@ Local version is %1, remote version is %2. %1 взял %2 карт. - + + You have joined game #%1. + female + Вы присоединились к игре #%1. + + + + You have joined game #%1. + male + Вы присоединились к игре #%1. + + + + %1 has joined the game. + female + %1 присоединился к игре. + + + + %1 has joined the game. + male + %1 присоединился к игре. + + + + %1 has left the game. + female + %1 покиул игру. + + + + %1 has left the game. + male + %1 покиул игру. + + + + %1 has loaded a local deck. + female + %1 загрузил колоду с диска. + + + + %1 has loaded a local deck. + male + %1 загрузил колоду с диска. + + + + %1 has loaded deck #%2. + female + %1 загрузил колоду #%2. + + + + %1 has loaded deck #%2. + male + %1 загрузил колоду #%2. + + + + %1 is ready to start the game. + female + %1 готов начать игру. + + + + %1 is ready to start the game. + male + %1 готов начать игру. + + + + %1 is not ready to start the game any more. + female + %1 все еще не готов. + + + + %1 is not ready to start the game any more. + male + %1 все еще не готов. + + + + %1 has conceded the game. + female + %1 решил сдаться. + + + + %1 has conceded the game. + male + %1 решил сдаться. + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female + + + + + %1 shuffles %2. + male + + + + + %1 rolls a %2 with a %3-sided die. + female + %1 выкинул %2 / %3. + + + + %1 rolls a %2 with a %3-sided die. + male + %1 выкинул %2 / %3. + + + + %1 draws %n card(s). + female + + %1 взял %n карту. + %1 взял %n карты. + %1 взял %n карт(ы). + + + + + %1 draws %n card(s). + male + + %1 взял %n карту. + %1 взял %n карты. + %1 взял %n карт(ы). + + + + %1 undoes his last draw. %1 отменил последнее взятие. - + %1 undoes his last draw (%2). %1 отменил %2 последних взятий. - + from table с поля битвы - + from graveyard из кладбища - + from exile из изгнания - + from hand из руки - + the bottom card of his library нижнюю карту своей библиотеки - + from the bottom of his library со дна своей библиотеки - + the top card of his library верхнюю карту своей библиотеки - + from the top of his library с верха своей библиотеки - + from library из библиотеки - + from sideboard из сайда - + from the stack из стека - - + + a card карту - + %1 gives %2 control over %3. %1 передает %2 контроль над %3. - + %1 puts %2 into play%3. %1 поместил %2 на поле битвы %3. - + %1 puts %2%3 into graveyard. %1 поместил %2%3 на кладбище. - + %1 exiles %2%3. %1 изгоняет %2%3. - + %1 moves %2%3 to hand. %1 поместил %2%3 в руку. - + %1 puts %2%3 into his library. %1 поместил %2%3 в свою библиотеку. - + %1 puts %2%3 on bottom of his library. %1 поместил %2%3 на дно своей библиотеки. - + %1 puts %2%3 on top of his library. %1 поместил %2%3 на верх своей библиотеки. - + %1 puts %2%3 into his library at position %4. %1 поместил %2%3 в свою библиотеку %4 сверху. - + %1 moves %2%3 to sideboard. %1 поместил %2%3 в сайд. - + %1 plays %2%3. %1 разыгрывает %2%3. + + + %1 takes a mulligan to %n. + female + + + + + + + + + %1 takes a mulligan to %n. + male + + + + + + - + %1 flips %2 face-down. - %1 перевернул %2 лицом вниз. + female + %1 перевернул %2 лицом вниз. - + + %1 flips %2 face-down. + male + %1 перевернул %2 лицом вниз. + + + %1 flips %2 face-up. - %1 перевернул %2 лицом вверх. + female + %1 перевернул %2 лицом вверх. - + + %1 flips %2 face-up. + male + %1 перевернул %2 лицом вверх. + + + %1 destroys %2. - %1 уничтожил %2. + female + %1 уничтожил %2. + + + + %1 destroys %2. + male + %1 уничтожил %2. - %1 attaches %2 to %3's %4. - %1 присоединил %2 к %4 игрока %3. + female + %1 присоединил %2 к %4 игрока %3. - + %1 attaches %2 to %3's %4. + male + %1 присоединил %2 к %4 игрока %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 female + %1 присоединил %2 к %4 игрока %3. + + + + %1 attaches %2 to %3's %4. + p1 female, p2 male + %1 присоединил %2 к %4 игрока %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 female + %1 присоединил %2 к %4 игрока %3. + + + + %1 attaches %2 to %3's %4. + p1 male, p2 male + %1 присоединил %2 к %4 игрока %3. + + + %1 unattaches %2. - %1 отсоединил %2. + female + %1 отсоединил %2. - + + %1 unattaches %2. + male + %1 отсоединил %2. + + + %1 creates token: %2%3. - %1 создал фишку: %2%3. + female + %1 создал фишку: %2%3. - + + %1 creates token: %2%3. + male + %1 создал фишку: %2%3. + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + %1 points from %2's %3 to %4. - %1 указывает с %3 контролируемого %2 на %4. + p1 female, p2 female, p3 female + %1 указывает с %3 контролируемого %2 на %4. - + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + %1 указывает с %3 контролируемого %2 на %4. + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + %1 points from %2's %3 to %4's %5. - %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + p1 female, p2 female, p3 female + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + %1 поместил %n %2 жетон на %3 (теперь %4). + %1 поместил %n %2 жетона на %3 (теперь %4). + %1 поместил %n %2 жетонов на %3 (теперь %4). + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + %1 поместил %n %2 жетон на %3 (теперь %4). + %1 поместил %n %2 жетона на %3 (теперь %4). + %1 поместил %n %2 жетонов на %3 (теперь %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + %1 снял %n %2 жетон с %3 (теперь %4). + %1 снял %n %2 жетона с %3 (теперь %4). + %1 снял %n %2 жетонов с %3 (теперь %4). + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + %1 снял %n %2 жетон с %3 (теперь %4). + %1 снял %n %2 жетона с %3 (теперь %4). + %1 снял %n %2 жетонов с %3 (теперь %4). + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + %1 установил жетон %2 на %3 (%4%5). + + + + %1 sets counter %2 to %3 (%4%5). + male + %1 установил жетон %2 на %3 (%4%5). + + + + %1 sets %2 to not untap normally. + female + %2 теперь не разворачивается как обычно (%1). + + + + %1 sets %2 to not untap normally. + male + %2 теперь не разворачивается как обычно (%1). + + + + %1 sets %2 to untap normally. + female + %2 теперь разворачивается как обычно (%1). + + + + %1 sets %2 to untap normally. + male + %2 теперь разворачивается как обычно (%1). + + + + %1 sets PT of %2 to %3. + female + %1 установил Силу/Защиту %2 %3. + + + + %1 sets PT of %2 to %3. + male + %1 установил Силу/Защиту %2 %3. + + + + %1 sets annotation of %2 to %3. + female + %1 сделал пометку на %2 "%3". + + + + %1 sets annotation of %2 to %3. + male + %1 сделал пометку на %2 "%3". + + + + %1 is looking at the top %2 cards %3. + female + %1 смотрит верхние %2 карт библиотеки %3. + + + + %1 is looking at the top %2 cards %3. + male + %1 смотрит верхние %2 карт библиотеки %3. + + + + %1 is looking at %2. + female + %1 просматривает %2. + + + + %1 is looking at %2. + male + %1 просматривает %2. + + + + %1 stops looking at %2. + female + %1 закончил просматривать %2. + + + + %1 stops looking at %2. + male + %1 закончил просматривать %2. + + + + %1 reveals %2 to %3. + p1 female, p2 female + %1 показывает его %2 %3. + + + + %1 reveals %2 to %3. + p1 female, p2 male + %1 показывает его %2 %3. + + + + %1 reveals %2 to %3. + p1 male, p2 female + %1 показывает его %2 %3. + + + + %1 reveals %2 to %3. + p1 male, p2 male + %1 показывает его %2 %3. + + + + %1 reveals %2. + female + %1 открыл его %2. + + + + %1 reveals %2. + male + %1 открыл его %2. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + %1 показывает случайно выбранную%3 карту (%2) %4. + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + %1 показывает случайно выбранную%3 карту (%2) %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + %1 показывает случайно выбранную%3 карту (%2) %4. + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + %1 показывает случайно выбранную%3 карту (%2) %4. + + + + %1 randomly reveals %2%3. + female + %1 открывает случайно выбранную%3 карту (%2). + + + + %1 randomly reveals %2%3. + male + %1 открывает случайно выбранную%3 карту (%2). + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + %1 показывает%2%3 %4. + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + %1 показывает%2%3 %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + %1 показывает%2%3 %4. + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + %1 показывает%2%3 %4. + + + + %1 reveals %2%3. + female + %1 открывает%2%3. + + + + %1 reveals %2%3. + male + %1 открывает%2%3. + + + + It is now %1's turn. + female + Ход игрока %1. + + + + It is now %1's turn. + male + Ход игрока %1. + + + %1 flips %2 face-down. + %1 перевернул %2 лицом вниз. + + + %1 flips %2 face-up. + %1 перевернул %2 лицом вверх. + + + %1 destroys %2. + %1 уничтожил %2. + + + %1 attaches %2 to %3's %4. + %1 присоединил %2 к %4 игрока %3. + + + %1 unattaches %2. + %1 отсоединил %2. + + + %1 creates token: %2%3. + %1 создал фишку: %2%3. + + + %1 points from %2's %3 to %4. + %1 указывает с %3 контролируемого %2 на %4. + + + %1 points from %2's %3 to %4's %5. + %1 указывает с %3 контролируемого %2 на %5 контролируемого %4. %1 places %n counter(s) (%2) on %3 (now %4). @@ -2131,124 +2906,97 @@ Local version is %1, remote version is %2. %1 удалил %n жетоны (%2) с %3 (теперь %4). - - - %1 has restored connection to the game. - - - - - %1 has lost connection to the game. - - - - - %1 shuffles %2. - - - %1 draws %n card(s). - + %1 взял %n карту. %1 взял %n карты. %1 взял %n карт(ы). - + %1 undoes her last draw. - + %1 undoes her last draw (%2). - + the bottom card of her library - + from the bottom of her library - + the top card of her library - + from the top of her library - + %1 puts %2 into play tapped%3. %1 положил %2 повернутым на поле битвы%3. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into her library at position %4. - - - %1 takes a mulligan to %n. - - - - - - - + %1 draws his initial hand. - + %1 draws her initial hand. - %1 places %n %2 counter(s) on %3 (now %4). - + %1 поместил %n %2 жетон на %3 (теперь %4). %1 поместил %n %2 жетона на %3 (теперь %4). %1 поместил %n %2 жетонов на %3 (теперь %4). - %1 removes %n %2 counter(s) from %3 (now %4). - + %1 снял %n %2 жетон с %3 (теперь %4). %1 снял %n %2 жетона с %3 (теперь %4). %1 снял %n %2 жетонов с %3 (теперь %4). - + red красный @@ -2257,7 +3005,7 @@ Local version is %1, remote version is %2. - + yellow желтый @@ -2266,7 +3014,7 @@ Local version is %1, remote version is %2. - + green зеленый @@ -2275,162 +3023,138 @@ Local version is %1, remote version is %2. - his permanents - свои перманенты + свои перманенты - - her permanents - - - - %1 %2 %3. - %1 %2 %3. + %1 %2 %3. - taps - повернул + повернул - untaps - развернул + развернул - %1 sets counter %2 to %3 (%4%5). - %1 установил жетон %2 на %3 (%4%5). + %1 установил жетон %2 на %3 (%4%5). - %1 sets %2 to not untap normally. - %2 теперь не разворачивается как обычно (%1). + %2 теперь не разворачивается как обычно (%1). - %1 sets %2 to untap normally. - %2 теперь разворачивается как обычно (%1). + %2 теперь разворачивается как обычно (%1). - %1 sets PT of %2 to %3. - %1 установил Силу/Защиту %2 %3. + %1 установил Силу/Защиту %2 %3. - %1 sets annotation of %2 to %3. - %1 сделал пометку на %2 "%3". + %1 сделал пометку на %2 "%3". - %1 is looking at the top %2 cards %3. - %1 смотрит верхние %2 карт библиотеки %3. + %1 смотрит верхние %2 карт библиотеки %3. - %1 is looking at %2. - %1 просматривает %2. + %1 просматривает %2. - %1 stops looking at %2. - %1 закончил просматривать %2. + %1 закончил просматривать %2. - %1 reveals %2 to %3. - %1 показывает его %2 %3. + %1 показывает его %2 %3. - %1 reveals %2. - %1 открыл его %2. + %1 открыл его %2. - %1 randomly reveals %2%3 to %4. - %1 показывает случайно выбранную%3 карту (%2) %4. + %1 показывает случайно выбранную%3 карту (%2) %4. - %1 randomly reveals %2%3. - %1 открывает случайно выбранную%3 карту (%2). + %1 открывает случайно выбранную%3 карту (%2). - %1 reveals %2%3 to %4. - %1 показывает%2%3 %4. + %1 показывает%2%3 %4. - %1 reveals %2%3. - %1 открывает%2%3. + %1 открывает%2%3. - It is now %1's turn. - Ход игрока %1. + Ход игрока %1. - + untap step шаг разворота - + upkeep step шаг поддержки - + draw step шаг взятия карты - + first main phase первая главная фаза - + beginning of combat step шаг начала битвы - + declare attackers step шаг назначения атакующих - + declare blockers step шаг назначения блокирующих - + combat damage step шаг нанесения повреждений - + end of combat step шаг завершения битвы - + second main phase вторая главная фаза - + ending phase заключительный шаг - + It is now the %1. Сейчас %1. @@ -3438,67 +4162,67 @@ Please enter a name: UserList - + Users online: %1 Пользователей онлайн: %1 - + Users in this room: %1 Пользователей в этой комнате: %1 - + Buddies online: %1 / %2 Друзей онлайн: %1 / %2 - + Ignored users online: %1 / %2 Игнорируемых пользователей онлайн: %1 / %2 - + %1's games - + User &details Данные о &пользователе - + Direct &chat Обратиться &лично - + Show this user's &games - + Add to &buddy list Добавить в список &друзей - + Remove from &buddy list &Удалить из друзей - + Add to &ignore list Добавить в &игнор-лист - + Remove from &ignore list Удалить и&з игнор-листа - + Ban from &server За&банить на сервере diff --git a/cockatrice/translations/cockatrice_sk.ts b/cockatrice/translations/cockatrice_sk.ts index 59267fe5..a5155a2f 100644 --- a/cockatrice/translations/cockatrice_sk.ts +++ b/cockatrice/translations/cockatrice_sk.ts @@ -230,202 +230,202 @@ This is only saved for moderators and cannot be seen by the banned person. CardItem - + &Play - + &Hide - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + Ctrl+H - + &Attach to card... - + Ctrl+A - + Unattac&h - + &Draw arrow... - + &Power / toughness - + &Increase power - + Ctrl++ - + &Decrease power - + Ctrl+- - + I&ncrease toughness - + Alt++ - + D&ecrease toughness - + Alt+- - + In&crease power and toughness - + Ctrl+Alt++ - + Dec&rease power and toughness - + Ctrl+Alt+- - + Set &power and toughness... - + Ctrl+P - + &Set annotation... - + red - + yellow - + green - + &Add counter (%1) - + &Remove counter (%1) - + &Set counters (%1)... - + &top of library - + &bottom of library - + &graveyard - + Ctrl+Del - + &exile - + &Move to @@ -1208,7 +1208,6 @@ This is only saved for moderators and cannot be seen by the banned person. GameSelector - @@ -1216,86 +1215,87 @@ This is only saved for moderators and cannot be seen by the banned person. + Error - + Please join the appropriate room first. - + Wrong password. - + Spectators are not allowed in this game. - + The game is already full. - + The game does not exist any more. - + This game is only open to registered users. - + This game is only open to its creator's buddies. - + You are being ignored by the creator of this game. - + Join game - + Password: - + Games - + Show &full games - + Show &running games - + C&reate - + &Join - + J&oin as spectator @@ -1684,118 +1684,183 @@ Local version is %1, remote version is %2. MessageLogWidget - - Connecting to %1... - - - - - Connected. - - - - - Disconnected from server. - - - - - Invalid password. - - - - - Protocol version mismatch. Client: %1, Server: %2 - - - - - Protocol error. - - - - - You have joined game #%1. - - - - - %1 has joined the game. - - - - - %1 has left the game. - - - - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - - %1 has loaded a local deck. - - - - - %1 has loaded deck #%2. - - - - - %1 is ready to start the game. - - - - - %1 is not ready to start the game any more. - - - - - %1 has conceded the game. - - - - + The game has started. - + + You have joined game #%1. + female + + + + + You have joined game #%1. + male + + + + + %1 has joined the game. + female + + + + + %1 has joined the game. + male + + + + + %1 has left the game. + female + + + + + %1 has left the game. + male + + + + + %1 has loaded a local deck. + female + + + + + %1 has loaded a local deck. + male + + + + + %1 has loaded deck #%2. + female + + + + + %1 has loaded deck #%2. + male + + + + + %1 is ready to start the game. + female + + + + + %1 is ready to start the game. + male + + + + + %1 is not ready to start the game any more. + female + + + + + %1 is not ready to start the game any more. + male + + + + + %1 has conceded the game. + female + + + + + %1 has conceded the game. + male + + + + %1 has restored connection to the game. + female + + + + + %1 has restored connection to the game. + male + + + + + %1 has lost connection to the game. + female + + + + + %1 has lost connection to the game. + male + + + + + %1 shuffles %2. + female - %1 has lost connection to the game. - - - - %1 shuffles %2. + male - + %1 rolls a %2 with a %3-sided die. + female + + + + + %1 rolls a %2 with a %3-sided die. + male - + %1 draws %n card(s). + female + + + + + + + + + %1 draws %n card(s). + male @@ -1803,189 +1868,200 @@ Local version is %1, remote version is %2. - + %1 undoes his last draw. - + %1 undoes her last draw. - + %1 undoes his last draw (%2). - + %1 undoes her last draw (%2). - + from table - + from graveyard - + from exile - + from hand - + the bottom card of his library - + the bottom card of her library - + from the bottom of his library - + from the bottom of her library - + the top card of his library - + the top card of her library - + from the top of his library - + from the top of her library - + from library - + from sideboard - + from the stack - - + + a card - + %1 gives %2 control over %3. - + %1 puts %2 into play tapped%3. - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 into her library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on bottom of her library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 on top of her library. - + %1 puts %2%3 into his library at position %4. - + %1 puts %2%3 into her library at position %4. - + %1 moves %2%3 to sideboard. - + %1 plays %2%3. - + %1 takes a mulligan to %n. + female + + + + + + + + + %1 takes a mulligan to %n. + male @@ -1994,74 +2070,620 @@ Local version is %1, remote version is %2. + %1 flips %2 face-down. + female + + + + + %1 flips %2 face-down. + male + + + + + %1 flips %2 face-up. + female + + + + + %1 flips %2 face-up. + male + + + + + %1 destroys %2. + female + + + + + %1 destroys %2. + male + + + + + %1 unattaches %2. + female + + + + + %1 unattaches %2. + male + + + + + %1 creates token: %2%3. + female + + + + + %1 creates token: %2%3. + male + + + + + %1 points from her %2 to herself. + female + + + + + %1 points from his %2 to himself. + male + + + + + %1 points from her %2 to %3. + p1 female, p2 female + + + + + %1 points from her %2 to %3. + p1 female, p2 male + + + + + %1 points from his %2 to %3. + p1 male, p2 female + + + + + %1 points from his %2 to %3. + p1 male, p2 male + + + + + %1 points from %2's %3 to herself. + card owner female, target female + + + + + %1 points from %2's %3 to herself. + card owner male, target female + + + + + %1 points from %2's %3 to himself. + card owner female, target male + + + + + %1 points from %2's %3 to himself. + card owner male, target male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4. + p1 male, p2 male, p3 male + + + + + %1 points from her %2 to her %3. + female + + + + + %1 points from his %2 to his %3. + male + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 female + + + + + %1 points from her %2 to %3's %4. + p1 female, p2 male + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 female + + + + + %1 points from his %2 to %3's %4. + p1 male, p2 male + + + + + %1 points from %2's %3 to her own %4. + card owner female, target female + + + + + %1 points from %2's %3 to her own %4. + card owner male, target female + + + + + %1 points from %2's %3 to his own %4. + card owner female, target male + + + + + %1 points from %2's %3 to his own %4. + card owner male, target male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 female, p2 male, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 female, p3 male + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 female + + + + + %1 points from %2's %3 to %4's %5. + p1 male, p2 male, p3 male + + + + + %1 places %n %2 counter(s) on %3 (now %4). + female + + + + + + + + + %1 places %n %2 counter(s) on %3 (now %4). + male + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + female + + + + + + + + + %1 removes %n %2 counter(s) from %3 (now %4). + male + + + + + + + + + %1 taps her permanents. + female + + + + + %1 untaps her permanents. + female + + + + + %1 taps his permanents. + male + + + + + %1 untaps his permanents. + male + + + + + %1 taps %2. + female + + + + + %1 untaps %2. + female + + + + + %1 taps %2. + male + + + + + %1 untaps %2. + male + + + + + %1 sets counter %2 to %3 (%4%5). + female + + + + + %1 sets counter %2 to %3 (%4%5). + male + + + + + %1 sets %2 to not untap normally. + female + + + + + %1 sets %2 to not untap normally. + male + + + + + %1 sets %2 to untap normally. + female + + + + + %1 sets %2 to untap normally. + male + + + + + %1 sets PT of %2 to %3. + female + + + + + %1 sets PT of %2 to %3. + male + + + + + %1 sets annotation of %2 to %3. + female + + + + + %1 sets annotation of %2 to %3. + male + + + + + %1 is looking at the top %2 cards %3. + female + + + + + %1 is looking at the top %2 cards %3. + male + + + + + %1 is looking at %2. + female + + + + + %1 is looking at %2. + male + + + + + %1 stops looking at %2. + female + + + + + %1 stops looking at %2. + male + + + + + %1 reveals %2 to %3. + p1 female, p2 female + + + + + %1 reveals %2 to %3. + p1 female, p2 male + + + + + %1 reveals %2 to %3. + p1 male, p2 female + + + + + %1 reveals %2 to %3. + p1 male, p2 male + + + + + %1 reveals %2. + female + + + + + %1 reveals %2. + male + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 randomly reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 randomly reveals %2%3. + female + + + + + %1 randomly reveals %2%3. + male + + + + + %1 reveals %2%3 to %4. + p1 female, p2 female + + + + + %1 reveals %2%3 to %4. + p1 female, p2 male + + + + + %1 reveals %2%3 to %4. + p1 male, p2 female + + + + + %1 reveals %2%3 to %4. + p1 male, p2 male + + + + + %1 reveals %2%3. + female + + + + + %1 reveals %2%3. + male + + + + + It is now %1's turn. + female + + + + + It is now %1's turn. + male + + + + %1 draws his initial hand. - + %1 draws her initial hand. - - %1 flips %2 face-down. - - - - - %1 flips %2 face-up. - - - - - %1 destroys %2. - - - - + %1 attaches %2 to %3's %4. + p1 female, p2 female - - %1 unattaches %2. + + %1 attaches %2 to %3's %4. + p1 female, p2 male - - %1 creates token: %2%3. + + %1 attaches %2 to %3's %4. + p1 male, p2 female - - %1 points from %2's %3 to %4. - - - - - %1 points from %2's %3 to %4's %5. + + %1 attaches %2 to %3's %4. + p1 male, p2 male - - %1 places %n %2 counter(s) on %3 (now %4). - - - - - - - - - %1 removes %n %2 counter(s) from %3 (now %4). - - - - - - - - + red @@ -2070,7 +2692,7 @@ Local version is %1, remote version is %2. - + yellow @@ -2079,7 +2701,7 @@ Local version is %1, remote version is %2. - + green @@ -2088,162 +2710,62 @@ Local version is %1, remote version is %2. - - his permanents - - - - - her permanents - - - - - %1 %2 %3. - - - - - taps - - - - - untaps - - - - - %1 sets counter %2 to %3 (%4%5). - - - - - %1 sets %2 to not untap normally. - - - - - %1 sets %2 to untap normally. - - - - - %1 sets PT of %2 to %3. - - - - - %1 sets annotation of %2 to %3. - - - - - %1 is looking at the top %2 cards %3. - - - - - %1 is looking at %2. - - - - - %1 stops looking at %2. - - - - - %1 reveals %2 to %3. - - - - - %1 reveals %2. - - - - - %1 randomly reveals %2%3 to %4. - - - - - %1 randomly reveals %2%3. - - - - - %1 reveals %2%3 to %4. - - - - - %1 reveals %2%3. - - - - - It is now %1's turn. - - - - + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + ending phase - + It is now the %1. @@ -3234,67 +3756,67 @@ Please enter a name: UserList - + Users online: %1 - + Users in this room: %1 - + Buddies online: %1 / %2 - + Ignored users online: %1 / %2 - + %1's games - + User &details - + Direct &chat - + Show this user's &games - + Add to &buddy list - + Remove from &buddy list - + Add to &ignore list - + Remove from &ignore list - + Ban from &server diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 05b3c0d9..a4167009 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -468,8 +468,9 @@ ResponseCode Server_ProtocolHandler::cmdRoomSay(Command_RoomSay *cmd, CommandCon if ((totalSize > server->getMaxMessageSizePerInterval()) || (totalCount > server->getMaxMessageCountPerInterval())) return RespChatFlood; } + msg.replace(QChar('\n'), QChar(' ')); - room->say(this, cmd->getMessage()); + room->say(this, msg); return RespOk; }