initial code translation preparation, russian localization

This commit is contained in:
Blue 2019-10-05 14:27:39 +03:00
parent 746fdef013
commit 8afdb81314
14 changed files with 781 additions and 75 deletions

View File

@ -1,16 +1,15 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(squawk) project(squawk)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
# Instruct CMake to create code from Qt designer ui files
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON) set(CMAKE_AUTORCC ON)
find_package(Qt5Widgets CONFIG REQUIRED) find_package(Qt5Widgets CONFIG REQUIRED)
find_package(Qt5LinguistTools)
set(squawk_SRC set(squawk_SRC
main.cpp main.cpp
global.cpp global.cpp
@ -18,7 +17,15 @@ set(squawk_SRC
signalcatcher.cpp signalcatcher.cpp
) )
add_executable(squawk ${squawk_SRC} resources/resources.qrc) set(TS_FILES
translations/squawk.ru.ts
)
qt5_add_translation(QM_FILES ${TS_FILES})
add_custom_target(translations ALL DEPENDS ${QM_FILES})
qt5_add_resources(RCC resources/resources.qrc)
add_executable(squawk ${squawk_SRC} ${RCC})
target_link_libraries(squawk Qt5::Widgets) target_link_libraries(squawk Qt5::Widgets)
add_subdirectory(ui) add_subdirectory(ui)
@ -29,5 +36,8 @@ target_link_libraries(squawk squawkUI)
target_link_libraries(squawk squawkCORE) target_link_libraries(squawk squawkCORE)
target_link_libraries(squawk uuid) target_link_libraries(squawk uuid)
add_dependencies(${CMAKE_PROJECT_NAME} translations)
# Install the executable # Install the executable
install(TARGETS squawk DESTINATION bin) install(TARGETS squawk DESTINATION bin)
install(FILES ${QM_FILES} DESTINATION share/l10n)

View File

@ -20,6 +20,7 @@
#define GLOBAL_H #define GLOBAL_H
#include <QString> #include <QString>
#include <QCoreApplication>
#include <deque> #include <deque>
#include <QDateTime> #include <QDateTime>
#include <QDataStream> #include <QDataStream>
@ -99,7 +100,6 @@ static const std::deque<QString> subscriptionStateNames = {"None", "From", "To",
static const std::deque<QString> affiliationNames = {"Unspecified", "Outcast", "Nobody", "Member", "Admin", "Owner"}; static const std::deque<QString> affiliationNames = {"Unspecified", "Outcast", "Nobody", "Member", "Admin", "Owner"};
static const std::deque<QString> roleNames = {"Unspecified", "Nobody", "Visitor", "Participant", "Moderator"}; static const std::deque<QString> roleNames = {"Unspecified", "Nobody", "Visitor", "Participant", "Moderator"};
QString generateUUID(); QString generateUUID();
class Message { class Message {

View File

@ -23,6 +23,8 @@
#include <QtCore/QThread> #include <QtCore/QThread>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QSettings> #include <QSettings>
#include <QTranslator>
#include <QLibraryInfo>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -36,7 +38,15 @@ int main(int argc, char *argv[])
QCoreApplication::setOrganizationName("Macaw"); QCoreApplication::setOrganizationName("Macaw");
QCoreApplication::setOrganizationDomain("macaw.me"); QCoreApplication::setOrganizationDomain("macaw.me");
QCoreApplication::setApplicationName("Squawk"); QCoreApplication::setApplicationName("Squawk");
QCoreApplication::setApplicationVersion("0.0.3"); QCoreApplication::setApplicationVersion("0.0.4");
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator myappTranslator;
myappTranslator.load(QLocale(), QLatin1String("squawk"), ".");
app.installTranslator(&myappTranslator);
QIcon icon; QIcon icon;
icon.addFile(":images/logo.svg", QSize(16, 16)); icon.addFile(":images/logo.svg", QSize(16, 16));

639
translations/squawk.ru.ts Normal file
View File

@ -0,0 +1,639 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>Account</name>
<message>
<location filename="../ui/widgets/account.ui" line="14"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="127"/>
<source>Account</source>
<translatorcomment>Заголовок окна</translatorcomment>
<translation>Учетная запись</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="40"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="129"/>
<source>Your account login</source>
<translation>Имя пользователя Вашей учетной записи</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="43"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="131"/>
<source>john_smith1987</source>
<translation>ivan_ivanov1987</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="50"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="132"/>
<source>Server</source>
<translation>Сервер</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="57"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="134"/>
<source>A server address of your account. Like 404.city or macaw.me</source>
<translation>Адресс сервера вашей учетной записи (выглядит как 404.city или macaw.me)</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="60"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="136"/>
<source>macaw.me</source>
<translation>macaw.me</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="67"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="137"/>
<source>Login</source>
<translation>Имя учетной записи</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="74"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="138"/>
<source>Password</source>
<translation>Пароль</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="81"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="140"/>
<source>Password of your account</source>
<translation>Пароль вашей учетной записи</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="103"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="145"/>
<source>Name</source>
<translation>Имя</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="110"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="147"/>
<source>Just a name how would you call this account, doesn&apos;t affect anything</source>
<translation>Просто имя, то как Вы называете свою учетную запись, может быть любым</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="113"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="149"/>
<source>John</source>
<translation>Иван</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="120"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="150"/>
<source>Resource</source>
<translation>Ресурс</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="127"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="152"/>
<source>A resource name like &quot;Home&quot; or &quot;Work&quot;</source>
<translation>Имя этой программы для ваших контактов, может быть &quot;Home&quot; или &quot;Phone&quot;</translation>
</message>
<message>
<location filename="../ui/widgets/account.ui" line="130"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_account.h" line="154"/>
<source>QXmpp</source>
<translatorcomment>Ресурс по умолчанию</translatorcomment>
<translation>QXmpp</translation>
</message>
</context>
<context>
<name>Accounts</name>
<message>
<location filename="../ui/widgets/accounts.ui" line="14"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="108"/>
<source>Accounts</source>
<translation>Учетные записи</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.ui" line="45"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="109"/>
<source>Delete</source>
<translation>Удалить</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.ui" line="86"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="110"/>
<source>Add</source>
<translation>Добавить</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.ui" line="96"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="111"/>
<source>Edit</source>
<translation>Редактировать</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.ui" line="106"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="112"/>
<source>Change password</source>
<translation>Изменить пароль</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.ui" line="129"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_accounts.h" line="113"/>
<location filename="../ui/widgets/accounts.cpp" line="126"/>
<location filename="../ui/widgets/accounts.cpp" line="129"/>
<source>Connect</source>
<translation>Подключить</translation>
</message>
<message>
<location filename="../ui/widgets/accounts.cpp" line="123"/>
<source>Disconnect</source>
<translation>Отключить</translation>
</message>
</context>
<context>
<name>Conversation</name>
<message>
<location filename="../ui/widgets/conversation.ui" line="449"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_conversation.h" line="324"/>
<source>Type your message here...</source>
<translation>Введите сообщение...</translation>
</message>
</context>
<context>
<name>Global</name>
<message>
<source>Disconnected</source>
<translation>Отключен</translation>
</message>
<message>
<source>Connecting</source>
<translation>Подключается</translation>
</message>
<message>
<source>Connected</source>
<translation>Подключен</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Online</source>
<translation>В сети</translation>
</message>
<message>
<source>Away</source>
<translation>Отошел</translation>
</message>
<message>
<source>Busy</source>
<translation>Занят</translation>
</message>
<message>
<source>Absent</source>
<translation>Недоступен</translation>
</message>
<message>
<source>Chatty</source>
<translation>Готов поболтать</translation>
</message>
<message>
<source>Invisible</source>
<translation>Невидимый</translation>
</message>
<message>
<source>Offline</source>
<translation>Отключен</translation>
</message>
<message>
<source>None</source>
<translation>Нет</translation>
</message>
<message>
<source>From</source>
<translation>Входящая</translation>
</message>
<message>
<source>To</source>
<translation>Исходящая</translation>
</message>
<message>
<source>Both</source>
<translation>Взаимная</translation>
</message>
<message>
<source>Unknown</source>
<translation>Неизвестно</translation>
</message>
<message>
<source>Unspecified</source>
<translation>Не назначено</translation>
</message>
<message>
<source>Outcast</source>
<translation>Изгой</translation>
</message>
<message>
<source>Nobody</source>
<translation>Никто</translation>
</message>
<message>
<source>Member</source>
<translation>Участник</translation>
</message>
<message>
<source>Admin</source>
<translation>Администратор</translation>
</message>
<message>
<source>Owner</source>
<translation>Владелец</translation>
</message>
<message>
<source>Visitor</source>
<translation>Гость</translation>
</message>
<message>
<source>Participant</source>
<translation>Участник</translation>
</message>
<message>
<source>Moderator</source>
<translation>Модератор</translation>
</message>
</context>
<context>
<name>JoinConference</name>
<message>
<location filename="../ui/widgets/joinconference.ui" line="14"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="116"/>
<source>Join new conference</source>
<translatorcomment>Заголовок окна</translatorcomment>
<translation>Присоединиться к новой беседе</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="22"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="117"/>
<source>JID</source>
<translation>JID</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="29"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="119"/>
<source>Room JID</source>
<translation>Jabber-идентификатор беседы</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="32"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="121"/>
<source>identifier@conference.server.org</source>
<translation>identifier@conference.server.org</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="39"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="122"/>
<source>Account</source>
<translation>Учетная запись</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="49"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="123"/>
<source>Join on login</source>
<translation>Автовход</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="56"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="125"/>
<source>If checked Squawk will try to join this conference on login</source>
<translation>Если стоит галочка Squawk автоматически присоединится к этой беседе при подключении</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="66"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="128"/>
<source>Nick name</source>
<translation>Псевдоним</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="73"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="130"/>
<source>Your nick name for that conference. If you leave this field empty your account name will be used as a nick name</source>
<translation>Ваш псевдоним в этой беседе, если оставите это поле пустым - будет использовано имя Вашей учетной записи</translation>
</message>
<message>
<location filename="../ui/widgets/joinconference.ui" line="76"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_joinconference.h" line="132"/>
<source>John</source>
<translation>Ivan</translation>
</message>
</context>
<context>
<name>Message</name>
<message>
<location filename="../ui/utils/message.cpp" line="120"/>
<source>Download</source>
<translation>Скачать</translation>
</message>
<message>
<location filename="../ui/utils/message.cpp" line="124"/>
<source>Error downloading file: %1
You can try again</source>
<translation>Ошибка загрузки файла: %1
Вы можете попробовать снова</translation>
</message>
<message>
<location filename="../ui/utils/message.cpp" line="126"/>
<source>%1 is offering you to download a file</source>
<translation>%1 предлагает Вам скачать файл</translation>
</message>
<message>
<location filename="../ui/utils/message.cpp" line="191"/>
<source>Open</source>
<translation>Открыть</translation>
</message>
</context>
<context>
<name>Models::Accounts</name>
<message>
<source>Name</source>
<translation>Имя</translation>
</message>
<message>
<source>Server</source>
<translation>Сервер</translation>
</message>
<message>
<source>State</source>
<translation>Состояние</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
</context>
<context>
<name>Models::Room</name>
<message>
<location filename="../ui/models/room.cpp" line="196"/>
<source>Subscribed</source>
<translation>Вы состоите в беседе</translation>
</message>
<message>
<location filename="../ui/models/room.cpp" line="198"/>
<source>Temporarily unsubscribed</source>
<translation>Вы временно не состоите в беседе</translation>
</message>
<message>
<location filename="../ui/models/room.cpp" line="202"/>
<source>Temporarily subscribed</source>
<translation>Вы временно состоите в беседе</translation>
</message>
<message>
<location filename="../ui/models/room.cpp" line="204"/>
<source>Unsubscribed</source>
<translation>Вы не состоите в беседе</translation>
</message>
</context>
<context>
<name>Models::Roster</name>
<message>
<location filename="../ui/models/roster.cpp" line="79"/>
<source>New messages</source>
<translation>Есть непрочитанные сообщения</translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="152"/>
<location filename="../ui/models/roster.cpp" line="178"/>
<location filename="../ui/models/roster.cpp" line="215"/>
<location filename="../ui/models/roster.cpp" line="227"/>
<source>New messages: </source>
<translation>Новых сообщений: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="154"/>
<source>Jabber ID: </source>
<translation>Идентификатор: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="158"/>
<location filename="../ui/models/roster.cpp" line="181"/>
<location filename="../ui/models/roster.cpp" line="194"/>
<source>Availability: </source>
<translation>Доступность: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="162"/>
<location filename="../ui/models/roster.cpp" line="184"/>
<location filename="../ui/models/roster.cpp" line="197"/>
<source>Status: </source>
<translation>Статус: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="165"/>
<location filename="../ui/models/roster.cpp" line="167"/>
<location filename="../ui/models/roster.cpp" line="229"/>
<source>Subscription: </source>
<translation>Подписка: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="200"/>
<source>Affiliation: </source>
<translatorcomment>Я правда не знаю, как это объяснить, не то что перевести</translatorcomment>
<translation>Причастность: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="203"/>
<source>Role: </source>
<translation>Роль: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="217"/>
<source>Online contacts: </source>
<translation>Контакстов в сети: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="218"/>
<source>Total contacts: </source>
<translation>Всего контактов: </translation>
</message>
<message>
<location filename="../ui/models/roster.cpp" line="231"/>
<source>Members: </source>
<translation>Участников: </translation>
</message>
</context>
<context>
<name>NewContact</name>
<message>
<location filename="../ui/widgets/newcontact.ui" line="14"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="103"/>
<source>Add new contact</source>
<translatorcomment>Заголовок окна</translatorcomment>
<translation>Добавление нового контакта</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="22"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="104"/>
<source>Account</source>
<translation>Учетная запись</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="29"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="106"/>
<source>An account that is going to have new contact</source>
<translation>Учетная запись для которой будет добавлен контакт</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="36"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="108"/>
<source>JID</source>
<translation>JID</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="43"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="110"/>
<source>Jabber id of your new contact</source>
<translation>Jabber-идентификатор нового контакта</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="46"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="112"/>
<source>name@server.dmn</source>
<translatorcomment>Placeholder поля ввода JID</translatorcomment>
<translation>name@server.dmn</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="53"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="113"/>
<source>Name</source>
<translation>Имя</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="60"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="115"/>
<source>The way this new contact will be labeled in your roster (optional)</source>
<translation>То, как будет подписан контакт в вашем списке контактов (не обязательно)</translation>
</message>
<message>
<location filename="../ui/widgets/newcontact.ui" line="63"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_newcontact.h" line="117"/>
<source>John Smith</source>
<translation>Иван Иванов</translation>
</message>
</context>
<context>
<name>Squawk</name>
<message>
<location filename="../ui/squawk.ui" line="14"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="130"/>
<source>squawk</source>
<translation>Squawk</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="75"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="136"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="81"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="137"/>
<source>Squawk</source>
<translation>Squawk</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="96"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="131"/>
<source>Accounts</source>
<translation>Учетные записи</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="105"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="132"/>
<source>Quit</source>
<translation>Выйти</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="117"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="133"/>
<source>Add contact</source>
<translation>Добавить контакт</translation>
</message>
<message>
<location filename="../ui/squawk.ui" line="128"/>
<location filename="../build/ui/squawkUI_autogen/include/ui_squawk.h" line="134"/>
<source>Add conference</source>
<translation>Присоединиться к беседе</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="529"/>
<source>Disconnect</source>
<translation>Отключить</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="535"/>
<source>Connect</source>
<translation>Подключить</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="541"/>
<location filename="../ui/squawk.cpp" line="635"/>
<location filename="../ui/squawk.cpp" line="675"/>
<source>Remove</source>
<translation>Удалить</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="553"/>
<source>Open dialog</source>
<translation>Открыть диалог</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="563"/>
<location filename="../ui/squawk.cpp" line="656"/>
<source>Unsubscribe</source>
<translation>Отписаться</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="573"/>
<location filename="../ui/squawk.cpp" line="665"/>
<source>Subscribe</source>
<translation>Подписаться</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="584"/>
<source>Rename</source>
<translation>Переименовать</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="597"/>
<source>Input new name for %1
or leave it empty for the contact
to be displayed as %1</source>
<translation>Введите имя для %1
или оставьте пустым,
тогда контакт будет отображаться как
%1</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="598"/>
<source>Renaming %1</source>
<translation>Назначение имени контакту %1</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="604"/>
<source>Groups</source>
<translation>Группы</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="619"/>
<source>New group</source>
<translation>Создать новую группу</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="629"/>
<source>New group name</source>
<translation>Имя группы</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="630"/>
<source>Add %1 to a new group</source>
<translation>Добавление %1 в новую группу</translation>
</message>
<message>
<location filename="../ui/squawk.cpp" line="647"/>
<source>Open conversation</source>
<translation>Открыть окно беседы</translation>
</message>
</context>
</TS>

View File

@ -151,7 +151,7 @@ QVariant Models::Account::data(int column) const
case 1: case 1:
return server; return server;
case 2: case 2:
return Shared::connectionStateNames[state]; return QCoreApplication::translate("Global", Shared::connectionStateNames[state].toLatin1());
case 3: case 3:
return error; return error;
case 4: case 4:
@ -159,7 +159,7 @@ QVariant Models::Account::data(int column) const
case 5: case 5:
return password; return password;
case 6: case 6:
return Shared::availabilityNames[availability]; return QCoreApplication::translate("Global", Shared::availabilityNames[availability].toLatin1());
case 7: case 7:
return resource; return resource;
default: default:

View File

@ -20,13 +20,9 @@
#include "../../global.h" #include "../../global.h"
#include <QIcon> #include <QIcon>
#include <QDebug>
std::deque<QString> Models::Accounts::columns = { std::deque<QString> Models::Accounts::columns = {"Name", "Server", "State", "Error"};
"name",
"server",
"state",
"error"
};
Models::Accounts::Accounts(QObject* parent): Models::Accounts::Accounts(QObject* parent):
QAbstractTableModel(parent), QAbstractTableModel(parent),
@ -72,7 +68,7 @@ int Models::Accounts::rowCount ( const QModelIndex& parent ) const
QVariant Models::Accounts::headerData(int section, Qt::Orientation orientation, int role) const QVariant Models::Accounts::headerData(int section, Qt::Orientation orientation, int role) const
{ {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
return columns[section]; return tr(columns[section].toLatin1());
} }
return QVariant(); return QVariant();
} }
@ -81,7 +77,18 @@ QVariant Models::Accounts::headerData(int section, Qt::Orientation orientation,
void Models::Accounts::addAccount(Account* account) void Models::Accounts::addAccount(Account* account)
{ {
beginInsertRows(QModelIndex(), accs.size(), accs.size()); beginInsertRows(QModelIndex(), accs.size(), accs.size());
accs.push_back(account); int index = 0;
std::deque<Account*>::const_iterator before = accs.begin();
while (before != accs.end()) {
Account* bfr = *before;
if (bfr->getDisplayedName() > account->getDisplayedName()) {
break;
}
index++;
before++;
}
accs.insert(before, account);
connect(account, SIGNAL(childChanged(Models::Item*, int, int)), this, SLOT(onAccountChanged(Models::Item*, int, int))); connect(account, SIGNAL(childChanged(Models::Item*, int, int)), this, SLOT(onAccountChanged(Models::Item*, int, int)));
endInsertRows(); endInsertRows();
@ -96,8 +103,32 @@ void Models::Accounts::onAccountChanged(Item* item, int row, int col)
return; //it means the signal is emitted by one of accounts' children, not exactly him, this model has no interest in that return; //it means the signal is emitted by one of accounts' children, not exactly him, this model has no interest in that
} }
if (col == 0) {
int newRow = 0;
std::deque<Account*>::const_iterator before = accs.begin();
while (before != accs.end()) {
Item* bfr = *before;
if (bfr->getDisplayedName() > item->getDisplayedName()) {
break;
}
newRow++;
before++;
}
if (newRow != row || (before != accs.end() && *before != item)) {
emit beginMoveRows(createIndex(row, 0), row, row, createIndex(newRow, 0), newRow);
std::deque<Account*>::const_iterator old = accs.begin();
old += row;
accs.erase(old);
accs.insert(before, acc);
emit endMoveRows();
row = newRow;
}
}
if (col < columnCount(QModelIndex())) { if (col < columnCount(QModelIndex())) {
emit dataChanged(createIndex(row, col, this), createIndex(row, col, this)); emit dataChanged(createIndex(row, col), createIndex(row, col));
} }
emit changed(); emit changed();
} }

View File

@ -193,15 +193,15 @@ QString Models::Room::getStatusText() const
{ {
if (autoJoin) { if (autoJoin) {
if (joined) { if (joined) {
return "Subscribed"; return tr("Subscribed");
} else { } else {
return "Temporarily unsubscribed"; return tr("Temporarily unsubscribed");
} }
} else { } else {
if (joined) { if (joined) {
return "Temporarily subscribed"; return tr("Temporarily subscribed");
} else { } else {
return "Unsubscribed"; return tr("Unsubscribed");
} }
} }
} }

View File

@ -21,8 +21,6 @@
#include <QIcon> #include <QIcon>
#include <QFont> #include <QFont>
using namespace Models;
Models::Roster::Roster(QObject* parent): Models::Roster::Roster(QObject* parent):
QAbstractItemModel(parent), QAbstractItemModel(parent),
accountsModel(new Accounts()), accountsModel(new Accounts()),
@ -78,7 +76,7 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
str += gr->getName(); str += gr->getName();
unsigned int amount = gr->getUnreadMessages(); unsigned int amount = gr->getUnreadMessages();
if (amount > 0) { if (amount > 0) {
str += QString(" (") + "New messages" + ")"; str += QString(" (") + tr("New messages") + ")";
} }
result = str; result = str;
@ -143,7 +141,7 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
switch (item->type) { switch (item->type) {
case Item::account: { case Item::account: {
Account* acc = static_cast<Account*>(item); Account* acc = static_cast<Account*>(item);
result = QString(Shared::availabilityNames[acc->getAvailability()]); result = QCoreApplication::translate("Global", Shared::availabilityNames[acc->getAvailability()].toLatin1());
} }
break; break;
case Item::contact: { case Item::contact: {
@ -151,22 +149,22 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
QString str(""); QString str("");
int mc = contact->getMessagesCount(); int mc = contact->getMessagesCount();
if (mc > 0) { if (mc > 0) {
str += QString("New messages: ") + std::to_string(mc).c_str() + "\n"; str += QString(tr("New messages: ")) + std::to_string(mc).c_str() + "\n";
} }
str += "Jabber ID: " + contact->getJid() + "\n"; str += tr("Jabber ID: ") + contact->getJid() + "\n";
Shared::SubscriptionState ss = contact->getState(); Shared::SubscriptionState ss = contact->getState();
if (ss == Shared::both) { if (ss == Shared::both) {
Shared::Availability av = contact->getAvailability(); Shared::Availability av = contact->getAvailability();
str += "Availability: " + Shared::availabilityNames[av]; str += tr("Availability: ") + QCoreApplication::translate("Global", Shared::availabilityNames[av].toLatin1());
if (av != Shared::offline) { if (av != Shared::offline) {
QString s = contact->getStatus(); QString s = contact->getStatus();
if (s.size() > 0) { if (s.size() > 0) {
str += "\nStatus: " + s; str += "\n" + tr("Status: ") + s;
} }
} }
str += "\nSubscription: " + Shared::subscriptionStateNames[ss]; str += "\n" + tr("Subscription: ") + QCoreApplication::translate("Global", Shared::subscriptionStateNames[ss].toLatin1());
} else { } else {
str += "Subscription: " + Shared::subscriptionStateNames[ss]; str += tr("Subscription: ") + QCoreApplication::translate("Global", Shared::subscriptionStateNames[ss].toLatin1());
} }
result = str; result = str;
@ -177,13 +175,13 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
QString str(""); QString str("");
int mc = contact->getMessagesCount(); int mc = contact->getMessagesCount();
if (mc > 0) { if (mc > 0) {
str += QString("New messages: ") + std::to_string(mc).c_str() + "\n"; str += tr("New messages: ") + std::to_string(mc).c_str() + "\n";
} }
Shared::Availability av = contact->getAvailability(); Shared::Availability av = contact->getAvailability();
str += "Availability: " + Shared::availabilityNames[av]; str += tr("Availability: ") + QCoreApplication::translate("Global", Shared::availabilityNames[av].toLatin1());
QString s = contact->getStatus(); QString s = contact->getStatus();
if (s.size() > 0) { if (s.size() > 0) {
str += "\nStatus: " + s; str += "\n" + tr("Status: ") + s;
} }
result = str; result = str;
@ -193,14 +191,18 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
Participant* p = static_cast<Participant*>(item); Participant* p = static_cast<Participant*>(item);
QString str(""); QString str("");
Shared::Availability av = p->getAvailability(); Shared::Availability av = p->getAvailability();
str += "Availability: " + Shared::availabilityNames[av] + "\n"; str += tr("Availability: ") + QCoreApplication::translate("Global", Shared::availabilityNames[av].toLatin1()) + "\n";
QString s = p->getStatus(); QString s = p->getStatus();
if (s.size() > 0) { if (s.size() > 0) {
str += "Status: " + s + "\n"; str += tr("Status: ") + s + "\n";
} }
str += "Affiliation: " + Shared::affiliationNames[static_cast<unsigned int>(p->getAffiliation())] + "\n"; str += tr("Affiliation: ") +
str += "Role: " + Shared::roleNames[static_cast<unsigned int>(p->getRole())]; QCoreApplication::translate("Global",
Shared::affiliationNames[static_cast<unsigned int>(p->getAffiliation())].toLatin1()) + "\n";
str += tr("Role: ") +
QCoreApplication::translate("Global",
Shared::roleNames[static_cast<unsigned int>(p->getRole())].toLatin1());
result = str; result = str;
} }
@ -210,10 +212,10 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
unsigned int count = gr->getUnreadMessages(); unsigned int count = gr->getUnreadMessages();
QString str(""); QString str("");
if (count > 0) { if (count > 0) {
str += QString("New messages: ") + std::to_string(count).c_str() + "\n"; str += tr("New messages: ") + std::to_string(count).c_str() + "\n";
} }
str += QString("Online contacts: ") + std::to_string(gr->getOnlineContacts()).c_str() + "\n"; str += tr("Online contacts: ") + std::to_string(gr->getOnlineContacts()).c_str() + "\n";
str += QString("Total contacts: ") + std::to_string(gr->childCount()).c_str(); str += tr("Total contacts: ") + std::to_string(gr->childCount()).c_str();
result = str; result = str;
} }
break; break;
@ -222,11 +224,11 @@ QVariant Models::Roster::data (const QModelIndex& index, int role) const
unsigned int count = rm->getUnreadMessagesCount(); unsigned int count = rm->getUnreadMessagesCount();
QString str(""); QString str("");
if (count > 0) { if (count > 0) {
str += QString("New messages: ") + std::to_string(count).c_str() + "\n"; str += tr("New messages: ") + std::to_string(count).c_str() + "\n";
} }
str += QString("Subscription: ") + rm->getStatusText(); str += tr("Subscription: ") + rm->getStatusText();
if (rm->getJoined()) { if (rm->getJoined()) {
str += QString("\nMembers: ") + std::to_string(rm->childCount()).c_str(); str += QString("\n") + tr("Members: ") + std::to_string(rm->childCount()).c_str();
} }
result = str; result = str;
} }

View File

@ -37,7 +37,7 @@ Squawk::Squawk(QWidget *parent) :
for (unsigned int i = Shared::availabilityLowest; i < Shared::availabilityHighest + 1; ++i) { for (unsigned int i = Shared::availabilityLowest; i < Shared::availabilityHighest + 1; ++i) {
Shared::Availability av = static_cast<Shared::Availability>(i); Shared::Availability av = static_cast<Shared::Availability>(i);
m_ui->comboBox->addItem(Shared::availabilityIcon(av), Shared::availabilityNames[av]); m_ui->comboBox->addItem(Shared::availabilityIcon(av), QCoreApplication::translate("Global", Shared::availabilityNames[av].toLatin1()));
} }
m_ui->comboBox->setCurrentIndex(Shared::offline); m_ui->comboBox->setCurrentIndex(Shared::offline);
@ -526,20 +526,19 @@ void Squawk::onRosterContextMenu(const QPoint& point)
QString name = acc->getName(); QString name = acc->getName();
if (acc->getState() != Shared::disconnected) { if (acc->getState() != Shared::disconnected) {
QAction* con = contextMenu->addAction(Shared::icon("network-disconnect"), "Disconnect"); QAction* con = contextMenu->addAction(Shared::icon("network-disconnect"), tr("Disconnect"));
con->setEnabled(active); con->setEnabled(active);
connect(con, &QAction::triggered, [this, name]() { connect(con, &QAction::triggered, [this, name]() {
emit disconnectAccount(name); emit disconnectAccount(name);
}); });
} else { } else {
QAction* con = contextMenu->addAction(Shared::icon("network-connect"), "Connect"); QAction* con = contextMenu->addAction(Shared::icon("network-connect"), tr("Connect"));
con->setEnabled(active);
connect(con, &QAction::triggered, [this, name]() { connect(con, &QAction::triggered, [this, name]() {
emit connectAccount(name); emit connectAccount(name);
}); });
} }
QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), "Remove"); QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), tr("Remove"));
remove->setEnabled(active); remove->setEnabled(active);
connect(remove, &QAction::triggered, [this, name]() { connect(remove, &QAction::triggered, [this, name]() {
emit removeAccount(name); emit removeAccount(name);
@ -551,7 +550,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
Models::Contact* cnt = static_cast<Models::Contact*>(item); Models::Contact* cnt = static_cast<Models::Contact*>(item);
hasMenu = true; hasMenu = true;
QAction* dialog = contextMenu->addAction(Shared::icon("mail-message"), "Open dialog"); QAction* dialog = contextMenu->addAction(Shared::icon("mail-message"), tr("Open dialog"));
dialog->setEnabled(active); dialog->setEnabled(active);
connect(dialog, &QAction::triggered, [this, index]() { connect(dialog, &QAction::triggered, [this, index]() {
onRosterItemDoubleClicked(index); onRosterItemDoubleClicked(index);
@ -561,7 +560,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
switch (state) { switch (state) {
case Shared::both: case Shared::both:
case Shared::to: { case Shared::to: {
QAction* unsub = contextMenu->addAction(Shared::icon("news-unsubscribe"), "Unsubscribe"); QAction* unsub = contextMenu->addAction(Shared::icon("news-unsubscribe"), tr("Unsubscribe"));
unsub->setEnabled(active); unsub->setEnabled(active);
connect(unsub, &QAction::triggered, [this, cnt]() { connect(unsub, &QAction::triggered, [this, cnt]() {
emit unsubscribeContact(cnt->getAccountName(), cnt->getJid(), ""); emit unsubscribeContact(cnt->getAccountName(), cnt->getJid(), "");
@ -571,7 +570,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
case Shared::from: case Shared::from:
case Shared::unknown: case Shared::unknown:
case Shared::none: { case Shared::none: {
QAction* sub = contextMenu->addAction(Shared::icon("news-subscribe"), "Subscribe"); QAction* sub = contextMenu->addAction(Shared::icon("news-subscribe"), tr("Subscribe"));
sub->setEnabled(active); sub->setEnabled(active);
connect(sub, &QAction::triggered, [this, cnt]() { connect(sub, &QAction::triggered, [this, cnt]() {
emit subscribeContact(cnt->getAccountName(), cnt->getJid(), ""); emit subscribeContact(cnt->getAccountName(), cnt->getJid(), "");
@ -582,7 +581,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
QString cntJID = cnt->getJid(); QString cntJID = cnt->getJid();
QString cntName = cnt->getName(); QString cntName = cnt->getName();
QAction* rename = contextMenu->addAction(Shared::icon("edit-rename"), "Rename"); QAction* rename = contextMenu->addAction(Shared::icon("edit-rename"), tr("Rename"));
rename->setEnabled(active); rename->setEnabled(active);
connect(rename, &QAction::triggered, [this, cntName, accName, cntJID]() { connect(rename, &QAction::triggered, [this, cntName, accName, cntJID]() {
QInputDialog* dialog = new QInputDialog(this); QInputDialog* dialog = new QInputDialog(this);
@ -595,14 +594,14 @@ void Squawk::onRosterContextMenu(const QPoint& point)
}); });
connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater); connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater);
dialog->setInputMode(QInputDialog::TextInput); dialog->setInputMode(QInputDialog::TextInput);
dialog->setLabelText("Input new name for " + cntJID + " \nor leave it empty for the contact \nto be displayed as " + cntJID); dialog->setLabelText(tr("Input new name for %1\nor leave it empty for the contact \nto be displayed as %1").arg(cntJID));
dialog->setWindowTitle("Renaming " + cntJID); dialog->setWindowTitle(tr("Renaming %1").arg(cntJID));
dialog->setTextValue(cntName); dialog->setTextValue(cntName);
dialog->exec(); dialog->exec();
}); });
QMenu* groupsMenu = contextMenu->addMenu(Shared::icon("group"), "Groups"); QMenu* groupsMenu = contextMenu->addMenu(Shared::icon("group"), tr("Groups"));
std::deque<QString> groupList = rosterModel.groupList(accName); std::deque<QString> groupList = rosterModel.groupList(accName);
for (QString groupName : groupList) { for (QString groupName : groupList) {
QAction* gr = groupsMenu->addAction(groupName); QAction* gr = groupsMenu->addAction(groupName);
@ -617,7 +616,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
} }
}); });
} }
QAction* newGroup = groupsMenu->addAction(Shared::icon("resource-group-new"), "New group"); QAction* newGroup = groupsMenu->addAction(Shared::icon("resource-group-new"), tr("New group"));
newGroup->setEnabled(active); newGroup->setEnabled(active);
connect(newGroup, &QAction::triggered, [this, accName, cntJID]() { connect(newGroup, &QAction::triggered, [this, accName, cntJID]() {
QInputDialog* dialog = new QInputDialog(this); QInputDialog* dialog = new QInputDialog(this);
@ -627,13 +626,13 @@ void Squawk::onRosterContextMenu(const QPoint& point)
}); });
connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater); connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater);
dialog->setInputMode(QInputDialog::TextInput); dialog->setInputMode(QInputDialog::TextInput);
dialog->setLabelText("New group name"); dialog->setLabelText(tr("New group name"));
dialog->setWindowTitle("Add " + cntJID + " to a new group"); dialog->setWindowTitle(tr("Add %1 to a new group").arg(cntJID));
dialog->exec(); dialog->exec();
}); });
QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), "Remove"); QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), tr("Remove"));
remove->setEnabled(active); remove->setEnabled(active);
connect(remove, &QAction::triggered, [this, cnt]() { connect(remove, &QAction::triggered, [this, cnt]() {
emit removeContactRequest(cnt->getAccountName(), cnt->getJid()); emit removeContactRequest(cnt->getAccountName(), cnt->getJid());
@ -645,7 +644,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
Models::Room* room = static_cast<Models::Room*>(item); Models::Room* room = static_cast<Models::Room*>(item);
hasMenu = true; hasMenu = true;
QAction* dialog = contextMenu->addAction(Shared::icon("mail-message"), "Open conversation"); QAction* dialog = contextMenu->addAction(Shared::icon("mail-message"), tr("Open conversation"));
dialog->setEnabled(active); dialog->setEnabled(active);
connect(dialog, &QAction::triggered, [this, index]() { connect(dialog, &QAction::triggered, [this, index]() {
onRosterItemDoubleClicked(index); onRosterItemDoubleClicked(index);
@ -654,7 +653,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
Models::Roster::ElId id(room->getAccountName(), room->getJid()); Models::Roster::ElId id(room->getAccountName(), room->getJid());
if (room->getAutoJoin()) { if (room->getAutoJoin()) {
QAction* unsub = contextMenu->addAction(Shared::icon("news-unsubscribe"), "Unsubscribe"); QAction* unsub = contextMenu->addAction(Shared::icon("news-unsubscribe"), tr("Unsubscribe"));
unsub->setEnabled(active); unsub->setEnabled(active);
connect(unsub, &QAction::triggered, [this, id]() { connect(unsub, &QAction::triggered, [this, id]() {
emit setRoomAutoJoin(id.account, id.name, false); emit setRoomAutoJoin(id.account, id.name, false);
@ -663,7 +662,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
} }
}); });
} else { } else {
QAction* unsub = contextMenu->addAction(Shared::icon("news-subscribe"), "Subscribe"); QAction* unsub = contextMenu->addAction(Shared::icon("news-subscribe"), tr("Subscribe"));
unsub->setEnabled(active); unsub->setEnabled(active);
connect(unsub, &QAction::triggered, [this, id]() { connect(unsub, &QAction::triggered, [this, id]() {
emit setRoomAutoJoin(id.account, id.name, true); emit setRoomAutoJoin(id.account, id.name, true);
@ -673,7 +672,7 @@ void Squawk::onRosterContextMenu(const QPoint& point)
}); });
} }
QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), "Remove"); QAction* remove = contextMenu->addAction(Shared::icon("edit-delete"), tr("Remove"));
remove->setEnabled(active); remove->setEnabled(active);
connect(remove, &QAction::triggered, [this, id]() { connect(remove, &QAction::triggered, [this, id]() {
emit removeRoomRequest(id.account, id.name); emit removeRoomRequest(id.account, id.name);

View File

@ -22,7 +22,7 @@
#include <QFileInfo> #include <QFileInfo>
#include "message.h" #include "message.h"
const QRegExp urlReg("^(?!<img\\ssrc=\")((?:https?|ftp)://\\S+)"); const QRegExp urlReg("(?!<img\\ssrc=\")((?:https?|ftp)://\\S+)");
const QRegExp imgReg("((?:https?|ftp)://\\S+\\.(?:jpg|jpeg|png|svg|gif))"); const QRegExp imgReg("((?:https?|ftp)://\\S+\\.(?:jpg|jpeg|png|svg|gif))");
Message::Message(const Shared::Message& source, bool outgoing, const QString& p_sender, QWidget* parent): Message::Message(const Shared::Message& source, bool outgoing, const QString& p_sender, QWidget* parent):
@ -117,13 +117,13 @@ void Message::addDownloadDialog()
text->setText(""); text->setText("");
text->hide(); text->hide();
} }
downloadButton = new QPushButton(QIcon::fromTheme("download"), "Download"); downloadButton = new QPushButton(QIcon::fromTheme("download"), tr("Download"));
downloadButton->setToolTip("<a href=\"" + msg.getOutOfBandUrl() + "\">" + msg.getOutOfBandUrl() + "</a>"); downloadButton->setToolTip("<a href=\"" + msg.getOutOfBandUrl() + "\">" + msg.getOutOfBandUrl() + "</a>");
if (errorDownloadingFile) { if (errorDownloadingFile) {
fileComment->setWordWrap(true); fileComment->setWordWrap(true);
fileComment->setText("Error downloading file: " + errorText + "\nYou can try again"); fileComment->setText(tr("Error downloading file: %1\nYou can try again").arg(QCoreApplication::translate("NetworkErrors", errorText.toLatin1())));
} else { } else {
fileComment->setText(sender->text() + " is offering you to download a file"); fileComment->setText(tr("%1 is offering you to download a file").arg(sender->text()));
} }
fileComment->show(); fileComment->show();
connect(downloadButton, SIGNAL(clicked()), this, SLOT(onDownload())); connect(downloadButton, SIGNAL(clicked()), this, SLOT(onDownload()));
@ -188,7 +188,7 @@ void Message::showFile(const QString& path)
fileComment->show(); fileComment->show();
} }
file->setContextMenuPolicy(Qt::ActionsContextMenu); file->setContextMenuPolicy(Qt::ActionsContextMenu);
QAction* openAction = new QAction(QIcon::fromTheme("document-new-from-template"), "Open", file); QAction* openAction = new QAction(QIcon::fromTheme("document-new-from-template"), tr("Open"), file);
connect(openAction, &QAction::triggered, [path]() { //TODO need to get rid of this shame connect(openAction, &QAction::triggered, [path]() { //TODO need to get rid of this shame
QDesktopServices::openUrl(QUrl::fromLocalFile(path)); QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}); });

View File

@ -39,6 +39,9 @@
<property name="toolTip"> <property name="toolTip">
<string>Your account login</string> <string>Your account login</string>
</property> </property>
<property name="placeholderText">
<string>john_smith1987</string>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
@ -53,6 +56,9 @@
<property name="toolTip"> <property name="toolTip">
<string>A server address of your account. Like 404.city or macaw.me</string> <string>A server address of your account. Like 404.city or macaw.me</string>
</property> </property>
<property name="placeholderText">
<string>macaw.me</string>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
@ -83,6 +89,9 @@
<property name="echoMode"> <property name="echoMode">
<enum>QLineEdit::Password</enum> <enum>QLineEdit::Password</enum>
</property> </property>
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled"> <property name="clearButtonEnabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -100,6 +109,9 @@
<property name="toolTip"> <property name="toolTip">
<string>Just a name how would you call this account, doesn't affect anything</string> <string>Just a name how would you call this account, doesn't affect anything</string>
</property> </property>
<property name="placeholderText">
<string>John</string>
</property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">

View File

@ -120,13 +120,13 @@ void Accounts::updateConnectButton()
} }
if (allConnected) { if (allConnected) {
toDisconnect = true; toDisconnect = true;
m_ui->connectButton->setText("Disconnect"); m_ui->connectButton->setText(tr("Disconnect"));
} else { } else {
toDisconnect = false; toDisconnect = false;
m_ui->connectButton->setText("Connect"); m_ui->connectButton->setText(tr("Connect"));
} }
} else { } else {
m_ui->connectButton->setText("Connect"); m_ui->connectButton->setText(tr("Connect"));
toDisconnect = false; toDisconnect = false;
m_ui->connectButton->setEnabled(false); m_ui->connectButton->setEnabled(false);
} }

View File

@ -56,7 +56,7 @@ void Chat::updateState()
{ {
Shared::Availability av = contact->getAvailability(); Shared::Availability av = contact->getAvailability();
statusIcon->setPixmap(Shared::availabilityIcon(av, true).pixmap(40)); statusIcon->setPixmap(Shared::availabilityIcon(av, true).pixmap(40));
statusIcon->setToolTip(Shared::availabilityNames[av]); statusIcon->setToolTip(QCoreApplication::translate("Global", Shared::availabilityNames[av].toLatin1()));
} }
void Chat::handleSendMessage(const QString& text) void Chat::handleSendMessage(const QString& text)

View File

@ -445,6 +445,9 @@
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="placeholderText">
<string>Type your message here...</string>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>