summaryrefslogtreecommitdiffstats
path: root/Swift
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2011-02-19 08:48:05 (GMT)
committerRemko Tronçon <git@el-tramo.be>2011-02-19 21:29:44 (GMT)
commitb1836ffb49bd7740dbd7c32bfad04d077e81ecb5 (patch)
tree9d0d9b3fad9c2bbd0192696d59e08477b8c22c10 /Swift
parent2f6c2299c28c9bb03ee1437058a4c7071ff2ac3f (diff)
downloadswift-contrib-b1836ffb49bd7740dbd7c32bfad04d077e81ecb5.zip
swift-contrib-b1836ffb49bd7740dbd7c32bfad04d077e81ecb5.tar.bz2
Make Swift translatable.
Diffstat (limited to 'Swift')
-rw-r--r--Swift/Controllers/Chat/ChatController.cpp27
-rw-r--r--Swift/Controllers/Chat/ChatControllerBase.cpp50
-rw-r--r--Swift/Controllers/Chat/MUCController.cpp123
-rw-r--r--Swift/Controllers/Chat/MUCSearchController.h1
-rw-r--r--Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp16
-rw-r--r--Swift/Controllers/Intl.h12
-rw-r--r--Swift/Controllers/MainController.cpp69
-rw-r--r--Swift/Controllers/PresenceNotifier.cpp3
-rw-r--r--Swift/Controllers/Roster/RosterController.cpp10
-rw-r--r--Swift/Controllers/SConscript2
-rw-r--r--Swift/Controllers/StatusUtil.cpp25
-rw-r--r--Swift/Controllers/StatusUtil.h16
-rw-r--r--Swift/Controllers/Translator.cpp28
-rw-r--r--Swift/Controllers/Translator.h27
-rw-r--r--Swift/QtUI/ChatList/ChatListModel.cpp2
-rw-r--r--Swift/QtUI/ChatList/QtChatListWindow.cpp8
-rw-r--r--Swift/QtUI/EventViewer/QtEvent.cpp10
-rw-r--r--Swift/QtUI/MUCSearch/MUCSearchEmptyItem.cpp2
-rw-r--r--Swift/QtUI/MUCSearch/QtMUCSearchWindow.cpp6
-rw-r--r--Swift/QtUI/QtAboutWidget.cpp8
-rw-r--r--Swift/QtUI/QtAvatarWidget.cpp6
-rw-r--r--Swift/QtUI/QtBookmarkDetailWindow.cpp2
-rw-r--r--Swift/QtUI/QtChatView.cpp6
-rw-r--r--Swift/QtUI/QtChatWindow.cpp6
-rw-r--r--Swift/QtUI/QtContactEditWidget.cpp6
-rw-r--r--Swift/QtUI/QtContactEditWindow.cpp12
-rw-r--r--Swift/QtUI/QtLoginWindow.cpp32
-rw-r--r--Swift/QtUI/QtMainWindow.cpp20
-rw-r--r--Swift/QtUI/QtNameWidget.cpp6
-rw-r--r--Swift/QtUI/QtProfileWindow.cpp6
-rw-r--r--Swift/QtUI/QtStatusWidget.cpp15
-rw-r--r--Swift/QtUI/QtStatusWidget.h1
-rw-r--r--Swift/QtUI/QtSubscriptionRequestWindow.cpp12
-rw-r--r--Swift/QtUI/QtSwift.cpp3
-rw-r--r--Swift/QtUI/QtTranslator.h21
-rw-r--r--Swift/QtUI/QtWebView.cpp4
-rw-r--r--Swift/QtUI/QtXMLConsoleWidget.cpp12
-rw-r--r--Swift/QtUI/Roster/QtTreeWidget.cpp6
-rw-r--r--Swift/QtUI/Roster/QtTreeWidget.h6
-rw-r--r--Swift/QtUI/Roster/QtTreeWidgetItem.h11
-rw-r--r--Swift/QtUI/Roster/RosterModel.cpp3
-rw-r--r--Swift/QtUI/SConscript33
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.cpp17
-rw-r--r--Swift/QtUI/main.cpp35
-rw-r--r--Swift/QtUI/tmp/QtContextMenu.cpp14
-rw-r--r--Swift/QtUI/tmp/QtContextMenu.h17
-rw-r--r--Swift/QtUI/tmp/QtRosterContextMenu.cpp108
-rw-r--r--Swift/QtUI/tmp/QtRosterContextMenu.h32
-rw-r--r--Swift/Translations/Swift.ts1387
-rw-r--r--Swift/Translations/Swift_nl.ts1387
-rw-r--r--Swift/resources/.gitignore1
51 files changed, 3260 insertions, 412 deletions
diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp
index e4ad9c8..6e7825f 100644
--- a/Swift/Controllers/Chat/ChatController.cpp
+++ b/Swift/Controllers/Chat/ChatController.cpp
@@ -9,6 +9,8 @@
#include <boost/bind.hpp>
#include <stdio.h>
+#include <Swift/Controllers/Intl.h>
+#include <Swiften/Base/format.h>
#include "Swiften/Avatars/AvatarManager.h"
#include "Swiften/Chat/ChatStateNotifier.h"
#include "Swiften/Chat/ChatStateTracker.h"
@@ -18,6 +20,7 @@
#include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h"
#include "Swiften/Client/NickResolver.h"
#include "Swift/Controllers/XMPPEvents/EventController.h"
+#include <Swift/Controllers/StatusUtil.h>
namespace Swift {
@@ -37,16 +40,16 @@ ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQ
nickResolver_->onNickChanged.connect(boost::bind(&ChatController::handleContactNickChanged, this, _1, _2));
std::string nick = nickResolver_->jidToNick(toJID_);
chatWindow_->setName(nick);
- std::string startMessage("Starting chat with " + nick);
+ std::string startMessage;
Presence::ref theirPresence;
if (isInMUC) {
- startMessage += " in chatroom " + contact.toBare().toString();
+ startMessage = str(format(QT_TRANSLATE_NOOP("", "Starting chat with %1% in chatroom %2%")) % nick % contact.toBare().toString());
theirPresence = presenceOracle->getLastPresence(contact);
} else {
- startMessage += " - " + contact.toBare().toString();
+ startMessage = str(format(QT_TRANSLATE_NOOP("", "Starting chat with %1% - %2%")) % nick % contact.toBare().toString());
theirPresence = contact.isBare() ? presenceOracle->getHighestPriorityPresence(contact.toBare()) : presenceOracle->getLastPresence(contact);
}
- startMessage += ": " + StatusShow::typeToFriendlyName(theirPresence ? theirPresence->getShow() : StatusShow::None);
+ startMessage += ": " + statusShowTypeToFriendlyName(theirPresence ? theirPresence->getShow() : StatusShow::None);
if (theirPresence && !theirPresence->getStatus().empty()) {
startMessage += " (" + theirPresence->getStatus() + ")";
}
@@ -109,7 +112,7 @@ void ChatController::preSendMessageRequest(boost::shared_ptr<Message> message) {
}
void ChatController::postSendMessage(const std::string& body, boost::shared_ptr<Stanza> sentStanza) {
- std::string id = addMessage(body, "me", true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>(), std::string(avatarManager_->getAvatarPath(selfJID_).string()), boost::posix_time::microsec_clock::universal_time());
+ std::string id = addMessage(body, QT_TRANSLATE_NOOP("", "me"), true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>(), std::string(avatarManager_->getAvatarPath(selfJID_).string()), boost::posix_time::microsec_clock::universal_time());
if (stanzaChannel_->getStreamManagementEnabled()) {
chatWindow_->setAckState(id, ChatWindow::Pending);
unackedStanzas_[sentStanza] = id;
@@ -148,19 +151,23 @@ std::string ChatController::senderDisplayNameFromMessage(const JID& from) {
std::string ChatController::getStatusChangeString(boost::shared_ptr<Presence> presence) {
std::string nick = senderDisplayNameFromMessage(presence->getFrom());
- std::string response = nick;
+ std::string response;
if (!presence || presence->getType() == Presence::Unavailable || presence->getType() == Presence::Error) {
- response += " has gone offline";
+ response = QT_TRANSLATE_NOOP("", "%1% has gone offline");
} else if (presence->getType() == Presence::Available) {
StatusShow::Type show = presence->getShow();
if (show == StatusShow::Online || show == StatusShow::FFC) {
- response += " has become available";
+ response = QT_TRANSLATE_NOOP("", "%1% has become available");
} else if (show == StatusShow::Away || show == StatusShow::XA) {
- response += " has gone away";
+ response = QT_TRANSLATE_NOOP("", "%1% has gone away");
} else if (show == StatusShow::DND) {
- response += " is now busy";
+ response = QT_TRANSLATE_NOOP("", "%1% is now busy");
}
}
+ if (!response.empty()) {
+ response = str(format(response) % nick);
+ }
+
if (!presence->getStatus().empty()) {
response += " (" + presence->getStatus() + ")";
}
diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp
index f70ec81..a970d88 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.cpp
+++ b/Swift/Controllers/Chat/ChatControllerBase.cpp
@@ -13,6 +13,8 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/algorithm/string.hpp>
+#include <Swift/Controllers/Intl.h>
+#include <Swiften/Base/format.h>
#include "Swiften/Base/String.h"
#include "Swiften/Client/StanzaChannel.h"
#include "Swiften/Elements/Delay.h"
@@ -51,7 +53,7 @@ void ChatControllerBase::createDayChangeTimer() {
void ChatControllerBase::handleDayChangeTick() {
dateChangeTimer_->stop();
boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
- chatWindow_->addSystemMessage("The day is now " + std::string(boost::posix_time::to_iso_extended_string(now)).substr(0,10));
+ chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "The day is now %1%")) % std::string(boost::posix_time::to_iso_extended_string(now)).substr(0,10)));
dayTicked();
createDayChangeTimer();
}
@@ -188,34 +190,34 @@ void ChatControllerBase::handleIncomingMessage(boost::shared_ptr<MessageEvent> m
}
std::string ChatControllerBase::getErrorMessage(boost::shared_ptr<ErrorPayload> error) {
- std::string defaultMessage = "Error sending message";
+ std::string defaultMessage = QT_TRANSLATE_NOOP("", "Error sending message");
if (!error->getText().empty()) {
return error->getText();
}
else {
switch (error->getCondition()) {
- case ErrorPayload::BadRequest: return "Bad request"; break;
- case ErrorPayload::Conflict: return "Conflict"; break;
- case ErrorPayload::FeatureNotImplemented: return "This feature is not implemented"; break;
- case ErrorPayload::Forbidden: return "Forbidden"; break;
- case ErrorPayload::Gone: return "Recipient can no longer be contacted"; break;
- case ErrorPayload::InternalServerError: return "Internal server error"; break;
- case ErrorPayload::ItemNotFound: return "Item not found"; break;
- case ErrorPayload::JIDMalformed: return "JID Malformed"; break;
- case ErrorPayload::NotAcceptable: return "Message was rejected"; break;
- case ErrorPayload::NotAllowed: return "Not allowed"; break;
- case ErrorPayload::NotAuthorized: return "Not authorized"; break;
- case ErrorPayload::PaymentRequired: return "Payment is required"; break;
- case ErrorPayload::RecipientUnavailable: return "Recipient is unavailable."; break;
- case ErrorPayload::Redirect: return "Redirect"; break;
- case ErrorPayload::RegistrationRequired: return "Registration required"; break;
- case ErrorPayload::RemoteServerNotFound: return "Recipient's server not found."; break;
- case ErrorPayload::RemoteServerTimeout: return "Remote server timeout"; break;
- case ErrorPayload::ResourceConstraint: return "The server is low on resources"; break;
- case ErrorPayload::ServiceUnavailable: return "The service is unavailable"; break;
- case ErrorPayload::SubscriptionRequired: return "A subscription is required"; break;
- case ErrorPayload::UndefinedCondition: return "Undefined condition"; break;
- case ErrorPayload::UnexpectedRequest: return "Unexpected request"; break;
+ case ErrorPayload::BadRequest: return QT_TRANSLATE_NOOP("", "Bad request"); break;
+ case ErrorPayload::Conflict: return QT_TRANSLATE_NOOP("", "Conflict"); break;
+ case ErrorPayload::FeatureNotImplemented: return QT_TRANSLATE_NOOP("", "This feature is not implemented"); break;
+ case ErrorPayload::Forbidden: return QT_TRANSLATE_NOOP("", "Forbidden"); break;
+ case ErrorPayload::Gone: return QT_TRANSLATE_NOOP("", "Recipient can no longer be contacted"); break;
+ case ErrorPayload::InternalServerError: return QT_TRANSLATE_NOOP("", "Internal server error"); break;
+ case ErrorPayload::ItemNotFound: return QT_TRANSLATE_NOOP("", "Item not found"); break;
+ case ErrorPayload::JIDMalformed: return QT_TRANSLATE_NOOP("", "JID Malformed"); break;
+ case ErrorPayload::NotAcceptable: return QT_TRANSLATE_NOOP("", "Message was rejected"); break;
+ case ErrorPayload::NotAllowed: return QT_TRANSLATE_NOOP("", "Not allowed"); break;
+ case ErrorPayload::NotAuthorized: return QT_TRANSLATE_NOOP("", "Not authorized"); break;
+ case ErrorPayload::PaymentRequired: return QT_TRANSLATE_NOOP("", "Payment is required"); break;
+ case ErrorPayload::RecipientUnavailable: return QT_TRANSLATE_NOOP("", "Recipient is unavailable"); break;
+ case ErrorPayload::Redirect: return QT_TRANSLATE_NOOP("", "Redirect"); break;
+ case ErrorPayload::RegistrationRequired: return QT_TRANSLATE_NOOP("", "Registration required"); break;
+ case ErrorPayload::RemoteServerNotFound: return QT_TRANSLATE_NOOP("", "Recipient's server not found"); break;
+ case ErrorPayload::RemoteServerTimeout: return QT_TRANSLATE_NOOP("", "Remote server timeout"); break;
+ case ErrorPayload::ResourceConstraint: return QT_TRANSLATE_NOOP("", "The server is low on resources"); break;
+ case ErrorPayload::ServiceUnavailable: return QT_TRANSLATE_NOOP("", "The service is unavailable"); break;
+ case ErrorPayload::SubscriptionRequired: return QT_TRANSLATE_NOOP("", "A subscription is required"); break;
+ case ErrorPayload::UndefinedCondition: return QT_TRANSLATE_NOOP("", "Undefined condition"); break;
+ case ErrorPayload::UnexpectedRequest: return QT_TRANSLATE_NOOP("", "Unexpected request"); break;
}
}
return defaultMessage;
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp
index 765c49d..ce8c946 100644
--- a/Swift/Controllers/Chat/MUCController.cpp
+++ b/Swift/Controllers/Chat/MUCController.cpp
@@ -10,6 +10,8 @@
#include <boost/regex.hpp>
#include <boost/algorithm/string.hpp>
+#include <Swift/Controllers/Intl.h>
+#include <Swiften/Base/format.h>
#include "Swiften/Network/Timer.h"
#include "Swiften/Network/TimerFactory.h"
#include "Swiften/Base/foreach.h"
@@ -109,7 +111,7 @@ void MUCController::rejoin() {
void MUCController::handleJoinTimeoutTick() {
receivedActivity();
- chatWindow_->addSystemMessage("Room " + toJID_.toString() + " is not responding. This operation may never complete");
+ chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "Room %1% is not responding. This operation may never complete.")) % toJID_.toString()));
}
void MUCController::receivedActivity() {
@@ -120,17 +122,38 @@ void MUCController::receivedActivity() {
void MUCController::handleJoinFailed(boost::shared_ptr<ErrorPayload> error) {
receivedActivity();
- std::string errorMessage = "Unable to join this room";
+ std::string errorMessage = QT_TRANSLATE_NOOP("", "Unable to join this room");
std::string rejoinNick;
if (error) {
switch (error->getCondition()) {
- case ErrorPayload::Conflict: rejoinNick = nick_ + "_"; errorMessage += " as " + nick_ + ", retrying as " + rejoinNick; break;
- case ErrorPayload::JIDMalformed: errorMessage += ", no nickname specified";break;
- case ErrorPayload::NotAuthorized: errorMessage += ", a password needed";break;
- case ErrorPayload::RegistrationRequired: errorMessage += ", only members may join"; break;
- case ErrorPayload::Forbidden: errorMessage += ", you are banned from the room"; break;
- case ErrorPayload::ServiceUnavailable: errorMessage += ", the room is full";break;
- case ErrorPayload::ItemNotFound: errorMessage += ", the room does not exist";break;
+ case ErrorPayload::Conflict:
+ rejoinNick = nick_ + "_";
+ errorMessage = str(format(QT_TRANSLATE_NOOP("", "Unable to join this room as %1%, retrying as %2%")) % nick_ % rejoinNick);
+ break;
+ case ErrorPayload::JIDMalformed:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "No nickname specified");
+ break;
+ case ErrorPayload::NotAuthorized:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "A password needed");
+ break;
+ case ErrorPayload::RegistrationRequired:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "Only members may join");
+ break;
+ case ErrorPayload::Forbidden:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "You are banned from the room");
+ break;
+ case ErrorPayload::ServiceUnavailable:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "The room is full");
+ break;
+ case ErrorPayload::ItemNotFound:
+ errorMessage += ": ";
+ errorMessage += QT_TRANSLATE_NOOP("", "The room does not exist");
+ break;
default: break;
}
@@ -147,7 +170,7 @@ void MUCController::handleJoinFailed(boost::shared_ptr<ErrorPayload> error) {
void MUCController::handleJoinComplete(const std::string& nick) {
receivedActivity();
joined_ = true;
- std::string joinMessage = "You have joined room " + toJID_.toString() + " as " + nick;
+ std::string joinMessage = str(format(QT_TRANSLATE_NOOP("", "You have joined room %1% as %2%")) % toJID_.toString() % nick);
nick_ = nick;
chatWindow_->addSystemMessage(joinMessage);
clearPresenceQueue();
@@ -185,13 +208,14 @@ void MUCController::handleOccupantJoined(const MUCOccupant& occupant) {
appendToJoinParts(joinParts_, event);
roster_->addContact(jid, realJID, occupant.getNick(), roleToGroupName(occupant.getRole()), avatarManager_->getAvatarPath(jid).string());
if (joined_) {
- std::string joinString = occupant.getNick() + " has joined the room";
+ std::string joinString;
MUCOccupant::Role role = occupant.getRole();
if (role != MUCOccupant::NoRole && role != MUCOccupant::Participant) {
- joinString += " as a " + roleToFriendlyName(role);
-
+ joinString = str(format(QT_TRANSLATE_NOOP("", "%1% has joined the room as a %2%.")) % occupant.getNick() % roleToFriendlyName(role));
+ }
+ else {
+ joinString = str(format(QT_TRANSLATE_NOOP("", "%1% has joined the room.")) % occupant.getNick());
}
- joinString += ".";
if (shouldUpdateJoinParts()) {
updateJoinParts();
} else {
@@ -216,9 +240,9 @@ void MUCController::clearPresenceQueue() {
std::string MUCController::roleToFriendlyName(MUCOccupant::Role role) {
switch (role) {
- case MUCOccupant::Moderator: return "moderator";
- case MUCOccupant::Participant: return "participant";
- case MUCOccupant::Visitor: return "visitor";
+ case MUCOccupant::Moderator: return QT_TRANSLATE_NOOP("", "moderator");
+ case MUCOccupant::Participant: return QT_TRANSLATE_NOOP("", "participant");
+ case MUCOccupant::Visitor: return QT_TRANSLATE_NOOP("", "visitor");
case MUCOccupant::NoRole: return "";
}
return "";
@@ -257,7 +281,7 @@ void MUCController::preHandleIncomingMessage(boost::shared_ptr<MessageEvent> mes
joined_ = true;
if (!message->getSubject().empty() && message->getBody().empty()) {
- chatWindow_->addSystemMessage("The room subject is now: " + message->getSubject());
+ chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "The room subject is now: %1%")) % message->getSubject()));;
doneGettingHistory_ = true;
}
@@ -280,16 +304,16 @@ void MUCController::handleOccupantRoleChanged(const std::string& nick, const MUC
realJID = occupant.getRealJID().get();
}
roster_->addContact(jid, realJID, nick, roleToGroupName(occupant.getRole()), avatarManager_->getAvatarPath(jid).string());
- chatWindow_->addSystemMessage(nick + " is now a " + roleToFriendlyName(occupant.getRole()));
+ chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "%1% is now a %2%")) % nick % roleToFriendlyName(occupant.getRole())));
}
std::string MUCController::roleToGroupName(MUCOccupant::Role role) {
std::string result;
switch (role) {
- case MUCOccupant::Moderator: result = "Moderators"; break;
- case MUCOccupant::Participant: result = "Participants"; break;
- case MUCOccupant::Visitor: result = "Visitors"; break;
- case MUCOccupant::NoRole: result = "Occupants"; break;
+ case MUCOccupant::Moderator: result = QT_TRANSLATE_NOOP("", "Moderators"); break;
+ case MUCOccupant::Participant: result = QT_TRANSLATE_NOOP("", "Participants"); break;
+ case MUCOccupant::Visitor: result = QT_TRANSLATE_NOOP("", "Visitors"); break;
+ case MUCOccupant::NoRole: result = QT_TRANSLATE_NOOP("", "Occupants"); break;
default: assert(false);
}
return result;
@@ -303,7 +327,7 @@ void MUCController::setOnline(bool online) {
processUserPart();
} else {
if (shouldJoinOnReconnect_) {
- chatWindow_->addSystemMessage("Trying to join room " + toJID_.toString());
+ chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "Trying to join room %1%")) % toJID_.toString()));
if (loginCheckTimer_) {
loginCheckTimer_->start();
}
@@ -332,7 +356,7 @@ void MUCController::handleOccupantLeft(const MUCOccupant& occupant, MUC::Leaving
appendToJoinParts(joinParts_, event);
currentOccupants_.erase(occupant.getNick());
completer_->removeWord(occupant.getNick());
- std::string partMessage = (occupant.getNick() != nick_) ? occupant.getNick() + " has left the room" : "You have left the room";
+ std::string partMessage = (occupant.getNick() != nick_) ? str(format(QT_TRANSLATE_NOOP("", "%1% has left the room")) % occupant.getNick()) : QT_TRANSLATE_NOOP("", "You have left the room");
if (!reason.empty()) {
partMessage += " (" + reason + ")";
}
@@ -406,7 +430,7 @@ std::string MUCController::concatenateListOfNames(const std::vector<NickJoinPart
if (i < joinParts.size() - 1) {
result += ", ";
} else {
- result += " and ";
+ result += QT_TRANSLATE_NOOP("", " and ");
}
}
NickJoinPart event = joinParts[i];
@@ -424,17 +448,45 @@ std::string MUCController::generateJoinPartString(const std::vector<NickJoinPart
std::string result;
std::vector<JoinPart> populatedEvents;
for (size_t i = 0; i < 4; i++) {
- std::string eventString = concatenateListOfNames(sorted[i]);
- if (!eventString.empty()) {
- std::string haveHas = sorted[i].size() > 1 ? " have" : " has";
+ std::string names = concatenateListOfNames(sorted[i]);
+ if (!names.empty()) {
+ std::string eventString;
switch (i) {
- case Join: eventString += haveHas + " joined";break;
- case Part: eventString += haveHas + " left";break;
- case JoinThenPart: eventString += " joined then left";break;
- case PartThenJoin: eventString += " left then rejoined";break;
+ case Join:
+ if (sorted[i].size() > 1) {
+ eventString = QT_TRANSLATE_NOOP("", "%1% have joined the room");
+ }
+ else {
+ eventString = QT_TRANSLATE_NOOP("", "%1% has joined the room");
+ }
+ break;
+ case Part:
+ if (sorted[i].size() > 1) {
+ eventString = QT_TRANSLATE_NOOP("", "%1% have left the room");
+ }
+ else {
+ eventString = QT_TRANSLATE_NOOP("", "%1% has left the room");
+ }
+ break;
+ case JoinThenPart:
+ if (sorted[i].size() > 1) {
+ eventString = QT_TRANSLATE_NOOP("", "%1% have joined then left the room");
+ }
+ else {
+ eventString = QT_TRANSLATE_NOOP("", "%1% has joined then left the room");
+ }
+ break;
+ case PartThenJoin:
+ if (sorted[i].size() > 1) {
+ eventString = QT_TRANSLATE_NOOP("", "%1% have left then rejoined the room");
+ }
+ else {
+ eventString = QT_TRANSLATE_NOOP("", "%1% has left then rejoined the room");
+ }
+ break;
}
populatedEvents.push_back(static_cast<JoinPart>(i));
- eventStrings[i] = eventString;
+ eventStrings[i] = str(boost::format(eventString) % names);
}
}
for (size_t i = 0; i < populatedEvents.size(); i++) {
@@ -442,12 +494,11 @@ std::string MUCController::generateJoinPartString(const std::vector<NickJoinPart
if (i < populatedEvents.size() - 1) {
result += ", ";
} else {
- result += " and ";
+ result += QT_TRANSLATE_NOOP("", " and ");
}
}
result += eventStrings[populatedEvents[i]];
}
- result += " the room.";
return result;
}
diff --git a/Swift/Controllers/Chat/MUCSearchController.h b/Swift/Controllers/Chat/MUCSearchController.h
index b348886..c8040ed 100644
--- a/Swift/Controllers/Chat/MUCSearchController.h
+++ b/Swift/Controllers/Chat/MUCSearchController.h
@@ -16,7 +16,6 @@
#include "Swiften/JID/JID.h"
#include "Swift/Controllers/UIEvents/UIEvent.h"
-#include "Swift/Controllers/Chat/MUCSearchController.h"
#include "Swift/Controllers/Settings/SettingsProvider.h"
#include "Swiften/Elements/DiscoInfo.h"
#include "Swiften/Elements/DiscoItems.h"
diff --git a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
index 7c7a8b9..e66fa9e 100644
--- a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
@@ -200,25 +200,25 @@ public:
void testJoinPartStringContructionSimple() {
std::vector<NickJoinPart> list;
list.push_back(NickJoinPart("Kev", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev has joined the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Kev has joined the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Remko", Part));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev has joined and Remko has left the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Kev has joined the room and Remko has left the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Bert", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev and Bert have joined and Remko has left the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Kev and Bert have joined the room and Remko has left the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Ernie", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev, Bert and Ernie have joined and Remko has left the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Kev, Bert and Ernie have joined the room and Remko has left the room"), MUCController::generateJoinPartString(list));
}
void testJoinPartStringContructionMixed() {
std::vector<NickJoinPart> list;
list.push_back(NickJoinPart("Kev", JoinThenPart));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev joined then left the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Kev has joined then left the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Remko", Part));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left and Kev joined then left the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room and Kev has joined then left the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Bert", PartThenJoin));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left, Kev joined then left and Bert left then rejoined the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room, Kev has joined then left the room and Bert has left then rejoined the room"), MUCController::generateJoinPartString(list));
list.push_back(NickJoinPart("Ernie", JoinThenPart));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left, Kev and Ernie joined then left and Bert left then rejoined the room."), MUCController::generateJoinPartString(list));
+ CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room, Kev and Ernie have joined then left the room and Bert has left then rejoined the room"), MUCController::generateJoinPartString(list));
}
private:
diff --git a/Swift/Controllers/Intl.h b/Swift/Controllers/Intl.h
new file mode 100644
index 0000000..3ed664d
--- /dev/null
+++ b/Swift/Controllers/Intl.h
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <Swift/Controllers/Translator.h>
+
+#define QT_TRANSLATE_NOOP(context, text) \
+ Swift::Translator::getInstance()->translate(text, context)
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 1257845..6263636 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -10,8 +10,11 @@
#include <boost/lexical_cast.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/smart_ptr/make_shared.hpp>
+#include <string>
#include <stdlib.h>
+#include <Swiften/Base/format.h>
+#include <Swift/Controllers/Intl.h>
#include <Swift/Controllers/UIInterfaces/UIFactory.h>
#include "Swiften/Network/TimerFactory.h"
#include "Swift/Controllers/BuildVersion.h"
@@ -41,7 +44,6 @@
#include "SwifTools/Dock/Dock.h"
#include "SwifTools/Notifier/TogglableNotifier.h"
#include "Swiften/Base/foreach.h"
-#include <string>
#include "Swiften/Client/Client.h"
#include "Swiften/Presence/PresenceSender.h"
#include "Swiften/Elements/ChatState.h"
@@ -432,36 +434,35 @@ void MainController::handleDisconnected(const boost::optional<ClientError>& erro
std::string message;
std::string certificateErrorMessage;
switch(error->getType()) {
- case ClientError::UnknownError: message = "Unknown Error"; break;
- case ClientError::DomainNameResolveError: message = "Unable to find server"; break;
- case ClientError::ConnectionError: message = "Error connecting to server"; break;
- case ClientError::ConnectionReadError: message = "Error while receiving server data"; break;
- case ClientError::ConnectionWriteError: message = "Error while sending data to the server"; break;
- case ClientError::XMLError: message = "Error parsing server data"; break;
- case ClientError::AuthenticationFailedError: message = "Login/password invalid"; break;
- case ClientError::CompressionFailedError: message = "Error while compressing stream"; break;
- case ClientError::ServerVerificationFailedError: message = "Server verification failed"; break;
- case ClientError::NoSupportedAuthMechanismsError: message = "Authentication mechanisms not supported"; break;
- case ClientError::UnexpectedElementError: message = "Unexpected response"; break;
- case ClientError::ResourceBindError: message = "Error binding resource"; break;
- case ClientError::SessionStartError: message = "Error starting session"; break;
- case ClientError::StreamError: message = "Stream error"; break;
- case ClientError::TLSError: message = "Encryption error"; break;
- case ClientError::ClientCertificateLoadError: message = "Error loading certificate (Invalid password?)"; break;
- case ClientError::ClientCertificateError: message = "Certificate not authorized"; break;
-
- case ClientError::UnknownCertificateError: certificateErrorMessage = "Unknown certificate"; break;
- case ClientError::CertificateExpiredError: certificateErrorMessage = "Certificate has expired"; break;
- case ClientError::CertificateNotYetValidError: certificateErrorMessage = "Certificate is not yet valid"; break;
- case ClientError::CertificateSelfSignedError: certificateErrorMessage = "Certificate is self-signed"; break;
- case ClientError::CertificateRejectedError: certificateErrorMessage = "Certificate has been rejected"; break;
- case ClientError::CertificateUntrustedError: certificateErrorMessage = "Certificate is not trusted"; break;
- case ClientError::InvalidCertificatePurposeError: certificateErrorMessage = "Certificate cannot be used for encryptig your connection"; break;
- case ClientError::CertificatePathLengthExceededError: certificateErrorMessage = "Certificate path length constraint exceeded"; break;
- case ClientError::InvalidCertificateSignatureError: certificateErrorMessage = "Invalid certificate signature"; break;
- case ClientError::InvalidCAError: certificateErrorMessage = "Invalid Certificate Authority"; break;
- case ClientError::InvalidServerIdentityError: certificateErrorMessage = "Certificate does not match the host identity"; break;
-
+ case ClientError::UnknownError: message = QT_TRANSLATE_NOOP("", "Unknown Error"); break;
+ case ClientError::DomainNameResolveError: message = QT_TRANSLATE_NOOP("", "Unable to find server"); break;
+ case ClientError::ConnectionError: message = QT_TRANSLATE_NOOP("", "Error connecting to server"); break;
+ case ClientError::ConnectionReadError: message = QT_TRANSLATE_NOOP("", "Error while receiving server data"); break;
+ case ClientError::ConnectionWriteError: message = QT_TRANSLATE_NOOP("", "Error while sending data to the server"); break;
+ case ClientError::XMLError: message = QT_TRANSLATE_NOOP("", "Error parsing server data"); break;
+ case ClientError::AuthenticationFailedError: message = QT_TRANSLATE_NOOP("", "Login/password invalid"); break;
+ case ClientError::CompressionFailedError: message = QT_TRANSLATE_NOOP("", "Error while compressing stream"); break;
+ case ClientError::ServerVerificationFailedError: message = QT_TRANSLATE_NOOP("", "Server verification failed"); break;
+ case ClientError::NoSupportedAuthMechanismsError: message = QT_TRANSLATE_NOOP("", "Authentication mechanisms not supported"); break;
+ case ClientError::UnexpectedElementError: message = QT_TRANSLATE_NOOP("", "Unexpected response"); break;
+ case ClientError::ResourceBindError: message = QT_TRANSLATE_NOOP("", "Error binding resource"); break;
+ case ClientError::SessionStartError: message = QT_TRANSLATE_NOOP("", "Error starting session"); break;
+ case ClientError::StreamError: message = QT_TRANSLATE_NOOP("", "Stream error"); break;
+ case ClientError::TLSError: message = QT_TRANSLATE_NOOP("", "Encryption error"); break;
+ case ClientError::ClientCertificateLoadError: message = QT_TRANSLATE_NOOP("", "Error loading certificate (Invalid password?)"); break;
+ case ClientError::ClientCertificateError: message = QT_TRANSLATE_NOOP("", "Certificate not authorized"); break;
+
+ case ClientError::UnknownCertificateError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Unknown certificate"); break;
+ case ClientError::CertificateExpiredError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has expired"); break;
+ case ClientError::CertificateNotYetValidError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not yet valid"); break;
+ case ClientError::CertificateSelfSignedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is self-signed"); break;
+ case ClientError::CertificateRejectedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has been rejected"); break;
+ case ClientError::CertificateUntrustedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not trusted"); break;
+ case ClientError::InvalidCertificatePurposeError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate cannot be used for encryptig your connection"); break;
+ case ClientError::CertificatePathLengthExceededError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate path length constraint exceeded"); break;
+ case ClientError::InvalidCertificateSignatureError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid certificate signature"); break;
+ case ClientError::InvalidCAError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid Certificate Authority"); break;
+ case ClientError::InvalidServerIdentityError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate does not match the host identity"); break;
}
bool forceReconnectAfterCertificateTrust = false;
if (!certificateErrorMessage.empty()) {
@@ -471,7 +472,7 @@ void MainController::handleDisconnected(const boost::optional<ClientError>& erro
forceReconnectAfterCertificateTrust = true;
}
else {
- message = "Certificate error";
+ message = QT_TRANSLATE_NOOP("", "Certificate error");
}
}
@@ -485,10 +486,10 @@ void MainController::handleDisconnected(const boost::optional<ClientError>& erro
logout();
setReconnectTimer();
if (lastDisconnectError_) {
- message = "Reconnect to " + jid_.getDomain() + " failed: " + message + ". Will retry in " + boost::lexical_cast<std::string>(timeBeforeNextReconnect_) + " seconds.";
+ message = str(format(QT_TRANSLATE_NOOP("", "Reconnect to %1% failed: %2%. Will retry in %3% seconds.")) % jid_.getDomain() % message % boost::lexical_cast<std::string>(timeBeforeNextReconnect_));
lastDisconnectError_->conclude();
} else {
- message = "Disconnected from " + jid_.getDomain() + ": " + message;
+ message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%.")) % jid_.getDomain() % message);
}
lastDisconnectError_ = boost::shared_ptr<ErrorEvent>(new ErrorEvent(JID(jid_.getDomain()), message));
eventController_->handleIncomingEvent(lastDisconnectError_);
diff --git a/Swift/Controllers/PresenceNotifier.cpp b/Swift/Controllers/PresenceNotifier.cpp
index 3d5d71e..e7b25bf 100644
--- a/Swift/Controllers/PresenceNotifier.cpp
+++ b/Swift/Controllers/PresenceNotifier.cpp
@@ -15,6 +15,7 @@
#include "Swiften/Presence/PresenceOracle.h"
#include "Swiften/Network/TimerFactory.h"
#include "Swiften/Client/NickResolver.h"
+#include <Swift/Controllers/StatusUtil.h>
namespace Swift {
@@ -98,7 +99,7 @@ void PresenceNotifier::handleNotificationActivated(JID jid) {
std::string PresenceNotifier::getStatusType(const JID& jid) const {
Presence::ref presence = presenceOracle->getLastPresence(jid);
if (presence) {
- return StatusShow::typeToFriendlyName(presence->getShow());
+ return statusShowTypeToFriendlyName(presence->getShow());
}
else {
return "Unavailable";
diff --git a/Swift/Controllers/Roster/RosterController.cpp b/Swift/Controllers/Roster/RosterController.cpp
index e03a8d4..8a0fd53 100644
--- a/Swift/Controllers/Roster/RosterController.cpp
+++ b/Swift/Controllers/Roster/RosterController.cpp
@@ -37,6 +37,8 @@
#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h"
#include "Swift/Controllers/UIEvents/ToggleShowOfflineUIEvent.h"
#include <Swiften/Client/NickManager.h>
+#include <Swift/Controllers/Intl.h>
+#include <Swiften/Base/format.h>
namespace Swift {
@@ -121,7 +123,7 @@ void RosterController::handleOnJIDAdded(const JID& jid) {
}
}
else {
- roster_->addContact(jid, jid, name, "Contacts", avatarManager_->getAvatarPath(jid).string());
+ roster_->addContact(jid, jid, name, QT_TRANSLATE_NOOP("", "Contacts"), avatarManager_->getAvatarPath(jid).string());
}
applyAllPresenceTo(jid);
}
@@ -147,7 +149,7 @@ void RosterController::handleOnJIDUpdated(const JID& jid, const std::string& old
std::vector<std::string> groups = xmppRoster_->getGroupsForJID(jid);
std::vector<std::string> oldGroups = passedOldGroups;
std::string name = nickResolver_->jidToNick(jid);
- std::string contactsGroup = "Contacts";
+ std::string contactsGroup = QT_TRANSLATE_NOOP("", "Contacts");
if (oldGroups.empty()) {
oldGroups.push_back(contactsGroup);
}
@@ -208,7 +210,7 @@ void RosterController::handleUIEvent(boost::shared_ptr<UIEvent> event) {
std::vector<XMPPRosterItem> items = xmppRoster_->getItems();
std::string group = renameGroupEvent->getGroup();
// FIXME: We should handle contacts groups specially to avoid clashes
- if (group == "Contacts") {
+ if (group == QT_TRANSLATE_NOOP("", "Contacts")) {
group = "";
}
foreach(XMPPRosterItem& item, items) {
@@ -245,7 +247,7 @@ void RosterController::handleRosterSetError(ErrorPayload::ref error, boost::shar
if (!error) {
return;
}
- std::string text = "Server " + myJID_.getDomain() + " rejected roster change to item '" + rosterPayload->getItems()[0].getJID().toString() + "'";
+ std::string text = str(format(QT_TRANSLATE_NOOP("", "Server %1% rejected roster change to item '%2%'")) % myJID_.getDomain() % rosterPayload->getItems()[0].getJID().toString());
if (!error->getText().empty()) {
text += ": " + error->getText();
}
diff --git a/Swift/Controllers/SConscript b/Swift/Controllers/SConscript
index c563c7b..61da9fb 100644
--- a/Swift/Controllers/SConscript
+++ b/Swift/Controllers/SConscript
@@ -52,6 +52,8 @@ if env["SCONS_STAGE"] == "build" :
"CertificateStorageFactory.cpp",
"CertificateStorage.cpp",
"CertificateFileStorage.cpp",
+ "StatusUtil.cpp",
+ "Translator.cpp",
])
env.Append(UNITTEST_SOURCES = [
diff --git a/Swift/Controllers/StatusUtil.cpp b/Swift/Controllers/StatusUtil.cpp
new file mode 100644
index 0000000..fd1fea3
--- /dev/null
+++ b/Swift/Controllers/StatusUtil.cpp
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swift/Controllers/StatusUtil.h>
+
+#include <Swift/Controllers/Intl.h>
+
+namespace Swift {
+
+std::string statusShowTypeToFriendlyName(StatusShow::Type type) {
+ switch (type) {
+ case StatusShow::Online: return QT_TRANSLATE_NOOP("", "Available");
+ case StatusShow::FFC: return QT_TRANSLATE_NOOP("", "Available");
+ case StatusShow::Away: return QT_TRANSLATE_NOOP("", "Away");
+ case StatusShow::XA: return QT_TRANSLATE_NOOP("", "Away");
+ case StatusShow::DND: return QT_TRANSLATE_NOOP("", "Busy");
+ case StatusShow::None: return QT_TRANSLATE_NOOP("", "Offline");
+ }
+ return "";
+}
+
+}
diff --git a/Swift/Controllers/StatusUtil.h b/Swift/Controllers/StatusUtil.h
new file mode 100644
index 0000000..dddee92
--- /dev/null
+++ b/Swift/Controllers/StatusUtil.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <string>
+
+#include <Swiften/Elements/StatusShow.h>
+
+namespace Swift {
+ std::string statusShowTypeToFriendlyName(StatusShow::Type type);
+}
+
diff --git a/Swift/Controllers/Translator.cpp b/Swift/Controllers/Translator.cpp
new file mode 100644
index 0000000..82fc46e
--- /dev/null
+++ b/Swift/Controllers/Translator.cpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swift/Controllers/Translator.h>
+
+#include <cassert>
+
+namespace Swift {
+
+struct DefaultTranslator : public Translator {
+ virtual std::string translate(const std::string& text, const std::string&) {
+ return text;
+ }
+} defaultTranslator;
+
+Translator* Translator::translator = &defaultTranslator;
+
+Translator::~Translator() {
+}
+
+void Translator::setInstance(Translator* t) {
+ translator = t;
+}
+
+}
diff --git a/Swift/Controllers/Translator.h b/Swift/Controllers/Translator.h
new file mode 100644
index 0000000..ac4407d
--- /dev/null
+++ b/Swift/Controllers/Translator.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <string>
+
+namespace Swift {
+ class Translator {
+ public:
+ virtual ~Translator();
+
+ virtual std::string translate(const std::string& text, const std::string& context) = 0;
+
+ static void setInstance(Translator* translator);
+
+ static Translator* getInstance() {
+ return translator;
+ }
+
+ private:
+ static Translator* translator;
+ };
+}
diff --git a/Swift/QtUI/ChatList/ChatListModel.cpp b/Swift/QtUI/ChatList/ChatListModel.cpp
index 39b6a3c..ba7b766 100644
--- a/Swift/QtUI/ChatList/ChatListModel.cpp
+++ b/Swift/QtUI/ChatList/ChatListModel.cpp
@@ -12,7 +12,7 @@ namespace Swift {
ChatListModel::ChatListModel() {
root_ = new ChatListGroupItem("", NULL);
- mucBookmarks_ = new ChatListGroupItem("Bookmarked Rooms", root_);
+ mucBookmarks_ = new ChatListGroupItem(tr("Bookmarked Rooms"), root_);
root_->addItem(mucBookmarks_);
}
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.cpp b/Swift/QtUI/ChatList/QtChatListWindow.cpp
index 48ccf7f..b532cdb 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.cpp
+++ b/Swift/QtUI/ChatList/QtChatListWindow.cpp
@@ -59,11 +59,11 @@ void QtChatListWindow::handleClicked(const QModelIndex& index) {
void QtChatListWindow::setupContextMenus() {
mucMenu_ = new QMenu();
- mucMenu_->addAction("Add New Bookmark", this, SLOT(handleAddBookmark()));
- mucMenu_->addAction("Edit Bookmark", this, SLOT(handleEditBookmark()));
- mucMenu_->addAction("Remove Bookmark", this, SLOT(handleRemoveBookmark()));
+ mucMenu_->addAction(tr("Add New Bookmark"), this, SLOT(handleAddBookmark()));
+ mucMenu_->addAction(tr("Edit Bookmark"), this, SLOT(handleEditBookmark()));
+ mucMenu_->addAction(tr("Remove Bookmark"), this, SLOT(handleRemoveBookmark()));
emptyMenu_ = new QMenu();
- emptyMenu_->addAction("Add New Bookmark", this, SLOT(handleAddBookmark()));
+ emptyMenu_->addAction(tr("Add New Bookmark"), this, SLOT(handleAddBookmark()));
}
diff --git a/Swift/QtUI/EventViewer/QtEvent.cpp b/Swift/QtUI/EventViewer/QtEvent.cpp
index f0bc276..05080d8 100644
--- a/Swift/QtUI/EventViewer/QtEvent.cpp
+++ b/Swift/QtUI/EventViewer/QtEvent.cpp
@@ -58,8 +58,14 @@ QString QtEvent::text() {
boost::shared_ptr<SubscriptionRequestEvent> subscriptionRequestEvent = boost::dynamic_pointer_cast<SubscriptionRequestEvent>(event_);
if (subscriptionRequestEvent) {
std::string reason = subscriptionRequestEvent->getReason();
- std::string message = subscriptionRequestEvent->getJID().toBare().toString() + " would like to add you to their roster" + (reason.empty() ? "." : ", saying '" + reason + "'.");
- return P2QSTRING(message);
+ QString message;
+ if (reason.empty()) {
+ message = QString("%1 would like to add you to their roster.").arg(subscriptionRequestEvent->getJID().toBare().toString().c_str());
+ }
+ else {
+ message = QString("%1 would like to add you to their roster, saying '%2'").arg(subscriptionRequestEvent->getJID().toBare().toString().c_str()).arg(reason.c_str());
+ }
+ return message;
}
boost::shared_ptr<ErrorEvent> errorEvent = boost::dynamic_pointer_cast<ErrorEvent>(event_);
if (errorEvent) {
diff --git a/Swift/QtUI/MUCSearch/MUCSearchEmptyItem.cpp b/Swift/QtUI/MUCSearch/MUCSearchEmptyItem.cpp
index b1b4175..f392859 100644
--- a/Swift/QtUI/MUCSearch/MUCSearchEmptyItem.cpp
+++ b/Swift/QtUI/MUCSearch/MUCSearchEmptyItem.cpp
@@ -22,7 +22,7 @@ MUCSearchServiceItem* MUCSearchEmptyItem::getParent() {
QVariant MUCSearchEmptyItem::data(int role) {
switch (role) {
case Qt::DisplayRole:
- return QVariant("No rooms found");
+ return QVariant(QObject::tr("No rooms found"));
case Qt::FontRole: {
QFont font;
font.setItalic(true);
diff --git a/Swift/QtUI/MUCSearch/QtMUCSearchWindow.cpp b/Swift/QtUI/MUCSearch/QtMUCSearchWindow.cpp
index 1e624b3..618ed65 100644
--- a/Swift/QtUI/MUCSearch/QtMUCSearchWindow.cpp
+++ b/Swift/QtUI/MUCSearch/QtMUCSearchWindow.cpp
@@ -27,7 +27,7 @@ QtMUCSearchWindow::QtMUCSearchWindow() {
setWindowIcon(QIcon(":/logo-icon-16.png"));
#endif
setModal(true);
- setWindowTitle("Search Room");
+ setWindowTitle(tr("Search Room"));
ui_.filter_->hide();
model_ = new MUCSearchModel();
delegate_ = new MUCSearchDelegate();
@@ -47,9 +47,9 @@ QtMUCSearchWindow::QtMUCSearchWindow() {
ui_.okButton->setEnabled(false);
connect(ui_.cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
- throbber_ = new QLabel("Searching", ui_.results_);
+ throbber_ = new QLabel(tr("Searching"), ui_.results_);
throbber_->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), throbber_));
- throbber_->setToolTip("Searching");
+ throbber_->setToolTip(tr("Searching"));
hasHadScrollBars_ = false;
updateThrobberPosition();
diff --git a/Swift/QtUI/QtAboutWidget.cpp b/Swift/QtUI/QtAboutWidget.cpp
index 38a4a8c..2f68769 100644
--- a/Swift/QtUI/QtAboutWidget.cpp
+++ b/Swift/QtUI/QtAboutWidget.cpp
@@ -20,7 +20,7 @@ namespace Swift {
QtAboutWidget::QtAboutWidget() : QDialog() {
#ifndef Q_WS_MAC
- setWindowTitle("About Swift");
+ setWindowTitle(QString(tr("About %1")).arg("Swift"));
#endif
setWindowIcon(QIcon(":/logo-icon-16.png"));
@@ -39,13 +39,13 @@ QtAboutWidget::QtAboutWidget() : QDialog() {
QLabel* versionLabel = new QLabel(QString("<center><font size='-1'>Version ") + QCoreApplication::applicationVersion() + "</font></center>", this);
mainLayout->addWidget(versionLabel);
- QString buildString = QString("<center><font size='-1'>Built with: Qt version ") + QT_VERSION_STR;
- buildString += QString("<br/>Running with Qt version ") + qVersion();
+ QString buildString = QString("<center><font size='-1'>") + QString(tr("Built with: Qt version %1")).arg(QT_VERSION_STR);
+ buildString += QString("<br/>") + QString(tr("Running with Qt version ")).arg(qVersion());
buildString += "</font></center>";
QLabel* buildLabel = new QLabel(buildString, this);
mainLayout->addWidget(buildLabel);
- QPushButton* licenseButton = new QPushButton("View License", this);
+ QPushButton* licenseButton = new QPushButton(tr("View License"), this);
mainLayout->addWidget(licenseButton);
connect(licenseButton, SIGNAL(clicked()), this, SLOT(handleLicenseClicked()));
diff --git a/Swift/QtUI/QtAvatarWidget.cpp b/Swift/QtUI/QtAvatarWidget.cpp
index 0879d46..ebdf1a6 100644
--- a/Swift/QtUI/QtAvatarWidget.cpp
+++ b/Swift/QtUI/QtAvatarWidget.cpp
@@ -70,10 +70,10 @@ void QtAvatarWidget::setAvatar(const ByteArray& data, const std::string& type) {
void QtAvatarWidget::mousePressEvent(QMouseEvent* event) {
QMenu menu;
- QAction* selectPicture = new QAction("Select picture ...", this);
+ QAction* selectPicture = new QAction(tr("Select picture ..."), this);
menu.addAction(selectPicture);
- QAction* clearPicture = new QAction("Clear picture", this);
+ QAction* clearPicture = new QAction(tr("Clear picture"), this);
menu.addAction(clearPicture);
QAction* result = menu.exec(event->globalPos());
@@ -92,7 +92,7 @@ void QtAvatarWidget::mousePressEvent(QMouseEvent* event) {
setAvatar(data, Q2PSTRING(type));
}
else {
- QMessageBox::critical(this, "Error", "The selected picture is in an unrecognized format");
+ QMessageBox::critical(this, tr("Error"), tr("The selected picture is in an unrecognized format"));
}
}
}
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.cpp b/Swift/QtUI/QtBookmarkDetailWindow.cpp
index c0f04e2..fb04e03 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.cpp
+++ b/Swift/QtUI/QtBookmarkDetailWindow.cpp
@@ -28,7 +28,7 @@ boost::optional<MUCBookmark> QtBookmarkDetailWindow::createBookmarkFromForm() {
//check bookmarkName
JID room(Q2PSTRING(room_->text()));
if (!room.isValid() || room.getNode().empty() || !room.getResource().empty()) {
- QMessageBox::warning(this, "Bookmark not valid", "You must specify a valid room address (e.g. myroom@chats.example.com).");
+ QMessageBox::warning(this, tr("Bookmark not valid"), tr("You must specify a valid room address (e.g. myroom@chats.example.com)."));
return boost::optional<MUCBookmark>();
}
std::string name(Q2PSTRING(name_->text()));
diff --git a/Swift/QtUI/QtChatView.cpp b/Swift/QtUI/QtChatView.cpp
index 0f25d76..521b072 100644
--- a/Swift/QtUI/QtChatView.cpp
+++ b/Swift/QtUI/QtChatView.cpp
@@ -58,9 +58,9 @@ QtChatView::QtChatView(QtChatTheme* theme, QWidget* parent) : QWidget(parent) {
void QtChatView::handleClearRequested() {
QMessageBox messageBox(this);
- messageBox.setWindowTitle("Clear log");
- messageBox.setText("You are about to clear the contents of your chat log.");
- messageBox.setInformativeText("Are you sure?");
+ messageBox.setWindowTitle(tr("Clear log"));
+ messageBox.setText(tr("You are about to clear the contents of your chat log."));
+ messageBox.setInformativeText(tr("Are you sure?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::Yes);
int button = messageBox.exec();
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index dac9e93..4b67ef0 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -287,9 +287,9 @@ void QtChatWindow::flash() {
void QtChatWindow::setAckState(std::string const& id, ChatWindow::AckState state) {
QString xml;
switch (state) {
- case ChatWindow::Pending: xml = "<img src='qrc:/icons/throbber.gif' alt='This message has not been received by your server yet.'/>"; break;
+ case ChatWindow::Pending: xml = "<img src='qrc:/icons/throbber.gif' alt='" + tr("This message has not been received by your server yet.") + "'/>"; break;
case ChatWindow::Received: xml = ""; break;
- case ChatWindow::Failed: xml = "<img src='qrc:/icons/error.png' alt='This message may not have been transmitted.'/>"; break;
+ case ChatWindow::Failed: xml = "<img src='qrc:/icons/error.png' alt='" + tr("This message may not have been transmitted.'") + "/>"; break;
}
messageLog_->setAckXML(P2QSTRING(id), xml);
}
@@ -309,7 +309,7 @@ void QtChatWindow::addErrorMessage(const std::string& errorMessage) {
QString errorMessageHTML(Qt::escape(P2QSTRING(errorMessage)));
errorMessageHTML.replace("\n","<br/>");
- messageLog_->addMessage(boost::shared_ptr<ChatSnippet>(new SystemMessageSnippet(QString("<span class=\"error\">Couldn't send message: %1</span>").arg(errorMessageHTML), QDateTime::currentDateTime(), false, theme_)));
+ messageLog_->addMessage(boost::shared_ptr<ChatSnippet>(new SystemMessageSnippet(QString("<span class=\"error\">" + tr("Couldn't send message: %1") + "</span>").arg(errorMessageHTML), QDateTime::currentDateTime(), false, theme_)));
previousMessageWasSelf_ = false;
previousMessageWasSystem_ = true;
diff --git a/Swift/QtUI/QtContactEditWidget.cpp b/Swift/QtUI/QtContactEditWidget.cpp
index e8fe24a..fbc9685 100644
--- a/Swift/QtUI/QtContactEditWidget.cpp
+++ b/Swift/QtUI/QtContactEditWidget.cpp
@@ -25,13 +25,13 @@ QtContactEditWidget::QtContactEditWidget(const std::set<std::string>& allGroups,
QHBoxLayout* nameLayout = new QHBoxLayout();
- QLabel* label = new QLabel("Name:", this);
+ QLabel* label = new QLabel(tr("Name:"), this);
nameLayout->addWidget(label);
name_ = new QLineEdit(this);
nameLayout->addWidget(name_);
layout->addLayout(nameLayout);
- layout->addWidget(new QLabel("Groups:", this));
+ layout->addWidget(new QLabel(tr("Groups:"), this));
QScrollArea* groupsArea = new QScrollArea(this);
layout->addWidget(groupsArea);
@@ -53,7 +53,7 @@ QtContactEditWidget::QtContactEditWidget(const std::set<std::string>& allGroups,
QHBoxLayout* newGroupLayout = new QHBoxLayout();
newGroup_ = new QCheckBox(groups);
- newGroup_->setText("New Group:");
+ newGroup_->setText(tr("New Group:"));
newGroup_->setCheckState(Qt::Unchecked);
newGroupLayout->addWidget(newGroup_);
newGroupName_ = new QLineEdit(groups);
diff --git a/Swift/QtUI/QtContactEditWindow.cpp b/Swift/QtUI/QtContactEditWindow.cpp
index 97b8f95..543d39a 100644
--- a/Swift/QtUI/QtContactEditWindow.cpp
+++ b/Swift/QtUI/QtContactEditWindow.cpp
@@ -23,7 +23,7 @@ namespace Swift {
QtContactEditWindow::QtContactEditWindow() : contactEditWidget_(NULL) {
resize(300,300);
- setWindowTitle("Edit contact");
+ setWindowTitle(tr("Edit contact"));
setContentsMargins(0,0,0,0);
QBoxLayout* layout = new QVBoxLayout(this);
@@ -38,10 +38,10 @@ QtContactEditWindow::QtContactEditWindow() : contactEditWidget_(NULL) {
QHBoxLayout* buttonLayout = new QHBoxLayout();
layout->addLayout(buttonLayout);
- QPushButton* removeButton = new QPushButton("Remove contact", this);
+ QPushButton* removeButton = new QPushButton(tr("Remove contact"), this);
connect(removeButton, SIGNAL(clicked()), this, SLOT(handleRemoveContact()));
buttonLayout->addWidget(removeButton);
- QPushButton* okButton = new QPushButton("Ok", this);
+ QPushButton* okButton = new QPushButton(tr("Ok"), this);
connect(okButton, SIGNAL(clicked()), this, SLOT(handleUpdateContact()));
buttonLayout->addStretch();
buttonLayout->addWidget(okButton);
@@ -73,9 +73,9 @@ void QtContactEditWindow::hide() {
void QtContactEditWindow::handleRemoveContact() {
QMessageBox msgBox;
- msgBox.setWindowTitle("Confirm contact deletion");
- msgBox.setText("Are you sure you want to delete this contact?");
- msgBox.setInformativeText(QString("This will remove the contact '%1' from all groups they may be in.").arg(P2QSTRING(jid_.toString())));
+ msgBox.setWindowTitle(tr("Confirm contact deletion"));
+ msgBox.setText(tr("Are you sure you want to delete this contact?"));
+ msgBox.setInformativeText(QString(tr("This will remove the contact '%1' from all groups they may be in.")).arg(P2QSTRING(jid_.toString())));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::Yes);
int ret = msgBox.exec();
diff --git a/Swift/QtUI/QtLoginWindow.cpp b/Swift/QtUI/QtLoginWindow.cpp
index aae11d1..24e6d76 100644
--- a/Swift/QtUI/QtLoginWindow.cpp
+++ b/Swift/QtUI/QtLoginWindow.cpp
@@ -78,23 +78,23 @@ QtLoginWindow::QtLoginWindow(UIEventStream* uiEventStream) : QMainWindow() {
layout->addStretch(2);
QLabel* jidLabel = new QLabel(this);
- jidLabel->setText("<font size='-1'>User address:</font>");
+ jidLabel->setText("<font size='-1'>" + tr("User address:") + "</font>");
layout->addWidget(jidLabel);
username_ = new QComboBox(this);
username_->setEditable(true);
- username_->setWhatsThis("User address - looks like someuser@someserver.com");
- username_->setToolTip("User address - looks like someuser@someserver.com");
+ username_->setWhatsThis(tr("User address - looks like someuser@someserver.com"));
+ username_->setToolTip(tr("User address - looks like someuser@someserver.com"));
username_->view()->installEventFilter(this);
layout->addWidget(username_);
QLabel* jidHintLabel = new QLabel(this);
- jidHintLabel->setText("<font size='-1' color='grey' >Example: alice@wonderland.lit</font>");
+ jidHintLabel->setText("<font size='-1' color='grey' >" + tr("Example: alice@wonderland.lit") + "</font>");
jidHintLabel->setAlignment(Qt::AlignRight);
layout->addWidget(jidHintLabel);
QLabel* passwordLabel = new QLabel();
- passwordLabel->setText("<font size='-1'>Password:</font>");
+ passwordLabel->setText("<font size='-1'>" + tr("Password:") + "</font>");
layout->addWidget(passwordLabel);
@@ -115,8 +115,8 @@ QtLoginWindow::QtLoginWindow(UIEventStream* uiEventStream) : QMainWindow() {
certificateButton_ = new QToolButton(this);
certificateButton_->setCheckable(true);
certificateButton_->setIcon(QIcon(":/icons/certificate.png"));
- certificateButton_->setToolTip("Click if you have a personal certificate used for login to the service.");
- certificateButton_->setWhatsThis("Click if you have a personal certificate used for login to the service.");
+ certificateButton_->setToolTip(tr("Click if you have a personal certificate used for login to the service."));
+ certificateButton_->setWhatsThis(tr("Click if you have a personal certificate used for login to the service."));
credentialsLayout->addWidget(certificateButton_);
connect(certificateButton_, SIGNAL(clicked(bool)), SLOT(handleCertficateChecked(bool)));
@@ -154,7 +154,7 @@ QtLoginWindow::QtLoginWindow(UIEventStream* uiEventStream) : QMainWindow() {
generalMenu_ = swiftMenu_;
#endif
- QAction* aboutAction = new QAction("&About Swift", this);
+ QAction* aboutAction = new QAction(QString(tr("&About %1")).arg("Swift"), this);
connect(aboutAction, SIGNAL(triggered()), SLOT(handleAbout()));
swiftMenu_->addAction(aboutAction);
@@ -180,7 +180,7 @@ QtLoginWindow::QtLoginWindow(UIEventStream* uiEventStream) : QMainWindow() {
swiftMenu_->addSeparator();
#endif
- QAction* quitAction = new QAction("&Quit", this);
+ QAction* quitAction = new QAction(tr("&Quit"), this);
connect(quitAction, SIGNAL(triggered()), SLOT(handleQuit()));
swiftMenu_->addAction(quitAction);
@@ -194,7 +194,7 @@ bool QtLoginWindow::eventFilter(QObject *obj, QEvent *event) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Delete || keyEvent->key() == Qt::Key_Backspace) {
QString jid(username_->view()->currentIndex().data().toString());
- int result = QMessageBox::question(this, "Remove profile", "Remove the profile '" + jid + "'?", QMessageBox::Yes | QMessageBox::No);
+ int result = QMessageBox::question(this, tr("Remove profile"), tr("Remove the profile '%1'?").arg(jid), QMessageBox::Yes | QMessageBox::No);
if (result == QMessageBox::Yes) {
onPurgeSavedLoginRequest(Q2PSTRING(jid));
}
@@ -288,7 +288,7 @@ void QtLoginWindow::loggedOut() {
void QtLoginWindow::setIsLoggingIn(bool loggingIn) {
/* Change the for loop as well if you add to this.*/
QWidget* widgets[5] = {username_, password_, remember_, loginAutomatically_, certificateButton_};
- loginButton_->setText(loggingIn ? "Cancel" : "Connect");
+ loginButton_->setText(loggingIn ? tr("Cancel") : tr("Connect"));
for (int i = 0; i < 5; i++) {
widgets[i]->setEnabled(!loggingIn);
}
@@ -309,7 +309,7 @@ void QtLoginWindow::setLoginAutomatically(bool loginAutomatically) {
void QtLoginWindow::handleCertficateChecked(bool checked) {
if (checked) {
- certificateFile_ = QFileDialog::getOpenFileName(this, "Select an authentication certificate", QString(), QString("*.cert"));
+ certificateFile_ = QFileDialog::getOpenFileName(this, tr("Select an authentication certificate"), QString(), QString("*.cert"));
if (certificateFile_.isEmpty()) {
certificateButton_->setChecked(false);
}
@@ -409,11 +409,11 @@ void QtLoginWindow::moveEvent(QMoveEvent*) {
bool QtLoginWindow::askUserToTrustCertificatePermanently(const std::string& message, Certificate::ref certificate) {
QMessageBox dialog(this);
- dialog.setText("The certificate presented by the server is not valid.");
- dialog.setInformativeText(P2QSTRING(message) + "\n\nWould you like to permanently trust this certificate? This must only be done if you know it is correct.");
+ dialog.setText(tr("The certificate presented by the server is not valid."));
+ dialog.setInformativeText(P2QSTRING(message) + "\n\n" + tr("Would you like to permanently trust this certificate? This must only be done if you know it is correct."));
- QString detailedText = "Subject: " + P2QSTRING(certificate->getSubjectName()) + "\n";
- detailedText += "SHA-1 Fingerprint: " + P2QSTRING(certificate->getSHA1Fingerprint());
+ QString detailedText = tr("Subject: %1").arg(P2QSTRING(certificate->getSubjectName())) + "\n";
+ detailedText += tr("SHA-1 Fingerprint: %1").arg(P2QSTRING(certificate->getSHA1Fingerprint()));
dialog.setDetailedText(detailedText);
dialog.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp
index 6ebd8aa..0f43f7e 100644
--- a/Swift/QtUI/QtMainWindow.cpp
+++ b/Swift/QtUI/QtMainWindow.cpp
@@ -60,21 +60,21 @@ QtMainWindow::QtMainWindow(QtSettingsProvider* settings, UIEventStream* uiEventS
treeWidget_ = new QtTreeWidget(uiEventStream_);
contactTabLayout->addWidget(treeWidget_);
- tabs_->addTab(contactsTabWidget_, "&Contacts");
+ tabs_->addTab(contactsTabWidget_, tr("&Contacts"));
eventWindow_ = new QtEventWindow(uiEventStream_);
connect(eventWindow_, SIGNAL(onNewEventCountUpdated(int)), this, SLOT(handleEventCountUpdated(int)));
chatListWindow_ = new QtChatListWindow(uiEventStream_);
- tabs_->addTab(eventWindow_, "&Notices");
- tabs_->addTab(chatListWindow_, "C&hats");
+ tabs_->addTab(eventWindow_, tr("&Notices"));
+ tabs_->addTab(chatListWindow_, tr("C&hats"));
this->setLayout(mainLayout);
QMenu* viewMenu = new QMenu(tr("&View"), this);
menus_.push_back(viewMenu);
- showOfflineAction_ = new QAction("Show offline contacts", this);
+ showOfflineAction_ = new QAction(tr("Show offline contacts"), this);
showOfflineAction_->setCheckable(true);
showOfflineAction_->setChecked(false);
connect(showOfflineAction_, SIGNAL(toggled(bool)), SLOT(handleShowOfflineToggled(bool)));
@@ -82,20 +82,20 @@ QtMainWindow::QtMainWindow(QtSettingsProvider* settings, UIEventStream* uiEventS
QMenu* actionsMenu = new QMenu(tr("&Actions"), this);
menus_.push_back(actionsMenu);
- QAction* editProfileAction = new QAction("Edit Profile", this);
+ QAction* editProfileAction = new QAction(tr("Edit Profile"), this);
connect(editProfileAction, SIGNAL(triggered()), SLOT(handleEditProfileAction()));
actionsMenu->addAction(editProfileAction);
- QAction* joinMUCAction = new QAction("&Join Room", this);
+ QAction* joinMUCAction = new QAction(tr("&Join Room"), this);
connect(joinMUCAction, SIGNAL(triggered()), SLOT(handleJoinMUCAction()));
actionsMenu->addAction(joinMUCAction);
- addUserAction_ = new QAction("&Add Contact", this);
+ addUserAction_ = new QAction(tr("&Add Contact"), this);
connect(addUserAction_, SIGNAL(triggered(bool)), this, SLOT(handleAddUserActionTriggered(bool)));
actionsMenu->addAction(addUserAction_);
- chatUserAction_ = new QAction("Start &Chat", this);
+ chatUserAction_ = new QAction(tr("Start &Chat"), this);
connect(chatUserAction_, SIGNAL(triggered(bool)), this, SLOT(handleChatUserActionTriggered(bool)));
actionsMenu->addAction(chatUserAction_);
actionsMenu->addSeparator();
- QAction* signOutAction = new QAction("&Sign Out", this);
+ QAction* signOutAction = new QAction(tr("&Sign Out"), this);
connect(signOutAction, SIGNAL(triggered()), SLOT(handleSignOutAction()));
actionsMenu->addAction(signOutAction);
@@ -127,7 +127,7 @@ void QtMainWindow::handleEventCountUpdated(int count) {
QColor eventTabColor = (count == 0) ? QColor() : QColor(255, 0, 0); // invalid resets to default
int eventIndex = 1;
tabs_->tabBar()->setTabTextColor(eventIndex, eventTabColor);
- QString text = "Notices";
+ QString text = tr("Notices");
if (count > 0) {
text += QString(" (%1)").arg(count);
}
diff --git a/Swift/QtUI/QtNameWidget.cpp b/Swift/QtUI/QtNameWidget.cpp
index 412665d..6124c65 100644
--- a/Swift/QtUI/QtNameWidget.cpp
+++ b/Swift/QtUI/QtNameWidget.cpp
@@ -44,7 +44,7 @@ void QtNameWidget::mousePressEvent(QMouseEvent* event) {
QMenu menu;
bool hasNick = !nick.isEmpty();
- QAction* showAsNick = new QAction(hasNick ? "Show nickname" : "(No Nickname Set)", this);
+ QAction* showAsNick = new QAction(hasNick ? tr("Show nickname") : tr("(No Nickname Set)"), this);
showAsNick->setCheckable(true);
showAsNick->setEnabled(hasNick);
if (mode == ShowNick && hasNick) {
@@ -52,14 +52,14 @@ void QtNameWidget::mousePressEvent(QMouseEvent* event) {
}
menu.addAction(showAsNick);
- QAction* showAsJID = new QAction("Show ID", this);
+ QAction* showAsJID = new QAction(tr("Show ID"), this);
showAsJID->setCheckable(true);
if (mode == ShowJID || !hasNick) {
showAsJID->setChecked(true);
}
menu.addAction(showAsJID);
- QAction* editProfile = new QAction("Edit Profile", this);
+ QAction* editProfile = new QAction(tr("Edit Profile"), this);
menu.addAction(editProfile);
QAction* result = menu.exec(event->globalPos());
diff --git a/Swift/QtUI/QtProfileWindow.cpp b/Swift/QtUI/QtProfileWindow.cpp
index c4fe400..2b723be 100644
--- a/Swift/QtUI/QtProfileWindow.cpp
+++ b/Swift/QtUI/QtProfileWindow.cpp
@@ -21,7 +21,7 @@
namespace Swift {
QtProfileWindow::QtProfileWindow() {
- setWindowTitle("Edit Profile");
+ setWindowTitle(tr("Edit Profile"));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
sizePolicy.setHorizontalStretch(0);
@@ -40,7 +40,7 @@ QtProfileWindow::QtProfileWindow() {
QVBoxLayout* fieldsLayout = new QVBoxLayout();
QHBoxLayout* horizontalLayout_2 = new QHBoxLayout();
- nicknameLabel = new QLabel("Nickname: ", this);
+ nicknameLabel = new QLabel(tr("Nickname:"), this);
horizontalLayout_2->addWidget(nicknameLabel);
nickname = new QLineEdit(this);
horizontalLayout_2->addWidget(nickname);
@@ -64,7 +64,7 @@ QtProfileWindow::QtProfileWindow() {
throbberLabel->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), this));
horizontalLayout->addWidget(throbberLabel);
- saveButton = new QPushButton("Save", this);
+ saveButton = new QPushButton(tr("Save"), this);
connect(saveButton, SIGNAL(clicked()), SLOT(handleSave()));
horizontalLayout->addWidget(saveButton);
diff --git a/Swift/QtUI/QtStatusWidget.cpp b/Swift/QtUI/QtStatusWidget.cpp
index db6d6c5..78bbb03 100644
--- a/Swift/QtUI/QtStatusWidget.cpp
+++ b/Swift/QtUI/QtStatusWidget.cpp
@@ -22,11 +22,12 @@
#include "Swift/QtUI/QtElidingLabel.h"
#include "Swift/QtUI/QtLineEdit.h"
#include "Swift/QtUI/QtSwiftUtil.h"
-
-const QString NO_MESSAGE = QString("(No message)");
+#include <Swift/Controllers/StatusUtil.h>
namespace Swift {
+const QString QtStatusWidget::NO_MESSAGE = QString(QT_TRANSLATE_NOOP("QtStatusWidget", "(No message)"));
+
QtStatusWidget::QtStatusWidget(QWidget *parent) : QWidget(parent), editCursor_(Qt::IBeamCursor), viewCursor_(Qt::PointingHandCursor) {
isClicking_ = false;
connecting_ = false;
@@ -131,12 +132,12 @@ void QtStatusWidget::generateList() {
foreach (StatusShow::Type type, icons_.keys()) {
QListWidgetItem* item = new QListWidgetItem(text == "" ? NO_MESSAGE : text, menu_);
item->setIcon(icons_[type]);
- item->setToolTip(P2QSTRING(StatusShow::typeToFriendlyName(type)) + ": " + item->text());
+ item->setToolTip(P2QSTRING(statusShowTypeToFriendlyName(type)) + ": " + item->text());
item->setStatusTip(item->toolTip());
item->setData(Qt::UserRole, QVariant(type));
}
foreach (StatusShow::Type type, icons_.keys()) {
- QListWidgetItem* item = new QListWidgetItem(P2QSTRING(StatusShow::typeToFriendlyName(type)), menu_);
+ QListWidgetItem* item = new QListWidgetItem(P2QSTRING(statusShowTypeToFriendlyName(type)), menu_);
item->setIcon(icons_[type]);
item->setToolTip(item->text());
item->setStatusTip(item->toolTip());
@@ -168,7 +169,7 @@ void QtStatusWidget::handleClicked() {
types.push_back(StatusShow::DND);
types.push_back(StatusShow::None);
foreach (StatusShow::Type type, types) {
- if (statusEdit_->text() == P2QSTRING(StatusShow::typeToFriendlyName(type))) {
+ if (statusEdit_->text() == P2QSTRING(statusShowTypeToFriendlyName(type))) {
statusEdit_->setText("");
}
}
@@ -229,9 +230,9 @@ void QtStatusWidget::handleItemClicked(QListWidgetItem* item) {
void QtStatusWidget::setNewToolTip() {
if (connecting_) {
- statusTextLabel_->setToolTip("Connecting");
+ statusTextLabel_->setToolTip(tr("Connecting"));
} else {
- statusTextLabel_->setToolTip(P2QSTRING(StatusShow::typeToFriendlyName(selectedStatusType_)) + ": " + statusTextLabel_->text());
+ statusTextLabel_->setToolTip(P2QSTRING(statusShowTypeToFriendlyName(selectedStatusType_)) + ": " + statusTextLabel_->text());
}
}
diff --git a/Swift/QtUI/QtStatusWidget.h b/Swift/QtUI/QtStatusWidget.h
index dcff433..f302c64 100644
--- a/Swift/QtUI/QtStatusWidget.h
+++ b/Swift/QtUI/QtStatusWidget.h
@@ -62,6 +62,7 @@ namespace Swift {
bool editing_;
QMovie* connectingMovie_;
bool connecting_;
+ static const QString NO_MESSAGE;
};
}
diff --git a/Swift/QtUI/QtSubscriptionRequestWindow.cpp b/Swift/QtUI/QtSubscriptionRequestWindow.cpp
index e201808..c38f421 100644
--- a/Swift/QtUI/QtSubscriptionRequestWindow.cpp
+++ b/Swift/QtUI/QtSubscriptionRequestWindow.cpp
@@ -15,23 +15,23 @@
namespace Swift {
QtSubscriptionRequestWindow::QtSubscriptionRequestWindow(boost::shared_ptr<SubscriptionRequestEvent> event, QWidget* parent) : QDialog(parent), event_(event) {
- QString text = P2QSTRING(event->getJID().toString()) + " would like to add you to their roster.\n Would you like to add them to your roster and share your status when you're online? \n\nIf you choose to defer this choice, you'll be asked again when you next login.";
+ QString text = QString("%1 would like to add you to their roster.\n Would you like to add them to your roster and share your status when you're online? \n\nIf you choose to defer this choice, you'll be asked again when you next login.").arg(event->getJID().toString().c_str());
QVBoxLayout* layout = new QVBoxLayout();
QLabel* label = new QLabel(text, this);
layout->addWidget(label);
if (event_->getConcluded()) {
- QLabel* doneLabel = new QLabel("You have already replied to this request");
- QPushButton* okButton = new QPushButton("OK", this);
+ QLabel* doneLabel = new QLabel(tr("You have already replied to this request"));
+ QPushButton* okButton = new QPushButton(tr("Ok"), this);
connect(okButton, SIGNAL(clicked()), this, SLOT(handleDefer()));
layout->addWidget(doneLabel);
layout->addWidget(okButton);
} else {
- QPushButton* yesButton = new QPushButton("Yes", this);
+ QPushButton* yesButton = new QPushButton(tr("Yes"), this);
connect(yesButton, SIGNAL(clicked()), this, SLOT(handleYes()));
- QPushButton* noButton = new QPushButton("No", this);
+ QPushButton* noButton = new QPushButton(tr("No"), this);
connect(noButton, SIGNAL(clicked()), this, SLOT(handleNo()));
- QPushButton* deferButton = new QPushButton("Defer", this);
+ QPushButton* deferButton = new QPushButton(tr("Defer"), this);
connect(deferButton, SIGNAL(clicked()), this, SLOT(handleDefer()));
QHBoxLayout* buttonLayout = new QHBoxLayout();
diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp
index bb40da8..d4c306f 100644
--- a/Swift/QtUI/QtSwift.cpp
+++ b/Swift/QtUI/QtSwift.cpp
@@ -8,7 +8,6 @@
#include <string>
#include <QSplitter>
-#include <QTextCodec>
#include <boost/bind.hpp>
#include "QtLoginWindow.h"
@@ -72,8 +71,6 @@ po::options_description QtSwift::getOptionsDescription() {
QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMainThreadCaller_), autoUpdater_(NULL) {
- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
-
if (options.count("netbook-mode")) {
splitter_ = new QSplitter();
} else {
diff --git a/Swift/QtUI/QtTranslator.h b/Swift/QtUI/QtTranslator.h
new file mode 100644
index 0000000..fdafaf0
--- /dev/null
+++ b/Swift/QtUI/QtTranslator.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <QCoreApplication>
+
+#include <Swift/Controllers/Translator.h>
+
+class QtTranslator : public Swift::Translator {
+ public:
+ QtTranslator() {
+ }
+
+ virtual std::string translate(const std::string& text, const std::string& context) {
+ return std::string(QCoreApplication::translate(context.c_str(), text.c_str(), 0, QCoreApplication::UnicodeUTF8).toUtf8());
+ }
+};
diff --git a/Swift/QtUI/QtWebView.cpp b/Swift/QtUI/QtWebView.cpp
index 3aab88b..9d12010 100644
--- a/Swift/QtUI/QtWebView.cpp
+++ b/Swift/QtUI/QtWebView.cpp
@@ -5,7 +5,7 @@
*/
-#include "Swift/QtUI/QtWebView.h"
+#include "QtWebView.h"
#include <QKeyEvent>
#include <QFocusEvent>
@@ -58,7 +58,7 @@ void QtWebView::contextMenuEvent(QContextMenuEvent* ev) {
}
// Add our own custom actions
- menu->addAction("Clear", this, SIGNAL(clearRequested()));
+ menu->addAction(tr("Clear"), this, SIGNAL(clearRequested()));
menu->exec(ev->globalPos());
delete menu;
diff --git a/Swift/QtUI/QtXMLConsoleWidget.cpp b/Swift/QtUI/QtXMLConsoleWidget.cpp
index 42c8a8f..c1b1d0d 100644
--- a/Swift/QtUI/QtXMLConsoleWidget.cpp
+++ b/Swift/QtUI/QtXMLConsoleWidget.cpp
@@ -19,7 +19,7 @@
namespace Swift {
QtXMLConsoleWidget::QtXMLConsoleWidget() {
- setWindowTitle("Console");
+ setWindowTitle(tr("Console"));
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setSpacing(0);
@@ -37,17 +37,17 @@ QtXMLConsoleWidget::QtXMLConsoleWidget() {
buttonLayout->setContentsMargins(10,0,20,0);
buttonLayout->setSpacing(0);
- enabled = new QCheckBox("Trace input/output", bottom);
+ enabled = new QCheckBox(tr("Trace input/output"), bottom);
enabled->setChecked(true);
buttonLayout->addWidget(enabled);
buttonLayout->addStretch();
- QPushButton* clearButton = new QPushButton("Clear", bottom);
+ QPushButton* clearButton = new QPushButton(tr("Clear"), bottom);
connect(clearButton, SIGNAL(clicked()), textEdit, SLOT(clear()));
buttonLayout->addWidget(clearButton);
- setWindowTitle("Debug Console");
+ setWindowTitle(tr("Debug Console"));
emit titleUpdated();
}
@@ -72,11 +72,11 @@ void QtXMLConsoleWidget::closeEvent(QCloseEvent* event) {
}
void QtXMLConsoleWidget::handleDataRead(const std::string& data) {
- appendTextIfEnabled("<!-- IN -->\n" + data + "\n", QColor(33,98,33));
+ appendTextIfEnabled(std::string(tr("<!-- IN -->").toUtf8()) + "\n" + data + "\n", QColor(33,98,33));
}
void QtXMLConsoleWidget::handleDataWritten(const std::string& data) {
- appendTextIfEnabled("<!-- OUT -->\n" + data + "\n", QColor(155,1,0));
+ appendTextIfEnabled(std::string(tr("<!-- OUT -->").toUtf8()) + "\n" + data + "\n", QColor(155,1,0));
}
void QtXMLConsoleWidget::appendTextIfEnabled(const std::string& data, const QColor& color) {
diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp
index 90084c4..963ce72 100644
--- a/Swift/QtUI/Roster/QtTreeWidget.cpp
+++ b/Swift/QtUI/Roster/QtTreeWidget.cpp
@@ -83,18 +83,18 @@ void QtTreeWidget::contextMenuEvent(QContextMenuEvent* event) {
RosterItem* item = static_cast<RosterItem*>(index.internalPointer());
QMenu contextMenu;
if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) {
- QAction* editContact = contextMenu.addAction("Edit");
+ QAction* editContact = contextMenu.addAction(tr("Edit"));
QAction* result = contextMenu.exec(event->globalPos());
if (result == editContact) {
eventStream_->send(boost::make_shared<RequestContactEditorUIEvent>(contact->getJID()));
}
}
else if (GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item)) {
- QAction* renameGroup = contextMenu.addAction("Rename");
+ QAction* renameGroup = contextMenu.addAction(tr("Rename"));
QAction* result = contextMenu.exec(event->globalPos());
if (result == renameGroup) {
bool ok;
- QString newName = QInputDialog::getText(NULL, "Rename group", "New name for " + P2QSTRING(group->getDisplayName()), QLineEdit::Normal, P2QSTRING(group->getDisplayName()), &ok);
+ QString newName = QInputDialog::getText(NULL, tr("Rename group"), tr("New name for %1").arg(P2QSTRING(group->getDisplayName())), QLineEdit::Normal, P2QSTRING(group->getDisplayName()), &ok);
if (ok) {
eventStream_->send(boost::make_shared<RenameGroupUIEvent>(group->getDisplayName(), Q2PSTRING(newName)));
}
diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h
index ff11567..3430f7e 100644
--- a/Swift/QtUI/Roster/QtTreeWidget.h
+++ b/Swift/QtUI/Roster/QtTreeWidget.h
@@ -4,12 +4,10 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
-#ifndef SWIFT_QtTreeWidget_H
-#define SWIFT_QtTreeWidget_H
+#pragma once
#include <QTreeView>
#include <QModelIndex>
-#include "Swift/QtUI/Roster/QtTreeWidget.h"
#include "Swift/QtUI/Roster/RosterModel.h"
#include "Swift/QtUI/Roster/RosterDelegate.h"
@@ -44,5 +42,3 @@ class QtTreeWidget : public QTreeView{
};
}
-#endif
-
diff --git a/Swift/QtUI/Roster/QtTreeWidgetItem.h b/Swift/QtUI/Roster/QtTreeWidgetItem.h
index a2d0cdd..6855989 100644
--- a/Swift/QtUI/Roster/QtTreeWidgetItem.h
+++ b/Swift/QtUI/Roster/QtTreeWidgetItem.h
@@ -4,22 +4,17 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
-#ifndef SWIFT_QtTreeWidgetItem_H
-#define SWIFT_QtTreeWidgetItem_H
+#pragma once
#include <QColor>
#include <QVariant>
-
#include <string>
+
#include "Swiften/Roster/TreeWidgetFactory.h"
#include "Swiften/Roster/TreeWidget.h"
#include "Swiften/Roster/TreeWidgetItem.h"
-#include "Swift/QtUI/Roster/QtTreeWidgetItem.h"
-
-
#include "Swift/QtUI/QtSwiftUtil.h"
-
namespace Swift {
enum RosterRoles {
StatusTextRole = Qt::UserRole,
@@ -89,5 +84,3 @@ class QtTreeWidgetItem : public QObject, public TreeWidgetItem {
bool itemLessThan(QtTreeWidgetItem* left, QtTreeWidgetItem* right);
}
-#endif
-
diff --git a/Swift/QtUI/Roster/RosterModel.cpp b/Swift/QtUI/Roster/RosterModel.cpp
index 306b76f..2399a21 100644
--- a/Swift/QtUI/Roster/RosterModel.cpp
+++ b/Swift/QtUI/Roster/RosterModel.cpp
@@ -15,6 +15,7 @@
#include "Swiften/Elements/StatusShow.h"
#include "Swift/Controllers/Roster/ContactRosterItem.h"
#include "Swift/Controllers/Roster/GroupRosterItem.h"
+#include <Swift/Controllers/StatusUtil.h>
#include "QtSwiftUtil.h"
#include "Swift/QtUI/Roster/QtTreeWidget.h"
@@ -126,7 +127,7 @@ QString RosterModel::getToolTip(RosterItem* item) const {
if (contact->getDisplayJID().isValid()) {
tip += "\n" + P2QSTRING(contact->getDisplayJID().toBare().toString());
}
- tip += "\n " + P2QSTRING(StatusShow::typeToFriendlyName(contact->getStatusShow()));
+ tip += "\n " + P2QSTRING(statusShowTypeToFriendlyName(contact->getStatusShow()));
if (!getStatusText(item).isEmpty()) {
tip += ": " + getStatusText(item);
}
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index 6238693..e52d76a 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -155,7 +155,24 @@ myenv.Uic4("QtJoinMUCWindow.ui")
myenv.Qrc("DefaultTheme.qrc")
myenv.Qrc("Swift.qrc")
-commonResources = ["../resources/sounds"]
+# Resources
+commonResources = {
+ "": ["../resources/sounds"]
+}
+
+# Translation
+translation_sources = [env.File("../Translations/Swift.ts").abspath]
+for file in os.listdir(Dir("../Translations").abspath) :
+ if file.startswith("Swift_") and file.endswith(".ts") :
+ lang = file[6:-3]
+ translation_resource = "../resources/translations/Swift_" + lang + ".qm"
+ translation_source = "../Translations/Swift_" + lang + ".ts"
+ translation_sources.append(env.File(translation_source).abspath)
+ myenv.Qm(translation_resource, translation_source)
+ commonResources["translations"] = commonResources.get("translations", []) + [translation_resource]
+if ARGUMENTS.get("update_translations", False) :
+ t = myenv.Command(translation_sources, [], [myenv.Action("$QT4_LUPDATE -I " + env.Dir("#").abspath + " -silent -codecfortr utf-8 -recursive Swift -ts " + " ".join(translation_sources), cmdstr = "$QT4_LUPDATECOMSTR")])
+ myenv.AlwaysBuild(t)
if env["PLATFORM"] == "darwin" :
frameworks = []
@@ -163,7 +180,8 @@ if env["PLATFORM"] == "darwin" :
frameworks.append(env["SPARKLE_FRAMEWORK"])
if env["HAVE_GROWL"] :
frameworks.append(env["GROWL_FRAMEWORK"])
- app = myenv.AppBundle("Swift", version = myenv["SWIFT_VERSION"], resources = ["../resources/MacOSX/Swift.icns"] + commonResources, frameworks = frameworks)
+ commonResources[""] = commonResources.get("", []) + ["../resources/MacOSX/Swift.icns"]
+ app = myenv.AppBundle("Swift", version = myenv["SWIFT_VERSION"], resources = commonResources, frameworks = frameworks)
if env["DIST"] :
myenv.Command(["Swift-${SWIFT_VERSION}.dmg"], [app], ["Swift/Packaging/MacOSX/package.sh " + app.path + " Swift/Packaging/MacOSX/Swift.dmg.gz $TARGET $QTDIR"])
@@ -171,15 +189,18 @@ if env.get("SWIFT_INSTALLDIR", "") :
env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "bin"), swiftProgram)
env.InstallAs(os.path.join(env["SWIFT_INSTALLDIR"], "share", "pixmaps", "swift.xpm"), "../resources/logo/logo-icon-32.xpm")
env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "applications"), "../resources/swift.desktop")
- for resource in commonResources :
- env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "swift"), resource)
+ for dir, resource in commonResources.items() :
+ env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "swift", dir), resource)
if env["PLATFORM"] == "win32" :
if env["DIST"] :
- myenv.WindowsBundle("Swift", resources = [
+ commonResources[""] = commonResources.get("", []) + [
os.path.join(env["OPENSSL_DIR"], "bin", "ssleay32.dll"),
os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"),
- ] + commonResources + ["../resources/images"],
+ "../resources/images",
+ ]
+ myenv.WindowsBundle("Swift",
+ resources = commonResources,
qtimageformats = ["gif", "ico", "jpeg", "mng", "svg", "tiff"],
qtlibs = ["QtCore4", "QtGui4", "QtNetwork4", "QtWebKit4", "QtXMLPatterns4", "phonon4"])
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
index c6fb004..a384f5d 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
@@ -23,7 +23,7 @@ namespace Swift {
QtUserSearchFirstPage::QtUserSearchFirstPage(UserSearchWindow::Type type, const QString& title) {
setupUi(this);
setTitle(title);
- setSubTitle(QString("%1. If you know their JID you can enter it directly, or you can search for them.").arg(type == UserSearchWindow::AddContact ? "Add another user to your roster" : "Chat to another user"));
+ setSubTitle(QString(tr("%1. If you know their JID you can enter it directly, or you can search for them.")).arg(type == UserSearchWindow::AddContact ? tr("Add another user to your roster") : tr("Chat to another user")));
connect(jid_, SIGNAL(textChanged(const QString&)), this, SLOT(emitCompletenessCheck()));
connect(service_->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(emitCompletenessCheck()));
}
@@ -82,7 +82,7 @@ QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWin
setupUi(this);
model_ = new UserSearchModel();
delegate_ = new UserSearchDelegate();
- QString title(type == UserSearchWindow::AddContact ? "Add Contact" : "Chat to User");
+ QString title(type == UserSearchWindow::AddContact ? tr("Add Contact") : tr("Chat to User"));
setWindowTitle(title);
firstPage_ = new QtUserSearchFirstPage(type, title);
connect(firstPage_->byJID_, SIGNAL(toggled(bool)), this, SLOT(handleFirstPageRadioChange()));
@@ -289,7 +289,14 @@ void QtUserSearchWindow::clearForm() {
void QtUserSearchWindow::clear() {
firstPage_->errorLabel_->setVisible(false);
- firstPage_->howLabel_->setText(QString("How would you like to find the user to %1?").arg(type_ == AddContact ? "add" : "chat to"));
+ QString howText;
+ if (type_ == AddContact) {
+ howText = QString("How would you like to find the user to add?");
+ }
+ else {
+ howText = QString("How would you like to find the user to chat to?");
+ }
+ firstPage_->howLabel_->setText(howText);
firstPage_->byJID_->setChecked(true);
clearForm();
model_->clear();
@@ -311,13 +318,13 @@ void QtUserSearchWindow::setError(const QString& error) {
void QtUserSearchWindow::setSearchError(bool error) {
if (error) {
- setError("Error while searching");
+ setError(tr("Error while searching"));
}
}
void QtUserSearchWindow::setServerSupportsSearch(bool support) {
if (!support) {
- setError("This server doesn't support searching for users.");
+ setError(tr("This server doesn't support searching for users."));
}
}
diff --git a/Swift/QtUI/main.cpp b/Swift/QtUI/main.cpp
index c5f744a..3cbb170 100644
--- a/Swift/QtUI/main.cpp
+++ b/Swift/QtUI/main.cpp
@@ -8,14 +8,37 @@
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options.hpp>
#include <boost/version.hpp>
-
#include <iostream>
-
#include <QApplication>
+#include <QTextCodec>
+#include <QTranslator>
+#include <QLocale>
+
+#include <Swift/Controllers/Translator.h>
+#include <Swift/Controllers/ApplicationInfo.h>
+#include <SwifTools/Application/PlatformApplicationPathProvider.h>
#include "QtSwift.h"
+#include "QtTranslator.h"
int main(int argc, char* argv[]) {
+ QApplication app(argc, argv);
+
+ QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
+
+ // Translation
+ QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
+ boost::filesystem::path someTranslationPath = Swift::PlatformApplicationPathProvider(SWIFT_APPLICATION_NAME).getResourcePath("/translations/Swift_nl.qm");
+ QTranslator qtTranslator;
+ if (!someTranslationPath.empty()) {
+ //std::cout << "Loading " << std::string(QLocale::system().name().toUtf8()) << std::endl;
+ qtTranslator.load("Swift_" + QLocale::system().name(), someTranslationPath.parent_path().string().c_str());
+ }
+ app.installTranslator(&qtTranslator);
+ QtTranslator swiftTranslator;
+ Swift::Translator::setInstance(&swiftTranslator);
+
+ // Parse program options
boost::program_options::options_description desc = Swift::QtSwift::getOptionsDescription();
boost::program_options::variables_map vm;
try {
@@ -32,7 +55,11 @@ int main(int argc, char* argv[]) {
std::cout << desc << "\n";
return 1;
}
- QApplication app(argc, argv);
+
Swift::QtSwift swift(vm);
- return app.exec();
+ int result = app.exec();
+
+ Swift::Translator::setInstance(NULL);
+
+ return result;
}
diff --git a/Swift/QtUI/tmp/QtContextMenu.cpp b/Swift/QtUI/tmp/QtContextMenu.cpp
deleted file mode 100644
index c74fb31..0000000
--- a/Swift/QtUI/tmp/QtContextMenu.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2010 Kevin Smith
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#include "ContextMenus/QtContextMenu.h"
-
-namespace Swift {
-
-QtContextMenu::~QtContextMenu() {
-}
-
-}
diff --git a/Swift/QtUI/tmp/QtContextMenu.h b/Swift/QtUI/tmp/QtContextMenu.h
deleted file mode 100644
index 9e73ef9..0000000
--- a/Swift/QtUI/tmp/QtContextMenu.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (c) 2010 Kevin Smith
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-namespace Swift {
- class RosterItem;
- class QtContextMenu {
- public:
- virtual ~QtContextMenu();
-
- virtual void show(RosterItem* item) = 0;
- };
-}
diff --git a/Swift/QtUI/tmp/QtRosterContextMenu.cpp b/Swift/QtUI/tmp/QtRosterContextMenu.cpp
deleted file mode 100644
index c8375ba..0000000
--- a/Swift/QtUI/tmp/QtRosterContextMenu.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2010 Kevin Smith
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#include "Swift/QtUI/ContextMenus/QtRosterContextMenu.h"
-
-#include <QInputDialog>
-#include <QLineEdit>
-#include <QMenu>
-#include <QDebug>
-#include <QDialog>
-#include <QMessageBox>
-
-#include <boost/shared_ptr.hpp>
-#include <boost/smart_ptr/make_shared.hpp>
-
-#include "Swiften/Roster/ContactRosterItem.h"
-#include "Swiften/Roster/GroupRosterItem.h"
-#include <string>
-#include "Swiften/Roster/Roster.h"
-#include "Swift/Controllers/UIEvents/UIEvent.h"
-#include "Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h"
-#include "Swift/Controllers/UIEvents/RenameRosterItemUIEvent.h"
-#include "Swift/QtUI/QtSwiftUtil.h"
-#include "Swift/QtUI/QtEditContactDialog.h"
-
-
-namespace Swift {
-
-QtRosterContextMenu::QtRosterContextMenu(UIEventStream* eventStream, QtTreeWidget* treeWidget) : eventStream_(eventStream), treeWidget_(treeWidget), item_(NULL) {
-}
-
-void QtRosterContextMenu::show(RosterItem* item) {
- ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item);
- item_ = item;
- QMenu contextMenu;
- if (contact) {
- contextMenu.addAction("Edit", this, SLOT(handleEditContact()));
- }
- GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item);
- if (group) {
- contextMenu.addAction("Rename", this, SLOT(handleRenameGroup()));
- }
- contextMenu.exec(QCursor::pos());
-}
-
-void QtRosterContextMenu::handleEditContact() {
- ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item_);
- assert(contact);
-
- // Figure out all the groups the contact is in
- QList<QString> allGroups;
- foreach (RosterItem* item, treeWidget_->getRoster()->getRoot()->getChildren()) {
- GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item);
- if (group) {
- allGroups.push_back(P2QSTRING(group->getDisplayName()));
- }
- }
-
- QtEditContactDialog editDialog(contact, allGroups, eventStream_);
-
- if (groupDialog.exec() == QDialog::Accepted) {
- eventStream_->send(groupDialog.getRegroupEvent());
- }
-
- /* ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item_);
- QMessageBox msgBox;
- msgBox.setWindowTitle("Confirm contact deletion");
- msgBox.setText("Are you sure you want to delete this contact?");
- msgBox.setInformativeText(QString("This will remove the contact '%1' from all groups they may be in.").arg(P2QSTRING(contact->getJID().toString())));
- msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
- msgBox.setDefaultButton(QMessageBox::Yes);
- int ret = msgBox.exec();
- if (ret == QMessageBox::Yes) {
- eventStream_->send(boost::shared_ptr<UIEvent>(new RemoveRosterItemUIEvent(contact->getJID())));
- }*/
-
-
-/* bool ok;
- QString newName = QInputDialog::getText(NULL, "Rename contact", "New name for " + P2QSTRING(item_->getDisplayName()), QLineEdit::Normal, P2QSTRING(item_->getDisplayName()), &ok);
- if (ok) {
- eventStream_->send(boost::shared_ptr<UIEvent>(new RenameRosterItemUIEvent(contact->getJID(), Q2PSTRING(newName))));
- }*/
-}
-
-void QtRosterContextMenu::handleRenameGroup() {
- /*
- GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item_);
- assert(group);
- bool ok;
- QString newName = QInputDialog::getText(NULL, "Rename group", "New name for " + P2QSTRING(item_->getDisplayName()), QLineEdit::Normal, P2QSTRING(item_->getDisplayName()), &ok);
- if (ok) {
- std::vector<std::string> addedGroups;
- std::vector<std::string> removedGroups;
- addedGroups.push_back(Q2PSTRING(newName));
- removedGroups.push_back(group->getDisplayName());
- foreach (RosterItem* child, group->getChildren()) {
- ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(child);
- assert(contact);
- eventStream_->send(boost::make_shared<RegroupRosterItemUIEvent>(contact->getJID(), addedGroups, removedGroups));
- }
- }
- */
-}
-
-}
diff --git a/Swift/QtUI/tmp/QtRosterContextMenu.h b/Swift/QtUI/tmp/QtRosterContextMenu.h
deleted file mode 100644
index 2357735..0000000
--- a/Swift/QtUI/tmp/QtRosterContextMenu.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2010 Kevin Smith
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-#include <QObject>
-
-#include "Swift/QtUI/ContextMenus/QtContextMenu.h"
-#include "Swift/QtUI/Roster/QtTreeWidget.h"
-#include "Swift/Controllers/UIEvents/UIEventStream.h"
-
-namespace Swift {
- class RosterItem;
- class QtRosterContextMenu : public QObject, public QtContextMenu {
- Q_OBJECT
- public:
- QtRosterContextMenu(UIEventStream* eventStream, QtTreeWidget* treeWidget);
- void show(RosterItem* item);
-
- private slots:
- void handleRenameGroup();
- void handleEditContact();
-
- private:
- UIEventStream* eventStream_;
- QtTreeWidget* treeWidget_;
- RosterItem* item_;
- };
-}
diff --git a/Swift/Translations/Swift.ts b/Swift/Translations/Swift.ts
new file mode 100644
index 0000000..959687e
--- /dev/null
+++ b/Swift/Translations/Swift.ts
@@ -0,0 +1,1387 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name></name>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="46"/>
+ <source>Starting chat with %1% in chatroom %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="49"/>
+ <source>Starting chat with %1% - %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="115"/>
+ <source>me</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="156"/>
+ <source>%1% has gone offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="160"/>
+ <source>%1% has become available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="162"/>
+ <source>%1% has gone away</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="164"/>
+ <source>%1% is now busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="56"/>
+ <source>The day is now %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="193"/>
+ <source>Error sending message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="199"/>
+ <source>Bad request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="200"/>
+ <source>Conflict</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="201"/>
+ <source>This feature is not implemented</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="202"/>
+ <source>Forbidden</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="203"/>
+ <source>Recipient can no longer be contacted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="204"/>
+ <source>Internal server error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="205"/>
+ <source>Item not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="206"/>
+ <source>JID Malformed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="207"/>
+ <source>Message was rejected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="208"/>
+ <source>Not allowed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="209"/>
+ <source>Not authorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="210"/>
+ <source>Payment is required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="211"/>
+ <source>Recipient is unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="212"/>
+ <source>Redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="213"/>
+ <source>Registration required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="214"/>
+ <source>Recipient&apos;s server not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="215"/>
+ <source>Remote server timeout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="216"/>
+ <source>The server is low on resources</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="217"/>
+ <source>The service is unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="218"/>
+ <source>A subscription is required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="219"/>
+ <source>Undefined condition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="220"/>
+ <source>Unexpected request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="114"/>
+ <source>Room %1% is not responding. This operation may never complete.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="125"/>
+ <source>Unable to join this room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="131"/>
+ <source>Unable to join this room as %1%, retrying as %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="135"/>
+ <source>No nickname specified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="139"/>
+ <source>A password needed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="143"/>
+ <source>Only members may join</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="147"/>
+ <source>You are banned from the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="151"/>
+ <source>The room is full</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="155"/>
+ <source>The room does not exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="173"/>
+ <source>You have joined room %1% as %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="214"/>
+ <source>%1% has joined the room as a %2%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="217"/>
+ <source>%1% has joined the room.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="243"/>
+ <source>moderator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="244"/>
+ <source>participant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="245"/>
+ <source>visitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="284"/>
+ <source>The room subject is now: %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="307"/>
+ <source>%1% is now a %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="313"/>
+ <source>Moderators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="314"/>
+ <source>Participants</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="315"/>
+ <source>Visitors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="316"/>
+ <source>Occupants</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="330"/>
+ <source>Trying to join room %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="359"/>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="468"/>
+ <source>%1% has left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="359"/>
+ <source>You have left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="433"/>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="497"/>
+ <source> and </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="457"/>
+ <source>%1% have joined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="460"/>
+ <source>%1% has joined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="465"/>
+ <source>%1% have left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="473"/>
+ <source>%1% have joined then left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="476"/>
+ <source>%1% has joined then left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="481"/>
+ <source>%1% have left then rejoined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="484"/>
+ <source>%1% has left then rejoined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="437"/>
+ <source>Unknown Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="438"/>
+ <source>Unable to find server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="439"/>
+ <source>Error connecting to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="440"/>
+ <source>Error while receiving server data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="441"/>
+ <source>Error while sending data to the server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="442"/>
+ <source>Error parsing server data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="443"/>
+ <source>Login/password invalid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="444"/>
+ <source>Error while compressing stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="445"/>
+ <source>Server verification failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="446"/>
+ <source>Authentication mechanisms not supported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="447"/>
+ <source>Unexpected response</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="448"/>
+ <source>Error binding resource</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="449"/>
+ <source>Error starting session</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="450"/>
+ <source>Stream error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="451"/>
+ <source>Encryption error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="452"/>
+ <source>Error loading certificate (Invalid password?)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="453"/>
+ <source>Certificate not authorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="455"/>
+ <source>Unknown certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="456"/>
+ <source>Certificate has expired</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="457"/>
+ <source>Certificate is not yet valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="458"/>
+ <source>Certificate is self-signed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="459"/>
+ <source>Certificate has been rejected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="460"/>
+ <source>Certificate is not trusted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="461"/>
+ <source>Certificate cannot be used for encryptig your connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="462"/>
+ <source>Certificate path length constraint exceeded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="463"/>
+ <source>Invalid certificate signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="464"/>
+ <source>Invalid Certificate Authority</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="465"/>
+ <source>Certificate does not match the host identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="475"/>
+ <source>Certificate error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="489"/>
+ <source>Reconnect to %1% failed: %2%. Will retry in %3% seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="492"/>
+ <source>Disconnected from %1%: %2%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="126"/>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="152"/>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="213"/>
+ <source>Contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="250"/>
+ <source>Server %1% rejected roster change to item &apos;%2%&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="15"/>
+ <location filename="../Controllers/StatusUtil.cpp" line="16"/>
+ <source>Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="17"/>
+ <location filename="../Controllers/StatusUtil.cpp" line="18"/>
+ <source>Away</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="19"/>
+ <source>Busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="20"/>
+ <source>Offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/MUCSearchEmptyItem.cpp" line="25"/>
+ <source>No rooms found</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtBookmarkDetailWindow</name>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="20"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="137"/>
+ <source>Edit Bookmark Details</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="40"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="138"/>
+ <source>Bookmark Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="50"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="139"/>
+ <source>Room JID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="60"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="140"/>
+ <source>Your Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="70"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="141"/>
+ <source>Room password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="93"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="142"/>
+ <source>Join automatically</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtJoinMUCWindow</name>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="20"/>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="96"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="124"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="130"/>
+ <source>Join Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="28"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="125"/>
+ <source>Room:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="35"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="126"/>
+ <source>Search ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="42"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="127"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="89"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="129"/>
+ <source>Join automatically in future</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtMUCSearchWindow</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="14"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="118"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="20"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="119"/>
+ <source>Service:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="74"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="121"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="84"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="122"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="96"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="123"/>
+ <source>List rooms</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtStatusWidget</name>
+ <message>
+ <location filename="../QtUI/QtStatusWidget.cpp" line="29"/>
+ <source>(No message)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchFieldsPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="117"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="27"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="119"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="37"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="120"/>
+ <source>First name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="47"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="121"/>
+ <source>Last name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="57"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="122"/>
+ <source>E-Mail:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="80"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="123"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="87"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="124"/>
+ <source>Fetching search fields</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchFirstPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="120"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="17"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="121"/>
+ <source>Add a user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="20"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="122"/>
+ <source>Add another user to your roster. If you know their JID you can add them directly, or you can search for them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="26"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="123"/>
+ <source>howLabel_</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="35"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="124"/>
+ <source>I know their JID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="47"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="125"/>
+ <source>I&apos;d like to search my server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="56"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="126"/>
+ <source>I&apos;d like to search another server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="91"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="127"/>
+ <source>&lt;font color=&apos;red&apos;&gt;errorLabel_&lt;/font&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchResultsPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchResultsPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchResultsPage.h" line="51"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchWindow</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="20"/>
+ <source>Find other users</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="46"/>
+ <source>Service to search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="75"/>
+ <source>Get Search Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="91"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="110"/>
+ <source>Enter search terms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="117"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="127"/>
+ <source>First name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="137"/>
+ <source>Last name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="147"/>
+ <source>E-Mail:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="191"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="218"/>
+ <source>Results:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="228"/>
+ <source>Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="240"/>
+ <source>Add to Roster. Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="254"/>
+ <source>Start Chat With Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchWizard</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWizard.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchWizard.h" line="39"/>
+ <source>Find User</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::ChatListModel</name>
+ <message>
+ <location filename="../QtUI/ChatList/ChatListModel.cpp" line="15"/>
+ <source>Bookmarked Rooms</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtAboutWidget</name>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="23"/>
+ <source>About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="42"/>
+ <source>Built with: Qt version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="43"/>
+ <source>Running with Qt version </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="48"/>
+ <source>View License</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtAvatarWidget</name>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="73"/>
+ <source>Select picture ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="76"/>
+ <source>Clear picture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="81"/>
+ <source>Select picture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="81"/>
+ <source>Image Files (*.png *.jpg *.gif)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="95"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="95"/>
+ <source>The selected picture is in an unrecognized format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtBookmarkDetailWindow</name>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.cpp" line="31"/>
+ <source>Bookmark not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.cpp" line="31"/>
+ <source>You must specify a valid room address (e.g. myroom@chats.example.com).</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatListWindow</name>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="62"/>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="66"/>
+ <source>Add New Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="63"/>
+ <source>Edit Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="64"/>
+ <source>Remove Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatView</name>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="61"/>
+ <source>Clear log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="62"/>
+ <source>You are about to clear the contents of your chat log.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="63"/>
+ <source>Are you sure?</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatWindow</name>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="290"/>
+ <source>This message has not been received by your server yet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="292"/>
+ <source>This message may not have been transmitted.&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="312"/>
+ <source>Couldn&apos;t send message: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtContactEditWidget</name>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="28"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="34"/>
+ <source>Groups:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="56"/>
+ <source>New Group:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtContactEditWindow</name>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="26"/>
+ <source>Edit contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="41"/>
+ <source>Remove contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="44"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="76"/>
+ <source>Confirm contact deletion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="77"/>
+ <source>Are you sure you want to delete this contact?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="78"/>
+ <source>This will remove the contact &apos;%1&apos; from all groups they may be in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtLoginWindow</name>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="81"/>
+ <source>User address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="86"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="87"/>
+ <source>User address - looks like someuser@someserver.com</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="91"/>
+ <source>Example: alice@wonderland.lit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="97"/>
+ <source>Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="118"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="119"/>
+ <source>Click if you have a personal certificate used for login to the service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="125"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="291"/>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="136"/>
+ <source>Remember Password?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="138"/>
+ <source>Login Automatically?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="150"/>
+ <source>&amp;Swift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="152"/>
+ <source>&amp;General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="157"/>
+ <source>&amp;About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="161"/>
+ <source>&amp;Show Debug Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="165"/>
+ <source>&amp;Play Sounds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="171"/>
+ <source>Show &amp;Notifications</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="183"/>
+ <source>&amp;Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="197"/>
+ <source>Remove profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="197"/>
+ <source>Remove the profile &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="291"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="312"/>
+ <source>Select an authentication certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="412"/>
+ <source>The certificate presented by the server is not valid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="413"/>
+ <source>Would you like to permanently trust this certificate? This must only be done if you know it is correct.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="415"/>
+ <source>Subject: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="416"/>
+ <source>SHA-1 Fingerprint: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtMUCSearchWindow</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="30"/>
+ <source>Search Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="50"/>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="52"/>
+ <source>Searching</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtMainWindow</name>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="63"/>
+ <source>&amp;Contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="70"/>
+ <source>&amp;Notices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="71"/>
+ <source>C&amp;hats</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="75"/>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="77"/>
+ <source>Show offline contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="83"/>
+ <source>&amp;Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="85"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="88"/>
+ <source>&amp;Join Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="91"/>
+ <source>&amp;Add Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="94"/>
+ <source>Start &amp;Chat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="98"/>
+ <source>&amp;Sign Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="130"/>
+ <source>Notices</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtNameWidget</name>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="47"/>
+ <source>Show nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="47"/>
+ <source>(No Nickname Set)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="55"/>
+ <source>Show ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="62"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtProfileWindow</name>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="24"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="43"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="67"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtStatusWidget</name>
+ <message>
+ <location filename="../QtUI/QtStatusWidget.cpp" line="233"/>
+ <source>Connecting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtSubscriptionRequestWindow</name>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="24"/>
+ <source>You have already replied to this request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="25"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="30"/>
+ <source>Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="32"/>
+ <source>No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="34"/>
+ <source>Defer</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtTreeWidget</name>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="86"/>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="93"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="97"/>
+ <source>Rename group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="97"/>
+ <source>New name for %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtUserSearchFirstPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>%1. If you know their JID you can enter it directly, or you can search for them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>Add another user to your roster</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>Chat to another user</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtUserSearchWindow</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="85"/>
+ <source>Add Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="85"/>
+ <source>Chat to User</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="321"/>
+ <source>Error while searching</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="327"/>
+ <source>This server doesn&apos;t support searching for users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtWebView</name>
+ <message>
+ <location filename="../QtUI/QtWebView.cpp" line="61"/>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtXMLConsoleWidget</name>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="22"/>
+ <source>Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="40"/>
+ <source>Trace input/output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="46"/>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="50"/>
+ <source>Debug Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="75"/>
+ <source>&lt;!-- IN --&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="79"/>
+ <source>&lt;!-- OUT --&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/Swift/Translations/Swift_nl.ts b/Swift/Translations/Swift_nl.ts
new file mode 100644
index 0000000..d967c57
--- /dev/null
+++ b/Swift/Translations/Swift_nl.ts
@@ -0,0 +1,1387 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="nl_NL">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+ <name></name>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="46"/>
+ <source>Starting chat with %1% in chatroom %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="49"/>
+ <source>Starting chat with %1% - %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="115"/>
+ <source>me</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="156"/>
+ <source>%1% has gone offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="160"/>
+ <source>%1% has become available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="162"/>
+ <source>%1% has gone away</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatController.cpp" line="164"/>
+ <source>%1% is now busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="56"/>
+ <source>The day is now %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="193"/>
+ <source>Error sending message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="199"/>
+ <source>Bad request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="200"/>
+ <source>Conflict</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="201"/>
+ <source>This feature is not implemented</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="202"/>
+ <source>Forbidden</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="203"/>
+ <source>Recipient can no longer be contacted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="204"/>
+ <source>Internal server error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="205"/>
+ <source>Item not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="206"/>
+ <source>JID Malformed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="207"/>
+ <source>Message was rejected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="208"/>
+ <source>Not allowed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="209"/>
+ <source>Not authorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="210"/>
+ <source>Payment is required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="211"/>
+ <source>Recipient is unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="212"/>
+ <source>Redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="213"/>
+ <source>Registration required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="214"/>
+ <source>Recipient&apos;s server not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="215"/>
+ <source>Remote server timeout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="216"/>
+ <source>The server is low on resources</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="217"/>
+ <source>The service is unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="218"/>
+ <source>A subscription is required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="219"/>
+ <source>Undefined condition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/ChatControllerBase.cpp" line="220"/>
+ <source>Unexpected request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="114"/>
+ <source>Room %1% is not responding. This operation may never complete.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="125"/>
+ <source>Unable to join this room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="131"/>
+ <source>Unable to join this room as %1%, retrying as %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="135"/>
+ <source>No nickname specified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="139"/>
+ <source>A password needed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="143"/>
+ <source>Only members may join</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="147"/>
+ <source>You are banned from the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="151"/>
+ <source>The room is full</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="155"/>
+ <source>The room does not exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="173"/>
+ <source>You have joined room %1% as %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="214"/>
+ <source>%1% has joined the room as a %2%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="217"/>
+ <source>%1% has joined the room.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="243"/>
+ <source>moderator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="244"/>
+ <source>participant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="245"/>
+ <source>visitor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="284"/>
+ <source>The room subject is now: %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="307"/>
+ <source>%1% is now a %2%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="313"/>
+ <source>Moderators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="314"/>
+ <source>Participants</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="315"/>
+ <source>Visitors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="316"/>
+ <source>Occupants</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="330"/>
+ <source>Trying to join room %1%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="359"/>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="468"/>
+ <source>%1% has left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="359"/>
+ <source>You have left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="433"/>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="497"/>
+ <source> and </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="457"/>
+ <source>%1% have joined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="460"/>
+ <source>%1% has joined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="465"/>
+ <source>%1% have left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="473"/>
+ <source>%1% have joined then left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="476"/>
+ <source>%1% has joined then left the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="481"/>
+ <source>%1% have left then rejoined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Chat/MUCController.cpp" line="484"/>
+ <source>%1% has left then rejoined the room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="437"/>
+ <source>Unknown Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="438"/>
+ <source>Unable to find server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="439"/>
+ <source>Error connecting to server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="440"/>
+ <source>Error while receiving server data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="441"/>
+ <source>Error while sending data to the server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="442"/>
+ <source>Error parsing server data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="443"/>
+ <source>Login/password invalid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="444"/>
+ <source>Error while compressing stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="445"/>
+ <source>Server verification failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="446"/>
+ <source>Authentication mechanisms not supported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="447"/>
+ <source>Unexpected response</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="448"/>
+ <source>Error binding resource</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="449"/>
+ <source>Error starting session</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="450"/>
+ <source>Stream error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="451"/>
+ <source>Encryption error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="452"/>
+ <source>Error loading certificate (Invalid password?)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="453"/>
+ <source>Certificate not authorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="455"/>
+ <source>Unknown certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="456"/>
+ <source>Certificate has expired</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="457"/>
+ <source>Certificate is not yet valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="458"/>
+ <source>Certificate is self-signed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="459"/>
+ <source>Certificate has been rejected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="460"/>
+ <source>Certificate is not trusted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="461"/>
+ <source>Certificate cannot be used for encryptig your connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="462"/>
+ <source>Certificate path length constraint exceeded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="463"/>
+ <source>Invalid certificate signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="464"/>
+ <source>Invalid Certificate Authority</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="465"/>
+ <source>Certificate does not match the host identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="475"/>
+ <source>Certificate error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="489"/>
+ <source>Reconnect to %1% failed: %2%. Will retry in %3% seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/MainController.cpp" line="492"/>
+ <source>Disconnected from %1%: %2%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="126"/>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="152"/>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="213"/>
+ <source>Contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/Roster/RosterController.cpp" line="250"/>
+ <source>Server %1% rejected roster change to item &apos;%2%&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="15"/>
+ <location filename="../Controllers/StatusUtil.cpp" line="16"/>
+ <source>Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="17"/>
+ <location filename="../Controllers/StatusUtil.cpp" line="18"/>
+ <source>Away</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="19"/>
+ <source>Busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../Controllers/StatusUtil.cpp" line="20"/>
+ <source>Offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/MUCSearchEmptyItem.cpp" line="25"/>
+ <source>No rooms found</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtBookmarkDetailWindow</name>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="20"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="137"/>
+ <source>Edit Bookmark Details</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="40"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="138"/>
+ <source>Bookmark Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="50"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="139"/>
+ <source>Room JID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="60"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="140"/>
+ <source>Your Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="70"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="141"/>
+ <source>Room password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.ui" line="93"/>
+ <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="142"/>
+ <source>Join automatically</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtJoinMUCWindow</name>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="20"/>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="96"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="124"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="130"/>
+ <source>Join Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="28"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="125"/>
+ <source>Room:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="35"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="126"/>
+ <source>Search ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="42"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="127"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtJoinMUCWindow.ui" line="89"/>
+ <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="129"/>
+ <source>Join automatically in future</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtMUCSearchWindow</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="14"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="118"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="20"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="119"/>
+ <source>Service:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="74"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="121"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="84"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="122"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="96"/>
+ <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="123"/>
+ <source>List rooms</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtStatusWidget</name>
+ <message>
+ <location filename="../QtUI/QtStatusWidget.cpp" line="29"/>
+ <source>(No message)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchFieldsPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="117"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="27"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="119"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="37"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="120"/>
+ <source>First name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="47"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="121"/>
+ <source>Last name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="57"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="122"/>
+ <source>E-Mail:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="80"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="123"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFieldsPage.ui" line="87"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFieldsPage.h" line="124"/>
+ <source>Fetching search fields</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchFirstPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="120"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="17"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="121"/>
+ <source>Add a user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="20"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="122"/>
+ <source>Add another user to your roster. If you know their JID you can add them directly, or you can search for them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="26"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="123"/>
+ <source>howLabel_</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="35"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="124"/>
+ <source>I know their JID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="47"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="125"/>
+ <source>I&apos;d like to search my server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="56"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="126"/>
+ <source>I&apos;d like to search another server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchFirstPage.ui" line="91"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchFirstPage.h" line="127"/>
+ <source>&lt;font color=&apos;red&apos;&gt;errorLabel_&lt;/font&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchResultsPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchResultsPage.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchResultsPage.h" line="51"/>
+ <source>WizardPage</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchWindow</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="20"/>
+ <source>Find other users</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="46"/>
+ <source>Service to search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="75"/>
+ <source>Get Search Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="91"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="110"/>
+ <source>Enter search terms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="117"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="127"/>
+ <source>First name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="137"/>
+ <source>Last name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="147"/>
+ <source>E-Mail:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="191"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="218"/>
+ <source>Results:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="228"/>
+ <source>Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="240"/>
+ <source>Add to Roster. Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.ui" line="254"/>
+ <source>Start Chat With Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QtUserSearchWizard</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWizard.ui" line="14"/>
+ <location filename="../QtUI/UserSearch/ui_QtUserSearchWizard.h" line="39"/>
+ <source>Find User</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::ChatListModel</name>
+ <message>
+ <location filename="../QtUI/ChatList/ChatListModel.cpp" line="15"/>
+ <source>Bookmarked Rooms</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtAboutWidget</name>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="23"/>
+ <source>About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="42"/>
+ <source>Built with: Qt version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="43"/>
+ <source>Running with Qt version </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAboutWidget.cpp" line="48"/>
+ <source>View License</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtAvatarWidget</name>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="73"/>
+ <source>Select picture ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="76"/>
+ <source>Clear picture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="81"/>
+ <source>Select picture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="81"/>
+ <source>Image Files (*.png *.jpg *.gif)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="95"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtAvatarWidget.cpp" line="95"/>
+ <source>The selected picture is in an unrecognized format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtBookmarkDetailWindow</name>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.cpp" line="31"/>
+ <source>Bookmark not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtBookmarkDetailWindow.cpp" line="31"/>
+ <source>You must specify a valid room address (e.g. myroom@chats.example.com).</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatListWindow</name>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="62"/>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="66"/>
+ <source>Add New Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="63"/>
+ <source>Edit Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/ChatList/QtChatListWindow.cpp" line="64"/>
+ <source>Remove Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatView</name>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="61"/>
+ <source>Clear log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="62"/>
+ <source>You are about to clear the contents of your chat log.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatView.cpp" line="63"/>
+ <source>Are you sure?</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtChatWindow</name>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="290"/>
+ <source>This message has not been received by your server yet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="292"/>
+ <source>This message may not have been transmitted.&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtChatWindow.cpp" line="312"/>
+ <source>Couldn&apos;t send message: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtContactEditWidget</name>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="28"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="34"/>
+ <source>Groups:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWidget.cpp" line="56"/>
+ <source>New Group:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtContactEditWindow</name>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="26"/>
+ <source>Edit contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="41"/>
+ <source>Remove contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="44"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="76"/>
+ <source>Confirm contact deletion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="77"/>
+ <source>Are you sure you want to delete this contact?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtContactEditWindow.cpp" line="78"/>
+ <source>This will remove the contact &apos;%1&apos; from all groups they may be in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtLoginWindow</name>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="81"/>
+ <source>User address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="86"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="87"/>
+ <source>User address - looks like someuser@someserver.com</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="91"/>
+ <source>Example: alice@wonderland.lit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="97"/>
+ <source>Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="118"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="119"/>
+ <source>Click if you have a personal certificate used for login to the service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="125"/>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="291"/>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="136"/>
+ <source>Remember Password?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="138"/>
+ <source>Login Automatically?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="150"/>
+ <source>&amp;Swift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="152"/>
+ <source>&amp;General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="157"/>
+ <source>&amp;About %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="161"/>
+ <source>&amp;Show Debug Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="165"/>
+ <source>&amp;Play Sounds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="171"/>
+ <source>Show &amp;Notifications</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="183"/>
+ <source>&amp;Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="197"/>
+ <source>Remove profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="197"/>
+ <source>Remove the profile &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="291"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="312"/>
+ <source>Select an authentication certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="412"/>
+ <source>The certificate presented by the server is not valid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="413"/>
+ <source>Would you like to permanently trust this certificate? This must only be done if you know it is correct.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="415"/>
+ <source>Subject: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtLoginWindow.cpp" line="416"/>
+ <source>SHA-1 Fingerprint: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtMUCSearchWindow</name>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="30"/>
+ <source>Search Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="50"/>
+ <location filename="../QtUI/MUCSearch/QtMUCSearchWindow.cpp" line="52"/>
+ <source>Searching</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtMainWindow</name>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="63"/>
+ <source>&amp;Contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="70"/>
+ <source>&amp;Notices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="71"/>
+ <source>C&amp;hats</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="75"/>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="77"/>
+ <source>Show offline contacts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="83"/>
+ <source>&amp;Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="85"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="88"/>
+ <source>&amp;Join Room</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="91"/>
+ <source>&amp;Add Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="94"/>
+ <source>Start &amp;Chat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="98"/>
+ <source>&amp;Sign Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtMainWindow.cpp" line="130"/>
+ <source>Notices</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtNameWidget</name>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="47"/>
+ <source>Show nickname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="47"/>
+ <source>(No Nickname Set)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="55"/>
+ <source>Show ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtNameWidget.cpp" line="62"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtProfileWindow</name>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="24"/>
+ <source>Edit Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="43"/>
+ <source>Nickname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtProfileWindow.cpp" line="67"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtStatusWidget</name>
+ <message>
+ <location filename="../QtUI/QtStatusWidget.cpp" line="233"/>
+ <source>Connecting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtSubscriptionRequestWindow</name>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="24"/>
+ <source>You have already replied to this request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="25"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="30"/>
+ <source>Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="32"/>
+ <source>No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtSubscriptionRequestWindow.cpp" line="34"/>
+ <source>Defer</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtTreeWidget</name>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="86"/>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="93"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="97"/>
+ <source>Rename group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/Roster/QtTreeWidget.cpp" line="97"/>
+ <source>New name for %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtUserSearchFirstPage</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>%1. If you know their JID you can enter it directly, or you can search for them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>Add another user to your roster</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="26"/>
+ <source>Chat to another user</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtUserSearchWindow</name>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="85"/>
+ <source>Add Contact</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="85"/>
+ <source>Chat to User</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="321"/>
+ <source>Error while searching</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/UserSearch/QtUserSearchWindow.cpp" line="327"/>
+ <source>This server doesn&apos;t support searching for users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtWebView</name>
+ <message>
+ <location filename="../QtUI/QtWebView.cpp" line="61"/>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtXMLConsoleWidget</name>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="22"/>
+ <source>Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="40"/>
+ <source>Trace input/output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="46"/>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="50"/>
+ <source>Debug Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="75"/>
+ <source>&lt;!-- IN --&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtXMLConsoleWidget.cpp" line="79"/>
+ <source>&lt;!-- OUT --&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/Swift/resources/.gitignore b/Swift/resources/.gitignore
new file mode 100644
index 0000000..f8590a0
--- /dev/null
+++ b/Swift/resources/.gitignore
@@ -0,0 +1 @@
+translations