multilingual support

This commit is contained in:
ingvar1995 2016-04-04 12:20:32 +03:00
parent 1be8040b45
commit 490fa70a76
10 changed files with 775 additions and 34 deletions

View file

@ -31,6 +31,15 @@ class Toxygen(object):
auto_profile = Settings.get_auto_profile() auto_profile = Settings.get_auto_profile()
if not auto_profile: if not auto_profile:
# show login screen if default profile not found # show login screen if default profile not found
current_locale = QtCore.QLocale()
curr_lang = current_locale.languageToString(current_locale.language())
langs = Settings.supported_languages()
if curr_lang in map(lambda x: x[0], langs):
lang_path = filter(lambda x: x[0] == curr_lang, langs)[0][1]
translator = QtCore.QTranslator()
translator.load('translations/' + lang_path)
app.installTranslator(translator)
app.translator = translator
ls = LoginScreen() ls = LoginScreen()
ls.setWindowIconText("Toxygen") ls.setWindowIconText("Toxygen")
profiles = ProfileHelper.find_profiles() profiles = ProfileHelper.find_profiles()
@ -67,7 +76,7 @@ class Toxygen(object):
deactivate = False deactivate = False
reply = QtGui.QMessageBox.question(None, reply = QtGui.QMessageBox.question(None,
'Profile {}'.format(name), 'Profile {}'.format(name),
'Looks like other instance of Toxygen uses this profile! Continue?', QtGui.QApplication.translate("login", 'Looks like other instance of Toxygen uses this profile! Continue?', None, QtGui.QApplication.UnicodeUTF8),
QtGui.QMessageBox.Yes, QtGui.QMessageBox.Yes,
QtGui.QMessageBox.No) QtGui.QMessageBox.No)
if reply != QtGui.QMessageBox.Yes: if reply != QtGui.QMessageBox.Yes:
@ -76,13 +85,20 @@ class Toxygen(object):
settings.set_active_profile() settings.set_active_profile()
deactivate = True deactivate = True
lang = filter(lambda x: x[0] == settings['language'], Settings.supported_languages())[0]
translator = QtCore.QTranslator()
translator.load('translations/' + lang[1])
app.installTranslator(translator)
app.translator = translator
self.ms = MainWindow(self.tox, self.reset) self.ms = MainWindow(self.tox, self.reset)
# tray icon # tray icon
self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon(curr_directory() + '/images/icon.png'))
self.tray.setObjectName('tray')
m = QtGui.QMenu() m = QtGui.QMenu()
show = m.addAction('Open Toxygen') show = m.addAction(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8))
exit = m.addAction('Exit') exit = m.addAction(QtGui.QApplication.translate('tray', 'Exit', None, QtGui.QApplication.UnicodeUTF8))
def show_window(): def show_window():
if not self.ms.isActiveWindow(): if not self.ms.isActiveWindow():

View file

@ -78,7 +78,13 @@ class MainWindow(QtGui.QMainWindow):
self.actionPrivacy_settings.triggered.connect(self.privacy_settings) self.actionPrivacy_settings.triggered.connect(self.privacy_settings)
self.actionInterface_settings.triggered.connect(self.interface_settings) self.actionInterface_settings.triggered.connect(self.interface_settings)
self.actionNotifications.triggered.connect(self.notification_settings) self.actionNotifications.triggered.connect(self.notification_settings)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def languageChange(self, *args, **kwargs):
self.retranslateUi()
def retranslateUi(self):
self.online_contacts.setText(QtGui.QApplication.translate("Form", "Online contacts", None, QtGui.QApplication.UnicodeUTF8))
self.menuProfile.setTitle(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8)) self.menuProfile.setTitle(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8))
self.menuSettings.setTitle(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) self.menuSettings.setTitle(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8))
self.menuAbout.setTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) self.menuAbout.setTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8))
@ -90,7 +96,6 @@ class MainWindow(QtGui.QMainWindow):
self.actionNetwork.setText(QtGui.QApplication.translate("MainWindow", "Network", None, QtGui.QApplication.UnicodeUTF8)) self.actionNetwork.setText(QtGui.QApplication.translate("MainWindow", "Network", None, QtGui.QApplication.UnicodeUTF8))
self.actionAbout_program.setText(QtGui.QApplication.translate("MainWindow", "About program", None, QtGui.QApplication.UnicodeUTF8)) self.actionAbout_program.setText(QtGui.QApplication.translate("MainWindow", "About program", None, QtGui.QApplication.UnicodeUTF8))
self.actionSettings.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) self.actionSettings.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8))
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def setup_right_bottom(self, Form): def setup_right_bottom(self, Form):
Form.setObjectName("right_bottom") Form.setObjectName("right_bottom")
@ -137,7 +142,6 @@ class MainWindow(QtGui.QMainWindow):
self.contact_name.setGeometry(QtCore.QRect(0, 27, 270, 30)) self.contact_name.setGeometry(QtCore.QRect(0, 27, 270, 30))
self.contact_name.setObjectName("contact_name") self.contact_name.setObjectName("contact_name")
self.contact_name.textChanged.connect(self.filtering) self.contact_name.textChanged.connect(self.filtering)
self.online_contacts.setText(QtGui.QApplication.translate("Form", "Online contacts", None, QtGui.QApplication.UnicodeUTF8))
QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QMetaObject.connectSlotsByName(Form)
def setup_left_top(self, Form): def setup_left_top(self, Form):
@ -261,6 +265,7 @@ class MainWindow(QtGui.QMainWindow):
self.user_info = name self.user_info = name
self.friend_info = info self.friend_info = info
self.profile = Profile(tox, self) self.profile = Profile(tox, self)
self.retranslateUi()
def closeEvent(self, *args, **kwargs): def closeEvent(self, *args, **kwargs):
self.profile.save_history() self.profile.save_history()
@ -272,8 +277,8 @@ class MainWindow(QtGui.QMainWindow):
def about_program(self): def about_program(self):
import util import util
msgBox = QtGui.QMessageBox() msgBox = QtGui.QMessageBox()
msgBox.setWindowTitle('About') msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8))
msgBox.setText('Toxygen is Tox client written on Python 2.7. Version: ' + util.program_version) msgBox.setText(QtGui.QApplication.translate("MainWindow", 'Toxygen is Tox client written on Python 2.7. Version: ', None, QtGui.QApplication.UnicodeUTF8) + util.program_version)
msgBox.exec_() msgBox.exec_()
def network_settings(self): def network_settings(self):
@ -310,7 +315,8 @@ class MainWindow(QtGui.QMainWindow):
def send_file(self): def send_file(self):
if self.profile.is_active_online(): # active friend exists and online if self.profile.is_active_online(): # active friend exists and online
name = QtGui.QFileDialog.getOpenFileName(self, 'Choose file') choose = QtGui.QApplication.translate("MainWindow", "Choose file", None, QtGui.QApplication.UnicodeUTF8)
name = QtGui.QFileDialog.getOpenFileName(self, choose)
if name[0]: if name[0]:
self.profile.send_file(name[0]) self.profile.send_file(name[0])
@ -329,14 +335,14 @@ class MainWindow(QtGui.QMainWindow):
friend = Profile.get_instance().get_friend_by_number(num) friend = Profile.get_instance().get_friend_by_number(num)
settings = Settings.get_instance() settings = Settings.get_instance()
allowed = friend.tox_id in settings['auto_accept_from_friends'] allowed = friend.tox_id in settings['auto_accept_from_friends']
auto = 'Disallow auto accept' if allowed else 'Allow auto accept' auto = QtGui.QApplication.translate("MainWindow", 'Disallow auto accept', None, QtGui.QApplication.UnicodeUTF8) if allowed else QtGui.QApplication.translate("MainWindow", 'Allow auto accept', None, QtGui.QApplication.UnicodeUTF8)
if item is not None: if item is not None:
self.listMenu = QtGui.QMenu() self.listMenu = QtGui.QMenu()
set_alias_item = self.listMenu.addAction('Set alias') set_alias_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Set alias', None, QtGui.QApplication.UnicodeUTF8))
clear_history_item = self.listMenu.addAction('Clear history') clear_history_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Clear history', None, QtGui.QApplication.UnicodeUTF8))
copy_key_item = self.listMenu.addAction('Copy public key') copy_key_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Copy public key', None, QtGui.QApplication.UnicodeUTF8))
auto_accept_item = self.listMenu.addAction(auto) auto_accept_item = self.listMenu.addAction(auto)
remove_item = self.listMenu.addAction('Remove friend') remove_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Remove friend', None, QtGui.QApplication.UnicodeUTF8))
self.connect(set_alias_item, QtCore.SIGNAL("triggered()"), lambda: self.set_alias(num)) self.connect(set_alias_item, QtCore.SIGNAL("triggered()"), lambda: self.set_alias(num))
self.connect(remove_item, QtCore.SIGNAL("triggered()"), lambda: self.remove_friend(num)) self.connect(remove_item, QtCore.SIGNAL("triggered()"), lambda: self.remove_friend(num))
self.connect(copy_key_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_friend_key(num)) self.connect(copy_key_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_friend_key(num))

View file

@ -87,15 +87,15 @@ class ProfileSettings(CenteredWidget):
def initUI(self): def initUI(self):
self.setObjectName("ProfileSettingsForm") self.setObjectName("ProfileSettingsForm")
self.setMinimumSize(QtCore.QSize(650, 400)) self.setMinimumSize(QtCore.QSize(650, 370))
self.setMaximumSize(QtCore.QSize(650, 400)) self.setMaximumSize(QtCore.QSize(650, 370))
self.nick = QtGui.QLineEdit(self) self.nick = QtGui.QLineEdit(self)
self.nick.setGeometry(QtCore.QRect(30, 60, 351, 27)) self.nick.setGeometry(QtCore.QRect(30, 60, 350, 27))
self.nick.setObjectName("nick") self.nick.setObjectName("nick")
profile = Profile.get_instance() profile = Profile.get_instance()
self.nick.setText(profile.name) self.nick.setText(profile.name)
self.status = QtGui.QLineEdit(self) self.status = QtGui.QLineEdit(self)
self.status.setGeometry(QtCore.QRect(30, 130, 351, 27)) self.status.setGeometry(QtCore.QRect(30, 130, 350, 27))
self.status.setObjectName("status") self.status.setObjectName("status")
self.status.setText(profile.status_message) self.status.setText(profile.status_message)
self.label = QtGui.QLabel(self) self.label = QtGui.QLabel(self)
@ -129,14 +129,6 @@ class ProfileSettings(CenteredWidget):
self.export.setGeometry(QtCore.QRect(200, 250, 150, 30)) self.export.setGeometry(QtCore.QRect(200, 250, 150, 30))
self.export.setObjectName("export") self.export.setObjectName("export")
self.export.clicked.connect(self.export_profile) self.export.clicked.connect(self.export_profile)
self.lang_choose = QtGui.QComboBox(self)
self.lang_choose.setGeometry(QtCore.QRect(30, 350, 211, 27))
self.lang_choose.setObjectName("comboBox")
self.lang_choose.addItem('English')
self.lang = QtGui.QLabel(self)
self.lang.setGeometry(QtCore.QRect(40, 310, 121, 31))
font.setPointSize(18)
self.lang.setFont(font)
self.new_avatar = QtGui.QPushButton(self) self.new_avatar = QtGui.QPushButton(self)
self.new_avatar.setGeometry(QtCore.QRect(400, 50, 200, 50)) self.new_avatar.setGeometry(QtCore.QRect(400, 50, 200, 50))
self.delete_avatar = QtGui.QPushButton(self) self.delete_avatar = QtGui.QPushButton(self)
@ -153,7 +145,6 @@ class ProfileSettings(CenteredWidget):
self.label_2.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Status:", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Status:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("ProfileSettingsForm", "TOX ID:", None, QtGui.QApplication.UnicodeUTF8)) self.label_3.setText(QtGui.QApplication.translate("ProfileSettingsForm", "TOX ID:", None, QtGui.QApplication.UnicodeUTF8))
self.copyId.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Copy TOX ID", None, QtGui.QApplication.UnicodeUTF8)) self.copyId.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Copy TOX ID", None, QtGui.QApplication.UnicodeUTF8))
self.lang.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Language:", None, QtGui.QApplication.UnicodeUTF8))
self.new_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "New avatar", None, QtGui.QApplication.UnicodeUTF8)) self.new_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "New avatar", None, QtGui.QApplication.UnicodeUTF8))
self.delete_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Reset avatar", None, QtGui.QApplication.UnicodeUTF8)) self.delete_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Reset avatar", None, QtGui.QApplication.UnicodeUTF8))
@ -384,25 +375,46 @@ class InterfaceSettings(CenteredWidget):
self.label.setObjectName("label") self.label.setObjectName("label")
self.themeSelect = QtGui.QComboBox(self) self.themeSelect = QtGui.QComboBox(self)
self.themeSelect.setGeometry(QtCore.QRect(30, 60, 161, 31)) self.themeSelect.setGeometry(QtCore.QRect(30, 60, 161, 31))
font = QtGui.QFont()
font.setPointSize(17)
self.themeSelect.setFont(font)
self.themeSelect.setObjectName("themeSelect") self.themeSelect.setObjectName("themeSelect")
list_of_themes = ['default', 'windows', 'gtk', 'cde', 'plastique', 'motif'] list_of_themes = ['default', 'windows', 'gtk', 'cde', 'plastique', 'motif']
self.themeSelect.addItems(list_of_themes) self.themeSelect.addItems(list_of_themes)
theme = Settings.get_instance()['theme'] settings = Settings.get_instance()
theme = settings['theme']
index = list_of_themes.index(theme) index = list_of_themes.index(theme)
self.themeSelect.setCurrentIndex(index) self.themeSelect.setCurrentIndex(index)
self.lang_choose = QtGui.QComboBox(self)
self.lang_choose.setGeometry(QtCore.QRect(30, 150, 211, 27))
self.lang_choose.setObjectName("comboBox")
supported = Settings.supported_languages()
for elem in supported:
self.lang_choose.addItem(elem[0])
lang = settings['language']
index = map(lambda x: x[0], supported).index(lang)
self.lang_choose.setCurrentIndex(index)
self.lang = QtGui.QLabel(self)
self.lang.setGeometry(QtCore.QRect(30, 110, 121, 31))
self.lang.setFont(font)
self.retranslateUi() self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self) QtCore.QMetaObject.connectSlotsByName(self)
def retranslateUi(self): def retranslateUi(self):
self.setWindowTitle(QtGui.QApplication.translate("interfaceForm", "Interface settings", None, QtGui.QApplication.UnicodeUTF8)) self.setWindowTitle(QtGui.QApplication.translate("interfaceForm", "Interface settings", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("interfaceForm", "Theme:", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("interfaceForm", "Theme:", None, QtGui.QApplication.UnicodeUTF8))
self.lang.setText(QtGui.QApplication.translate("interfaceForm", "Language:", None, QtGui.QApplication.UnicodeUTF8))
def closeEvent(self, event): def closeEvent(self, event):
settings = Settings.get_instance() settings = Settings.get_instance()
style = str(self.themeSelect.currentText()) style = str(self.themeSelect.currentText())
settings['theme'] = style settings['theme'] = style
settings.save()
QtGui.QApplication.setStyle(get_style(style)) QtGui.QApplication.setStyle(get_style(style))
language = self.lang_choose.currentText()
if settings['language'] != language:
settings['language'] = language
index = self.lang_choose.currentIndex()
path = Settings.supported_languages()[index][1]
app = QtGui.QApplication.instance()
app.removeTranslator(app.translator)
app.translator.load(curr_directory() + '/translations/' + path)
app.installTranslator(app.translator)
settings.save()

View file

@ -682,8 +682,10 @@ class Profile(Contact, Singleton):
:param message: message :param message: message
""" """
try: try:
info = 'User {} wants to add you to contact list. Message:\n{}'.format(tox_id, message) text = QtGui.QApplication.translate('MainWindow', 'User {} wants to add you to contact list. Message:\n{}', None, QtGui.QApplication.UnicodeUTF8)
reply = QtGui.QMessageBox.question(None, 'Friend request', info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) info = text.format(tox_id, message)
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 if reply == QtGui.QMessageBox.Yes: # accepted
num = self._tox.friend_add_norequest(tox_id) # num - friend number num = self._tox.friend_add_norequest(tox_id) # num - friend number
item = self.create_friend_item() item = self.create_friend_item()

View file

@ -48,7 +48,7 @@ class Settings(Singleton, dict):
'tcp_port': 0, 'tcp_port': 0,
'notifications': True, 'notifications': True,
'sound_notifications': False, 'sound_notifications': False,
'language': 'en-en', 'language': 'English',
'save_history': False, 'save_history': False,
'allow_inline': True, 'allow_inline': True,
'allow_auto_accept': False, 'allow_auto_accept': False,
@ -60,6 +60,13 @@ class Settings(Singleton, dict):
'calls_sound': True 'calls_sound': True
} }
@staticmethod
def supported_languages():
return [
('English', 'en_EN'),
('Russian', 'ru_RU')
]
def save(self): def save(self):
text = json.dumps(self) text = json.dumps(self)
with open(self.path, 'w') as fl: with open(self.path, 'w') as fl:

2
src/toxygen.pro Normal file
View file

@ -0,0 +1,2 @@
SOURCES = main.py profile.py menu.py list_items.py loginscreen.py mainscreen.py
TRANSLATIONS = translations/en_GB.ts translations/ru_RU.ts

BIN
src/translations/en_GB.qm Normal file

Binary file not shown.

344
src/translations/en_GB.ts Normal file
View file

@ -0,0 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="en">
<context>
<name>AddContact</name>
<message>
<location filename="menu.py" line="76"/>
<source>Add contact</source>
<translation type="unfinished">Add contact</translation>
</message>
<message>
<location filename="menu.py" line="78"/>
<source>TOX ID:</source>
<translation type="unfinished">TOX ID:</translation>
</message>
<message>
<location filename="menu.py" line="79"/>
<source>Message:</source>
<translation type="unfinished">Message:</translation>
</message>
</context>
<context>
<name>Form</name>
<message>
<location filename="menu.py" line="77"/>
<source>Send request</source>
<translation type="unfinished">Send request</translation>
</message>
<message>
<location filename="menu.py" line="227"/>
<source>IPv6</source>
<translation type="unfinished">IPv6</translation>
</message>
<message>
<location filename="menu.py" line="228"/>
<source>UDP</source>
<translation type="unfinished">UDP</translation>
</message>
<message>
<location filename="menu.py" line="229"/>
<source>Proxy</source>
<translation type="unfinished">Proxy</translation>
</message>
<message>
<location filename="menu.py" line="230"/>
<source>IP:</source>
<translation type="unfinished">IP:</translation>
</message>
<message>
<location filename="menu.py" line="231"/>
<source>Port:</source>
<translation type="unfinished">Port:</translation>
</message>
<message>
<location filename="mainscreen.py" line="140"/>
<source>Online contacts</source>
<translation type="unfinished">Online contacts</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="86"/>
<source>Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="92"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="275"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="85"/>
<source>Add contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="87"/>
<source>Privacy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="88"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="89"/>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="90"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="91"/>
<source>About program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="686"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profile.py" line="688"/>
<source>Friend request</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="276"/>
<source>Toxygen is Tox client written on Python 2.7. Version: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="314"/>
<source>Choose file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="333"/>
<source>Disallow auto accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="334"/>
<source>Allow auto accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="336"/>
<source>Set alias</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="337"/>
<source>Clear history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="338"/>
<source>Copy public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainscreen.py" line="340"/>
<source>Remove friend</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkSettings</name>
<message>
<location filename="menu.py" line="226"/>
<source>Network settings</source>
<translation type="unfinished">Network settings</translation>
</message>
</context>
<context>
<name>ProfileSettingsForm</name>
<message>
<location filename="menu.py" line="142"/>
<source>Export profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="143"/>
<source>Profile settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="144"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="145"/>
<source>Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="146"/>
<source>TOX ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="147"/>
<source>Copy TOX ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="148"/>
<source>New avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="149"/>
<source>Reset avatar</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="402"/>
<source>Interface settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="403"/>
<source>Theme:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="404"/>
<source>Language:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>login</name>
<message>
<location filename="loginscreen.py" line="66"/>
<source>Log in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="67"/>
<source>Create</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="68"/>
<source>Profile name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="69"/>
<source>Load profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="70"/>
<source>Use as default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="71"/>
<source>Load existing profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="72"/>
<source>Create new profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="loginscreen.py" line="73"/>
<source>toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.py" line="70"/>
<source>Looks like other instance of Toxygen uses this profile! Continue?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="342"/>
<source>Notification settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="343"/>
<source>Enable notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="344"/>
<source>Enable call&apos;s sound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="345"/>
<source>Enable sound notifications</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>privacySettings</name>
<message>
<location filename="menu.py" line="289"/>
<source>Privacy settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="290"/>
<source>Save chat history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="291"/>
<source>Allow file auto accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="292"/>
<source>Send typing notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="293"/>
<source>Auto accept default path:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="menu.py" line="294"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>tray</name>
<message>
<location filename="main.py" line="85"/>
<source>Open Toxygen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.py" line="86"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
src/translations/ru_RU.qm Normal file

Binary file not shown.

352
src/translations/ru_RU.ts Normal file
View file

@ -0,0 +1,352 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="ru_RU">
<context>
<name>AddContact</name>
<message>
<location filename="menu.py" line="76"/>
<source>Add contact</source>
<translation type="unfinished">Добавить контакт</translation>
</message>
<message>
<location filename="menu.py" line="78"/>
<source>TOX ID:</source>
<translation type="unfinished">TOX ID:</translation>
</message>
<message>
<location filename="menu.py" line="79"/>
<source>Message:</source>
<translation type="unfinished">Сообщение:</translation>
</message>
</context>
<context>
<name>Form</name>
<message>
<location filename="menu.py" line="77"/>
<source>Send request</source>
<translation type="unfinished">Отправить запрос</translation>
</message>
<message>
<location filename="menu.py" line="227"/>
<source>IPv6</source>
<translation type="unfinished">IPv6</translation>
</message>
<message>
<location filename="menu.py" line="228"/>
<source>UDP</source>
<translation type="unfinished">UDP</translation>
</message>
<message>
<location filename="menu.py" line="229"/>
<source>Proxy</source>
<translation type="unfinished">Прокси</translation>
</message>
<message>
<location filename="menu.py" line="230"/>
<source>IP:</source>
<translation type="unfinished">IP:</translation>
</message>
<message>
<location filename="menu.py" line="231"/>
<source>Port:</source>
<translation type="unfinished">Порт:</translation>
</message>
<message>
<location filename="mainscreen.py" line="140"/>
<source>Online contacts</source>
<translation type="unfinished">Контакты в сети</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="mainscreen.py" line="86"/>
<source>Profile</source>
<translation type="unfinished">Профиль</translation>
</message>
<message>
<location filename="mainscreen.py" line="92"/>
<source>Settings</source>
<translation type="unfinished">Настройки</translation>
</message>
<message>
<location filename="mainscreen.py" line="275"/>
<source>About</source>
<translation type="unfinished">О программе</translation>
</message>
<message>
<location filename="mainscreen.py" line="85"/>
<source>Add contact</source>
<translation type="unfinished">Добавить контакт</translation>
</message>
<message>
<location filename="mainscreen.py" line="87"/>
<source>Privacy</source>
<translation type="unfinished">Приватность</translation>
</message>
<message>
<location filename="mainscreen.py" line="88"/>
<source>Interface</source>
<translation type="unfinished">Интерфейс</translation>
</message>
<message>
<location filename="mainscreen.py" line="89"/>
<source>Notifications</source>
<translation type="unfinished">Уведомления</translation>
</message>
<message>
<location filename="mainscreen.py" line="90"/>
<source>Network</source>
<translation type="unfinished">Сеть</translation>
</message>
<message>
<location filename="mainscreen.py" line="91"/>
<source>About program</source>
<translation type="unfinished">О программе</translation>
</message>
<message>
<location filename="profile.py" line="686"/>
<source>User {} wants to add you to contact list. Message:
{}</source>
<translation type="unfinished">Пользователь {} хочет добавить Вас в список контактов. Сообщение:
{}</translation>
</message>
<message>
<location filename="profile.py" line="688"/>
<source>Friend request</source>
<translation type="unfinished">Запрос на добавление в друзья</translation>
</message>
<message>
<location filename="mainscreen.py" line="276"/>
<source>Toxygen is Tox client written on Python 2.7. Version: </source>
<translation type="unfinished">Toxygen - клиент для мессенджера Tox, написанный на Python 2.7. Версия: </translation>
</message>
<message>
<location filename="mainscreen.py" line="314"/>
<source>Choose file</source>
<translation type="unfinished">Выберите файл</translation>
</message>
<message>
<location filename="mainscreen.py" line="333"/>
<source>Disallow auto accept</source>
<translation type="unfinished">Запретить автоматическое получение файлов</translation>
</message>
<message>
<location filename="mainscreen.py" line="334"/>
<source>Allow auto accept</source>
<translation type="unfinished">Разрешить автоматическое получение файлов</translation>
</message>
<message>
<location filename="mainscreen.py" line="336"/>
<source>Set alias</source>
<translation type="unfinished">Изменить псевдоним</translation>
</message>
<message>
<location filename="mainscreen.py" line="337"/>
<source>Clear history</source>
<translation type="unfinished">Очистить историю</translation>
</message>
<message>
<location filename="mainscreen.py" line="338"/>
<source>Copy public key</source>
<translation type="unfinished">Копировать публичный ключ</translation>
</message>
<message>
<location filename="mainscreen.py" line="340"/>
<source>Remove friend</source>
<translation type="unfinished">Удалить друга</translation>
</message>
</context>
<context>
<name>NetworkSettings</name>
<message>
<location filename="menu.py" line="226"/>
<source>Network settings</source>
<translation type="unfinished">Настройки сети</translation>
</message>
</context>
<context>
<name>ProfileSettingsForm</name>
<message>
<location filename="menu.py" line="142"/>
<source>Export profile</source>
<translation type="unfinished">Экспорт профиля</translation>
</message>
<message>
<location filename="menu.py" line="143"/>
<source>Profile settings</source>
<translation type="unfinished">Настройки профиля</translation>
</message>
<message>
<location filename="menu.py" line="144"/>
<source>Name:</source>
<translation type="unfinished">Имя:</translation>
</message>
<message>
<location filename="menu.py" line="145"/>
<source>Status:</source>
<translation type="unfinished">Статус:</translation>
</message>
<message>
<location filename="menu.py" line="146"/>
<source>TOX ID:</source>
<translation type="unfinished">TOX ID:</translation>
</message>
<message>
<location filename="menu.py" line="147"/>
<source>Copy TOX ID</source>
<translation type="unfinished">Копировать TOX ID</translation>
</message>
<message>
<location filename="menu.py" line="156"/>
<source>Language:</source>
<translation type="obsolete">Язык:</translation>
</message>
<message>
<location filename="menu.py" line="148"/>
<source>New avatar</source>
<translation type="unfinished">Новый аватар</translation>
</message>
<message>
<location filename="menu.py" line="149"/>
<source>Reset avatar</source>
<translation type="unfinished">Сбросить аватар</translation>
</message>
</context>
<context>
<name>interfaceForm</name>
<message>
<location filename="menu.py" line="402"/>
<source>Interface settings</source>
<translation type="unfinished">Настройки интерфейса</translation>
</message>
<message>
<location filename="menu.py" line="403"/>
<source>Theme:</source>
<translation type="unfinished">Тема:</translation>
</message>
<message>
<location filename="menu.py" line="404"/>
<source>Language:</source>
<translation type="unfinished">Язык:</translation>
</message>
</context>
<context>
<name>login</name>
<message>
<location filename="loginscreen.py" line="66"/>
<source>Log in</source>
<translation type="unfinished">Вход</translation>
</message>
<message>
<location filename="loginscreen.py" line="67"/>
<source>Create</source>
<translation type="unfinished">Создать</translation>
</message>
<message>
<location filename="loginscreen.py" line="68"/>
<source>Profile name:</source>
<translation type="unfinished">Имя профиля:</translation>
</message>
<message>
<location filename="loginscreen.py" line="69"/>
<source>Load profile</source>
<translation type="unfinished">Загрузить профиль</translation>
</message>
<message>
<location filename="loginscreen.py" line="70"/>
<source>Use as default</source>
<translation type="unfinished">По умолчанию</translation>
</message>
<message>
<location filename="loginscreen.py" line="71"/>
<source>Load existing profile</source>
<translation type="unfinished">Загрузить профиль</translation>
</message>
<message>
<location filename="loginscreen.py" line="72"/>
<source>Create new profile</source>
<translation type="unfinished">Создать новый профиль</translation>
</message>
<message>
<location filename="loginscreen.py" line="73"/>
<source>toxygen</source>
<translation type="unfinished">toxygen</translation>
</message>
<message>
<location filename="main.py" line="70"/>
<source>Looks like other instance of Toxygen uses this profile! Continue?</source>
<translation type="unfinished">Похоже, что этот профиль используется другим экземпляром Toxygen! Продолжить?</translation>
</message>
</context>
<context>
<name>notificationsForm</name>
<message>
<location filename="menu.py" line="342"/>
<source>Notification settings</source>
<translation type="unfinished">Настройки уведомлений</translation>
</message>
<message>
<location filename="menu.py" line="343"/>
<source>Enable notifications</source>
<translation type="unfinished">Включить уведомления</translation>
</message>
<message>
<location filename="menu.py" line="344"/>
<source>Enable call&apos;s sound</source>
<translation type="unfinished">Включить звук звонков</translation>
</message>
<message>
<location filename="menu.py" line="345"/>
<source>Enable sound notifications</source>
<translation type="unfinished">Включить звуковые уведомления
</translation>
</message>
</context>
<context>
<name>privacySettings</name>
<message>
<location filename="menu.py" line="289"/>
<source>Privacy settings</source>
<translation type="unfinished">Настройки приватности</translation>
</message>
<message>
<location filename="menu.py" line="290"/>
<source>Save chat history</source>
<translation type="unfinished">Сохранять историю переписки</translation>
</message>
<message>
<location filename="menu.py" line="291"/>
<source>Allow file auto accept</source>
<translation type="unfinished">Разрешить автополучение файлов</translation>
</message>
<message>
<location filename="menu.py" line="292"/>
<source>Send typing notifications</source>
<translation type="unfinished">Посылать уведомления о наборе текста</translation>
</message>
<message>
<location filename="menu.py" line="293"/>
<source>Auto accept default path:</source>
<translation type="unfinished">Путь автоприема файлов:</translation>
</message>
<message>
<location filename="menu.py" line="294"/>
<source>Change</source>
<translation type="unfinished">Изменить</translation>
</message>
</context>
<context>
<name>tray</name>
<message>
<location filename="main.py" line="85"/>
<source>Open Toxygen</source>
<translation type="unfinished">Открыть Toxygen</translation>
</message>
<message>
<location filename="main.py" line="86"/>
<source>Exit</source>
<translation type="unfinished">Выход</translation>
</message>
</context>
</TS>