1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Merge branch 'master' into profiles... yikes

Conflicts:
	core.cpp
	core.h
	misc/settings.cpp
	misc/settings.h
	widget/form/settings/generalform.h
	widget/form/settingsform.cpp
	widget/widget.cpp
	widget/widget.h
This commit is contained in:
dubslow 2014-10-08 20:25:26 -05:00
commit 1bacd2da7a
157 changed files with 7652 additions and 3769 deletions

View File

@ -1,3 +1,10 @@
#Install Instructions
- [Dependencies](#dependencies)
- [Windows](#windows)
- [Linux](#linux)
- [OS X](#osx)
<a name="dependencies" />
##Dependencies
| Name | Version | Modules |
@ -8,6 +15,7 @@
| OpenCV | >= 2.4.9 | core, highgui |
| OpenAL Soft | >= 1.16.0 | |
<a name="windows" />
##Windows
###Qt
@ -68,8 +76,9 @@ make install
```
Copy the dll "OpenAL32.dll" located at "C:\qTox\libs\openal-build\install\bin" to "C:\qTox\libs\lib". Finally, copy the directory "AL" located at "C:\qTox\libs\openal-build\install\include" to "C:\qTox\libs\include". Unlike OpenCV you don't need to patch any files. Feel free to delete the directories "openal-soft-x.y.z" and "openal-build", but you don't need to.
<a name="linux" />
##Linux
Most of the dependencies should be available through your package manger.
Most of the dependencies should be available through your package manger. You may either follow the directions below, or simply run `./simple_make.sh` after cloning, which will attempt to automatically download dependencies followed by compilation.
###Cloning the Repository
In order to clone the qTox repository you need Git.
@ -156,11 +165,77 @@ cd /home/user/qTox
./bootstrap.sh # use -h or --help for more information
```
##Building packages
After all the dependencies are thus reeady to go, compiling should be as simple as
```bash
qmake
make
```
qTox now has the experimental and probably-dodgy ability to package itself (in .deb
###Building packages
Alternately, qTox now has the experimental and probably-dodgy ability to package itself (in .deb
form natively, and .rpm form with <a href="http://joeyh.name/code/alien/">alien</a>).
After installing the required dependencies, run `bootstrap.sh` and then run the
`buildPackages.sh` script, found in the tools folder. It will automatically get the
packages necessary for building .debs, so be prepared to type your password for sudo.
<a name="osx" />
##OS X
###OSX Easy Install
Since https://github.com/ReDetection/homebrew-qtox you can easily install qtox with homebrew
```bash
brew install --HEAD ReDetection/qtox/qtox
```
###OSX Full Install Guide
This guide is intended for people who wish to use an existing or new ProjectTox-Core installation separate to the bundled installation with qTox, if you do not wish to use a separate installation you can skip to the section titled 'Final Steps'.
Installation on OSX, isn't quite straight forward, here is a quick guide on how to install;
Note that qTox now requires OpenCV and OpenAL for video and audio.
The first thing you need to do is install ProjectTox-Core with a/v support. Refer to the INSTALL guide in the PrjectTox-Core github repo.
Next you need to download QtTools (http://qt-project.org/downloads), at the time of writing this is at version .3.0.
Make sure you deselect all the unnecessary components from the 5.3 checkbox (iOS/Android libs) otherwise you will end up with a very large download.
Once that is installed you will most likely need to set the path for qmake. To do this, open up terminal and paste in the following;
```bash
export PATH=/location/to/qmake/binary:$PATH
```
For myself, the qmake binary was located in /Users/mouseym/Qt/5.3/clang_64/bin/.
This is not a permanent change, it will revert when you close the terminal window, to add it permanently you will need to add echo the above line to your .profile/.bash_profile.
Once this is installed, do the following;
```bash
git clone https://github.com/tux3/qTox
cd toxgui
qmake
```
Now, we need to create a symlink to /usr/local/lib/ and /usr/local/include/
```
mkdir -p $HOME/qTox/libs
sudo ln -s /usr/local/lib $HOME/qTox/libs/lib
sudo ln -s /usr/local/include $HOME/qTox/libs/include
```
####Final Steps
The final step is to run
```bash
make
```
in the qTox directory, or if you are using the bundled tox core installation, you can use
```bash
./bootstrap.sh
make
```
Assuming all went well you should now have a qTox.app file within the directory. Double click and it should open!

View File

@ -11,21 +11,24 @@ However, it is not a fork.
- Group chats
- File transfers, with previewing of images
- Audio calls
- Video calls (alpha)
- Video calls
- Tox DNS
- Translations in various languages
- Avatars
<h2>Downloads</h2>
This client runs on Windows, Linux and Mac natively.<br/>
You can find the latest versions of qTox <a href="https://github.com/tux3/qTox/releases">here</a>, or from the Tox Project's servers :
<a href="https://jenkins.libtoxcore.so/job/tux3-toxgui-win32/lastSuccessfulBuild/artifact/toxgui-win32.zip">Windows download</a><br/>
<a href="https://jenkins.libtoxcore.so/job/ToxGUI%20OS%20X/lastSuccessfulBuild/artifact/qtox.dmg">Mac download </a><br/>
<a href="https://jenkins.libtoxcore.so/job/qTox-linux-amd64/">Linux download</a> (click "Last successful artifacts")<br/>
<h3>Screenshots</h3>
<h5>Note: The screenshots may not always be up to date, but they should give a good idea of the general look and features</h5>
<img src="https://i.imgur.com/7Jg5tQa.png">/
<img src="https://wiki.tox.im/images/5/5d/ToxGUI_tux3.png">
##Documentation:

BIN
audio/ToxicIncomingCall.pcm Normal file

Binary file not shown.

View File

@ -103,7 +103,7 @@ rm -rf ${BASE_DIR}/${TOX_CORE_DIR}
# afterwards install libsodium to INSTALL_DIR
# skip the installation if TOX_ONLY is true
if [[ $TOX_ONLY = "false" ]]; then
git clone git://github.com/jedisct1/libsodium.git ${BASE_DIR}/${SODIUM_DIR}
git clone git://github.com/jedisct1/libsodium.git ${BASE_DIR}/${SODIUM_DIR} --depth 1
pushd ${BASE_DIR}/${SODIUM_DIR}
git checkout tags/$SODIUM_VER
./autogen.sh
@ -116,7 +116,7 @@ if [[ $TOX_ONLY = "false" ]]; then
make -j2 check
if [[ $GLOBAL = "false" ]]; then
if [[ $GLOBAL = "false" || $EUID -eq 0 ]]; then
make install
else
sudo make install
@ -128,7 +128,7 @@ fi
# clone current master of libtoxcore
# make sure to compile with libsodium we just installed to INSTALL_DIR
# afterwards install libtoxcore to INSTALL_DIR
git clone https://github.com/irungentoo/toxcore.git ${BASE_DIR}/${TOX_CORE_DIR}
git clone https://github.com/irungentoo/toxcore.git ${BASE_DIR}/${TOX_CORE_DIR} --depth 1
pushd ${BASE_DIR}/${TOX_CORE_DIR}
./autogen.sh
if [[ $GLOBAL = "false" ]]; then
@ -139,7 +139,7 @@ fi
make -j2
if [[ $GLOBAL = "false" ]]; then
if [[ $GLOBAL = "false" || $EUID -eq 0 ]]; then
make install
else
sudo make install

509
core.cpp
View File

@ -15,9 +15,9 @@
*/
#include "core.h"
#include "cdata.h"
#include "cstring.h"
#include "settings.h"
#include "misc/cdata.h"
#include "misc/cstring.h"
#include "misc/settings.h"
#include "widget/widget.h"
#include <tox/tox.h>
@ -34,6 +34,9 @@
#include <QTimer>
#include <QCoreApplication>
#include <QDateTime>
#include <QList>
#include <QBuffer>
#include <QMessageBox>
const QString Core::CONFIG_FILE_NAME = "data";
const QString Core::TOX_EXT = ".tox";
@ -48,15 +51,9 @@ Core::Core(Camera* cam, QThread *coreThread) :
toxTimer = new QTimer(this);
toxTimer->setSingleShot(true);
//saveTimer = new QTimer(this);
//saveTimer->start(TOX_SAVE_INTERVAL);
bootstrapTimer = new QTimer(this);
bootstrapTimer->start(TOX_BOOTSTRAP_INTERVAL);
connect(toxTimer, &QTimer::timeout, this, &Core::process);
//connect(saveTimer, &QTimer::timeout, this, &Core::saveConfiguration); //Disable save timer in favor of saving on events
//connect(fileTimer, &QTimer::timeout, this, &Core::fileHeartbeat);
connect(bootstrapTimer, &QTimer::timeout, this, &Core::onBootstrapTimer);
connect(&Settings::getInstance(), &Settings::dhtServerListChanged, this, &Core::bootstrapDht);
connect(&Settings::getInstance(), &Settings::dhtServerListChanged, this, &Core::process);
connect(this, SIGNAL(fileTransferFinished(ToxFile)), this, SLOT(onFileTransferFinished(ToxFile)));
for (int i=0; i<TOXAV_MAX_CALLS;i++)
@ -121,10 +118,13 @@ Core* Core::getInstance()
return Widget::getInstance()->getCore();
}
void Core::get_tox()
void Core::make_tox()
{
// IPv6 needed for LAN discovery, but can crash some weird routers. On by default, can be disabled in options.
bool enableIPv6 = Settings::getInstance().getEnableIPv6();
bool forceTCP = Settings::getInstance().getForceTCP();
bool useProxy = Settings::getInstance().getUseProxy();
if (enableIPv6)
qDebug() << "Core starting with IPv6 enabled";
else
@ -132,11 +132,32 @@ void Core::get_tox()
Tox_Options toxOptions;
toxOptions.ipv6enabled = enableIPv6;
toxOptions.udp_disabled = 0;
toxOptions.udp_disabled = forceTCP;
// No proxy by default
toxOptions.proxy_enabled = false;
toxOptions.proxy_address[0] = 0;
toxOptions.proxy_port = 0;
if (useProxy)
{
QString proxyAddr = Settings::getInstance().getProxyAddr();
int proxyPort = Settings::getInstance().getProxyPort();
if (proxyAddr.length() > 255)
{
qWarning() << "Core: proxy address" << proxyAddr << "is too long";
}
else if (proxyAddr != "" && proxyPort > 0)
{
qDebug() << "Core: using proxy" << proxyAddr << ":" << proxyPort;
toxOptions.proxy_enabled = true;
uint16_t sz = CString::fromString(proxyAddr, (unsigned char*)toxOptions.proxy_address);
toxOptions.proxy_address[sz] = 0;
toxOptions.proxy_port = proxyPort;
}
}
tox = tox_new(&toxOptions);
if (tox == nullptr)
{
@ -146,13 +167,29 @@ void Core::get_tox()
tox = tox_new(&toxOptions);
if (tox == nullptr)
{
qCritical() << "Tox core failed to start";
emit failedToStart();
if (toxOptions.proxy_enabled)
{
//QMessageBox::critical(Widget::getInstance(), tr("Proxy failure", "popup title"),
//tr("toxcore failed to start with your proxy settings. qTox cannot run; please modify your "
//"settings and restart.", "popup text"));
qCritical() << "Core: bad proxy! no toxcore!";
emit badProxy();
}
else
{
qCritical() << "Tox core failed to start";
emit failedToStart();
}
return;
}
else
qWarning() << "Core failed to start with IPv6, falling back to IPv4. LAN discovery may not work properly.";
}
else if (toxOptions.proxy_enabled)
{
emit badProxy();
return;
}
else
{
qCritical() << "Tox core failed to start";
@ -172,7 +209,7 @@ void Core::get_tox()
void Core::start()
{
get_tox();
make_tox();
qsrand(time(nullptr));
@ -191,7 +228,13 @@ void Core::start()
}
#endif
}
loadConfiguration(path);
if (!loadConfiguration(path))
{
emit failedToStart();
tox_kill(tox);
tox = nullptr;
return;
}
tox_callback_friend_request(tox, onFriendRequest, this);
tox_callback_friend_message(tox, onFriendMessage, this);
@ -207,6 +250,8 @@ void Core::start()
tox_callback_file_send_request(tox, onFileSendRequestCallback, this);
tox_callback_file_control(tox, onFileControlCallback, this);
tox_callback_file_data(tox, onFileDataCallback, this);
tox_callback_avatar_info(tox, onAvatarInfoCallback, this);
tox_callback_avatar_data(tox, onAvatarDataCallback, this);
toxav_register_callstate_callback(toxav, onAvInvite, av_OnInvite, this);
toxav_register_callstate_callback(toxav, onAvStart, av_OnStart, this);
@ -225,20 +270,101 @@ void Core::start()
uint8_t friendAddress[TOX_FRIEND_ADDRESS_SIZE];
tox_get_address(tox, friendAddress);
emit friendAddressGenerated(CFriendAddress::toString(friendAddress));
bootstrapDht();
QPixmap pic = Settings::getInstance().getSavedAvatar(getSelfId().toString());
if (!pic.isNull() && !pic.size().isEmpty())
{
QByteArray data;
QBuffer buffer(&data);
buffer.open(QIODevice::WriteOnly);
pic.save(&buffer, "PNG");
buffer.close();
setAvatar(TOX_AVATAR_FORMAT_PNG, data);
}
else
qDebug() << "Core: Error loading self avatar";
process(); // starts its own timer
}
/* Using the now commented out statements in checkConnection(), I watched how
* many ticks disconnects-after-initial-connect lasted. Out of roughly 15 trials,
* 5 disconnected; 4 were DCd for less than 20 ticks, while the 5th was ~50 ticks.
* So I set the tolerance here at 25, and initial DCs should be very rare now.
* This should be able to go to 50 or 100 without affecting legitimate disconnects'
* downtime, but lets be conservative for now. Edit: now 40.
*/
#define CORE_DISCONNECT_TOLERANCE 40
void Core::process()
{
if (!tox)
return;
static int tolerance = CORE_DISCONNECT_TOLERANCE;
tox_do(tox);
#ifdef DEBUG
//we want to see the debug messages immediately
fflush(stdout);
#endif
if (checkConnection())
tolerance = CORE_DISCONNECT_TOLERANCE;
else if (!(--tolerance))
{
bootstrapDht();
}
toxTimer->start(tox_do_interval(tox));
}
void Core::onBootstrapTimer()
bool Core::checkConnection()
{
if (!tox)
return;
if(!tox_isconnected(tox))
bootstrapDht();
static bool isConnected = false;
//static int count = 0;
bool toxConnected = tox_isconnected(tox);
if (toxConnected && !isConnected) {
qDebug() << "Core: Connected to DHT";
emit connected();
isConnected = true;
//if (count) qDebug() << "Core: disconnect count:" << count;
//count = 0;
} else if (!toxConnected && isConnected) {
qDebug() << "Core: Disconnected to DHT";
emit disconnected();
isConnected = false;
//count++;
} //else if (!toxConnected) count++;
return isConnected;
}
void Core::bootstrapDht()
{
const Settings& s = Settings::getInstance();
QList<Settings::DhtServer> dhtServerList = s.getDhtServerList();
int listSize = dhtServerList.size();
static int j = qrand() % listSize;
qDebug() << "Core: Bootstraping to the DHT ...";
int i=0;
while (i < 2) // i think the more we bootstrap, the more we jitter because the more we overwrite nodes
{
const Settings::DhtServer& dhtServer = dhtServerList[j % listSize];
if (tox_bootstrap_from_address(tox, dhtServer.address.toLatin1().data(),
dhtServer.port, CUserId(dhtServer.userId).data()) == 1)
qDebug() << QString("Core: Bootstraping from ")+dhtServer.name+QString(", addr ")+dhtServer.address.toLatin1().data()
+QString(", port ")+QString().setNum(dhtServer.port);
else
qDebug() << "Core: Error bootstraping from "+dhtServer.name;
j++;
i++;
}
}
void Core::onFriendRequest(Tox*/* tox*/, const uint8_t* cUserId, const uint8_t* cMessage, uint16_t cMessageSize, void* core)
@ -248,7 +374,7 @@ void Core::onFriendRequest(Tox*/* tox*/, const uint8_t* cUserId, const uint8_t*
void Core::onFriendMessage(Tox*/* tox*/, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core)
{
emit static_cast<Core*>(core)->friendMessageReceived(friendId, CString::toString(cMessage, cMessageSize));
emit static_cast<Core*>(core)->friendMessageReceived(friendId, CString::toString(cMessage, cMessageSize), false);
}
void Core::onFriendNameChange(Tox*/* tox*/, int friendId, const uint8_t* cName, uint16_t cNameSize, void* core)
@ -283,6 +409,10 @@ void Core::onUserStatusChanged(Tox*/* tox*/, int friendId, uint8_t userstatus, v
status = Status::Online;
break;
}
if (status == Status::Online || status == Status::Away)
tox_request_avatar_info(static_cast<Core*>(core)->tox, friendId);
emit static_cast<Core*>(core)->friendStatusChanged(friendId, status);
}
@ -292,23 +422,51 @@ void Core::onConnectionStatusChanged(Tox*/* tox*/, int friendId, uint8_t status,
emit static_cast<Core*>(core)->friendStatusChanged(friendId, friendStatus);
if (friendStatus == Status::Offline) {
static_cast<Core*>(core)->checkLastOnline(friendId);
for (ToxFile& f : fileSendQueue)
{
if (f.friendId == friendId && f.status == ToxFile::TRANSMITTING)
{
f.status = ToxFile::BROKEN;
emit static_cast<Core*>(core)->fileTransferBrokenUnbroken(f, true);
}
}
for (ToxFile& f : fileRecvQueue)
{
if (f.friendId == friendId && f.status == ToxFile::TRANSMITTING)
{
f.status = ToxFile::BROKEN;
emit static_cast<Core*>(core)->fileTransferBrokenUnbroken(f, true);
}
}
} else {
for (ToxFile& f : fileRecvQueue)
{
if (f.friendId == friendId && f.status == ToxFile::BROKEN)
{
qDebug() << QString("Core::onConnectionStatusChanged: %1: resuming broken filetransfer from position: %2").arg(f.file->fileName()).arg(f.bytesSent);
tox_file_send_control(static_cast<Core*>(core)->tox, friendId, 1, f.fileNum, TOX_FILECONTROL_RESUME_BROKEN, reinterpret_cast<const uint8_t*>(&f.bytesSent), sizeof(uint64_t));
emit static_cast<Core*>(core)->fileTransferBrokenUnbroken(f, false);
}
}
}
}
void Core::onAction(Tox*/* tox*/, int friendId, const uint8_t *cMessage, uint16_t cMessageSize, void *core)
{
emit static_cast<Core*>(core)->actionReceived(friendId, CString::toString(cMessage, cMessageSize));
emit static_cast<Core*>(core)->friendMessageReceived(friendId, CString::toString(cMessage, cMessageSize), true);
}
void Core::onGroupInvite(Tox*, int friendnumber, const uint8_t *group_public_key, void *core)
void Core::onGroupInvite(Tox*, int friendnumber, const uint8_t *group_public_key, uint16_t length,void *core)
{
qDebug() << QString("Core: Group invite by %1").arg(friendnumber);
emit static_cast<Core*>(core)->groupInviteReceived(friendnumber, group_public_key);
emit static_cast<Core*>(core)->groupInviteReceived(friendnumber, group_public_key,length);
}
void Core::onGroupMessage(Tox*, int groupnumber, int friendgroupnumber, const uint8_t * message, uint16_t length, void *core)
void Core::onGroupMessage(Tox*, int groupnumber, int peernumber, const uint8_t * message, uint16_t length, void *_core)
{
emit static_cast<Core*>(core)->groupMessageReceived(groupnumber, friendgroupnumber, CString::toString(message, length));
Core* core = static_cast<Core*>(_core);
emit core->groupMessageReceived(groupnumber, CString::toString(message, length), core->getGroupPeerName(groupnumber, peernumber));
}
void Core::onGroupNamelistChange(Tox*, int groupnumber, int peernumber, uint8_t change, void *core)
@ -329,7 +487,7 @@ void Core::onFileSendRequestCallback(Tox*, int32_t friendnumber, uint8_t filenum
emit static_cast<Core*>(core)->fileReceiveRequested(fileRecvQueue.last());
}
void Core::onFileControlCallback(Tox* tox, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber,
uint8_t control_type, const uint8_t*, uint16_t, void *core)
uint8_t control_type, const uint8_t* data, uint16_t length, void *core)
{
ToxFile* file{nullptr};
if (receive_send == 1)
@ -416,12 +574,39 @@ void Core::onFileControlCallback(Tox* tox, int32_t friendnumber, uint8_t receive
}
else if (receive_send == 0 && control_type == TOX_FILECONTROL_ACCEPT)
{
if (file->status == ToxFile::BROKEN)
{
emit static_cast<Core*>(core)->fileTransferBrokenUnbroken(*file, false);
file->status = ToxFile::TRANSMITTING;
}
emit static_cast<Core*>(core)->fileTransferRemotePausedUnpaused(*file, false);
}
else if ((receive_send == 0 || receive_send == 1) && control_type == TOX_FILECONTROL_PAUSE)
{
emit static_cast<Core*>(core)->fileTransferRemotePausedUnpaused(*file, true);
}
else if (receive_send == 1 && control_type == TOX_FILECONTROL_RESUME_BROKEN)
{
if (length != sizeof(uint64_t))
return;
qDebug() << "Core::onFileControlCallback: TOX_FILECONTROL_RESUME_BROKEN";
uint64_t resumePos = *reinterpret_cast<const uint64_t*>(data);
if (resumePos >= file->filesize)
{
qWarning() << "Core::onFileControlCallback: invalid resume position";
tox_file_send_control(tox, file->friendId, 0, file->fileNum, TOX_FILECONTROL_KILL, nullptr, 0); // don't sure about it
return;
}
file->status = ToxFile::TRANSMITTING;
emit static_cast<Core*>(core)->fileTransferBrokenUnbroken(*file, false);
file->bytesSent = resumePos;
tox_file_send_control(tox, file->friendId, 0, file->fileNum, TOX_FILECONTROL_ACCEPT, nullptr, 0);
}
else
{
qDebug() << QString("Core: File control callback, receive_send=%1, control_type=%2")
@ -453,6 +638,46 @@ void Core::onFileDataCallback(Tox*, int32_t friendnumber, uint8_t filenumber, co
file->filesize, file->bytesSent, ToxFile::RECEIVING);
}
void Core::onAvatarInfoCallback(Tox*, int32_t friendnumber, uint8_t format,
uint8_t* hash, void* _core)
{
Core* core = static_cast<Core*>(_core);
if (format == TOX_AVATAR_FORMAT_NONE)
{
qDebug() << "Core: Got null avatar info from" << core->getFriendUsername(friendnumber);
emit core->friendAvatarRemoved(friendnumber);
QFile::remove(QDir(Settings::getInstance().getSettingsDirPath()).filePath("avatars/"+core->getFriendAddress(friendnumber).left(64)+".png"));
QFile::remove(QDir(Settings::getInstance().getSettingsDirPath()).filePath("avatars/"+core->getFriendAddress(friendnumber).left(64)+".hash"));
}
else
{
QByteArray oldHash = Settings::getInstance().getAvatarHash(core->getFriendAddress(friendnumber));
if (QByteArray((char*)hash, TOX_HASH_LENGTH) != oldHash)
// comparison failed miserably if I didn't convert hash to QByteArray
{
qDebug() << "Core: Got new avatar info from" << core->getFriendUsername(friendnumber);
tox_request_avatar_data(core->tox, friendnumber);
}
else
qDebug() << "Core: Got same avatar info from" << core->getFriendUsername(friendnumber);
}
}
void Core::onAvatarDataCallback(Tox*, int32_t friendnumber, uint8_t,
uint8_t *hash, uint8_t *data, uint32_t datalen, void *core)
{
QPixmap pic;
pic.loadFromData((uchar*)data, datalen);
if (!pic.isNull())
{
qDebug() << "Core: Got avatar data from" << static_cast<Core*>(core)->getFriendUsername(friendnumber);
Settings::getInstance().saveAvatar(pic, static_cast<Core*>(core)->getFriendAddress(friendnumber));
Settings::getInstance().saveAvatarHash(QByteArray((char*)hash, TOX_HASH_LENGTH), static_cast<Core*>(core)->getFriendAddress(friendnumber));
emit static_cast<Core*>(core)->friendAvatarChanged(friendnumber, pic);
}
}
void Core::acceptFriendRequest(const QString& userId)
{
int friendId = tox_add_friend_norequest(tox, CUserId(userId).data());
@ -494,10 +719,14 @@ void Core::requestFriendship(const QString& friendAddress, const QString& messag
void Core::sendMessage(int friendId, const QString& message)
{
CString cMessage(message);
QList<CString> cMessages = splitMessage(message);
int messageId = tox_send_message(tox, friendId, cMessage.data(), cMessage.size());
emit messageSentResult(friendId, message, messageId);
for (auto &cMsg :cMessages)
{
int messageId = tox_send_message(tox, friendId, cMsg.data(), cMsg.size());
if (messageId == 0)
emit messageSentResult(friendId, message, messageId);
}
}
void Core::sendAction(int friendId, const QString &action)
@ -516,9 +745,14 @@ void Core::sendTyping(int friendId, bool typing)
void Core::sendGroupMessage(int groupId, const QString& message)
{
CString cMessage(message);
QList<CString> cMessages = splitMessage(message);
tox_group_message_send(tox, groupId, cMessage.data(), cMessage.size());
for (auto &cMsg :cMessages)
{
int ret = tox_group_message_send(tox, groupId, cMsg.data(), cMsg.size());
if (ret == -1)
emit groupSentResult(groupId, message, ret);
}
}
void Core::sendFile(int32_t friendId, QString Filename, QString FilePath, long long filesize)
@ -528,6 +762,7 @@ void Core::sendFile(int32_t friendId, QString Filename, QString FilePath, long l
if (fileNum == -1)
{
qWarning() << "Core::sendFile: Can't create the Tox file sender";
emit fileSendFailed(friendId, Filename);
return;
}
qDebug() << QString("Core::sendFile: Created file sender %1 with friend %2").arg(fileNum).arg(friendId);
@ -604,7 +839,7 @@ void Core::pauseResumeFileRecv(int friendId, int fileNum)
tox_file_send_control(tox, file->friendId, 1, file->fileNum, TOX_FILECONTROL_ACCEPT, nullptr, 0);
}
else
qWarning() << "Core::pauseResumeFileRecv: File is stopped";
qWarning() << "Core::pauseResumeFileRecv: File is stopped or broken";
}
void Core::cancelFileSend(int friendId, int fileNum)
@ -741,17 +976,36 @@ void Core::setUsername(const QString& username)
}
}
QString Core::getSelfId()
void Core::setAvatar(uint8_t format, const QByteArray& data)
{
if (tox_set_avatar(tox, format, (uint8_t*)data.constData(), data.size()) != 0)
{
qWarning() << "Core: Failed to set self avatar";
return;
}
QPixmap pic;
pic.loadFromData(data);
Settings::getInstance().saveAvatar(pic, getSelfId().toString());
emit selfAvatarChanged(pic);
// Broadcast our new avatar!
// according to tox.h, we need not broadcast this ourselves, but initial testing indicated elsewise
const uint32_t friendCount = tox_count_friendlist(tox);;
for (unsigned i=0; i<friendCount; i++)
tox_send_avatar_info(tox, i);
}
ToxID Core::getSelfId()
{
uint8_t friendAddress[TOX_FRIEND_ADDRESS_SIZE];
tox_get_address(tox, friendAddress);
return CFriendAddress::toString(friendAddress);
return ToxID::fromString(CFriendAddress::toString(friendAddress));
}
QString Core::getIDString()
{
return getSelfId().left(12);
return getSelfId().toString().left(12);
// 12 is the smallest multiple of four such that
// 16^n > 10^10 (which is roughly the planet's population)
}
@ -813,79 +1067,6 @@ void Core::onFileTransferFinished(ToxFile file)
emit fileDownloadFinished(file.filePath);
}
void Core::bootstrapDht(bool reset)
{
const Settings& s = Settings::getInstance();
QList<Settings::DhtServer> dhtServerList = s.getDhtServerList();
int listSize = dhtServerList.size();
static int j = qrand() % listSize, n=0;
if (reset)
{
n = 0;
bootstrapTimer->setInterval(TOX_BOOTSTRAP_INTERVAL);
return;
}
// We couldn't connect after trying 6 different nodes, let's try something else
if (n>3)
{
qDebug() << "Core: We're having trouble connecting to the DHT, slowing down";
bootstrapTimer->setInterval(TOX_BOOTSTRAP_INTERVAL*(n-1));
}
else
qDebug() << "Core: Connecting to the DHT ...";
int i=0;
while (i < (2 - (n>3)))
{
const Settings::DhtServer& dhtServer = dhtServerList[j % listSize];
if (tox_bootstrap_from_address(tox, dhtServer.address.toLatin1().data(),
dhtServer.port, CUserId(dhtServer.userId).data()) == 1)
qDebug() << QString("Core: Bootstraping from ")+dhtServer.name+QString(", addr ")+dhtServer.address.toLatin1().data()
+QString(", port ")+QString().setNum(dhtServer.port);
else
qDebug() << "Core: Error bootstraping from "+dhtServer.name;
tox_do(tox);
j++;
i++;
n++;
}
}
void Core::process()
{
if (tox)
{
tox_do(tox);
#ifdef DEBUG
//we want to see the debug messages immediately
fflush(stdout);
#endif
checkConnection();
//int toxInterval = tox_do_interval(tox);
//qDebug() << QString("Tox interval %1").arg(toxInterval);
}
toxTimer->start(50);
}
void Core::checkConnection()
{
static bool isConnected = false;
if (tox_isconnected(tox) && !isConnected) {
qDebug() << "Core: Connected to DHT";
emit connected();
isConnected = true;
} else if (!tox_isconnected(tox) && isConnected) {
qDebug() << "Core: Disconnected to DHT";
emit disconnected();
isConnected = false;
}
}
QString Core::sanitize(QString name)
{
// these are pretty much Windows banned filename characters
@ -900,29 +1081,45 @@ QString Core::sanitize(QString name)
return name;
}
void Core::loadConfiguration(QString path)
bool Core::loadConfiguration(QString path)
{
// setting the profile is now the responsibility of the caller
QFile conf(path);
QFile configurationFile(path);
qDebug() << "Core::loadConfiguration: reading from " << path;
if (!conf.exists()) {
if (!configurationFile.exists()) {
qWarning() << "The Tox configuration file was not found";
return;
return true;
}
if (!conf.open(QIODevice::ReadOnly)) {
if (!configurationFile.open(QIODevice::ReadOnly)) {
qCritical() << "File " << path << " cannot be opened";
return;
return true;
}
qint64 fileSize = conf.size();
qint64 fileSize = configurationFile.size();
if (fileSize > 0) {
QByteArray data = conf.readAll();
tox_load(tox, reinterpret_cast<uint8_t *>(data.data()), data.size());
QByteArray data = configurationFile.readAll();
int error = tox_load(tox, reinterpret_cast<uint8_t *>(data.data()), data.size());
if (error < 0)
{
qWarning() << "Core: tox_load failed with error "<<error;
}
else if (error == 1) // Encrypted data save
{
qWarning() << "Core: Can not open encrypted tox save";
if (QMessageBox::Ok != QMessageBox::warning(nullptr, tr("Encrypted profile"),
tr("Your tox profile seems to be encrypted, qTox can't open it\nDo you want to erase this profile ?"),
QMessageBox::Ok | QMessageBox::Cancel))
{
qWarning() << "Core: Couldn't open encrypted save, giving up";
configurationFile.close();
return false;
}
}
}
conf.close();
configurationFile.close();
// set GUI with user and statusmsg
QString name = getUsername();
@ -934,6 +1131,7 @@ void Core::loadConfiguration(QString path)
emit statusMessageSet(msg);
loadFriends();
return true;
}
void Core::saveConfiguration()
@ -974,6 +1172,8 @@ void Core::saveConfiguration(const QString& path)
return;
}
Settings::getInstance().save();
QSaveFile configurationFile(path);
if (!configurationFile.open(QIODevice::WriteOnly)) {
qCritical() << "File " << path << " cannot be opened";
@ -989,14 +1189,14 @@ void Core::saveConfiguration(const QString& path)
configurationFile.commit();
delete[] data;
}
Settings::getInstance().save();
}
void Core::switchConfiguration(QString profile)
{
saveConfiguration();
toxTimer->stop();
if (tox) {
toxav_kill(toxav);
toxav = nullptr;
@ -1005,11 +1205,20 @@ void Core::switchConfiguration(QString profile)
}
emit clearFriends();
get_tox();
bootstrapDht(true); // reset this func
make_tox();
Settings::getInstance().setCurrentProfile(profile);
loadConfiguration(Settings::getSettingsDirPath() + QDir::separator() + profile + TOX_EXT);
if (!loadConfiguration(Settings::getSettingsDirPath() + QDir::separator() + profile + TOX_EXT))
{
emit failedToStart();
toxav_kill(toxav);
toxav = nullptr;
tox_kill(tox);
tox = nullptr;
return;
}
process(); // restarts toxTimer
}
void Core::loadFriends()
@ -1028,7 +1237,7 @@ void Core::loadFriends()
if (nameSize > 0) {
uint8_t *name = new uint8_t[nameSize];
if (tox_get_name(tox, ids[i], name) == nameSize) {
emit friendUsernameLoaded(ids[i], CString::toString(name, nameSize));
emit friendUsernameChanged(ids[i], CString::toString(name, nameSize));
}
delete[] name;
}
@ -1037,7 +1246,7 @@ void Core::loadFriends()
if (statusMessageSize > 0) {
uint8_t *statusMessage = new uint8_t[statusMessageSize];
if (tox_get_status_message(tox, ids[i], statusMessage, statusMessageSize) == statusMessageSize) {
emit friendStatusMessageLoaded(ids[i], CString::toString(statusMessage, statusMessageSize));
emit friendStatusMessageChanged(ids[i], CString::toString(statusMessage, statusMessageSize));
}
delete[] statusMessage;
}
@ -1098,10 +1307,10 @@ QList<QString> Core::getGroupPeerNames(int groupId) const
return names;
}
int Core::joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key) const
int Core::joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key,uint16_t length) const
{
qDebug() << QString("Trying to join groupchat invite by friend %1").arg(friendnumber);
return tox_join_groupchat(tox, friendnumber, friend_group_public_key);
return tox_join_groupchat(tox, friendnumber, friend_group_public_key,length);
}
void Core::quitGroupChat(int groupId) const
@ -1252,3 +1461,39 @@ QString Core::getFriendAddress(int friendNumber) const
return id;
}
QString Core::getFriendUsername(int friendnumber) const
{
uint8_t name[TOX_MAX_NAME_LENGTH];
tox_get_name(tox, friendnumber, name);
return CString::toString(name, tox_get_name_size(tox, friendnumber));
}
QList<CString> Core::splitMessage(const QString &message)
{
QList<CString> splittedMsgs;
QByteArray ba_message(message.toUtf8());
while (ba_message.size() > TOX_MAX_MESSAGE_LENGTH)
{
int splitPos = ba_message.lastIndexOf(' ', TOX_MAX_MESSAGE_LENGTH - 1);
if (splitPos <= 0)
{
splitPos = TOX_MAX_MESSAGE_LENGTH;
if (ba_message[splitPos] & 0x80)
{
do {
splitPos--;
} while (!(ba_message[splitPos] & 0x40));
}
splitPos--;
}
splittedMsgs.push_back(CString(ba_message.left(splitPos + 1)));
ba_message = ba_message.mid(splitPos + 1);
}
splittedMsgs.push_back(CString(ba_message));
return splittedMsgs;
}

45
core.h
View File

@ -28,6 +28,7 @@ template <typename T> class QList;
class Camera;
class QTimer;
class QString;
class CString;
class Core : public QObject
{
@ -43,7 +44,8 @@ public:
QString getGroupPeerName(int groupId, int peerId) const;
QList<QString> getGroupPeerNames(int groupId) const;
QString getFriendAddress(int friendNumber) const;
int joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key) const;
QString getFriendUsername(int friendNumber) const;
int joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key,uint16_t length) const;
void quitGroupChat(int groupId) const;
void dispatchVideoFrame(vpx_image img) const;
@ -55,7 +57,7 @@ public:
QString getUsername();
QString getStatusMessage();
QString getSelfId();
ToxID getSelfId();
void increaseVideoBusyness();
void decreaseVideoBusyness();
@ -63,7 +65,7 @@ public:
public slots:
void start();
void process();
void bootstrapDht(bool reset = false);
void bootstrapDht();
void acceptFriendRequest(const QString& userId);
void requestFriendship(const QString& friendAddress, const QString& message);
@ -76,6 +78,7 @@ public slots:
void setStatus(Status status);
void setUsername(const QString& username);
void setStatusMessage(const QString& message);
void setAvatar(uint8_t format, const QByteArray& data);
void sendMessage(int friendId, const QString& message);
void sendGroupMessage(int groupId, const QString& message);
@ -102,7 +105,7 @@ signals:
void disconnected();
void friendRequestReceived(const QString& userId, const QString& message);
void friendMessageReceived(int friendId, const QString& message);
void friendMessageReceived(int friendId, const QString& message, bool isAction);
void friendAdded(int friendId, const QString& userId);
void clearFriends();
@ -111,9 +114,8 @@ signals:
void friendStatusMessageChanged(int friendId, const QString& message);
void friendUsernameChanged(int friendId, const QString& username);
void friendTypingChanged(int friendId, bool isTyping);
void friendStatusMessageLoaded(int friendId, const QString& message);
void friendUsernameLoaded(int friendId, const QString& username);
void friendAvatarChanged(int friendId, const QPixmap& pic);
void friendAvatarRemoved(int friendId);
void friendAddressGenerated(const QString& friendAddress);
@ -122,15 +124,17 @@ signals:
void friendLastSeenChanged(int friendId, const QDateTime& dateTime);
void emptyGroupCreated(int groupnumber);
void groupInviteReceived(int friendnumber, const uint8_t *group_public_key);
void groupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message);
void groupInviteReceived(int friendnumber, const uint8_t *group_public_key,uint16_t length);
void groupMessageReceived(int groupnumber, const QString& message, const QString& author);
void groupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void usernameSet(const QString& username);
void statusMessageSet(const QString& message);
void statusSet(Status status);
void selfAvatarChanged(const QPixmap& pic);
void messageSentResult(int friendId, const QString& message, int messageId);
void groupSentResult(int groupId, const QString& message, int result);
void actionSentResult(int friendId, const QString& action, int success);
void failedToAddFriend(const QString& userId);
@ -140,9 +144,8 @@ signals:
void failedToSetStatus(Status status);
void failedToSetTyping(bool typing);
void actionReceived(int friendId, const QString& acionMessage);
void failedToStart();
void badProxy();
void fileSendStarted(ToxFile file);
void fileReceiveRequested(ToxFile file);
@ -154,6 +157,9 @@ signals:
void fileTransferPaused(int FriendId, int FileNum, ToxFile::FileDirection direction);
void fileTransferInfo(int FriendId, int FileNum, int64_t Filesize, int64_t BytesSent, ToxFile::FileDirection direction);
void fileTransferRemotePausedUnpaused(ToxFile file, bool paused);
void fileTransferBrokenUnbroken(ToxFile file, bool broken);
void fileSendFailed(int FriendId, const QString& fname);
void avInvite(int friendId, int callIndex, bool video);
void avStart(int friendId, int callIndex, bool video);
@ -177,7 +183,7 @@ private:
static void onUserStatusChanged(Tox* tox, int friendId, uint8_t userstatus, void* core);
static void onConnectionStatusChanged(Tox* tox, int friendId, uint8_t status, void* core);
static void onAction(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onGroupInvite(Tox *tox, int friendnumber, const uint8_t *group_public_key, void *userdata);
static void onGroupInvite(Tox *tox, int friendnumber, const uint8_t *group_public_key, uint16_t length,void *userdata);
static void onGroupMessage(Tox *tox, int groupnumber, int friendgroupnumber, const uint8_t * message, uint16_t length, void *userdata);
static void onGroupNamelistChange(Tox *tox, int groupnumber, int peernumber, uint8_t change, void *userdata);
static void onFileSendRequestCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, uint64_t filesize,
@ -185,6 +191,8 @@ private:
static void onFileControlCallback(Tox *tox, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber,
uint8_t control_type, const uint8_t *data, uint16_t length, void *core);
static void onFileDataCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, const uint8_t *data, uint16_t length, void *userdata);
static void onAvatarInfoCallback(Tox* tox, int32_t friendnumber, uint8_t format, uint8_t *hash, void *userdata);
static void onAvatarDataCallback(Tox* tox, int32_t friendnumber, uint8_t format, uint8_t *hash, uint8_t *data, uint32_t datalen, void *userdata);
static void onAvInvite(void* toxav, int32_t call_index, void* core);
static void onAvStart(void* toxav, int32_t call_index, void* core);
@ -206,14 +214,11 @@ private:
static void playCallVideo(ToxAv* toxav, int32_t callId, vpx_image_t* img, void *user_data);
void sendCallVideo(int callId);
void checkConnection();
void onBootstrapTimer();
void loadConfiguration(QString path);
static QString sanitize(QString name);
void get_tox();
bool checkConnection();
bool loadConfiguration(QString path); // Returns false for a critical error, true otherwise
static QString sanitize(QString name);
void make_tox();
void loadFriends();
static void sendAllFileData(Core* core, ToxFile* file);
@ -221,6 +226,8 @@ private:
void checkLastOnline(int friendId);
QList<CString> splitMessage(const QString &message);
private slots:
void onFileTransferFinished(ToxFile file);

View File

@ -273,7 +273,9 @@ void Core::decreaseVideoBusyness()
void Core::micMuteToggle(int callId)
{
calls[callId].muteMic = !calls[callId].muteMic;
if (calls[callId].active) {
calls[callId].muteMic = !calls[callId].muteMic;
}
}
void Core::onAvCancel(void* _toxav, int32_t callId, void* core)

View File

@ -3,9 +3,7 @@
#define TOXAV_MAX_CALLS 16
#define GROUPCHAT_MAX_SIZE 32
#define TOX_SAVE_INTERVAL 30*1000
#define TOX_FILE_INTERVAL 0
#define TOX_BOOTSTRAP_INTERVAL 5*1000
#define TOXAV_RINGING_TIME 15
// TODO: Put that in the settings

View File

@ -10,6 +10,32 @@ class QTimer;
enum class Status : int {Online = 0, Away, Busy, Offline};
#define TOX_ID_PUBLIC_KEY_LENGTH 64
#define TOX_ID_NO_SPAM_LENGTH 8
#define TOX_ID_CHECKSUM_LENGTH 4
struct ToxID
{
QString publicKey;
QString noSpam;
QString checkSum;
QString toString() const
{
return publicKey + noSpam + checkSum;
}
ToxID static fromString(QString id)
{
ToxID toxID;
toxID.publicKey = id.left(TOX_ID_PUBLIC_KEY_LENGTH);
toxID.noSpam = id.mid(TOX_ID_PUBLIC_KEY_LENGTH, TOX_ID_NO_SPAM_LENGTH);
toxID.checkSum = id.right(TOX_ID_CHECKSUM_LENGTH);
return toxID;
}
};
struct DhtServer
{
QString name;
@ -24,7 +50,8 @@ struct ToxFile
{
STOPPED,
PAUSED,
TRANSMITTING
TRANSMITTING,
BROKEN
};
enum FileDirection : bool

4
debian/control vendored
View File

@ -3,11 +3,11 @@ Maintainer: John Smith <barrdetwix@gmail.com>
Section: misc
Priority: optional
Standards-Version: 3.9.5
Build-Depends: debhelper (>= 9), cdbs, qt5-qmake, qt5-default, libopenal-dev, libopencv-dev, libopus-dev
Build-Depends: debhelper (>= 9), cdbs, qt5-qmake, libopenal-dev (>= 1:1.15.1), libopencv-dev (>= 2.4.8), libopus-dev (>= 1.0), qtbase5-dev (>= 5.2), sudo, autoconf, libtool, pkg-config, libvpx-dev
Package: qtox
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Depends: libc6 (>= 2.17), libgcc1 (>= 1:4.1.1), libgl1-mesa-glx | libgl1, libopenal1 (>= 1.14), libopencv-core2.4, libopencv-highgui2.4, libopus0 (>= 1.0), libqt5core5a (>= 5.2), libqt5gui5 (>= 5.2), libqt5network5 (>= 5.0), libqt5widgets5 (>= 5.2), libqt5xml5 (>= 5.0), libstdc++6 (>= 4.9), libvpx1 (>= 1.0.0)
Description: Tox client
qTox is a powerful Tox client that follows the Tox design guidelines.
Tox is a decentralized and encrypted replacement for Skype, supporting

2
debian/rules vendored
View File

@ -3,4 +3,4 @@
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/qmake.mk
QMAKE=qmake STATICPKG=YES
QMAKE=qmake -qt=5 STATICPKG=YES

1
debian/source/options vendored Normal file
View File

@ -0,0 +1 @@
--diff-ignore=libs

View File

@ -16,33 +16,49 @@
#include "filetransferinstance.h"
#include "core.h"
#include "misc/style.h"
#include <math.h>
#include <QFileDialog>
#include <QMessageBox>
#include <QBuffer>
#include <QDebug>
#include <QPainter>
#define CONTENT_WIDTH 250
#define MAX_PREVIEW_SIZE 25*1024*1024
uint FileTransferInstance::Idconter = 0;
FileTransferInstance::FileTransferInstance(ToxFile File)
: lastUpdate{QDateTime::currentDateTime()}, lastBytesSent{0},
: lastBytesSent{0},
fileNum{File.fileNum}, friendId{File.friendId}, direction{File.direction}
{
id = Idconter++;
state = tsPending;
remotePaused = false;
lastUpdateTime = QDateTime::currentDateTime();
filename = File.fileName;
// update this whenever you change the font in innerStyle.css
QFontMetrics fm(Style::getFont(Style::Small));
filenameElided = fm.elidedText(filename, Qt::ElideRight, CONTENT_WIDTH);
size = getHumanReadableSize(File.filesize);
speed = "0B/s";
eta = "00:00";
if (File.direction == ToxFile::SENDING)
{
QImage preview;
File.file->seek(0);
if (preview.loadFromData(File.file->readAll()))
if (File.file->size() <= MAX_PREVIEW_SIZE)
{
pic = preview.scaledToHeight(50);
QImage preview;
File.file->seek(0);
if (preview.loadFromData(File.file->readAll()))
{
pic = preview.scaledToHeight(50);
}
}
File.file->seek(0);
}
@ -63,27 +79,27 @@ void FileTransferInstance::onFileTransferInfo(int FriendId, int FileNum, int64_t
return;
// state = tsProcessing;
QDateTime newtime = QDateTime::currentDateTime();
int timediff = lastUpdate.secsTo(newtime);
QDateTime now = QDateTime::currentDateTime();
if (lastUpdateTime.secsTo(now) < 1) //update every 1s
return;
int timediff = startTime.secsTo(now);
if (timediff <= 0)
return;
qint64 diff = BytesSent - lastBytesSent;
if (diff < 0)
{
qWarning() << "FileTransferInstance::onFileTransferInfo: Negative transfer speed !";
diff = 0;
}
long rawspeed = diff / timediff;
long rawspeed = BytesSent / timediff;
speed = getHumanReadableSize(rawspeed)+"/s";
size = getHumanReadableSize(Filesize);
totalBytes = Filesize;
if (!rawspeed)
return;
int etaSecs = (Filesize - BytesSent) / rawspeed;
QTime etaTime(0,0);
etaTime = etaTime.addSecs(etaSecs);
eta = etaTime.toString("mm:ss");
lastUpdate = newtime;
lastBytesSent = BytesSent;
lastUpdateTime = now;
emit stateUpdated();
}
@ -107,7 +123,7 @@ void FileTransferInstance::onFileTransferFinished(ToxFile File)
{
QImage preview;
QFile previewFile(File.filePath);
if (previewFile.open(QIODevice::ReadOnly) && previewFile.size() <= 1024*1024*25) // Don't preview big (>25MiB) images
if (previewFile.open(QIODevice::ReadOnly) && previewFile.size() <= MAX_PREVIEW_SIZE) // Don't preview big (>25MiB) images
{
if (preview.loadFromData(previewFile.readAll()))
{
@ -129,6 +145,7 @@ void FileTransferInstance::onFileTransferAccepted(ToxFile File)
remotePaused = false;
state = tsProcessing;
startTime = QDateTime::currentDateTime();
emit stateUpdated();
}
@ -188,7 +205,7 @@ void FileTransferInstance::acceptRecvRequest()
QString path;
while (true)
{
path = QFileDialog::getSaveFileName(0, tr("Save a file","Title of the file saving dialog"), QDir::current().filePath(filename));
path = QFileDialog::getSaveFileName(0, tr("Save a file","Title of the file saving dialog"), QDir::home().filePath(filename));
if (path.isEmpty())
return;
else
@ -208,6 +225,8 @@ void FileTransferInstance::acceptRecvRequest()
Core::getInstance()->acceptFileRecvRequest(friendId, fileNum, path);
state = tsProcessing;
startTime = QDateTime::currentDateTime();
emit stateUpdated();
}
@ -277,6 +296,12 @@ QString FileTransferInstance::getHtmlImage()
rightBtnImg = QImage(":/ui/fileTransferInstance/pauseGreyFileButton.png");
res = draw2ButtonsForm("silver", leftBtnImg, rightBtnImg);
} else if (state == tsBroken)
{
QImage leftBtnImg(":/ui/fileTransferInstance/stopFileButton.png");
QImage rightBtnImg(":/ui/fileTransferInstance/pauseGreyFileButton.png");
res = draw2ButtonsForm("red", leftBtnImg, rightBtnImg);
} else if (state == tsCanceled)
{
res = drawButtonlessForm("red");
@ -326,7 +351,7 @@ QString FileTransferInstance::drawButtonlessForm(const QString &type)
imgBStr = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/emptyRGreenFileButton.png")) + "\">";
}
QString content = "<p>" + filename + "</p><p>" + size + "</p>";
QString content = "<p>" + filenameElided + "</p><p>" + size + "</p>";
return wrapIntoForm(content, type, imgAStr, imgBStr);
}
@ -352,29 +377,89 @@ QString FileTransferInstance::draw2ButtonsForm(const QString &type, const QImage
QString imgBstr = "<img src=\"data:ftrans." + widgetId + ".btnB/png;base64," + QImage2base64(imgB) + "\">";
QString content;
content += "<p>" + filename + "</p>";
content += "<p>" + getHumanReadableSize(lastBytesSent) + " / " + size + "&nbsp;(" + speed + " ETA: " + eta + ")</p>\n";
QString progrBar = "<img src=\"data:progressbar." + widgetId + "/png;base64," + QImage2base64(drawProgressBarImg(double(lastBytesSent)/totalBytes, CONTENT_WIDTH, 9)) + "\">";
content = "<p>" + filenameElided + "</p>";
content += "<table cellspacing=\"0\"><tr>";
content += "<td>" + size + "</td>";
content += "<td align=center>" + speed + "</td>";
content += "<td align=right>ETA: " + eta + "</td>";
content += "</tr><tr><td colspan=3>";
content += progrBar;
content += "</td></tr></table>";
return wrapIntoForm(content, type, imgAstr, imgBstr);
}
QString FileTransferInstance::wrapIntoForm(const QString& content, const QString &type, const QString &imgAstr, const QString &imgBstr)
{
QString res;
QString w = QString::number(QImage(":/ui/fileTransferInstance/emptyLRedFileButton.png").size().width());
QString imgLeftA, imgLeftB;
res = "<table widht=100% cellspacing=\"0\">\n";
if (type == "green")
{
imgLeftA = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/emptyLGreenFileButton.png").mirrored(true,false)) + "\">";
imgLeftB = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/emptyLGreenFileButton.png").mirrored(true,true)) + "\">";
}
if (type == "silver")
{
imgLeftA = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/sliverRTEdge.png").mirrored(true,false)) + "\">";
imgLeftB = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/sliverRTEdge.png").mirrored(true,true)) + "\">";
}
if (type == "red")
{
imgLeftA = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/emptyLRedFileButton.png").mirrored(true,false)) + "\">";
imgLeftB = "<img src=\"data:placeholder/png;base64," + QImage2base64(QImage(":/ui/fileTransferInstance/emptyLRedFileButton.png").mirrored(true,true)) + "\">";
}
QString res;
res = "<table cellspacing=\"0\">\n";
res += "<tr valign=middle>\n";
res += "<td width=" + w + ">\n";
res += "<div class=button>" + imgLeftA + "<br>" + imgLeftB + "</div>\n";
res += "</td>\n";
res += insertMiniature(type);
res += "<td width=100%>\n";
res += "<td width=" + QString::number(CONTENT_WIDTH + 30) + ">\n";
res += "<div class=" + type + ">";
res += content;
res += "</div>\n";
res += "</td>\n";
res += "<td>\n";
res += "<div class=button>" + imgAstr + "<br>" + imgBstr+ "</div>\n";
res += "<div class=button>" + imgAstr + "<br>" + imgBstr + "</div>\n";
res += "</td>\n";
res += "</tr>\n";
res += "</table>\n";
return res;
}
QImage FileTransferInstance::drawProgressBarImg(const double &part, int w, int h)
{
QImage progressBar(w, h, QImage::Format_Mono);
QPainter qPainter(&progressBar);
qPainter.setBrush(Qt::NoBrush);
qPainter.setPen(Qt::black);
qPainter.drawRect(0, 0, w - 1, h - 1);
qPainter.setBrush(Qt::SolidPattern);
qPainter.setPen(Qt::black);
qPainter.drawRect(1, 0, (w - 2) * (part), h - 1);
return progressBar;
}
void FileTransferInstance::onFileTransferBrokenUnbroken(ToxFile File, bool broken)
{
if (File.fileNum != fileNum || File.friendId != friendId || File.direction != direction)
return;
if (broken)
state = tsBroken;
else
state = tsProcessing;
emit stateUpdated();
}

View File

@ -28,7 +28,7 @@ class FileTransferInstance : public QObject
{
Q_OBJECT
public:
enum TransfState {tsPending, tsProcessing, tsPaused, tsFinished, tsCanceled};
enum TransfState {tsPending, tsProcessing, tsPaused, tsFinished, tsCanceled, tsBroken};
public:
explicit FileTransferInstance(ToxFile File);
@ -43,6 +43,7 @@ public slots:
void onFileTransferAccepted(ToxFile File);
void onFileTransferPaused(int FriendId, int FileNum, ToxFile::FileDirection Direction);
void onFileTransferRemotePausedUnpaused(ToxFile File, bool paused);
void onFileTransferBrokenUnbroken(ToxFile File, bool broken);
void pressFromHtml(QString);
signals:
@ -62,6 +63,7 @@ private:
QString draw2ButtonsForm(const QString &type, const QImage &imgA, const QImage &imgB);
QString insertMiniature(const QString &type);
QString wrapIntoForm(const QString &content, const QString &type, const QString &imgAstr, const QString &imgBstr);
QImage drawProgressBarImg(const double &part, int w, int h);
private:
static uint Idconter;
@ -71,8 +73,9 @@ private:
bool remotePaused;
QImage pic;
QString filename, size, speed, eta;
QDateTime lastUpdate;
long long lastBytesSent;
QString filenameElided;
QDateTime startTime, lastUpdateTime;
long long lastBytesSent, totalBytes;
int fileNum;
int friendId;
QString savePath;

View File

@ -36,19 +36,17 @@ Friend::~Friend()
void Friend::setName(QString name)
{
widget->name.setText(name);
widget->name.setToolTip(name); // for overlength names
widget->setName(name);
chatForm->setName(name);
}
void Friend::setStatusMessage(QString message)
{
widget->statusMessage.setText(message);
widget->statusMessage.setToolTip(message); // for overlength messsages
widget->setStatusMsg(message);
chatForm->setStatusMessage(message);
}
QString Friend::getName()
{
return widget->name.text();
return widget->getName();
}

View File

@ -24,16 +24,14 @@
#include <QTimer>
Group::Group(int GroupId, QString Name)
: groupId(GroupId), nPeers{0}, hasPeerInfo{false}, peerInfoTimer{new QTimer}
: groupId(GroupId), nPeers{0}
{
widget = new GroupWidget(groupId, Name);
chatForm = new GroupChatForm(this);
connect(peerInfoTimer, SIGNAL(timeout()), this, SLOT(queryPeerInfo()));
peerInfoTimer->setInterval(500);
peerInfoTimer->setSingleShot(false);
//peerInfoTimer.start();
//in groupchats, we only notify on messages containing your name
//in groupchats, we only notify on messages containing your name <-- dumb
// sound notifications should be on all messages, but system popup notification
// on naming is appropriate
hasNewMessages = 0;
userWasMentioned = 0;
}
@ -42,53 +40,6 @@ Group::~Group()
{
delete chatForm;
delete widget;
delete peerInfoTimer;
}
void Group::queryPeerInfo()
{
const Core* core = Core::getInstance();
int nPeersResult = core->getGroupNumberPeers(groupId);
if (nPeersResult == -1)
{
qDebug() << "Group::queryPeerInfo: Can't get number of peers";
return;
}
nPeers = nPeersResult;
widget->onUserListChanged();
chatForm->onUserListChanged();
if (nPeersResult == 0)
return;
bool namesOk = true;
QList<QString> names = core->getGroupPeerNames(groupId);
if (names.isEmpty())
{
qDebug() << "Group::queryPeerInfo: Can't get names of peers";
return;
}
for (int i=0; i<names.size(); i++)
{
QString name = names[i];
if (name.isEmpty())
{
name = "<Unknown>";
namesOk = false;
}
peers[i] = name;
}
nPeers = names.size();
widget->onUserListChanged();
chatForm->onUserListChanged();
if (namesOk)
{
qDebug() << "Group::queryPeerInfo: Successfully loaded names";
hasPeerInfo = true;
peerInfoTimer->stop();
}
}
void Group::addPeer(int peerId, QString name)

View File

@ -25,7 +25,6 @@
struct Friend;
class GroupWidget;
class GroupChatForm;
class QTimer;
class Group : public QObject
{
@ -37,17 +36,12 @@ public:
void removePeer(int peerId);
void updatePeer(int peerId, QString newName);
private slots:
void queryPeerInfo();
public:
int groupId;
QMap<int,QString> peers;
int nPeers;
GroupWidget* widget;
GroupChatForm* chatForm;
bool hasPeerInfo;
QTimer* peerInfoTimer;
int hasNewMessages, userWasMentioned;
};

BIN
img/avatar_mask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 790 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 744 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
img/group_2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
img/icons/qtox-128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
img/icons/qtox-14x14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

BIN
img/icons/qtox-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

BIN
img/icons/qtox-192x192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
img/icons/qtox-22x22.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

BIN
img/icons/qtox-24x24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

BIN
img/icons/qtox-256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
img/icons/qtox-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

BIN
img/icons/qtox-36x36.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 B

BIN
img/icons/qtox-48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
img/icons/qtox-512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
img/icons/qtox-64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
img/icons/qtox-72x72.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
img/icons/qtox-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

4
img/icons/qtox.svg Normal file
View File

@ -0,0 +1,4 @@
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 256 256" xmlns:dc="http://purl.org/dc/elements/1.1/">
<path d="m80 31 48-15 42 15v205h-90z" fill="#FFF" fill-opacity="0.33"/>
<path d="m128.06-0.25c-31.017-0.0007-62.06 20.75-62.06 62.25v30h-16c-17.944 0-29 12.35-29 30v104c0 18.08 11.941 29.94 30 30l154 0.5c17.98 0.06 30-12.48 30-30.5v-104c0-17.94-12.07-30.583-30-30h-15l0.03-30c0.05-41.497-30.95-62.249-61.97-62.25zm-0.06 25.25c21.06 0 36 15.484 36 35 0 20.467-8 40-36 50 5-8 7-11 8-19-29 3-44-12.2-44-31s14.94-35 36-35zm0 96c14.86 0 27 11.87 27 27s-11 22.98-17.44 25.25 25.44 7.75 25.44 34.75v11c0 6-4 10-10 10h-51c-6 0-10-4-10-10v-11c0-27 26.38-34.72 26.38-34.72-5.39-1.27-17.38-10.28-17.38-25.28s12.14-27 27-27z" fill="#252325"/>
</svg>

After

Width:  |  Height:  |  Size: 902 B

BIN
img/settings/av.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
img/settings/general.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
img/settings/identity.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
img/settings/privacy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -15,7 +15,7 @@
*/
#include "widget/widget.h"
#include "settings.h"
#include "misc/settings.h"
#include <QApplication>
#include <QFontDatabase>
#include <QTranslator>
@ -27,6 +27,10 @@ int main(int argc, char *argv[])
a.setApplicationName("qTox");
a.setOrganizationName("Tox");
// Windows platform plugins DLL hell fix
QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
a.addLibraryPath("platforms");
// Load translations
QTranslator translator;
if (Settings::getInstance().getUseTranslations())

File diff suppressed because it is too large Load Diff

View File

@ -17,10 +17,23 @@
#include "cstring.h"
#include <QString>
CString::CString(const QString& string)
CString::CString(const QString& string) :
CString(string.toUtf8())
{
cString = new uint8_t[string.length() * MAX_SIZE_OF_UTF8_ENCODED_CHARACTER]();
cStringSize = fromString(string, cString);
}
CString::CString(const QByteArray& ba_string)
{
cString = new uint8_t[ba_string.size()]();
cStringSize = ba_string.size();
memcpy(cString, reinterpret_cast<const uint8_t*>(ba_string.data()), cStringSize);
}
CString::CString(const CString &cstr)
{
cStringSize = cstr.cStringSize;
cString = new uint8_t[cStringSize]();
memcpy(cString, cstr.cString, cStringSize);
}
CString::~CString()

View File

@ -20,24 +20,26 @@
#include <cstdint>
class QString;
class QByteArray;
class CString
{
public:
explicit CString(const QString& string);
explicit CString(const QByteArray& ba_string);
explicit CString(const CString& cstr);
~CString();
uint8_t* data();
uint16_t size();
static QString toString(const uint8_t* cMessage, const uint16_t cMessageSize);
static uint16_t fromString(const QString& message, uint8_t* cMessage);
private:
const static int MAX_SIZE_OF_UTF8_ENCODED_CHARACTER = 4;
uint8_t* cString;
uint16_t cStringSize;
static uint16_t fromString(const QString& message, uint8_t* cMessage);
};
#endif // CSTRING_H

View File

@ -110,7 +110,11 @@ void Settings::load()
enableIPv6 = s.value("enableIPv6", true).toBool();
useTranslations = s.value("useTranslations", true).toBool();
makeToxPortable = s.value("makeToxPortable", false).toBool();
currentProfile = s.value("currentProfile", "").toString();
forceTCP = s.value("forceTCP", false).toBool();
useProxy = s.value("useProxy", false).toBool();
proxyAddr = s.value("proxyAddr", "").toString();
proxyPort = s.value("proxyPort", 0).toInt();
currentProfile = s.value("currentProfile", "").toString();
s.endGroup();
s.beginGroup("Widgets");
@ -131,7 +135,6 @@ void Settings::load()
timestampFormat = s.value("timestampFormat", "hh:mm").toString();
minimizeOnClose = s.value("minimizeOnClose", false).toBool();
useNativeStyle = s.value("nativeStyle", false).toBool();
useNativeDecoration = s.value("nativeDecoration", true).toBool();
s.endGroup();
s.beginGroup("State");
@ -211,6 +214,10 @@ void Settings::save(QString path)
s.setValue("enableIPv6", enableIPv6);
s.setValue("useTranslations",useTranslations);
s.setValue("makeToxPortable",makeToxPortable);
s.setValue("useProxy", useProxy);
s.setValue("forceTCP", forceTCP);
s.setValue("proxyAddr", proxyAddr);
s.setValue("proxyPort", proxyPort);
s.setValue("currentProfile", currentProfile);
s.endGroup();
@ -232,7 +239,6 @@ void Settings::save(QString path)
s.setValue("timestampFormat", timestampFormat);
s.setValue("minimizeOnClose", minimizeOnClose);
s.setValue("nativeStyle", useNativeStyle);
s.setValue("nativeDecoration", useNativeDecoration);
s.endGroup();
s.beginGroup("State");
@ -259,6 +265,58 @@ QString Settings::getSettingsDirPath()
#endif
}
QPixmap Settings::getSavedAvatar(const QString &ownerId)
{
QDir dir(getSettingsDirPath());
QString filePath = dir.filePath("avatars/"+ownerId.left(64)+".png");
QFileInfo info(filePath);
QPixmap pic;
if (!info.exists())
{
QString filePath = dir.filePath("avatar_"+ownerId.left(64));
if (!QFileInfo(filePath).exists()) // try without truncation, for old self avatars
filePath = dir.filePath("avatar_"+ownerId);
pic.load(filePath);
saveAvatar(pic, ownerId);
QFile::remove(filePath);
}
else
pic.load(filePath);
return pic;
}
void Settings::saveAvatar(QPixmap& pic, const QString& ownerId)
{
QDir dir(getSettingsDirPath());
dir.mkdir("avatars/");
// ignore nospam (good idea, and also the addFriend funcs which call getAvatar don't have it)
QString filePath = dir.filePath("avatars/"+ownerId.left(64)+".png");
pic.save(filePath, "png");
}
void Settings::saveAvatarHash(const QByteArray& hash, const QString& ownerId)
{
QDir dir(getSettingsDirPath());
dir.mkdir("avatars/");
QFile file(dir.filePath("avatars/"+ownerId.left(64)+".hash"));
if (!file.open(QIODevice::WriteOnly))
return;
file.write(hash);
file.close();
}
QByteArray Settings::getAvatarHash(const QString& ownerId)
{
QDir dir(getSettingsDirPath());
dir.mkdir("avatars/");
QFile file(dir.filePath("avatars/"+ownerId.left(64)+".hash"));
if (!file.open(QIODevice::ReadOnly))
return QByteArray();
QByteArray out = file.readAll();
file.close();
return out;
}
const QList<Settings::DhtServer>& Settings::getDhtServerList() const
{
return dhtServerList;
@ -313,6 +371,45 @@ void Settings::setUseTranslations(bool newValue)
useTranslations = newValue;
}
bool Settings::getForceTCP() const
{
return forceTCP;
}
void Settings::setForceTCP(bool newValue)
{
forceTCP = newValue;
}
bool Settings::getUseProxy() const
{
return useProxy;
}
void Settings::setUseProxy(bool newValue)
{
useProxy = newValue;
}
QString Settings::getProxyAddr() const
{
return proxyAddr;
}
void Settings::setProxyAddr(const QString& newValue)
{
proxyAddr = newValue;
}
int Settings::getProxyPort() const
{
return proxyPort;
}
void Settings::setProxyPort(int newValue)
{
proxyPort = newValue;
}
bool Settings::getEnableLogging() const
{
return enableLogging;
@ -438,16 +535,6 @@ void Settings::setUseNativeStyle(bool value)
useNativeStyle = value;
}
bool Settings::getUseNativeDecoration() const
{
return useNativeDecoration;
}
void Settings::setUseNativeDecoration(bool value)
{
useNativeDecoration = value;
}
QByteArray Settings::getWindowGeometry() const
{
return windowGeometry;

View File

@ -19,6 +19,7 @@
#include <QHash>
#include <QObject>
#include <QPixmap>
class Settings : public QObject
{
@ -54,12 +55,30 @@ public:
bool getUseTranslations() const;
void setUseTranslations(bool newValue);
bool getForceTCP() const;
void setForceTCP(bool newValue);
QString getProxyAddr() const;
void setProxyAddr(const QString& newValue);
bool getUseProxy() const;
void setUseProxy(bool newValue);
int getProxyPort() const;
void setProxyPort(int newValue);
bool getEnableLogging() const;
void setEnableLogging(bool newValue);
bool getEncryptLogs() const;
void setEncryptLogs(bool newValue);
QPixmap getSavedAvatar(const QString& ownerId);
void saveAvatar(QPixmap& pic, const QString& ownerId);
QByteArray getAvatarHash(const QString& ownerId);
void saveAvatarHash(const QByteArray& hash, const QString& ownerId);
// Assume all widgets have unique names
// Don't use it to save every single thing you want to save, use it
// for some general purpose widgets, such as MainWindows or Splitters,
@ -117,9 +136,6 @@ public:
bool getUseNativeStyle() const;
void setUseNativeStyle(bool value);
bool getUseNativeDecoration() const;
void setUseNativeDecoration(bool value);
QByteArray getWindowGeometry() const;
void setWindowGeometry(const QByteArray &value);
@ -152,6 +168,13 @@ private:
bool enableIPv6;
bool useTranslations;
static bool makeToxPortable;
bool forceTCP;
bool useProxy;
QString proxyAddr;
int proxyPort;
QString currentProfile;
bool enableLogging;
@ -167,7 +190,6 @@ private:
int emojiFontPointSize;
bool minimizeOnClose;
bool useNativeStyle;
bool useNativeDecoration;
QByteArray windowGeometry;
QByteArray windowState;
QByteArray splitterState;
@ -182,7 +204,7 @@ private:
signals:
//void dataChanged();
void dhtServerListChanged(bool reset = false);
void dhtServerListChanged();
void logStorageOptsChanged();
void smileyPackChanged();
void emojiFontChanged();

View File

@ -40,24 +40,38 @@ SmileyPack& SmileyPack::getInstance()
return smileyPack;
}
QList<QPair<QString, QString> > SmileyPack::listSmileyPacks(const QString &path)
QList<QPair<QString, QString> > SmileyPack::listSmileyPacks(const QStringList &paths)
{
QList<QPair<QString, QString> > smileyPacks;
QDir dir(path);
foreach (const QString& subdirectory, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
for (QString path : paths)
{
dir.cd(subdirectory);
if (path.leftRef(1) == "~")
path.replace(0, 1, QDir::homePath());
QFileInfoList entries = dir.entryInfoList(QStringList() << "emoticons.xml", QDir::Files);
if (entries.size() > 0) // does it contain a file called emoticons.xml?
QDir dir(path);
if (!dir.exists())
continue;
for (const QString& subdirectory : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{
QString packageName = dir.dirName();
QString relPath = QDir(QCoreApplication::applicationDirPath()).relativeFilePath(entries[0].absoluteFilePath());
smileyPacks << QPair<QString, QString>(packageName, relPath);
}
dir.cd(subdirectory);
dir.cdUp();
QFileInfoList entries = dir.entryInfoList(QStringList() << "emoticons.xml", QDir::Files);
if (entries.size() > 0) // does it contain a file called emoticons.xml?
{
QString packageName = dir.dirName();
QString absPath = entries[0].absoluteFilePath();
QString relPath = QDir(QCoreApplication::applicationDirPath()).relativeFilePath(absPath);
if (relPath.leftRef(2) == "..")
smileyPacks << QPair<QString, QString>(packageName, absPath);
else
smileyPacks << QPair<QString, QString>(packageName, relPath); // use relative path for subdirectories
}
dir.cdUp();
}
}
return smileyPacks;

View File

@ -22,7 +22,10 @@
#include <QString>
#include <QStringList>
#define SMILEYPACK_DEFAULT_PATH "./smileys"
#define SMILEYPACK_SEARCH_PATHS \
{ \
"./smileys", "/usr/share/qtox/smileys", "/usr/share/emoticons", "~/.kde4/share/emoticons", "~/.kde/share/emoticons" \
}
//maps emoticons to smileys
class SmileyPack : public QObject
@ -30,10 +33,10 @@ class SmileyPack : public QObject
Q_OBJECT
public:
static SmileyPack& getInstance();
static QList<QPair<QString, QString>> listSmileyPacks(const QString& path = SMILEYPACK_DEFAULT_PATH);
static QList<QPair<QString, QString> > listSmileyPacks(const QStringList& paths = SMILEYPACK_SEARCH_PATHS);
static bool isValid(const QString& filename);
bool load(const QString &filename);
bool load(const QString& filename);
QString smileyfied(QString msg);
QList<QStringList> getEmoticons() const;
QString getAsRichText(const QString& key);

144
misc/style.cpp Normal file
View File

@ -0,0 +1,144 @@
/*
Copyright (C) 2014 by Project Tox <https://tox.im>
This file is part of qTox, a Qt-based graphical interface for Tox.
This program is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#include "style.h"
#include "settings.h"
#include <QFile>
#include <QDebug>
#include <QMap>
#include <QRegularExpression>
#include <QWidget>
#include <QStyle>
#include <QFontInfo>
// helper functions
QFont appFont(int pixelSize, int weight)
{
QFont font;
font.setPixelSize(pixelSize);
font.setWeight(weight);
return font;
}
QString qssifyFont(QFont font)
{
return QString("%1 %2px \"%3\"")
.arg(font.weight()*8)
.arg(font.pixelSize())
.arg(font.family());
}
QString Style::getStylesheet(const QString &filename)
{
if (!Settings::getInstance().getUseNativeStyle())
{
QFile file(filename);
if (file.open(QFile::ReadOnly | QFile::Text))
return resolve(file.readAll());
else
qWarning() << "Style: Stylesheet " << filename << " not found";
}
return QString();
}
QColor Style::getColor(Style::ColorPalette entry)
{
// colors as defined in
// https://github.com/ItsDuke/Tox-UI/blob/master/UI%20GUIDELINES.md
static QColor palette[] = {
QColor("#6bc260"),
QColor("#cebf44"),
QColor("#c84e4e"),
QColor("#000000"),
QColor("#1c1c1c"),
QColor("#414141"),
QColor("#414141").lighter(120),
QColor("#d1d1d1"),
QColor("#ffffff"),
};
return palette[entry];
}
QFont Style::getFont(Style::Font font)
{
// fonts as defined in
// https://github.com/ItsDuke/Tox-UI/blob/master/UI%20GUIDELINES.md
static int defSize = QFontInfo(QFont()).pixelSize();
static QFont fonts[] = {
appFont(defSize + 2, QFont::Bold),
appFont(defSize , QFont::Normal),
appFont(defSize , QFont::Bold),
appFont(defSize - 1, QFont::Normal),
appFont(defSize - 1, QFont::Bold),
appFont(defSize - 2, QFont::Normal),
appFont(defSize - 2, QFont::Light),
};
return fonts[font];
}
QString Style::resolve(QString qss)
{
static QMap<QString, QString> dict = {
// colors
{"@green", getColor(Green).name()},
{"@yellow", getColor(Yellow).name()},
{"@red", getColor(Red).name()},
{"@black", getColor(Black).name()},
{"@darkGrey", getColor(DarkGrey).name()},
{"@mediumGrey", getColor(MediumGrey).name()},
{"@mediumGreyLight", getColor(MediumGreyLight).name()},
{"@lightGrey", getColor(LightGrey).name()},
{"@white", getColor(White).name()},
// fonts
{"@extraBig", qssifyFont(getFont(ExtraBig))},
{"@big", qssifyFont(getFont(Big))},
{"@bigBold", qssifyFont(getFont(BigBold))},
{"@medium", qssifyFont(getFont(Medium))},
{"@mediumBold", qssifyFont(getFont(MediumBold))},
{"@small", qssifyFont(getFont(Small))},
{"@smallLight", qssifyFont(getFont(SmallLight))},
};
for (const QString& key : dict.keys())
{
qss.replace(QRegularExpression(QString("%1\\b").arg(key)), dict[key]);
}
return qss;
}
void Style::repolish(QWidget *w)
{
w->style()->unpolish(w);
w->style()->polish(w);
for (QObject* o : w->children())
{
QWidget* c = qobject_cast<QWidget*>(o);
if (c)
{
c->style()->unpolish(c);
c->style()->polish(c);
}
}
}

63
misc/style.h Normal file
View File

@ -0,0 +1,63 @@
/*
Copyright (C) 2014 by Project Tox <https://tox.im>
This file is part of qTox, a Qt-based graphical interface for Tox.
This program is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#ifndef STYLE_H
#define STYLE_H
#include <QColor>
#include <QFont>
class QString;
class QWidget;
class Style
{
public:
enum ColorPalette
{
Green,
Yellow,
Red,
Black,
DarkGrey,
MediumGrey,
MediumGreyLight,
LightGrey,
White,
};
enum Font
{
ExtraBig, // [SystemDefault + 2]px, bold
Big, // [SystemDefault ]px
BigBold, // [SystemDefault ]px, bold
Medium, // [SystemDefault - 1]px
MediumBold, // [SystemDefault - 1]px, bold
Small, // [SystemDefault - 2]px
SmallLight // [SystemDefault - 2]px, light
};
static QString getStylesheet(const QString& filename);
static QColor getColor(ColorPalette entry);
static QFont getFont(Font font);
static QString resolve(QString qss);
static void repolish(QWidget* w);
private:
Style();
};
#endif // STYLE_H

12
qTox.desktop Normal file
View File

@ -0,0 +1,12 @@
[Desktop Entry]
Version=1.0
Type=Application
Name=qTox
GenericName=Tox client
Comment=qTox is a powerful Tox client that follows the Tox design guidelines.
TryExec=qtox
Exec=qtox
Icon=qtox
Categories=InstantMessaging;;AudioVideo;Network;
Terminal=false
MimeType=x-scheme-handler/tox;

View File

@ -26,13 +26,21 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtox
TEMPLATE = app
FORMS += \
mainwindow.ui
mainwindow.ui \
widget/form/settings/generalsettings.ui \
widget/form/settings/avsettings.ui \
widget/form/settings/identitysettings.ui
CONFIG += c++11
TRANSLATIONS = translations/de.ts \
translations/fr.ts \
translations/it.ts \
translations/ru.ts
translations/ru.ts \
translations/pirate.ts \
translations/pl.ts \
translations/fi.ts \
translations/mannol.ts \
translations/uk.ts
RESOURCES += res.qrc
@ -44,8 +52,9 @@ contains(JENKINS,YES) {
# Rules for Windows, Mac OSX, and Linux
win32 {
LIBS += -L$$PWD/libs/lib -llibopencv_core249 -llibopencv_highgui249 -llibopencv_imgproc249 -lOpenAL32
LIBS += $$PWD/libs/lib/libtoxav.a $$PWD/libs/lib/libopus.a $$PWD/libs/lib/libvpx.a $$PWD/libs/lib/libtoxcore.a -lws2_32 $$PWD/libs/lib/libsodium.a -lpthread -liphlpapi
LIBS += -liphlpapi -L$$PWD/libs/lib -ltoxav -ltoxcore -lvpx -lpthread
LIBS += -L$$PWD/libs/lib -lopencv_core248 -lopencv_highgui248 -lopencv_imgproc248 -lOpenAL32 -lopus
LIBS += -lz -lopengl32 -lole32 -loleaut32 -luuid -lvfw32 -ljpeg -ltiff -lpng -ljasper -lIlmImf -lHalf -lws2_32
} else {
macx {
LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -lsodium -lvpx -framework OpenAL -lopencv_core -lopencv_highgui
@ -54,7 +63,10 @@ win32 {
contains(STATICPKG, YES) {
target.path = /usr/bin
INSTALLS += target
LIBS += -L$$PWD/libs/lib/ -Wl,-Bstatic -ltoxcore -ltoxav -lsodium -Wl,-Bdynamic -lopus -lvpx -lopenal -lopencv_core -lopencv_highgui
LIBS += -L$$PWD/libs/lib/ -lopus -lvpx -lopenal -Wl,-Bstatic -ltoxcore -ltoxav -lsodium -lopencv_highgui -lopencv_imgproc -lopencv_core -lz -Wl,-Bdynamic
LIBS += -Wl,-Bstatic -ljpeg -ltiff -lpng -ljasper -lIlmImf -lIlmThread -lIex -ldc1394 -lraw1394 -lHalf -lz -llzma -ljbig
LIBS += -Wl,-Bdynamic -ltbb -lv4l1 -lv4l2 -lgnutls -lrtmp -lgnutls -lavformat -lavcodec -lavutil -lavfilter -lswscale -lusb-1.0
} else {
LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -lvpx -lopenal -lopencv_core -lopencv_highgui
}
@ -79,7 +91,12 @@ win32 {
HEADERS += widget/form/addfriendform.h \
widget/form/chatform.h \
widget/form/groupchatform.h \
widget/form/settingsform.h \
widget/form/settingswidget.h \
widget/form/settings/genericsettings.h \
widget/form/settings/generalform.h \
widget/form/settings/identityform.h \
widget/form/settings/privacyform.h \
widget/form/settings/avform.h \
widget/form/filesform.h \
widget/tool/chattextedit.h \
widget/tool/friendrequestdialog.h \
@ -89,34 +106,43 @@ HEADERS += widget/form/addfriendform.h \
friend.h \
group.h \
grouplist.h \
settings.h \
misc/settings.h \
core.h \
friendlist.h \
cdata.h \
cstring.h \
misc/cdata.h \
misc/cstring.h \
widget/selfcamview.h \
widget/camera.h \
widget/netcamview.h \
smileypack.h \
misc/smileypack.h \
widget/emoticonswidget.h \
style.h \
misc/style.h \
widget/adjustingscrollarea.h \
widget/croppinglabel.h \
widget/friendlistwidget.h \
widget/genericchatroomwidget.h \
widget/form/genericchatform.h \
widget/tool/chataction.h \
widget/tool/chatactions/chataction.h \
widget/chatareawidget.h \
filetransferinstance.h \
corestructs.h \
coredefines.h \
coreav.h
coreav.h \
widget/tool/chatactions/messageaction.h \
widget/tool/chatactions/filetransferaction.h \
widget/tool/chatactions/systemmessageaction.h \
widget/tool/chatactions/actionaction.h \
widget/maskablepixmapwidget.h
SOURCES += \
widget/form/addfriendform.cpp \
widget/form/chatform.cpp \
widget/form/groupchatform.cpp \
widget/form/settingsform.cpp \
widget/form/settingswidget.cpp \
widget/form/settings/generalform.cpp \
widget/form/settings/identityform.cpp \
widget/form/settings/privacyform.cpp \
widget/form/settings/avform.cpp \
widget/form/filesform.cpp \
widget/tool/chattextedit.cpp \
widget/tool/friendrequestdialog.cpp \
@ -129,22 +155,27 @@ SOURCES += \
group.cpp \
grouplist.cpp \
main.cpp \
settings.cpp \
cdata.cpp \
cstring.cpp \
misc/settings.cpp \
misc/cdata.cpp \
misc/cstring.cpp \
widget/selfcamview.cpp \
widget/camera.cpp \
widget/netcamview.cpp \
smileypack.cpp \
misc/smileypack.cpp \
widget/emoticonswidget.cpp \
style.cpp \
misc/style.cpp \
widget/adjustingscrollarea.cpp \
widget/croppinglabel.cpp \
widget/friendlistwidget.cpp \
coreav.cpp \
widget/genericchatroomwidget.cpp \
widget/form/genericchatform.cpp \
widget/tool/chataction.cpp \
widget/tool/chatactions/chataction.cpp \
widget/chatareawidget.cpp \
filetransferinstance.cpp \
corestructs.cpp
corestructs.cpp \
widget/tool/chatactions/messageaction.cpp \
widget/tool/chatactions/filetransferaction.cpp \
widget/tool/chatactions/systemmessageaction.cpp \
widget/tool/chatactions/actionaction.cpp \
widget/maskablepixmapwidget.cpp

29
res.qrc
View File

@ -84,18 +84,6 @@
<file>ui/videoButton/videoButtonYellowPressed.png</file>
<file>img/group_dark.png</file>
<file>ui/window/applicationIcon.png</file>
<file>ui/window/closeButton.png</file>
<file>ui/window/closeButtonHover.png</file>
<file>ui/window/closeButtonPressed.png</file>
<file>ui/window/maximizeButton.png</file>
<file>ui/window/maximizeButtonHover.png</file>
<file>ui/window/maximizeButtonPressed.png</file>
<file>ui/window/minimizeButton.png</file>
<file>ui/window/minimizeButtonHover.png</file>
<file>ui/window/minimizeButtonPressed.png</file>
<file>ui/window/restoreButton.png</file>
<file>ui/window/restoreButtonHover.png</file>
<file>ui/window/restoreButtonPressed.png</file>
<file>ui/friendList/friendList.css</file>
<file>ui/window/window.css</file>
<file>img/status/dot_busy.png</file>
@ -135,5 +123,22 @@
<file>ui/fileTransferInstance/emptyRGreenFileButton.png</file>
<file>ui/fileTransferInstance/emptyRRedFileButton.png</file>
<file>audio/notification.pcm</file>
<file>audio/ToxicIncomingCall.pcm</file>
<file>img/settings/general.png</file>
<file>img/settings/identity.png</file>
<file>img/settings/privacy.png</file>
<file>img/settings/av.png</file>
<file>translations/pl.qm</file>
<file>translations/fi.qm</file>
<file>translations/mannol.qm</file>
<file>translations/uk.qm</file>
<file>img/avatar_mask.png</file>
<file>img/group_2x.png</file>
<file>ui/chatroomWidgets/genericChatroomWidget.css</file>
<file>ui/fileTransferInstance/sliverRTEdge.png</file>
<file>ui/window/statusPanel.css</file>
<file>ui/settings/mainContent.css</file>
<file>ui/settings/mainHead.css</file>
<file>translations/pirate.qm</file>
</qresource>
</RCC>

BIN
smileys/default/Kappa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -82,4 +82,7 @@
<string>XD</string>
</emoticon>
<emoticon file="Kappa.png">
<string>:Kappa:</string>
</emoticon>
</messaging-emoticon-map>

View File

@ -56,9 +56,19 @@ done
if [[ $OPT_APT = "true" ]]; then
echo "Installing missing tools (if any)..."
if [[ $EUID -ne 0 && $OPT_SUDO = "true" ]]; then
sudo apt-get install wget debhelper cdbs devscripts alien tar gzip build-essential
sudo apt-get install wget debhelper cdbs devscripts alien tar gzip build-essential sudo autoconf libtool pkg-config libvpx-dev -y
else
apt-get install wget debhelper cdbs devscripts alien tar gzip build-essential
apt-get install wget debhelper cdbs devscripts alien tar gzip build-essential sudo autoconf libtool pkg-config libvpx-dev -y
fi
fi
# Get the requried dependencies if needed
if [[ $OPT_APT = "true" ]]; then
echo "Installing missing dependencies (if any)..."
if [[ $EUID -ne 0 && $OPT_SUDO = "true" ]]; then
sudo apt-get install qt5-qmake libopenal-dev libopencv-dev libopus-dev -y
else
apt-get install qt5-qmake libopenal-dev libopencv-dev libopus-dev -y
fi
fi
@ -77,7 +87,9 @@ mv qTox-master $VERNAME
# Build packages
cd $VERNAME
debuild -us -uc
./bootstrap.sh --local
debuild -us -uc -aamd64
debuild -us -uc -ai386
cd ..
# alien warns that it should probably be run as root...

45
tools/publish.py Normal file
View File

@ -0,0 +1,45 @@
#!/usr/bin/python2.7
from github3 import login, GitHub
from getpass import getpass, getuser
import time
import datetime
import sys
try:
import readline
except ImportError:
pass
platform=''
if (len(sys.argv) >= 3):
platform=sys.argv[2]
versionNumber = str(time.time())
if (platform != ''):
version = 'qtox-'+platform+'-'+versionNumber
else:
version = 'qtox-'+versionNumber
if (platform == 'windows'):
title = 'qTox Windows '+datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
elif (platform == 'linux'):
title = 'qTox Linux '+datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
else:
title = 'qTox '+datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
user = "tux3"
password = ""
if password == "":
password = getpass('GitHub password for {0}: '.format(user))
# Obviously you could also prompt for an OAuth token
if not (user and password):
print("Cowardly refusing to login without a username and password.")
sys.exit(1)
g = login(user, password)
repo = g.repository('tux3', 'qTox')
release = repo.create_release(version,'master',title,'This is an automated release of qTox, published by qTox\'s continous integration server.',False,False)
if (len(sys.argv) >= 2):
file = open(sys.argv[1], 'r')
release.upload_asset('application/octet-stream',sys.argv[1],file)

Binary file not shown.

View File

@ -1,75 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE">
<context>
<name>AVPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="132"/>
<source>Video Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="136"/>
<location filename="../widget/settingsdialog.cpp" line="163"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="157"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="32"/>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Freunde hinzufügen</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="35"/>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="36"/>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Nachricht</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Freundschaftseinladung versenden</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Lass uns Toxen!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="93"/>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Bitte gib eine gültige Tox ID ein</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="110"/>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="114"/>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Fehler beim Auflösen des DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Unererwartete Anzahl von Texteinträgen</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Unerwartete Anzahl von Werten innerhalb des Texteintrages</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="133"/>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Der DNS Eintrag enthält keine gültige TOX ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Der DNS Eintrag enthält keine gültige TOX ID</translation>
@ -78,74 +105,77 @@
<context>
<name>Camera</name>
<message>
<location filename="../widget/camera.cpp" line="161"/>
<source>Camera eror</source>
<translation>Kamerafehler</translation>
<translation type="vanished">Kamerafehler</translation>
</message>
<message>
<location filename="../widget/camera.cpp" line="162"/>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation>Kameraformat %1 wird nicht unterstützt. Die Kamera kann nicht verwendet werden</translation>
<translation type="vanished">Kameraformat %1 wird nicht unterstützt. Die Kamera kann nicht verwendet werden</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="283"/>
<location filename="../widget/form/chatform.cpp" line="80"/>
<source>Send a file</source>
<translation>Datei versenden</translation>
</message>
<message>
<location filename="../widget/form/chatform.cpp" line="620"/>
<location filename="../widget/form/chatform.cpp" line="626"/>
<source>Save chat log</source>
<translation>Chatverlauf speichern</translation>
<translation type="vanished">Chatverlauf speichern</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<message>
<location filename="../widget/tool/copyableelidelabel.cpp" line="29"/>
<source>Copy</source>
<translation>Kopieren</translation>
<translation type="vanished">Kopieren</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<name>FileTransferInstance</name>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="281"/>
<location filename="../filetransferinstance.cpp" line="191"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Datei speichern</translation>
<translation type="unfinished">Datei speichern</translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation type="vanished">Datei speichern</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="25"/>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="33"/>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="34"/>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation type="unfinished"></translation>
</message>
@ -189,69 +219,149 @@
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="86"/>
<location filename="../widget/friendwidget.cpp" line="84"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Tox ID kopieren</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="87"/>
<location filename="../widget/friendwidget.cpp" line="85"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>In Gruppe einladen</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="97"/>
<location filename="../widget/friendwidget.cpp" line="95"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Freund entfernen</translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="31"/>
<source>General Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="34"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation type="unfinished">IPv6 aktivieren (empfohlen)</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="36"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="38"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="39"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="48"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="49"/>
<source>Smiley Pack</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="142"/>
<location filename="../widget/form/genericchatform.cpp" line="148"/>
<source>Save chat log</source>
<translation type="unfinished">Chatverlauf speichern</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="49"/>
<location filename="../widget/form/groupchatform.cpp" line="41"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 Personen im Chat</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="146"/>
<location filename="../widget/form/groupchatform.cpp" line="83"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Unbekannt&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="215"/>
<location filename="../widget/form/groupchatform.cpp" line="90"/>
<source>%1 users in chat</source>
<translation>%1 Personen im Chat</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="234"/>
<source>Save chat log</source>
<translation>Chatverlauf speichern</translation>
<translation type="vanished">Chatverlauf speichern</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="54"/>
<location filename="../widget/groupwidget.cpp" line="141"/>
<location filename="../widget/groupwidget.cpp" line="58"/>
<location filename="../widget/groupwidget.cpp" line="100"/>
<source>%1 users in chat</source>
<translation>%1 Personen im Chat</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="56"/>
<location filename="../widget/groupwidget.cpp" line="143"/>
<location filename="../widget/groupwidget.cpp" line="60"/>
<location filename="../widget/groupwidget.cpp" line="102"/>
<source>0 users in chat</source>
<translation>0 Personen im Chat</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="84"/>
<location filename="../widget/groupwidget.cpp" line="83"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Gruppe verlassen</translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="82"/>
<source>Public Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="83"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation type="unfinished">Benutzername</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="85"/>
<source>Status</source>
<comment>Status message</comment>
<translation type="unfinished">Status</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="95"/>
<source>Tox ID</source>
<translation type="unfinished">Tox ID</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="96"/>
<source>Your Tox ID</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -303,73 +413,81 @@
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="32"/>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Tox Video testen</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="197"/>
<source>qTox Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="224"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="230"/>
<source>Identity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="236"/>
<source>Privacy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="242"/>
<source>Audio/Video</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="251"/>
<source>Ok</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="252"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="253"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="34"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Einstellungen</translation>
<translation type="vanished">Einstellungen</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="37"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Benutzername</translation>
<translation type="vanished">Benutzername</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="38"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Status</translation>
<translation type="vanished">Status</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="39"/>
<source>(click here to copy)</source>
<comment>Click on this text to copy TID to clipboard</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="47"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Video testen</translation>
<translation type="vanished">Video testen</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="48"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>IPv6 aktivieren (empfohlen)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="50"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="52"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="54"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="56"/>
<source>Smiley Pack</source>
<comment>Text on smiley pack label</comment>
<translation type="unfinished"></translation>
<translation type="vanished">IPv6 aktivieren (empfohlen)</translation>
</message>
</context>
<context>
@ -395,22 +513,28 @@
<translation type="vanished">Strg+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="128"/>
<location filename="../widget/widget.cpp" line="133"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation type="unfinished">Online</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="130"/>
<location filename="../widget/widget.cpp" line="135"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation type="unfinished">Abwesend</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="132"/>
<location filename="../widget/widget.cpp" line="137"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation type="unfinished">Beschäftigt</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="605"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation type="unfinished">&lt;Unbekannt&gt;</translation>
</message>
</context>
</TS>

BIN
translations/fi.qm Normal file

Binary file not shown.

540
translations/fi.ts Normal file
View File

@ -0,0 +1,540 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fi_FI">
<context>
<name>AVPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="132"/>
<source>Video Settings</source>
<translation>Videoasetukset</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="136"/>
<location filename="../widget/settingsdialog.cpp" line="163"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation>Videon esikatselu</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="157"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation>Lopeta esikatselu</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Lisää kontakti</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Viesti</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Lähetä kontaktipyyntö</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Lisää kontakteihin?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Anna kelvollinen Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Et voi lisätä itseäsi kontaktiksi</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Osoitetta ei ole olemassa</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Virhe DNS pyynnössä</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Virheellinen määrä tekstitietueita</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Odottamaton määrä tekstitietueita</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>DNS vastaus ei sisällä Tox ID:</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>DNS vastaus ei sisällä kelvollista Tox ID:</translation>
</message>
</context>
<context>
<name>Camera</name>
<message>
<source>Camera eror</source>
<translation type="vanished">Kamerafehler</translation>
</message>
<message>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation type="vanished">Kameraformat %1 wird nicht unterstützt. Die Kamera kann nicht verwendet werden</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="80"/>
<source>Send a file</source>
<translation>Lähetä tiedosto</translation>
</message>
<message>
<source>Save chat log</source>
<translation type="vanished">Chatverlauf speichern</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<message>
<source>Copy</source>
<translation type="vanished">Kopieren</translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="191"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Tallenna tiedosto</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Kohteeseen ei voi tallentaa</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Käyttöoikeudet eivät riitä kohteeseen tallentamiseen. Valitse toinen kohde tai peru.</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation type="vanished">Datei speichern</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Tiedostojen siirrot</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation>Ladatut</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation>Lähetetyt</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translation>Kontaktipyyntö</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation>Sinulle on lähetetty kontaktipyyntö</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation>Käyttäjän ID:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation>Kontaktipyynnön viesti:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation>Hyväksy</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation>Hylkää</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="84"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Kopioi kontaktin ID</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="85"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Kutsu ryhmään</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="95"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Poista kontakti</translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="31"/>
<source>General Settings</source>
<translation>Yleiset asetukset</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="34"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Aktivoi IPv6 (suositeltu)</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="36"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation>Käytä käännöksiä</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="38"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation>Tee ohjelmasta siirrettävä</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="39"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation>Tallenna asetukset työhakemistoon normaalin asetushakemiston sijaan.</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="48"/>
<source>Theme</source>
<translation>Teema</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="49"/>
<source>Smiley Pack</source>
<translation>Hymiö-paketti</translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="142"/>
<location filename="../widget/form/genericchatform.cpp" line="148"/>
<source>Save chat log</source>
<translation>Tallenna keskustelu</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="41"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 henkilö keskustelussa</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="83"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Tuntematon&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="90"/>
<source>%1 users in chat</source>
<translation>%1 henkilöä keskustelussa</translation>
</message>
<message>
<source>Save chat log</source>
<translation type="vanished">Chatverlauf speichern</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="58"/>
<location filename="../widget/groupwidget.cpp" line="100"/>
<source>%1 users in chat</source>
<translation>%1 henkilöä keskustelussa</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="60"/>
<location filename="../widget/groupwidget.cpp" line="102"/>
<source>0 users in chat</source>
<translation>0 henkilöä keskustelussa</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="83"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Sulje ryhmä</translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="82"/>
<source>Public Information</source>
<translation>Julkiset tiedot</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="83"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Nimi</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="85"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Tila</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="95"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="96"/>
<source>Your Tox ID</source>
<translation>Sinun Tox ID</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1918"/>
<source>Your name</source>
<translation>Sinun nimesi</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2000"/>
<source>Your status</source>
<translation>Sinun tilasi</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2566"/>
<source>Add friends</source>
<translation>Lisää kontakti</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2592"/>
<source>Create a group chat</source>
<translation>Luo keskusteluryhmä</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2624"/>
<source>View completed file transfers</source>
<translation>Näytä valmiit tiedostojensiirrot</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2656"/>
<source>Change your settings</source>
<translation>Muuta asetuksiasi</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3238"/>
<source>Close</source>
<translation>Sulje</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3241"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Tox videotesti</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="197"/>
<source>qTox Settings</source>
<translation>qTox - Asetukset</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="224"/>
<source>General</source>
<translation>Yleiset</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="230"/>
<source>Identity</source>
<translation>Identiteetti</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="236"/>
<source>Privacy</source>
<translation>Yksityisyys</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="242"/>
<source>Audio/Video</source>
<translation>Audio/Video</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="251"/>
<source>Ok</source>
<translation>Ok</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="252"/>
<source>Cancel</source>
<translation>Peru</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="253"/>
<source>Apply</source>
<translation>Ota käyttöön</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation type="vanished">Einstellungen</translation>
</message>
<message>
<source>Name</source>
<comment>Username/nick</comment>
<translation type="vanished">Benutzername</translation>
</message>
<message>
<source>Status</source>
<comment>Status message</comment>
<translation type="vanished">Status</translation>
</message>
<message>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation type="vanished">Video testen</translation>
</message>
<message>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation type="vanished">IPv6 aktivieren (empfohlen)</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<source>Tox</source>
<translation type="vanished">Tox</translation>
</message>
<message>
<source>Your name</source>
<translation type="vanished">Dein Name</translation>
</message>
<message>
<source>Your status</source>
<translation type="vanished">Dein Status</translation>
</message>
<message>
<source>Close</source>
<translation type="vanished">Schließen</translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation type="vanished">Strg+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="133"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>Online</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="135"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation>Poissa</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="137"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Kiireinen</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="605"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;tuntematon&gt;</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -1,75 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr_FR">
<context>
<name>AVForm</name>
<message>
<location filename="../widget/form/settings/avform.cpp" line="22"/>
<source>Audio/Video settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="41"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="unfinished">Cacher l&apos;aperçu vidéo</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="47"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="unfinished">Montrer l&apos;aperçu vidéo</translation>
</message>
</context>
<context>
<name>AVPage</name>
<message>
<source>Video Settings</source>
<translation type="vanished">Options vidéo</translation>
</message>
<message>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="vanished">Montrer l&apos;aperçu vidéo</translation>
</message>
<message>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="vanished">Cacher l&apos;aperçu vidéo</translation>
</message>
</context>
<context>
<name>AVSettings</name>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="20"/>
<source>Video settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="26"/>
<source>Show video preview</source>
<translation type="unfinished">Montrer l&apos;aperçu vidéo</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="32"/>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Ajouter des amis</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="35"/>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>ID Tox</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="36"/>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Message</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Envoyer la demande d&apos;ami</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Je souhaiterais vous ajouter à mes contacts</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="93"/>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Merci de remplir un ID Tox valide</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="110"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished"></translation>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Vous ne pouvez pas vous ajouter vous même en temps qu&apos;ami!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="114"/>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Cette addresse n&apos;existe pas</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Erreur en consultant le serveur DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Nombre d&apos;entrées texte innatendu</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Nombre d&apos;entrées numériques dans l&apos;entrée texte innatendu</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="133"/>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La réponse DNS ne contient aucun ID Tox</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La réponse DNS ne contient pas d&apos;ID Tox valide</translation>
@ -78,76 +139,93 @@
<context>
<name>Camera</name>
<message>
<location filename="../widget/camera.cpp" line="161"/>
<source>Camera eror</source>
<translation>Erreur de caméra</translation>
<translation type="vanished">Erreur de caméra</translation>
</message>
<message>
<location filename="../widget/camera.cpp" line="162"/>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation>Format %1 de la caméra non supporté, impossible de l&apos;utiliser</translation>
<translation type="vanished">Format %1 de la caméra non supporté, impossible de l&apos;utiliser</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="283"/>
<location filename="../widget/form/chatform.cpp" line="105"/>
<source>Send a file</source>
<translation>Envoyer un fichier</translation>
</message>
<message>
<location filename="../widget/form/chatform.cpp" line="620"/>
<location filename="../widget/form/chatform.cpp" line="626"/>
<source>Save chat log</source>
<translation>Sauvegarder l&apos;historique de conversation</translation>
<translation type="vanished">Sauvegarder l&apos;historique de conversation</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<message>
<location filename="../widget/tool/copyableelidelabel.cpp" line="29"/>
<source>Copy</source>
<translation>Copier</translation>
<translation type="vanished">Copier</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<name>Core</name>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="281"/>
<location filename="../core.cpp" line="1068"/>
<source>Encrypted profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../core.cpp" line="1069"/>
<source>Your tox profile seems to be encrypted, qTox can&apos;t open it
Do you want to erase this profile ?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="208"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Sauvegarder un fichier</translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation type="unfinished"></translation>
<translation>Impossible d&apos;écrire ici</translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation type="unfinished"></translation>
<translation>Vous n&apos;avez pas la permission d&apos;écrire ici. Choisissez un audre endroit, ou annulez.</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation type="vanished">Sauvegarder un fichier</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="25"/>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation type="unfinished"></translation>
<translation>Transfers</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="33"/>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
<translation>Téléchargements</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="34"/>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation type="unfinished"></translation>
<translation>Envois</translation>
</message>
</context>
<context>
@ -189,187 +267,392 @@
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="86"/>
<location filename="../widget/friendwidget.cpp" line="48"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Copier l&apos;ID ami</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="87"/>
<location filename="../widget/friendwidget.cpp" line="49"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Inviter dans un groupe</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="97"/>
<location filename="../widget/friendwidget.cpp" line="59"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Supprimer ami</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<name>GeneralForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="49"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 personnes</translation>
<location filename="../widget/form/settings/generalform.cpp" line="26"/>
<source>General Settings</source>
<translation type="unfinished">Options Générales</translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<source>General Settings</source>
<translation type="vanished">Options Générales</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="146"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Inconnu&gt;</translation>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation type="vanished">Activer IPv6 (recommandé)</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="215"/>
<source>%1 users in chat</source>
<translation>%1 personnes</translation>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="vanished">Utiliser les traductions</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="234"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="vanished">Rendre Tox portable</translation>
</message>
<message>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="vanished">Sauvegarde les options dans le dossier courant au lieu du dossier de configuration habituel</translation>
</message>
<message>
<source>Theme</source>
<translation type="vanished">Thème</translation>
</message>
<message>
<source>Smiley Pack</source>
<translation type="vanished">Pack de smileys</translation>
</message>
</context>
<context>
<name>GeneralSettings</name>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="29"/>
<source>General Settings</source>
<translation type="unfinished">Options Générales</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="35"/>
<source>Use translations</source>
<extracomment>Text on a checkbox to enable translations</extracomment>
<translation type="unfinished">Utiliser les traductions</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="42"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<extracomment>describes makeToxPortable checkbox</extracomment>
<translation type="unfinished">Sauvegarde les options dans le dossier courant au lieu du dossier de configuration habituel</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="45"/>
<source>Make Tox portable</source>
<translation type="unfinished">Rendre Tox portable</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="55"/>
<source>Theme</source>
<translation type="unfinished">Thème</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="61"/>
<source>Smiley Pack</source>
<extracomment>Text on smiley pack label</extracomment>
<translation type="unfinished">Pack de smileys</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="74"/>
<source>Connection Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="80"/>
<source>Enable IPv6 (recommended)</source>
<extracomment>Text on a checkbox to enable IPv6</extracomment>
<translation type="unfinished">Activer IPv6 (recommandé)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="87"/>
<source>This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</source>
<extracomment>force tcp checkbox tooltip</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="90"/>
<source>Disable UDP (not recommended)</source>
<extracomment>Text on checkbox to disable UDP</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="97"/>
<source>Use proxy (SOCKS5)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="106"/>
<source>Address</source>
<extracomment>Text on proxy addr label</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="116"/>
<source>Port</source>
<extracomment>Text on proxy port label</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="149"/>
<location filename="../widget/form/genericchatform.cpp" line="155"/>
<source>Save chat log</source>
<translation>Sauvegarder l&apos;historique de conversation</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<name>GroupChatForm</name>
<message>
<location filename="../widget/groupwidget.cpp" line="54"/>
<location filename="../widget/groupwidget.cpp" line="141"/>
<location filename="../widget/form/groupchatform.cpp" line="47"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 personnes</translation>
</message>
<message>
<source>&lt;Unknown&gt;</source>
<translation type="vanished">&lt;Inconnu&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="85"/>
<source>%1 users in chat</source>
<translation>%1 personnes</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="56"/>
<location filename="../widget/groupwidget.cpp" line="143"/>
<source>Save chat log</source>
<translation type="vanished">Sauvegarder l&apos;historique de conversation</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="39"/>
<location filename="../widget/groupwidget.cpp" line="59"/>
<source>%1 users in chat</source>
<translation>%1 personnes</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="41"/>
<location filename="../widget/groupwidget.cpp" line="61"/>
<source>0 users in chat</source>
<translation>0 personnes</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="84"/>
<location filename="../widget/groupwidget.cpp" line="48"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Quitter le groupe</translation>
</message>
</context>
<context>
<name>IdentityForm</name>
<message>
<location filename="../widget/form/settings/identityform.cpp" line="29"/>
<source>Your identity</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<source>Public Information</source>
<translation type="vanished">Informations Publiques</translation>
</message>
<message>
<source>Name</source>
<comment>Username/nick</comment>
<translation type="vanished">Nom</translation>
</message>
<message>
<source>Status</source>
<comment>Status message</comment>
<translation type="vanished">Status</translation>
</message>
<message>
<source>Tox ID</source>
<translation type="vanished">ID Tox</translation>
</message>
<message>
<source>Your Tox ID</source>
<translation type="vanished">Votre ID Tox</translation>
</message>
</context>
<context>
<name>IdentitySettings</name>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="20"/>
<source>Public Information</source>
<translation type="unfinished">Informations Publiques</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="26"/>
<source>Name</source>
<translation type="unfinished">Nom</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="36"/>
<source>Status</source>
<translation type="unfinished">Status</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="49"/>
<source>Tox ID</source>
<translation type="unfinished">ID Tox</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="55"/>
<source>Your Tox ID (click to copy)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation type="unfinished"></translation>
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1918"/>
<location filename="../mainwindow.ui" line="859"/>
<source>Your name</source>
<translation type="unfinished">Votre nom</translation>
<translation>Votre nom</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2000"/>
<location filename="../mainwindow.ui" line="941"/>
<source>Your status</source>
<translation type="unfinished">Votre status</translation>
<translation>Votre status</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2566"/>
<location filename="../mainwindow.ui" line="1089"/>
<source>Add friends</source>
<translation type="unfinished"></translation>
<translation>Ajouter des amis</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2592"/>
<location filename="../mainwindow.ui" line="1115"/>
<source>Create a group chat</source>
<translation type="unfinished"></translation>
<translation>Creer un groupe</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2624"/>
<location filename="../mainwindow.ui" line="1147"/>
<source>View completed file transfers</source>
<translation type="unfinished"></translation>
<translation>Voir les transfers de fichiers terminés</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2656"/>
<location filename="../mainwindow.ui" line="1179"/>
<source>Change your settings</source>
<translation type="unfinished"></translation>
<translation>Changer les options</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3238"/>
<location filename="../mainwindow.ui" line="1761"/>
<source>Close</source>
<translation type="unfinished">Fermer</translation>
<translation>Fermer</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3241"/>
<location filename="../mainwindow.ui" line="1764"/>
<source>Ctrl+Q</source>
<translation type="unfinished">Ctrl+Q</translation>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>PrivacyForm</name>
<message>
<location filename="../widget/form/settings/privacyform.cpp" line="21"/>
<source>Privacy settings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="32"/>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Test vidéo Tox</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>qTox Settings</source>
<translation type="vanished">qTox Options</translation>
</message>
<message>
<source>General</source>
<translation type="vanished">General</translation>
</message>
<message>
<source>Identity</source>
<translation type="vanished">Identité</translation>
</message>
<message>
<source>Privacy</source>
<translation type="vanished">Vie Privée</translation>
</message>
<message>
<source>Audio/Video</source>
<translation type="vanished">Audio/Vidéo</translation>
</message>
<message>
<source>Ok</source>
<translation type="vanished">Ok</translation>
</message>
<message>
<source>Cancel</source>
<translation type="vanished">Annuler</translation>
</message>
<message>
<source>Apply</source>
<translation type="vanished">Appliquer</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="34"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Configuration</translation>
<translation type="vanished">Configuration</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="37"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Nom</translation>
<translation type="vanished">Nom</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="38"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Status</translation>
<translation type="vanished">Status</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="39"/>
<source>(click here to copy)</source>
<comment>Click on this text to copy TID to clipboard</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="47"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Tester la vidéo</translation>
<translation type="vanished">Tester la vidéo</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="48"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Activer IPv6 (recommandé)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="50"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="52"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="54"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="56"/>
<source>Smiley Pack</source>
<comment>Text on smiley pack label</comment>
<translation type="unfinished"></translation>
<translation type="vanished">Activer IPv6 (recommandé)</translation>
</message>
</context>
<context>
@ -395,22 +678,66 @@
<translation type="vanished">Ctrl+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="128"/>
<location filename="../widget/widget.cpp" line="88"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation type="unfinished">Connecté</translation>
<translation>Connecté</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="130"/>
<location filename="../widget/widget.cpp" line="90"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation type="unfinished">Indisponnible</translation>
<translation>Indisponnible</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="132"/>
<location filename="../widget/widget.cpp" line="92"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation type="unfinished">Occupé</translation>
<translation>Occupé</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="225"/>
<source>Choose a profile picture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<location filename="../widget/widget.cpp" line="239"/>
<location filename="../widget/widget.cpp" line="260"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<source>Unable to open this file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="239"/>
<source>Unable to read this image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="260"/>
<source>This image is too big</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="287"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="296"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="611"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Inconnu&gt;</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -1,75 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT">
<context>
<name>AVForm</name>
<message>
<location filename="../widget/form/settings/avform.cpp" line="22"/>
<source>Audio/Video settings</source>
<translation>Impostazioni Audio/Video</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="41"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation>Ferma webcam</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="47"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation>Prova webcam</translation>
</message>
</context>
<context>
<name>AVSettings</name>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="14"/>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="20"/>
<source>Video settings</source>
<translation>Impostazioni Video</translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="26"/>
<source>Show video preview</source>
<translation>Prova webcam</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="32"/>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Aggiungi Contatto</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="35"/>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="36"/>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Messaggio</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Invia richiesta d&apos;amicizia</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Permettimi di aggiungerti alla mia lista contatti</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="93"/>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Inserisci un Tox ID valido</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="110"/>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Non puoi aggiungere te stesso come contatto!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Questo indirizzo non esiste</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="114"/>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Errore nel consultare il server DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Numero inaspettato di text-records</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Numero inaspettato di valori nel text-record</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="133"/>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La risposta del server DNS non contiene nessun Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La risposta del server DNS non contiene un Tox ID valido</translation>
@ -78,27 +122,41 @@
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="73"/>
<location filename="../widget/form/chatform.cpp" line="105"/>
<source>Send a file</source>
<translation>Invia un file</translation>
</message>
</context>
<context>
<name>Core</name>
<message>
<location filename="../core.cpp" line="1068"/>
<source>Encrypted profile</source>
<translation>Profilo criptato</translation>
</message>
<message>
<location filename="../core.cpp" line="1069"/>
<source>Your tox profile seems to be encrypted, qTox can&apos;t open it
Do you want to erase this profile ?</source>
<translation>Il tuo profilo Tox sembra essere criptato, qTox non può aprirlo\nVuoi eliminare questo profilo?</translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="162"/>
<location filename="../filetransferinstance.cpp" line="208"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Salva file</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="173"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Errore</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="173"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Non hai sufficienti permessi per scrivere in questa locazione. Scegli un&apos;altra posizione, o annulla il salvataggio.</translation>
@ -107,18 +165,18 @@
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="25"/>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Files Trasferiti</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="33"/>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation>Ricevuti</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="34"/>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation>Inviati</translation>
</message>
@ -162,29 +220,118 @@
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="83"/>
<location filename="../widget/friendwidget.cpp" line="48"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Copia Tox ID del contatto</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="84"/>
<location filename="../widget/friendwidget.cpp" line="49"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Invita nel gruppo</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="94"/>
<location filename="../widget/friendwidget.cpp" line="59"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Rimuovi contatto</translation>
</message>
</context>
<context>
<name>GeneralForm</name>
<message>
<location filename="../widget/form/settings/generalform.cpp" line="26"/>
<source>General Settings</source>
<translation>Impostazioni Generali</translation>
</message>
</context>
<context>
<name>GeneralSettings</name>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="14"/>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="29"/>
<source>General Settings</source>
<translation>Impostazioni Generali</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="74"/>
<source>Connection Settings</source>
<translation>Impostazioni Connessione</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="80"/>
<source>Enable IPv6 (recommended)</source>
<extracomment>Text on a checkbox to enable IPv6</extracomment>
<translation>Abilita IPv6 (consigliato)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="35"/>
<source>Use translations</source>
<extracomment>Text on a checkbox to enable translations</extracomment>
<translation>Abilita traduzioni</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="42"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<extracomment>describes makeToxPortable checkbox</extracomment>
<translation>Slava le impostazioni nella directory di lavoro corrente, invece della directory di default</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="45"/>
<source>Make Tox portable</source>
<translation>Rendi qTox portabile</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="55"/>
<source>Theme</source>
<translation>Impostazioni Tema</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="61"/>
<source>Smiley Pack</source>
<extracomment>Text on smiley pack label</extracomment>
<translation>Emoticons</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="97"/>
<source>Use proxy (SOCKS5)</source>
<translation>Usa proxy (SOCKS5)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="106"/>
<source>Address</source>
<extracomment>Text on proxy addr label</extracomment>
<translation>IP</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="116"/>
<source>Port</source>
<extracomment>Text on proxy port label</extracomment>
<translation>Porta</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="90"/>
<source>Disable UDP (not recommended)</source>
<extracomment>Text on checkbox to disable UDP</extracomment>
<translation>Disabilita connessioni UDP (non raccomandato)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="87"/>
<source>This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</source>
<extracomment>force tcp checkbox tooltip</extracomment>
<translation>Questo permette di usare qTox con Tor; tuttavia aggiunge carico alla rete Tox, quindi usalo solo se necessario.</translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="158"/>
<location filename="../widget/form/genericchatform.cpp" line="164"/>
<location filename="../widget/form/genericchatform.cpp" line="149"/>
<location filename="../widget/form/genericchatform.cpp" line="155"/>
<source>Save chat log</source>
<translation>Salva il log della chat</translation>
</message>
@ -192,18 +339,13 @@
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="39"/>
<location filename="../widget/form/groupchatform.cpp" line="47"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 utenti in chat</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="81"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Sconosciuto&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="88"/>
<location filename="../widget/form/groupchatform.cpp" line="85"/>
<source>%1 users in chat</source>
<translation>%1 utenti in chat</translation>
</message>
@ -211,24 +353,65 @@
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="58"/>
<location filename="../widget/groupwidget.cpp" line="100"/>
<location filename="../widget/groupwidget.cpp" line="39"/>
<location filename="../widget/groupwidget.cpp" line="59"/>
<source>%1 users in chat</source>
<translation>%1 utenti in chat</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="60"/>
<location filename="../widget/groupwidget.cpp" line="102"/>
<location filename="../widget/groupwidget.cpp" line="41"/>
<location filename="../widget/groupwidget.cpp" line="61"/>
<source>0 users in chat</source>
<translation>0 utenti in chat</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="83"/>
<location filename="../widget/groupwidget.cpp" line="48"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Esci dal gruppo</translation>
</message>
</context>
<context>
<name>IdentityForm</name>
<message>
<location filename="../widget/form/settings/identityform.cpp" line="29"/>
<source>Your identity</source>
<translation>Il tuo profilo</translation>
</message>
</context>
<context>
<name>IdentitySettings</name>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="14"/>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="20"/>
<source>Public Information</source>
<translation>Informazioni Pubbliche</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="26"/>
<source>Name</source>
<translation>Nome</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="36"/>
<source>Status</source>
<translation>Stato</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="49"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="55"/>
<source>Your Tox ID (click to copy)</source>
<translation>(clicca qui per copiare)</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -237,137 +420,126 @@
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1918"/>
<location filename="../mainwindow.ui" line="859"/>
<source>Your name</source>
<translation>qTox User</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2000"/>
<location filename="../mainwindow.ui" line="941"/>
<source>Your status</source>
<translation>Toxing on qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2566"/>
<location filename="../mainwindow.ui" line="1089"/>
<source>Add friends</source>
<translation>Aggiungi contatto</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2592"/>
<location filename="../mainwindow.ui" line="1115"/>
<source>Create a group chat</source>
<translation>Crea un gruppo</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2624"/>
<location filename="../mainwindow.ui" line="1147"/>
<source>View completed file transfers</source>
<translation>Visualizza i trasferimenti completati</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2656"/>
<location filename="../mainwindow.ui" line="1179"/>
<source>Change your settings</source>
<translation>Cambia le impostazioni</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3238"/>
<location filename="../mainwindow.ui" line="1761"/>
<source>Close</source>
<translation>Chiudi</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3241"/>
<location filename="../mainwindow.ui" line="1764"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>PrivacyForm</name>
<message>
<location filename="../widget/form/settings/privacyform.cpp" line="21"/>
<source>Privacy settings</source>
<translation>Impostazioni privacy</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="30"/>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>qTox video test</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="34"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Impostazioni</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="37"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Nome</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="38"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Stato</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="39"/>
<source>(click here to copy)</source>
<comment>Click on this text to copy TID to clipboard</comment>
<translation>(clicca qui per copiare)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="47"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Prova la webcam</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="48"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Abilita IPv6 (consigliato)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="50"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation>Abilita traduzioni</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="52"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation>Rendi qTox portabile</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="54"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation>Slava le impostazioni nella directory di lavoro corrente, invece della directory di default</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="56"/>
<source>Smiley Pack</source>
<comment>Text on smiley pack label</comment>
<translation>Emoticons</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget/widget.cpp" line="129"/>
<location filename="../widget/widget.cpp" line="88"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>Online</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="131"/>
<location filename="../widget/widget.cpp" line="90"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation>Assente</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="133"/>
<location filename="../widget/widget.cpp" line="92"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Occupato</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="225"/>
<source>Choose a profile picture</source>
<translation>Scegli un&apos;immagine per il profilo</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<location filename="../widget/widget.cpp" line="239"/>
<location filename="../widget/widget.cpp" line="260"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<source>Unable to open this file</source>
<translation>Impossibile aprire il file</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="239"/>
<source>Unable to read this image</source>
<translation>Impossibile leggere l&apos;immagine</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="260"/>
<source>This image is too big</source>
<translation>L&apos;immagine è troppo grande</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="287"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation>Impossibile avviare Toxcore.\nqTox terminerà dopo che avrai chiuso questo messaggio.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="296"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation>Impossibile avviare Toxcore con le tue impostazione proxy.\nqTox non può funzionare correttamente, per favore modifica le impostazioni e riavvia il programma.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="611"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Sconosciuto&gt;</translation>
</message>
</context>
</TS>

BIN
translations/mannol.qm Normal file

Binary file not shown.

458
translations/mannol.ts Normal file
View File

@ -0,0 +1,458 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>AVPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="132"/>
<source>Video Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="136"/>
<location filename="../widget/settingsdialog.cpp" line="163"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="157"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="80"/>
<source>Send a file</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="191"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="202"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation>Ayy ! You have mothafucking friend request you little bitch !</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="84"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="85"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="95"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="31"/>
<source>General Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="34"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="36"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="38"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="39"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="48"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="49"/>
<source>Smiley Pack</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="142"/>
<location filename="../widget/form/genericchatform.cpp" line="148"/>
<source>Save chat log</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="41"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="83"/>
<source>&lt;Unknown&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="90"/>
<source>%1 users in chat</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="58"/>
<location filename="../widget/groupwidget.cpp" line="100"/>
<source>%1 users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="60"/>
<location filename="../widget/groupwidget.cpp" line="102"/>
<source>0 users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="83"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="82"/>
<source>Public Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="83"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="85"/>
<source>Status</source>
<comment>Status message</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="95"/>
<source>Tox ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="96"/>
<source>Your Tox ID</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1918"/>
<source>Your name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2000"/>
<source>Your status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2566"/>
<source>Add friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2592"/>
<source>Create a group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2624"/>
<source>View completed file transfers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2656"/>
<source>Change your settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3238"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3241"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="197"/>
<source>qTox Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="224"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="230"/>
<source>Identity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="236"/>
<source>Privacy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="242"/>
<source>Audio/Video</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="251"/>
<source>Ok</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="252"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="253"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget/widget.cpp" line="133"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="135"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="137"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="605"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
translations/pirate.qm Normal file

Binary file not shown.

545
translations/pirate.ts Normal file
View File

@ -0,0 +1,545 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_PIRATE">
<context>
<name>AVForm</name>
<message>
<location filename="../widget/form/settings/avform.cpp" line="22"/>
<source>Audio/Video settings</source>
<translation type="unfinished">Hollerin&apos;/Crystals o&apos; Far-Seein&apos; settings</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="41"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="unfinished">Hide crystals o&apos; Far-Seein&apos; preview</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="47"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="unfinished">See crystals o&apos; Far-Seein&apos; preview</translation>
</message>
</context>
<context>
<name>AVSettings</name>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="20"/>
<source>Video settings</source>
<translation type="unfinished">Crystals o&apos; Far-Seein&apos; settings</translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="26"/>
<source>Show video preview</source>
<translation type="unfinished">See crystals o&apos; Far-Seein&apos; preview</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Recruit yer crew</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation type="unfinished">Parchment Bottle of recruiting</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation type="unfinished">Send recruitment letter</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation type="unfinished">Tox, arrr?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation type="unfinished">Throw in here Tox ID, but a rightful one!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation type="unfinished">Yer cannot add yerself in yer crew!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished">Recruitment address yer usin&apos; ain&apos;t there</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation type="unfinished">DNS witchery errored upon looking</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation type="unfinished">All numbery that DNS brought upon was unexpectable</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation type="unfinished">All things </translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="105"/>
<source>Send a file</source>
<translation type="unfinished">Send treasure</translation>
</message>
</context>
<context>
<name>Core</name>
<message>
<location filename="../core.cpp" line="1068"/>
<source>Encrypted profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../core.cpp" line="1069"/>
<source>Your tox profile seems to be encrypted, qTox can&apos;t open it
Do you want to erase this profile ?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="208"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation type="unfinished">Receive treasure</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation type="unfinished">Cannot bury treasure here</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation type="unfinished">Captain did&apos;t give permission bury that treasure here! Find another location or abandon hope of keepin&apos; it.</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation type="unfinished">Treasures given/received</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation type="unfinished">Received</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation type="unfinished">Sent</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translation type="unfinished">Recruitment</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation type="unfinished">Arr</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation type="unfinished">No</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="48"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="49"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation type="unfinished">Recruit in group</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="59"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation type="unfinished">Throw out traitor</translation>
</message>
</context>
<context>
<name>GeneralForm</name>
<message>
<location filename="../widget/form/settings/generalform.cpp" line="26"/>
<source>General Settings</source>
<translation type="unfinished">O&apos; ship settings</translation>
</message>
</context>
<context>
<name>GeneralSettings</name>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="29"/>
<source>General Settings</source>
<translation type="unfinished">O&apos; ship settings</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="35"/>
<source>Use translations</source>
<extracomment>Text on a checkbox to enable translations</extracomment>
<translation type="unfinished">Linguistics use</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="42"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<extracomment>describes makeToxPortable checkbox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="45"/>
<source>Make Tox portable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="55"/>
<source>Theme</source>
<translation type="unfinished">Lookin&apos;</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="61"/>
<source>Smiley Pack</source>
<extracomment>Text on smiley pack label</extracomment>
<translation type="unfinished">Teeth showin&apos; box</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="74"/>
<source>Connection Settings</source>
<translation type="unfinished">Sailin&apos; setting</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="80"/>
<source>Enable IPv6 (recommended)</source>
<extracomment>Text on a checkbox to enable IPv6</extracomment>
<translation type="unfinished">Use IPv6 (good for ya)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="87"/>
<source>This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</source>
<extracomment>force tcp checkbox tooltip</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="90"/>
<source>Disable UDP (not recommended)</source>
<extracomment>Text on checkbox to disable UDP</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="97"/>
<source>Use proxy (SOCKS5)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="106"/>
<source>Address</source>
<extracomment>Text on proxy addr label</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="116"/>
<source>Port</source>
<extracomment>Text on proxy port label</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="149"/>
<location filename="../widget/form/genericchatform.cpp" line="155"/>
<source>Save chat log</source>
<translation type="unfinished">Write log of yer talkin&apos;</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="47"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation type="unfinished">%1 mates in chat</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="85"/>
<source>%1 users in chat</source>
<translation type="unfinished">%1 mates in chat</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="39"/>
<location filename="../widget/groupwidget.cpp" line="59"/>
<source>%1 users in chat</source>
<translation type="unfinished">%1 mates in chat</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="41"/>
<location filename="../widget/groupwidget.cpp" line="61"/>
<source>0 users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="48"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentityForm</name>
<message>
<location filename="../widget/form/settings/identityform.cpp" line="29"/>
<source>Your identity</source>
<translation type="unfinished">Yer self</translation>
</message>
</context>
<context>
<name>IdentitySettings</name>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="20"/>
<source>Public Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="26"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="36"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="49"/>
<source>Tox ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="55"/>
<source>Your Tox ID (click to copy)</source>
<translation type="unfinished">Yer Tox ID (hit to steal)</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="859"/>
<source>Your name</source>
<translation>Yer name</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="941"/>
<source>Your status</source>
<translation>Yer status</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1089"/>
<source>Add friends</source>
<translation>Recruit crew</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1115"/>
<source>Create a group chat</source>
<translation>Make a chat with yer mates</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1147"/>
<source>View completed file transfers</source>
<translation>See treasures given and received</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1179"/>
<source>Change your settings</source>
<translation>Change yer setting&apos;</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1761"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1764"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PrivacyForm</name>
<message>
<location filename="../widget/form/settings/privacyform.cpp" line="21"/>
<source>Privacy settings</source>
<translation>Secrecy settin&apos;</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Tox crystals o&apos; Far-Seein&apos; test</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget/widget.cpp" line="88"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="90"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="92"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="225"/>
<source>Choose a profile picture</source>
<translation>Choose yer flag</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<location filename="../widget/widget.cpp" line="239"/>
<location filename="../widget/widget.cpp" line="260"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<source>Unable to open this file</source>
<translation>Treasure cannot be opened</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="239"/>
<source>Unable to read this image</source>
<translation type="unfinished">Cannot see treasure</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="260"/>
<source>This image is too big</source>
<translation type="unfinished">Yer flag too big</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="287"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="296"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="611"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
translations/pl.qm Normal file

Binary file not shown.

667
translations/pl.ts Normal file
View File

@ -0,0 +1,667 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="pl_PL">
<context>
<name>AVForm</name>
<message>
<location filename="../widget/form/settings/avform.cpp" line="22"/>
<source>Audio/Video settings</source>
<translation>Ustawienia audio/video</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="41"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation>Ukryj podgląd wideo</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="47"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation>Pokaż podgląd wideo</translation>
</message>
</context>
<context>
<name>AVPage</name>
<message>
<source>Video Settings</source>
<translation type="obsolete">Ustawienia wideo</translation>
</message>
<message>
<source>Show video preview</source>
<comment>On a button</comment>
<translation type="obsolete">Pokaż podgląd wideo</translation>
</message>
<message>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation type="obsolete">Ukryj podgląd wideo</translation>
</message>
</context>
<context>
<name>AVSettings</name>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="20"/>
<source>Video settings</source>
<translation>Ustawienia wideo</translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="26"/>
<source>Show video preview</source>
<translation>Pokaż podgląd wideo</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Dodaj znajomych</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Wiadomość</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Wyślij zapytanie do znajomego</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Może Tox ze mną?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Proszę wpisać poprawny Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Nie możesz dodać siebie jako znajomego!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Ten adres nie istnieje</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Błąd podczas sprawdzania DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Nieoczekiwana liczba wpisów tekstowych</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Nieoczekiwana liczba wartości we wpisie tekstowym</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>DNS nie zawiera żadnego Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>DNS nie zawiera poprawnego Tox ID</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="105"/>
<source>Send a file</source>
<translation>Wyślij plik</translation>
</message>
</context>
<context>
<name>Core</name>
<message>
<location filename="../core.cpp" line="1068"/>
<source>Encrypted profile</source>
<translation>Zaszyfrowany profil</translation>
</message>
<message>
<location filename="../core.cpp" line="1069"/>
<source>Your tox profile seems to be encrypted, qTox can&apos;t open it
Do you want to erase this profile ?</source>
<translation>Twój profil zdaje się być zaszyfrowany, qTox nie jest w stanie go otworzyć
Czy chcesz usunąć ten profil ?</translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="208"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Zapisz plik</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Nie można zapisać w lokacji</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Nie masz uprawnienia by zapisać w tej lokacji. Wybierz inną lub anuluj zapis.</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Przesłane pliki</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation>Pobrane</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation>Wysłane</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translatorcomment>no idea how it shoule be translated</translatorcomment>
<translation>Zapytanie znajomego</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation>Ktoś chce być twoim znajomym</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation>ID użytkownika:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translatorcomment>better wording needed?</translatorcomment>
<translation>Wiadomość w zapytaniu do znajomej/go:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation>Zaakceptuj</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation>Odrzuć</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="48"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Kopiuj ID znajomej/go</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="49"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Zaproś do grupy</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="59"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Usuń znajomego</translation>
</message>
</context>
<context>
<name>GeneralForm</name>
<message>
<location filename="../widget/form/settings/generalform.cpp" line="26"/>
<source>General Settings</source>
<translation>Główne ustawienia</translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<source>General Settings</source>
<translation type="obsolete">Główne ustawienia</translation>
</message>
<message>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation type="obsolete">Użyj IPv6 (rekomendowane)</translation>
</message>
<message>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation type="obsolete">Użyj tłumaczenia</translation>
</message>
<message>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation type="obsolete">Zrób Tox przenośnym</translation>
</message>
<message>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="obsolete">Zamiast domyślnego katalogu użyj obecnego do zapisania ustawień</translation>
</message>
<message>
<source>Theme</source>
<translation type="obsolete">Motyw</translation>
</message>
<message>
<source>Smiley Pack</source>
<translatorcomment>needs better translation</translatorcomment>
<translation type="obsolete">Paczka uśmiechów</translation>
</message>
</context>
<context>
<name>GeneralSettings</name>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="29"/>
<source>General Settings</source>
<translation>Główne ustawienia</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="35"/>
<source>Use translations</source>
<extracomment>Text on a checkbox to enable translations</extracomment>
<translation>Użyj tłumaczenia</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="42"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<extracomment>describes makeToxPortable checkbox</extracomment>
<translation>Zamiast domyślnego katalogu użyj obecnego do zapisania ustawień</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="45"/>
<source>Make Tox portable</source>
<translation>Zrób Tox przenośnym</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="55"/>
<source>Theme</source>
<translation>Motyw</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="61"/>
<source>Smiley Pack</source>
<extracomment>Text on smiley pack label</extracomment>
<translatorcomment>better translation? anyone?</translatorcomment>
<translation>Paczka uśmiechów</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="74"/>
<source>Connection Settings</source>
<translation>Ustawienia połączenia</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="80"/>
<source>Enable IPv6 (recommended)</source>
<extracomment>Text on a checkbox to enable IPv6</extracomment>
<translation>Użyj IPv6 (rekomendowane)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="87"/>
<source>This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</source>
<extracomment>force tcp checkbox tooltip</extracomment>
<translation>To pozwala n.p. na toxowanie przez Tora. Niestety obciąża to sieć Tox, więc używaj tylko w razie potrzeby.</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="90"/>
<source>Disable UDP (not recommended)</source>
<extracomment>Text on checkbox to disable UDP</extracomment>
<translation>Wyłącz UDP (nie rekomendowane)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="97"/>
<source>Use proxy (SOCKS5)</source>
<translation>Użyj proxy (SOCKS5)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="106"/>
<source>Address</source>
<extracomment>Text on proxy addr label</extracomment>
<translation>Adres</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="116"/>
<source>Port</source>
<extracomment>Text on proxy port label</extracomment>
<translation>Port</translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="149"/>
<location filename="../widget/form/genericchatform.cpp" line="155"/>
<source>Save chat log</source>
<translation>Zapisz historię rozmowy</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="47"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 użytkowników w czacie</translation>
</message>
<message>
<source>&lt;Unknown&gt;</source>
<translation type="obsolete">&lt;Nieznany/a&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="85"/>
<source>%1 users in chat</source>
<translation>%1 użytkowników w czacie</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="39"/>
<location filename="../widget/groupwidget.cpp" line="59"/>
<source>%1 users in chat</source>
<translation>%1 użytkowników w czacie</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="41"/>
<location filename="../widget/groupwidget.cpp" line="61"/>
<source>0 users in chat</source>
<translation>0 użytkowników w czacie</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="48"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Opuść grupę</translation>
</message>
</context>
<context>
<name>IdentityForm</name>
<message>
<location filename="../widget/form/settings/identityform.cpp" line="29"/>
<source>Your identity</source>
<translation>Twoja tożsamość</translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<source>Public Information</source>
<translation type="obsolete">Informacja publiczna</translation>
</message>
<message>
<source>Name</source>
<comment>Username/nick</comment>
<translation type="obsolete">Nick</translation>
</message>
<message>
<source>Status</source>
<comment>Status message</comment>
<translation type="obsolete">Status</translation>
</message>
<message>
<source>Tox ID</source>
<translation type="obsolete">Tox ID</translation>
</message>
<message>
<source>Your Tox ID</source>
<translation type="obsolete">Twój Tox ID</translation>
</message>
</context>
<context>
<name>IdentitySettings</name>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="20"/>
<source>Public Information</source>
<translation>Informacja publiczna</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="26"/>
<source>Name</source>
<translation>Nick</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="36"/>
<source>Status</source>
<translation>Status</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="49"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="55"/>
<source>Your Tox ID (click to copy)</source>
<translation>Twój Tox ID (kliknij by skopiować)</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="859"/>
<source>Your name</source>
<translation>Twój nick</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="941"/>
<source>Your status</source>
<translation>Twój status</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1089"/>
<source>Add friends</source>
<translation>Dodaj znajomych</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1115"/>
<source>Create a group chat</source>
<translation>Utwórz czat grupowy</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1147"/>
<source>View completed file transfers</source>
<translation>Zobacz zakończone transfery plików</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1179"/>
<source>Change your settings</source>
<translatorcomment>translated as &quot;change settings&quot;; seems to be simpler this way</translatorcomment>
<translation>Zmień ustawienia</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1761"/>
<source>Close</source>
<translation>Zamknij</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1764"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>PrivacyForm</name>
<message>
<location filename="../widget/form/settings/privacyform.cpp" line="21"/>
<source>Privacy settings</source>
<translation>Ustawienia prywatności</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Tox test wideo</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>qTox Settings</source>
<translation type="obsolete">qTox Ustawienia</translation>
</message>
<message>
<source>General</source>
<translation type="obsolete">Główne</translation>
</message>
<message>
<source>Identity</source>
<translation type="obsolete">Tożsamość</translation>
</message>
<message>
<source>Privacy</source>
<translation type="obsolete">Prywatność</translation>
</message>
<message>
<source>Audio/Video</source>
<translation type="obsolete">Audio/Wideo</translation>
</message>
<message>
<source>Ok</source>
<translation type="obsolete">Ok</translation>
</message>
<message>
<source>Cancel</source>
<translation type="obsolete">Anuluj</translation>
</message>
<message>
<source>Apply</source>
<translation type="obsolete">Zastosuj</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget/widget.cpp" line="88"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>Online</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="90"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation>Nieobecny/a</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="92"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Zajęty/a</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="225"/>
<source>Choose a profile picture</source>
<translation>Wybierz obrazek profilu</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<location filename="../widget/widget.cpp" line="239"/>
<location filename="../widget/widget.cpp" line="260"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<source>Unable to open this file</source>
<translation>Nie można otworzyć tego pliku</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="239"/>
<source>Unable to read this image</source>
<translation>Nie można odczytać tego obrazka</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="260"/>
<source>This image is too big</source>
<translation>Ten obrazek jest zbyt wielki</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="287"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation>Nie udało się uruchomić Toxcore, aplikacja zamknie się po zamknięciu tej wiadomości.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="296"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation>Nie udało się uruchomić toxcore z twoimi ustawieniami proxy. qTox nie może działać, proszę zmodyfikuj ustawienia i zrestartuj.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="611"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Nieznany/a&gt;</translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -1,153 +1,188 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<TS version="2.0" language="ru_RU">
<context>
<name>AVForm</name>
<message>
<location filename="../widget/form/settings/avform.cpp" line="22"/>
<source>Audio/Video settings</source>
<translation>Настройки аудио/видео</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="41"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation>Спрятать видео-превью</translation>
</message>
<message>
<location filename="../widget/form/settings/avform.cpp" line="47"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation>Посмотреть видео-превью</translation>
</message>
</context>
<context>
<name>AVSettings</name>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="14"/>
<location filename="../ui_avsettings.h" line="65"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="20"/>
<location filename="../ui_avsettings.h" line="66"/>
<source>Video settings</source>
<translation>Настройки видео</translation>
</message>
<message>
<location filename="../widget/form/settings/avsettings.ui" line="26"/>
<location filename="../ui_avsettings.h" line="67"/>
<source>Show video preview</source>
<translation>Посмотреть видео-превью</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="32"/>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Добавление друзей</translation>
<translation>Добавить друзей</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="35"/>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="36"/>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Сообщение</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translatorcomment>Мне не нравится, но другого не придумал, и фейсбук использует это</translatorcomment>
<translation>Отправить запрос на добавление в друзья</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translatorcomment>Вот таким нехитрым и незамысловатым образом решаются сложные переводчиские проблемы</translatorcomment>
<translation>Добавь меня, а?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="93"/>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Пожалуйста, введите корректный Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="110"/>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Вы не можете добавить себя как друга!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Нет такого адреса</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="114"/>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Ошибка при просмотре DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Непредвиденное количество текстовых записей</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Непредвиденное количество значений в текстовой записи</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="133"/>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>В ответе DNS ни одного Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Ответ DNS не содержит корректных Tox ID</translation>
</message>
</context>
<context>
<name>Camera</name>
<message>
<location filename="../widget/camera.cpp" line="161"/>
<source>Camera eror</source>
<translation>Ошибка камеры</translation>
</message>
<message>
<location filename="../widget/camera.cpp" line="162"/>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation>Формат камеры %1 не поддерживается, невозможно использовать камеру</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="283"/>
<location filename="../widget/form/chatform.cpp" line="105"/>
<source>Send a file</source>
<translation>Отправить файл</translation>
</message>
</context>
<context>
<name>Core</name>
<message>
<location filename="../widget/form/chatform.cpp" line="620"/>
<location filename="../widget/form/chatform.cpp" line="626"/>
<source>Save chat log</source>
<translation>Сохранить лог чата</translation>
<location filename="../core.cpp" line="1064"/>
<source>Encrypted profile</source>
<translation>Зашифрованный профиль</translation>
</message>
<message>
<location filename="../core.cpp" line="1065"/>
<source>Your tox profile seems to be encrypted, qTox can&apos;t open it
Do you want to erase this profile ?</source>
<translation>Похоже, ваш tox-профиль зашифрован, qTox не может открыть его
Вы хотите удалить этот профиль?</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<name>FileTransferInstance</name>
<message>
<location filename="../widget/tool/copyableelidelabel.cpp" line="29"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="281"/>
<location filename="../filetransferinstance.cpp" line="208"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Сохранить файл</translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation type="unfinished"></translation>
<translation>Непригодная для записи локация</translation>
</message>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="292"/>
<location filename="../filetransferinstance.cpp" line="219"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation type="unfinished"></translation>
<translation>У вас нет прав записи в эту локацию. Выберете другую или закройте диалог сохранения.</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="25"/>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Переданные файлы</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="33"/>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation>Загрузки</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="34"/>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation>Выгрузки</translation>
</message>
@ -193,246 +228,362 @@
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="86"/>
<location filename="../widget/friendwidget.cpp" line="48"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Копировать ID друга</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="87"/>
<location filename="../widget/friendwidget.cpp" line="49"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Пригласить в группу</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="97"/>
<location filename="../widget/friendwidget.cpp" line="59"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Удалить друга</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<name>GeneralForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="49"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 пользователей в чате</translation>
<location filename="../widget/form/settings/generalform.cpp" line="26"/>
<source>General Settings</source>
<translation>Общие настройки</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="146"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Неизвестно&gt;</translation>
<location filename="../widget/form/settings/generalform.cpp" line="100"/>
<source>Bad port</source>
<comment>title of bad port popup</comment>
<translation>Неправильный порт</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="215"/>
<source>%1 users in chat</source>
<translation>%1 пользователей в чате</translation>
<location filename="../widget/form/settings/generalform.cpp" line="100"/>
<source>The port you entered is invalid; please enter another.</source>
<comment>text of bad port popup</comment>
<translation>Введёный порт неверен; введите другой.</translation>
</message>
</context>
<context>
<name>GeneralSettings</name>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="14"/>
<location filename="../ui_generalsettings.h" line="154"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="234"/>
<location filename="../widget/form/settings/generalsettings.ui" line="29"/>
<location filename="../ui_generalsettings.h" line="155"/>
<source>General Settings</source>
<translation>Общие настройки</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="35"/>
<location filename="../ui_generalsettings.h" line="156"/>
<source>Enable IPv6 (recommended)</source>
<extracomment>Text on a checkbox to enable IPv6</extracomment>
<translation>Включить IPv6 (рекомендуется)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="42"/>
<location filename="../ui_generalsettings.h" line="157"/>
<source>Use translations</source>
<extracomment>Text on a checkbox to enable translations</extracomment>
<translation>Использовать перевод</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="49"/>
<location filename="../ui_generalsettings.h" line="159"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<extracomment>describes makeToxPortable checkbox</extracomment>
<translation>Сохранять настройки в рабочую директорию вместо страндартной папки настроек</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="52"/>
<location filename="../ui_generalsettings.h" line="161"/>
<source>Make Tox portable</source>
<translation>Портативный режим</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="62"/>
<location filename="../ui_generalsettings.h" line="162"/>
<source>Theme</source>
<translation>Тема</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="68"/>
<location filename="../ui_generalsettings.h" line="163"/>
<source>Smiley Pack</source>
<extracomment>Text on smiley pack label</extracomment>
<translation>Набор смайликов</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="81"/>
<location filename="../ui_generalsettings.h" line="164"/>
<source>Proxy settings</source>
<translation>Настройки прокси</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="87"/>
<location filename="../ui_generalsettings.h" line="165"/>
<source>Disable UDP (not recommended)</source>
<extracomment>Text on checkbox to disable UDP</extracomment>
<translation>Выключить UDP (не рекомендуется)</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="90"/>
<location filename="../ui_generalsettings.h" line="167"/>
<source>This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</source>
<extracomment>force tcp checkbox tooltip</extracomment>
<translation>Это позволяет, например, использовать tox поверх Tor. Однако это добавляет нагрузку на сеть Tox, так что используйте только в случае необходимости.</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="99"/>
<location filename="../ui_generalsettings.h" line="169"/>
<source>Proxy address</source>
<extracomment>Text on proxy addr label</extracomment>
<translation>Адрес прокси</translation>
</message>
<message>
<location filename="../widget/form/settings/generalsettings.ui" line="106"/>
<location filename="../ui_generalsettings.h" line="170"/>
<source>Proxy port</source>
<extracomment>Text on proxy port label</extracomment>
<translation>Порт прокси</translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="149"/>
<location filename="../widget/form/genericchatform.cpp" line="155"/>
<source>Save chat log</source>
<translation>Сохранить лог чата</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="47"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 пользователей в чате</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="85"/>
<source>%1 users in chat</source>
<translation>%1 пользователей в чате</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="84"/>
<location filename="../widget/groupwidget.cpp" line="48"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Покинуть группу</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="54"/>
<location filename="../widget/groupwidget.cpp" line="141"/>
<location filename="../widget/groupwidget.cpp" line="39"/>
<location filename="../widget/groupwidget.cpp" line="59"/>
<source>%1 users in chat</source>
<translation>%1 пользователей в чате</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="56"/>
<location filename="../widget/groupwidget.cpp" line="143"/>
<location filename="../widget/groupwidget.cpp" line="41"/>
<location filename="../widget/groupwidget.cpp" line="61"/>
<source>0 users in chat</source>
<translation>Ни одного пользователя в чате</translation>
</message>
</context>
<context>
<name>IdentityForm</name>
<message>
<location filename="../widget/form/settings/identityform.cpp" line="29"/>
<source>Your identity</source>
<translation>Ваша идентификация</translation>
</message>
</context>
<context>
<name>IdentitySettings</name>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="14"/>
<location filename="../ui_identitysettings.h" line="100"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="20"/>
<location filename="../ui_identitysettings.h" line="101"/>
<source>Public Information</source>
<translation>Публичные данные</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="26"/>
<location filename="../ui_identitysettings.h" line="102"/>
<source>Name</source>
<translation>Имя</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="36"/>
<location filename="../ui_identitysettings.h" line="103"/>
<source>Status</source>
<translation>Статус</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="49"/>
<location filename="../ui_identitysettings.h" line="104"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/settings/identitysettings.ui" line="55"/>
<location filename="../ui_identitysettings.h" line="105"/>
<source>Your Tox ID (click to copy)</source>
<translation>Ваш Tox ID (нажмите на него, чтобы скопировать)</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<location filename="../ui_mainwindow.h" line="492"/>
<source>qTox</source>
<translation type="unfinished"></translation>
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1918"/>
<location filename="../mainwindow.ui" line="859"/>
<location filename="../ui_mainwindow.h" line="495"/>
<source>Your name</source>
<translation type="unfinished">Ваше имя</translation>
<translation>Ваше имя</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2000"/>
<location filename="../mainwindow.ui" line="941"/>
<location filename="../ui_mainwindow.h" line="496"/>
<source>Your status</source>
<translation type="unfinished">Ваш статус</translation>
<translation>Ваш статус</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2566"/>
<location filename="../mainwindow.ui" line="1089"/>
<location filename="../ui_mainwindow.h" line="499"/>
<source>Add friends</source>
<translation type="unfinished">Добавить друзей</translation>
<translation>Добавить друзей</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2592"/>
<location filename="../mainwindow.ui" line="1115"/>
<location filename="../ui_mainwindow.h" line="503"/>
<source>Create a group chat</source>
<translation type="unfinished">Создать групповой чат</translation>
<translation>Создать групповой чат</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2624"/>
<location filename="../mainwindow.ui" line="1147"/>
<location filename="../ui_mainwindow.h" line="507"/>
<source>View completed file transfers</source>
<translation type="unfinished"></translation>
<translation>Завершённые файлопередачи</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2656"/>
<location filename="../mainwindow.ui" line="1179"/>
<location filename="../ui_mainwindow.h" line="511"/>
<source>Change your settings</source>
<translation type="unfinished">Изменить ваши настройки</translation>
<translation>Изменить ваши настройки</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3238"/>
<location filename="../mainwindow.ui" line="1761"/>
<location filename="../ui_mainwindow.h" line="493"/>
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
<translation>Закрыть</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3241"/>
<location filename="../mainwindow.ui" line="1764"/>
<location filename="../ui_mainwindow.h" line="494"/>
<source>Ctrl+Q</source>
<translation type="unfinished">Ctrl+Q</translation>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>PrivacyForm</name>
<message>
<location filename="../widget/form/settings/privacyform.cpp" line="21"/>
<source>Privacy settings</source>
<translation>Настройки приватности</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="32"/>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Проверка видео</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="34"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Пользовательские настройки</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="37"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Имя</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="38"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Статус</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="39"/>
<source>(click here to copy)</source>
<comment>Click on this text to copy TID to clipboard</comment>
<translation>(нажмите здесь чтобы скопировать)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="47"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Проверить видео</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="48"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Включить IPv6 (рекомендуется)</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="50"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translatorcomment>Так гораздо понятнее, чем «использовать переводы»</translatorcomment>
<translation>Русскоязычный интерфейс</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="52"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation>Портативный режим</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="54"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="56"/>
<source>Smiley Pack</source>
<comment>Text on smiley pack label</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<source>Tox</source>
<translation type="vanished">Tox</translation>
</message>
<message>
<source>Your name</source>
<translation type="vanished">Ваше имя</translation>
</message>
<message>
<source>Your status</source>
<translation type="vanished">Ваш статус</translation>
</message>
<message>
<source>Add friends</source>
<translation type="vanished">Добавить друзей</translation>
</message>
<message>
<source>Create a group chat</source>
<translation type="vanished">Создать групповой чат</translation>
</message>
<message>
<source>(button inactive currently)</source>
<translation type="vanished">(кнопка на данный момент неактивна)</translation>
</message>
<message>
<source>Change your settings</source>
<translation type="vanished">Изменить ваши настройки</translation>
</message>
<message>
<source>Close</source>
<translation type="vanished">Закрыть</translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation type="vanished">Ctrl+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="128"/>
<location filename="../widget/widget.cpp" line="88"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation type="unfinished">В сети</translation>
<translation>В сети</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="130"/>
<location filename="../widget/widget.cpp" line="90"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translatorcomment>Вероятно, это не столь долгое путешествие</translatorcomment>
<translation type="unfinished">Отошёл</translation>
<translation>Отошёл</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="132"/>
<location filename="../widget/widget.cpp" line="92"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation type="unfinished">Занят</translation>
<translation>Занят</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="225"/>
<source>Choose a profile picture</source>
<translation>Выбрать картинку для профиля</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<location filename="../widget/widget.cpp" line="239"/>
<location filename="../widget/widget.cpp" line="260"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="232"/>
<source>Unable to open this file</source>
<translation>Невозможно открыть файл</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="239"/>
<source>Unable to read this image</source>
<translation>Невозможно прочесть это изображение</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="260"/>
<source>This image is too big</source>
<translation>Это изображение слишком большое</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="287"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation>Не удалось запустить toxcore, приложение будет завершено после того как вы закроете это сообщение.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="296"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation>Не удалось запустить toxcore с вашими настройками прокси, qTox не может работать; измените ваши настройки и перезапустите его.</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="611"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Неизвестно&gt;</translation>
</message>
</context>
</TS>

BIN
translations/uk.qm Normal file

Binary file not shown.

485
translations/uk.ts Normal file
View File

@ -0,0 +1,485 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="uk_UA">
<context>
<name>AVPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="132"/>
<source>Video Settings</source>
<translation>Параметри відео</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="136"/>
<location filename="../widget/settingsdialog.cpp" line="163"/>
<source>Show video preview</source>
<comment>On a button</comment>
<translation>Показати вікно попереднього перегляду</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="157"/>
<source>Hide video preview</source>
<comment>On a button</comment>
<translation>Приховати вікно попереднього перегляду</translation>
</message>
</context>
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="34"/>
<source>Add Friends</source>
<translation>Додати друзів</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="37"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="38"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Повідомлення</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="39"/>
<source>Send friend request</source>
<translation>Надіслати запит на дружбу</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="40"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Може поспілкуємось?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Заповніть коректним Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="99"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Ви не можете додати самого себе до друзів!</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="116"/>
<source>This address does not exist</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Цієї адреси не існує</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="120"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Помилка під час перегляду DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="126"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Неочікуване число текстових записів</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="132"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Неочікуване число значень в текстових записах</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="139"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Відповідь DNS не містить жодного Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="145"/>
<location filename="../widget/form/addfriendform.cpp" line="151"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Відповідь DNS не містить жодного коректного Tox ID</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="88"/>
<source>Send a file</source>
<translation>Надіслати файл</translation>
</message>
</context>
<context>
<name>FileTransferInstance</name>
<message>
<location filename="../filetransferinstance.cpp" line="205"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Зберегти файл</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="216"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Немає прав на запис</translation>
</message>
<message>
<location filename="../filetransferinstance.cpp" line="216"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Ви не маєте прав на запис за цим розташуванням. Оберіть інше місце призначення, або скасуйте передачу.</translation>
</message>
</context>
<context>
<name>FilesForm</name>
<message>
<location filename="../widget/form/filesform.cpp" line="30"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Передані файли</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="38"/>
<source>Downloads</source>
<translation>Завантажені</translation>
</message>
<message>
<location filename="../widget/form/filesform.cpp" line="39"/>
<source>Uploads</source>
<translation>Вивантажені</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translation>Запит на дружбу</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation>Дехто хоче долучитися до переліку друзів з вами</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation>ID користувача:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation>Повідомлення запиту:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation>Прийняти</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation>Відхилити</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="90"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Копіювати дружній ID</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="91"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Запросити до групи</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="101"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Вилучити з друзів</translation>
</message>
</context>
<context>
<name>GeneralPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="31"/>
<source>General Settings</source>
<translation>Основні параметри</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="34"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Дозволити IPv6 (рекомендовано)</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="36"/>
<source>Use translations</source>
<comment>Text on a checkbox to enable translations</comment>
<translation>Використовувати мову системи</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="38"/>
<source>Make Tox portable</source>
<comment>Text on a checkbox to make qTox a portable application</comment>
<translation>Портативний запуск</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="39"/>
<source>Save settings to the working directory instead of the usual conf dir</source>
<comment>describes makeToxPortable checkbox</comment>
<translation>Зберігати налаштування в робочий теці</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="48"/>
<source>Theme</source>
<translation>Графічна тема</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="49"/>
<source>Smiley Pack</source>
<translation>Графічний пакунок емоційних картинок</translation>
</message>
</context>
<context>
<name>GenericChatForm</name>
<message>
<location filename="../widget/form/genericchatform.cpp" line="144"/>
<location filename="../widget/form/genericchatform.cpp" line="150"/>
<source>Save chat log</source>
<translation>Зберегти чат</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="45"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>Користувачів у чаті: %1</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="84"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Невідомо&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="91"/>
<source>%1 users in chat</source>
<translation>Користувачів у чаті: %1</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="60"/>
<location filename="../widget/groupwidget.cpp" line="102"/>
<source>%1 users in chat</source>
<translation>Користувачів у чаті: %1</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="62"/>
<location filename="../widget/groupwidget.cpp" line="104"/>
<source>0 users in chat</source>
<translation>Немає користувачів</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="85"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Вийти з групи</translation>
</message>
</context>
<context>
<name>IdentityPage</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="82"/>
<source>Public Information</source>
<translation>Публічна інформація</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="83"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Ім&apos;я</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="85"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Статус</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="95"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="96"/>
<source>Your Tox ID</source>
<translation>Ваш Tox ID</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>qTox</source>
<translation>qTox</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1909"/>
<source>Your name</source>
<translation>Ваше ім&apos;я</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="1991"/>
<source>Your status</source>
<translation>Ваш статус</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2557"/>
<source>Add friends</source>
<translation>Додати друзів</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2583"/>
<source>Create a group chat</source>
<translation>Створити груповий чат</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2615"/>
<source>View completed file transfers</source>
<translation>Переглянути завершені передачі файлів</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="2647"/>
<source>Change your settings</source>
<translation>Змінити параметри</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3229"/>
<source>Close</source>
<translation>Закрити</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="3232"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="33"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Перевірка відео tox</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../widget/settingsdialog.cpp" line="197"/>
<source>qTox Settings</source>
<translation>qTox - Параметри</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="224"/>
<source>General</source>
<translation>Основні</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="230"/>
<source>Identity</source>
<translation>Ідентифікація</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="236"/>
<source>Privacy</source>
<translation>Приватність</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="242"/>
<source>Audio/Video</source>
<translation>Аудіо/Відео</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="251"/>
<source>Ok</source>
<translation>Гаразд</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="252"/>
<source>Cancel</source>
<translation>Скасувати</translation>
</message>
<message>
<location filename="../widget/settingsdialog.cpp" line="253"/>
<source>Apply</source>
<translation>Застосувати</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget/widget.cpp" line="141"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>В мережі</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="143"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation>Відійшов</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="145"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Зайнятий</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="285"/>
<source>Choose a profile picture</source>
<translation>Оберіть зображення для профілю</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="292"/>
<location filename="../widget/widget.cpp" line="299"/>
<location filename="../widget/widget.cpp" line="320"/>
<source>Error</source>
<translation>Помилка</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="292"/>
<source>Unable to open this file</source>
<translation>Неможливо відкрити цей файл</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="299"/>
<source>Unable to read this image</source>
<translation>Неможливо прочитати це зображення</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="320"/>
<source>This image is too big</source>
<translation>Зображення завелике</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="664"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Невідомо&gt;</translation>
</message>
</context>
</TS>

View File

@ -1,64 +1,75 @@
div.name_me {
color: #646464;
font-weight: bold;
padding-right: 3px;
}
div.name {
color: #000000;
font-weight: bold;
padding-right: 3px;
color: @black;
font: @bigBold;
}
div.message {
color: #000000;
padding-right: 3px;
padding-left: 3px;
color: @black;
font: @big;
}
div.action {
color: #1818FF;
font: @big;
}
div.date {
color: #000000;
padding-left: 3px;
white-space: nowrap;
color: @black;
font: @big;
}
div.quote {
background-color: #6bc260;
div.name_me {
color: @mediumGrey;
font: @big;
}
div.message_me {
color: @black;
font: @big;
}
div.date_me {
color: @black;
font: @big;
}
span.quote {
color: #6bc260;
}
div.green {
margin-top: 12px;
margin-bottom: 12px;
margin-left: 12px;
margin-left: 0px;
margin-right: 12px;
color: #ffffff;
background-color: #6bc260;
font-size: 10px;
color: @white;
background-color: @green;
font: @small;
}
div.silver {
margin-top: 12px;
margin-bottom: 12px;
margin-left: 12px;
margin-left: 0px;
margin-right: 12px;
color: #000000;
background-color: #d1d1d1;
font-size: 10px;
color: @black;
background-color: @lightGrey;
font: @small;
}
div.red {
margin-top: 12px;
margin-bottom: 12px;
margin-left: 12px;
margin-left: 0px;
margin-right: 12px;
color: #ffffff;
background-color: rgb(200,78,78);
font-size: 10px;
color: @white;
background-color: @red;
font: @small;
}
div.button {
margin-top: 0px;
margin-bottom: 0px;
margin-left: 0px;
color: #ffffff;
color: @white;
}

View File

@ -0,0 +1,38 @@
GenericChatroomWidget
{
background-color: @mediumGrey;
}
GenericChatroomWidget[active="true"]
{
background-color: @white;
}
GenericChatroomWidget[active="false"]:hover
{
background-color: @mediumGreyLight;
}
GenericChatroomWidget[active="true"] > QLabel#status
{
font: @medium;
color: @mediumGrey;
}
GenericChatroomWidget[active="false"] > QLabel#status
{
font: @medium;
color: @lightGrey;
}
GenericChatroomWidget[active="true"] > QLabel#name
{
font: @big;
color: @darkGrey;
}
GenericChatroomWidget[active="false"] > QLabel#name
{
font: @big;
color: @white;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 B

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

After

Width:  |  Height:  |  Size: 233 B

View File

@ -35,6 +35,6 @@ QRadioButton::indicator::checked
QMenu
{
background-color: rgb(240,240,240); /* sets background of the menu */
border: 1px solid;
background-color: @mediumGrey; /* sets background of the menu */
border: 0px solid;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

View File

@ -3,18 +3,16 @@ QScrollArea {
}
QScrollBar:vertical {
background: transparent;
width: 14px;
margin-top: 2px;
margin-bottom: 2px;
background: rgb(65,65,65);
width: 16px;
padding: 0px 3px 0px 3px;
}
QScrollBar:handle:vertical {
background: rgba(18, 18, 18, 204);
min-height: 20px;
border-radius: 3px;
margin-left: 3px;
margin-right: 1px;
border-radius: 5px;
margin: 3px 0px 3px 0px;
}
QScrollBar:handle:vertical:hover {

View File

@ -1,5 +1,5 @@
QTextEdit {
border-color: #c4c1bd;
border-color: @lightGrey;
border-style: solid;
border-width: 1px 0 1px 1px;
}

View File

@ -0,0 +1,36 @@
QCheckBox
{
color: black;
}
QLabel
{
color: black;
}
QGroupBox::title
{
color: black;
background-color: white;
}
QWidget
{
color: black;
background-color: white;
}
QComboBox
{
background-color: white;
}
QComboBox:on QComboBox:off QComboBox:drop-down
{
background: rgba(18, 18, 18, 204);
}
QComboBox:active
{
background: white;
}

5
ui/settings/mainHead.css Normal file
View File

@ -0,0 +1,5 @@
QWidget
{
color: black;
background: white;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 B

Some files were not shown because too many files have changed in this diff Show More