contact blocking, friend requests fix, translations update

This commit is contained in:
ingvar1995 2016-04-25 15:48:56 +03:00
parent 9b02089bff
commit f8eb1462e1
11 changed files with 245 additions and 97 deletions

View File

@ -130,8 +130,11 @@ def friend_request(tox, public_key, message, message_size, user_data):
"""
Called when user get new friend request
"""
print 'Friend request'
profile = Profile.get_instance()
tox_id = bin_to_string(public_key, TOX_PUBLIC_KEY_SIZE)
key = ''.join(chr(x) for x in public_key[:TOX_PUBLIC_KEY_SIZE])
tox_id = bin_to_string(key, TOX_PUBLIC_KEY_SIZE)
if tox_id not in Settings.get_instance()['blocked']:
invoke_in_main_thread(profile.process_friend_request, tox_id, message.decode('utf-8'))
# -----------------------------------------------------------------------------------------------------------------

View File

@ -67,7 +67,7 @@ class AV(object):
rate=self._audio_rate,
channels=self._audio_channels,
input=True,
input_device_index=settings.Settings().get_instance().audio['input'],
input_device_index=settings.Settings.get_instance().audio['input'],
frames_per_buffer=self._audio_sample_count * 10)
self._audio_thread = threading.Thread(target=self.send_audio)
@ -100,7 +100,7 @@ class AV(object):
self._out_stream = self._audio.open(format=pyaudio.paInt16,
channels=channels_count,
rate=rate,
output_device_index=settings.Settings().get_instance().audio['output'],
output_device_index=settings.Settings.get_instance().audio['output'],
output=True)
self._out_stream.write(samples)

View File

@ -255,9 +255,9 @@ class PrivacySettings(CenteredWidget):
def initUI(self):
self.setObjectName("privacySettings")
self.resize(350, 400)
self.setMinimumSize(QtCore.QSize(350, 400))
self.setMaximumSize(QtCore.QSize(350, 400))
self.resize(350, 550)
self.setMinimumSize(QtCore.QSize(350, 550))
self.setMaximumSize(QtCore.QSize(350, 550))
self.saveHistory = QtGui.QCheckBox(self)
self.saveHistory.setGeometry(QtCore.QRect(40, 20, 291, 22))
self.saveHistory.setObjectName("saveHistory")
@ -275,10 +275,9 @@ class PrivacySettings(CenteredWidget):
self.auto_path = QtGui.QLabel(self)
self.auto_path.setGeometry(QtCore.QRect(40, 190, 350, 30))
self.path = QtGui.QPlainTextEdit(self)
self.path.setGeometry(QtCore.QRect(10, 240, 330, 30))
self.path.setGeometry(QtCore.QRect(10, 225, 330, 45))
self.change_path = QtGui.QPushButton(self)
self.change_path.setGeometry(QtCore.QRect(125, 280, 100, 30))
self.retranslateUi()
self.change_path.setGeometry(QtCore.QRect(10, 280, 330, 30))
settings = Settings.get_instance()
self.typingNotifications.setChecked(settings['typing_notifications'])
self.fileautoaccept.setChecked(settings['allow_auto_accept'])
@ -286,6 +285,22 @@ class PrivacySettings(CenteredWidget):
self.inlines.setChecked(settings['allow_inline'])
self.path.setPlainText(settings['auto_accept_path'] or curr_directory())
self.change_path.clicked.connect(self.new_path)
self.block_user_label = QtGui.QLabel(self)
self.block_user_label.setGeometry(QtCore.QRect(10, 320, 330, 30))
self.block_id = QtGui.QPlainTextEdit(self)
self.block_id.setGeometry(QtCore.QRect(10, 350, 330, 30))
self.block = QtGui.QPushButton(self)
self.block.setGeometry(QtCore.QRect(10, 390, 330, 30))
self.block.clicked.connect(lambda: Profile.get_instance().block_user(self.block_id.toPlainText()) or self.close())
self.blocked_users_label = QtGui.QLabel(self)
self.blocked_users_label.setGeometry(QtCore.QRect(10, 430, 330, 30))
self.comboBox = QtGui.QComboBox(self)
self.comboBox.setGeometry(QtCore.QRect(10, 460, 330, 30))
self.comboBox.addItems(settings['blocked'])
self.unblock = QtGui.QPushButton(self)
self.unblock.setGeometry(QtCore.QRect(10, 500, 330, 30))
self.unblock.clicked.connect(lambda: self.unblock_user())
self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
def retranslateUi(self):
@ -296,6 +311,19 @@ class PrivacySettings(CenteredWidget):
self.auto_path.setText(QtGui.QApplication.translate("privacySettings", "Auto accept default path:", None, QtGui.QApplication.UnicodeUTF8))
self.change_path.setText(QtGui.QApplication.translate("privacySettings", "Change", None, QtGui.QApplication.UnicodeUTF8))
self.inlines.setText(QtGui.QApplication.translate("privacySettings", "Allow inlines", None, QtGui.QApplication.UnicodeUTF8))
self.block_user_label.setText(QtGui.QApplication.translate("privacySettings", "Block by TOX ID:", None, QtGui.QApplication.UnicodeUTF8))
self.blocked_users_label.setText(QtGui.QApplication.translate("privacySettings", "Blocked users:", None, QtGui.QApplication.UnicodeUTF8))
self.unblock.setText(QtGui.QApplication.translate("privacySettings", "Unblock", None, QtGui.QApplication.UnicodeUTF8))
self.block.setText(QtGui.QApplication.translate("privacySettings", "Block user", None, QtGui.QApplication.UnicodeUTF8))
def unblock_user(self):
if not self.comboBox.count():
return
title = QtGui.QApplication.translate("privacySettings", "Add to friend list", None, QtGui.QApplication.UnicodeUTF8)
info = QtGui.QApplication.translate("privacySettings", "Do you want to add this user to friend list?", None, QtGui.QApplication.UnicodeUTF8)
reply = QtGui.QMessageBox.question(None, title, info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
Profile.get_instance().unblock_user(self.comboBox.currentText(), reply == QtGui.QMessageBox.Yes)
self.close()
def closeEvent(self, event):
settings = Settings.get_instance()

View File

@ -144,6 +144,7 @@ class Friend(Contact):
def __del__(self):
self.set_visibility(False)
del self._widget
if hasattr(self, '_message_getter'):
del self._message_getter
# -----------------------------------------------------------------------------------------------------------------
@ -626,7 +627,7 @@ class Profile(Contact, Singleton):
self._messages.setItemWidget(elem, item)
# -----------------------------------------------------------------------------------------------------------------
# Work with friends (remove, set alias, get public key)
# Work with friends (remove, block, set alias, get public key)
# -----------------------------------------------------------------------------------------------------------------
def set_alias(self, num):
@ -686,6 +687,40 @@ class Profile(Contact, Singleton):
else:
self.set_active(0)
def add_friend(self, tox_id):
num = self._tox.friend_add_norequest(tox_id) # num - friend number
item = self.create_friend_item()
try:
if not self._history.friend_exists_in_db(tox_id):
self._history.add_friend_to_db(tox_id)
message_getter = self._history.messages_getter(tox_id)
except Exception as ex: # something is wrong
log('Accept friend request failed! ' + str(ex))
message_getter = None
friend = Friend(message_getter, num, tox_id, '', item, tox_id)
self._friends.append(friend)
def block_user(self, tox_id):
tox_id = tox_id[:TOX_PUBLIC_KEY_SIZE * 2]
if tox_id == self.tox_id[:TOX_PUBLIC_KEY_SIZE * 2]:
return
settings = Settings.get_instance()
if tox_id not in settings['blocked']:
settings['blocked'].append(tox_id)
settings.save()
try:
num = self._tox.friend_by_public_key(tox_id)
self.delete_friend(num)
except: # not in friend list
pass
def unblock_user(self, tox_id, add_to_friend_list):
s = Settings.get_instance()
s['blocked'].remove(tox_id)
s.save()
if add_to_friend_list:
self.add_friend(tox_id)
# -----------------------------------------------------------------------------------------------------------------
# Friend requests
# -----------------------------------------------------------------------------------------------------------------
@ -728,16 +763,7 @@ class Profile(Contact, Singleton):
fr_req = QtGui.QApplication.translate('MainWindow', 'Friend request', None, QtGui.QApplication.UnicodeUTF8)
reply = QtGui.QMessageBox.question(None, fr_req, info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes: # accepted
num = self._tox.friend_add_norequest(tox_id) # num - friend number
item = self.create_friend_item()
try:
if not self._history.friend_exists_in_db(tox_id):
self._history.add_friend_to_db(tox_id)
message_getter = self._history.messages_getter(tox_id)
except Exception as ex: # something is wrong
log('Accept friend request failed! ' + str(ex))
friend = Friend(message_getter, num, tox_id, '', item, tox_id)
self._friends.append(friend)
self.add_friend(tox_id)
except Exception as ex: # something is wrong
log('Accept friend request failed! ' + str(ex))

View File

@ -8,7 +8,7 @@ import pyaudio
class Settings(Singleton, dict):
def __init__(self, name=''):
def __init__(self, name):
self.path = ProfileHelper.get_path() + str(name) + '.json'
self.name = name
if os.path.isfile(self.path):
@ -79,6 +79,7 @@ class Settings(Singleton, dict):
default = Settings.get_default_settings()
for key in default:
if key not in self:
print key
self[key] = default[key]
self.save()

View File

@ -984,13 +984,13 @@ class Tox(object):
This event is triggered when a friend request is received.
:param callback: Python function. Should take pointer (c_void_p) to Tox object,
The Public Key (c_char_p) of the user who sent the friend request,
The Public Key (c_uint8 array) of the user who sent the friend request,
The message (c_char_p) they sent along with the request,
The size (c_size_t) of the message byte array,
pointer (c_void_p) to user_data
:param user_data: pointer (c_void_p) to user data
"""
c_callback = CFUNCTYPE(None, c_void_p, c_char_p, c_char_p, c_size_t, c_void_p)
c_callback = CFUNCTYPE(None, c_void_p, POINTER(c_uint8), c_char_p, c_size_t, c_void_p)
self.friend_request_cb = c_callback(callback)
Tox.libtoxcore.tox_callback_friend_request(self._tox_pointer, self.friend_request_cb, c_void_p(user_data))

Binary file not shown.

View File

@ -105,13 +105,13 @@
<translation></translation>
</message>
<message>
<location filename="profile.py" line="724"/>
<location filename="profile.py" line="762"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation></translation>
</message>
<message>
<location filename="profile.py" line="726"/>
<location filename="profile.py" line="764"/>
<source>Friend request</source>
<translation></translation>
</message>
@ -156,7 +156,7 @@
<translation></translation>
</message>
<message>
<location filename="profile.py" line="635"/>
<location filename="profile.py" line="639"/>
<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>
@ -225,17 +225,17 @@
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="476"/>
<location filename="menu.py" line="504"/>
<source>Audio settings</source>
<translation>Audio settings</translation>
</message>
<message>
<location filename="menu.py" line="477"/>
<location filename="menu.py" line="505"/>
<source>Input device:</source>
<translation>Input device:</translation>
</message>
<message>
<location filename="menu.py" line="478"/>
<location filename="menu.py" line="506"/>
<source>Output device:</source>
<translation>Output device:</translation>
</message>
@ -243,12 +243,12 @@
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1001"/>
<location filename="profile.py" line="1041"/>
<source>Incoming video call</source>
<translation>Incoming video call</translation>
</message>
<message>
<location filename="profile.py" line="1003"/>
<location filename="profile.py" line="1043"/>
<source>Incoming audio call</source>
<translation>Incoming audio call</translation>
</message>
@ -256,17 +256,17 @@
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="414"/>
<location filename="menu.py" line="442"/>
<source>Interface settings</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="415"/>
<location filename="menu.py" line="443"/>
<source>Theme:</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="416"/>
<location filename="menu.py" line="444"/>
<source>Language:</source>
<translation></translation>
</message>
@ -322,22 +322,22 @@
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="355"/>
<location filename="menu.py" line="383"/>
<source>Notification settings</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="356"/>
<location filename="menu.py" line="384"/>
<source>Enable notifications</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="357"/>
<location filename="menu.py" line="385"/>
<source>Enable call&apos;s sound</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="358"/>
<location filename="menu.py" line="386"/>
<source>Enable sound notifications</source>
<translation></translation>
</message>
@ -345,50 +345,80 @@
<context>
<name>privacySettings</name>
<message>
<location filename="menu.py" line="292"/>
<location filename="menu.py" line="307"/>
<source>Privacy settings</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="293"/>
<location filename="menu.py" line="308"/>
<source>Save chat history</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="294"/>
<location filename="menu.py" line="309"/>
<source>Allow file auto accept</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="295"/>
<location filename="menu.py" line="310"/>
<source>Send typing notifications</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="296"/>
<location filename="menu.py" line="311"/>
<source>Auto accept default path:</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="297"/>
<location filename="menu.py" line="312"/>
<source>Change</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="298"/>
<location filename="menu.py" line="313"/>
<source>Allow inlines</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="308"/>
<location filename="menu.py" line="336"/>
<source>Chat history</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="311"/>
<location filename="menu.py" line="339"/>
<source>History will be cleaned! Continue?</source>
<translation></translation>
</message>
<message>
<location filename="menu.py" line="315"/>
<source>Blocked users:</source>
<translation>Blocked users:</translation>
</message>
<message>
<location filename="menu.py" line="316"/>
<source>Unblock</source>
<translation>Unblock</translation>
</message>
<message>
<location filename="menu.py" line="317"/>
<source>Block user</source>
<translation>Block user</translation>
</message>
<message>
<location filename="menu.py" line="323"/>
<source>Add to friend list</source>
<translation>Add to friend list</translation>
</message>
<message>
<location filename="menu.py" line="324"/>
<source>Do you want to add this user to friend list?</source>
<translation>Do you want to add this user to friend list?</translation>
</message>
<message>
<location filename="menu.py" line="314"/>
<source>Block by TOX ID:</source>
<translation>Block by TOX ID:</translation>
</message>
</context>
<context>
<name>tray</name>

View File

@ -104,13 +104,13 @@
<translation>À propos du programme</translation>
</message>
<message>
<location filename="profile.py" line="724"/>
<location filename="profile.py" line="762"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation>L&apos;Utilisateur {} veut vout rajouter à sa liste de contacts. Message : {}</translation>
</message>
<message>
<location filename="profile.py" line="726"/>
<location filename="profile.py" line="764"/>
<source>Friend request</source>
<translation>Demande d&apos;amis</translation>
</message>
@ -155,7 +155,7 @@
<translation>Retirer un ami</translation>
</message>
<message>
<location filename="profile.py" line="635"/>
<location filename="profile.py" line="639"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation type="unfinished"></translation>
</message>
@ -224,17 +224,17 @@
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="476"/>
<location filename="menu.py" line="504"/>
<source>Audio settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="477"/>
<location filename="menu.py" line="505"/>
<source>Input device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="478"/>
<location filename="menu.py" line="506"/>
<source>Output device:</source>
<translation type="unfinished"></translation>
</message>
@ -242,12 +242,12 @@
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1001"/>
<location filename="profile.py" line="1041"/>
<source>Incoming video call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="1003"/>
<location filename="profile.py" line="1043"/>
<source>Incoming audio call</source>
<translation type="unfinished"></translation>
</message>
@ -255,17 +255,17 @@
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="414"/>
<location filename="menu.py" line="442"/>
<source>Interface settings</source>
<translation>Paramêtres de l&apos;interface</translation>
</message>
<message>
<location filename="menu.py" line="415"/>
<location filename="menu.py" line="443"/>
<source>Theme:</source>
<translation>Thème :</translation>
</message>
<message>
<location filename="menu.py" line="416"/>
<location filename="menu.py" line="444"/>
<source>Language:</source>
<translation>Langue :</translation>
</message>
@ -321,22 +321,22 @@
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="355"/>
<location filename="menu.py" line="383"/>
<source>Notification settings</source>
<translation>Paramêtres de notification</translation>
</message>
<message>
<location filename="menu.py" line="356"/>
<location filename="menu.py" line="384"/>
<source>Enable notifications</source>
<translation>Activer les notifications</translation>
</message>
<message>
<location filename="menu.py" line="357"/>
<location filename="menu.py" line="385"/>
<source>Enable call&apos;s sound</source>
<translation>Activer les sons d&apos;appel</translation>
</message>
<message>
<location filename="menu.py" line="358"/>
<location filename="menu.py" line="386"/>
<source>Enable sound notifications</source>
<translation>Activer les sons de notifications</translation>
</message>
@ -344,50 +344,80 @@
<context>
<name>privacySettings</name>
<message>
<location filename="menu.py" line="292"/>
<location filename="menu.py" line="307"/>
<source>Privacy settings</source>
<translation>Paramêtres de confidentialité</translation>
</message>
<message>
<location filename="menu.py" line="293"/>
<location filename="menu.py" line="308"/>
<source>Save chat history</source>
<translation>Sauvegarder l&apos;historique du chat</translation>
</message>
<message>
<location filename="menu.py" line="294"/>
<location filename="menu.py" line="309"/>
<source>Allow file auto accept</source>
<translation>Autoriser les fichier automatiquement</translation>
</message>
<message>
<location filename="menu.py" line="295"/>
<location filename="menu.py" line="310"/>
<source>Send typing notifications</source>
<translation>Notifier la frappe</translation>
</message>
<message>
<location filename="menu.py" line="296"/>
<location filename="menu.py" line="311"/>
<source>Auto accept default path:</source>
<translation>Chemin d&apos;accès des fichiers acceptés automatiquement :</translation>
</message>
<message>
<location filename="menu.py" line="297"/>
<location filename="menu.py" line="312"/>
<source>Change</source>
<translation>Modifier</translation>
</message>
<message>
<location filename="menu.py" line="298"/>
<location filename="menu.py" line="313"/>
<source>Allow inlines</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="308"/>
<location filename="menu.py" line="336"/>
<source>Chat history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="311"/>
<location filename="menu.py" line="339"/>
<source>History will be cleaned! Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="315"/>
<source>Blocked users:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="316"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="317"/>
<source>Block user</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="323"/>
<source>Add to friend list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="324"/>
<source>Do you want to add this user to friend list?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="314"/>
<source>Block by TOX ID:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>tray</name>

Binary file not shown.

View File

@ -105,14 +105,14 @@
<translation>О программе</translation>
</message>
<message>
<location filename="profile.py" line="724"/>
<location filename="profile.py" line="762"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation>Пользователь {} хочет добавить Вас в список контактов. Сообщение:
{}</translation>
</message>
<message>
<location filename="profile.py" line="726"/>
<location filename="profile.py" line="764"/>
<source>Friend request</source>
<translation>Запрос на добавление в друзья</translation>
</message>
@ -157,7 +157,7 @@
<translation>Удалить друга</translation>
</message>
<message>
<location filename="profile.py" line="635"/>
<location filename="profile.py" line="639"/>
<source>Enter new alias for friend {} or leave empty to use friend&apos;s name:</source>
<translation>Введите новый псевдоним для друга {} или оставьте пустым для использования его имени:</translation>
</message>
@ -231,17 +231,17 @@
<context>
<name>audioSettingsForm</name>
<message>
<location filename="menu.py" line="476"/>
<location filename="menu.py" line="504"/>
<source>Audio settings</source>
<translation>Настройки аудио</translation>
</message>
<message>
<location filename="menu.py" line="477"/>
<location filename="menu.py" line="505"/>
<source>Input device:</source>
<translation>Устройство ввода:</translation>
</message>
<message>
<location filename="menu.py" line="478"/>
<location filename="menu.py" line="506"/>
<source>Output device:</source>
<translation>Устройство вывода:</translation>
</message>
@ -249,12 +249,12 @@
<context>
<name>incoming_call</name>
<message>
<location filename="profile.py" line="1001"/>
<location filename="profile.py" line="1041"/>
<source>Incoming video call</source>
<translation>Входящий видеозвонок</translation>
</message>
<message>
<location filename="profile.py" line="1003"/>
<location filename="profile.py" line="1043"/>
<source>Incoming audio call</source>
<translation>Входящий аудиозвонок</translation>
</message>
@ -262,17 +262,17 @@
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="414"/>
<location filename="menu.py" line="442"/>
<source>Interface settings</source>
<translation>Настройки интерфейса</translation>
</message>
<message>
<location filename="menu.py" line="415"/>
<location filename="menu.py" line="443"/>
<source>Theme:</source>
<translation>Тема:</translation>
</message>
<message>
<location filename="menu.py" line="416"/>
<location filename="menu.py" line="444"/>
<source>Language:</source>
<translation>Язык:</translation>
</message>
@ -328,22 +328,22 @@
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="355"/>
<location filename="menu.py" line="383"/>
<source>Notification settings</source>
<translation>Настройки уведомлений</translation>
</message>
<message>
<location filename="menu.py" line="356"/>
<location filename="menu.py" line="384"/>
<source>Enable notifications</source>
<translation>Включить уведомления</translation>
</message>
<message>
<location filename="menu.py" line="357"/>
<location filename="menu.py" line="385"/>
<source>Enable call&apos;s sound</source>
<translation>Включить звук звонка</translation>
</message>
<message>
<location filename="menu.py" line="358"/>
<location filename="menu.py" line="386"/>
<source>Enable sound notifications</source>
<translation>Включить звуковые уведомления
</translation>
@ -352,50 +352,80 @@
<context>
<name>privacySettings</name>
<message>
<location filename="menu.py" line="292"/>
<location filename="menu.py" line="307"/>
<source>Privacy settings</source>
<translation>Настройки приватности</translation>
</message>
<message>
<location filename="menu.py" line="293"/>
<location filename="menu.py" line="308"/>
<source>Save chat history</source>
<translation>Сохранять историю переписки</translation>
</message>
<message>
<location filename="menu.py" line="294"/>
<location filename="menu.py" line="309"/>
<source>Allow file auto accept</source>
<translation>Разрешить автополучение файлов</translation>
</message>
<message>
<location filename="menu.py" line="295"/>
<location filename="menu.py" line="310"/>
<source>Send typing notifications</source>
<translation>Посылать уведомления о наборе текста</translation>
</message>
<message>
<location filename="menu.py" line="296"/>
<location filename="menu.py" line="311"/>
<source>Auto accept default path:</source>
<translation>Путь автоприема файлов:</translation>
</message>
<message>
<location filename="menu.py" line="297"/>
<location filename="menu.py" line="312"/>
<source>Change</source>
<translation>Изменить</translation>
</message>
<message>
<location filename="menu.py" line="298"/>
<location filename="menu.py" line="313"/>
<source>Allow inlines</source>
<translation>Разрешать инлайны</translation>
</message>
<message>
<location filename="menu.py" line="308"/>
<location filename="menu.py" line="336"/>
<source>Chat history</source>
<translation>История чата</translation>
</message>
<message>
<location filename="menu.py" line="311"/>
<location filename="menu.py" line="339"/>
<source>History will be cleaned! Continue?</source>
<translation>История переписки будет очищена! Продолжить?</translation>
</message>
<message>
<location filename="menu.py" line="315"/>
<source>Blocked users:</source>
<translation>Заблокированные пользователи:</translation>
</message>
<message>
<location filename="menu.py" line="316"/>
<source>Unblock</source>
<translation>Разблокировать</translation>
</message>
<message>
<location filename="menu.py" line="317"/>
<source>Block user</source>
<translation>Заблокировать пользователя</translation>
</message>
<message>
<location filename="menu.py" line="323"/>
<source>Add to friend list</source>
<translation>Добавить в список друзей</translation>
</message>
<message>
<location filename="menu.py" line="324"/>
<source>Do you want to add this user to friend list?</source>
<translation>Добавить этого пользователя в список друзей?</translation>
</message>
<message>
<location filename="menu.py" line="314"/>
<source>Block by TOX ID:</source>
<translation>Блокировать по TOX ID:</translation>
</message>
</context>
<context>
<name>tray</name>