12 Commits
v0.3.1 ... gc

Author SHA1 Message Date
80b0ea4f0e history for gc fixes 2017-07-20 23:51:40 +03:00
6efb1790bb notifications fix 2017-07-19 19:39:56 +03:00
d5d1e616ba translations update and bug fix 2017-07-19 00:14:41 +03:00
1ea919bdc2 tab && bug fix 2017-07-18 23:36:40 +03:00
65167de1fe group notifications and bug fixes 2017-07-18 21:36:14 +03:00
db519e2608 bug fix and version++ 2017-07-17 22:27:52 +03:00
19893c5c28 chat menu 2017-07-17 22:15:29 +03:00
8e6d37e23c minimal working functionality 2017-07-17 21:53:35 +03:00
aae71d081f base backend for gc 2017-07-17 01:11:09 +03:00
9c129e925b base gc class, callbacks part1 2017-07-16 22:51:20 +03:00
87392ea95a wrapper for old gc (gen) 2017-07-16 20:02:33 +03:00
1bbd9a629c video calls fix 2017-07-15 23:11:49 +03:00
19 changed files with 1156 additions and 556 deletions

View File

@ -346,7 +346,6 @@ def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, u
width // 2 width // 2
It can be created from initial y, u, v using slices
For more info see callback_video_receive_frame docs
"""
try:
y_size = abs(max(width, abs(ystride)))
@ -375,6 +374,55 @@ def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, u
except Exception as ex:
print(ex)
# -----------------------------------------------------------------------------------------------------------------
# Callbacks - groups
# -----------------------------------------------------------------------------------------------------------------
def group_invite(tox, friend_number, gc_type, data, length, user_data):
invoke_in_main_thread(Profile.get_instance().group_invite, friend_number, gc_type,
bytes(data[:length]))
def show_gc_notification(window, tray, message, group_number, peer_number):
profile = Profile.get_instance()
settings = Settings.get_instance()
chat = profile.get_group_by_number(group_number)
peer_name = chat.get_peer_name(peer_number)
if not window.isActiveWindow() and (profile.name in message or settings['group_notifications']):
if settings['notifications'] and profile.status != TOX_USER_STATUS['BUSY'] and not settings.locked:
invoke_in_main_thread(tray_notification, chat.name + ' ' + peer_name, message, tray, window)
if settings['sound_notifications'] and profile.status != TOX_USER_STATUS['BUSY']:
sound_notification(SOUND_NOTIFICATION['MESSAGE'])
invoke_in_main_thread(tray.setIcon, QtGui.QIcon(curr_directory() + '/images/icon_new_messages.png'))
def group_message(window, tray):
def wrapped(tox, group_number, peer_number, message, length, user_data):
message = str(message[:length], 'utf-8')
invoke_in_main_thread(Profile.get_instance().new_gc_message, group_number,
peer_number, TOX_MESSAGE_TYPE['NORMAL'], message)
show_gc_notification(window, tray, message, group_number, peer_number)
return wrapped
def group_action(window, tray):
def wrapped(tox, group_number, peer_number, message, length, user_data):
message = str(message[:length], 'utf-8')
invoke_in_main_thread(Profile.get_instance().new_gc_message, group_number,
peer_number, TOX_MESSAGE_TYPE['ACTION'], message)
show_gc_notification(window, tray, message, group_number, peer_number)
return wrapped
def group_title(tox, group_number, peer_number, title, length, user_data):
invoke_in_main_thread(Profile.get_instance().new_gc_title, group_number,
title[:length])
def group_namelist_change(tox, group_number, peer_number, change, user_data):
invoke_in_main_thread(Profile.get_instance().update_gc, group_number)
# -----------------------------------------------------------------------------------------------------------------
# Callbacks - initialization
# -----------------------------------------------------------------------------------------------------------------
@ -411,3 +459,9 @@ def init_callbacks(tox, window, tray):
tox.callback_friend_lossless_packet(lossless_packet, 0)
tox.callback_friend_lossy_packet(lossy_packet, 0)
tox.callback_group_invite(group_invite)
tox.callback_group_message(group_message(window, tray))
tox.callback_group_action(group_action(window, tray))
tox.callback_group_title(group_title)
tox.callback_group_namelist_change(group_namelist_change)

View File

@ -61,6 +61,8 @@ class Contact(basecontact.BaseContact):
"""
Get all chat history from db for current friend
"""
if self._message_getter is None:
return
data = list(self._message_getter.get_all())
if data is not None and len(data):
data.reverse()
@ -124,7 +126,7 @@ class Contact(basecontact.BaseContact):
# -----------------------------------------------------------------------------------------------------------------
def delete_message(self, time):
elem = list(filter(lambda x: type(x) is TextMessage and x.get_data()[2] == time, self._corr))[0]
elem = list(filter(lambda x: type(x) in (TextMessage, GroupChatMessage) and x.get_data()[2] == time, self._corr))[0]
tmp = list(filter(lambda x: x.get_type() <= 1, self._corr))
if elem in tmp[-self._unsaved_messages:] and self._unsaved_messages:
self._unsaved_messages -= 1

View File

@ -66,3 +66,10 @@ class Friend(contact.Contact):
if self._receipts:
self._receipts -= 1
self.mark_as_sent()
# -----------------------------------------------------------------------------------------------------------------
# Full status
# -----------------------------------------------------------------------------------------------------------------
def get_full_status(self):
return self._status_message

49
toxygen/group_chat.py Normal file
View File

@ -0,0 +1,49 @@
import contact
import util
from PyQt5 import QtGui, QtCore
import toxcore_enums_and_consts as constants
class GroupChat(contact.Contact):
def __init__(self, name, status_message, widget, tox, group_number):
super().__init__(None, group_number, name, status_message, widget, None)
self._tox = tox
self.set_status(constants.TOX_USER_STATUS['NONE'])
def set_name(self, name):
self._tox.group_set_title(self._number, name)
super().set_name(name)
def send_message(self, message):
self._tox.group_message_send(self._number, message.encode('utf-8'))
def new_title(self, title):
super().set_name(title)
def load_avatar(self):
path = util.curr_directory() + '/images/group.png'
width = self._widget.avatar_label.width()
pixmap = QtGui.QPixmap(path)
self._widget.avatar_label.setPixmap(pixmap.scaled(width, width, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.SmoothTransformation))
self._widget.avatar_label.repaint()
def remove_invalid_unsent_files(self):
pass
def get_names(self):
peers_count = self._tox.group_number_peers(self._number)
names = []
for i in range(peers_count):
name = self._tox.group_peername(self._number, i)
names.append(name)
names = sorted(names, key=lambda n: n.lower())
return names
def get_full_status(self):
names = self.get_names()
return '\n'.join(names)
def get_peer_name(self, peer_number):
return self._tox.group_peername(self._number, peer_number)

BIN
toxygen/images/group.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -5,7 +5,6 @@ from widgets import MultilineEdit, ComboBox
import plugin_support
from mainscreen_widgets import *
import settings
import platform
import toxes
@ -41,6 +40,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
self.menuAbout.setObjectName("menuAbout")
self.actionAdd_friend = QtWidgets.QAction(window)
self.actionAdd_gc = QtWidgets.QAction(window)
self.actionAdd_friend.setObjectName("actionAdd_friend")
self.actionprofilesettings = QtWidgets.QAction(window)
self.actionprofilesettings.setObjectName("actionprofilesettings")
@ -64,6 +64,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
self.reloadPlugins = QtWidgets.QAction(window)
self.lockApp = QtWidgets.QAction(window)
self.menuProfile.addAction(self.actionAdd_friend)
self.menuProfile.addAction(self.actionAdd_gc)
self.menuProfile.addAction(self.actionSettings)
self.menuProfile.addAction(self.lockApp)
self.menuSettings.addAction(self.actionPrivacy_settings)
@ -86,6 +87,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
self.actionAbout_program.triggered.connect(self.about_program)
self.actionNetwork.triggered.connect(self.network_settings)
self.actionAdd_friend.triggered.connect(self.add_contact)
self.actionAdd_gc.triggered.connect(self.create_gc)
self.actionSettings.triggered.connect(self.profile_settings)
self.actionPrivacy_settings.triggered.connect(self.privacy_settings)
self.actionInterface_settings.triggered.connect(self.interface_settings)
@ -115,6 +117,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
self.menuSettings.setTitle(QtWidgets.QApplication.translate("MainWindow", "Settings"))
self.menuAbout.setTitle(QtWidgets.QApplication.translate("MainWindow", "About"))
self.actionAdd_friend.setText(QtWidgets.QApplication.translate("MainWindow", "Add contact"))
self.actionAdd_gc.setText(QtWidgets.QApplication.translate("MainWindow", "Create group chat"))
self.actionprofilesettings.setText(QtWidgets.QApplication.translate("MainWindow", "Profile"))
self.actionPrivacy_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Privacy"))
self.actionInterface_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Interface"))
@ -431,6 +434,9 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
self.a_c = AddContact(link or '')
self.a_c.show()
def create_gc(self):
self.profile.create_group_chat()
def profile_settings(self, *args):
self.p_s = ProfileSettings()
self.p_s.show()
@ -512,7 +518,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
def send_file(self):
self.menu.hide()
if self.profile.active_friend + 1:
if self.profile.active_friend + 1and self.profile.is_active_a_friend():
choose = QtWidgets.QApplication.translate("MainWindow", 'Choose file')
name = QtWidgets.QFileDialog.getOpenFileName(self, choose, options=QtWidgets.QFileDialog.DontUseNativeDialog)
if name[0]:
@ -520,7 +526,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
def send_screenshot(self, hide=False):
self.menu.hide()
if self.profile.active_friend + 1:
if self.profile.active_friend + 1 and self.profile.is_active_a_friend():
self.sw = ScreenShotWindow(self)
self.sw.show()
if hide:
@ -538,7 +544,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
def send_sticker(self):
self.menu.hide()
if self.profile.active_friend + 1:
if self.profile.active_friend + 1 and self.profile.is_active_a_friend():
self.sticker = StickerWindow(self)
self.sticker.setGeometry(QtCore.QRect(self.x() if Settings.get_instance()['mirror_mode'] else 270 + self.x(),
self.y() + self.height() - 200,
@ -583,7 +589,10 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
auto = QtWidgets.QApplication.translate("MainWindow", 'Disallow auto accept') if allowed else QtWidgets.QApplication.translate("MainWindow", 'Allow auto accept')
if item is not None:
self.listMenu = QtWidgets.QMenu()
set_alias_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Set alias'))
is_friend = type(friend) is Friend
if is_friend:
set_alias_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Set alias'))
set_alias_item.triggered.connect(lambda: self.set_alias(num))
history_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Chat history'))
clear_history_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Clear history'))
@ -593,26 +602,39 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
copy_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Copy'))
copy_name_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Name'))
copy_status_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Status message'))
copy_key_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Public key'))
if is_friend:
copy_key_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Public key'))
auto_accept_item = self.listMenu.addAction(auto)
remove_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Remove friend'))
block_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Block friend'))
notes_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Notes'))
auto_accept_item = self.listMenu.addAction(auto)
remove_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Remove friend'))
block_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Block friend'))
notes_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Notes'))
plugins_loader = plugin_support.PluginLoader.get_instance()
if plugins_loader is not None:
submenu = plugins_loader.get_menu(self.listMenu, num)
if len(submenu):
plug = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Plugins'))
plug.addActions(submenu)
set_alias_item.triggered.connect(lambda: self.set_alias(num))
remove_item.triggered.connect(lambda: self.remove_friend(num))
block_item.triggered.connect(lambda: self.block_friend(num))
copy_key_item.triggered.connect(lambda: self.copy_friend_key(num))
chats = self.profile.get_group_chats()
if len(chats) and self.profile.is_active_online():
invite_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Invite to group chat'))
for i in range(len(chats)):
name, number = chats[i]
item = invite_menu.addAction(name)
item.triggered.connect(lambda: self.invite_friend_to_gc(num, number))
plugins_loader = plugin_support.PluginLoader.get_instance()
if plugins_loader is not None:
submenu = plugins_loader.get_menu(self.listMenu, num)
if len(submenu):
plug = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Plugins'))
plug.addActions(submenu)
copy_key_item.triggered.connect(lambda: self.copy_friend_key(num))
remove_item.triggered.connect(lambda: self.remove_friend(num))
block_item.triggered.connect(lambda: self.block_friend(num))
auto_accept_item.triggered.connect(lambda: self.auto_accept(num, not allowed))
notes_item.triggered.connect(lambda: self.show_note(friend))
else:
leave_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Leave chat'))
set_title_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Set title'))
leave_item.triggered.connect(lambda: self.leave_gc(num))
set_title_item.triggered.connect(lambda: self.set_title(num))
clear_history_item.triggered.connect(lambda: self.clear_history(num))
auto_accept_item.triggered.connect(lambda: self.auto_accept(num, not allowed))
notes_item.triggered.connect(lambda: self.show_note(friend))
copy_name_item.triggered.connect(lambda: self.copy_name(friend))
copy_status_item.triggered.connect(lambda: self.copy_status(friend))
export_to_text_item.triggered.connect(lambda: self.export_history(num))
@ -675,6 +697,12 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
def clear_history(self, num):
self.profile.clear_history(num)
def leave_gc(self, num):
self.profile.leave_gc(num)
def set_title(self, num):
self.profile.set_title(num)
def auto_accept(self, num, value):
settings = Settings.get_instance()
tox_id = self.profile.friend_public_key(num)
@ -684,6 +712,9 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
settings['auto_accept_from_friends'].remove(tox_id)
settings.save()
def invite_friend_to_gc(self, friend_number, group_number):
self.profile.invite_friend(friend_number, group_number)
# -----------------------------------------------------------------------------------------------------------------
# Functions which called when user click somewhere else
# -----------------------------------------------------------------------------------------------------------------

View File

@ -34,6 +34,10 @@ class MessageArea(QtWidgets.QPlainTextEdit):
self.parent.send_message()
elif event.key() == QtCore.Qt.Key_Up and not self.toPlainText():
self.appendPlainText(Profile.get_instance().get_last_message())
elif event.key() == QtCore.Qt.Key_Tab and not self.parent.profile.is_active_a_friend():
text = self.toPlainText()
pos = self.textCursor().position()
self.insertPlainText(Profile.get_instance().get_gc_peer_name(text[:pos]))
else:
self.parent.profile.send_typing(True)
if self.timer.isActive():

View File

@ -508,15 +508,17 @@ class NotificationsSettings(CenteredWidget):
def initUI(self):
self.setObjectName("notificationsForm")
self.resize(350, 180)
self.setMinimumSize(QtCore.QSize(350, 180))
self.setMaximumSize(QtCore.QSize(350, 180))
self.resize(350, 210)
self.setMinimumSize(QtCore.QSize(350, 210))
self.setMaximumSize(QtCore.QSize(350, 210))
self.enableNotifications = QtWidgets.QCheckBox(self)
self.enableNotifications.setGeometry(QtCore.QRect(10, 20, 340, 18))
self.callsSound = QtWidgets.QCheckBox(self)
self.callsSound.setGeometry(QtCore.QRect(10, 120, 340, 18))
self.callsSound.setGeometry(QtCore.QRect(10, 170, 340, 18))
self.soundNotifications = QtWidgets.QCheckBox(self)
self.soundNotifications.setGeometry(QtCore.QRect(10, 70, 340, 18))
self.groupNotifications = QtWidgets.QCheckBox(self)
self.groupNotifications.setGeometry(QtCore.QRect(10, 120, 340, 18))
font = QtGui.QFont()
s = Settings.get_instance()
font.setFamily(s['font'])
@ -524,8 +526,10 @@ class NotificationsSettings(CenteredWidget):
self.callsSound.setFont(font)
self.soundNotifications.setFont(font)
self.enableNotifications.setFont(font)
self.groupNotifications.setFont(font)
self.enableNotifications.setChecked(s['notifications'])
self.soundNotifications.setChecked(s['sound_notifications'])
self.groupNotifications.setChecked(s['group_notifications'])
self.callsSound.setChecked(s['calls_sound'])
self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
@ -533,6 +537,7 @@ class NotificationsSettings(CenteredWidget):
def retranslateUi(self):
self.setWindowTitle(QtWidgets.QApplication.translate("notificationsForm", "Notification settings"))
self.enableNotifications.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable notifications"))
self.groupNotifications.setText(QtWidgets.QApplication.translate("notificationsForm", "Notify about all messages in groups"))
self.callsSound.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable call\'s sound"))
self.soundNotifications.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable sound notifications"))
@ -540,6 +545,7 @@ class NotificationsSettings(CenteredWidget):
settings = Settings.get_instance()
settings['notifications'] = self.enableNotifications.isChecked()
settings['sound_notifications'] = self.soundNotifications.isChecked()
settings['group_notifications'] = self.groupNotifications.isChecked()
settings['calls_sound'] = self.callsSound.isChecked()
settings.save()
@ -881,6 +887,8 @@ class VideoSettings(CenteredWidget):
self.desktopAreaSelection = DesktopAreaSelectionWindow(self)
def closeEvent(self, event):
if self.input.currentIndex() == 0:
return
try:
settings = Settings.get_instance()
settings.video['device'] = self.devices[self.input.currentIndex()]

View File

@ -5,7 +5,9 @@ MESSAGE_TYPE = {
'ACTION': 1,
'FILE_TRANSFER': 2,
'INLINE': 3,
'INFO_MESSAGE': 4
'INFO_MESSAGE': 4,
'GC_TEXT': 5,
'GC_ACTION': 6
}
@ -39,6 +41,16 @@ class TextMessage(Message):
return self._message, self._owner, self._time, self._type
class GroupChatMessage(TextMessage):
def __init__(self, message, owner, time, message_type, name):
super().__init__(message, owner, time, message_type)
self._user_name = name
def get_data(self):
return self._message, self._owner, self._time, self._type, self._user_name
class TransferMessage(Message):
"""
Message with info about file transfer

View File

@ -16,6 +16,8 @@ import basecontact
import items_factory
import cv2
import threading
from group_chat import *
import re
class Profile(basecontact.BaseContact, Singleton):
@ -129,6 +131,7 @@ class Profile(basecontact.BaseContact, Singleton):
filter_str = filter_str.lower()
settings = Settings.get_instance()
number = self.get_active_number()
is_friend = self.is_active_a_friend()
if sorting > 1:
if sorting & 2:
self._contacts = sorted(self._contacts, key=lambda x: int(x.status is not None), reverse=True)
@ -164,7 +167,7 @@ class Profile(basecontact.BaseContact, Singleton):
self._sorting, self._filter_string = sorting, filter_str
settings['sorting'] = self._sorting
settings.save()
self.set_active_by_number(number)
self.set_active_by_number_and_type(number, is_friend)
def update_filtration(self):
"""
@ -177,7 +180,7 @@ class Profile(basecontact.BaseContact, Singleton):
# -----------------------------------------------------------------------------------------------------------------
def get_friend_by_number(self, num):
return list(filter(lambda x: x.number == num, self._contacts))[0]
return list(filter(lambda x: x.number == num and type(x) is Friend, self._contacts))[0]
def get_friend(self, num):
if num < 0 or num >= len(self._contacts):
@ -204,6 +207,7 @@ class Profile(basecontact.BaseContact, Singleton):
if value == -1: # all friends were deleted
self._screen.account_name.setText('')
self._screen.account_status.setText('')
self._screen.account_status.setToolTip('')
self._active_friend = -1
self._screen.account_avatar.setHidden(True)
self._messages.clear()
@ -251,12 +255,15 @@ class Profile(basecontact.BaseContact, Singleton):
print('Incoming not started transfer - no info found')
elif message.get_type() == MESSAGE_TYPE['INLINE']: # inline
self.create_inline_item(message.get_data())
else: # info message
elif message.get_type() < 5: # info message
data = message.get_data()
self.create_message_item(data[0],
data[2],
'',
data[3])
else:
data = message.get_data()
self.create_gc_message_item(data[0], data[2], data[1], data[4], data[3])
self._messages.scrollToBottom()
self._load_history = True
if value in self._call:
@ -270,7 +277,11 @@ class Profile(basecontact.BaseContact, Singleton):
self._screen.account_name.setText(friend.name)
self._screen.account_status.setText(friend.status_message)
avatar_path = (ProfileHelper.get_path() + 'avatars/{}.png').format(friend.tox_id[:TOX_PUBLIC_KEY_SIZE * 2])
self._screen.account_status.setToolTip(friend.get_full_status())
if friend.tox_id is None:
avatar_path = curr_directory() + '/images/group.png'
else:
avatar_path = (ProfileHelper.get_path() + 'avatars/{}.png').format(friend.tox_id[:TOX_PUBLIC_KEY_SIZE * 2])
if not os.path.isfile(avatar_path): # load default image
avatar_path = curr_directory() + '/images/avatar.png'
os.chdir(os.path.dirname(avatar_path))
@ -282,9 +293,10 @@ class Profile(basecontact.BaseContact, Singleton):
log('Error in set active: ' + str(ex))
raise
def set_active_by_number(self, number):
def set_active_by_number_and_type(self, number, is_friend):
for i in range(len(self._contacts)):
if self._contacts[i].number == number:
c = self._contacts[i]
if c.number == number and (type(c) is Friend == is_friend):
self._active_friend = i
break
@ -347,7 +359,7 @@ class Profile(basecontact.BaseContact, Singleton):
elif data[1] == friend_number and not data[2]:
self.send_file(data[0], friend_number, True, key)
del self._paused_file_transfers[key]
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
self.update()
except Exception as ex:
print('Exception in file sending: ' + str(ex))
@ -389,7 +401,7 @@ class Profile(basecontact.BaseContact, Singleton):
"""
Display incoming typing notification
"""
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
self._screen.typing.setVisible(typing)
# -----------------------------------------------------------------------------------------------------------------
@ -445,7 +457,7 @@ class Profile(basecontact.BaseContact, Singleton):
:param message_type: message type - plain text or action message (/me)
:param message: text of message
"""
if friend_num == self.get_active_number(): # add message to list
if friend_num == self.get_active_number()and self.is_active_a_friend(): # add message to list
t = time.time()
self.create_message_item(message, t, MESSAGE_OWNER['FRIEND'], message_type)
self._messages.scrollToBottom()
@ -465,6 +477,9 @@ class Profile(basecontact.BaseContact, Singleton):
:param text: message text
:param friend_num: num of friend
"""
if not self.is_active_a_friend():
self.send_gc_message(text)
return
if friend_num is None:
friend_num = self.get_active_number()
if text.startswith('/plugin '):
@ -480,8 +495,8 @@ class Profile(basecontact.BaseContact, Singleton):
friend.inc_receipts()
if friend.status is not None:
self.split_and_send(friend.number, message_type, text.encode('utf-8'))
if friend.number == self.get_active_number():
t = time.time()
t = time.time()
if friend.number == self.get_active_number() and self.is_active_a_friend():
self.create_message_item(text, t, MESSAGE_OWNER['NOT_SENT'], message_type)
self._screen.messageEdit.clear()
self._messages.scrollToBottom()
@ -504,7 +519,7 @@ class Profile(basecontact.BaseContact, Singleton):
s = Settings.get_instance()
if hasattr(self, '_history'):
if s['save_history']:
for friend in self._contacts:
for friend in filter(lambda x: type(x) is Friend, self._contacts):
if not self._history.friend_exists_in_db(friend.tox_id):
self._history.add_friend_to_db(friend.tox_id)
if not s['save_unsent_only']:
@ -636,6 +651,16 @@ class Profile(basecontact.BaseContact, Singleton):
return self._factory.message_item(text, time, name, owner != MESSAGE_OWNER['NOT_SENT'],
message_type, append, pixmap)
def create_gc_message_item(self, text, time, owner, name, message_type, append=True):
pixmap = None
if self._show_avatars:
if owner == MESSAGE_OWNER['FRIEND']:
pixmap = self.get_curr_friend().get_pixmap()
else:
pixmap = self.get_pixmap()
return self._factory.message_item(text, time, name, True,
message_type - 5, append, pixmap)
def create_file_transfer_item(self, tm, append=True):
data = list(tm.get_data())
data[3] = self.get_friend_by_number(data[4]).name if data[3] else self._name
@ -692,7 +717,7 @@ class Profile(basecontact.BaseContact, Singleton):
except:
pass
settings.save()
if num == self.get_active_number():
if num == self.get_active_number() and self.is_active_a_friend():
self.update()
def friend_public_key(self, num):
@ -863,7 +888,7 @@ class Profile(basecontact.BaseContact, Singleton):
QtCore.QTimer.singleShot(50000, self.reconnect)
def close(self):
for friend in self._contacts:
for friend in filter(lambda x: type(x) is Friend, self._contacts):
self.friend_exit(friend.number)
for i in range(len(self._contacts)):
del self._contacts[0]
@ -936,7 +961,7 @@ class Profile(basecontact.BaseContact, Singleton):
friend_number,
file_number)
accepted = False
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
item = self.create_file_transfer_item(tm)
if accepted:
self._file_transfers[(friend_number, file_number)].set_state_changed_handler(item.update_transfer_state)
@ -967,7 +992,7 @@ class Profile(basecontact.BaseContact, Singleton):
else:
if not already_cancelled:
self._tox.file_control(friend_number, file_number, TOX_FILE_CONTROL['CANCEL'])
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
tmp = self._messages.count() + i
if tmp >= 0:
self._messages.itemWidget(self._messages.item(tmp)).update(TOX_FILE_TRANSFER_STATE['CANCELLED'],
@ -1121,7 +1146,7 @@ class Profile(basecontact.BaseContact, Singleton):
t = type(transfer)
if t is ReceiveAvatar:
self.get_friend_by_number(friend_number).load_avatar()
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
self.set_active(None)
elif t is ReceiveToBuffer or (t is SendFromBuffer and Settings.get_instance()['allow_inline']): # inline image
print('inline')
@ -1129,7 +1154,7 @@ class Profile(basecontact.BaseContact, Singleton):
i = self.get_friend_by_number(friend_number).update_transfer_data(file_number,
TOX_FILE_TRANSFER_STATE['FINISHED'],
inline)
if friend_number == self.get_active_number():
if friend_number == self.get_active_number() and self.is_active_a_friend():
count = self._messages.count()
if count + i + 1 >= 0:
elem = QtWidgets.QListWidgetItem()
@ -1171,7 +1196,7 @@ class Profile(basecontact.BaseContact, Singleton):
ra.set_transfer_finished_handler(self.transfer_finished)
else:
self.get_friend_by_number(friend_number).load_avatar()
if self.get_active_number() == friend_number:
if self.get_active_number() == friend_number and self.is_active_a_friend():
self.set_active(None)
def reset_avatar(self):
@ -1196,6 +1221,8 @@ class Profile(basecontact.BaseContact, Singleton):
def call_click(self, audio=True, video=False):
"""User clicked audio button in main window"""
num = self.get_active_number()
if not self.is_active_a_friend():
return
if num not in self._call and self.is_active_online(): # start call
if not Settings.get_instance().audio['enabled']:
return
@ -1265,6 +1292,130 @@ class Profile(basecontact.BaseContact, Singleton):
self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
self._messages.scrollToBottom()
# -----------------------------------------------------------------------------------------------------------------
# GC support
# -----------------------------------------------------------------------------------------------------------------
def is_active_a_friend(self):
return type(self.get_curr_friend()) is Friend
def get_group_by_number(self, number):
groups = filter(lambda x: type(x) is GroupChat and x.number == number, self._contacts)
return list(groups)[0]
def add_gc(self, number):
widget = self.create_friend_item()
gc = GroupChat('Group chat #' + str(number), '', widget, self._tox, number)
self._contacts.append(gc)
def create_group_chat(self):
number = self._tox.add_av_groupchat()
self.add_gc(number)
def leave_gc(self, num):
gc = self._contacts[num]
self._tox.del_groupchat(gc.number)
del self._contacts[num]
self._screen.friends_list.takeItem(num)
if num == self._active_friend: # active friend was deleted
if not len(self._contacts): # last friend was deleted
self.set_active(-1)
else:
self.set_active(0)
def group_invite(self, friend_number, gc_type, data):
text = QtWidgets.QApplication.translate('MainWindow', 'User {} invites you to group chat. Accept?')
title = QtWidgets.QApplication.translate('MainWindow', 'Group chat invite')
friend = self.get_friend_by_number(friend_number)
reply = QtWidgets.QMessageBox.question(None, title, text.format(friend.name), QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes: # accepted
if gc_type == TOX_GROUPCHAT_TYPE['TEXT']:
number = self._tox.join_groupchat(friend_number, data)
else:
number = self._tox.join_av_groupchat(friend_number, data)
self.add_gc(number)
def new_gc_message(self, group_number, peer_number, message_type, message):
name = self._tox.group_peername(group_number, peer_number)
message_type += 5
if group_number == self.get_active_number() and not self.is_active_a_friend(): # add message to list
t = time.time()
self.create_gc_message_item(message, t, MESSAGE_OWNER['FRIEND'], name, message_type)
self._messages.scrollToBottom()
self.get_curr_friend().append_message(
GroupChatMessage(message, MESSAGE_OWNER['FRIEND'], t, message_type, name))
else:
gc = self.get_group_by_number(group_number)
gc.inc_messages()
gc.append_message(
GroupChatMessage(message, MESSAGE_OWNER['FRIEND'], time.time(), message_type, name))
if not gc.visibility:
self.update_filtration()
def new_gc_title(self, group_number, title):
gc = self.get_group_by_number(group_number)
gc.new_title(title)
if not self.is_active_a_friend() and self.get_active_number() == group_number:
self.update()
def update_gc(self, group_number):
count = self._tox.group_number_peers(group_number)
gc = self.get_group_by_number(group_number)
text = QtWidgets.QApplication.translate('MainWindow', '{} users in chat')
gc.status_message = text.format(str(count)).encode('utf-8')
if not self.is_active_a_friend() and self.get_active_number() == group_number:
self.update()
def send_gc_message(self, text):
group_number = self.get_active_number()
if text.startswith('/me '):
text = text[4:]
self._tox.group_action_send(group_number, text.encode('utf-8'))
else:
self._tox.group_message_send(group_number, text.encode('utf-8'))
self._screen.messageEdit.clear()
def set_title(self, num):
"""
Set new title for gc
"""
gc = self._contacts[num]
name = gc.name
dialog = QtWidgets.QApplication.translate('MainWindow',
"Enter new title for group {}:")
dialog = dialog.format(name)
title = QtWidgets.QApplication.translate('MainWindow',
'Set title')
text, ok = QtWidgets.QInputDialog.getText(None,
title,
dialog,
QtWidgets.QLineEdit.Normal,
name)
if ok:
text = text.encode('utf-8')
self._tox.group_set_title(gc.number, text)
self.new_gc_title(gc.number, text)
def get_group_chats(self):
chats = filter(lambda x: type(x) is GroupChat, self._contacts)
chats = map(lambda c: (c.name, c.number), chats)
return list(chats)
def invite_friend(self, friend_num, group_number):
friend = self._contacts[friend_num]
self._tox.invite_friend(friend.number, group_number)
def get_gc_peer_name(self, text):
gc = self.get_curr_friend()
if type(gc) is not GroupChat:
return '\t'
names = gc.get_names()
name = re.split("\s+", text)[-1]
suggested_names = list(filter(lambda x: x.startswith(name), names))
if not len(suggested_names):
return '\t'
return suggested_names[0][len(name):] + ': '
def tox_factory(data=None, settings=None):
"""

View File

@ -144,7 +144,8 @@ class Settings(dict, Singleton):
'show_welcome_screen': True,
'close_to_tray': False,
'font': 'Times New Roman',
'update': 1
'update': 1,
'group_notifications': True
}
@staticmethod

View File

@ -1,5 +1,4 @@
from ctypes import c_char_p, Structure, c_bool, byref, c_int, c_size_t, POINTER, c_uint16, c_void_p, c_uint64
from ctypes import create_string_buffer, ArgumentError, CFUNCTYPE, c_uint32, sizeof, c_uint8
from ctypes import *
from toxcore_enums_and_consts import *
from toxav import ToxAV
from libtox import LibToxCore
@ -91,6 +90,11 @@ class Tox:
self.file_recv_chunk_cb = None
self.friend_lossy_packet_cb = None
self.friend_lossless_packet_cb = None
self.group_namelist_change_cb = None
self.group_title_cb = None
self.group_action_cb = None
self.group_message_cb = None
self.group_invite_cb = None
self.AV = ToxAV(self._tox_pointer)
@ -1509,3 +1513,89 @@ class Tox:
return result
elif tox_err_get_port == TOX_ERR_GET_PORT['NOT_BOUND']:
raise RuntimeError('The instance was not bound to any port.')
# -----------------------------------------------------------------------------------------------------------------
# Group chats
# -----------------------------------------------------------------------------------------------------------------
def del_groupchat(self, groupnumber):
result = Tox.libtoxcore.tox_del_groupchat(self._tox_pointer, c_int(groupnumber), None)
return result
def group_peername(self, groupnumber, peernumber):
buffer = create_string_buffer(TOX_MAX_NAME_LENGTH)
result = Tox.libtoxcore.tox_group_peername(self._tox_pointer, c_int(groupnumber), c_int(peernumber),
buffer, None)
return str(buffer[:result], 'utf-8')
def invite_friend(self, friendnumber, groupnumber):
result = Tox.libtoxcore.tox_invite_friend(self._tox_pointer, c_int(friendnumber),
c_int(groupnumber), None)
return result
def join_groupchat(self, friendnumber, data):
result = Tox.libtoxcore.tox_join_groupchat(self._tox_pointer,
c_int(friendnumber), c_char_p(data), c_uint16(len(data)), None)
return result
def group_message_send(self, groupnumber, message):
result = Tox.libtoxcore.tox_group_message_send(self._tox_pointer, c_int(groupnumber), c_char_p(message),
c_uint16(len(message)), None)
return result
def group_action_send(self, groupnumber, action):
result = Tox.libtoxcore.tox_group_action_send(self._tox_pointer,
c_int(groupnumber), c_char_p(action),
c_uint16(len(action)), None)
return result
def group_set_title(self, groupnumber, title):
result = Tox.libtoxcore.tox_group_set_title(self._tox_pointer, c_int(groupnumber),
c_char_p(title), c_uint8(len(title)), None)
return result
def group_get_title(self, groupnumber):
buffer = create_string_buffer(TOX_MAX_NAME_LENGTH)
result = Tox.libtoxcore.tox_group_get_title(self._tox_pointer,
c_int(groupnumber), buffer,
c_uint32(TOX_MAX_NAME_LENGTH), None)
return str(buffer[:result], 'utf-8')
def group_number_peers(self, groupnumber):
result = Tox.libtoxcore.tox_group_number_peers(self._tox_pointer, c_int(groupnumber), None)
return result
def add_av_groupchat(self):
result = self.AV.libtoxav.toxav_add_av_groupchat(self._tox_pointer, None, None)
return result
def join_av_groupchat(self, friendnumber, data):
result = self.AV.libtoxav.toxav_join_av_groupchat(self._tox_pointer, c_int32(friendnumber),
c_char_p(data), c_uint16(len(data)),
None, None)
return result
def callback_group_invite(self, callback, user_data=None):
c_callback = CFUNCTYPE(None, c_void_p, c_int32, c_uint8, POINTER(c_uint8), c_uint16, c_void_p)
self.group_invite_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_group_invite(self._tox_pointer, self.group_invite_cb, user_data)
def callback_group_message(self, callback, user_data=None):
c_callback = CFUNCTYPE(None, c_void_p, c_int, c_int, c_char_p, c_uint16, c_void_p)
self.group_message_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_group_message(self._tox_pointer, self.group_message_cb, user_data)
def callback_group_action(self, callback, user_data=None):
c_callback = CFUNCTYPE(None, c_void_p, c_int, c_int, c_char_p, c_uint16, c_void_p)
self.group_action_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_group_action(self._tox_pointer, self.group_action_cb, user_data)
def callback_group_title(self, callback, user_data=None):
c_callback = CFUNCTYPE(None, c_void_p, c_int, c_int, c_char_p, c_uint8, c_void_p)
self.group_title_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_group_title(self._tox_pointer, self.group_title_cb, user_data)
def callback_group_namelist_change(self, callback, user_data=None):
c_callback = CFUNCTYPE(None, c_void_p, c_int, c_int, c_uint8, c_void_p)
self.group_namelist_change_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_group_namelist_change(self._tox_pointer, self.group_namelist_change_cb, user_data)

View File

@ -188,6 +188,17 @@ TOX_ERR_GET_PORT = {
'NOT_BOUND': 1,
}
TOX_CHAT_CHANGE = {
'PEER_ADD': 0,
'PEER_DEL': 1,
'PEER_NAME': 2
}
TOX_GROUPCHAT_TYPE = {
'TEXT': 0,
'AV': 1
}
TOX_PUBLIC_KEY_SIZE = 32
TOX_ADDRESS_SIZE = TOX_PUBLIC_KEY_SIZE + 6

View File

@ -84,98 +84,98 @@ can produce IP leak</source>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="118"/>
<location filename="mainscreen.py" line="121"/>
<source>Profile</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="124"/>
<location filename="mainscreen.py" line="127"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="417"/>
<location filename="mainscreen.py" line="420"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="117"/>
<location filename="mainscreen.py" line="119"/>
<source>Add contact</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="119"/>
<location filename="mainscreen.py" line="122"/>
<source>Privacy</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<location filename="mainscreen.py" line="123"/>
<source>Interface</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="121"/>
<location filename="mainscreen.py" line="124"/>
<source>Notifications</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="122"/>
<location filename="mainscreen.py" line="125"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="123"/>
<location filename="mainscreen.py" line="126"/>
<source>About program</source>
<translation></translation>
</message>
<message>
<location filename="profile.py" line="827"/>
<location filename="profile.py" line="852"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation></translation>
</message>
<message>
<location filename="profile.py" line="829"/>
<location filename="profile.py" line="854"/>
<source>Friend request</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="517"/>
<location filename="mainscreen.py" line="523"/>
<source>Choose file</source>
<translation>Choose file</translation>
</message>
<message>
<location filename="mainscreen.py" line="583"/>
<location filename="mainscreen.py" line="589"/>
<source>Disallow auto accept</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="584"/>
<location filename="mainscreen.py" line="590"/>
<source>Allow auto accept</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="586"/>
<location filename="mainscreen.py" line="594"/>
<source>Set alias</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="589"/>
<location filename="mainscreen.py" line="598"/>
<source>Clear history</source>
<translation></translation>
</message>
<message>
<location filename="mainscreen.py" line="599"/>
<location filename="mainscreen.py" line="609"/>
<source>Remove friend</source>
<translation></translation>
</message>
<message>
<location filename="profile.py" line="667"/>
<location filename="profile.py" line="692"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation>Enter new alias for friend {} or leave empty to use friend&apos;s name:</translation>
</message>
<message>
<location filename="mainscreen.py" line="125"/>
<location filename="mainscreen.py" line="128"/>
<source>Audio</source>
<translation>Audio</translation>
</message>
@ -185,24 +185,24 @@ can produce IP leak</source>
<translation type="obsolete">Find contact</translation>
</message>
<message>
<location filename="profile.py" line="799"/>
<location filename="profile.py" line="824"/>
<source>Friend added</source>
<translation>Friend added</translation>
</message>
<message>
<location filename="mainscreen.py" line="418"/>
<location filename="mainscreen.py" line="421"/>
<source>Toxygen is Tox client written on Python.
Version: </source>
<translation>Toxygen is Tox client written on Python.
Version:</translation>
</message>
<message>
<location filename="profile.py" line="800"/>
<location filename="profile.py" line="825"/>
<source>Friend added without sending friend request</source>
<translation>Friend added without sending friend request</translation>
</message>
<message>
<location filename="mainscreen.py" line="643"/>
<location filename="mainscreen.py" line="665"/>
<source>Choose folder</source>
<translation>Choose folder</translation>
</message>
@ -217,47 +217,47 @@ Version:</translation>
<translation type="obsolete">Send file</translation>
</message>
<message>
<location filename="mainscreen.py" line="129"/>
<location filename="mainscreen.py" line="132"/>
<source>Send message</source>
<translation>Send message</translation>
</message>
<message>
<location filename="mainscreen.py" line="130"/>
<location filename="mainscreen.py" line="133"/>
<source>Start audio call with friend</source>
<translation>Start audio call with friend</translation>
</message>
<message>
<location filename="mainscreen.py" line="607"/>
<location filename="mainscreen.py" line="625"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="113"/>
<location filename="mainscreen.py" line="115"/>
<source>List of plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="408"/>
<location filename="mainscreen_widgets.py" line="412"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="132"/>
<location filename="mainscreen.py" line="135"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="133"/>
<location filename="mainscreen.py" line="136"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="601"/>
<location filename="mainscreen.py" line="611"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="628"/>
<location filename="mainscreen.py" line="650"/>
<source>Notes about user</source>
<translation type="unfinished"></translation>
</message>
@ -307,7 +307,7 @@ Version:</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="315"/>
<location filename="profile.py" line="327"/>
<source>User {} is now known as {}</source>
<translation type="unfinished"></translation>
</message>
@ -317,32 +317,32 @@ Version:</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="111"/>
<location filename="mainscreen.py" line="113"/>
<source>Lock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="491"/>
<location filename="mainscreen.py" line="497"/>
<source>Cannot lock app</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="493"/>
<location filename="mainscreen.py" line="499"/>
<source>Error. Profile password is not set.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="594"/>
<location filename="mainscreen.py" line="603"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="595"/>
<location filename="mainscreen.py" line="604"/>
<source>Status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="596"/>
<location filename="mainscreen.py" line="606"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
@ -357,32 +357,32 @@ Version:</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="661"/>
<location filename="menu.py" line="667"/>
<source>Choose folder with sticker pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="673"/>
<location filename="menu.py" line="679"/>
<source>Choose folder with smiley pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="141"/>
<location filename="mainscreen.py" line="144"/>
<source>Import plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="470"/>
<location filename="mainscreen.py" line="476"/>
<source>Choose folder with plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="479"/>
<location filename="mainscreen.py" line="485"/>
<source>Restart Toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="481"/>
<location filename="mainscreen.py" line="487"/>
<source>Plugin will be loaded after restart</source>
<translation type="unfinished"></translation>
</message>
@ -392,85 +392,125 @@ Version:</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="588"/>
<location filename="mainscreen.py" line="597"/>
<source>Chat history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="590"/>
<location filename="mainscreen.py" line="599"/>
<source>Export as text</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="591"/>
<location filename="mainscreen.py" line="600"/>
<source>Export as HTML</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="127"/>
<location filename="mainscreen.py" line="130"/>
<source>Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="134"/>
<location filename="mainscreen.py" line="137"/>
<source>Online first</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="136"/>
<location filename="mainscreen.py" line="139"/>
<source>Online and by name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="137"/>
<location filename="mainscreen.py" line="140"/>
<source>Online first and by name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="600"/>
<location filename="mainscreen.py" line="610"/>
<source>Block friend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="470"/>
<location filename="mainscreen_widgets.py" line="474"/>
<source>Not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="468"/>
<location filename="mainscreen_widgets.py" line="472"/>
<source>Text &quot;{}&quot; was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="142"/>
<location filename="mainscreen.py" line="145"/>
<source>Reload plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="126"/>
<location filename="mainscreen.py" line="129"/>
<source>Video</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1328"/>
<source>User {} invites you to group chat. Accept?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1329"/>
<source>Group chat invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1365"/>
<source>{} users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1386"/>
<source>Enter new title for group {}:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="634"/>
<source>Set title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<source>Create group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="615"/>
<source>Invite to group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="633"/>
<source>Leave chat</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MenuWindow</name>
<message>
<location filename="mainscreen_widgets.py" line="213"/>
<location filename="mainscreen_widgets.py" line="217"/>
<source>Send screenshot</source>
<translation type="unfinished">Send screenshot</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="214"/>
<location filename="mainscreen_widgets.py" line="218"/>
<source>Send file</source>
<translation type="unfinished">Send file</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="215"/>
<location filename="mainscreen_widgets.py" line="219"/>
<source>Add smiley</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="216"/>
<location filename="mainscreen_widgets.py" line="220"/>
<source>Send sticker</source>
<translation type="unfinished"></translation>
</message>
@ -542,42 +582,42 @@ Version:</translation>
<context>
<name>PluginsForm</name>
<message>
<location filename="menu.py" line="957"/>
<location filename="menu.py" line="967"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="958"/>
<location filename="menu.py" line="968"/>
<source>Open selected plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>No GUI found for this plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="985"/>
<location filename="menu.py" line="995"/>
<source>No description available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1001"/>
<location filename="menu.py" line="1011"/>
<source>Disable plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1003"/>
<location filename="menu.py" line="1013"/>
<source>Enable plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="993"/>
<location filename="menu.py" line="1003"/>
<source>No plugins found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@ -718,67 +758,67 @@ Version:</translation>
<context>
<name>WelcomeScreen</name>
<message>
<location filename="mainscreen_widgets.py" line="291"/>
<location filename="mainscreen_widgets.py" line="295"/>
<source>Don&apos;t show again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="292"/>
<location filename="mainscreen_widgets.py" line="296"/>
<source>Tip of the day</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="297"/>
<location filename="mainscreen_widgets.py" line="301"/>
<source>Press Esc if you want hide app to tray.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="303"/>
<location filename="mainscreen_widgets.py" line="307"/>
<source>You can use Tox over Tor. For more info read &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;this post&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="309"/>
<location filename="mainscreen_widgets.py" line="313"/>
<source>Set profile password via Profile -&gt; Settings. Password allows Toxygen encrypt your history and settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="300"/>
<location filename="mainscreen_widgets.py" line="304"/>
<source>Right click on screenshot button hides app to tray during screenshot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="306"/>
<location filename="mainscreen_widgets.py" line="310"/>
<source>Use Settings -&gt; Interface to customize interface.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="315"/>
<location filename="mainscreen_widgets.py" line="319"/>
<source>Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="327"/>
<location filename="mainscreen_widgets.py" line="331"/>
<source>Set new NoSpam to avoid spam friend requests: Profile -&gt; Settings -&gt; Set new NoSpam.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="321"/>
<location filename="mainscreen_widgets.py" line="325"/>
<source>Delete single message in chat: make right click on spinner or message time and choose &quot;Delete&quot; in menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="324"/>
<location filename="mainscreen_widgets.py" line="328"/>
<source>Use right click on inline image to save it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="312"/>
<location filename="mainscreen_widgets.py" line="316"/>
<source>Since v0.1.3 Toxygen supports plugins. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;Read more&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="318"/>
<location filename="mainscreen_widgets.py" line="322"/>
<source>New in Toxygen 0.3.0:&lt;br&gt;Video calls&lt;br&gt;Python3.6 support&lt;br&gt;Migration to PyQt5</source>
<translation type="unfinished"></translation>
</message>
@ -786,17 +826,17 @@ Version:</translation>
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="794"/>
<location filename="menu.py" line="800"/>
<source>Audio settings</source>
<translation>Audio settings</translation>
</message>
<message>
<location filename="menu.py" line="795"/>
<location filename="menu.py" line="801"/>
<source>Input device:</source>
<translation>Input device:</translation>
</message>
<message>
<location filename="menu.py" line="796"/>
<location filename="menu.py" line="802"/>
<source>Output device:</source>
<translation>Output device:</translation>
</message>
@ -804,32 +844,32 @@ Version:</translation>
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1223"/>
<location filename="profile.py" line="1250"/>
<source>Incoming video call</source>
<translation>Incoming video call</translation>
</message>
<message>
<location filename="profile.py" line="1225"/>
<location filename="profile.py" line="1252"/>
<source>Incoming audio call</source>
<translation>Incoming audio call</translation>
</message>
<message>
<location filename="profile.py" line="1206"/>
<location filename="profile.py" line="1233"/>
<source>Outgoing video call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1208"/>
<location filename="profile.py" line="1235"/>
<source>Outgoing audio call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1254"/>
<location filename="profile.py" line="1281"/>
<source>Call declined</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1256"/>
<location filename="profile.py" line="1283"/>
<source>Call finished</source>
<translation type="unfinished"></translation>
</message>
@ -837,82 +877,82 @@ Version:</translation>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="644"/>
<location filename="menu.py" line="650"/>
<source>Interface settings</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="645"/>
<location filename="menu.py" line="651"/>
<source>Theme:</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="646"/>
<location filename="menu.py" line="652"/>
<source>Language:</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="647"/>
<location filename="menu.py" line="653"/>
<source>Smileys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="648"/>
<location filename="menu.py" line="654"/>
<source>Smiley pack:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="649"/>
<location filename="menu.py" line="655"/>
<source>Mirror mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="650"/>
<location filename="menu.py" line="656"/>
<source>Messages font size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart app to apply settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="651"/>
<location filename="menu.py" line="657"/>
<source>Select unread messages notification color</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="652"/>
<location filename="menu.py" line="658"/>
<source>Compact contact list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="653"/>
<location filename="menu.py" line="659"/>
<source>Import smiley pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="654"/>
<location filename="menu.py" line="660"/>
<source>Import sticker pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="643"/>
<location filename="menu.py" line="649"/>
<source>Show avatars in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="655"/>
<location filename="menu.py" line="661"/>
<source>Close to tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="656"/>
<location filename="menu.py" line="662"/>
<source>Select font</source>
<translation type="unfinished"></translation>
</message>
@ -993,25 +1033,30 @@ Version:</translation>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="534"/>
<location filename="menu.py" line="538"/>
<source>Notification settings</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="535"/>
<location filename="menu.py" line="539"/>
<source>Enable notifications</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="536"/>
<location filename="menu.py" line="541"/>
<source>Enable call&apos;s sound</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="537"/>
<location filename="menu.py" line="542"/>
<source>Enable sound notifications</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="540"/>
<source>Notify about all messages in groups</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>pass</name>
@ -1155,57 +1200,57 @@ Version:</translation>
<context>
<name>updateSettingsForm</name>
<message>
<location filename="menu.py" line="1041"/>
<location filename="menu.py" line="1051"/>
<source>Update settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1042"/>
<location filename="menu.py" line="1052"/>
<source>Select update mode:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1043"/>
<location filename="menu.py" line="1053"/>
<source>Update Toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1044"/>
<location filename="menu.py" line="1054"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1045"/>
<location filename="menu.py" line="1055"/>
<source>Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1046"/>
<location filename="menu.py" line="1056"/>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1065"/>
<location filename="menu.py" line="1075"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1058"/>
<location filename="menu.py" line="1068"/>
<source>Problems with internet connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1066"/>
<location filename="menu.py" line="1076"/>
<source>Updater not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1077"/>
<location filename="menu.py" line="1087"/>
<source>No updates found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1078"/>
<location filename="menu.py" line="1088"/>
<source>Toxygen is up to date</source>
<translation type="unfinished"></translation>
</message>
@ -1213,22 +1258,22 @@ Version:</translation>
<context>
<name>videoSettingsForm</name>
<message>
<location filename="menu.py" line="876"/>
<location filename="menu.py" line="882"/>
<source>Video settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="877"/>
<location filename="menu.py" line="883"/>
<source>Device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="856"/>
<location filename="menu.py" line="862"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="878"/>
<location filename="menu.py" line="884"/>
<source>Select region</source>
<translation type="unfinished"></translation>
</message>

View File

@ -86,58 +86,58 @@ peut entrainer une fuite d&apos;IP</translation>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="118"/>
<location filename="mainscreen.py" line="121"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
<location filename="mainscreen.py" line="124"/>
<location filename="mainscreen.py" line="127"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="mainscreen.py" line="417"/>
<location filename="mainscreen.py" line="420"/>
<source>About</source>
<translation>À Propos</translation>
</message>
<message>
<location filename="mainscreen.py" line="117"/>
<location filename="mainscreen.py" line="119"/>
<source>Add contact</source>
<translation>Ajouter un contact</translation>
</message>
<message>
<location filename="mainscreen.py" line="119"/>
<location filename="mainscreen.py" line="122"/>
<source>Privacy</source>
<translation>Confidentialité</translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<location filename="mainscreen.py" line="123"/>
<source>Interface</source>
<translation>Interface</translation>
</message>
<message>
<location filename="mainscreen.py" line="121"/>
<location filename="mainscreen.py" line="124"/>
<source>Notifications</source>
<translation>Notifications</translation>
</message>
<message>
<location filename="mainscreen.py" line="122"/>
<location filename="mainscreen.py" line="125"/>
<source>Network</source>
<translation>Réseau</translation>
</message>
<message>
<location filename="mainscreen.py" line="123"/>
<location filename="mainscreen.py" line="126"/>
<source>About program</source>
<translation>À propos de toxygen</translation>
</message>
<message>
<location filename="profile.py" line="827"/>
<location filename="profile.py" line="852"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation>L&apos;Utilisateur {} veut vous ajouter à sa liste de contacts. Message : {}</translation>
</message>
<message>
<location filename="profile.py" line="829"/>
<location filename="profile.py" line="854"/>
<source>Friend request</source>
<translation>Demande de contact</translation>
</message>
@ -147,27 +147,27 @@ peut entrainer une fuite d&apos;IP</translation>
<translation type="obsolete">Toxygen est un client Tox écris en Python 2.7. Version : </translation>
</message>
<message>
<location filename="mainscreen.py" line="517"/>
<location filename="mainscreen.py" line="523"/>
<source>Choose file</source>
<translation>Sélectionner un fichier</translation>
</message>
<message>
<location filename="mainscreen.py" line="583"/>
<location filename="mainscreen.py" line="589"/>
<source>Disallow auto accept</source>
<translation>Désactiver l&apos;auto-réception</translation>
</message>
<message>
<location filename="mainscreen.py" line="584"/>
<location filename="mainscreen.py" line="590"/>
<source>Allow auto accept</source>
<translation>Activer l&apos;auto-réception</translation>
</message>
<message>
<location filename="mainscreen.py" line="586"/>
<location filename="mainscreen.py" line="594"/>
<source>Set alias</source>
<translation>Définir un alias</translation>
</message>
<message>
<location filename="mainscreen.py" line="589"/>
<location filename="mainscreen.py" line="598"/>
<source>Clear history</source>
<translation>Vider l&apos;historique</translation>
</message>
@ -177,17 +177,17 @@ peut entrainer une fuite d&apos;IP</translation>
<translation type="obsolete">Copier la clé publique</translation>
</message>
<message>
<location filename="mainscreen.py" line="599"/>
<location filename="mainscreen.py" line="609"/>
<source>Remove friend</source>
<translation>Retirer ce contact</translation>
</message>
<message>
<location filename="profile.py" line="667"/>
<location filename="profile.py" line="692"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation>Entrez un nouvel alias pour le contact {} ou laissez vide pour garder son nom de base :</translation>
</message>
<message>
<location filename="mainscreen.py" line="125"/>
<location filename="mainscreen.py" line="128"/>
<source>Audio</source>
<translation>Audio</translation>
</message>
@ -197,24 +197,24 @@ peut entrainer une fuite d&apos;IP</translation>
<translation type="obsolete">Trouver le contact</translation>
</message>
<message>
<location filename="profile.py" line="799"/>
<location filename="profile.py" line="824"/>
<source>Friend added</source>
<translation>Contact ajouté</translation>
</message>
<message>
<location filename="mainscreen.py" line="418"/>
<location filename="mainscreen.py" line="421"/>
<source>Toxygen is Tox client written on Python.
Version: </source>
<translation>Toxygen est un client Tox écrit en Python.
Version :</translation>
</message>
<message>
<location filename="profile.py" line="800"/>
<location filename="profile.py" line="825"/>
<source>Friend added without sending friend request</source>
<translation>Contact ajouté sans envoi de demande</translation>
</message>
<message>
<location filename="mainscreen.py" line="643"/>
<location filename="mainscreen.py" line="665"/>
<source>Choose folder</source>
<translation>Sélectionner un dossier</translation>
</message>
@ -229,47 +229,47 @@ Version :</translation>
<translation type="obsolete">Envoyer le fichier</translation>
</message>
<message>
<location filename="mainscreen.py" line="129"/>
<location filename="mainscreen.py" line="132"/>
<source>Send message</source>
<translation>Envoyer le message</translation>
</message>
<message>
<location filename="mainscreen.py" line="130"/>
<location filename="mainscreen.py" line="133"/>
<source>Start audio call with friend</source>
<translation>Démarrer un appel audio avec un ami</translation>
</message>
<message>
<location filename="mainscreen.py" line="607"/>
<location filename="mainscreen.py" line="625"/>
<source>Plugins</source>
<translation>Plugins</translation>
</message>
<message>
<location filename="mainscreen.py" line="113"/>
<location filename="mainscreen.py" line="115"/>
<source>List of plugins</source>
<translation>Liste de plugins</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="408"/>
<location filename="mainscreen_widgets.py" line="412"/>
<source>Search</source>
<translation>Chercher</translation>
</message>
<message>
<location filename="mainscreen.py" line="132"/>
<location filename="mainscreen.py" line="135"/>
<source>All</source>
<translation>Tous</translation>
</message>
<message>
<location filename="mainscreen.py" line="133"/>
<location filename="mainscreen.py" line="136"/>
<source>Online</source>
<translation>En ligne</translation>
</message>
<message>
<location filename="mainscreen.py" line="601"/>
<location filename="mainscreen.py" line="611"/>
<source>Notes</source>
<translation>Notes</translation>
</message>
<message>
<location filename="mainscreen.py" line="628"/>
<location filename="mainscreen.py" line="650"/>
<source>Notes about user</source>
<translation>Notes sur l&apos;utilisateur</translation>
</message>
@ -319,7 +319,7 @@ Version :</translation>
<translation>Sauvegarder</translation>
</message>
<message>
<location filename="profile.py" line="315"/>
<location filename="profile.py" line="327"/>
<source>User {} is now known as {}</source>
<translation>L&apos;utilisateur {} s&apos;appelle désormais {}</translation>
</message>
@ -329,32 +329,32 @@ Version :</translation>
<translation>Supprimer ce message</translation>
</message>
<message>
<location filename="mainscreen.py" line="111"/>
<location filename="mainscreen.py" line="113"/>
<source>Lock</source>
<translation>Verrouiller</translation>
</message>
<message>
<location filename="mainscreen.py" line="491"/>
<location filename="mainscreen.py" line="497"/>
<source>Cannot lock app</source>
<translation>Impossible de verrouiller l&apos;application</translation>
</message>
<message>
<location filename="mainscreen.py" line="493"/>
<location filename="mainscreen.py" line="499"/>
<source>Error. Profile password is not set.</source>
<translation>Erreur. Le profil n&apos;a pas de mot de passe.</translation>
</message>
<message>
<location filename="mainscreen.py" line="594"/>
<location filename="mainscreen.py" line="603"/>
<source>Name</source>
<translation>Nom</translation>
</message>
<message>
<location filename="mainscreen.py" line="595"/>
<location filename="mainscreen.py" line="604"/>
<source>Status message</source>
<translation>Status</translation>
</message>
<message>
<location filename="mainscreen.py" line="596"/>
<location filename="mainscreen.py" line="606"/>
<source>Public key</source>
<translation>Clé publique</translation>
</message>
@ -369,32 +369,32 @@ Version :</translation>
<translation>Un profil ayant ce nom existe déjà</translation>
</message>
<message>
<location filename="menu.py" line="661"/>
<location filename="menu.py" line="667"/>
<source>Choose folder with sticker pack</source>
<translation>Sélectionner le dossier contenant le pack de stickers</translation>
</message>
<message>
<location filename="menu.py" line="673"/>
<location filename="menu.py" line="679"/>
<source>Choose folder with smiley pack</source>
<translation>Sélectionner le dossier contenant le pack de smileys</translation>
</message>
<message>
<location filename="mainscreen.py" line="141"/>
<location filename="mainscreen.py" line="144"/>
<source>Import plugin</source>
<translation>Importer un plugin</translation>
</message>
<message>
<location filename="mainscreen.py" line="470"/>
<location filename="mainscreen.py" line="476"/>
<source>Choose folder with plugin</source>
<translation>Sélectionner un dossier avec des plugins</translation>
</message>
<message>
<location filename="mainscreen.py" line="479"/>
<location filename="mainscreen.py" line="485"/>
<source>Restart Toxygen</source>
<translation>Redémarrer Toxyger</translation>
</message>
<message>
<location filename="mainscreen.py" line="481"/>
<location filename="mainscreen.py" line="487"/>
<source>Plugin will be loaded after restart</source>
<translation>Le plugin sera chargé après le redémarrage</translation>
</message>
@ -404,85 +404,125 @@ Version :</translation>
<translation>Citer le texte sélectionné</translation>
</message>
<message>
<location filename="mainscreen.py" line="588"/>
<location filename="mainscreen.py" line="597"/>
<source>Chat history</source>
<translation>Historique de la conversation</translation>
</message>
<message>
<location filename="mainscreen.py" line="590"/>
<location filename="mainscreen.py" line="599"/>
<source>Export as text</source>
<translation>Exporter comme texte</translation>
</message>
<message>
<location filename="mainscreen.py" line="591"/>
<location filename="mainscreen.py" line="600"/>
<source>Export as HTML</source>
<translation>Exporter comme HTML</translation>
</message>
<message>
<location filename="mainscreen.py" line="127"/>
<location filename="mainscreen.py" line="130"/>
<source>Updates</source>
<translation>Mises à jour</translation>
</message>
<message>
<location filename="mainscreen.py" line="134"/>
<location filename="mainscreen.py" line="137"/>
<source>Online first</source>
<translation>En ligne d&apos;abord</translation>
</message>
<message>
<location filename="mainscreen.py" line="136"/>
<location filename="mainscreen.py" line="139"/>
<source>Online and by name</source>
<translation>En ligne et par nom</translation>
</message>
<message>
<location filename="mainscreen.py" line="137"/>
<location filename="mainscreen.py" line="140"/>
<source>Online first and by name</source>
<translation>En ligne d&apos;abord puis par nom</translation>
</message>
<message>
<location filename="mainscreen.py" line="600"/>
<location filename="mainscreen.py" line="610"/>
<source>Block friend</source>
<translation>Bloquer le contact</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="470"/>
<location filename="mainscreen_widgets.py" line="474"/>
<source>Not found</source>
<translation>Non trouvé</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="468"/>
<location filename="mainscreen_widgets.py" line="472"/>
<source>Text &quot;{}&quot; was not found</source>
<translation>Le texte &quot;{}&quot; n&apos;a pas é trouvé</translation>
</message>
<message>
<location filename="mainscreen.py" line="142"/>
<location filename="mainscreen.py" line="145"/>
<source>Reload plugins</source>
<translation>Recharger les plugins</translation>
</message>
<message>
<location filename="mainscreen.py" line="126"/>
<location filename="mainscreen.py" line="129"/>
<source>Video</source>
<translation>Vidéo</translation>
</message>
<message>
<location filename="profile.py" line="1328"/>
<source>User {} invites you to group chat. Accept?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1329"/>
<source>Group chat invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1365"/>
<source>{} users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1386"/>
<source>Enter new title for group {}:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="634"/>
<source>Set title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<source>Create group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="615"/>
<source>Invite to group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="633"/>
<source>Leave chat</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MenuWindow</name>
<message>
<location filename="mainscreen_widgets.py" line="213"/>
<location filename="mainscreen_widgets.py" line="217"/>
<source>Send screenshot</source>
<translation>Envoyer une capture d&apos;écran</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="214"/>
<location filename="mainscreen_widgets.py" line="218"/>
<source>Send file</source>
<translation>Envoyer un fichier</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="215"/>
<location filename="mainscreen_widgets.py" line="219"/>
<source>Add smiley</source>
<translation>Ajouter un smiley</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="216"/>
<location filename="mainscreen_widgets.py" line="220"/>
<source>Send sticker</source>
<translation>Ajouter un sticker</translation>
</message>
@ -554,42 +594,42 @@ Version :</translation>
<context>
<name>PluginsForm</name>
<message>
<location filename="menu.py" line="957"/>
<location filename="menu.py" line="967"/>
<source>Plugins</source>
<translation>Plugins</translation>
</message>
<message>
<location filename="menu.py" line="958"/>
<location filename="menu.py" line="968"/>
<source>Open selected plugin</source>
<translation>Ouvrir le plugin sélectionné</translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>No GUI found for this plugin</source>
<translation>Pas d&apos;interface pour ce plugin</translation>
</message>
<message>
<location filename="menu.py" line="985"/>
<location filename="menu.py" line="995"/>
<source>No description available</source>
<translation>Pas de description</translation>
</message>
<message>
<location filename="menu.py" line="1001"/>
<location filename="menu.py" line="1011"/>
<source>Disable plugin</source>
<translation>Désactiver le plugin</translation>
</message>
<message>
<location filename="menu.py" line="1003"/>
<location filename="menu.py" line="1013"/>
<source>Enable plugin</source>
<translation>Activer le plugin</translation>
</message>
<message>
<location filename="menu.py" line="993"/>
<location filename="menu.py" line="1003"/>
<source>No plugins found</source>
<translation>Pas de plugin trouvé</translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
@ -730,67 +770,67 @@ Version :</translation>
<context>
<name>WelcomeScreen</name>
<message>
<location filename="mainscreen_widgets.py" line="291"/>
<location filename="mainscreen_widgets.py" line="295"/>
<source>Don&apos;t show again</source>
<translation>Ne plus montrer</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="292"/>
<location filename="mainscreen_widgets.py" line="296"/>
<source>Tip of the day</source>
<translation>Astuce du jou</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="297"/>
<location filename="mainscreen_widgets.py" line="301"/>
<source>Press Esc if you want hide app to tray.</source>
<translation>Appuyez sur échap pour réduire l&apos;application.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="303"/>
<location filename="mainscreen_widgets.py" line="307"/>
<source>You can use Tox over Tor. For more info read &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;this post&lt;/a&gt;</source>
<translation>Vous pouvez utiliser Tox avec Tor. Pour plus d&apos;informations, voir &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;cet article&lt;/a&gt;</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="309"/>
<location filename="mainscreen_widgets.py" line="313"/>
<source>Set profile password via Profile -&gt; Settings. Password allows Toxygen encrypt your history and settings.</source>
<translation>Vous pouvez mettre un mot de passe dans Profil -&gt; Paramètres -&gt; Mot de passe pour que toxygen encrypte votre historique et vos paramètres.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="300"/>
<location filename="mainscreen_widgets.py" line="304"/>
<source>Right click on screenshot button hides app to tray during screenshot.</source>
<translation>Faire un clic droit sur le bouton de capture d&apos;écran réduit l&apos;application avant de capturer l&apos;écran.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="306"/>
<location filename="mainscreen_widgets.py" line="310"/>
<source>Use Settings -&gt; Interface to customize interface.</source>
<translation>Vous pouvez customizer votre interface dans Paramètres -&gt; Interface.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="315"/>
<location filename="mainscreen_widgets.py" line="319"/>
<source>Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.</source>
<translation>Toxygen permet d&apos;envoyer des messages et fichiers en différé. Envoyez des messages ou fichiers à un contact hors ligne et il le recevra plus tard.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="327"/>
<location filename="mainscreen_widgets.py" line="331"/>
<source>Set new NoSpam to avoid spam friend requests: Profile -&gt; Settings -&gt; Set new NoSpam.</source>
<translation>Vous pouvez empecher le spam dans les demandes de contact avec Profil -&gt; Paramètres -&gt; Nouveau NoSpam.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="321"/>
<location filename="mainscreen_widgets.py" line="325"/>
<source>Delete single message in chat: make right click on spinner or message time and choose &quot;Delete&quot; in menu</source>
<translation>Pour supprimer un seul message dans une conversation, faites un clic droit sur l&apos;heure du message et sélectionnez &quot;Supprimer ce message&quot; dans le menu</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="324"/>
<location filename="mainscreen_widgets.py" line="328"/>
<source>Use right click on inline image to save it</source>
<translation>Pour sauvegarder une image intégrée, faites un clic droit dessus</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="312"/>
<location filename="mainscreen_widgets.py" line="316"/>
<source>Since v0.1.3 Toxygen supports plugins. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;Read more&lt;/a&gt;</source>
<translation>Depuis la version 0.1.3 Toxygen supporte les plugins. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;En savoir plus&lt;/a&gt;</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="318"/>
<location filename="mainscreen_widgets.py" line="322"/>
<source>New in Toxygen 0.3.0:&lt;br&gt;Video calls&lt;br&gt;Python3.6 support&lt;br&gt;Migration to PyQt5</source>
<translation>Nouveau dans Toxygen 0.3.0 : &lt;br&gt;Appels vidéo&lt;br&gt;Support de Python3.6&lt;br&gt;Migration vers PyQt5</translation>
</message>
@ -798,17 +838,17 @@ Version :</translation>
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="794"/>
<location filename="menu.py" line="800"/>
<source>Audio settings</source>
<translation>Paramètres audio</translation>
</message>
<message>
<location filename="menu.py" line="795"/>
<location filename="menu.py" line="801"/>
<source>Input device:</source>
<translation>Péripherique d&apos;entrée :</translation>
</message>
<message>
<location filename="menu.py" line="796"/>
<location filename="menu.py" line="802"/>
<source>Output device:</source>
<translation>Péripherique de sortie :</translation>
</message>
@ -816,32 +856,32 @@ Version :</translation>
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1223"/>
<location filename="profile.py" line="1250"/>
<source>Incoming video call</source>
<translation>Appel vidéo entrant</translation>
</message>
<message>
<location filename="profile.py" line="1225"/>
<location filename="profile.py" line="1252"/>
<source>Incoming audio call</source>
<translation>Appel audio entrant</translation>
</message>
<message>
<location filename="profile.py" line="1206"/>
<location filename="profile.py" line="1233"/>
<source>Outgoing video call</source>
<translation>Appel vidéo sortant</translation>
</message>
<message>
<location filename="profile.py" line="1208"/>
<location filename="profile.py" line="1235"/>
<source>Outgoing audio call</source>
<translation>Appel audio sortant</translation>
</message>
<message>
<location filename="profile.py" line="1254"/>
<location filename="profile.py" line="1281"/>
<source>Call declined</source>
<translation>Appel refusé</translation>
</message>
<message>
<location filename="profile.py" line="1256"/>
<location filename="profile.py" line="1283"/>
<source>Call finished</source>
<translation>Appel terminé</translation>
</message>
@ -849,82 +889,82 @@ Version :</translation>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="644"/>
<location filename="menu.py" line="650"/>
<source>Interface settings</source>
<translation>Paramètres de l&apos;interface</translation>
</message>
<message>
<location filename="menu.py" line="645"/>
<location filename="menu.py" line="651"/>
<source>Theme:</source>
<translation>Thème :</translation>
</message>
<message>
<location filename="menu.py" line="646"/>
<location filename="menu.py" line="652"/>
<source>Language:</source>
<translation>Langue :</translation>
</message>
<message>
<location filename="menu.py" line="647"/>
<location filename="menu.py" line="653"/>
<source>Smileys</source>
<translation>Smileys</translation>
</message>
<message>
<location filename="menu.py" line="648"/>
<location filename="menu.py" line="654"/>
<source>Smiley pack:</source>
<translation>Pack de smileys :</translation>
</message>
<message>
<location filename="menu.py" line="649"/>
<location filename="menu.py" line="655"/>
<source>Mirror mode</source>
<translation>Mode miroir</translation>
</message>
<message>
<location filename="menu.py" line="650"/>
<location filename="menu.py" line="656"/>
<source>Messages font size:</source>
<translation>Taille des messages :</translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart app to apply settings</source>
<translation>Redémarrer toxygen pour appliquer les paramètres</translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart required</source>
<translation>Redémarrage nécessaire</translation>
</message>
<message>
<location filename="menu.py" line="651"/>
<location filename="menu.py" line="657"/>
<source>Select unread messages notification color</source>
<translation>Sélectionner la couleur des messages non-lus</translation>
</message>
<message>
<location filename="menu.py" line="652"/>
<location filename="menu.py" line="658"/>
<source>Compact contact list</source>
<translation>Liste de contacts compacte</translation>
</message>
<message>
<location filename="menu.py" line="653"/>
<location filename="menu.py" line="659"/>
<source>Import smiley pack</source>
<translation>Importer un pack de smileys</translation>
</message>
<message>
<location filename="menu.py" line="654"/>
<location filename="menu.py" line="660"/>
<source>Import sticker pack</source>
<translation>Importer un pack de stickers</translation>
</message>
<message>
<location filename="menu.py" line="643"/>
<location filename="menu.py" line="649"/>
<source>Show avatars in chat</source>
<translation>Montrer les avatars dans la conversation</translation>
</message>
<message>
<location filename="menu.py" line="655"/>
<location filename="menu.py" line="661"/>
<source>Close to tray</source>
<translation>Réduire</translation>
</message>
<message>
<location filename="menu.py" line="656"/>
<location filename="menu.py" line="662"/>
<source>Select font</source>
<translation>Sélectionner la police</translation>
</message>
@ -1010,25 +1050,30 @@ Version :</translation>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="534"/>
<location filename="menu.py" line="538"/>
<source>Notification settings</source>
<translation>Paramètres de notification</translation>
</message>
<message>
<location filename="menu.py" line="535"/>
<location filename="menu.py" line="539"/>
<source>Enable notifications</source>
<translation>Activer les notifications</translation>
</message>
<message>
<location filename="menu.py" line="536"/>
<location filename="menu.py" line="541"/>
<source>Enable call&apos;s sound</source>
<translation>Activer les sons d&apos;appel</translation>
</message>
<message>
<location filename="menu.py" line="537"/>
<location filename="menu.py" line="542"/>
<source>Enable sound notifications</source>
<translation>Activer les sons de notifications</translation>
</message>
<message>
<location filename="menu.py" line="540"/>
<source>Notify about all messages in groups</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>pass</name>
@ -1172,57 +1217,57 @@ Version :</translation>
<context>
<name>updateSettingsForm</name>
<message>
<location filename="menu.py" line="1041"/>
<location filename="menu.py" line="1051"/>
<source>Update settings</source>
<translation>Paramètres de mise à jour</translation>
</message>
<message>
<location filename="menu.py" line="1042"/>
<location filename="menu.py" line="1052"/>
<source>Select update mode:</source>
<translation>Sélectionner le mode de mise à jour :</translation>
</message>
<message>
<location filename="menu.py" line="1043"/>
<location filename="menu.py" line="1053"/>
<source>Update Toxygen</source>
<translation>Mettre à jour toxygen</translation>
</message>
<message>
<location filename="menu.py" line="1044"/>
<location filename="menu.py" line="1054"/>
<source>Disabled</source>
<translation>Désactivé</translation>
</message>
<message>
<location filename="menu.py" line="1045"/>
<location filename="menu.py" line="1055"/>
<source>Manual</source>
<translation>Manuel</translation>
</message>
<message>
<location filename="menu.py" line="1046"/>
<location filename="menu.py" line="1056"/>
<source>Auto</source>
<translation>Automatique</translation>
</message>
<message>
<location filename="menu.py" line="1065"/>
<location filename="menu.py" line="1075"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="menu.py" line="1058"/>
<location filename="menu.py" line="1068"/>
<source>Problems with internet connection</source>
<translation>Il y à des problèmes avec votre connexion internet</translation>
</message>
<message>
<location filename="menu.py" line="1066"/>
<location filename="menu.py" line="1076"/>
<source>Updater not found</source>
<translation>Updater non trouvé</translation>
</message>
<message>
<location filename="menu.py" line="1077"/>
<location filename="menu.py" line="1087"/>
<source>No updates found</source>
<translation>Pas de mises à jour trouvés</translation>
</message>
<message>
<location filename="menu.py" line="1078"/>
<location filename="menu.py" line="1088"/>
<source>Toxygen is up to date</source>
<translation>Toxygen est à jour</translation>
</message>
@ -1230,22 +1275,22 @@ Version :</translation>
<context>
<name>videoSettingsForm</name>
<message>
<location filename="menu.py" line="876"/>
<location filename="menu.py" line="882"/>
<source>Video settings</source>
<translation>Paramètres vidéo</translation>
</message>
<message>
<location filename="menu.py" line="877"/>
<location filename="menu.py" line="883"/>
<source>Device:</source>
<translation>Périphérique :</translation>
</message>
<message>
<location filename="menu.py" line="856"/>
<location filename="menu.py" line="862"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="878"/>
<location filename="menu.py" line="884"/>
<source>Select region</source>
<translation type="unfinished"></translation>
</message>

Binary file not shown.

View File

@ -87,84 +87,84 @@ can produce IP leak</source>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="118"/>
<location filename="mainscreen.py" line="121"/>
<source>Profile</source>
<translation>Профиль</translation>
</message>
<message>
<location filename="mainscreen.py" line="124"/>
<location filename="mainscreen.py" line="127"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="mainscreen.py" line="417"/>
<location filename="mainscreen.py" line="420"/>
<source>About</source>
<translation>О программе</translation>
</message>
<message>
<location filename="mainscreen.py" line="117"/>
<location filename="mainscreen.py" line="119"/>
<source>Add contact</source>
<translation>Добавить контакт</translation>
</message>
<message>
<location filename="mainscreen.py" line="119"/>
<location filename="mainscreen.py" line="122"/>
<source>Privacy</source>
<translation>Приватность</translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<location filename="mainscreen.py" line="123"/>
<source>Interface</source>
<translation>Интерфейс</translation>
</message>
<message>
<location filename="mainscreen.py" line="121"/>
<location filename="mainscreen.py" line="124"/>
<source>Notifications</source>
<translation>Уведомления</translation>
</message>
<message>
<location filename="mainscreen.py" line="122"/>
<location filename="mainscreen.py" line="125"/>
<source>Network</source>
<translation>Сеть</translation>
</message>
<message>
<location filename="mainscreen.py" line="123"/>
<location filename="mainscreen.py" line="126"/>
<source>About program</source>
<translation>О программе</translation>
</message>
<message>
<location filename="profile.py" line="827"/>
<location filename="profile.py" line="852"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation>Пользователь {} хочет добавить Вас в список контактов. Сообщение:
{}</translation>
</message>
<message>
<location filename="profile.py" line="829"/>
<location filename="profile.py" line="854"/>
<source>Friend request</source>
<translation>Запрос на добавление в друзья</translation>
</message>
<message>
<location filename="mainscreen.py" line="517"/>
<location filename="mainscreen.py" line="523"/>
<source>Choose file</source>
<translation>Выберите файл</translation>
</message>
<message>
<location filename="mainscreen.py" line="583"/>
<location filename="mainscreen.py" line="589"/>
<source>Disallow auto accept</source>
<translation>Запретить автоматическое получение файлов</translation>
</message>
<message>
<location filename="mainscreen.py" line="584"/>
<location filename="mainscreen.py" line="590"/>
<source>Allow auto accept</source>
<translation>Разрешить автоматическое получение файлов</translation>
</message>
<message>
<location filename="mainscreen.py" line="586"/>
<location filename="mainscreen.py" line="594"/>
<source>Set alias</source>
<translation>Изменить псевдоним</translation>
</message>
<message>
<location filename="mainscreen.py" line="589"/>
<location filename="mainscreen.py" line="598"/>
<source>Clear history</source>
<translation>Очистить историю</translation>
</message>
@ -174,17 +174,17 @@ can produce IP leak</source>
<translation type="obsolete">Копировать публичный ключ</translation>
</message>
<message>
<location filename="mainscreen.py" line="599"/>
<location filename="mainscreen.py" line="609"/>
<source>Remove friend</source>
<translation>Удалить друга</translation>
</message>
<message>
<location filename="profile.py" line="667"/>
<location filename="profile.py" line="692"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation>Введите новый псевдоним для друга {} или оставьте пустым для использования его имени:</translation>
</message>
<message>
<location filename="mainscreen.py" line="125"/>
<location filename="mainscreen.py" line="128"/>
<source>Audio</source>
<translation>Аудио</translation>
</message>
@ -194,23 +194,23 @@ can produce IP leak</source>
<translation type="obsolete">Найти контакт</translation>
</message>
<message>
<location filename="profile.py" line="799"/>
<location filename="profile.py" line="824"/>
<source>Friend added</source>
<translation>Друг добавлен</translation>
</message>
<message>
<location filename="mainscreen.py" line="418"/>
<location filename="mainscreen.py" line="421"/>
<source>Toxygen is Tox client written on Python.
Version: </source>
<translation>Toxygen - клиент для мессенджера Tox, написанный на Python. Версия: </translation>
</message>
<message>
<location filename="profile.py" line="800"/>
<location filename="profile.py" line="825"/>
<source>Friend added without sending friend request</source>
<translation>Друг добавлен без отправки запроса на добавление в друзья</translation>
</message>
<message>
<location filename="mainscreen.py" line="643"/>
<location filename="mainscreen.py" line="665"/>
<source>Choose folder</source>
<translation>Выбрать папку</translation>
</message>
@ -225,47 +225,47 @@ Version: </source>
<translation type="obsolete">Отправить файл</translation>
</message>
<message>
<location filename="mainscreen.py" line="129"/>
<location filename="mainscreen.py" line="132"/>
<source>Send message</source>
<translation>Отправить сообщение</translation>
</message>
<message>
<location filename="mainscreen.py" line="130"/>
<location filename="mainscreen.py" line="133"/>
<source>Start audio call with friend</source>
<translation>Начать аудиозвонок с другом</translation>
</message>
<message>
<location filename="mainscreen.py" line="607"/>
<location filename="mainscreen.py" line="625"/>
<source>Plugins</source>
<translation>Плагины</translation>
</message>
<message>
<location filename="mainscreen.py" line="113"/>
<location filename="mainscreen.py" line="115"/>
<source>List of plugins</source>
<translation>Список плагинов</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="408"/>
<location filename="mainscreen_widgets.py" line="412"/>
<source>Search</source>
<translation>Поиск</translation>
</message>
<message>
<location filename="mainscreen.py" line="132"/>
<location filename="mainscreen.py" line="135"/>
<source>All</source>
<translation>Все</translation>
</message>
<message>
<location filename="mainscreen.py" line="133"/>
<location filename="mainscreen.py" line="136"/>
<source>Online</source>
<translation>Онлайн</translation>
</message>
<message>
<location filename="mainscreen.py" line="601"/>
<location filename="mainscreen.py" line="611"/>
<source>Notes</source>
<translation>Заметки</translation>
</message>
<message>
<location filename="mainscreen.py" line="628"/>
<location filename="mainscreen.py" line="650"/>
<source>Notes about user</source>
<translation>Заметки о пользователе</translation>
</message>
@ -315,7 +315,7 @@ Version: </source>
<translation>Сохранить</translation>
</message>
<message>
<location filename="profile.py" line="315"/>
<location filename="profile.py" line="327"/>
<source>User {} is now known as {}</source>
<translation>Пользователь {} сейчас известен как {}</translation>
</message>
@ -325,32 +325,32 @@ Version: </source>
<translation>Удалить сообщение</translation>
</message>
<message>
<location filename="mainscreen.py" line="111"/>
<location filename="mainscreen.py" line="113"/>
<source>Lock</source>
<translation>Заблокировать</translation>
</message>
<message>
<location filename="mainscreen.py" line="491"/>
<location filename="mainscreen.py" line="497"/>
<source>Cannot lock app</source>
<translation>Невозможно заблокировать приложение</translation>
</message>
<message>
<location filename="mainscreen.py" line="493"/>
<location filename="mainscreen.py" line="499"/>
<source>Error. Profile password is not set.</source>
<translation>Ошибка. Пароль профиля не установлен.</translation>
</message>
<message>
<location filename="mainscreen.py" line="594"/>
<location filename="mainscreen.py" line="603"/>
<source>Name</source>
<translation>Имя</translation>
</message>
<message>
<location filename="mainscreen.py" line="595"/>
<location filename="mainscreen.py" line="604"/>
<source>Status message</source>
<translation>Статус</translation>
</message>
<message>
<location filename="mainscreen.py" line="596"/>
<location filename="mainscreen.py" line="606"/>
<source>Public key</source>
<translation>Публичный ключ</translation>
</message>
@ -365,32 +365,32 @@ Version: </source>
<translation>Профиль с данным именем уже существует</translation>
</message>
<message>
<location filename="menu.py" line="661"/>
<location filename="menu.py" line="667"/>
<source>Choose folder with sticker pack</source>
<translation>Выберите папку в паком стикеров</translation>
</message>
<message>
<location filename="menu.py" line="673"/>
<location filename="menu.py" line="679"/>
<source>Choose folder with smiley pack</source>
<translation>Выберите папку с паком смайлов</translation>
</message>
<message>
<location filename="mainscreen.py" line="141"/>
<location filename="mainscreen.py" line="144"/>
<source>Import plugin</source>
<translation>Импортировать плагин</translation>
</message>
<message>
<location filename="mainscreen.py" line="470"/>
<location filename="mainscreen.py" line="476"/>
<source>Choose folder with plugin</source>
<translation>Выберите папку с плагином</translation>
</message>
<message>
<location filename="mainscreen.py" line="479"/>
<location filename="mainscreen.py" line="485"/>
<source>Restart Toxygen</source>
<translation>Перезапустите Toxygen</translation>
</message>
<message>
<location filename="mainscreen.py" line="481"/>
<location filename="mainscreen.py" line="487"/>
<source>Plugin will be loaded after restart</source>
<translation>Плагин будет загружен после перезапуска</translation>
</message>
@ -400,65 +400,105 @@ Version: </source>
<translation>Цитировать выбранный текст</translation>
</message>
<message>
<location filename="mainscreen.py" line="588"/>
<location filename="mainscreen.py" line="597"/>
<source>Chat history</source>
<translation>История чата</translation>
</message>
<message>
<location filename="mainscreen.py" line="590"/>
<location filename="mainscreen.py" line="599"/>
<source>Export as text</source>
<translation>Экспортировать как текст</translation>
</message>
<message>
<location filename="mainscreen.py" line="591"/>
<location filename="mainscreen.py" line="600"/>
<source>Export as HTML</source>
<translation>Экспортировать как HTML</translation>
</message>
<message>
<location filename="mainscreen.py" line="127"/>
<location filename="mainscreen.py" line="130"/>
<source>Updates</source>
<translation>Обновления</translation>
</message>
<message>
<location filename="mainscreen.py" line="134"/>
<location filename="mainscreen.py" line="137"/>
<source>Online first</source>
<translation>Сначала онлайн</translation>
</message>
<message>
<location filename="mainscreen.py" line="136"/>
<location filename="mainscreen.py" line="139"/>
<source>Online and by name</source>
<translation>Онлайн и по имени</translation>
</message>
<message>
<location filename="mainscreen.py" line="137"/>
<location filename="mainscreen.py" line="140"/>
<source>Online first and by name</source>
<translation>Сначала онлайн и по имени</translation>
</message>
<message>
<location filename="mainscreen.py" line="600"/>
<location filename="mainscreen.py" line="610"/>
<source>Block friend</source>
<translation>Заблокировать друга</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="470"/>
<location filename="mainscreen_widgets.py" line="474"/>
<source>Not found</source>
<translation>Не найдено</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="468"/>
<location filename="mainscreen_widgets.py" line="472"/>
<source>Text &quot;{}&quot; was not found</source>
<translation>Текст &quot;{}&quot; не был найден</translation>
</message>
<message>
<location filename="mainscreen.py" line="142"/>
<location filename="mainscreen.py" line="145"/>
<source>Reload plugins</source>
<translation>Перезагрузить плагины</translation>
</message>
<message>
<location filename="mainscreen.py" line="126"/>
<location filename="mainscreen.py" line="129"/>
<source>Video</source>
<translation>Видео</translation>
</message>
<message>
<location filename="profile.py" line="1328"/>
<source>User {} invites you to group chat. Accept?</source>
<translation>Пользователь {} приглашает Вас в групповой чат. Принять приглашение?</translation>
</message>
<message>
<location filename="profile.py" line="1329"/>
<source>Group chat invite</source>
<translation>Приглашение в групповой чат</translation>
</message>
<message>
<location filename="profile.py" line="1365"/>
<source>{} users in chat</source>
<translation>{} пользователей в чате</translation>
</message>
<message>
<location filename="profile.py" line="1386"/>
<source>Enter new title for group {}:</source>
<translation>Введите название для группы {}:</translation>
</message>
<message>
<location filename="mainscreen.py" line="634"/>
<source>Set title</source>
<translation>Изменить название</translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<source>Create group chat</source>
<translation>Создать групповой чат</translation>
</message>
<message>
<location filename="mainscreen.py" line="615"/>
<source>Invite to group chat</source>
<translation>Пригласить в групповой чат</translation>
</message>
<message>
<location filename="mainscreen.py" line="633"/>
<source>Leave chat</source>
<translation>Покинуть чат</translation>
</message>
</context>
<context>
<name>MenuWindow</name>
@ -478,12 +518,12 @@ Version: </source>
<translation type="obsolete">Остановить запись</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="213"/>
<location filename="mainscreen_widgets.py" line="217"/>
<source>Send screenshot</source>
<translation>Отправить снимок экрана</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="214"/>
<location filename="mainscreen_widgets.py" line="218"/>
<source>Send file</source>
<translation>Отправить файл</translation>
</message>
@ -498,12 +538,12 @@ Version: </source>
<translation type="obsolete">Отправить видеосообщение</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="215"/>
<location filename="mainscreen_widgets.py" line="219"/>
<source>Add smiley</source>
<translation>Добавить смайлик</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="216"/>
<location filename="mainscreen_widgets.py" line="220"/>
<source>Send sticker</source>
<translation>Отправить стикер</translation>
</message>
@ -575,42 +615,42 @@ Version: </source>
<context>
<name>PluginsForm</name>
<message>
<location filename="menu.py" line="957"/>
<location filename="menu.py" line="967"/>
<source>Plugins</source>
<translation>Плагины</translation>
</message>
<message>
<location filename="menu.py" line="958"/>
<location filename="menu.py" line="968"/>
<source>Open selected plugin</source>
<translation>Открыть выбранный плагин</translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>No GUI found for this plugin</source>
<translation>GUI для данного плагина не найден</translation>
</message>
<message>
<location filename="menu.py" line="985"/>
<location filename="menu.py" line="995"/>
<source>No description available</source>
<translation>Описание недоступно</translation>
</message>
<message>
<location filename="menu.py" line="1001"/>
<location filename="menu.py" line="1011"/>
<source>Disable plugin</source>
<translation>Отключить плагин</translation>
</message>
<message>
<location filename="menu.py" line="1003"/>
<location filename="menu.py" line="1013"/>
<source>Enable plugin</source>
<translation>Включить плагин</translation>
</message>
<message>
<location filename="menu.py" line="993"/>
<location filename="menu.py" line="1003"/>
<source>No plugins found</source>
<translation>Плагины не найдены</translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
@ -756,17 +796,17 @@ Version: </source>
<context>
<name>WelcomeScreen</name>
<message>
<location filename="mainscreen_widgets.py" line="291"/>
<location filename="mainscreen_widgets.py" line="295"/>
<source>Don&apos;t show again</source>
<translation>Не показывать снова</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="292"/>
<location filename="mainscreen_widgets.py" line="296"/>
<source>Tip of the day</source>
<translation>Подсказка дня</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="297"/>
<location filename="mainscreen_widgets.py" line="301"/>
<source>Press Esc if you want hide app to tray.</source>
<translation>Нажатие Esc сворачивает приложение в трей.</translation>
</message>
@ -776,7 +816,7 @@ Version: </source>
<translation type="obsolete">Правый клик на кнопке скриншота сворачивает приложение в трей на время скриншота</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="303"/>
<location filename="mainscreen_widgets.py" line="307"/>
<source>You can use Tox over Tor. For more info read &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;this post&lt;/a&gt;</source>
<translation>Вы можете использовать Tox через Tor. Дополнительная информация &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;тут&lt;/a&gt;</translation>
</message>
@ -786,7 +826,7 @@ Version: </source>
<translation type="obsolete">Используйте Настройки -&gt; Интерфейс для настройки интерфейса</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="309"/>
<location filename="mainscreen_widgets.py" line="313"/>
<source>Set profile password via Profile -&gt; Settings. Password allows Toxygen encrypt your history and settings.</source>
<translation>Установите пароль профиля: Профиль -&gt; Настройки. Пароль позволяет шифровать историю переписки и настройки.</translation>
</message>
@ -811,22 +851,22 @@ Version: </source>
<translation type="obsolete">Установите новый NoSpam, чтобы избежать спам запросов в друзья: Профиль-&gt;Настройки-&gt;Новый NoSpam</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="300"/>
<location filename="mainscreen_widgets.py" line="304"/>
<source>Right click on screenshot button hides app to tray during screenshot.</source>
<translation>Правый клик на кнопке скриншота сворачивает приложение в трей на время скриншота.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="306"/>
<location filename="mainscreen_widgets.py" line="310"/>
<source>Use Settings -&gt; Interface to customize interface.</source>
<translation>Используйте Настройки -&gt; Интерфейс для настройки интерфейса.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="315"/>
<location filename="mainscreen_widgets.py" line="319"/>
<source>Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.</source>
<translation>Toxygen поддерживает псевдооффлайн сообщения и файл трансферы.</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="327"/>
<location filename="mainscreen_widgets.py" line="331"/>
<source>Set new NoSpam to avoid spam friend requests: Profile -&gt; Settings -&gt; Set new NoSpam.</source>
<translation>Установите новый NoSpam, чтобы избежать спам запросов в друзья: Профиль-&gt;Настройки-&gt;Новый NoSpam.</translation>
</message>
@ -836,12 +876,12 @@ Version: </source>
<translation type="obsolete">Новое в Toxygen 0.2.3:&lt;br&gt;Соответствие TCS&lt;br&gt;Импорт плагинов, смайлов и стикеров&lt;br&gt;Исправления ошибок</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="321"/>
<location filename="mainscreen_widgets.py" line="325"/>
<source>Delete single message in chat: make right click on spinner or message time and choose &quot;Delete&quot; in menu</source>
<translation>Чтобы удалить отдельное сообщение в чате сделайте правый клик на спиннер или время сообщения и выберите &quot;Удалить&quot; в меню</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="324"/>
<location filename="mainscreen_widgets.py" line="328"/>
<source>Use right click on inline image to save it</source>
<translation>Правый клик на инлайн изображении позволит сохранить его</translation>
</message>
@ -856,12 +896,12 @@ Version: </source>
<translation type="obsolete">Новое в Toxygen v0.2.6:&lt;br&gt;Поддержка обновлений&lt;br&gt;Улучшенная сортировка контактов&lt;br&gt;Улучшения в работе плагинов</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="312"/>
<location filename="mainscreen_widgets.py" line="316"/>
<source>Since v0.1.3 Toxygen supports plugins. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;Read more&lt;/a&gt;</source>
<translation>С версии 0.1.3 Toxygen поддерживает плагины. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;Узнать больше.&lt;/a&gt;</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="318"/>
<location filename="mainscreen_widgets.py" line="322"/>
<source>New in Toxygen 0.3.0:&lt;br&gt;Video calls&lt;br&gt;Python3.6 support&lt;br&gt;Migration to PyQt5</source>
<translation>Новое в Toxygen 0.3.0:&lt;br&gt;Видеозвонки&lt;br&gt;Поддержка Python3.6&lt;br&gt;Миграция на PyQt5</translation>
</message>
@ -869,17 +909,17 @@ Version: </source>
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="794"/>
<location filename="menu.py" line="800"/>
<source>Audio settings</source>
<translation>Настройки аудио</translation>
</message>
<message>
<location filename="menu.py" line="795"/>
<location filename="menu.py" line="801"/>
<source>Input device:</source>
<translation>Устройство ввода:</translation>
</message>
<message>
<location filename="menu.py" line="796"/>
<location filename="menu.py" line="802"/>
<source>Output device:</source>
<translation>Устройство вывода:</translation>
</message>
@ -887,32 +927,32 @@ Version: </source>
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1223"/>
<location filename="profile.py" line="1250"/>
<source>Incoming video call</source>
<translation>Входящий видеозвонок</translation>
</message>
<message>
<location filename="profile.py" line="1225"/>
<location filename="profile.py" line="1252"/>
<source>Incoming audio call</source>
<translation>Входящий аудиозвонок</translation>
</message>
<message>
<location filename="profile.py" line="1206"/>
<location filename="profile.py" line="1233"/>
<source>Outgoing video call</source>
<translation>Исходящий видеозвонок</translation>
</message>
<message>
<location filename="profile.py" line="1208"/>
<location filename="profile.py" line="1235"/>
<source>Outgoing audio call</source>
<translation>Исходящий аудиозвонок</translation>
</message>
<message>
<location filename="profile.py" line="1254"/>
<location filename="profile.py" line="1281"/>
<source>Call declined</source>
<translation>Звонок отменен</translation>
</message>
<message>
<location filename="profile.py" line="1256"/>
<location filename="profile.py" line="1283"/>
<source>Call finished</source>
<translation>Звонок завершен</translation>
</message>
@ -920,82 +960,82 @@ Version: </source>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="644"/>
<location filename="menu.py" line="650"/>
<source>Interface settings</source>
<translation>Настройки интерфейса</translation>
</message>
<message>
<location filename="menu.py" line="645"/>
<location filename="menu.py" line="651"/>
<source>Theme:</source>
<translation>Тема:</translation>
</message>
<message>
<location filename="menu.py" line="646"/>
<location filename="menu.py" line="652"/>
<source>Language:</source>
<translation>Язык:</translation>
</message>
<message>
<location filename="menu.py" line="647"/>
<location filename="menu.py" line="653"/>
<source>Smileys</source>
<translation>Смайлики</translation>
</message>
<message>
<location filename="menu.py" line="648"/>
<location filename="menu.py" line="654"/>
<source>Smiley pack:</source>
<translation>Набор смайликов:</translation>
</message>
<message>
<location filename="menu.py" line="649"/>
<location filename="menu.py" line="655"/>
<source>Mirror mode</source>
<translation>Зеркальный режим</translation>
</message>
<message>
<location filename="menu.py" line="650"/>
<location filename="menu.py" line="656"/>
<source>Messages font size:</source>
<translation>Размер шрифта сообщений:</translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart app to apply settings</source>
<translation>Для применения настроек необходимо перезапустить приложение</translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart required</source>
<translation>Требуется перезапуск</translation>
</message>
<message>
<location filename="menu.py" line="651"/>
<location filename="menu.py" line="657"/>
<source>Select unread messages notification color</source>
<translation>Цвет уведомления о сообщении</translation>
</message>
<message>
<location filename="menu.py" line="652"/>
<location filename="menu.py" line="658"/>
<source>Compact contact list</source>
<translation>Компактный список контактов</translation>
</message>
<message>
<location filename="menu.py" line="653"/>
<location filename="menu.py" line="659"/>
<source>Import smiley pack</source>
<translation>Импортировать смайлы</translation>
</message>
<message>
<location filename="menu.py" line="654"/>
<location filename="menu.py" line="660"/>
<source>Import sticker pack</source>
<translation>Импортировать стикеры</translation>
</message>
<message>
<location filename="menu.py" line="643"/>
<location filename="menu.py" line="649"/>
<source>Show avatars in chat</source>
<translation>Показывать аватары в чате</translation>
</message>
<message>
<location filename="menu.py" line="655"/>
<location filename="menu.py" line="661"/>
<source>Close to tray</source>
<translation>Сворачивать в трей</translation>
</message>
<message>
<location filename="menu.py" line="656"/>
<location filename="menu.py" line="662"/>
<source>Select font</source>
<translation>Выбрать шрифт</translation>
</message>
@ -1081,26 +1121,31 @@ Version: </source>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="534"/>
<location filename="menu.py" line="538"/>
<source>Notification settings</source>
<translation>Настройки уведомлений</translation>
</message>
<message>
<location filename="menu.py" line="535"/>
<location filename="menu.py" line="539"/>
<source>Enable notifications</source>
<translation>Включить уведомления</translation>
</message>
<message>
<location filename="menu.py" line="536"/>
<location filename="menu.py" line="541"/>
<source>Enable call&apos;s sound</source>
<translation>Включить звук звонка</translation>
</message>
<message>
<location filename="menu.py" line="537"/>
<location filename="menu.py" line="542"/>
<source>Enable sound notifications</source>
<translation>Включить звуковые уведомления
</translation>
</message>
<message>
<location filename="menu.py" line="540"/>
<source>Notify about all messages in groups</source>
<translation>Уведомлять обо всех сообщениях в группах</translation>
</message>
</context>
<context>
<name>pass</name>
@ -1244,57 +1289,57 @@ Version: </source>
<context>
<name>updateSettingsForm</name>
<message>
<location filename="menu.py" line="1041"/>
<location filename="menu.py" line="1051"/>
<source>Update settings</source>
<translation>Обновить настройки</translation>
</message>
<message>
<location filename="menu.py" line="1042"/>
<location filename="menu.py" line="1052"/>
<source>Select update mode:</source>
<translation>Выбрать режим обновлений:</translation>
</message>
<message>
<location filename="menu.py" line="1043"/>
<location filename="menu.py" line="1053"/>
<source>Update Toxygen</source>
<translation>Обновить Toxygen</translation>
</message>
<message>
<location filename="menu.py" line="1044"/>
<location filename="menu.py" line="1054"/>
<source>Disabled</source>
<translation>Отключены</translation>
</message>
<message>
<location filename="menu.py" line="1045"/>
<location filename="menu.py" line="1055"/>
<source>Manual</source>
<translation>Вручную</translation>
</message>
<message>
<location filename="menu.py" line="1046"/>
<location filename="menu.py" line="1056"/>
<source>Auto</source>
<translation>Автоматически</translation>
</message>
<message>
<location filename="menu.py" line="1065"/>
<location filename="menu.py" line="1075"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="menu.py" line="1058"/>
<location filename="menu.py" line="1068"/>
<source>Problems with internet connection</source>
<translation>Проблемы с соединением</translation>
</message>
<message>
<location filename="menu.py" line="1066"/>
<location filename="menu.py" line="1076"/>
<source>Updater not found</source>
<translation>Апдейтер не был найден</translation>
</message>
<message>
<location filename="menu.py" line="1077"/>
<location filename="menu.py" line="1087"/>
<source>No updates found</source>
<translation>Обновления не найдены</translation>
</message>
<message>
<location filename="menu.py" line="1078"/>
<location filename="menu.py" line="1088"/>
<source>Toxygen is up to date</source>
<translation>Toxygen уже обновлен</translation>
</message>
@ -1302,22 +1347,22 @@ Version: </source>
<context>
<name>videoSettingsForm</name>
<message>
<location filename="menu.py" line="876"/>
<location filename="menu.py" line="882"/>
<source>Video settings</source>
<translation>Настройки видео</translation>
</message>
<message>
<location filename="menu.py" line="877"/>
<location filename="menu.py" line="883"/>
<source>Device:</source>
<translation>Устройство:</translation>
</message>
<message>
<location filename="menu.py" line="856"/>
<location filename="menu.py" line="862"/>
<source>Desktop</source>
<translation>Рабочий стол</translation>
</message>
<message>
<location filename="menu.py" line="878"/>
<location filename="menu.py" line="884"/>
<source>Select region</source>
<translation>Выберите область</translation>
</message>

View File

@ -84,27 +84,27 @@ can produce IP leak</source>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="123"/>
<location filename="mainscreen.py" line="126"/>
<source>About program</source>
<translation>Про проґраму</translation>
</message>
<message>
<location filename="profile.py" line="829"/>
<location filename="profile.py" line="854"/>
<source>Friend request</source>
<translation>Запит дружби</translation>
</message>
<message>
<location filename="mainscreen.py" line="417"/>
<location filename="mainscreen.py" line="420"/>
<source>About</source>
<translation>Про</translation>
</message>
<message>
<location filename="mainscreen.py" line="125"/>
<location filename="mainscreen.py" line="128"/>
<source>Audio</source>
<translation>Звук</translation>
</message>
<message>
<location filename="profile.py" line="799"/>
<location filename="profile.py" line="824"/>
<source>Friend added</source>
<translation>Друга додано</translation>
</message>
@ -114,19 +114,19 @@ can produce IP leak</source>
<translation type="obsolete">Надіслати файл</translation>
</message>
<message>
<location filename="profile.py" line="827"/>
<location filename="profile.py" line="852"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation>Користувач {} хоче додати вас до списку контактів. Повідомлення
{}</translation>
</message>
<message>
<location filename="mainscreen.py" line="122"/>
<location filename="mainscreen.py" line="125"/>
<source>Network</source>
<translation>Мережа</translation>
</message>
<message>
<location filename="mainscreen.py" line="589"/>
<location filename="mainscreen.py" line="598"/>
<source>Clear history</source>
<translation>Очистити журнал</translation>
</message>
@ -136,69 +136,69 @@ can produce IP leak</source>
<translation type="obsolete">Копіювати публічний ключ</translation>
</message>
<message>
<location filename="mainscreen.py" line="129"/>
<location filename="mainscreen.py" line="132"/>
<source>Send message</source>
<translation>Надіслати повідомлення</translation>
</message>
<message>
<location filename="mainscreen.py" line="586"/>
<location filename="mainscreen.py" line="594"/>
<source>Set alias</source>
<translation>Встановити скорочення</translation>
</message>
<message>
<location filename="mainscreen.py" line="119"/>
<location filename="mainscreen.py" line="122"/>
<source>Privacy</source>
<translation>Приватність</translation>
</message>
<message>
<location filename="mainscreen.py" line="118"/>
<location filename="mainscreen.py" line="121"/>
<source>Profile</source>
<translation>Профіль</translation>
</message>
<message>
<location filename="mainscreen.py" line="418"/>
<location filename="mainscreen.py" line="421"/>
<source>Toxygen is Tox client written on Python.
Version: </source>
<translation>Toxygen це клієнт Tox написаний на Python.
Версія:</translation>
</message>
<message>
<location filename="mainscreen.py" line="517"/>
<location filename="mainscreen.py" line="523"/>
<source>Choose file</source>
<translation>Обрати файл</translation>
</message>
<message>
<location filename="profile.py" line="667"/>
<location filename="profile.py" line="692"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation>Введіть нове скорочення для друга {} або залишіть порожнім, щоб використовувати його псевдо:</translation>
</message>
<message>
<location filename="mainscreen.py" line="117"/>
<location filename="mainscreen.py" line="119"/>
<source>Add contact</source>
<translation>Додати контакт</translation>
</message>
<message>
<location filename="profile.py" line="800"/>
<location filename="profile.py" line="825"/>
<source>Friend added without sending friend request</source>
<translation>Друга додано без надсилання запиту дружби</translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<location filename="mainscreen.py" line="123"/>
<source>Interface</source>
<translation>Зовнішній вигляд</translation>
</message>
<message>
<location filename="mainscreen.py" line="124"/>
<location filename="mainscreen.py" line="127"/>
<source>Settings</source>
<translation>Налаштування</translation>
</message>
<message>
<location filename="mainscreen.py" line="121"/>
<location filename="mainscreen.py" line="124"/>
<source>Notifications</source>
<translation>Сповіщення</translation>
</message>
<message>
<location filename="mainscreen.py" line="599"/>
<location filename="mainscreen.py" line="609"/>
<source>Remove friend</source>
<translation>Вилучити друга</translation>
</message>
@ -208,22 +208,22 @@ Version: </source>
<translation type="obsolete">Знайти контакт</translation>
</message>
<message>
<location filename="mainscreen.py" line="643"/>
<location filename="mainscreen.py" line="665"/>
<source>Choose folder</source>
<translation>Обрати теку</translation>
</message>
<message>
<location filename="mainscreen.py" line="584"/>
<location filename="mainscreen.py" line="590"/>
<source>Allow auto accept</source>
<translation>Дозволити автоприймання</translation>
</message>
<message>
<location filename="mainscreen.py" line="583"/>
<location filename="mainscreen.py" line="589"/>
<source>Disallow auto accept</source>
<translation>Заборонити автоприймання</translation>
</message>
<message>
<location filename="mainscreen.py" line="130"/>
<location filename="mainscreen.py" line="133"/>
<source>Start audio call with friend</source>
<translation>Почати звуковий дзвінок</translation>
</message>
@ -243,17 +243,17 @@ Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="315"/>
<location filename="profile.py" line="327"/>
<source>User {} is now known as {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="661"/>
<location filename="menu.py" line="667"/>
<source>Choose folder with sticker pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="673"/>
<location filename="menu.py" line="679"/>
<source>Choose folder with smiley pack</source>
<translation type="unfinished"></translation>
</message>
@ -263,7 +263,7 @@ Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="607"/>
<location filename="mainscreen.py" line="625"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
@ -273,107 +273,107 @@ Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="111"/>
<location filename="mainscreen.py" line="113"/>
<source>Lock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="113"/>
<location filename="mainscreen.py" line="115"/>
<source>List of plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="126"/>
<location filename="mainscreen.py" line="129"/>
<source>Video</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="127"/>
<location filename="mainscreen.py" line="130"/>
<source>Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="408"/>
<location filename="mainscreen_widgets.py" line="412"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="132"/>
<location filename="mainscreen.py" line="135"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="133"/>
<location filename="mainscreen.py" line="136"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="134"/>
<location filename="mainscreen.py" line="137"/>
<source>Online first</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="594"/>
<location filename="mainscreen.py" line="603"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="136"/>
<location filename="mainscreen.py" line="139"/>
<source>Online and by name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="137"/>
<location filename="mainscreen.py" line="140"/>
<source>Online first and by name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="141"/>
<location filename="mainscreen.py" line="144"/>
<source>Import plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="142"/>
<location filename="mainscreen.py" line="145"/>
<source>Reload plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="470"/>
<location filename="mainscreen.py" line="476"/>
<source>Choose folder with plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="479"/>
<location filename="mainscreen.py" line="485"/>
<source>Restart Toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="481"/>
<location filename="mainscreen.py" line="487"/>
<source>Plugin will be loaded after restart</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="491"/>
<location filename="mainscreen.py" line="497"/>
<source>Cannot lock app</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="493"/>
<location filename="mainscreen.py" line="499"/>
<source>Error. Profile password is not set.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="588"/>
<location filename="mainscreen.py" line="597"/>
<source>Chat history</source>
<translation type="unfinished">Журнал бесіди</translation>
</message>
<message>
<location filename="mainscreen.py" line="590"/>
<location filename="mainscreen.py" line="599"/>
<source>Export as text</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="591"/>
<location filename="mainscreen.py" line="600"/>
<source>Export as HTML</source>
<translation type="unfinished"></translation>
</message>
@ -383,27 +383,27 @@ Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="595"/>
<location filename="mainscreen.py" line="604"/>
<source>Status message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="596"/>
<location filename="mainscreen.py" line="606"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="600"/>
<location filename="mainscreen.py" line="610"/>
<source>Block friend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="601"/>
<location filename="mainscreen.py" line="611"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="628"/>
<location filename="mainscreen.py" line="650"/>
<source>Notes about user</source>
<translation type="unfinished"></translation>
</message>
@ -448,35 +448,75 @@ Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="468"/>
<location filename="mainscreen_widgets.py" line="472"/>
<source>Text &quot;{}&quot; was not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="470"/>
<location filename="mainscreen_widgets.py" line="474"/>
<source>Not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1328"/>
<source>User {} invites you to group chat. Accept?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1329"/>
<source>Group chat invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1365"/>
<source>{} users in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1386"/>
<source>Enter new title for group {}:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="634"/>
<source>Set title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="120"/>
<source>Create group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="615"/>
<source>Invite to group chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="633"/>
<source>Leave chat</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MenuWindow</name>
<message>
<location filename="mainscreen_widgets.py" line="213"/>
<location filename="mainscreen_widgets.py" line="217"/>
<source>Send screenshot</source>
<translation type="unfinished">Надіслати знімок екрану</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="214"/>
<location filename="mainscreen_widgets.py" line="218"/>
<source>Send file</source>
<translation type="unfinished">Надіслати файл</translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="215"/>
<location filename="mainscreen_widgets.py" line="219"/>
<source>Add smiley</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="216"/>
<location filename="mainscreen_widgets.py" line="220"/>
<source>Send sticker</source>
<translation type="unfinished"></translation>
</message>
@ -548,42 +588,42 @@ Version: </source>
<context>
<name>PluginsForm</name>
<message>
<location filename="menu.py" line="957"/>
<location filename="menu.py" line="967"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="958"/>
<location filename="menu.py" line="968"/>
<source>Open selected plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>No GUI found for this plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="970"/>
<location filename="menu.py" line="980"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="985"/>
<location filename="menu.py" line="995"/>
<source>No description available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1001"/>
<location filename="menu.py" line="1011"/>
<source>Disable plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1003"/>
<location filename="menu.py" line="1013"/>
<source>Enable plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="993"/>
<location filename="menu.py" line="1003"/>
<source>No plugins found</source>
<translation type="unfinished"></translation>
</message>
@ -724,67 +764,67 @@ Version: </source>
<context>
<name>WelcomeScreen</name>
<message>
<location filename="mainscreen_widgets.py" line="291"/>
<location filename="mainscreen_widgets.py" line="295"/>
<source>Don&apos;t show again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="292"/>
<location filename="mainscreen_widgets.py" line="296"/>
<source>Tip of the day</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="297"/>
<location filename="mainscreen_widgets.py" line="301"/>
<source>Press Esc if you want hide app to tray.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="300"/>
<location filename="mainscreen_widgets.py" line="304"/>
<source>Right click on screenshot button hides app to tray during screenshot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="303"/>
<location filename="mainscreen_widgets.py" line="307"/>
<source>You can use Tox over Tor. For more info read &lt;a href=&quot;https://wiki.tox.chat/users/tox_over_tor_tot&quot;&gt;this post&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="306"/>
<location filename="mainscreen_widgets.py" line="310"/>
<source>Use Settings -&gt; Interface to customize interface.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="309"/>
<location filename="mainscreen_widgets.py" line="313"/>
<source>Set profile password via Profile -&gt; Settings. Password allows Toxygen encrypt your history and settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="312"/>
<location filename="mainscreen_widgets.py" line="316"/>
<source>Since v0.1.3 Toxygen supports plugins. &lt;a href=&quot;https://github.com/toxygen-project/toxygen/blob/master/docs/plugins.md&quot;&gt;Read more&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="315"/>
<location filename="mainscreen_widgets.py" line="319"/>
<source>Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="318"/>
<location filename="mainscreen_widgets.py" line="322"/>
<source>New in Toxygen 0.3.0:&lt;br&gt;Video calls&lt;br&gt;Python3.6 support&lt;br&gt;Migration to PyQt5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="321"/>
<location filename="mainscreen_widgets.py" line="325"/>
<source>Delete single message in chat: make right click on spinner or message time and choose &quot;Delete&quot; in menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="324"/>
<location filename="mainscreen_widgets.py" line="328"/>
<source>Use right click on inline image to save it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen_widgets.py" line="327"/>
<location filename="mainscreen_widgets.py" line="331"/>
<source>Set new NoSpam to avoid spam friend requests: Profile -&gt; Settings -&gt; Set new NoSpam.</source>
<translation type="unfinished"></translation>
</message>
@ -792,17 +832,17 @@ Version: </source>
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="796"/>
<location filename="menu.py" line="802"/>
<source>Output device:</source>
<translation>Пристрій виводу:</translation>
</message>
<message>
<location filename="menu.py" line="794"/>
<location filename="menu.py" line="800"/>
<source>Audio settings</source>
<translation>Налаштування звуку</translation>
</message>
<message>
<location filename="menu.py" line="795"/>
<location filename="menu.py" line="801"/>
<source>Input device:</source>
<translation>Пристрій вводу:</translation>
</message>
@ -810,32 +850,32 @@ Version: </source>
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1223"/>
<location filename="profile.py" line="1250"/>
<source>Incoming video call</source>
<translation>Вхідний відеодзвінок</translation>
</message>
<message>
<location filename="profile.py" line="1225"/>
<location filename="profile.py" line="1252"/>
<source>Incoming audio call</source>
<translation>Вхідний аудіодзвінок</translation>
</message>
<message>
<location filename="profile.py" line="1206"/>
<location filename="profile.py" line="1233"/>
<source>Outgoing video call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1208"/>
<location filename="profile.py" line="1235"/>
<source>Outgoing audio call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1254"/>
<location filename="profile.py" line="1281"/>
<source>Call declined</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1256"/>
<location filename="profile.py" line="1283"/>
<source>Call finished</source>
<translation type="unfinished"></translation>
</message>
@ -843,82 +883,82 @@ Version: </source>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="646"/>
<location filename="menu.py" line="652"/>
<source>Language:</source>
<translation>Мова:</translation>
</message>
<message>
<location filename="menu.py" line="645"/>
<location filename="menu.py" line="651"/>
<source>Theme:</source>
<translation>Тема:</translation>
</message>
<message>
<location filename="menu.py" line="644"/>
<location filename="menu.py" line="650"/>
<source>Interface settings</source>
<translation>Налаштування зовнішнього вигляду</translation>
</message>
<message>
<location filename="menu.py" line="643"/>
<location filename="menu.py" line="649"/>
<source>Show avatars in chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="647"/>
<location filename="menu.py" line="653"/>
<source>Smileys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="648"/>
<location filename="menu.py" line="654"/>
<source>Smiley pack:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="649"/>
<location filename="menu.py" line="655"/>
<source>Mirror mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="650"/>
<location filename="menu.py" line="656"/>
<source>Messages font size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="651"/>
<location filename="menu.py" line="657"/>
<source>Select unread messages notification color</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="652"/>
<location filename="menu.py" line="658"/>
<source>Compact contact list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="653"/>
<location filename="menu.py" line="659"/>
<source>Import smiley pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="654"/>
<location filename="menu.py" line="660"/>
<source>Import sticker pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="655"/>
<location filename="menu.py" line="661"/>
<source>Close to tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="656"/>
<location filename="menu.py" line="662"/>
<source>Select font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart app to apply settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="743"/>
<location filename="menu.py" line="749"/>
<source>Restart required</source>
<translation type="unfinished"></translation>
</message>
@ -1004,25 +1044,30 @@ Version: </source>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="537"/>
<location filename="menu.py" line="542"/>
<source>Enable sound notifications</source>
<translation>Увімкнути звукові сповіщення</translation>
</message>
<message>
<location filename="menu.py" line="535"/>
<location filename="menu.py" line="539"/>
<source>Enable notifications</source>
<translation>Увімкнути сповіщення</translation>
</message>
<message>
<location filename="menu.py" line="534"/>
<location filename="menu.py" line="538"/>
<source>Notification settings</source>
<translation>Налаштування сповіщень</translation>
</message>
<message>
<location filename="menu.py" line="536"/>
<location filename="menu.py" line="541"/>
<source>Enable call&apos;s sound</source>
<translation>Увімкнути звук дзвінка</translation>
</message>
<message>
<location filename="menu.py" line="540"/>
<source>Notify about all messages in groups</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>pass</name>
@ -1166,57 +1211,57 @@ Version: </source>
<context>
<name>updateSettingsForm</name>
<message>
<location filename="menu.py" line="1041"/>
<location filename="menu.py" line="1051"/>
<source>Update settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1042"/>
<location filename="menu.py" line="1052"/>
<source>Select update mode:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1043"/>
<location filename="menu.py" line="1053"/>
<source>Update Toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1044"/>
<location filename="menu.py" line="1054"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1045"/>
<location filename="menu.py" line="1055"/>
<source>Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1046"/>
<location filename="menu.py" line="1056"/>
<source>Auto</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1065"/>
<location filename="menu.py" line="1075"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1058"/>
<location filename="menu.py" line="1068"/>
<source>Problems with internet connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1066"/>
<location filename="menu.py" line="1076"/>
<source>Updater not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1077"/>
<location filename="menu.py" line="1087"/>
<source>No updates found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="1078"/>
<location filename="menu.py" line="1088"/>
<source>Toxygen is up to date</source>
<translation type="unfinished"></translation>
</message>
@ -1224,22 +1269,22 @@ Version: </source>
<context>
<name>videoSettingsForm</name>
<message>
<location filename="menu.py" line="876"/>
<location filename="menu.py" line="882"/>
<source>Video settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="877"/>
<location filename="menu.py" line="883"/>
<source>Device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="856"/>
<location filename="menu.py" line="862"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="878"/>
<location filename="menu.py" line="884"/>
<source>Select region</source>
<translation type="unfinished"></translation>
</message>

View File

@ -5,7 +5,7 @@ import sys
import re
program_version = '0.3.1'
program_version = '0.3.2'
def cached(func):