multilingual support
This commit is contained in:
parent
1be8040b45
commit
490fa70a76
10 changed files with 775 additions and 34 deletions
22
src/main.py
22
src/main.py
|
@ -31,6 +31,15 @@ class Toxygen(object):
|
|||
auto_profile = Settings.get_auto_profile()
|
||||
if not auto_profile:
|
||||
# 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.setWindowIconText("Toxygen")
|
||||
profiles = ProfileHelper.find_profiles()
|
||||
|
@ -67,7 +76,7 @@ class Toxygen(object):
|
|||
deactivate = False
|
||||
reply = QtGui.QMessageBox.question(None,
|
||||
'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.No)
|
||||
if reply != QtGui.QMessageBox.Yes:
|
||||
|
@ -76,13 +85,20 @@ class Toxygen(object):
|
|||
settings.set_active_profile()
|
||||
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)
|
||||
|
||||
# tray icon
|
||||
self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon(curr_directory() + '/images/icon.png'))
|
||||
self.tray.setObjectName('tray')
|
||||
m = QtGui.QMenu()
|
||||
show = m.addAction('Open Toxygen')
|
||||
exit = m.addAction('Exit')
|
||||
show = m.addAction(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8))
|
||||
exit = m.addAction(QtGui.QApplication.translate('tray', 'Exit', None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
def show_window():
|
||||
if not self.ms.isActiveWindow():
|
||||
|
|
|
@ -78,7 +78,13 @@ class MainWindow(QtGui.QMainWindow):
|
|||
self.actionPrivacy_settings.triggered.connect(self.privacy_settings)
|
||||
self.actionInterface_settings.triggered.connect(self.interface_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.menuSettings.setTitle(QtGui.QApplication.translate("MainWindow", "Settings", 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.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))
|
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||
|
||||
def setup_right_bottom(self, Form):
|
||||
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.setObjectName("contact_name")
|
||||
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)
|
||||
|
||||
def setup_left_top(self, Form):
|
||||
|
@ -261,6 +265,7 @@ class MainWindow(QtGui.QMainWindow):
|
|||
self.user_info = name
|
||||
self.friend_info = info
|
||||
self.profile = Profile(tox, self)
|
||||
self.retranslateUi()
|
||||
|
||||
def closeEvent(self, *args, **kwargs):
|
||||
self.profile.save_history()
|
||||
|
@ -272,8 +277,8 @@ class MainWindow(QtGui.QMainWindow):
|
|||
def about_program(self):
|
||||
import util
|
||||
msgBox = QtGui.QMessageBox()
|
||||
msgBox.setWindowTitle('About')
|
||||
msgBox.setText('Toxygen is Tox client written on Python 2.7. Version: ' + util.program_version)
|
||||
msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8))
|
||||
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_()
|
||||
|
||||
def network_settings(self):
|
||||
|
@ -310,7 +315,8 @@ class MainWindow(QtGui.QMainWindow):
|
|||
|
||||
def send_file(self):
|
||||
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]:
|
||||
self.profile.send_file(name[0])
|
||||
|
||||
|
@ -329,14 +335,14 @@ class MainWindow(QtGui.QMainWindow):
|
|||
friend = Profile.get_instance().get_friend_by_number(num)
|
||||
settings = Settings.get_instance()
|
||||
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:
|
||||
self.listMenu = QtGui.QMenu()
|
||||
set_alias_item = self.listMenu.addAction('Set alias')
|
||||
clear_history_item = self.listMenu.addAction('Clear history')
|
||||
copy_key_item = self.listMenu.addAction('Copy public key')
|
||||
set_alias_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Set alias', None, QtGui.QApplication.UnicodeUTF8))
|
||||
clear_history_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Clear history', None, QtGui.QApplication.UnicodeUTF8))
|
||||
copy_key_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Copy public key', None, QtGui.QApplication.UnicodeUTF8))
|
||||
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(remove_item, QtCore.SIGNAL("triggered()"), lambda: self.remove_friend(num))
|
||||
self.connect(copy_key_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_friend_key(num))
|
||||
|
|
48
src/menu.py
48
src/menu.py
|
@ -87,15 +87,15 @@ class ProfileSettings(CenteredWidget):
|
|||
|
||||
def initUI(self):
|
||||
self.setObjectName("ProfileSettingsForm")
|
||||
self.setMinimumSize(QtCore.QSize(650, 400))
|
||||
self.setMaximumSize(QtCore.QSize(650, 400))
|
||||
self.setMinimumSize(QtCore.QSize(650, 370))
|
||||
self.setMaximumSize(QtCore.QSize(650, 370))
|
||||
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")
|
||||
profile = Profile.get_instance()
|
||||
self.nick.setText(profile.name)
|
||||
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.setText(profile.status_message)
|
||||
self.label = QtGui.QLabel(self)
|
||||
|
@ -129,14 +129,6 @@ class ProfileSettings(CenteredWidget):
|
|||
self.export.setGeometry(QtCore.QRect(200, 250, 150, 30))
|
||||
self.export.setObjectName("export")
|
||||
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.setGeometry(QtCore.QRect(400, 50, 200, 50))
|
||||
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_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.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.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.themeSelect = QtGui.QComboBox(self)
|
||||
self.themeSelect.setGeometry(QtCore.QRect(30, 60, 161, 31))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(17)
|
||||
self.themeSelect.setFont(font)
|
||||
self.themeSelect.setObjectName("themeSelect")
|
||||
list_of_themes = ['default', 'windows', 'gtk', 'cde', 'plastique', 'motif']
|
||||
self.themeSelect.addItems(list_of_themes)
|
||||
theme = Settings.get_instance()['theme']
|
||||
settings = Settings.get_instance()
|
||||
theme = settings['theme']
|
||||
index = list_of_themes.index(theme)
|
||||
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()
|
||||
QtCore.QMetaObject.connectSlotsByName(self)
|
||||
|
||||
def retranslateUi(self):
|
||||
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.lang.setText(QtGui.QApplication.translate("interfaceForm", "Language:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
def closeEvent(self, event):
|
||||
settings = Settings.get_instance()
|
||||
style = str(self.themeSelect.currentText())
|
||||
settings['theme'] = style
|
||||
settings.save()
|
||||
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()
|
||||
|
||||
|
|
|
@ -682,8 +682,10 @@ class Profile(Contact, Singleton):
|
|||
:param message: message
|
||||
"""
|
||||
try:
|
||||
info = 'User {} wants to add you to contact list. Message:\n{}'.format(tox_id, message)
|
||||
reply = QtGui.QMessageBox.question(None, 'Friend request', info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
|
||||
text = QtGui.QApplication.translate('MainWindow', 'User {} wants to add you to contact list. Message:\n{}', None, QtGui.QApplication.UnicodeUTF8)
|
||||
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
|
||||
num = self._tox.friend_add_norequest(tox_id) # num - friend number
|
||||
item = self.create_friend_item()
|
||||
|
|
|
@ -48,7 +48,7 @@ class Settings(Singleton, dict):
|
|||
'tcp_port': 0,
|
||||
'notifications': True,
|
||||
'sound_notifications': False,
|
||||
'language': 'en-en',
|
||||
'language': 'English',
|
||||
'save_history': False,
|
||||
'allow_inline': True,
|
||||
'allow_auto_accept': False,
|
||||
|
@ -60,6 +60,13 @@ class Settings(Singleton, dict):
|
|||
'calls_sound': True
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def supported_languages():
|
||||
return [
|
||||
('English', 'en_EN'),
|
||||
('Russian', 'ru_RU')
|
||||
]
|
||||
|
||||
def save(self):
|
||||
text = json.dumps(self)
|
||||
with open(self.path, 'w') as fl:
|
||||
|
|
2
src/toxygen.pro
Normal file
2
src/toxygen.pro
Normal 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
BIN
src/translations/en_GB.qm
Normal file
Binary file not shown.
344
src/translations/en_GB.ts
Normal file
344
src/translations/en_GB.ts
Normal 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'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
BIN
src/translations/ru_RU.qm
Normal file
Binary file not shown.
352
src/translations/ru_RU.ts
Normal file
352
src/translations/ru_RU.ts
Normal 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'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>
|
Loading…
Reference in a new issue