Revert "Code Syntax Refactoring"
This commit is contained in:
parent
995f232a3b
commit
51fba3722f
19
appdmg.py
19
appdmg.py
@ -7,18 +7,16 @@ import os.path
|
||||
application = defines.get('app', 'dist/Syncplay.app')
|
||||
appname = os.path.basename(application)
|
||||
|
||||
|
||||
def icon_from_app(app_path):
|
||||
plist_path = os.path.join(app_path, 'Contents', 'Info.plist')
|
||||
plist = biplist.readPlist(plist_path)
|
||||
icon_name = plist['CFBundleIconFile']
|
||||
icon_root, icon_ext = os.path.splitext(icon_name)
|
||||
icon_root,icon_ext = os.path.splitext(icon_name)
|
||||
if not icon_ext:
|
||||
icon_ext = '.icns'
|
||||
icon_name = icon_root + icon_ext
|
||||
return os.path.join(app_path, 'Contents', 'Resources', icon_name)
|
||||
|
||||
|
||||
# Volume format (see hdiutil create -help)
|
||||
format = defines.get('format', 'UDZO')
|
||||
|
||||
@ -29,19 +27,10 @@ compression_level = 9
|
||||
size = defines.get('size', None)
|
||||
|
||||
# Files to include
|
||||
files = [
|
||||
application,
|
||||
'resources/lua/intf/.syncplay.lua',
|
||||
'resources/.macos_vlc_install.command',
|
||||
'resources/.macOS_readme.pdf'
|
||||
]
|
||||
files = [ application, 'resources/lua/intf/.syncplay.lua', 'resources/.macos_vlc_install.command', 'resources/.macOS_readme.pdf' ]
|
||||
|
||||
# Symlinks to create
|
||||
symlinks = {
|
||||
'Applications': '/Applications',
|
||||
'Install for VLC': '.macos_vlc_install.command',
|
||||
'Read Me': '.macOS_readme.pdf'
|
||||
}
|
||||
symlinks = { 'Applications': '/Applications', 'Install for VLC': '.macos_vlc_install.command', 'Read Me': '.macOS_readme.pdf' }
|
||||
|
||||
# Volume icon
|
||||
#
|
||||
@ -49,7 +38,7 @@ symlinks = {
|
||||
# image, *or* you can define badge_icon, in which case the icon file you specify
|
||||
# will be used to badge the system's Removable Disk icon
|
||||
#
|
||||
# icon = '/path/to/icon.icns'
|
||||
#icon = '/path/to/icon.icns'
|
||||
badge_icon = icon_from_app(application)
|
||||
|
||||
# Where to put the icons
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
#coding:utf8
|
||||
|
||||
|
||||
# *** TROUBLESHOOTING ***
|
||||
# 1) If you get the error "ImportError: No module named zope.interface" then add an empty __init__.py file to the PYTHONDIR/Lib/site-packages/zope directory
|
||||
# 2) It is expected that you will have NSIS 3 NSIS from http://nsis.sourceforge.net installed.
|
||||
import codecs
|
||||
import sys
|
||||
#*** TROUBLESHOOTING ***
|
||||
#1) If you get the error "ImportError: No module named zope.interface" then add an empty __init__.py file to the PYTHONDIR/Lib/site-packages/zope directory
|
||||
#2) It is expected that you will have NSIS 3 NSIS from http://nsis.sourceforge.net installed.
|
||||
|
||||
import sys, codecs
|
||||
# try:
|
||||
# if (sys.version_info.major != 2) or (sys.version_info.minor < 7):
|
||||
# raise Exception("You must build Syncplay with Python 2.7!")
|
||||
@ -14,20 +14,18 @@ import sys
|
||||
# import warnings
|
||||
# warnings.warn("You must build Syncplay with Python 2.7!")
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
from string import Template
|
||||
|
||||
import syncplay
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
from syncplay.messages import getMissingStrings
|
||||
|
||||
|
||||
missingStrings = getMissingStrings()
|
||||
if missingStrings is not None and missingStrings is not "":
|
||||
import warnings
|
||||
warnings.warn("MISSING/UNUSED STRINGS DETECTED:\n{}".format(missingStrings))
|
||||
|
||||
|
||||
def get_nsis_path():
|
||||
bin_name = "makensis.exe"
|
||||
from winreg import HKEY_LOCAL_MACHINE as HKLM
|
||||
@ -41,11 +39,9 @@ def get_nsis_path():
|
||||
raise Exception("You must install NSIS 3 or later.")
|
||||
except WindowsError:
|
||||
return bin_name
|
||||
|
||||
|
||||
NSIS_COMPILE = get_nsis_path()
|
||||
|
||||
OUT_DIR = r"dist\Syncplay"
|
||||
OUT_DIR = "dist\Syncplay"
|
||||
SETUP_SCRIPT_PATH = "syncplay_setup.nsi"
|
||||
NSIS_SCRIPT_TEMPLATE = r"""
|
||||
!include LogicLib.nsh
|
||||
@ -612,7 +608,6 @@ NSIS_SCRIPT_TEMPLATE = r"""
|
||||
SectionEnd
|
||||
"""
|
||||
|
||||
|
||||
class NSISScript(object):
|
||||
def create(self):
|
||||
fileList, totalSize = self.getBuildDirContents(OUT_DIR)
|
||||
@ -623,10 +618,10 @@ class NSISScript(object):
|
||||
if os.path.isfile(SETUP_SCRIPT_PATH):
|
||||
raise RuntimeError("Cannot create setup script, file exists at {}".format(SETUP_SCRIPT_PATH))
|
||||
contents = Template(NSIS_SCRIPT_TEMPLATE).substitute(
|
||||
version=syncplay.version,
|
||||
uninstallFiles=uninstallFiles,
|
||||
installFiles=installFiles,
|
||||
totalSize=totalSize,
|
||||
version = syncplay.version,
|
||||
uninstallFiles = uninstallFiles,
|
||||
installFiles = installFiles,
|
||||
totalSize = totalSize,
|
||||
)
|
||||
with codecs.open(SETUP_SCRIPT_PATH, "w", "utf-8-sig") as outfile:
|
||||
outfile.write(contents)
|
||||
@ -669,15 +664,13 @@ class NSISScript(object):
|
||||
delete.append('RMdir "$INSTDIR\\{}"'.format(file_))
|
||||
return "\n".join(delete)
|
||||
|
||||
|
||||
guiIcons = [
|
||||
'resources/accept.png', 'resources/arrow_undo.png', 'resources/clock_go.png',
|
||||
guiIcons = ['resources/accept.png', 'resources/arrow_undo.png', 'resources/clock_go.png',
|
||||
'resources/control_pause_blue.png', 'resources/cross.png', 'resources/door_in.png',
|
||||
'resources/folder_explore.png', 'resources/help.png', 'resources/table_refresh.png',
|
||||
'resources/timeline_marker.png', 'resources/control_play_blue.png',
|
||||
'resources/mpc-hc.png', 'resources/mpc-hc64.png', 'resources/mplayer.png',
|
||||
'resources/timeline_marker.png','resources/control_play_blue.png',
|
||||
'resources/mpc-hc.png','resources/mpc-hc64.png','resources/mplayer.png',
|
||||
'resources/mpc-be.png',
|
||||
'resources/mpv.png', 'resources/vlc.png', 'resources/house.png', 'resources/film_link.png',
|
||||
'resources/mpv.png','resources/vlc.png', 'resources/house.png', 'resources/film_link.png',
|
||||
'resources/eye.png', 'resources/comments.png', 'resources/cog_delete.png', 'resources/chevrons_right.png',
|
||||
'resources/user_key.png', 'resources/lock.png', 'resources/key_go.png', 'resources/page_white_key.png',
|
||||
'resources/tick.png', 'resources/lock_open.png', 'resources/empty_checkbox.png', 'resources/tick_checkbox.png',
|
||||
@ -692,14 +685,8 @@ guiIcons = [
|
||||
'resources/shield_add.png',
|
||||
'resources/email_go.png',
|
||||
'resources/world_add.png', 'resources/film_add.png', 'resources/delete.png', 'resources/spinner.mng'
|
||||
]
|
||||
resources = [
|
||||
"resources/icon.ico",
|
||||
"resources/syncplay.png",
|
||||
"resources/syncplayintf.lua",
|
||||
"resources/license.rtf",
|
||||
"resources/third-party-notices.rtf"
|
||||
]
|
||||
]
|
||||
resources = ["resources/icon.ico", "resources/syncplay.png", "resources/syncplayintf.lua", "resources/license.rtf", "resources/third-party-notices.rtf"]
|
||||
resources.extend(guiIcons)
|
||||
intf_resources = ["resources/lua/intf/syncplay.lua"]
|
||||
|
||||
|
||||
@ -14,21 +14,16 @@ DATA_FILES = [
|
||||
('resources', glob('resources/*.png') + glob('resources/*.rtf') + glob('resources/*.lua')),
|
||||
]
|
||||
OPTIONS = {
|
||||
'iconfile': 'resources/icon.icns',
|
||||
'iconfile':'resources/icon.icns',
|
||||
'extra_scripts': 'syncplayServer.py',
|
||||
'includes': {'PySide2.QtCore', 'PySide2.QtUiTools', 'PySide2.QtGui', 'PySide2.QtWidgets', 'certifi'},
|
||||
'includes': {'PySide2.QtCore', 'PySide2.QtUiTools', 'PySide2.QtGui','PySide2.QtWidgets', 'certifi'},
|
||||
'excludes': {'PySide', 'PySide.QtCore', 'PySide.QtUiTools', 'PySide.QtGui'},
|
||||
'qt_plugins': [
|
||||
'platforms/libqcocoa.dylib',
|
||||
'platforms/libqminimal.dylib',
|
||||
'platforms/libqoffscreen.dylib',
|
||||
'styles/libqmacstyle.dylib'
|
||||
],
|
||||
'qt_plugins': ['platforms/libqcocoa.dylib', 'platforms/libqminimal.dylib','platforms/libqoffscreen.dylib', 'styles/libqmacstyle.dylib'],
|
||||
'plist': {
|
||||
'CFBundleName': 'Syncplay',
|
||||
'CFBundleShortVersionString': syncplay.version,
|
||||
'CFBundleIdentifier': 'pl.syncplay.Syncplay',
|
||||
'LSMinimumSystemVersion': '10.11.0',
|
||||
'CFBundleName':'Syncplay',
|
||||
'CFBundleShortVersionString':syncplay.version,
|
||||
'CFBundleIdentifier':'pl.syncplay.Syncplay',
|
||||
'LSMinimumSystemVersion':'10.11.0',
|
||||
'NSHumanReadableCopyright': '@ 2018 Syncplay All Rights Reserved'
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,12 +2,11 @@
|
||||
#coding:utf8
|
||||
|
||||
|
||||
# *** TROUBLESHOOTING ***
|
||||
# 1) If you get the error "ImportError: No module named zope.interface" then add an empty __init__.py file to the PYTHONDIR/Lib/site-packages/zope directory
|
||||
# 2) It is expected that you will have NSIS 3 NSIS from http://nsis.sourceforge.net installed.
|
||||
#*** TROUBLESHOOTING ***
|
||||
#1) If you get the error "ImportError: No module named zope.interface" then add an empty __init__.py file to the PYTHONDIR/Lib/site-packages/zope directory
|
||||
#2) It is expected that you will have NSIS 3 NSIS from http://nsis.sourceforge.net installed.
|
||||
|
||||
import codecs
|
||||
import sys
|
||||
import sys, codecs
|
||||
# try:
|
||||
# if (sys.version_info.major != 2) or (sys.version_info.minor < 7):
|
||||
# raise Exception("You must build Syncplay with Python 2.7!")
|
||||
@ -15,26 +14,23 @@ import sys
|
||||
# import warnings
|
||||
# warnings.warn("You must build Syncplay with Python 2.7!")
|
||||
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
from string import Template
|
||||
|
||||
from distutils.core import setup
|
||||
try:
|
||||
from py2exe.build_exe import py2exe
|
||||
except ImportError:
|
||||
from py2exe.distutils_buildexe import py2exe
|
||||
from string import Template
|
||||
|
||||
import syncplay
|
||||
from syncplay.messages import getMissingStrings
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
from syncplay.messages import getMissingStrings
|
||||
missingStrings = getMissingStrings()
|
||||
if missingStrings is not None and missingStrings is not "":
|
||||
import warnings
|
||||
warnings.warn("MISSING/UNUSED STRINGS DETECTED:\n{}".format(missingStrings))
|
||||
|
||||
|
||||
def get_nsis_path():
|
||||
bin_name = "makensis.exe"
|
||||
from winreg import HKEY_LOCAL_MACHINE as HKLM
|
||||
@ -48,8 +44,6 @@ def get_nsis_path():
|
||||
raise Exception("You must install NSIS 3 or later.")
|
||||
except WindowsError:
|
||||
return bin_name
|
||||
|
||||
|
||||
NSIS_COMPILE = get_nsis_path()
|
||||
|
||||
OUT_DIR = "syncplay_v{}".format(syncplay.version)
|
||||
@ -619,7 +613,6 @@ NSIS_SCRIPT_TEMPLATE = r"""
|
||||
SectionEnd
|
||||
"""
|
||||
|
||||
|
||||
class NSISScript(object):
|
||||
def create(self):
|
||||
fileList, totalSize = self.getBuildDirContents(OUT_DIR)
|
||||
@ -630,10 +623,10 @@ class NSISScript(object):
|
||||
if os.path.isfile(SETUP_SCRIPT_PATH):
|
||||
raise RuntimeError("Cannot create setup script, file exists at {}".format(SETUP_SCRIPT_PATH))
|
||||
contents = Template(NSIS_SCRIPT_TEMPLATE).substitute(
|
||||
version=syncplay.version,
|
||||
uninstallFiles=uninstallFiles,
|
||||
installFiles=installFiles,
|
||||
totalSize=totalSize,
|
||||
version = syncplay.version,
|
||||
uninstallFiles = uninstallFiles,
|
||||
installFiles = installFiles,
|
||||
totalSize = totalSize,
|
||||
)
|
||||
with codecs.open(SETUP_SCRIPT_PATH, "w", "utf-8-sig") as outfile:
|
||||
outfile.write(contents)
|
||||
@ -676,7 +669,6 @@ class NSISScript(object):
|
||||
delete.append('RMdir "$INSTDIR\\{}"'.format(file_))
|
||||
return "\n".join(delete)
|
||||
|
||||
|
||||
class build_installer(py2exe):
|
||||
def run(self):
|
||||
py2exe.run(self)
|
||||
@ -686,15 +678,13 @@ class build_installer(py2exe):
|
||||
script.compile()
|
||||
print("*** DONE ***")
|
||||
|
||||
|
||||
guiIcons = [
|
||||
'resources/accept.png', 'resources/arrow_undo.png', 'resources/clock_go.png',
|
||||
guiIcons = ['resources/accept.png', 'resources/arrow_undo.png', 'resources/clock_go.png',
|
||||
'resources/control_pause_blue.png', 'resources/cross.png', 'resources/door_in.png',
|
||||
'resources/folder_explore.png', 'resources/help.png', 'resources/table_refresh.png',
|
||||
'resources/timeline_marker.png', 'resources/control_play_blue.png',
|
||||
'resources/mpc-hc.png', 'resources/mpc-hc64.png', 'resources/mplayer.png',
|
||||
'resources/timeline_marker.png','resources/control_play_blue.png',
|
||||
'resources/mpc-hc.png','resources/mpc-hc64.png','resources/mplayer.png',
|
||||
'resources/mpc-be.png',
|
||||
'resources/mpv.png', 'resources/vlc.png', 'resources/house.png', 'resources/film_link.png',
|
||||
'resources/mpv.png','resources/vlc.png', 'resources/house.png', 'resources/film_link.png',
|
||||
'resources/eye.png', 'resources/comments.png', 'resources/cog_delete.png', 'resources/chevrons_right.png',
|
||||
'resources/user_key.png', 'resources/lock.png', 'resources/key_go.png', 'resources/page_white_key.png',
|
||||
'resources/tick.png', 'resources/lock_open.png', 'resources/empty_checkbox.png', 'resources/tick_checkbox.png',
|
||||
@ -709,14 +699,8 @@ guiIcons = [
|
||||
'resources/shield_add.png',
|
||||
'resources/email_go.png',
|
||||
'resources/world_add.png', 'resources/film_add.png', 'resources/delete.png', 'resources/spinner.mng'
|
||||
]
|
||||
resources = [
|
||||
"resources/icon.ico",
|
||||
"resources/syncplay.png",
|
||||
"resources/syncplayintf.lua",
|
||||
"resources/license.rtf",
|
||||
"resources/third-party-notices.rtf"
|
||||
]
|
||||
]
|
||||
resources = ["resources/icon.ico", "resources/syncplay.png", "resources/syncplayintf.lua", "resources/license.rtf", "resources/third-party-notices.rtf"]
|
||||
resources.extend(guiIcons)
|
||||
intf_resources = ["resources/lua/intf/syncplay.lua"]
|
||||
|
||||
@ -730,16 +714,11 @@ common_info = dict(
|
||||
|
||||
info = dict(
|
||||
common_info,
|
||||
windows=[{
|
||||
"script": "syncplayClient.py",
|
||||
"icon_resources": [(1, "resources\\icon.ico")],
|
||||
'dest_base': "Syncplay"},
|
||||
],
|
||||
windows=[{"script":"syncplayClient.py", "icon_resources":[(1, "resources\\icon.ico")], 'dest_base': "Syncplay"},],
|
||||
console=['syncplayServer.py'],
|
||||
# *** If you wish to make the Syncplay client use console mode (for --no-gui to work) then comment out the above two lines and uncomment the following line:
|
||||
# console=['syncplayServer.py', {"script":"syncplayClient.py", "icon_resources":[(1, "resources\\icon.ico")], 'dest_base': "Syncplay"}],
|
||||
options={
|
||||
'py2exe': {
|
||||
options={'py2exe': {
|
||||
'dist_dir': OUT_DIR,
|
||||
'packages': 'PySide.QtUiTools',
|
||||
'includes': 'twisted, sys, encodings, datetime, os, time, math, PySide, liburl, ast, unicodedata, _ssl',
|
||||
@ -749,9 +728,9 @@ info = dict(
|
||||
'compressed': 1
|
||||
}
|
||||
},
|
||||
data_files=[("resources", resources), ("resources/lua/intf", intf_resources)],
|
||||
zipfile="lib/libsync",
|
||||
cmdclass={"py2exe": build_installer},
|
||||
data_files = [("resources", resources),("resources/lua/intf", intf_resources)],
|
||||
zipfile = "lib/libsync",
|
||||
cmdclass = {"py2exe": build_installer},
|
||||
)
|
||||
|
||||
sys.argv.extend(['py2exe', '-p win32com ', '-i twisted.web.resource', '-i PySide.QtCore', '-i PySide.QtGui'])
|
||||
|
||||
@ -1,27 +1,22 @@
|
||||
|
||||
import ast
|
||||
import collections
|
||||
import hashlib
|
||||
import os.path
|
||||
import random
|
||||
import time
|
||||
import re
|
||||
import sys
|
||||
import ast
|
||||
import random
|
||||
import threading
|
||||
import time
|
||||
from copy import deepcopy
|
||||
from functools import wraps
|
||||
|
||||
from twisted.internet.protocol import ClientFactory
|
||||
from twisted.internet import reactor, task, defer, threads
|
||||
|
||||
from functools import wraps
|
||||
from copy import deepcopy
|
||||
from syncplay.protocols import SyncClientProtocol
|
||||
from syncplay import utils, constants, version
|
||||
from syncplay.utils import isMacOS
|
||||
from syncplay.messages import getMissingStrings, getMessage
|
||||
from syncplay.constants import PRIVACY_SENDHASHED_MODE, PRIVACY_DONTSEND_MODE, \
|
||||
PRIVACY_HIDDENFILENAME
|
||||
from syncplay.messages import getMissingStrings, getMessage
|
||||
from syncplay.protocols import SyncClientProtocol
|
||||
from syncplay.utils import isMacOS
|
||||
|
||||
|
||||
import collections
|
||||
class SyncClientFactory(ClientFactory):
|
||||
def __init__(self, client, retry=constants.RECONNECT_RETRIES):
|
||||
self._client = client
|
||||
@ -45,7 +40,7 @@ class SyncClientFactory(ClientFactory):
|
||||
self._timesTried += 1
|
||||
self._client.ui.showMessage(getMessage("reconnection-attempt-notification"))
|
||||
self.reconnecting = True
|
||||
reactor.callLater(0.1 * (2 ** min(self._timesTried, 5)), connector.connect)
|
||||
reactor.callLater(0.1 * (2 ** min(self._timesTried,5)), connector.connect)
|
||||
else:
|
||||
message = getMessage("disconnection-notification")
|
||||
self._client.ui.showErrorMessage(message)
|
||||
@ -63,7 +58,6 @@ class SyncClientFactory(ClientFactory):
|
||||
def stopRetrying(self):
|
||||
self._timesTried = self.retry
|
||||
|
||||
|
||||
class SyncplayClient(object):
|
||||
def __init__(self, playerClass, ui, config):
|
||||
constants.SHOW_OSD = config['showOSD']
|
||||
@ -99,7 +93,7 @@ class SyncplayClient(object):
|
||||
if config['password']:
|
||||
config['password'] = hashlib.md5(config['password'].encode('utf-8')).hexdigest()
|
||||
self._serverPassword = config['password']
|
||||
self._host = "{}:{}".format(config['host'], config['port'])
|
||||
self._host = "{}:{}".format(config['host'],config['port'])
|
||||
self._publicServers = config["publicServers"]
|
||||
if not config['file']:
|
||||
self.__getUserlistOnLogon = True
|
||||
@ -209,19 +203,12 @@ class SyncplayClient(object):
|
||||
self._playerPosition = position
|
||||
self._playerPaused = paused
|
||||
currentLength = self.userlist.currentUser.file["duration"] if self.userlist.currentUser.file else 0
|
||||
if (
|
||||
pauseChange and paused and currentLength > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH
|
||||
and abs(position - currentLength) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD
|
||||
):
|
||||
if pauseChange and paused and currentLength > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH\
|
||||
and abs(position - currentLength ) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD:
|
||||
self.playlist.advancePlaylistCheck()
|
||||
elif pauseChange and "readiness" in self.serverFeatures and self.serverFeatures["readiness"]:
|
||||
if (
|
||||
currentLength == 0 or currentLength == -1 or
|
||||
not (
|
||||
not self.playlist.notJustChangedPlaylist() and
|
||||
abs(position - currentLength) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD
|
||||
)
|
||||
):
|
||||
if currentLength == 0 or currentLength == -1 or\
|
||||
not (not self.playlist.notJustChangedPlaylist() and abs(position - currentLength ) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD):
|
||||
pauseChange = self._toggleReady(pauseChange, paused)
|
||||
|
||||
if self._lastGlobalUpdate:
|
||||
@ -317,7 +304,7 @@ class SyncplayClient(object):
|
||||
self.setPosition(self.getGlobalPosition())
|
||||
self._player.setPaused(True)
|
||||
madeChangeOnPlayer = True
|
||||
if (self.lastLeftTime < time.time() - constants.OSD_DURATION) or hideFromOSD:
|
||||
if (self.lastLeftTime < time.time() - constants.OSD_DURATION) or (hideFromOSD == True):
|
||||
self.ui.showMessage(getMessage("pause-notification").format(setBy), hideFromOSD)
|
||||
else:
|
||||
self.ui.showMessage(getMessage("left-paused-notification").format(self.lastLeftUser, setBy), hideFromOSD)
|
||||
@ -364,9 +351,9 @@ class SyncplayClient(object):
|
||||
self._lastGlobalUpdate = time.time()
|
||||
if doSeek:
|
||||
madeChangeOnPlayer = self._serverSeeked(position, setBy)
|
||||
if diff > self._config['rewindThreshold'] and not doSeek and self._config['rewindOnDesync']:
|
||||
if diff > self._config['rewindThreshold'] and not doSeek and not self._config['rewindOnDesync'] == False:
|
||||
madeChangeOnPlayer = self._rewindPlayerDueToTimeDifference(position, setBy)
|
||||
if self._config['fastforwardOnDesync'] and (not self.userlist.currentUser.canControl() or self._config['dontSlowDownWithMe']):
|
||||
if self._config['fastforwardOnDesync'] and (self.userlist.currentUser.canControl() == False or self._config['dontSlowDownWithMe'] == True):
|
||||
if diff < (constants.FASTFORWARD_BEHIND_THRESHOLD * -1) and not doSeek:
|
||||
if self.behindFirstDetected is None:
|
||||
self.behindFirstDetected = time.time()
|
||||
@ -378,11 +365,11 @@ class SyncplayClient(object):
|
||||
self.behindFirstDetected = time.time() + constants.FASTFORWARD_RESET_THRESHOLD
|
||||
else:
|
||||
self.behindFirstDetected = None
|
||||
if self._player.speedSupported and not doSeek and not paused and self._config['slowOnDesync']:
|
||||
if self._player.speedSupported and not doSeek and not paused and not self._config['slowOnDesync'] == False:
|
||||
madeChangeOnPlayer = self._slowDownToCoverTimeDifference(diff, setBy)
|
||||
if not paused and pauseChanged:
|
||||
if paused == False and pauseChanged:
|
||||
madeChangeOnPlayer = self._serverUnpaused(setBy)
|
||||
elif paused and pauseChanged:
|
||||
elif paused == True and pauseChanged:
|
||||
madeChangeOnPlayer = self._serverPaused(setBy)
|
||||
return madeChangeOnPlayer
|
||||
|
||||
@ -504,7 +491,7 @@ class SyncplayClient(object):
|
||||
if self._config['onlySwitchToTrustedDomains']:
|
||||
if self._config['trustedDomains']:
|
||||
for trustedDomain in self._config['trustedDomains']:
|
||||
trustableURI = ''.join([trustedProtocol, trustedDomain, "/"])
|
||||
trustableURI = ''.join([trustedProtocol,trustedDomain,"/"])
|
||||
if URIToTest.startswith(trustableURI):
|
||||
return True
|
||||
return False
|
||||
@ -579,11 +566,11 @@ class SyncplayClient(object):
|
||||
constants.MAX_ROOM_NAME_LENGTH = self.serverFeatures["maxRoomNameLength"]
|
||||
if self.serverFeatures["maxFilenameLength"] is not None:
|
||||
constants.MAX_FILENAME_LENGTH = self.serverFeatures["maxFilenameLength"]
|
||||
constants.MPV_SYNCPLAYINTF_CONSTANTS_TO_SEND = [
|
||||
"MaxChatMessageLength={}".format(constants.MAX_CHAT_MESSAGE_LENGTH),
|
||||
constants.MPV_SYNCPLAYINTF_CONSTANTS_TO_SEND = ["MaxChatMessageLength={}".format(constants.MAX_CHAT_MESSAGE_LENGTH),
|
||||
"inputPromptStartCharacter={}".format(constants.MPV_INPUT_PROMPT_START_CHARACTER),
|
||||
"inputPromptEndCharacter={}".format(constants.MPV_INPUT_PROMPT_END_CHARACTER),
|
||||
"backslashSubstituteCharacter={}".format(constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER)]
|
||||
"backslashSubstituteCharacter={}".format(
|
||||
constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER)]
|
||||
self.ui.setFeatures(self.serverFeatures)
|
||||
if self._player:
|
||||
self._player.setFeatures(self.serverFeatures)
|
||||
@ -599,6 +586,7 @@ class SyncplayClient(object):
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def sendFile(self):
|
||||
file_ = self.getSanitizedCurrentUserFile()
|
||||
if self._protocol and self._protocol.logged and file_:
|
||||
@ -719,7 +707,7 @@ class SyncplayClient(object):
|
||||
return
|
||||
self._running = True
|
||||
if self._playerClass:
|
||||
perPlayerArguments = utils.getPlayerArgumentsByPathAsArray(self._config['perPlayerArguments'], self._config['playerPath'])
|
||||
perPlayerArguments = utils.getPlayerArgumentsByPathAsArray(self._config['perPlayerArguments'],self._config['playerPath'])
|
||||
if perPlayerArguments:
|
||||
self._config['playerArgs'].extend(perPlayerArguments)
|
||||
reactor.callLater(0.1, self._playerClass.run, self, self._config['playerPath'], self._config['file'], self._config['playerArgs'], )
|
||||
@ -761,9 +749,9 @@ class SyncplayClient(object):
|
||||
return requireServerFeatureDecorator
|
||||
|
||||
@requireServerFeature("chat")
|
||||
def sendChat(self, message):
|
||||
def sendChat(self,message):
|
||||
if self._protocol and self._protocol.logged:
|
||||
message = utils.truncateText(message, constants.MAX_CHAT_MESSAGE_LENGTH)
|
||||
message = utils.truncateText(message,constants.MAX_CHAT_MESSAGE_LENGTH)
|
||||
self._protocol.sendChatMessage(message)
|
||||
|
||||
def sendFeaturesUpdate(self, features):
|
||||
@ -774,7 +762,7 @@ class SyncplayClient(object):
|
||||
from syncplay.ui.ConfigurationGetter import ConfigurationGetter
|
||||
ConfigurationGetter().setConfigOption("sharedPlaylistEnabled", newState)
|
||||
self._config["sharedPlaylistEnabled"] = newState
|
||||
if not oldState and newState:
|
||||
if oldState == False and newState == True:
|
||||
self.playlist.loadCurrentPlaylistIndex()
|
||||
|
||||
def changeAutoplayState(self, newState):
|
||||
@ -785,7 +773,7 @@ class SyncplayClient(object):
|
||||
oldAutoplayConditionsMet = self.autoplayConditionsMet()
|
||||
self.autoPlayThreshold = newThreshold
|
||||
newAutoplayConditionsMet = self.autoplayConditionsMet()
|
||||
if not oldAutoplayConditionsMet and newAutoplayConditionsMet:
|
||||
if oldAutoplayConditionsMet == False and newAutoplayConditionsMet == True:
|
||||
self.autoplayCheck()
|
||||
|
||||
def autoplayCheck(self):
|
||||
@ -811,12 +799,9 @@ class SyncplayClient(object):
|
||||
|
||||
def autoplayConditionsMet(self):
|
||||
recentlyReset = (self.lastRewindTime is not None and abs(time.time() - self.lastRewindTime) < 10) and self._playerPosition < 3
|
||||
return (
|
||||
self._playerPaused and (self.autoPlay or recentlyReset) and
|
||||
self.userlist.currentUser.canControl() and self.userlist.isReadinessSupported()
|
||||
and self.userlist.areAllUsersInRoomReady(requireSameFilenames=self._config["autoplayRequireSameFilenames"])
|
||||
return self._playerPaused and (self.autoPlay or recentlyReset) and self.userlist.currentUser.canControl() and self.userlist.isReadinessSupported()\
|
||||
and self.userlist.areAllUsersInRoomReady(requireSameFilenames=self._config["autoplayRequireSameFilenames"])\
|
||||
and ((self.autoPlayThreshold and self.userlist.usersInRoomCount() >= self.autoPlayThreshold) or recentlyReset)
|
||||
)
|
||||
|
||||
def autoplayTimerIsRunning(self):
|
||||
return self.autoplayTimer.running
|
||||
@ -837,7 +822,7 @@ class SyncplayClient(object):
|
||||
return
|
||||
allReadyMessage = getMessage("all-users-ready").format(self.userlist.readyUserCount())
|
||||
autoplayingMessage = getMessage("autoplaying-notification").format(int(self.autoplayTimeLeft))
|
||||
countdownMessage = "{}{}{}".format(allReadyMessage, self._player.osdMessageSeparator, autoplayingMessage)
|
||||
countdownMessage = "{}{}{}".format(allReadyMessage,self._player.osdMessageSeparator, autoplayingMessage)
|
||||
self.ui.showOSDMessage(countdownMessage, 1, OSDType=constants.OSD_ALERT, mood=constants.MESSAGE_GOODNEWS)
|
||||
if self.autoplayTimeLeft <= 0:
|
||||
self.setPaused(False)
|
||||
@ -933,12 +918,12 @@ class SyncplayClient(object):
|
||||
f = urllib.request.urlopen(constants.SYNCPLAY_UPDATE_URL.format(params))
|
||||
response = f.read()
|
||||
response = response.decode('utf-8')
|
||||
response = response.replace("<p>", "").replace("</p>", "").replace("<br />", "").replace("“", "\"").replace("”", "\"") # Fix Wordpress
|
||||
response = response.replace("<p>","").replace("</p>","").replace("<br />","").replace("“","\"").replace("”","\"") # Fix Wordpress
|
||||
response = json.loads(response)
|
||||
publicServers = None
|
||||
if response["public-servers"]:
|
||||
publicServers = response["public-servers"].\
|
||||
replace("”", "'").replace(":’", "'").replace("’", "'").replace("′", "'").replace("\n", "").replace("\r", "")
|
||||
replace("”","'").replace(":’","'").replace("’","'").replace("′","'").replace("\n","").replace("\r","")
|
||||
publicServers = ast.literal_eval(publicServers)
|
||||
return response["version-status"], response["version-message"] if "version-message" in response\
|
||||
else None, response["version-url"] if "version-url" in response else None, publicServers
|
||||
@ -1064,7 +1049,6 @@ class SyncplayClient(object):
|
||||
elif not self._userlist.currentUser.isReady(): # CurrentUser should always be reminded they are set to not ready
|
||||
self.checkReadyStates()
|
||||
|
||||
|
||||
class SyncplayUser(object):
|
||||
def __init__(self, username=None, room=None, file_=None):
|
||||
self.ready = None
|
||||
@ -1129,7 +1113,6 @@ class SyncplayUser(object):
|
||||
def setFeatures(self, features):
|
||||
self._features = features
|
||||
|
||||
|
||||
class SyncplayUserlist(object):
|
||||
def __init__(self, ui, client):
|
||||
self.currentUser = SyncplayUser()
|
||||
@ -1139,7 +1122,7 @@ class SyncplayUserlist(object):
|
||||
self._roomUsersChanged = True
|
||||
|
||||
def isReadinessSupported(self):
|
||||
if not utils.meetsMinVersion(self._client.serverVersion, constants.USER_READY_MIN_VERSION):
|
||||
if not utils.meetsMinVersion(self._client.serverVersion,constants.USER_READY_MIN_VERSION):
|
||||
return False
|
||||
elif self.onlyUserInRoomWhoSupportsReadiness():
|
||||
return False
|
||||
@ -1158,7 +1141,7 @@ class SyncplayUserlist(object):
|
||||
showOnOSD = constants.SHOW_OSD_WARNINGS
|
||||
else:
|
||||
showOnOSD = constants.SHOW_DIFFERENT_ROOM_OSD
|
||||
if constants.SHOW_NONCONTROLLER_OSD == False and not self.canControl(username):
|
||||
if constants.SHOW_NONCONTROLLER_OSD == False and self.canControl(username) == False:
|
||||
showOnOSD = False
|
||||
hideFromOSD = not showOnOSD
|
||||
if not file_:
|
||||
@ -1275,16 +1258,12 @@ class SyncplayUserlist(object):
|
||||
return False
|
||||
for user in self._users.values():
|
||||
if user.room == self.currentUser.room:
|
||||
if not user.isReadyWithFile() == False:
|
||||
if user.isReadyWithFile() == False:
|
||||
return False
|
||||
elif (
|
||||
requireSameFilenames and
|
||||
(
|
||||
self.currentUser.file is None
|
||||
elif requireSameFilenames and\
|
||||
(self.currentUser.file is None
|
||||
or user.file is None
|
||||
or not utils.sameFilename(self.currentUser.file['name'], user.file['name'])
|
||||
)
|
||||
):
|
||||
or not utils.sameFilename(self.currentUser.file['name'], user.file['name'])):
|
||||
return False
|
||||
return True
|
||||
|
||||
@ -1379,7 +1358,7 @@ class SyncplayUserlist(object):
|
||||
self._users[username].setReady(isReady)
|
||||
self._client.autoplayCheck()
|
||||
|
||||
def userListChange(self, room=None):
|
||||
def userListChange(self, room = None):
|
||||
if room is not None and self.isRoomSame(room):
|
||||
self._roomUsersChanged = True
|
||||
self.ui.userListChange()
|
||||
@ -1415,7 +1394,6 @@ class SyncplayUserlist(object):
|
||||
rooms = collections.OrderedDict(sorted(list(rooms.items()), key=lambda s: s[0].lower()))
|
||||
return rooms
|
||||
|
||||
|
||||
class UiManager(object):
|
||||
def __init__(self, client, ui):
|
||||
self._client = client
|
||||
@ -1440,19 +1418,18 @@ class UiManager(object):
|
||||
|
||||
def showDebugMessage(self, message):
|
||||
if constants.DEBUG_MODE and message.rstrip():
|
||||
sys.stderr.write("{}{}\n".format(time.strftime(constants.UI_TIME_FORMAT, time.localtime()), message.rstrip()))
|
||||
sys.stderr.write("{}{}\n".format(time.strftime(constants.UI_TIME_FORMAT, time.localtime()),message.rstrip()))
|
||||
|
||||
def showChatMessage(self, username, userMessage):
|
||||
messageString = "<{}> {}".format(username, userMessage)
|
||||
if self._client._player.chatOSDSupported and self._client._config["chatOutputEnabled"]:
|
||||
self._client._player.displayChatMessage(username, userMessage)
|
||||
self._client._player.displayChatMessage(username,userMessage)
|
||||
else:
|
||||
self.showOSDMessage(messageString, duration=constants.OSD_DURATION)
|
||||
self.__ui.showMessage(messageString)
|
||||
|
||||
def showMessage(self, message, noPlayer=False, noTimestamp=False, OSDType=constants.OSD_NOTIFICATION, mood=constants.MESSAGE_NEUTRAL):
|
||||
if not noPlayer:
|
||||
self.showOSDMessage(message, duration=constants.OSD_DURATION, OSDType=OSDType, mood=mood)
|
||||
def showMessage(self, message, noPlayer=False, noTimestamp=False, OSDType=constants.OSD_NOTIFICATION,mood=constants.MESSAGE_NEUTRAL):
|
||||
if not noPlayer: self.showOSDMessage(message, duration=constants.OSD_DURATION, OSDType=OSDType, mood=mood)
|
||||
self.__ui.showMessage(message, noTimestamp)
|
||||
|
||||
def updateAutoPlayState(self, newState):
|
||||
@ -1510,7 +1487,6 @@ class UiManager(object):
|
||||
def drop(self):
|
||||
self.__ui.drop()
|
||||
|
||||
|
||||
class SyncplayPlaylist():
|
||||
def __init__(self, client):
|
||||
self._client = client
|
||||
@ -1542,7 +1518,7 @@ class SyncplayPlaylist():
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def changeToPlaylistIndex(self, index, username=None):
|
||||
def changeToPlaylistIndex(self, index, username = None):
|
||||
if self._playlist is None or len(self._playlist) == 0:
|
||||
return
|
||||
if index is None:
|
||||
@ -1648,7 +1624,7 @@ class SyncplayPlaylist():
|
||||
filename = _playlist[_index] if len(_playlist) > _index else None
|
||||
return filename
|
||||
|
||||
def changePlaylist(self, files, username=None, resetIndex=False):
|
||||
def changePlaylist(self, files, username = None, resetIndex=False):
|
||||
if self._playlist == files:
|
||||
if self._playlistIndex != 0 and resetIndex:
|
||||
self.changeToPlaylistIndex(0)
|
||||
@ -1710,11 +1686,9 @@ class SyncplayPlaylist():
|
||||
def advancePlaylistCheck(self):
|
||||
position = self._client.getStoredPlayerPosition()
|
||||
currentLength = self._client.userlist.currentUser.file["duration"] if self._client.userlist.currentUser.file else 0
|
||||
if (
|
||||
currentLength > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH and
|
||||
abs(position - currentLength) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD and
|
||||
self.notJustChangedPlaylist()
|
||||
):
|
||||
if currentLength > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH\
|
||||
and abs(position - currentLength ) < constants.PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD\
|
||||
and self.notJustChangedPlaylist():
|
||||
self.loadNextFileInPlaylist()
|
||||
|
||||
def notJustChangedPlaylist(self):
|
||||
@ -1785,7 +1759,6 @@ class SyncplayPlaylist():
|
||||
def _playlistBufferNeedsUpdating(self, newPlaylist):
|
||||
return self._previousPlaylist != self._playlist and self._playlist != newPlaylist
|
||||
|
||||
|
||||
class FileSwitchManager(object):
|
||||
def __init__(self, client):
|
||||
self._client = client
|
||||
@ -1920,7 +1893,7 @@ class FileSwitchManager(object):
|
||||
for directory in directoryList:
|
||||
for root, dirs, files in os.walk(directory):
|
||||
if filename in files:
|
||||
return os.path.join(root, filename)
|
||||
return os.path.join(root,filename)
|
||||
if time.time() - startTime > constants.FOLDER_SEARCH_TIMEOUT:
|
||||
self.folderSearchEnabled = False
|
||||
self.directorySearchError = getMessage("folder-search-timeout-error").format(directory)
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
|
||||
from syncplay.ui.ConfigurationGetter import ConfigurationGetter
|
||||
from syncplay import ui
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.ui.ConfigurationGetter import ConfigurationGetter
|
||||
|
||||
|
||||
class SyncplayClientManager(object):
|
||||
def run(self):
|
||||
config = ConfigurationGetter().getConfiguration()
|
||||
from syncplay.client import SyncplayClient # Imported later, so the proper reactor is installed
|
||||
from syncplay.client import SyncplayClient #Imported later, so the proper reactor is installed
|
||||
interface = ui.getUi(graphical=not config["noGui"])
|
||||
syncplayClient = SyncplayClient(config["playerClass"], interface, config)
|
||||
if syncplayClient:
|
||||
@ -15,3 +13,4 @@ class SyncplayClientManager(object):
|
||||
syncplayClient.start(config['host'], config['port'])
|
||||
else:
|
||||
interface.showErrorMessage(getMessage("unable-to-start-client-error"), True)
|
||||
|
||||
|
||||
@ -4,28 +4,23 @@ DEFAULT_PORT = 8999
|
||||
OSD_DURATION = 3.0
|
||||
OSD_WARNING_MESSAGE_DURATION = 5.0
|
||||
NO_ALERT_OSD_WARNING_DURATION = 13.0
|
||||
MPC_OSD_POSITION = 1 # Right corner, 1 for left
|
||||
MPC_OSD_POSITION = 1 #Right corner, 1 for left
|
||||
MPLAYER_OSD_LEVEL = 1
|
||||
UI_TIME_FORMAT = "[%X] "
|
||||
CONFIG_NAMES = [".syncplay", "syncplay.ini"] # Syncplay searches first to last
|
||||
CONFIG_NAMES = [".syncplay", "syncplay.ini"] #Syncplay searches first to last
|
||||
DEFAULT_CONFIG_NAME = "syncplay.ini"
|
||||
RECENT_CLIENT_THRESHOLD = "1.5.5" # This and higher considered 'recent' clients (no warnings)
|
||||
WARN_OLD_CLIENTS = True # Use MOTD to inform old clients to upgrade
|
||||
RECENT_CLIENT_THRESHOLD = "1.5.5" #This and higher considered 'recent' clients (no warnings)
|
||||
WARN_OLD_CLIENTS = True #Use MOTD to inform old clients to upgrade
|
||||
LIST_RELATIVE_CONFIGS = True # Print list of relative configs loaded
|
||||
SHOW_CONTACT_INFO = True # Displays dev contact details below list in GUI
|
||||
SHOW_TOOLTIPS = True
|
||||
WARN_ABOUT_MISSING_STRINGS = False # (If debug mode is enabled)
|
||||
FALLBACK_INITIAL_LANGUAGE = "en"
|
||||
FALLBACK_PUBLIC_SYNCPLAY_SERVERS = [
|
||||
['syncplay.pl:8995 (France)', 'syncplay.pl:8995'],
|
||||
['syncplay.pl:8996 (France)', 'syncplay.pl:8996'],
|
||||
['syncplay.pl:8997 (France)', 'syncplay.pl:8997'],
|
||||
['syncplay.pl:8998 (France)', 'syncplay.pl:8998'],
|
||||
['syncplay.pl:8999 (France)', 'syncplay.pl:8999']]
|
||||
FALLBACK_PUBLIC_SYNCPLAY_SERVERS = [['syncplay.pl:8995 (France)', 'syncplay.pl:8995'],['syncplay.pl:8996 (France)', 'syncplay.pl:8996'],['syncplay.pl:8997 (France)', 'syncplay.pl:8997'],['syncplay.pl:8998 (France)', 'syncplay.pl:8998'],['syncplay.pl:8999 (France)', 'syncplay.pl:8999']]
|
||||
PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH = 10 # Seconds
|
||||
PLAYLIST_LOAD_NEXT_FILE_TIME_FROM_END_THRESHOLD = 5 # Seconds (only triggered if file is paused, e.g. due to EOF)
|
||||
|
||||
# Overriden by config
|
||||
#Overriden by config
|
||||
SHOW_OSD = True # Sends Syncplay messages to media player OSD
|
||||
SHOW_OSD_WARNINGS = True # Show warnings if playing different file, alone in room
|
||||
SHOW_SLOWDOWN_OSD = True # Show notifications of slowing down / reverting on time difference
|
||||
@ -35,7 +30,7 @@ SHOW_DIFFERENT_ROOM_OSD = False # Show OSD notifications for events relating to
|
||||
SHOW_DURATION_NOTIFICATION = True
|
||||
DEBUG_MODE = False
|
||||
|
||||
# Changing these might be ok
|
||||
#Changing these might be ok
|
||||
AUTOMATIC_UPDATE_CHECK_FREQUENCY = 7 * 86400 # Days converted into seconds
|
||||
DEFAULT_REWIND_THRESHOLD = 4
|
||||
MINIMUM_REWIND_THRESHOLD = 3
|
||||
@ -84,20 +79,20 @@ FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 25.0 # Secs - How long to wait to find the f
|
||||
FOLDER_SEARCH_TIMEOUT = 20.0 # Secs - How long to wait until searches in folder to update cache are aborted (after first file is found)
|
||||
FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL = 30.0 # Secs - Frequency of updating cache
|
||||
|
||||
# Usually there's no need to adjust these
|
||||
#Usually there's no need to adjust these
|
||||
LAST_PAUSED_DIFF_THRESHOLD = 2
|
||||
FILENAME_STRIP_REGEX = "[-~_\.\[\](): ]"
|
||||
CONTROL_PASSWORD_STRIP_REGEX = "[^a-zA-Z0-9\-]"
|
||||
ROOM_NAME_STRIP_REGEX = "^(\+)(?P<roomnamebase>.*)(:)(\w{12})$"
|
||||
COMMANDS_UNDO = ["u", "undo", "revert"]
|
||||
COMMANDS_CHAT = ["ch", "chat"]
|
||||
COMMANDS_CHAT = ["ch","chat"]
|
||||
COMMANDS_LIST = ["l", "list", "users"]
|
||||
COMMANDS_PAUSE = ["p", "play", "pause"]
|
||||
COMMANDS_ROOM = ["r", "room"]
|
||||
COMMANDS_HELP = ['help', 'h', '?', '/?', r'\?']
|
||||
COMMANDS_CREATE = ['c', 'create']
|
||||
COMMANDS_AUTH = ['a', 'auth']
|
||||
COMMANDS_TOGGLE = ['t', 'toggle']
|
||||
COMMANDS_CREATE = ['c','create']
|
||||
COMMANDS_AUTH = ['a','auth']
|
||||
COMMANDS_TOGGLE = ['t','toggle']
|
||||
MPC_MIN_VER = "1.6.4"
|
||||
MPC_BE_MIN_VER = "1.5.2.3123"
|
||||
VLC_MIN_VERSION = "2.2.1"
|
||||
@ -151,7 +146,7 @@ MPC_BE_ICONPATH = "mpc-be.png"
|
||||
|
||||
MPV_ERROR_MESSAGES_TO_REPEAT = ['[ytdl_hook] Your version of youtube-dl is too old', '[ytdl_hook] youtube-dl failed', 'Failed to recognize file format.', '[syncplayintf] Lua error']
|
||||
|
||||
# Changing these is usually not something you're looking for
|
||||
#Changing these is usually not something you're looking for
|
||||
PLAYER_ASK_DELAY = 0.1
|
||||
PING_MOVING_AVERAGE_WEIGHT = 0.85
|
||||
MPC_OPEN_MAX_WAIT_TIME = 10
|
||||
@ -168,10 +163,10 @@ VLC_OPEN_MAX_WAIT_TIME = 20
|
||||
VLC_MIN_PORT = 10000
|
||||
VLC_MAX_PORT = 55000
|
||||
|
||||
# These are not changes you're looking for
|
||||
#These are not changes you're looking for
|
||||
STYLE_TABLIST = "QListWidget::item { border-style: solid; border-width: 1px; border-radius: 2px; } QListWidget::item:selected { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(242, 248, 255, 255), stop:1 rgba(208, 229, 255, 255)); border-color: #84ACDD; } QListWidget::item:!selected { border-color: transparent; } QListWidget::item:!selected:hover { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(248, 248, 248, 255), stop:1 rgba(229, 229, 229, 255)); border-color: silver; }"
|
||||
STYLE_SUBCHECKBOX = "QCheckBox, QLabel, QRadioButton {{ margin-left: 6px; padding-left: 21px; background:url('{}') left no-repeat }}" # Graphic path
|
||||
STYLE_SUBLABEL = "QCheckBox, QLabel {{ margin-left: 6px; padding-left: 16px; background:url('{}') left no-repeat }}" # Graphic path
|
||||
STYLE_SUBCHECKBOX = "QCheckBox, QLabel, QRadioButton {{ margin-left: 6px; padding-left: 21px; background:url('{}') left no-repeat }}" #Graphic path
|
||||
STYLE_SUBLABEL = "QCheckBox, QLabel {{ margin-left: 6px; padding-left: 16px; background:url('{}') left no-repeat }}" #Graphic path
|
||||
STYLE_ERRORLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: red; padding: 2px; background: #FFAAAA; }"
|
||||
STYLE_SUCCESSLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: green; padding: 2px; background: #AAFFAA; }"
|
||||
STYLE_READY_PUSHBUTTON = "QPushButton { text-align: left; padding: 10px 5px 10px 5px;}"
|
||||
@ -199,19 +194,15 @@ MPV_OSC_VISIBILITY_CHANGE_VERSION = False
|
||||
MPV_INPUT_PROMPT_START_CHARACTER = "〉"
|
||||
MPV_INPUT_PROMPT_END_CHARACTER = " 〈"
|
||||
MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER = "\"
|
||||
MPV_SYNCPLAYINTF_OPTIONS_TO_SEND = ["chatInputEnabled", "chatInputFontFamily", "chatInputRelativeFontSize", "chatInputFontWeight", "chatInputFontUnderline",
|
||||
"chatInputFontColor", "chatInputPosition", "chatOutputFontFamily", "chatOutputRelativeFontSize",
|
||||
"chatOutputFontWeight", "chatOutputFontUnderline", "chatOutputMode", "chatMaxLines",
|
||||
"chatTopMargin", "chatLeftMargin", "chatBottomMargin", "chatDirectInput",
|
||||
"notificationTimeout", "alertTimeout", "chatTimeout", "chatOutputEnabled"]
|
||||
MPV_SYNCPLAYINTF_OPTIONS_TO_SEND = ["chatInputEnabled","chatInputFontFamily", "chatInputRelativeFontSize", "chatInputFontWeight","chatInputFontUnderline",
|
||||
"chatInputFontColor", "chatInputPosition","chatOutputFontFamily","chatOutputRelativeFontSize",
|
||||
"chatOutputFontWeight","chatOutputFontUnderline","chatOutputMode","chatMaxLines",
|
||||
"chatTopMargin","chatLeftMargin","chatBottomMargin","chatDirectInput",
|
||||
"notificationTimeout","alertTimeout","chatTimeout","chatOutputEnabled"]
|
||||
|
||||
MPV_SYNCPLAYINTF_CONSTANTS_TO_SEND = [
|
||||
"MaxChatMessageLength={}".format(MAX_CHAT_MESSAGE_LENGTH),
|
||||
"inputPromptStartCharacter={}".format(MPV_INPUT_PROMPT_START_CHARACTER),
|
||||
"inputPromptEndCharacter={}".format(MPV_INPUT_PROMPT_END_CHARACTER),
|
||||
"backslashSubstituteCharacter={}".format(MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER)]
|
||||
MPV_SYNCPLAYINTF_CONSTANTS_TO_SEND = ["MaxChatMessageLength={}".format(MAX_CHAT_MESSAGE_LENGTH),"inputPromptStartCharacter={}".format(MPV_INPUT_PROMPT_START_CHARACTER),"inputPromptEndCharacter={}".format(MPV_INPUT_PROMPT_END_CHARACTER),"backslashSubstituteCharacter={}".format(MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER)]
|
||||
# Note: Constants updated in client.py->checkForFeatureSupport
|
||||
MPV_SYNCPLAYINTF_LANGUAGE_TO_SEND = ["mpv-key-tab-hint", "mpv-key-hint", "alphakey-mode-warning-first-line", "alphakey-mode-warning-second-line"]
|
||||
MPV_SYNCPLAYINTF_LANGUAGE_TO_SEND = ["mpv-key-tab-hint","mpv-key-hint", "alphakey-mode-warning-first-line", "alphakey-mode-warning-second-line"]
|
||||
VLC_SLAVE_ARGS = ['--extraintf=luaintf', '--lua-intf=syncplay', '--no-quiet', '--no-input-fast-seek',
|
||||
'--play-and-pause', '--start-time=0']
|
||||
VLC_SLAVE_MACOS_ARGS = ['--verbose=2', '--no-file-logging']
|
||||
@ -268,8 +259,8 @@ SYNCPLAY_UPDATE_URL = "https://syncplay.pl/checkforupdate?{}" # Params
|
||||
SYNCPLAY_DOWNLOAD_URL = "https://syncplay.pl/download/"
|
||||
SYNCPLAY_PUBLIC_SERVER_LIST_URL = "https://syncplay.pl/listpublicservers?{}" # Params
|
||||
|
||||
DEFAULT_TRUSTED_DOMAINS = ["youtube.com", "youtu.be"]
|
||||
TRUSTABLE_WEB_PROTOCOLS = ["http://www.", "https://www.", "http://", "https://"]
|
||||
DEFAULT_TRUSTED_DOMAINS = ["youtube.com","youtu.be"]
|
||||
TRUSTABLE_WEB_PROTOCOLS = ["http://www.","https://www.","http://","https://"]
|
||||
|
||||
PRIVATE_FILE_FIELDS = ["path"]
|
||||
|
||||
|
||||
@ -12,8 +12,7 @@ messages = {
|
||||
"de": messages_de.de,
|
||||
"it": messages_it.it,
|
||||
"CURRENT": None
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
def getLanguages():
|
||||
langList = {}
|
||||
@ -22,11 +21,9 @@ def getLanguages():
|
||||
langList[lang] = getMessage("LANGUAGE", lang)
|
||||
return langList
|
||||
|
||||
|
||||
def setLanguage(lang):
|
||||
messages["CURRENT"] = lang
|
||||
|
||||
|
||||
def getMissingStrings():
|
||||
missingStrings = ""
|
||||
for lang in messages:
|
||||
@ -40,7 +37,6 @@ def getMissingStrings():
|
||||
|
||||
return missingStrings
|
||||
|
||||
|
||||
def getInitialLanguage():
|
||||
import locale
|
||||
try:
|
||||
@ -51,11 +47,9 @@ def getInitialLanguage():
|
||||
initialLanguage = constants.FALLBACK_INITIAL_LANGUAGE
|
||||
return initialLanguage
|
||||
|
||||
|
||||
def isValidLanguage(language):
|
||||
return language in messages
|
||||
|
||||
|
||||
def getMessage(type_, locale=None):
|
||||
if constants.SHOW_TOOLTIPS == False:
|
||||
if "-tooltip" in type_:
|
||||
@ -76,4 +70,4 @@ def getMessage(type_, locale=None):
|
||||
else:
|
||||
print("WARNING: Cannot find message '{}'!".format(type_))
|
||||
return "!{}".format(type_) # TODO: Remove
|
||||
# raise KeyError(type_)
|
||||
#raise KeyError(type_)
|
||||
|
||||
@ -3,95 +3,95 @@
|
||||
"""Deutsch dictionary"""
|
||||
|
||||
de = {
|
||||
"LANGUAGE": "Deutsch", # (German)
|
||||
"LANGUAGE" : "Deutsch", # (German)
|
||||
|
||||
# Client notifications
|
||||
"config-cleared-notification": "Einstellungen gelöscht. Änderungen werden gespeichert, wenn du eine gültige Konfiguration speicherst.",
|
||||
"config-cleared-notification" : "Einstellungen gelöscht. Änderungen werden gespeichert, wenn du eine gültige Konfiguration speicherst.",
|
||||
|
||||
"relative-config-notification": "Relative Konfigurationsdatei(en) geladen: {}",
|
||||
"relative-config-notification" : "Relative Konfigurationsdatei(en) geladen: {}",
|
||||
|
||||
"connection-attempt-notification": "Verbinde mit {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification": "Verbindung zum Server verloren, versuche erneut",
|
||||
"disconnection-notification": "Verbindung zum Server beendet",
|
||||
"connection-failed-notification": "Verbindung zum Server fehlgeschlagen",
|
||||
"connected-successful-notification": "Erfolgreich mit Server verbunden",
|
||||
"retrying-notification": "%s, versuche erneut in %d Sekunden...", # Seconds
|
||||
"connection-attempt-notification" : "Verbinde mit {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification" : "Verbindung zum Server verloren, versuche erneut",
|
||||
"disconnection-notification" : "Verbindung zum Server beendet",
|
||||
"connection-failed-notification" : "Verbindung zum Server fehlgeschlagen",
|
||||
"connected-successful-notification" : "Erfolgreich mit Server verbunden",
|
||||
"retrying-notification" : "%s, versuche erneut in %d Sekunden...", # Seconds
|
||||
|
||||
"rewind-notification": "Zurückgespult wegen Zeitdifferenz mit {}", # User
|
||||
"fastforward-notification": "Vorgespult wegen Zeitdifferenz mit {}", # User
|
||||
"slowdown-notification": "Verlangsamt wegen Zeitdifferenz mit {}", # User
|
||||
"revert-notification": "Normalgeschwindigkeit",
|
||||
"rewind-notification" : "Zurückgespult wegen Zeitdifferenz mit {}", # User
|
||||
"fastforward-notification" : "Vorgespult wegen Zeitdifferenz mit {}", # User
|
||||
"slowdown-notification" : "Verlangsamt wegen Zeitdifferenz mit {}", # User
|
||||
"revert-notification" : "Normalgeschwindigkeit",
|
||||
|
||||
"pause-notification": "{} pausierte", # User
|
||||
"unpause-notification": "{} startete", # User
|
||||
"seek-notification": "{} sprang von {} nach {}", # User, from time, to time
|
||||
"pause-notification" : "{} pausierte", # User
|
||||
"unpause-notification" : "{} startete", # User
|
||||
"seek-notification" : "{} sprang von {} nach {}", # User, from time, to time
|
||||
|
||||
"current-offset-notification": "Aktueller Offset: {} Sekunden", # Offset
|
||||
"current-offset-notification" : "Aktueller Offset: {} Sekunden", # Offset
|
||||
|
||||
"media-directory-list-updated-notification": "Syncplay media directories have been updated.", # TODO: Translate
|
||||
"media-directory-list-updated-notification" : "Syncplay media directories have been updated.", # TODO: Translate
|
||||
|
||||
"room-join-notification": "{} hat den Raum '{}' betreten", # User
|
||||
"left-notification": "{} ist gegangen", # User
|
||||
"left-paused-notification": "{} ist gegangen, {} pausierte", # User who left, User who paused
|
||||
"playing-notification": "{} spielt '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum": " in Raum: '{}'", # Room
|
||||
"room-join-notification" : "{} hat den Raum '{}' betreten", # User
|
||||
"left-notification" : "{} ist gegangen", # User
|
||||
"left-paused-notification" : "{} ist gegangen, {} pausierte", # User who left, User who paused
|
||||
"playing-notification" : "{} spielt '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum" : " in Raum: '{}'", # Room
|
||||
|
||||
"not-all-ready": "Noch nicht bereit: {}", # Usernames
|
||||
"all-users-ready": "Alle sind bereit ({} Nutzer)", # Number of ready users
|
||||
"ready-to-unpause-notification": "Du bist bereit - noch einmal fortsetzen klicken zum abspielen",
|
||||
"set-as-ready-notification": "Du bist bereit",
|
||||
"set-as-not-ready-notification": "Du bist nicht bereit",
|
||||
"autoplaying-notification": "Starte in {}...", # Number of seconds until playback will start
|
||||
"not-all-ready" : "Noch nicht bereit: {}", # Usernames
|
||||
"all-users-ready" : "Alle sind bereit ({} Nutzer)", #Number of ready users
|
||||
"ready-to-unpause-notification" : "Du bist bereit - noch einmal fortsetzen klicken zum abspielen",
|
||||
"set-as-ready-notification" : "Du bist bereit",
|
||||
"set-as-not-ready-notification" : "Du bist nicht bereit",
|
||||
"autoplaying-notification" : "Starte in {}...", # Number of seconds until playback will start
|
||||
|
||||
"identifying-as-controller-notification": "Identifiziere als Raumleiter mit Passwort '{}'...", # TODO: find a better translation to "room operator"
|
||||
"failed-to-identify-as-controller-notification": "{} konnte sich nicht als Raumleiter identifizieren.",
|
||||
"authenticated-as-controller-notification": "{} authentifizierte sich als Raumleiter",
|
||||
"created-controlled-room-notification": "Gesteuerten Raum '{}' mit Passwort '{}' erstellt. Bitte diese Informationen für die Zukunft aufheben!", # RoomName, operatorPassword
|
||||
"identifying-as-controller-notification" : "Identifiziere als Raumleiter mit Passwort '{}'...", # TODO: find a better translation to "room operator"
|
||||
"failed-to-identify-as-controller-notification" : "{} konnte sich nicht als Raumleiter identifizieren.",
|
||||
"authenticated-as-controller-notification" : "{} authentifizierte sich als Raumleiter",
|
||||
"created-controlled-room-notification" : "Gesteuerten Raum '{}' mit Passwort '{}' erstellt. Bitte diese Informationen für die Zukunft aufheben!", # RoomName, operatorPassword
|
||||
|
||||
"file-different-notification": "Deine Datei scheint sich von {}s zu unterscheiden", # User
|
||||
"file-differences-notification": "Deine Datei unterscheidet sich auf folgende Art: {}",
|
||||
"room-file-differences": "Unterschiedlich in: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename": "Name",
|
||||
"file-difference-filesize": "Größe",
|
||||
"file-difference-duration": "Dauer",
|
||||
"file-different-notification" : "Deine Datei scheint sich von {}s zu unterscheiden", # User
|
||||
"file-differences-notification" : "Deine Datei unterscheidet sich auf folgende Art: {}",
|
||||
"room-file-differences" : "Unterschiedlich in: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename" : "Name",
|
||||
"file-difference-filesize" : "Größe",
|
||||
"file-difference-duration" : "Dauer",
|
||||
"alone-in-the-room": "Du bist alleine im Raum",
|
||||
|
||||
"different-filesize-notification": " (ihre Dateigröße ist anders als deine!)",
|
||||
"userlist-playing-notification": "{} spielt:", # Username
|
||||
"file-played-by-notification": "Datei: {} wird gespielt von:", # File
|
||||
"no-file-played-notification": "{} spielt keine Datei ab", # Username
|
||||
"notplaying-notification": "Personen im Raum, die keine Dateien spielen:",
|
||||
"userlist-room-notification": "In Raum '{}':", # Room
|
||||
"userlist-file-notification": "Datei",
|
||||
"controller-userlist-userflag": "Raumleiter",
|
||||
"ready-userlist-userflag": "Bereit",
|
||||
"different-filesize-notification" : " (ihre Dateigröße ist anders als deine!)",
|
||||
"userlist-playing-notification" : "{} spielt:", #Username
|
||||
"file-played-by-notification" : "Datei: {} wird gespielt von:", # File
|
||||
"no-file-played-notification" : "{} spielt keine Datei ab", # Username
|
||||
"notplaying-notification" : "Personen im Raum, die keine Dateien spielen:",
|
||||
"userlist-room-notification" : "In Raum '{}':", # Room
|
||||
"userlist-file-notification" : "Datei",
|
||||
"controller-userlist-userflag" : "Raumleiter",
|
||||
"ready-userlist-userflag" : "Bereit",
|
||||
|
||||
"update-check-failed-notification": "Konnte nicht automatisch prüfen, ob Syncplay {} aktuell ist. Soll https://syncplay.pl/ geöffnet werden, um manuell nach Updates zu suchen?", # Syncplay version
|
||||
"syncplay-uptodate-notification": "Syncplay ist aktuell",
|
||||
"syncplay-updateavailable-notification": "Eine neuere Version von Syncplay ist verfügbar. Soll die Download-Seite geöffnet werden?",
|
||||
"update-check-failed-notification" : "Konnte nicht automatisch prüfen, ob Syncplay {} aktuell ist. Soll https://syncplay.pl/ geöffnet werden, um manuell nach Updates zu suchen?", #Syncplay version
|
||||
"syncplay-uptodate-notification" : "Syncplay ist aktuell",
|
||||
"syncplay-updateavailable-notification" : "Eine neuere Version von Syncplay ist verfügbar. Soll die Download-Seite geöffnet werden?",
|
||||
|
||||
"mplayer-file-required-notification": "Syncplay für mplayer benötigt eine Dateiangabe beim Start",
|
||||
"mplayer-file-required-notification/example": "Anwendungsbeispiel: syncplay [optionen] [url|pfad/]Dateiname",
|
||||
"mplayer2-required": "Syncplay ist inkompatibel zu MPlayer 1.x, bitte nutze MPlayer2 oder mpv",
|
||||
"mplayer-file-required-notification" : "Syncplay für mplayer benötigt eine Dateiangabe beim Start",
|
||||
"mplayer-file-required-notification/example" : "Anwendungsbeispiel: syncplay [optionen] [url|pfad/]Dateiname",
|
||||
"mplayer2-required" : "Syncplay ist inkompatibel zu MPlayer 1.x, bitte nutze MPlayer2 oder mpv",
|
||||
|
||||
"unrecognized-command-notification": "Unbekannter Befehl",
|
||||
"commandlist-notification": "Verfügbare Befehle:",
|
||||
"commandlist-notification/room": "\tr [Name] - Raum ändern",
|
||||
"commandlist-notification/list": "\tl - Nutzerliste anzeigen",
|
||||
"commandlist-notification/undo": "\tu - Letzter Zeitsprung rückgängig",
|
||||
"commandlist-notification/pause": "\tp - Pausieren / weiter",
|
||||
"commandlist-notification/seek": "\t[s][+-]Zeit - zu einer bestimmten Zeit spulen, ohne + oder - wird als absolute Zeit gewertet; Angabe in Sekunden oder Minuten:Sekunden",
|
||||
"commandlist-notification/help": "\th - Diese Hilfe",
|
||||
"commandlist-notification/toggle": "\tt - Bereitschaftsanzeige umschalten",
|
||||
"commandlist-notification/create": "\tc [name] - erstelle zentral gesteuerten Raum mit dem aktuellen Raumnamen",
|
||||
"commandlist-notification/auth": "\ta [password] - authentifiziere als Raumleiter mit Passwort",
|
||||
"commandlist-notification/chat": "\tch [message] - send a chat message in a room", # TODO: Translate
|
||||
"syncplay-version-notification": "Syncplay Version: {}", # syncplay.version
|
||||
"more-info-notification": "Weitere Informationen auf: {}", # projectURL
|
||||
"unrecognized-command-notification" : "Unbekannter Befehl",
|
||||
"commandlist-notification" : "Verfügbare Befehle:",
|
||||
"commandlist-notification/room" : "\tr [Name] - Raum ändern",
|
||||
"commandlist-notification/list" : "\tl - Nutzerliste anzeigen",
|
||||
"commandlist-notification/undo" : "\tu - Letzter Zeitsprung rückgängig",
|
||||
"commandlist-notification/pause" : "\tp - Pausieren / weiter",
|
||||
"commandlist-notification/seek" : "\t[s][+-]Zeit - zu einer bestimmten Zeit spulen, ohne + oder - wird als absolute Zeit gewertet; Angabe in Sekunden oder Minuten:Sekunden",
|
||||
"commandlist-notification/help" : "\th - Diese Hilfe",
|
||||
"commandlist-notification/toggle" : "\tt - Bereitschaftsanzeige umschalten",
|
||||
"commandlist-notification/create" : "\tc [name] - erstelle zentral gesteuerten Raum mit dem aktuellen Raumnamen",
|
||||
"commandlist-notification/auth" : "\ta [password] - authentifiziere als Raumleiter mit Passwort",
|
||||
"commandlist-notification/chat" : "\tch [message] - send a chat message in a room", # TODO: Translate
|
||||
"syncplay-version-notification" : "Syncplay Version: {}", # syncplay.version
|
||||
"more-info-notification" : "Weitere Informationen auf: {}", # projectURL
|
||||
|
||||
"gui-data-cleared-notification": "Syncplay hat die Pfad und Fensterdaten der Syncplay-GUI zurückgesetzt.",
|
||||
"language-changed-msgbox-label": "Die Sprache wird geändert, wenn du Syncplay neu startest.",
|
||||
"promptforupdate-label": "Soll Syncplay regelmäßig nach Updates suchen?",
|
||||
"gui-data-cleared-notification" : "Syncplay hat die Pfad und Fensterdaten der Syncplay-GUI zurückgesetzt.",
|
||||
"language-changed-msgbox-label" : "Die Sprache wird geändert, wenn du Syncplay neu startest.",
|
||||
"promptforupdate-label" : "Soll Syncplay regelmäßig nach Updates suchen?",
|
||||
|
||||
"vlc-version-mismatch": "This version of VLC does not support Syncplay. VLC {}+ supports Syncplay but VLC 3 does not. Please use an alternative media player.", # VLC min version # TODO: Translate
|
||||
"vlc-interface-version-mismatch": "Du nutzt Version {} des VLC-Syncplay Interface-Moduls, Syncplay benötigt aber mindestens Version {}. In der Syncplay-Anleitung unter https://syncplay.pl/guide/ [Englisch] findest du Details zur Installation des syncplay.lua-Skripts.", # VLC interface version, VLC interface min version
|
||||
@ -101,144 +101,144 @@ de = {
|
||||
"mpv-unresponsive-error": "MPV hat für {} Sekunden nicht geantwortet und scheint abgestürzt zu sein. Bitte starte Syncplay neu.", # Seconds to respond
|
||||
|
||||
# Client prompts
|
||||
"enter-to-exit-prompt": "Enter drücken zum Beenden\n",
|
||||
"enter-to-exit-prompt" : "Enter drücken zum Beenden\n",
|
||||
|
||||
# Client errors
|
||||
"missing-arguments-error": "Notwendige Argumente fehlen, siehe --help",
|
||||
"server-timeout-error": "Timeout: Verbindung zum Server fehlgeschlagen",
|
||||
"mpc-slave-error": "Kann MPC nicht im Slave-Modus starten!",
|
||||
"mpc-version-insufficient-error": "MPC-Version nicht ausreichend, bitte nutze `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error": "MPC-Version nicht ausreichend, bitte nutze `mpc-be` >= `{}`",
|
||||
"mpv-version-error": "Syncplay ist nicht kompatibel mit dieser Version von mpv. Bitte benutze eine andere Version (z.B. Git HEAD).",
|
||||
"player-file-open-error": "Fehler beim Öffnen der Datei durch den Player",
|
||||
"player-path-error": "Ungültiger Player-Pfad. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", # To do: Translate end
|
||||
"hostname-empty-error": "Hostname darf nicht leer sein",
|
||||
"empty-error": "{} darf nicht leer sein", # Configuration
|
||||
"missing-arguments-error" : "Notwendige Argumente fehlen, siehe --help",
|
||||
"server-timeout-error" : "Timeout: Verbindung zum Server fehlgeschlagen",
|
||||
"mpc-slave-error" : "Kann MPC nicht im Slave-Modus starten!",
|
||||
"mpc-version-insufficient-error" : "MPC-Version nicht ausreichend, bitte nutze `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error" : "MPC-Version nicht ausreichend, bitte nutze `mpc-be` >= `{}`",
|
||||
"mpv-version-error" : "Syncplay ist nicht kompatibel mit dieser Version von mpv. Bitte benutze eine andere Version (z.B. Git HEAD).",
|
||||
"player-file-open-error" : "Fehler beim Öffnen der Datei durch den Player",
|
||||
"player-path-error" : "Ungültiger Player-Pfad. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", # To do: Translate end
|
||||
"hostname-empty-error" : "Hostname darf nicht leer sein",
|
||||
"empty-error" : "{} darf nicht leer sein", # Configuration
|
||||
"media-player-error": "Player-Fehler: \"{}\"", # Error line
|
||||
"unable-import-gui-error": "Konnte die GUI-Bibliotheken nicht importieren. PySide muss installiert sein, damit die grafische Oberfläche funktioniert.",
|
||||
|
||||
"arguments-missing-error": "Notwendige Argumente fehlen, siehe --help",
|
||||
"arguments-missing-error" : "Notwendige Argumente fehlen, siehe --help",
|
||||
|
||||
"unable-to-start-client-error": "Client kann nicht gestartet werden",
|
||||
"unable-to-start-client-error" : "Client kann nicht gestartet werden",
|
||||
|
||||
"player-path-config-error": "Player-Pfad ist nicht ordnungsgemäß gesetzt. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", # To do: Translate end
|
||||
"no-file-path-config-error": "Es muss eine Datei ausgewählt werden, bevor der Player gestartet wird.",
|
||||
"no-hostname-config-error": "Hostname darf nicht leer sein",
|
||||
"invalid-port-config-error": "Port muss gültig sein",
|
||||
"empty-value-config-error": "{} darf nicht leer sein", # Config option
|
||||
"invalid-port-config-error" : "Port muss gültig sein",
|
||||
"empty-value-config-error" : "{} darf nicht leer sein", # Config option
|
||||
|
||||
"not-json-error": "Kein JSON-String\n",
|
||||
"hello-arguments-error": "Zu wenige Hello-Argumente\n",
|
||||
"version-mismatch-error": "Verschiedene Versionen auf Client und Server\n",
|
||||
"not-json-error" : "Kein JSON-String\n",
|
||||
"hello-arguments-error" : "Zu wenige Hello-Argumente\n",
|
||||
"version-mismatch-error" : "Verschiedene Versionen auf Client und Server\n",
|
||||
"vlc-failed-connection": "Kann nicht zu VLC verbinden. Wenn du syncplay.lua nicht installiert hast, findest du auf https://syncplay.pl/LUA/ [Englisch] eine Anleitung.",
|
||||
"vlc-failed-noscript": "Laut VLC ist das syncplay.lua Interface-Skript nicht installiert. Auf https://syncplay.pl/LUA/ [Englisch] findest du eine Anleitung.",
|
||||
"vlc-failed-versioncheck": "Diese VLC-Version wird von Syncplay nicht unterstützt. Bitte nutze VLC 2.0",
|
||||
"vlc-failed-other": "Beim Laden des syncplay.lua Interface-Skripts durch VLC trat folgender Fehler auf: {}", # Syncplay Error
|
||||
"vlc-failed-other" : "Beim Laden des syncplay.lua Interface-Skripts durch VLC trat folgender Fehler auf: {}", # Syncplay Error
|
||||
|
||||
"not-supported-by-server-error": "Dieses Feature wird vom Server nicht unterstützt. Es wird ein Server mit Syncplay Version {}+ benötigt, aktuell verwendet wird jedoch Version {}.", # minVersion, serverVersion
|
||||
"shared-playlists-not-supported-by-server-error": "The shared playlists feature may not be supported by the server. To ensure that it works correctly requires a server running Syncplay {}+, but the server is running Syncplay {}.", # minVersion, serverVersion # TODO: Translate
|
||||
"shared-playlists-disabled-by-server-error": "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.", # TODO: Translate
|
||||
"not-supported-by-server-error" : "Dieses Feature wird vom Server nicht unterstützt. Es wird ein Server mit Syncplay Version {}+ benötigt, aktuell verwendet wird jedoch Version {}.", #minVersion, serverVersion
|
||||
"shared-playlists-not-supported-by-server-error" : "The shared playlists feature may not be supported by the server. To ensure that it works correctly requires a server running Syncplay {}+, but the server is running Syncplay {}.", #minVersion, serverVersion # TODO: Translate
|
||||
"shared-playlists-disabled-by-server-error" : "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.", # TODO: Translate
|
||||
|
||||
"invalid-seek-value": "Ungültige Zeitangabe",
|
||||
"invalid-offset-value": "Ungültiger Offset-Wert",
|
||||
"invalid-seek-value" : "Ungültige Zeitangabe",
|
||||
"invalid-offset-value" : "Ungültiger Offset-Wert",
|
||||
|
||||
"switch-file-not-found-error": "Konnte nicht zur Datei '{0}' wechseln. Syncplay looks in the specified media directories.", # File not found, folder it was not found in # TODO: Re-translate "Syncplay sucht im Ordner der aktuellen Datei und angegebenen Medien-Verzeichnissen." to reference to checking in "current media directory"
|
||||
"folder-search-timeout-error": "The search for media in media directories was aborted as it took too long to search through '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", # Folder # TODO: Translate
|
||||
"folder-search-first-file-timeout-error": "The search for media in '{}' was aborted as it took too long to access the directory. This could happen if it is a network drive or if you configure your drive to spin down after a period of inactivity. For automatic file switching to work again please go to File->Set Media Directories and either remove the directory or resolve the issue (e.g. by changing power saving settings).", # Folder # TODO: Translate
|
||||
"added-file-not-in-media-directory-error": "You loaded a file in '{}' which is not a known media directory. You can add this as a media directory by selecting File->Set Media Directories in the menu bar.", # Folder # TODO: Translate
|
||||
"no-media-directories-error": "No media directories have been set. For shared playlist and file switching features to work properly please select File->Set Media Directories and specify where Syncplay should look to find media files.", # TODO: Translate
|
||||
"cannot-find-directory-error": "Could not find media directory '{}'. To update your list of media directories please select File->Set Media Directories from the menu bar and specify where Syncplay should look to find media files.", # TODO: Translate
|
||||
"switch-file-not-found-error" : "Konnte nicht zur Datei '{0}' wechseln. Syncplay looks in the specified media directories.", # File not found, folder it was not found in # TODO: Re-translate "Syncplay sucht im Ordner der aktuellen Datei und angegebenen Medien-Verzeichnissen." to reference to checking in "current media directory"
|
||||
"folder-search-timeout-error" : "The search for media in media directories was aborted as it took too long to search through '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", #Folder # TODO: Translate
|
||||
"folder-search-first-file-timeout-error" : "The search for media in '{}' was aborted as it took too long to access the directory. This could happen if it is a network drive or if you configure your drive to spin down after a period of inactivity. For automatic file switching to work again please go to File->Set Media Directories and either remove the directory or resolve the issue (e.g. by changing power saving settings).", #Folder # TODO: Translate
|
||||
"added-file-not-in-media-directory-error" : "You loaded a file in '{}' which is not a known media directory. You can add this as a media directory by selecting File->Set Media Directories in the menu bar.", #Folder # TODO: Translate
|
||||
"no-media-directories-error" : "No media directories have been set. For shared playlist and file switching features to work properly please select File->Set Media Directories and specify where Syncplay should look to find media files.", # TODO: Translate
|
||||
"cannot-find-directory-error" : "Could not find media directory '{}'. To update your list of media directories please select File->Set Media Directories from the menu bar and specify where Syncplay should look to find media files.", # TODO: Translate
|
||||
|
||||
"failed-to-load-server-list-error": "Konnte die Liste der öffentlichen Server nicht laden. Bitte besuche https://www.syncplay.pl/ [Englisch] mit deinem Browser.",
|
||||
"failed-to-load-server-list-error" : "Konnte die Liste der öffentlichen Server nicht laden. Bitte besuche https://www.syncplay.pl/ [Englisch] mit deinem Browser.",
|
||||
|
||||
# Client arguments
|
||||
"argument-description": 'Syncplay ist eine Anwendung um mehrere MPlayer, MPC-HC, MPC-BE und VLC-Instanzen über das Internet zu synchronisieren.',
|
||||
"argument-epilog": 'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet',
|
||||
"nogui-argument": 'Keine GUI anzeigen',
|
||||
"host-argument": 'Server-Adresse',
|
||||
"name-argument": 'Gewünschter Nutzername',
|
||||
"debug-argument": 'Debug-Modus',
|
||||
"force-gui-prompt-argument": 'Einstellungsfenster anzeigen',
|
||||
"no-store-argument": 'keine Werte in .syncplay speichern',
|
||||
"room-argument": 'Standard-Raum',
|
||||
"password-argument": 'Server-Passwort',
|
||||
"player-path-argument": 'Pfad zum Player',
|
||||
"file-argument": 'Abzuspielende Datei',
|
||||
"args-argument": 'Player-Einstellungen; Wenn du Einstellungen, die mit - beginnen, nutzen willst, stelle ein einzelnes \'--\'-Argument davor',
|
||||
"clear-gui-data-argument": 'Setzt die Pfad- und GUI-Fenster-Daten die in den QSettings gespeichert sind zurück',
|
||||
"language-argument": 'Sprache für Syncplay-Nachrichten (de/en/ru)',
|
||||
"argument-description" : 'Syncplay ist eine Anwendung um mehrere MPlayer, MPC-HC, MPC-BE und VLC-Instanzen über das Internet zu synchronisieren.',
|
||||
"argument-epilog" : 'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet',
|
||||
"nogui-argument" : 'Keine GUI anzeigen',
|
||||
"host-argument" : 'Server-Adresse',
|
||||
"name-argument" : 'Gewünschter Nutzername',
|
||||
"debug-argument" : 'Debug-Modus',
|
||||
"force-gui-prompt-argument" : 'Einstellungsfenster anzeigen',
|
||||
"no-store-argument" : 'keine Werte in .syncplay speichern',
|
||||
"room-argument" : 'Standard-Raum',
|
||||
"password-argument" : 'Server-Passwort',
|
||||
"player-path-argument" : 'Pfad zum Player',
|
||||
"file-argument" : 'Abzuspielende Datei',
|
||||
"args-argument" : 'Player-Einstellungen; Wenn du Einstellungen, die mit - beginnen, nutzen willst, stelle ein einzelnes \'--\'-Argument davor',
|
||||
"clear-gui-data-argument" : 'Setzt die Pfad- und GUI-Fenster-Daten die in den QSettings gespeichert sind zurück',
|
||||
"language-argument" : 'Sprache für Syncplay-Nachrichten (de/en/ru)',
|
||||
|
||||
"version-argument": 'gibt die aktuelle Version aus',
|
||||
"version-message": "Du verwendest Syncplay v. {} ({})",
|
||||
"version-argument" : 'gibt die aktuelle Version aus',
|
||||
"version-message" : "Du verwendest Syncplay v. {} ({})",
|
||||
|
||||
# Client labels
|
||||
"config-window-title": "Syncplay Konfiguration",
|
||||
"config-window-title" : "Syncplay Konfiguration",
|
||||
|
||||
"connection-group-title": "Verbindungseinstellungen",
|
||||
"host-label": "Server-Adresse:",
|
||||
"name-label": "Benutzername (optional):",
|
||||
"password-label": "Server-Passwort (falls nötig):",
|
||||
"room-label": "Standard-Raum:",
|
||||
"connection-group-title" : "Verbindungseinstellungen",
|
||||
"host-label" : "Server-Adresse:",
|
||||
"name-label" : "Benutzername (optional):",
|
||||
"password-label" : "Server-Passwort (falls nötig):",
|
||||
"room-label" : "Standard-Raum:",
|
||||
|
||||
"media-setting-title": "Media-Player Einstellungen",
|
||||
"executable-path-label": "Pfad zum Media-Player:",
|
||||
"media-path-label": "Pfad zur Datei:", # Todo: Translate to 'Path to video (optional)'
|
||||
"player-arguments-label": "Playerparameter:",
|
||||
"browse-label": "Durchsuchen",
|
||||
"update-server-list-label": "Liste aktualisieren",
|
||||
"media-setting-title" : "Media-Player Einstellungen",
|
||||
"executable-path-label" : "Pfad zum Media-Player:",
|
||||
"media-path-label" : "Pfad zur Datei:", # Todo: Translate to 'Path to video (optional)'
|
||||
"player-arguments-label" : "Playerparameter:",
|
||||
"browse-label" : "Durchsuchen",
|
||||
"update-server-list-label" : "Liste aktualisieren",
|
||||
|
||||
"more-title": "Mehr Einstellungen zeigen",
|
||||
"never-rewind-value": "Niemals",
|
||||
"seconds-suffix": " sek",
|
||||
"privacy-sendraw-option": "Klartext senden",
|
||||
"privacy-sendhashed-option": "Hash senden",
|
||||
"privacy-dontsend-option": "Nicht senden",
|
||||
"filename-privacy-label": "Dateiname:",
|
||||
"filesize-privacy-label": "Dateigröße:",
|
||||
"checkforupdatesautomatically-label": "Automatisch nach Updates suchen",
|
||||
"slowondesync-label": "Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC/BE)",
|
||||
"dontslowdownwithme-label": "Nie verlangsamen oder andere zurückspulen (Experimentell)",
|
||||
"pausing-title": "Pausing", # TODO: Translate
|
||||
"pauseonleave-label": "Pausieren wenn ein Benutzer austritt",
|
||||
"readiness-title": "Initial readiness state", # TODO: Translate
|
||||
"readyatstart-label": "Standardmäßig auf \'Bereit\' stellen",
|
||||
"forceguiprompt-label": "Diesen Dialog nicht mehr anzeigen",
|
||||
"showosd-label": "OSD-Nachrichten anzeigen",
|
||||
"more-title" : "Mehr Einstellungen zeigen",
|
||||
"never-rewind-value" : "Niemals",
|
||||
"seconds-suffix" : " sek",
|
||||
"privacy-sendraw-option" : "Klartext senden",
|
||||
"privacy-sendhashed-option" : "Hash senden",
|
||||
"privacy-dontsend-option" : "Nicht senden",
|
||||
"filename-privacy-label" : "Dateiname:",
|
||||
"filesize-privacy-label" : "Dateigröße:",
|
||||
"checkforupdatesautomatically-label" : "Automatisch nach Updates suchen",
|
||||
"slowondesync-label" : "Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC/BE)",
|
||||
"dontslowdownwithme-label" : "Nie verlangsamen oder andere zurückspulen (Experimentell)",
|
||||
"pausing-title" : "Pausing", # TODO: Translate
|
||||
"pauseonleave-label" : "Pausieren wenn ein Benutzer austritt",
|
||||
"readiness-title" : "Initial readiness state", # TODO: Translate
|
||||
"readyatstart-label" : "Standardmäßig auf \'Bereit\' stellen",
|
||||
"forceguiprompt-label" : "Diesen Dialog nicht mehr anzeigen",
|
||||
"showosd-label" : "OSD-Nachrichten anzeigen",
|
||||
|
||||
"showosdwarnings-label": "Zeige Warnungen (z.B. wenn Dateien verschieden)",
|
||||
"showsameroomosd-label": "Zeige Ereignisse in deinem Raum",
|
||||
"shownoncontrollerosd-label": "Zeige Ereignisse von nicht geführten Räumen in geführten Räumen.",
|
||||
"showdifferentroomosd-label": "Zeige Ereignisse in anderen Räumen",
|
||||
"showslowdownosd-label": "Zeige Verlangsamungs/Zurücksetzungs-Benachrichtigung",
|
||||
"language-label": "Sprache:",
|
||||
"automatic-language": "Automatisch ({})", # Default language
|
||||
"showdurationnotification-label": "Zeige Warnung wegen unterschiedlicher Dauer",
|
||||
"basics-label": "Grundlagen",
|
||||
"readiness-label": "Play/Pause",
|
||||
"misc-label": "Diverse",
|
||||
"core-behaviour-title": "Verhalten des Raumes",
|
||||
"syncplay-internals-title": "Syncplay intern",
|
||||
"syncplay-mediasearchdirectories-title": "In diesen Verzeichnissen nach Medien suchen", # needs to be checked
|
||||
"syncplay-mediasearchdirectories-label": "In diesen Verzeichnissen nach Medien suchen (ein Pfad pro Zeile)",
|
||||
"sync-label": "Synchronisation",
|
||||
"sync-otherslagging-title": "Wenn andere laggen...",
|
||||
"sync-youlaggging-title": "Wenn du laggst...",
|
||||
"messages-label": "Nachrichten",
|
||||
"messages-osd-title": "OSD-(OnScreenDisplay)-Einstellungen",
|
||||
"messages-other-title": "Weitere Display-Einstellungen",
|
||||
"chat-label": "Chat", # TODO: Translate
|
||||
"privacy-label": "Privatsphäre",
|
||||
"privacy-title": "Privatsphäreneinstellungen",
|
||||
"unpause-title": "Wenn du Play drückst, auf Bereit setzen und:",
|
||||
"unpause-ifalreadyready-option": "Wiedergeben wenn bereits als Bereit gesetzt",
|
||||
"unpause-ifothersready-option": "Wiedergeben wenn bereits als Bereit gesetzt oder alle anderen bereit sind (Standard)",
|
||||
"unpause-ifminusersready-option": "Wiedergeben wenn bereits als Bereit gesetzt oder die minimale Anzahl anderer Nutzer bereit ist",
|
||||
"unpause-always": "Immer wiedergeben",
|
||||
"showosdwarnings-label" : "Zeige Warnungen (z.B. wenn Dateien verschieden)",
|
||||
"showsameroomosd-label" : "Zeige Ereignisse in deinem Raum",
|
||||
"shownoncontrollerosd-label" : "Zeige Ereignisse von nicht geführten Räumen in geführten Räumen.",
|
||||
"showdifferentroomosd-label" : "Zeige Ereignisse in anderen Räumen",
|
||||
"showslowdownosd-label" : "Zeige Verlangsamungs/Zurücksetzungs-Benachrichtigung",
|
||||
"language-label" : "Sprache:",
|
||||
"automatic-language" : "Automatisch ({})", # Default language
|
||||
"showdurationnotification-label" : "Zeige Warnung wegen unterschiedlicher Dauer",
|
||||
"basics-label" : "Grundlagen",
|
||||
"readiness-label" : "Play/Pause",
|
||||
"misc-label" : "Diverse",
|
||||
"core-behaviour-title" : "Verhalten des Raumes",
|
||||
"syncplay-internals-title" : "Syncplay intern",
|
||||
"syncplay-mediasearchdirectories-title" : "In diesen Verzeichnissen nach Medien suchen", #needs to be checked
|
||||
"syncplay-mediasearchdirectories-label" : "In diesen Verzeichnissen nach Medien suchen (ein Pfad pro Zeile)",
|
||||
"sync-label" : "Synchronisation",
|
||||
"sync-otherslagging-title" : "Wenn andere laggen...",
|
||||
"sync-youlaggging-title" : "Wenn du laggst...",
|
||||
"messages-label" : "Nachrichten",
|
||||
"messages-osd-title" : "OSD-(OnScreenDisplay)-Einstellungen",
|
||||
"messages-other-title" : "Weitere Display-Einstellungen",
|
||||
"chat-label" : "Chat", # TODO: Translate
|
||||
"privacy-label" : "Privatsphäre",
|
||||
"privacy-title" : "Privatsphäreneinstellungen",
|
||||
"unpause-title" : "Wenn du Play drückst, auf Bereit setzen und:",
|
||||
"unpause-ifalreadyready-option" : "Wiedergeben wenn bereits als Bereit gesetzt",
|
||||
"unpause-ifothersready-option" : "Wiedergeben wenn bereits als Bereit gesetzt oder alle anderen bereit sind (Standard)",
|
||||
"unpause-ifminusersready-option" : "Wiedergeben wenn bereits als Bereit gesetzt oder die minimale Anzahl anderer Nutzer bereit ist",
|
||||
"unpause-always" : "Immer wiedergeben",
|
||||
"syncplay-trusteddomains-title": "Trusted domains (for streaming services and hosted content)", # TODO: Translate into German
|
||||
|
||||
"chat-title": "Chat message input", # TODO: Translate
|
||||
"chatinputenabled-label": "Enable chat input via mpv (using enter key)", # TODO: Translate
|
||||
"chatdirectinput-label": "Allow instant chat input (bypass having to press enter key to chat)", # TODO: Translate
|
||||
"chatdirectinput-label" : "Allow instant chat input (bypass having to press enter key to chat)", # TODO: Translate
|
||||
"chatinputfont-label": "Chat input font", # TODO: Translate
|
||||
"chatfont-label": "Set font", # TODO: Translate
|
||||
"chatcolour-label": "Set colour", # TODO: Translate
|
||||
@ -246,7 +246,7 @@ de = {
|
||||
"chat-top-option": "Top", # TODO: Translate
|
||||
"chat-middle-option": "Middle", # TODO: Translate
|
||||
"chat-bottom-option": "Bottom", # TODO: Translate
|
||||
"chatoutputheader-label": "Chat message output", # TODO: Translate
|
||||
"chatoutputheader-label" : "Chat message output", # TODO: Translate
|
||||
"chatoutputfont-label": "Chat output font", # TODO: Translate
|
||||
"chatoutputenabled-label": "Enable chat output in media player (mpv only for now)", # TODO: Translate
|
||||
"chatoutputposition-label": "Output mode", # TODO: Translate
|
||||
@ -258,131 +258,131 @@ de = {
|
||||
"alphakey-mode-warning-first-line": "You can temporarily use old mpv bindings with a-z keys.", # TODO: Translate
|
||||
"alphakey-mode-warning-second-line": "Press [TAB] to return to Syncplay chat mode.", # TODO: Translate
|
||||
|
||||
"help-label": "Hilfe",
|
||||
"reset-label": "Standardwerte zurücksetzen",
|
||||
"run-label": "Syncplay starten",
|
||||
"storeandrun-label": "Konfiguration speichern und Syncplay starten",
|
||||
"help-label" : "Hilfe",
|
||||
"reset-label" : "Standardwerte zurücksetzen",
|
||||
"run-label" : "Syncplay starten",
|
||||
"storeandrun-label" : "Konfiguration speichern und Syncplay starten",
|
||||
|
||||
"contact-label": "Du hast eine Idee, einen Bug gefunden oder möchtest Feedback geben? Sende eine E-Mail an <a href=\"mailto:dev@syncplay.pl\">dev@syncplay.pl</a>, chatte auf dem <a href=\"https://webchat.freenode.net/?channels=#syncplay\">#Syncplay IRC-Kanal</a> auf irc.freenode.net oder <a href=\"https://github.com/Uriziel/syncplay/issues\">öffne eine Fehlermeldung auf GitHub</a>. Außerdem findest du auf <a href=\"https://syncplay.pl/\">https://syncplay.pl/</a> weitere Informationen, Hilfestellungen und Updates. OTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.", # TODO: Translate last sentence
|
||||
"contact-label" : "Du hast eine Idee, einen Bug gefunden oder möchtest Feedback geben? Sende eine E-Mail an <a href=\"mailto:dev@syncplay.pl\">dev@syncplay.pl</a>, chatte auf dem <a href=\"https://webchat.freenode.net/?channels=#syncplay\">#Syncplay IRC-Kanal</a> auf irc.freenode.net oder <a href=\"https://github.com/Uriziel/syncplay/issues\">öffne eine Fehlermeldung auf GitHub</a>. Außerdem findest du auf <a href=\"https://syncplay.pl/\">https://syncplay.pl/</a> weitere Informationen, Hilfestellungen und Updates. OTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.", # TODO: Translate last sentence
|
||||
|
||||
"joinroom-label": "Raum beitreten",
|
||||
"joinroom-menu-label": "Raum beitreten {}", # TODO: Might want to fix this
|
||||
"seektime-menu-label": "Spule zu Zeit",
|
||||
"undoseek-menu-label": "Rückgängig",
|
||||
"play-menu-label": "Wiedergabe",
|
||||
"pause-menu-label": "Pause",
|
||||
"playbackbuttons-menu-label": "Wiedergabesteuerung anzeigen",
|
||||
"autoplay-menu-label": "Auto-Play-Knopf anzeigen",
|
||||
"autoplay-guipushbuttonlabel": "Automatisch abspielen wenn alle bereit sind",
|
||||
"autoplay-minimum-label": "Minimum an Nutzern:",
|
||||
"joinroom-label" : "Raum beitreten",
|
||||
"joinroom-menu-label" : "Raum beitreten {}", #TODO: Might want to fix this
|
||||
"seektime-menu-label" : "Spule zu Zeit",
|
||||
"undoseek-menu-label" : "Rückgängig",
|
||||
"play-menu-label" : "Wiedergabe",
|
||||
"pause-menu-label" : "Pause",
|
||||
"playbackbuttons-menu-label" : "Wiedergabesteuerung anzeigen",
|
||||
"autoplay-menu-label" : "Auto-Play-Knopf anzeigen",
|
||||
"autoplay-guipushbuttonlabel" : "Automatisch abspielen wenn alle bereit sind",
|
||||
"autoplay-minimum-label" : "Minimum an Nutzern:",
|
||||
|
||||
"sendmessage-label": "Send", # TODO: Translate
|
||||
"sendmessage-label" : "Send", # TODO: Translate
|
||||
|
||||
"ready-guipushbuttonlabel": "Ich bin bereit den Film anzuschauen!",
|
||||
"ready-guipushbuttonlabel" : "Ich bin bereit den Film anzuschauen!",
|
||||
|
||||
"roomuser-heading-label": "Raum / Benutzer",
|
||||
"size-heading-label": "Größe",
|
||||
"duration-heading-label": "Länge",
|
||||
"filename-heading-label": "Dateiname",
|
||||
"notifications-heading-label": "Benachrichtigungen",
|
||||
"userlist-heading-label": "Liste der gespielten Dateien",
|
||||
"roomuser-heading-label" : "Raum / Benutzer",
|
||||
"size-heading-label" : "Größe",
|
||||
"duration-heading-label" : "Länge",
|
||||
"filename-heading-label" : "Dateiname",
|
||||
"notifications-heading-label" : "Benachrichtigungen",
|
||||
"userlist-heading-label" : "Liste der gespielten Dateien",
|
||||
|
||||
"browseformedia-label": "Nach Mediendateien durchsuchen",
|
||||
"browseformedia-label" : "Nach Mediendateien durchsuchen",
|
||||
|
||||
"file-menu-label": "&Datei", # & precedes shortcut key
|
||||
"openmedia-menu-label": "&Mediendatei öffnen...",
|
||||
"openstreamurl-menu-label": "&Stream URL öffnen",
|
||||
"setmediadirectories-menu-label": "Set media &directories", # TODO: Translate
|
||||
"exit-menu-label": "&Beenden",
|
||||
"advanced-menu-label": "&Erweitert",
|
||||
"window-menu-label": "&Fenster",
|
||||
"setoffset-menu-label": "&Offset einstellen",
|
||||
"createcontrolledroom-menu-label": "&Zentral gesteuerten Raum erstellen",
|
||||
"identifyascontroller-menu-label": "Als Raumleiter &identifizieren",
|
||||
"settrusteddomains-menu-label": "Set &trusted domains", # TODO: Translate
|
||||
"addtrusteddomain-menu-label": "Add {} as trusted domain", # Domain # TODO: Translate
|
||||
"file-menu-label" : "&Datei", # & precedes shortcut key
|
||||
"openmedia-menu-label" : "&Mediendatei öffnen...",
|
||||
"openstreamurl-menu-label" : "&Stream URL öffnen",
|
||||
"setmediadirectories-menu-label" : "Set media &directories", # TODO: Translate
|
||||
"exit-menu-label" : "&Beenden",
|
||||
"advanced-menu-label" : "&Erweitert",
|
||||
"window-menu-label" : "&Fenster",
|
||||
"setoffset-menu-label" : "&Offset einstellen",
|
||||
"createcontrolledroom-menu-label" : "&Zentral gesteuerten Raum erstellen",
|
||||
"identifyascontroller-menu-label" : "Als Raumleiter &identifizieren",
|
||||
"settrusteddomains-menu-label" : "Set &trusted domains", # TODO: Translate
|
||||
"addtrusteddomain-menu-label" : "Add {} as trusted domain", # Domain # TODO: Translate
|
||||
|
||||
"playback-menu-label": "&Wiedergabe",
|
||||
"playback-menu-label" : "&Wiedergabe",
|
||||
|
||||
"help-menu-label": "&Hilfe",
|
||||
"userguide-menu-label": "&Benutzerhandbuch öffnen",
|
||||
"update-menu-label": "auf &Aktualisierung prüfen",
|
||||
"help-menu-label" : "&Hilfe",
|
||||
"userguide-menu-label" : "&Benutzerhandbuch öffnen",
|
||||
"update-menu-label" : "auf &Aktualisierung prüfen",
|
||||
|
||||
# About dialog - TODO: Translate
|
||||
#About dialog - TODO: Translate
|
||||
"about-menu-label": "&About Syncplay",
|
||||
"about-dialog-title": "About Syncplay",
|
||||
"about-dialog-release": "Version {} release {}",
|
||||
"about-dialog-license-text": "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-text" : "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-button": "License",
|
||||
"about-dialog-dependencies": "Dependencies",
|
||||
|
||||
"setoffset-msgbox-label": "Offset einstellen",
|
||||
"offsetinfo-msgbox-label": "Offset (siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
"setoffset-msgbox-label" : "Offset einstellen",
|
||||
"offsetinfo-msgbox-label" : "Offset (siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
|
||||
"promptforstreamurl-msgbox-label": "Stream URL öffnen",
|
||||
"promptforstreamurlinfo-msgbox-label": "Stream URL",
|
||||
"promptforstreamurl-msgbox-label" : "Stream URL öffnen",
|
||||
"promptforstreamurlinfo-msgbox-label" : "Stream URL",
|
||||
|
||||
"addfolder-label": "Add folder", # TODO: Translate
|
||||
"addfolder-label" : "Add folder", # TODO: Translate
|
||||
|
||||
"adduris-msgbox-label": "Add URLs to playlist (one per line)", # TODO: Translate
|
||||
"adduris-msgbox-label" : "Add URLs to playlist (one per line)", # TODO: Translate
|
||||
"editplaylist-msgbox-label": "Set playlist (one per line)", # TODO: Translate
|
||||
"trusteddomains-msgbox-label": "Domains it is okay to automatically switch to (one per line)", # TODO: Translate
|
||||
"trusteddomains-msgbox-label" : "Domains it is okay to automatically switch to (one per line)", # TODO: Translate
|
||||
|
||||
"createcontrolledroom-msgbox-label": "Zentral gesteuerten Raum erstellen",
|
||||
"controlledroominfo-msgbox-label": "Namen des zentral gesteuerten Raums eingeben\r\n(siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
"createcontrolledroom-msgbox-label" : "Zentral gesteuerten Raum erstellen",
|
||||
"controlledroominfo-msgbox-label" : "Namen des zentral gesteuerten Raums eingeben\r\n(siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
|
||||
"identifyascontroller-msgbox-label": "Als Raumleiter identifizieren",
|
||||
"identifyinfo-msgbox-label": "Passwort des zentral gesteuerten Raums eingeben\r\n(siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
"identifyascontroller-msgbox-label" : "Als Raumleiter identifizieren",
|
||||
"identifyinfo-msgbox-label" : "Passwort des zentral gesteuerten Raums eingeben\r\n(siehe https://syncplay.pl/guide/ für eine Anleitung [Englisch]):",
|
||||
|
||||
"public-server-msgbox-label": "Einen öffentlichen Server für diese Sitzung auswählen",
|
||||
"public-server-msgbox-label" : "Einen öffentlichen Server für diese Sitzung auswählen",
|
||||
|
||||
"megabyte-suffix": " MB",
|
||||
"megabyte-suffix" : " MB",
|
||||
|
||||
# Tooltips
|
||||
|
||||
"host-tooltip": "Hostname oder IP zu der verbunden werden soll. Optional mit Port (z.B.. syncplay.pl:8999). Synchronisation findet nur mit Personen auf dem selben Server und Port statt.",
|
||||
"name-tooltip": "Dein Benutzername. Keine Registrierung, kann einfach geändert werden. Bei fehlender Angabe wird ein zufälliger Name generiert.",
|
||||
"password-tooltip": "Passwörter sind nur bei Verbindung zu privaten Servern nötig.",
|
||||
"room-tooltip": "Der Raum, der betreten werden soll, kann ein x-beliebiger sein. Allerdings werden nur Clients im selben Raum synchronisiert.",
|
||||
"host-tooltip" : "Hostname oder IP zu der verbunden werden soll. Optional mit Port (z.B.. syncplay.pl:8999). Synchronisation findet nur mit Personen auf dem selben Server und Port statt.",
|
||||
"name-tooltip" : "Dein Benutzername. Keine Registrierung, kann einfach geändert werden. Bei fehlender Angabe wird ein zufälliger Name generiert.",
|
||||
"password-tooltip" : "Passwörter sind nur bei Verbindung zu privaten Servern nötig.",
|
||||
"room-tooltip" : "Der Raum, der betreten werden soll, kann ein x-beliebiger sein. Allerdings werden nur Clients im selben Raum synchronisiert.",
|
||||
|
||||
"executable-path-tooltip": "Pfad zum ausgewählten, unterstützten Mediaplayer (MPC-HC, MPC-BE, VLC, mplayer2 or mpv).",
|
||||
"media-path-tooltip": "Pfad zum wiederzugebenden Video oder Stream. Notwendig für mplayer2.", # TODO: Confirm translation
|
||||
"player-arguments-tooltip": "Zusätzliche Kommandozeilenparameter / -schalter für diesen Mediaplayer.",
|
||||
"mediasearcdirectories-arguments-tooltip": "Verzeichnisse, in denen Syncplay nach Mediendateien suchen soll, z.B. wenn du das Click-to-switch-Feature verwendest. Syncplay wird rekursiv Unterordner durchsuchen.", # TODO: Translate Click-to-switch? (or use as name for feature)
|
||||
"executable-path-tooltip" : "Pfad zum ausgewählten, unterstützten Mediaplayer (MPC-HC, MPC-BE, VLC, mplayer2 or mpv).",
|
||||
"media-path-tooltip" : "Pfad zum wiederzugebenden Video oder Stream. Notwendig für mplayer2.", # TODO: Confirm translation
|
||||
"player-arguments-tooltip" : "Zusätzliche Kommandozeilenparameter / -schalter für diesen Mediaplayer.",
|
||||
"mediasearcdirectories-arguments-tooltip" : "Verzeichnisse, in denen Syncplay nach Mediendateien suchen soll, z.B. wenn du das Click-to-switch-Feature verwendest. Syncplay wird rekursiv Unterordner durchsuchen.", # TODO: Translate Click-to-switch? (or use as name for feature)
|
||||
|
||||
"more-tooltip": "Weitere Einstellungen anzeigen.",
|
||||
"filename-privacy-tooltip": "Privatheitsmodus beim Senden des Namens der aktuellen Datei zum Server.",
|
||||
"filesize-privacy-tooltip": "Privatheitsmodus beim Senden der Größe der aktuellen Datei zum Server.",
|
||||
"privacy-sendraw-tooltip": "Die Information im Klartext übertragen. Dies ist die Standard-Einstellung mit der besten Funktionalität.",
|
||||
"privacy-sendhashed-tooltip": "Die Informationen gehasht übertragen, um sie für andere Clients schwerer lesbar zu machen.",
|
||||
"privacy-dontsend-tooltip": "Diese Information nicht übertragen. Dies garantiert den größtmöglichen Datanschutz.",
|
||||
"checkforupdatesautomatically-tooltip": "Regelmäßig auf der Syncplay-Website nach Updates suchen.",
|
||||
"slowondesync-tooltip": "Reduziert die Abspielgeschwindigkeit zeitweise, um die Synchronität zu den anderen Clients wiederherzustellen.",
|
||||
"rewindondesync-label": "Zurückspulen bei großer Zeitdifferenz (empfohlen)",
|
||||
"fastforwardondesync-label": "Vorspulen wenn das Video laggt (empfohlen)",
|
||||
"dontslowdownwithme-tooltip": "Lässt andere nicht langsamer werden oder zurückspringen, wenn deine Wiedergabe hängt.",
|
||||
"pauseonleave-tooltip": "Wiedergabe anhalten, wenn deine Verbindung verloren geht oder jemand den Raum verlässt.",
|
||||
"readyatstart-tooltip": "Zu Beginn auf 'Bereit' setzen (sonst bist du als 'Nicht Bereit' gesetzt, bis du den Status änderst)",
|
||||
"forceguiprompt-tooltip": "Der Konfigurationsdialog wird nicht angezeigt, wenn eine Datei mit Syncplay geöffnet wird.",
|
||||
"nostore-tooltip": "Syncplay mit den angegebenen Einstellungen starten, diese aber nicht dauerhaft speichern.",
|
||||
"rewindondesync-tooltip": "Zum Wiederherstellen der Synchronität in der Zeit zurückspringen (empfohlen)",
|
||||
"fastforwardondesync-tooltip": "Nach vorne springen, wenn asynchron zum Raumleiter (oder deine vorgetäuschte Position, falls 'Niemals verlangsamen oder andere zurückspulen' aktiviert ist).",
|
||||
"showosd-tooltip": "Syncplay-Nachrichten auf dem OSD (= OnScreenDisplay, ein eingeblendetes Textfeld) des Players anzeigen.",
|
||||
"showosdwarnings-tooltip": "Warnungen bei Unterschiedlichen Dateien oder Alleinsein im Raum anzeigen.",
|
||||
"showsameroomosd-tooltip": "OSD-Meldungen über Ereignisse im selben Raum anzeigen.",
|
||||
"shownoncontrollerosd-tooltip": "OSD-Meldungen bei Ereignissen verursacht durch nicht-Raumleiter in zentral gesteuerten Räumen anzeigen.",
|
||||
"showdifferentroomosd-tooltip": "OSD-Meldungen zu anderen Räumen als dem aktuell betretenen anzeigen.",
|
||||
"showslowdownosd-tooltip": "Meldungen bei Geschwindigkeitsänderung anzeigen.",
|
||||
"showdurationnotification-tooltip": "Nützlich, wenn z.B. ein Teil eines mehrteiligen Videos fehlt, kann jedoch auch fehlerhaft anschlagen.",
|
||||
"language-tooltip": "Die verwendete Sprache von Syncplay",
|
||||
"unpause-always-tooltip": "Wiedergabe startet immer (anstatt nur den Bereitschaftsstatus zu ändern)",
|
||||
"unpause-ifalreadyready-tooltip": "Wenn du nicht bereit bist und Play drückst wirst du als bereit gesetzt - zum Starten der Wiedergabe nochmal drücken.",
|
||||
"unpause-ifothersready-tooltip": "Wenn du Play drückst und nicht bereit bist, wird nur gestartet, wenn alle anderen bereit sind.",
|
||||
"unpause-ifminusersready-tooltip": "Wenn du Play drückst und nicht bereit bist, wird nur gestartet, wenn die minimale Anzahl anderer Benutzer bereit ist.",
|
||||
"trusteddomains-arguments-tooltip": "Domains that it is okay for Syncplay to automatically switch to when shared playlists is enabled.", # TODO: Translate into German
|
||||
"more-tooltip" : "Weitere Einstellungen anzeigen.",
|
||||
"filename-privacy-tooltip" : "Privatheitsmodus beim Senden des Namens der aktuellen Datei zum Server.",
|
||||
"filesize-privacy-tooltip" : "Privatheitsmodus beim Senden der Größe der aktuellen Datei zum Server.",
|
||||
"privacy-sendraw-tooltip" : "Die Information im Klartext übertragen. Dies ist die Standard-Einstellung mit der besten Funktionalität.",
|
||||
"privacy-sendhashed-tooltip" : "Die Informationen gehasht übertragen, um sie für andere Clients schwerer lesbar zu machen.",
|
||||
"privacy-dontsend-tooltip" : "Diese Information nicht übertragen. Dies garantiert den größtmöglichen Datanschutz.",
|
||||
"checkforupdatesautomatically-tooltip" : "Regelmäßig auf der Syncplay-Website nach Updates suchen.",
|
||||
"slowondesync-tooltip" : "Reduziert die Abspielgeschwindigkeit zeitweise, um die Synchronität zu den anderen Clients wiederherzustellen.",
|
||||
"rewindondesync-label" : "Zurückspulen bei großer Zeitdifferenz (empfohlen)",
|
||||
"fastforwardondesync-label" : "Vorspulen wenn das Video laggt (empfohlen)",
|
||||
"dontslowdownwithme-tooltip" : "Lässt andere nicht langsamer werden oder zurückspringen, wenn deine Wiedergabe hängt.",
|
||||
"pauseonleave-tooltip" : "Wiedergabe anhalten, wenn deine Verbindung verloren geht oder jemand den Raum verlässt.",
|
||||
"readyatstart-tooltip" : "Zu Beginn auf 'Bereit' setzen (sonst bist du als 'Nicht Bereit' gesetzt, bis du den Status änderst)",
|
||||
"forceguiprompt-tooltip" : "Der Konfigurationsdialog wird nicht angezeigt, wenn eine Datei mit Syncplay geöffnet wird.",
|
||||
"nostore-tooltip" : "Syncplay mit den angegebenen Einstellungen starten, diese aber nicht dauerhaft speichern.",
|
||||
"rewindondesync-tooltip" : "Zum Wiederherstellen der Synchronität in der Zeit zurückspringen (empfohlen)",
|
||||
"fastforwardondesync-tooltip" : "Nach vorne springen, wenn asynchron zum Raumleiter (oder deine vorgetäuschte Position, falls 'Niemals verlangsamen oder andere zurückspulen' aktiviert ist).",
|
||||
"showosd-tooltip" : "Syncplay-Nachrichten auf dem OSD (= OnScreenDisplay, ein eingeblendetes Textfeld) des Players anzeigen.",
|
||||
"showosdwarnings-tooltip" : "Warnungen bei Unterschiedlichen Dateien oder Alleinsein im Raum anzeigen.",
|
||||
"showsameroomosd-tooltip" : "OSD-Meldungen über Ereignisse im selben Raum anzeigen.",
|
||||
"shownoncontrollerosd-tooltip" : "OSD-Meldungen bei Ereignissen verursacht durch nicht-Raumleiter in zentral gesteuerten Räumen anzeigen.",
|
||||
"showdifferentroomosd-tooltip" : "OSD-Meldungen zu anderen Räumen als dem aktuell betretenen anzeigen.",
|
||||
"showslowdownosd-tooltip" : "Meldungen bei Geschwindigkeitsänderung anzeigen.",
|
||||
"showdurationnotification-tooltip" : "Nützlich, wenn z.B. ein Teil eines mehrteiligen Videos fehlt, kann jedoch auch fehlerhaft anschlagen.",
|
||||
"language-tooltip" : "Die verwendete Sprache von Syncplay",
|
||||
"unpause-always-tooltip" : "Wiedergabe startet immer (anstatt nur den Bereitschaftsstatus zu ändern)",
|
||||
"unpause-ifalreadyready-tooltip" : "Wenn du nicht bereit bist und Play drückst wirst du als bereit gesetzt - zum Starten der Wiedergabe nochmal drücken.",
|
||||
"unpause-ifothersready-tooltip" : "Wenn du Play drückst und nicht bereit bist, wird nur gestartet, wenn alle anderen bereit sind.",
|
||||
"unpause-ifminusersready-tooltip" : "Wenn du Play drückst und nicht bereit bist, wird nur gestartet, wenn die minimale Anzahl anderer Benutzer bereit ist.",
|
||||
"trusteddomains-arguments-tooltip" : "Domains that it is okay for Syncplay to automatically switch to when shared playlists is enabled.", # TODO: Translate into German
|
||||
|
||||
"chatinputenabled-tooltip": "Enable chat input in mpv (press enter to chat, enter to send, escape to cancel)", # TODO: Translate
|
||||
"chatdirectinput-tooltip": "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.", # TODO: Translate
|
||||
"chatdirectinput-tooltip" : "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.", # TODO: Translate
|
||||
"font-label-tooltip": "Font used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.", # TODO: Translate
|
||||
"set-input-font-tooltip": "Font family used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.", # TODO: Translate
|
||||
"set-input-colour-tooltip": "Font colour used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.", # TODO: Translate
|
||||
@ -397,79 +397,79 @@ de = {
|
||||
"chatoutputmode-chatroom-tooltip": "Display new lines of chat directly below previous line.", # TODO: Translate
|
||||
"chatoutputmode-scrolling-tooltip": "Scroll chat text from right to left.", # TODO: Translate
|
||||
|
||||
"help-tooltip": "Öffnet Hilfe auf syncplay.pl [Englisch]",
|
||||
"reset-tooltip": "Alle Einstellungen auf Standardwerte zurücksetzen.",
|
||||
"update-server-list-tooltip": "Mit syncplay.pl verbinden um die Liste öffentlicher Server zu aktualisieren.",
|
||||
"help-tooltip" : "Öffnet Hilfe auf syncplay.pl [Englisch]",
|
||||
"reset-tooltip" : "Alle Einstellungen auf Standardwerte zurücksetzen.",
|
||||
"update-server-list-tooltip" : "Mit syncplay.pl verbinden um die Liste öffentlicher Server zu aktualisieren.",
|
||||
|
||||
"joinroom-tooltip": "Den aktuellen Raum verlassen und stattdessen den angegebenen betreten.",
|
||||
"seektime-msgbox-label": "Springe zur angegebenen Zeit (in Sekunden oder min:sek). Verwende +/- zum relativen Springen.",
|
||||
"ready-tooltip": "Zeigt an, ob du bereit zum anschauen bist",
|
||||
"autoplay-tooltip": "Automatisch abspielen, wenn alle Nutzer bereit sind oder die minimale Nutzerzahl erreicht ist.",
|
||||
"switch-to-file-tooltip": "Doppelklicken um zu {} zu wechseln", # Filename
|
||||
"sendmessage-tooltip": "Send message to room", # TODO: Translate
|
||||
"joinroom-tooltip" : "Den aktuellen Raum verlassen und stattdessen den angegebenen betreten.",
|
||||
"seektime-msgbox-label" : "Springe zur angegebenen Zeit (in Sekunden oder min:sek). Verwende +/- zum relativen Springen.",
|
||||
"ready-tooltip" : "Zeigt an, ob du bereit zum anschauen bist",
|
||||
"autoplay-tooltip" : "Automatisch abspielen, wenn alle Nutzer bereit sind oder die minimale Nutzerzahl erreicht ist.",
|
||||
"switch-to-file-tooltip" : "Doppelklicken um zu {} zu wechseln", # Filename
|
||||
"sendmessage-tooltip" : "Send message to room", # TODO: Translate
|
||||
|
||||
# In-userlist notes (GUI)
|
||||
"differentsize-note": "Verschiedene Größe!",
|
||||
"differentsizeandduration-note": "Verschiedene Größe und Dauer!",
|
||||
"differentduration-note": "Verschiedene Dauer!",
|
||||
"nofile-note": "(keine Datei wird abgespielt)",
|
||||
"differentsize-note" : "Verschiedene Größe!",
|
||||
"differentsizeandduration-note" : "Verschiedene Größe und Dauer!",
|
||||
"differentduration-note" : "Verschiedene Dauer!",
|
||||
"nofile-note" : "(keine Datei wird abgespielt)",
|
||||
|
||||
# Server messages to client
|
||||
"new-syncplay-available-motd-message": "<NOTICE> Du nutzt Syncplay Version {}, aber es gibt eine neuere Version auf https://syncplay.pl</NOTICE>", # ClientVersion
|
||||
"new-syncplay-available-motd-message" : "<NOTICE> Du nutzt Syncplay Version {}, aber es gibt eine neuere Version auf https://syncplay.pl</NOTICE>", # ClientVersion
|
||||
|
||||
# Server notifications
|
||||
"welcome-server-notification": "Willkommen zum Syncplay-Server, v. {0}", # version
|
||||
"client-connected-room-server-notification": "{0}({2}) hat den Raum '{1}' betreten", # username, host, room
|
||||
"client-left-server-notification": "{0} hat den Server verlassen", # name
|
||||
"no-salt-notification": "WICHTIGER HINWEIS: Damit von dem Server generierte Passwörter für geführte Räume auch nach einem Serverneustart funktionieren, starte den Server mit dem folgenden Parameter: --salt {}", # Salt
|
||||
"welcome-server-notification" : "Willkommen zum Syncplay-Server, v. {0}", # version
|
||||
"client-connected-room-server-notification" : "{0}({2}) hat den Raum '{1}' betreten", # username, host, room
|
||||
"client-left-server-notification" : "{0} hat den Server verlassen", # name
|
||||
"no-salt-notification" : "WICHTIGER HINWEIS: Damit von dem Server generierte Passwörter für geführte Räume auch nach einem Serverneustart funktionieren, starte den Server mit dem folgenden Parameter: --salt {}", #Salt
|
||||
|
||||
# Server arguments
|
||||
"server-argument-description": 'Anwendung, um mehrere MPlayer, MPC-HC/BE und VLC-Instanzen über das Internet zu synchronisieren. Server',
|
||||
"server-argument-epilog": 'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet',
|
||||
"server-port-argument": 'Server TCP-Port',
|
||||
"server-password-argument": 'Server Passwort',
|
||||
"server-isolate-room-argument": 'Sollen die Räume isoliert sein?',
|
||||
"server-salt-argument": "zufällige Zeichenkette, die zur Erstellung von Passwörtern verwendet wird",
|
||||
"server-disable-ready-argument": "Bereitschaftsfeature deaktivieren",
|
||||
"server-argument-description" : 'Anwendung, um mehrere MPlayer, MPC-HC/BE und VLC-Instanzen über das Internet zu synchronisieren. Server',
|
||||
"server-argument-epilog" : 'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet',
|
||||
"server-port-argument" : 'Server TCP-Port',
|
||||
"server-password-argument" : 'Server Passwort',
|
||||
"server-isolate-room-argument" : 'Sollen die Räume isoliert sein?',
|
||||
"server-salt-argument" : "zufällige Zeichenkette, die zur Erstellung von Passwörtern verwendet wird",
|
||||
"server-disable-ready-argument" : "Bereitschaftsfeature deaktivieren",
|
||||
"server-motd-argument": "Pfad zur Datei, von der die Nachricht des Tages geladen wird",
|
||||
"server-chat-argument": "Should chat be disabled?", # TODO: Translate
|
||||
"server-chat-argument" : "Should chat be disabled?", # TODO: Translate
|
||||
"server-chat-maxchars-argument": "Maximum number of characters in a chat message (default is {})", # TODO: Translate
|
||||
"server-maxusernamelength-argument": "Maximum number of charactrs in a username (default is {})", # TODO: Translate
|
||||
"server-maxusernamelength-argument" : "Maximum number of charactrs in a username (default is {})", # TODO: Translate
|
||||
"server-messed-up-motd-unescaped-placeholders": "Die Nachricht des Tages hat unmaskierte Platzhalter. Alle $-Zeichen sollten verdoppelt werden ($$).",
|
||||
"server-messed-up-motd-too-long": "Die Nachricht des Tages ist zu lang - Maximal {} Zeichen, aktuell {}.",
|
||||
|
||||
# Server errors
|
||||
"unknown-command-server-error": "Unbekannter Befehl {}", # message
|
||||
"not-json-server-error": "Kein JSON-String {}", # message
|
||||
"not-known-server-error": "Der Server muss dich kennen, bevor du diesen Befehl nutzen kannst",
|
||||
"client-drop-server-error": "Client verloren: {} -- {}", # host, error
|
||||
"password-required-server-error": "Passwort nötig",
|
||||
"wrong-password-server-error": "Ungültiges Passwort",
|
||||
"hello-server-error": "Zu wenige Hello-Argumente",
|
||||
"unknown-command-server-error" : "Unbekannter Befehl {}", # message
|
||||
"not-json-server-error" : "Kein JSON-String {}", # message
|
||||
"not-known-server-error" : "Der Server muss dich kennen, bevor du diesen Befehl nutzen kannst",
|
||||
"client-drop-server-error" : "Client verloren: {} -- {}", # host, error
|
||||
"password-required-server-error" : "Passwort nötig",
|
||||
"wrong-password-server-error" : "Ungültiges Passwort",
|
||||
"hello-server-error" : "Zu wenige Hello-Argumente",
|
||||
|
||||
# Playlists TODO: Translate all this to German
|
||||
"playlist-selection-changed-notification": "{} changed the playlist selection", # Username
|
||||
"playlist-contents-changed-notification": "{} updated the playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error": "Could not find file {} in media directories for playlist switch!", # Filename
|
||||
"cannot-add-duplicate-error": "Could not add second entry for '{}' to the playlist as no duplicates are allowed.", # Filename
|
||||
"cannot-add-unsafe-path-error": "Could not automatically load {} because it is not on a trusted domain. You can switch to the URL manually by double clicking it in the playlist, and add trusted domains via File->Advanced->Set Trusted Domains. If you right click on a URL then you can add its domain as a trusted domain via the context menu.", # Filename
|
||||
"sharedplaylistenabled-label": "Enable shared playlists",
|
||||
"removefromplaylist-menu-label": "Remove from playlist",
|
||||
"shuffleremainingplaylist-menu-label": "Shuffle remaining playlist",
|
||||
"shuffleentireplaylist-menu-label": "Shuffle entire playlist",
|
||||
"undoplaylist-menu-label": "Undo last change to playlist",
|
||||
"addfilestoplaylist-menu-label": "Add file(s) to bottom of playlist",
|
||||
"addurlstoplaylist-menu-label": "Add URL(s) to bottom of playlist",
|
||||
"playlist-selection-changed-notification" : "{} changed the playlist selection", # Username
|
||||
"playlist-contents-changed-notification" : "{} updated the playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error" : "Could not find file {} in media directories for playlist switch!", # Filename
|
||||
"cannot-add-duplicate-error" : "Could not add second entry for '{}' to the playlist as no duplicates are allowed.", #Filename
|
||||
"cannot-add-unsafe-path-error" : "Could not automatically load {} because it is not on a trusted domain. You can switch to the URL manually by double clicking it in the playlist, and add trusted domains via File->Advanced->Set Trusted Domains. If you right click on a URL then you can add its domain as a trusted domain via the context menu.", # Filename
|
||||
"sharedplaylistenabled-label" : "Enable shared playlists",
|
||||
"removefromplaylist-menu-label" : "Remove from playlist",
|
||||
"shuffleremainingplaylist-menu-label" : "Shuffle remaining playlist",
|
||||
"shuffleentireplaylist-menu-label" : "Shuffle entire playlist",
|
||||
"undoplaylist-menu-label" : "Undo last change to playlist",
|
||||
"addfilestoplaylist-menu-label" : "Add file(s) to bottom of playlist",
|
||||
"addurlstoplaylist-menu-label" : "Add URL(s) to bottom of playlist",
|
||||
"editplaylist-menu-label": "Edit playlist",
|
||||
|
||||
"open-containing-folder": "Open folder containing this file",
|
||||
"addusersfiletoplaylist-menu-label": "Add {} file to playlist", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label": "Add {} stream to playlist", # item owner indicator
|
||||
"openusersstream-menu-label": "Open {} stream", # [username]'s
|
||||
"openusersfile-menu-label": "Open {} file", # [username]'s
|
||||
"item-is-yours-indicator": "your", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator": "{}'s", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"addusersfiletoplaylist-menu-label" : "Add {} file to playlist", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label" : "Add {} stream to playlist", # item owner indicator
|
||||
"openusersstream-menu-label" : "Open {} stream", # [username]'s
|
||||
"openusersfile-menu-label" : "Open {} file", # [username]'s
|
||||
"item-is-yours-indicator" : "your", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator" : "{}'s", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
|
||||
"playlist-instruction-item-message": "Drag file here to add it to the shared playlist.",
|
||||
"sharedplaylistenabled-tooltip": "Room operators can add files to a synced playlist to make it easy for everyone to watching the same thing. Configure media directories under 'Misc'.",
|
||||
"playlist-instruction-item-message" : "Drag file here to add it to the shared playlist.",
|
||||
"sharedplaylistenabled-tooltip" : "Room operators can add files to a synced playlist to make it easy for everyone to watching the same thing. Configure media directories under 'Misc'.",
|
||||
}
|
||||
|
||||
@ -3,95 +3,95 @@
|
||||
"""English dictionary"""
|
||||
|
||||
en = {
|
||||
"LANGUAGE": "English",
|
||||
"LANGUAGE" : "English",
|
||||
|
||||
# Client notifications
|
||||
"config-cleared-notification": "Settings cleared. Changes will be saved when you store a valid configuration.",
|
||||
"config-cleared-notification" : "Settings cleared. Changes will be saved when you store a valid configuration.",
|
||||
|
||||
"relative-config-notification": "Loaded relative configuration file(s): {}",
|
||||
"relative-config-notification" : "Loaded relative configuration file(s): {}",
|
||||
|
||||
"connection-attempt-notification": "Attempting to connect to {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification": "Connection with server lost, attempting to reconnect",
|
||||
"disconnection-notification": "Disconnected from server",
|
||||
"connection-failed-notification": "Connection with server failed",
|
||||
"connected-successful-notification": "Successfully connected to server",
|
||||
"retrying-notification": "%s, Retrying in %d seconds...", # Seconds
|
||||
"connection-attempt-notification" : "Attempting to connect to {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification" : "Connection with server lost, attempting to reconnect",
|
||||
"disconnection-notification" : "Disconnected from server",
|
||||
"connection-failed-notification" : "Connection with server failed",
|
||||
"connected-successful-notification" : "Successfully connected to server",
|
||||
"retrying-notification" : "%s, Retrying in %d seconds...", # Seconds
|
||||
|
||||
"rewind-notification": "Rewinded due to time difference with {}", # User
|
||||
"fastforward-notification": "Fast-forwarded due to time difference with {}", # User
|
||||
"slowdown-notification": "Slowing down due to time difference with {}", # User
|
||||
"revert-notification": "Reverting speed back to normal",
|
||||
"rewind-notification" : "Rewinded due to time difference with {}", # User
|
||||
"fastforward-notification" : "Fast-forwarded due to time difference with {}", # User
|
||||
"slowdown-notification" : "Slowing down due to time difference with {}", # User
|
||||
"revert-notification" : "Reverting speed back to normal",
|
||||
|
||||
"pause-notification": "{} paused", # User
|
||||
"unpause-notification": "{} unpaused", # User
|
||||
"seek-notification": "{} jumped from {} to {}", # User, from time, to time
|
||||
"pause-notification" : "{} paused", # User
|
||||
"unpause-notification" : "{} unpaused", # User
|
||||
"seek-notification" : "{} jumped from {} to {}", # User, from time, to time
|
||||
|
||||
"current-offset-notification": "Current offset: {} seconds", # Offset
|
||||
"current-offset-notification" : "Current offset: {} seconds", # Offset
|
||||
|
||||
"media-directory-list-updated-notification": "Syncplay media directories have been updated.",
|
||||
"media-directory-list-updated-notification" : "Syncplay media directories have been updated.",
|
||||
|
||||
"room-join-notification": "{} has joined the room: '{}'", # User
|
||||
"left-notification": "{} has left", # User
|
||||
"left-paused-notification": "{} left, {} paused", # User who left, User who paused
|
||||
"playing-notification": "{} is playing '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum": " in room: '{}'", # Room
|
||||
"room-join-notification" : "{} has joined the room: '{}'", # User
|
||||
"left-notification" : "{} has left", # User
|
||||
"left-paused-notification" : "{} left, {} paused", # User who left, User who paused
|
||||
"playing-notification" : "{} is playing '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum" : " in room: '{}'", # Room
|
||||
|
||||
"not-all-ready": "Not ready: {}", # Usernames
|
||||
"all-users-ready": "Everyone is ready ({} users)", # Number of ready users
|
||||
"ready-to-unpause-notification": "You are now set as ready - unpause again to unpause",
|
||||
"set-as-ready-notification": "You are now set as ready",
|
||||
"set-as-not-ready-notification": "You are now set as not ready",
|
||||
"autoplaying-notification": "Auto-playing in {}...", # Number of seconds until playback will start
|
||||
"not-all-ready" : "Not ready: {}", # Usernames
|
||||
"all-users-ready" : "Everyone is ready ({} users)", #Number of ready users
|
||||
"ready-to-unpause-notification" : "You are now set as ready - unpause again to unpause",
|
||||
"set-as-ready-notification" : "You are now set as ready",
|
||||
"set-as-not-ready-notification" : "You are now set as not ready",
|
||||
"autoplaying-notification" : "Auto-playing in {}...", # Number of seconds until playback will start
|
||||
|
||||
"identifying-as-controller-notification": "Identifying as room operator with password '{}'...",
|
||||
"failed-to-identify-as-controller-notification": "{} failed to identify as a room operator.",
|
||||
"authenticated-as-controller-notification": "{} authenticated as a room operator",
|
||||
"created-controlled-room-notification": "Created managed room '{}' with password '{}'. Please save this information for future reference!", # RoomName, operatorPassword
|
||||
"identifying-as-controller-notification" : "Identifying as room operator with password '{}'...",
|
||||
"failed-to-identify-as-controller-notification" : "{} failed to identify as a room operator.",
|
||||
"authenticated-as-controller-notification" : "{} authenticated as a room operator",
|
||||
"created-controlled-room-notification" : "Created managed room '{}' with password '{}'. Please save this information for future reference!", # RoomName, operatorPassword
|
||||
|
||||
"file-different-notification": "File you are playing appears to be different from {}'s", # User
|
||||
"file-differences-notification": "Your file differs in the following way(s): {}", # Differences
|
||||
"room-file-differences": "File differences: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename": "name",
|
||||
"file-difference-filesize": "size",
|
||||
"file-difference-duration": "duration",
|
||||
"file-different-notification" : "File you are playing appears to be different from {}'s", # User
|
||||
"file-differences-notification" : "Your file differs in the following way(s): {}", # Differences
|
||||
"room-file-differences" : "File differences: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename" : "name",
|
||||
"file-difference-filesize" : "size",
|
||||
"file-difference-duration" : "duration",
|
||||
"alone-in-the-room": "You're alone in the room",
|
||||
|
||||
"different-filesize-notification": " (their file size is different from yours!)",
|
||||
"userlist-playing-notification": "{} is playing:", # Username
|
||||
"file-played-by-notification": "File: {} is being played by:", # File
|
||||
"no-file-played-notification": "{} is not playing a file", # Username
|
||||
"notplaying-notification": "People who are not playing any file:",
|
||||
"userlist-room-notification": "In room '{}':", # Room
|
||||
"userlist-file-notification": "File",
|
||||
"controller-userlist-userflag": "Operator",
|
||||
"ready-userlist-userflag": "Ready",
|
||||
"different-filesize-notification" : " (their file size is different from yours!)",
|
||||
"userlist-playing-notification" : "{} is playing:", #Username
|
||||
"file-played-by-notification" : "File: {} is being played by:", # File
|
||||
"no-file-played-notification" : "{} is not playing a file", # Username
|
||||
"notplaying-notification" : "People who are not playing any file:",
|
||||
"userlist-room-notification" : "In room '{}':", # Room
|
||||
"userlist-file-notification" : "File",
|
||||
"controller-userlist-userflag" : "Operator",
|
||||
"ready-userlist-userflag" : "Ready",
|
||||
|
||||
"update-check-failed-notification": "Could not automatically check whether Syncplay {} is up to date. Want to visit https://syncplay.pl/ to manually check for updates?", # Syncplay version
|
||||
"syncplay-uptodate-notification": "Syncplay is up to date",
|
||||
"syncplay-updateavailable-notification": "A new version of Syncplay is available. Do you want to visit the release page?",
|
||||
"update-check-failed-notification" : "Could not automatically check whether Syncplay {} is up to date. Want to visit https://syncplay.pl/ to manually check for updates?", #Syncplay version
|
||||
"syncplay-uptodate-notification" : "Syncplay is up to date",
|
||||
"syncplay-updateavailable-notification" : "A new version of Syncplay is available. Do you want to visit the release page?",
|
||||
|
||||
"mplayer-file-required-notification": "Syncplay using mplayer requires you to provide file when starting",
|
||||
"mplayer-file-required-notification/example": "Usage example: syncplay [options] [url|path/]filename",
|
||||
"mplayer2-required": "Syncplay is incompatible with MPlayer 1.x, please use mplayer2 or mpv",
|
||||
"mplayer-file-required-notification" : "Syncplay using mplayer requires you to provide file when starting",
|
||||
"mplayer-file-required-notification/example" : "Usage example: syncplay [options] [url|path/]filename",
|
||||
"mplayer2-required" : "Syncplay is incompatible with MPlayer 1.x, please use mplayer2 or mpv",
|
||||
|
||||
"unrecognized-command-notification": "Unrecognized command",
|
||||
"commandlist-notification": "Available commands:",
|
||||
"commandlist-notification/room": "\tr [name] - change room",
|
||||
"commandlist-notification/list": "\tl - show user list",
|
||||
"commandlist-notification/undo": "\tu - undo last seek",
|
||||
"commandlist-notification/pause": "\tp - toggle pause",
|
||||
"commandlist-notification/seek": "\t[s][+-]time - seek to the given value of time, if + or - is not specified it's absolute time in seconds or min:sec",
|
||||
"commandlist-notification/help": "\th - this help",
|
||||
"commandlist-notification/toggle": "\tt - toggles whether you are ready to watch or not",
|
||||
"commandlist-notification/create": "\tc [name] - create managed room using name of current room",
|
||||
"commandlist-notification/auth": "\ta [password] - authenticate as room operator with operator password",
|
||||
"commandlist-notification/chat": "\tch [message] - send a chat message in a room",
|
||||
"syncplay-version-notification": "Syncplay version: {}", # syncplay.version
|
||||
"more-info-notification": "More info available at: {}", # projectURL
|
||||
"unrecognized-command-notification" : "Unrecognized command",
|
||||
"commandlist-notification" : "Available commands:",
|
||||
"commandlist-notification/room" : "\tr [name] - change room",
|
||||
"commandlist-notification/list" : "\tl - show user list",
|
||||
"commandlist-notification/undo" : "\tu - undo last seek",
|
||||
"commandlist-notification/pause" : "\tp - toggle pause",
|
||||
"commandlist-notification/seek" : "\t[s][+-]time - seek to the given value of time, if + or - is not specified it's absolute time in seconds or min:sec",
|
||||
"commandlist-notification/help" : "\th - this help",
|
||||
"commandlist-notification/toggle" : "\tt - toggles whether you are ready to watch or not",
|
||||
"commandlist-notification/create" : "\tc [name] - create managed room using name of current room",
|
||||
"commandlist-notification/auth" : "\ta [password] - authenticate as room operator with operator password",
|
||||
"commandlist-notification/chat" : "\tch [message] - send a chat message in a room",
|
||||
"syncplay-version-notification" : "Syncplay version: {}", # syncplay.version
|
||||
"more-info-notification" : "More info available at: {}", # projectURL
|
||||
|
||||
"gui-data-cleared-notification": "Syncplay has cleared the path and window state data used by the GUI.",
|
||||
"language-changed-msgbox-label": "Language will be changed when you run Syncplay.",
|
||||
"promptforupdate-label": "Is it okay for Syncplay to automatically check for updates from time to time?",
|
||||
"gui-data-cleared-notification" : "Syncplay has cleared the path and window state data used by the GUI.",
|
||||
"language-changed-msgbox-label" : "Language will be changed when you run Syncplay.",
|
||||
"promptforupdate-label" : "Is it okay for Syncplay to automatically check for updates from time to time?",
|
||||
|
||||
"vlc-interface-version-mismatch": "You are running version {} of the Syncplay interface module for VLC, but Syncplay is designed to run with version {} and above. Please refer to the Syncplay User Guide at https://syncplay.pl/guide/ for instructions on how to install syncplay.lua.", # VLC interface version, VLC interface min version
|
||||
"vlc-interface-oldversion-warning": "Warning: Syncplay detected that an old version version of the Syncplay interface module for VLC was installed in the VLC directory. Please refer to the Syncplay User Guide at https://syncplay.pl/guide/ for instructions on how to install syncplay.lua.",
|
||||
@ -100,158 +100,158 @@ en = {
|
||||
"mpv-unresponsive-error": "mpv has not responded for {} seconds so appears to have malfunctioned. Please restart Syncplay.", # Seconds to respond
|
||||
|
||||
# Client prompts
|
||||
"enter-to-exit-prompt": "Press enter to exit\n",
|
||||
"enter-to-exit-prompt" : "Press enter to exit\n",
|
||||
|
||||
# Client errors
|
||||
"missing-arguments-error": "Some necessary arguments are missing, refer to --help",
|
||||
"server-timeout-error": "Connection with server timed out",
|
||||
"mpc-slave-error": "Unable to start MPC in slave mode!",
|
||||
"mpc-version-insufficient-error": "MPC version not sufficient, please use `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error": "MPC version not sufficient, please use `mpc-be` >= `{}`",
|
||||
"mpv-version-error": "Syncplay is not compatible with this version of mpv. Please use a different version of mpv (e.g. Git HEAD).",
|
||||
"player-file-open-error": "Player failed opening file",
|
||||
"player-path-error": "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2",
|
||||
"hostname-empty-error": "Hostname can't be empty",
|
||||
"empty-error": "{} can't be empty", # Configuration
|
||||
"missing-arguments-error" : "Some necessary arguments are missing, refer to --help",
|
||||
"server-timeout-error" : "Connection with server timed out",
|
||||
"mpc-slave-error" : "Unable to start MPC in slave mode!",
|
||||
"mpc-version-insufficient-error" : "MPC version not sufficient, please use `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error" : "MPC version not sufficient, please use `mpc-be` >= `{}`",
|
||||
"mpv-version-error" : "Syncplay is not compatible with this version of mpv. Please use a different version of mpv (e.g. Git HEAD).",
|
||||
"player-file-open-error" : "Player failed opening file",
|
||||
"player-path-error" : "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2",
|
||||
"hostname-empty-error" : "Hostname can't be empty",
|
||||
"empty-error" : "{} can't be empty", # Configuration
|
||||
"media-player-error": "Media player error: \"{}\"", # Error line
|
||||
"unable-import-gui-error": "Could not import GUI libraries. If you do not have PySide installed then you will need to install it for the GUI to work.",
|
||||
|
||||
"arguments-missing-error": "Some necessary arguments are missing, refer to --help",
|
||||
"arguments-missing-error" : "Some necessary arguments are missing, refer to --help",
|
||||
|
||||
"unable-to-start-client-error": "Unable to start client",
|
||||
"unable-to-start-client-error" : "Unable to start client",
|
||||
|
||||
"player-path-config-error": "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.",
|
||||
"no-file-path-config-error": "File must be selected before starting your player",
|
||||
"no-file-path-config-error" :"File must be selected before starting your player",
|
||||
"no-hostname-config-error": "Hostname can't be empty",
|
||||
"invalid-port-config-error": "Port must be valid",
|
||||
"empty-value-config-error": "{} can't be empty", # Config option
|
||||
"invalid-port-config-error" : "Port must be valid",
|
||||
"empty-value-config-error" : "{} can't be empty", # Config option
|
||||
|
||||
"not-json-error": "Not a json encoded string\n",
|
||||
"hello-arguments-error": "Not enough Hello arguments\n", # DO NOT TRANSLATE
|
||||
"version-mismatch-error": "Mismatch between versions of client and server\n",
|
||||
"not-json-error" : "Not a json encoded string\n",
|
||||
"hello-arguments-error" : "Not enough Hello arguments\n", # DO NOT TRANSLATE
|
||||
"version-mismatch-error" : "Mismatch between versions of client and server\n",
|
||||
"vlc-failed-connection": "Failed to connect to VLC. If you have not installed syncplay.lua and are using the latest verion of VLC then please refer to https://syncplay.pl/LUA/ for instructions.",
|
||||
"vlc-failed-noscript": "VLC has reported that the syncplay.lua interface script has not been installed. Please refer to https://syncplay.pl/LUA/ for instructions.",
|
||||
"vlc-failed-versioncheck": "This version of VLC is not supported by Syncplay.",
|
||||
|
||||
"feature-sharedPlaylists": "shared playlists", # used for not-supported-by-server-error
|
||||
"feature-chat": "chat", # used for not-supported-by-server-error
|
||||
"feature-readiness": "readiness", # used for not-supported-by-server-error
|
||||
"feature-managedRooms": "managed rooms", # used for not-supported-by-server-error
|
||||
"feature-sharedPlaylists" : "shared playlists", # used for not-supported-by-server-error
|
||||
"feature-chat" : "chat", # used for not-supported-by-server-error
|
||||
"feature-readiness" : "readiness", # used for not-supported-by-server-error
|
||||
"feature-managedRooms" : "managed rooms", # used for not-supported-by-server-error
|
||||
|
||||
"not-supported-by-server-error": "The {} feature is not supported by this server..", # feature
|
||||
"shared-playlists-not-supported-by-server-error": "The shared playlists feature may not be supported by the server. To ensure that it works correctly requires a server running Syncplay {}+, but the server is running Syncplay {}.", # minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error": "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.",
|
||||
"not-supported-by-server-error" : "The {} feature is not supported by this server..", #feature
|
||||
"shared-playlists-not-supported-by-server-error" : "The shared playlists feature may not be supported by the server. To ensure that it works correctly requires a server running Syncplay {}+, but the server is running Syncplay {}.", #minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error" : "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.",
|
||||
|
||||
"invalid-seek-value": "Invalid seek value",
|
||||
"invalid-offset-value": "Invalid offset value",
|
||||
"invalid-seek-value" : "Invalid seek value",
|
||||
"invalid-offset-value" : "Invalid offset value",
|
||||
|
||||
"switch-file-not-found-error": "Could not switch to file '{0}'. Syncplay looks in specified media directories.", # File not found
|
||||
"folder-search-timeout-error": "The search for media in media directories was aborted as it took too long to search through '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", # Folder
|
||||
"folder-search-first-file-timeout-error": "The search for media in '{}' was aborted as it took too long to access the directory. This could happen if it is a network drive or if you configure your drive to spin down after a period of inactivity. For automatic file switching to work again please go to File->Set Media Directories and either remove the directory or resolve the issue (e.g. by changing power saving settings).", # Folder
|
||||
"added-file-not-in-media-directory-error": "You loaded a file in '{}' which is not a known media directory. You can add this as a media directory by selecting File->Set Media Directories in the menu bar.", # Folder
|
||||
"no-media-directories-error": "No media directories have been set. For shared playlist and file switching features to work properly please select File->Set Media Directories and specify where Syncplay should look to find media files.",
|
||||
"cannot-find-directory-error": "Could not find media directory '{}'. To update your list of media directories please select File->Set Media Directories from the menu bar and specify where Syncplay should look to find media files.",
|
||||
"switch-file-not-found-error" : "Could not switch to file '{0}'. Syncplay looks in specified media directories.", # File not found
|
||||
"folder-search-timeout-error" : "The search for media in media directories was aborted as it took too long to search through '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", #Folder
|
||||
"folder-search-first-file-timeout-error" : "The search for media in '{}' was aborted as it took too long to access the directory. This could happen if it is a network drive or if you configure your drive to spin down after a period of inactivity. For automatic file switching to work again please go to File->Set Media Directories and either remove the directory or resolve the issue (e.g. by changing power saving settings).", #Folder
|
||||
"added-file-not-in-media-directory-error" : "You loaded a file in '{}' which is not a known media directory. You can add this as a media directory by selecting File->Set Media Directories in the menu bar.", #Folder
|
||||
"no-media-directories-error" : "No media directories have been set. For shared playlist and file switching features to work properly please select File->Set Media Directories and specify where Syncplay should look to find media files.",
|
||||
"cannot-find-directory-error" : "Could not find media directory '{}'. To update your list of media directories please select File->Set Media Directories from the menu bar and specify where Syncplay should look to find media files.",
|
||||
|
||||
"failed-to-load-server-list-error": "Failed to load public server list. Please visit https://www.syncplay.pl/ in your browser.",
|
||||
"failed-to-load-server-list-error" : "Failed to load public server list. Please visit https://www.syncplay.pl/ in your browser.",
|
||||
|
||||
# Client arguments
|
||||
"argument-description": 'Solution to synchronize playback of multiple media player instances over the network.',
|
||||
"argument-epilog": 'If no options supplied _config values will be used',
|
||||
"nogui-argument": 'show no GUI',
|
||||
"host-argument": 'server\'s address',
|
||||
"name-argument": 'desired username',
|
||||
"debug-argument": 'debug mode',
|
||||
"force-gui-prompt-argument": 'make configuration prompt appear',
|
||||
"no-store-argument": 'don\'t store values in .syncplay',
|
||||
"room-argument": 'default room',
|
||||
"password-argument": 'server password',
|
||||
"player-path-argument": 'path to your player executable',
|
||||
"file-argument": 'file to play',
|
||||
"args-argument": 'player options, if you need to pass options starting with - prepend them with single \'--\' argument',
|
||||
"clear-gui-data-argument": 'resets path and window state GUI data stored as QSettings',
|
||||
"language-argument": 'language for Syncplay messages (de/en/ru)',
|
||||
"argument-description" : 'Solution to synchronize playback of multiple media player instances over the network.',
|
||||
"argument-epilog" : 'If no options supplied _config values will be used',
|
||||
"nogui-argument" : 'show no GUI',
|
||||
"host-argument" : 'server\'s address',
|
||||
"name-argument" : 'desired username',
|
||||
"debug-argument" : 'debug mode',
|
||||
"force-gui-prompt-argument" : 'make configuration prompt appear',
|
||||
"no-store-argument" : 'don\'t store values in .syncplay',
|
||||
"room-argument" : 'default room',
|
||||
"password-argument" : 'server password',
|
||||
"player-path-argument" : 'path to your player executable',
|
||||
"file-argument" : 'file to play',
|
||||
"args-argument" : 'player options, if you need to pass options starting with - prepend them with single \'--\' argument',
|
||||
"clear-gui-data-argument" : 'resets path and window state GUI data stored as QSettings',
|
||||
"language-argument" :'language for Syncplay messages (de/en/ru)',
|
||||
|
||||
"version-argument": 'prints your version',
|
||||
"version-message": "You're using Syncplay version {} ({})",
|
||||
"version-argument" : 'prints your version',
|
||||
"version-message" : "You're using Syncplay version {} ({})",
|
||||
|
||||
# Client labels
|
||||
"config-window-title": "Syncplay configuration",
|
||||
"config-window-title" : "Syncplay configuration",
|
||||
|
||||
"connection-group-title": "Connection settings",
|
||||
"host-label": "Server address: ",
|
||||
"name-label": "Username (optional):",
|
||||
"password-label": "Server password (if any):",
|
||||
"room-label": "Default room: ",
|
||||
"connection-group-title" : "Connection settings",
|
||||
"host-label" : "Server address: ",
|
||||
"name-label" : "Username (optional):",
|
||||
"password-label" : "Server password (if any):",
|
||||
"room-label" : "Default room: ",
|
||||
|
||||
"media-setting-title": "Media player settings",
|
||||
"executable-path-label": "Path to media player:",
|
||||
"media-path-label": "Path to video (optional):",
|
||||
"player-arguments-label": "Player arguments (if any):",
|
||||
"browse-label": "Browse",
|
||||
"update-server-list-label": "Update list",
|
||||
"media-setting-title" : "Media player settings",
|
||||
"executable-path-label" : "Path to media player:",
|
||||
"media-path-label" : "Path to video (optional):",
|
||||
"player-arguments-label" : "Player arguments (if any):",
|
||||
"browse-label" : "Browse",
|
||||
"update-server-list-label" : "Update list",
|
||||
|
||||
"more-title": "Show more settings",
|
||||
"never-rewind-value": "Never",
|
||||
"seconds-suffix": " secs",
|
||||
"privacy-sendraw-option": "Send raw",
|
||||
"privacy-sendhashed-option": "Send hashed",
|
||||
"privacy-dontsend-option": "Don't send",
|
||||
"filename-privacy-label": "Filename information:",
|
||||
"filesize-privacy-label": "File size information:",
|
||||
"checkforupdatesautomatically-label": "Check for Syncplay updates automatically",
|
||||
"slowondesync-label": "Slow down on minor desync (not supported on MPC-HC/BE)",
|
||||
"rewindondesync-label": "Rewind on major desync (recommended)",
|
||||
"fastforwardondesync-label": "Fast-forward if lagging behind (recommended)",
|
||||
"dontslowdownwithme-label": "Never slow down or rewind others (experimental)",
|
||||
"pausing-title": "Pausing",
|
||||
"pauseonleave-label": "Pause when user leaves (e.g. if they are disconnected)",
|
||||
"readiness-title": "Initial readiness state",
|
||||
"readyatstart-label": "Set me as 'ready to watch' by default",
|
||||
"forceguiprompt-label": "Don't always show the Syncplay configuration window", # (Inverted)
|
||||
"showosd-label": "Enable OSD Messages",
|
||||
"more-title" : "Show more settings",
|
||||
"never-rewind-value" : "Never",
|
||||
"seconds-suffix" : " secs",
|
||||
"privacy-sendraw-option" : "Send raw",
|
||||
"privacy-sendhashed-option" : "Send hashed",
|
||||
"privacy-dontsend-option" : "Don't send",
|
||||
"filename-privacy-label" : "Filename information:",
|
||||
"filesize-privacy-label" : "File size information:",
|
||||
"checkforupdatesautomatically-label" : "Check for Syncplay updates automatically",
|
||||
"slowondesync-label" : "Slow down on minor desync (not supported on MPC-HC/BE)",
|
||||
"rewindondesync-label" : "Rewind on major desync (recommended)",
|
||||
"fastforwardondesync-label" : "Fast-forward if lagging behind (recommended)",
|
||||
"dontslowdownwithme-label" : "Never slow down or rewind others (experimental)",
|
||||
"pausing-title" : "Pausing",
|
||||
"pauseonleave-label" : "Pause when user leaves (e.g. if they are disconnected)",
|
||||
"readiness-title" : "Initial readiness state",
|
||||
"readyatstart-label" : "Set me as 'ready to watch' by default",
|
||||
"forceguiprompt-label" : "Don't always show the Syncplay configuration window", # (Inverted)
|
||||
"showosd-label" : "Enable OSD Messages",
|
||||
|
||||
"showosdwarnings-label": "Include warnings (e.g. when files are different, users not ready)",
|
||||
"showsameroomosd-label": "Include events in your room",
|
||||
"shownoncontrollerosd-label": "Include events from non-operators in managed rooms",
|
||||
"showdifferentroomosd-label": "Include events in other rooms",
|
||||
"showslowdownosd-label": "Include slowing down / reverting notifications",
|
||||
"language-label": "Language:",
|
||||
"automatic-language": "Default ({})", # Default language
|
||||
"showdurationnotification-label": "Warn about media duration mismatches",
|
||||
"basics-label": "Basics",
|
||||
"readiness-label": "Play/Pause",
|
||||
"misc-label": "Misc",
|
||||
"core-behaviour-title": "Core room behaviour",
|
||||
"syncplay-internals-title": "Syncplay internals",
|
||||
"syncplay-mediasearchdirectories-title": "Directories to search for media",
|
||||
"syncplay-mediasearchdirectories-label": "Directories to search for media (one path per line)",
|
||||
"sync-label": "Sync",
|
||||
"sync-otherslagging-title": "If others are lagging behind...",
|
||||
"sync-youlaggging-title": "If you are lagging behind...",
|
||||
"messages-label": "Messages",
|
||||
"messages-osd-title": "On-screen Display settings",
|
||||
"messages-other-title": "Other display settings",
|
||||
"chat-label": "Chat",
|
||||
"privacy-label": "Privacy", # Currently unused, but will be brought back if more space is needed in Misc tab
|
||||
"privacy-title": "Privacy settings",
|
||||
"unpause-title": "If you press play, set as ready and:",
|
||||
"unpause-ifalreadyready-option": "Unpause if already set as ready",
|
||||
"unpause-ifothersready-option": "Unpause if already ready or others in room are ready (default)",
|
||||
"unpause-ifminusersready-option": "Unpause if already ready or if all others ready and min users ready",
|
||||
"unpause-always": "Always unpause",
|
||||
"showosdwarnings-label" : "Include warnings (e.g. when files are different, users not ready)",
|
||||
"showsameroomosd-label" : "Include events in your room",
|
||||
"shownoncontrollerosd-label" : "Include events from non-operators in managed rooms",
|
||||
"showdifferentroomosd-label" : "Include events in other rooms",
|
||||
"showslowdownosd-label" :"Include slowing down / reverting notifications",
|
||||
"language-label" : "Language:",
|
||||
"automatic-language" : "Default ({})", # Default language
|
||||
"showdurationnotification-label" : "Warn about media duration mismatches",
|
||||
"basics-label" : "Basics",
|
||||
"readiness-label" : "Play/Pause",
|
||||
"misc-label" : "Misc",
|
||||
"core-behaviour-title" : "Core room behaviour",
|
||||
"syncplay-internals-title" : "Syncplay internals",
|
||||
"syncplay-mediasearchdirectories-title" : "Directories to search for media",
|
||||
"syncplay-mediasearchdirectories-label" : "Directories to search for media (one path per line)",
|
||||
"sync-label" : "Sync",
|
||||
"sync-otherslagging-title" : "If others are lagging behind...",
|
||||
"sync-youlaggging-title" : "If you are lagging behind...",
|
||||
"messages-label" : "Messages",
|
||||
"messages-osd-title" : "On-screen Display settings",
|
||||
"messages-other-title" : "Other display settings",
|
||||
"chat-label" : "Chat",
|
||||
"privacy-label" : "Privacy", # Currently unused, but will be brought back if more space is needed in Misc tab
|
||||
"privacy-title" : "Privacy settings",
|
||||
"unpause-title" : "If you press play, set as ready and:",
|
||||
"unpause-ifalreadyready-option" : "Unpause if already set as ready",
|
||||
"unpause-ifothersready-option" : "Unpause if already ready or others in room are ready (default)",
|
||||
"unpause-ifminusersready-option" : "Unpause if already ready or if all others ready and min users ready",
|
||||
"unpause-always" : "Always unpause",
|
||||
"syncplay-trusteddomains-title": "Trusted domains (for streaming services and hosted content)",
|
||||
|
||||
"chat-title": "Chat message input",
|
||||
"chatinputenabled-label": "Enable chat input via mpv",
|
||||
"chatdirectinput-label": "Allow instant chat input (bypass having to press enter key to chat)",
|
||||
"chatinputfont-label": "Chat input font",
|
||||
"chatfont-label": "Set font",
|
||||
"chatcolour-label": "Set colour",
|
||||
"chatinputposition-label": "Position of message input area in mpv",
|
||||
"chat-top-option": "Top",
|
||||
"chat-middle-option": "Middle",
|
||||
"chat-bottom-option": "Bottom",
|
||||
"chatoutputheader-label": "Chat message output",
|
||||
"chat-title" : "Chat message input",
|
||||
"chatinputenabled-label" : "Enable chat input via mpv",
|
||||
"chatdirectinput-label" : "Allow instant chat input (bypass having to press enter key to chat)",
|
||||
"chatinputfont-label" : "Chat input font",
|
||||
"chatfont-label" : "Set font",
|
||||
"chatcolour-label" : "Set colour",
|
||||
"chatinputposition-label" : "Position of message input area in mpv",
|
||||
"chat-top-option" : "Top",
|
||||
"chat-middle-option" : "Middle",
|
||||
"chat-bottom-option" : "Bottom",
|
||||
"chatoutputheader-label" : "Chat message output",
|
||||
"chatoutputfont-label": "Chat output font",
|
||||
"chatoutputenabled-label": "Enable chat output in media player (mpv only for now)",
|
||||
"chatoutputposition-label": "Output mode",
|
||||
@ -263,136 +263,136 @@ en = {
|
||||
"alphakey-mode-warning-first-line": "You can temporarily use old mpv bindings with a-z keys.",
|
||||
"alphakey-mode-warning-second-line": "Press [TAB] to return to Syncplay chat mode.",
|
||||
|
||||
"help-label": "Help",
|
||||
"reset-label": "Restore defaults",
|
||||
"run-label": "Run Syncplay",
|
||||
"storeandrun-label": "Store configuration and run Syncplay",
|
||||
"help-label" : "Help",
|
||||
"reset-label" : "Restore defaults",
|
||||
"run-label" : "Run Syncplay",
|
||||
"storeandrun-label" : "Store configuration and run Syncplay",
|
||||
|
||||
"contact-label": "Feel free to e-mail <a href=\"mailto:dev@syncplay.pl\"><nobr>dev@syncplay.pl</nobr></a>, chat via the <a href=\"https://webchat.freenode.net/?channels=#syncplay\"><nobr>#Syncplay IRC channel</nobr></a> on irc.freenode.net, <a href=\"https://github.com/Uriziel/syncplay/issues\"><nobr>raise an issue</nobr></a> via GitHub, <a href=\"https://www.facebook.com/SyncplaySoftware\"><nobr>like us on Facebook</nobr></a>, <a href=\"https://twitter.com/Syncplay/\"><nobr>follow us on Twitter</nobr></a>, or visit <a href=\"https://syncplay.pl/\"><nobr>https://syncplay.pl/</nobr></a>. NOTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.",
|
||||
"contact-label" : "Feel free to e-mail <a href=\"mailto:dev@syncplay.pl\"><nobr>dev@syncplay.pl</nobr></a>, chat via the <a href=\"https://webchat.freenode.net/?channels=#syncplay\"><nobr>#Syncplay IRC channel</nobr></a> on irc.freenode.net, <a href=\"https://github.com/Uriziel/syncplay/issues\"><nobr>raise an issue</nobr></a> via GitHub, <a href=\"https://www.facebook.com/SyncplaySoftware\"><nobr>like us on Facebook</nobr></a>, <a href=\"https://twitter.com/Syncplay/\"><nobr>follow us on Twitter</nobr></a>, or visit <a href=\"https://syncplay.pl/\"><nobr>https://syncplay.pl/</nobr></a>. NOTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.",
|
||||
|
||||
"joinroom-label": "Join room",
|
||||
"joinroom-menu-label": "Join room {}",
|
||||
"seektime-menu-label": "Seek to time",
|
||||
"undoseek-menu-label": "Undo seek",
|
||||
"play-menu-label": "Play",
|
||||
"pause-menu-label": "Pause",
|
||||
"playbackbuttons-menu-label": "Show playback buttons",
|
||||
"autoplay-menu-label": "Show auto-play button",
|
||||
"autoplay-guipushbuttonlabel": "Play when all ready",
|
||||
"autoplay-minimum-label": "Min users:",
|
||||
"joinroom-label" : "Join room",
|
||||
"joinroom-menu-label" : "Join room {}",
|
||||
"seektime-menu-label" : "Seek to time",
|
||||
"undoseek-menu-label" : "Undo seek",
|
||||
"play-menu-label" : "Play",
|
||||
"pause-menu-label" : "Pause",
|
||||
"playbackbuttons-menu-label" : "Show playback buttons",
|
||||
"autoplay-menu-label" : "Show auto-play button",
|
||||
"autoplay-guipushbuttonlabel" : "Play when all ready",
|
||||
"autoplay-minimum-label" : "Min users:",
|
||||
|
||||
"sendmessage-label": "Send",
|
||||
"sendmessage-label" : "Send",
|
||||
|
||||
"ready-guipushbuttonlabel": "I'm ready to watch!",
|
||||
"ready-guipushbuttonlabel" : "I'm ready to watch!",
|
||||
|
||||
"roomuser-heading-label": "Room / User",
|
||||
"size-heading-label": "Size",
|
||||
"duration-heading-label": "Length",
|
||||
"filename-heading-label": "Filename",
|
||||
"notifications-heading-label": "Notifications",
|
||||
"userlist-heading-label": "List of who is playing what",
|
||||
"roomuser-heading-label" : "Room / User",
|
||||
"size-heading-label" : "Size",
|
||||
"duration-heading-label" : "Length",
|
||||
"filename-heading-label" : "Filename",
|
||||
"notifications-heading-label" : "Notifications",
|
||||
"userlist-heading-label" : "List of who is playing what",
|
||||
|
||||
"browseformedia-label": "Browse for media files",
|
||||
"browseformedia-label" : "Browse for media files",
|
||||
|
||||
"file-menu-label": "&File", # & precedes shortcut key
|
||||
"openmedia-menu-label": "&Open media file",
|
||||
"openstreamurl-menu-label": "Open &media stream URL",
|
||||
"setmediadirectories-menu-label": "Set media &directories",
|
||||
"exit-menu-label": "E&xit",
|
||||
"advanced-menu-label": "&Advanced",
|
||||
"window-menu-label": "&Window",
|
||||
"setoffset-menu-label": "Set &offset",
|
||||
"createcontrolledroom-menu-label": "&Create managed room",
|
||||
"identifyascontroller-menu-label": "&Identify as room operator",
|
||||
"settrusteddomains-menu-label": "Set &trusted domains",
|
||||
"addtrusteddomain-menu-label": "Add {} as trusted domain", # Domain
|
||||
"file-menu-label" : "&File", # & precedes shortcut key
|
||||
"openmedia-menu-label" : "&Open media file",
|
||||
"openstreamurl-menu-label" : "Open &media stream URL",
|
||||
"setmediadirectories-menu-label" : "Set media &directories",
|
||||
"exit-menu-label" : "E&xit",
|
||||
"advanced-menu-label" : "&Advanced",
|
||||
"window-menu-label" : "&Window",
|
||||
"setoffset-menu-label" : "Set &offset",
|
||||
"createcontrolledroom-menu-label" : "&Create managed room",
|
||||
"identifyascontroller-menu-label" : "&Identify as room operator",
|
||||
"settrusteddomains-menu-label" : "Set &trusted domains",
|
||||
"addtrusteddomain-menu-label" : "Add {} as trusted domain", # Domain
|
||||
|
||||
"playback-menu-label": "&Playback",
|
||||
"playback-menu-label" : "&Playback",
|
||||
|
||||
"help-menu-label": "&Help",
|
||||
"userguide-menu-label": "Open user &guide",
|
||||
"update-menu-label": "Check for &update",
|
||||
"help-menu-label" : "&Help",
|
||||
"userguide-menu-label" : "Open user &guide",
|
||||
"update-menu-label" : "Check for &update",
|
||||
|
||||
# About dialog
|
||||
#About dialog
|
||||
"about-menu-label": "&About Syncplay",
|
||||
"about-dialog-title": "About Syncplay",
|
||||
"about-dialog-release": "Version {} release {}",
|
||||
"about-dialog-license-text": "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-text" : "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-button": "License",
|
||||
"about-dialog-dependencies": "Dependencies",
|
||||
|
||||
"setoffset-msgbox-label": "Set offset",
|
||||
"offsetinfo-msgbox-label": "Offset (see https://syncplay.pl/guide/ for usage instructions):",
|
||||
"setoffset-msgbox-label" : "Set offset",
|
||||
"offsetinfo-msgbox-label" : "Offset (see https://syncplay.pl/guide/ for usage instructions):",
|
||||
|
||||
"promptforstreamurl-msgbox-label": "Open media stream URL",
|
||||
"promptforstreamurlinfo-msgbox-label": "Stream URL",
|
||||
"promptforstreamurl-msgbox-label" : "Open media stream URL",
|
||||
"promptforstreamurlinfo-msgbox-label" : "Stream URL",
|
||||
|
||||
"addfolder-label": "Add folder",
|
||||
"addfolder-label" : "Add folder",
|
||||
|
||||
"adduris-msgbox-label": "Add URLs to playlist (one per line)",
|
||||
"editplaylist-msgbox-label": "Set playlist (one per line)",
|
||||
"trusteddomains-msgbox-label": "Domains it is okay to automatically switch to (one per line)",
|
||||
"adduris-msgbox-label" : "Add URLs to playlist (one per line)",
|
||||
"editplaylist-msgbox-label" : "Set playlist (one per line)",
|
||||
"trusteddomains-msgbox-label" : "Domains it is okay to automatically switch to (one per line)",
|
||||
|
||||
"createcontrolledroom-msgbox-label": "Create managed room",
|
||||
"controlledroominfo-msgbox-label": "Enter name of managed room\r\n(see https://syncplay.pl/guide/ for usage instructions):",
|
||||
"createcontrolledroom-msgbox-label" : "Create managed room",
|
||||
"controlledroominfo-msgbox-label" : "Enter name of managed room\r\n(see https://syncplay.pl/guide/ for usage instructions):",
|
||||
|
||||
"identifyascontroller-msgbox-label": "Identify as room operator",
|
||||
"identifyinfo-msgbox-label": "Enter operator password for this room\r\n(see https://syncplay.pl/guide/ for usage instructions):",
|
||||
"identifyascontroller-msgbox-label" : "Identify as room operator",
|
||||
"identifyinfo-msgbox-label" : "Enter operator password for this room\r\n(see https://syncplay.pl/guide/ for usage instructions):",
|
||||
|
||||
"public-server-msgbox-label": "Select the public server for this viewing session",
|
||||
"public-server-msgbox-label" : "Select the public server for this viewing session",
|
||||
|
||||
"megabyte-suffix": " MB",
|
||||
"megabyte-suffix" : " MB",
|
||||
|
||||
# Tooltips
|
||||
|
||||
"host-tooltip": "Hostname or IP to connect to, optionally including port (e.g. syncplay.pl:8999). Only synchronised with people on same server/port.",
|
||||
"name-tooltip": "Nickname you will be known by. No registration, so can easily change later. Random name generated if none specified.",
|
||||
"password-tooltip": "Passwords are only needed for connecting to private servers.",
|
||||
"room-tooltip": "Room to join upon connection can be almost anything, but you will only be synchronised with people in the same room.",
|
||||
"host-tooltip" : "Hostname or IP to connect to, optionally including port (e.g. syncplay.pl:8999). Only synchronised with people on same server/port.",
|
||||
"name-tooltip" : "Nickname you will be known by. No registration, so can easily change later. Random name generated if none specified.",
|
||||
"password-tooltip" : "Passwords are only needed for connecting to private servers.",
|
||||
"room-tooltip" : "Room to join upon connection can be almost anything, but you will only be synchronised with people in the same room.",
|
||||
|
||||
"executable-path-tooltip": "Location of your chosen supported media player (mpv, VLC, MPC-HC/BE or mplayer2).",
|
||||
"media-path-tooltip": "Location of video or stream to be opened. Necessary for mplayer2.",
|
||||
"player-arguments-tooltip": "Additional command line arguments / switches to pass on to this media player.",
|
||||
"mediasearcdirectories-arguments-tooltip": "Directories where Syncplay will search for media files, e.g. when you are using the click to switch feature. Syncplay will look recursively through sub-folders.",
|
||||
"executable-path-tooltip" : "Location of your chosen supported media player (mpv, VLC, MPC-HC/BE or mplayer2).",
|
||||
"media-path-tooltip" : "Location of video or stream to be opened. Necessary for mplayer2.",
|
||||
"player-arguments-tooltip" : "Additional command line arguments / switches to pass on to this media player.",
|
||||
"mediasearcdirectories-arguments-tooltip" : "Directories where Syncplay will search for media files, e.g. when you are using the click to switch feature. Syncplay will look recursively through sub-folders.",
|
||||
|
||||
"more-tooltip": "Display less frequently used settings.",
|
||||
"filename-privacy-tooltip": "Privacy mode for sending currently playing filename to server.",
|
||||
"filesize-privacy-tooltip": "Privacy mode for sending size of currently playing file to server.",
|
||||
"privacy-sendraw-tooltip": "Send this information without obfuscation. This is the default option with most functionality.",
|
||||
"privacy-sendhashed-tooltip": "Send a hashed version of the information, making it less visible to other clients.",
|
||||
"privacy-dontsend-tooltip": "Do not send this information to the server. This provides for maximum privacy.",
|
||||
"checkforupdatesautomatically-tooltip": "Regularly check with the Syncplay website to see whether a new version of Syncplay is available.",
|
||||
"slowondesync-tooltip": "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip": "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room operators.",
|
||||
"pauseonleave-tooltip": "Pause playback if you get disconnected or someone leaves from your room.",
|
||||
"readyatstart-tooltip": "Set yourself as 'ready' at start (otherwise you are set as 'not ready' until you change your readiness state)",
|
||||
"forceguiprompt-tooltip": "Configuration dialogue is not shown when opening a file with Syncplay.", # (Inverted)
|
||||
"nostore-tooltip": "Run Syncplay with the given configuration, but do not permanently store the changes.", # (Inverted)
|
||||
"rewindondesync-tooltip": "Jump back when needed to get back in sync. Disabling this option can result in major desyncs!",
|
||||
"fastforwardondesync-tooltip": "Jump forward when out of sync with room operator (or your pretend position if 'Never slow down or rewind others' enabled).",
|
||||
"showosd-tooltip": "Sends Syncplay messages to media player OSD.",
|
||||
"showosdwarnings-tooltip": "Show warnings if playing different file, alone in room, users not ready, etc.",
|
||||
"showsameroomosd-tooltip": "Show OSD notifications for events relating to room user is in.",
|
||||
"shownoncontrollerosd-tooltip": "Show OSD notifications for events relating to non-operators who are in managed rooms.",
|
||||
"showdifferentroomosd-tooltip": "Show OSD notifications for events relating to room user is not in.",
|
||||
"showslowdownosd-tooltip": "Show notifications of slowing down / reverting on time difference.",
|
||||
"showdurationnotification-tooltip": "Useful for when a segment in a multi-part file is missing, but can result in false positives.",
|
||||
"language-tooltip": "Language to be used by Syncplay.",
|
||||
"unpause-always-tooltip": "If you press unpause it always sets you as ready and unpause, rather than just setting you as ready.",
|
||||
"unpause-ifalreadyready-tooltip": "If you press unpause when not ready it will set you as ready - press unpause again to unpause.",
|
||||
"unpause-ifothersready-tooltip": "If you press unpause when not ready, it will only upause if others are ready.",
|
||||
"unpause-ifminusersready-tooltip": "If you press unpause when not ready, it will only unpause if others are ready and minimum users threshold is met.",
|
||||
"trusteddomains-arguments-tooltip": "Domains that it is okay for Syncplay to automatically switch to when shared playlists is enabled.",
|
||||
"more-tooltip" : "Display less frequently used settings.",
|
||||
"filename-privacy-tooltip" : "Privacy mode for sending currently playing filename to server.",
|
||||
"filesize-privacy-tooltip" : "Privacy mode for sending size of currently playing file to server.",
|
||||
"privacy-sendraw-tooltip" : "Send this information without obfuscation. This is the default option with most functionality.",
|
||||
"privacy-sendhashed-tooltip" : "Send a hashed version of the information, making it less visible to other clients.",
|
||||
"privacy-dontsend-tooltip" : "Do not send this information to the server. This provides for maximum privacy.",
|
||||
"checkforupdatesautomatically-tooltip" : "Regularly check with the Syncplay website to see whether a new version of Syncplay is available.",
|
||||
"slowondesync-tooltip" : "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip" : "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room operators.",
|
||||
"pauseonleave-tooltip" : "Pause playback if you get disconnected or someone leaves from your room.",
|
||||
"readyatstart-tooltip" : "Set yourself as 'ready' at start (otherwise you are set as 'not ready' until you change your readiness state)",
|
||||
"forceguiprompt-tooltip" : "Configuration dialogue is not shown when opening a file with Syncplay.", # (Inverted)
|
||||
"nostore-tooltip" : "Run Syncplay with the given configuration, but do not permanently store the changes.", # (Inverted)
|
||||
"rewindondesync-tooltip" : "Jump back when needed to get back in sync. Disabling this option can result in major desyncs!",
|
||||
"fastforwardondesync-tooltip" : "Jump forward when out of sync with room operator (or your pretend position if 'Never slow down or rewind others' enabled).",
|
||||
"showosd-tooltip" : "Sends Syncplay messages to media player OSD.",
|
||||
"showosdwarnings-tooltip" : "Show warnings if playing different file, alone in room, users not ready, etc.",
|
||||
"showsameroomosd-tooltip" : "Show OSD notifications for events relating to room user is in.",
|
||||
"shownoncontrollerosd-tooltip" : "Show OSD notifications for events relating to non-operators who are in managed rooms.",
|
||||
"showdifferentroomosd-tooltip" : "Show OSD notifications for events relating to room user is not in.",
|
||||
"showslowdownosd-tooltip" : "Show notifications of slowing down / reverting on time difference.",
|
||||
"showdurationnotification-tooltip" : "Useful for when a segment in a multi-part file is missing, but can result in false positives.",
|
||||
"language-tooltip" : "Language to be used by Syncplay.",
|
||||
"unpause-always-tooltip" : "If you press unpause it always sets you as ready and unpause, rather than just setting you as ready.",
|
||||
"unpause-ifalreadyready-tooltip" : "If you press unpause when not ready it will set you as ready - press unpause again to unpause.",
|
||||
"unpause-ifothersready-tooltip" : "If you press unpause when not ready, it will only upause if others are ready.",
|
||||
"unpause-ifminusersready-tooltip" : "If you press unpause when not ready, it will only unpause if others are ready and minimum users threshold is met.",
|
||||
"trusteddomains-arguments-tooltip" : "Domains that it is okay for Syncplay to automatically switch to when shared playlists is enabled.",
|
||||
|
||||
"chatinputenabled-tooltip": "Enable chat input in mpv (press enter to chat, enter to send, escape to cancel)",
|
||||
"chatdirectinput-tooltip": "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.",
|
||||
"font-label-tooltip": "Font used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"set-input-font-tooltip": "Font family used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"set-input-colour-tooltip": "Font colour used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"chatinputposition-tooltip": "Location in mpv where chat input text will appear when you press enter and type.",
|
||||
"chatinputposition-top-tooltip": "Place chat input at top of mpv window.",
|
||||
"chatinputposition-middle-tooltip": "Place chat input in dead centre of mpv window.",
|
||||
"chatinputposition-bottom-tooltip": "Place chat input at bottom of mpv window.",
|
||||
"chatinputenabled-tooltip" : "Enable chat input in mpv (press enter to chat, enter to send, escape to cancel)",
|
||||
"chatdirectinput-tooltip" : "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.",
|
||||
"font-label-tooltip" : "Font used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"set-input-font-tooltip" : "Font family used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"set-input-colour-tooltip" : "Font colour used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",
|
||||
"chatinputposition-tooltip" : "Location in mpv where chat input text will appear when you press enter and type.",
|
||||
"chatinputposition-top-tooltip" : "Place chat input at top of mpv window.",
|
||||
"chatinputposition-middle-tooltip" : "Place chat input in dead centre of mpv window.",
|
||||
"chatinputposition-bottom-tooltip" : "Place chat input at bottom of mpv window.",
|
||||
"chatoutputenabled-tooltip": "Show chat messages in OSD (if supported by media player).",
|
||||
"font-output-label-tooltip": "Chat output font.",
|
||||
"set-output-font-tooltip": "Font used for when displaying chat messages.",
|
||||
@ -400,80 +400,80 @@ en = {
|
||||
"chatoutputmode-chatroom-tooltip": "Display new lines of chat directly below previous line.",
|
||||
"chatoutputmode-scrolling-tooltip": "Scroll chat text from right to left.",
|
||||
|
||||
"help-tooltip": "Opens the Syncplay.pl user guide.",
|
||||
"reset-tooltip": "Reset all settings to the default configuration.",
|
||||
"update-server-list-tooltip": "Connect to syncplay.pl to update list of public servers.",
|
||||
"help-tooltip" : "Opens the Syncplay.pl user guide.",
|
||||
"reset-tooltip" : "Reset all settings to the default configuration.",
|
||||
"update-server-list-tooltip" : "Connect to syncplay.pl to update list of public servers.",
|
||||
|
||||
"joinroom-tooltip": "Leave current room and joins specified room.",
|
||||
"seektime-msgbox-label": "Jump to specified time (in seconds / min:sec). Use +/- for relative seek.",
|
||||
"ready-tooltip": "Indicates whether you are ready to watch.",
|
||||
"autoplay-tooltip": "Auto-play when all users who have readiness indicator are ready and minimum user threshold met.",
|
||||
"switch-to-file-tooltip": "Double click to switch to {}", # Filename
|
||||
"sendmessage-tooltip": "Send message to room",
|
||||
"joinroom-tooltip" : "Leave current room and joins specified room.",
|
||||
"seektime-msgbox-label" : "Jump to specified time (in seconds / min:sec). Use +/- for relative seek.",
|
||||
"ready-tooltip" : "Indicates whether you are ready to watch.",
|
||||
"autoplay-tooltip" : "Auto-play when all users who have readiness indicator are ready and minimum user threshold met.",
|
||||
"switch-to-file-tooltip" : "Double click to switch to {}", # Filename
|
||||
"sendmessage-tooltip" : "Send message to room",
|
||||
|
||||
# In-userlist notes (GUI)
|
||||
"differentsize-note": "Different size!",
|
||||
"differentsizeandduration-note": "Different size and duration!",
|
||||
"differentduration-note": "Different duration!",
|
||||
"nofile-note": "(No file being played)",
|
||||
"differentsize-note" : "Different size!",
|
||||
"differentsizeandduration-note" : "Different size and duration!",
|
||||
"differentduration-note" : "Different duration!",
|
||||
"nofile-note" : "(No file being played)",
|
||||
|
||||
# Server messages to client
|
||||
"new-syncplay-available-motd-message": "<NOTICE> You are using Syncplay {} but a newer version is available from https://syncplay.pl </NOTICE>", # ClientVersion
|
||||
"new-syncplay-available-motd-message" : "<NOTICE> You are using Syncplay {} but a newer version is available from https://syncplay.pl </NOTICE>", # ClientVersion
|
||||
|
||||
# Server notifications
|
||||
"welcome-server-notification": "Welcome to Syncplay server, ver. {0}", # version
|
||||
"client-connected-room-server-notification": "{0}({2}) connected to room '{1}'", # username, host, room
|
||||
"client-left-server-notification": "{0} left server", # name
|
||||
"no-salt-notification": "PLEASE NOTE: To allow room operator passwords generated by this server instance to still work when the server is restarted, please add the following command line argument when running the Syncplay server in the future: --salt {}", # Salt
|
||||
"welcome-server-notification" : "Welcome to Syncplay server, ver. {0}", # version
|
||||
"client-connected-room-server-notification" : "{0}({2}) connected to room '{1}'", # username, host, room
|
||||
"client-left-server-notification" : "{0} left server", # name
|
||||
"no-salt-notification" : "PLEASE NOTE: To allow room operator passwords generated by this server instance to still work when the server is restarted, please add the following command line argument when running the Syncplay server in the future: --salt {}", #Salt
|
||||
|
||||
|
||||
# Server arguments
|
||||
"server-argument-description": 'Solution to synchronize playback of multiple MPlayer and MPC-HC/BE instances over the network. Server instance',
|
||||
"server-argument-epilog": 'If no options supplied _config values will be used',
|
||||
"server-port-argument": 'server TCP port',
|
||||
"server-password-argument": 'server password',
|
||||
"server-isolate-room-argument": 'should rooms be isolated?',
|
||||
"server-salt-argument": "random string used to generate managed room passwords",
|
||||
"server-disable-ready-argument": "disable readiness feature",
|
||||
"server-argument-description" : 'Solution to synchronize playback of multiple MPlayer and MPC-HC/BE instances over the network. Server instance',
|
||||
"server-argument-epilog" : 'If no options supplied _config values will be used',
|
||||
"server-port-argument" : 'server TCP port',
|
||||
"server-password-argument" : 'server password',
|
||||
"server-isolate-room-argument" : 'should rooms be isolated?',
|
||||
"server-salt-argument" : "random string used to generate managed room passwords",
|
||||
"server-disable-ready-argument" : "disable readiness feature",
|
||||
"server-motd-argument": "path to file from which motd will be fetched",
|
||||
"server-chat-argument": "Should chat be disabled?",
|
||||
"server-chat-maxchars-argument": "Maximum number of characters in a chat message (default is {})", # Default number of characters
|
||||
"server-maxusernamelength-argument": "Maximum number of charactrs in a username (default is {})",
|
||||
"server-chat-argument" : "Should chat be disabled?",
|
||||
"server-chat-maxchars-argument" : "Maximum number of characters in a chat message (default is {})", # Default number of characters
|
||||
"server-maxusernamelength-argument" : "Maximum number of charactrs in a username (default is {})",
|
||||
"server-messed-up-motd-unescaped-placeholders": "Message of the Day has unescaped placeholders. All $ signs should be doubled ($$).",
|
||||
"server-messed-up-motd-too-long": "Message of the Day is too long - maximum of {} chars, {} given.",
|
||||
|
||||
# Server errors
|
||||
"unknown-command-server-error": "Unknown command {}", # message
|
||||
"not-json-server-error": "Not a json encoded string {}", # message
|
||||
"not-known-server-error": "You must be known to server before sending this command",
|
||||
"client-drop-server-error": "Client drop: {} -- {}", # host, error
|
||||
"password-required-server-error": "Password required",
|
||||
"wrong-password-server-error": "Wrong password supplied",
|
||||
"hello-server-error": "Not enough Hello arguments", # DO NOT TRANSLATE
|
||||
"unknown-command-server-error" : "Unknown command {}", # message
|
||||
"not-json-server-error" : "Not a json encoded string {}", # message
|
||||
"not-known-server-error" : "You must be known to server before sending this command",
|
||||
"client-drop-server-error" : "Client drop: {} -- {}", # host, error
|
||||
"password-required-server-error" : "Password required",
|
||||
"wrong-password-server-error" : "Wrong password supplied",
|
||||
"hello-server-error" : "Not enough Hello arguments", #DO NOT TRANSLATE
|
||||
|
||||
# Playlists
|
||||
"playlist-selection-changed-notification": "{} changed the playlist selection", # Username
|
||||
"playlist-contents-changed-notification": "{} updated the playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error": "Could not find file {} in media directories for playlist switch!", # Filename
|
||||
"cannot-add-duplicate-error": "Could not add second entry for '{}' to the playlist as no duplicates are allowed.", # Filename
|
||||
"cannot-add-unsafe-path-error": "Could not automatically load {} because it is not on a trusted domain. You can switch to the URL manually by double clicking it in the playlist, and add trusted domains via File->Advanced->Set Trusted Domains. If you right click on a URL then you can add its domain as a trusted domain via the context menu.", # Filename
|
||||
"sharedplaylistenabled-label": "Enable shared playlists",
|
||||
"removefromplaylist-menu-label": "Remove from playlist",
|
||||
"shuffleremainingplaylist-menu-label": "Shuffle remaining playlist",
|
||||
"shuffleentireplaylist-menu-label": "Shuffle entire playlist",
|
||||
"undoplaylist-menu-label": "Undo last change to playlist",
|
||||
"addfilestoplaylist-menu-label": "Add file(s) to bottom of playlist",
|
||||
"addurlstoplaylist-menu-label": "Add URL(s) to bottom of playlist",
|
||||
"playlist-selection-changed-notification" : "{} changed the playlist selection", # Username
|
||||
"playlist-contents-changed-notification" : "{} updated the playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error" : "Could not find file {} in media directories for playlist switch!", # Filename
|
||||
"cannot-add-duplicate-error" : "Could not add second entry for '{}' to the playlist as no duplicates are allowed.", #Filename
|
||||
"cannot-add-unsafe-path-error" : "Could not automatically load {} because it is not on a trusted domain. You can switch to the URL manually by double clicking it in the playlist, and add trusted domains via File->Advanced->Set Trusted Domains. If you right click on a URL then you can add its domain as a trusted domain via the context menu.", # Filename
|
||||
"sharedplaylistenabled-label" : "Enable shared playlists",
|
||||
"removefromplaylist-menu-label" : "Remove from playlist",
|
||||
"shuffleremainingplaylist-menu-label" : "Shuffle remaining playlist",
|
||||
"shuffleentireplaylist-menu-label" : "Shuffle entire playlist",
|
||||
"undoplaylist-menu-label" : "Undo last change to playlist",
|
||||
"addfilestoplaylist-menu-label" : "Add file(s) to bottom of playlist",
|
||||
"addurlstoplaylist-menu-label" : "Add URL(s) to bottom of playlist",
|
||||
"editplaylist-menu-label": "Edit playlist",
|
||||
|
||||
"open-containing-folder": "Open folder containing this file",
|
||||
"addusersfiletoplaylist-menu-label": "Add {} file to playlist", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label": "Add {} stream to playlist", # item owner indicator
|
||||
"openusersstream-menu-label": "Open {} stream", # [username]'s
|
||||
"openusersfile-menu-label": "Open {} file", # [username]'s
|
||||
"item-is-yours-indicator": "your", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator": "{}'s", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"addusersfiletoplaylist-menu-label" : "Add {} file to playlist", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label" : "Add {} stream to playlist", # item owner indicator
|
||||
"openusersstream-menu-label" : "Open {} stream", # [username]'s
|
||||
"openusersfile-menu-label" : "Open {} file", # [username]'s
|
||||
"item-is-yours-indicator" : "your", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator" : "{}'s", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
|
||||
"playlist-instruction-item-message": "Drag file here to add it to the shared playlist.",
|
||||
"sharedplaylistenabled-tooltip": "Room operators can add files to a synced playlist to make it easy for everyone to watching the same thing. Configure media directories under 'Misc'.",
|
||||
"playlist-instruction-item-message" : "Drag file here to add it to the shared playlist.",
|
||||
"sharedplaylistenabled-tooltip" : "Room operators can add files to a synced playlist to make it easy for everyone to watching the same thing. Configure media directories under 'Misc'.",
|
||||
}
|
||||
|
||||
@ -3,95 +3,95 @@
|
||||
"""Italian dictionary"""
|
||||
|
||||
it = {
|
||||
"LANGUAGE": "Italiano",
|
||||
"LANGUAGE" : "Italiano",
|
||||
|
||||
# Client notifications
|
||||
"config-cleared-notification": "Impostazioni iniziali ripristinate. I cambiamenti saranno memorizzati quando salverai una configurazione valida.",
|
||||
"config-cleared-notification" : "Impostazioni iniziali ripristinate. I cambiamenti saranno memorizzati quando salverai una configurazione valida.",
|
||||
|
||||
"relative-config-notification": "Caricato i file di configurazione relativi: {}",
|
||||
"relative-config-notification" : "Caricato i file di configurazione relativi: {}",
|
||||
|
||||
"connection-attempt-notification": "Tentativo di connessione a {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification": "Connessione col server persa, tentativo di riconnesione in corso",
|
||||
"disconnection-notification": "Disconnesso dal server",
|
||||
"connection-failed-notification": "Connessione col server fallita",
|
||||
"connected-successful-notification": "Connessione al server effettuata con successo",
|
||||
"retrying-notification": "%s, Nuovo tentativo in %d secondi...", # Seconds
|
||||
"connection-attempt-notification" : "Tentativo di connessione a {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification" : "Connessione col server persa, tentativo di riconnesione in corso",
|
||||
"disconnection-notification" : "Disconnesso dal server",
|
||||
"connection-failed-notification" : "Connessione col server fallita",
|
||||
"connected-successful-notification" : "Connessione al server effettuata con successo",
|
||||
"retrying-notification" : "%s, Nuovo tentativo in %d secondi...", # Seconds
|
||||
|
||||
"rewind-notification": "Riavvolgo a causa della differenza temporale con {}", # User
|
||||
"fastforward-notification": "Avanzamento rapido a causa della differenza temporale con {}", # User
|
||||
"slowdown-notification": "Rallento a causa della differenza temporale con {}", # User
|
||||
"revert-notification": "Ripristino la velocità di riproduzione normale",
|
||||
"rewind-notification" : "Riavvolgo a causa della differenza temporale con {}", # User
|
||||
"fastforward-notification" : "Avanzamento rapido a causa della differenza temporale con {}", # User
|
||||
"slowdown-notification" : "Rallento a causa della differenza temporale con {}", # User
|
||||
"revert-notification" : "Ripristino la velocità di riproduzione normale",
|
||||
|
||||
"pause-notification": "{} ha messo in pausa", # User
|
||||
"unpause-notification": "{} ha ripreso la riproduzione", # User
|
||||
"seek-notification": "{} è passato da {} a {}", # User, from time, to time
|
||||
"pause-notification" : "{} ha messo in pausa", # User
|
||||
"unpause-notification" : "{} ha ripreso la riproduzione", # User
|
||||
"seek-notification" : "{} è passato da {} a {}", # User, from time, to time
|
||||
|
||||
"current-offset-notification": "Offset corrente: {} secondi", # Offset
|
||||
"current-offset-notification" : "Offset corrente: {} secondi", # Offset
|
||||
|
||||
"media-directory-list-updated-notification": "Le cartelle multimediali di Syncplay sono state aggiornate.",
|
||||
"media-directory-list-updated-notification" : "Le cartelle multimediali di Syncplay sono state aggiornate.",
|
||||
|
||||
"room-join-notification": "{} è entranto nella stanza: '{}'", # User
|
||||
"left-notification": "{} ha lasciato la stanza", # User
|
||||
"left-paused-notification": "{} ha lasciato la stanza, {} ha messo in pausa", # User who left, User who paused
|
||||
"playing-notification": "{} sta riproducendo '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum": " nella stanza: '{}'", # Room
|
||||
"room-join-notification" : "{} è entranto nella stanza: '{}'", # User
|
||||
"left-notification" : "{} ha lasciato la stanza", # User
|
||||
"left-paused-notification" : "{} ha lasciato la stanza, {} ha messo in pausa", # User who left, User who paused
|
||||
"playing-notification" : "{} sta riproducendo '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum" : " nella stanza: '{}'", # Room
|
||||
|
||||
"not-all-ready": "Non pronti: {}", # Usernames
|
||||
"all-users-ready": "Tutti i partecipanti sono pronti ({} utenti)", # Number of ready users
|
||||
"ready-to-unpause-notification": "Ora sei pronto - premi ancora una volta per riprendere la riproduzione",
|
||||
"set-as-ready-notification": "Ora sei pronto",
|
||||
"set-as-not-ready-notification": "Non sei pronto",
|
||||
"autoplaying-notification": "Riproduzione automatica in {}...", # Number of seconds until playback will start
|
||||
"not-all-ready" : "Non pronti: {}", # Usernames
|
||||
"all-users-ready" : "Tutti i partecipanti sono pronti ({} utenti)", #Number of ready users
|
||||
"ready-to-unpause-notification" : "Ora sei pronto - premi ancora una volta per riprendere la riproduzione",
|
||||
"set-as-ready-notification" : "Ora sei pronto",
|
||||
"set-as-not-ready-notification" : "Non sei pronto",
|
||||
"autoplaying-notification" : "Riproduzione automatica in {}...", # Number of seconds until playback will start
|
||||
|
||||
"identifying-as-controller-notification": "Ti sei identificato come gestore della stanza con password '{}'...",
|
||||
"failed-to-identify-as-controller-notification": "{} ha fallito l'identificazione come gestore della stanza.",
|
||||
"authenticated-as-controller-notification": "{} autenticato come gestore della stanza",
|
||||
"created-controlled-room-notification": "Stanza gestita '{}' creata con password '{}'. Per favore salva queste informazioni per una consultazione futura!", # RoomName, operatorPassword
|
||||
"identifying-as-controller-notification" : "Ti sei identificato come gestore della stanza con password '{}'...",
|
||||
"failed-to-identify-as-controller-notification" : "{} ha fallito l'identificazione come gestore della stanza.",
|
||||
"authenticated-as-controller-notification" : "{} autenticato come gestore della stanza",
|
||||
"created-controlled-room-notification" : "Stanza gestita '{}' creata con password '{}'. Per favore salva queste informazioni per una consultazione futura!", # RoomName, operatorPassword
|
||||
|
||||
"file-different-notification": "Il file che stai riproducendo sembra essere diverso da quello di {}", # User
|
||||
"file-differences-notification": "Il tuo file mostra le seguenti differenze: {}", # Differences
|
||||
"room-file-differences": "Differenze: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename": "nome",
|
||||
"file-difference-filesize": "dimensione",
|
||||
"file-difference-duration": "durata",
|
||||
"file-different-notification" : "Il file che stai riproducendo sembra essere diverso da quello di {}", # User
|
||||
"file-differences-notification" : "Il tuo file mostra le seguenti differenze: {}", # Differences
|
||||
"room-file-differences" : "Differenze: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename" : "nome",
|
||||
"file-difference-filesize" : "dimensione",
|
||||
"file-difference-duration" : "durata",
|
||||
"alone-in-the-room": "Non ci sono altri utenti nella stanza",
|
||||
|
||||
"different-filesize-notification": " (la dimensione del tuo file è diversa da quella degli altri partecipanti!)",
|
||||
"userlist-playing-notification": "{} sta riproducendo:", # Username
|
||||
"file-played-by-notification": "File: {} è in riproduzione da:", # File
|
||||
"no-file-played-notification": "{} non sta riproducendo alcun file", # Username
|
||||
"notplaying-notification": "Partecipanti che non stanno riproducendo alcun file:",
|
||||
"userlist-room-notification": "Nella stanza '{}':", # Room
|
||||
"userlist-file-notification": "File",
|
||||
"controller-userlist-userflag": "Gestore",
|
||||
"ready-userlist-userflag": "Pronto",
|
||||
"different-filesize-notification" : " (la dimensione del tuo file è diversa da quella degli altri partecipanti!)",
|
||||
"userlist-playing-notification" : "{} sta riproducendo:", #Username
|
||||
"file-played-by-notification" : "File: {} è in riproduzione da:", # File
|
||||
"no-file-played-notification" : "{} non sta riproducendo alcun file", # Username
|
||||
"notplaying-notification" : "Partecipanti che non stanno riproducendo alcun file:",
|
||||
"userlist-room-notification" : "Nella stanza '{}':", # Room
|
||||
"userlist-file-notification" : "File",
|
||||
"controller-userlist-userflag" : "Gestore",
|
||||
"ready-userlist-userflag" : "Pronto",
|
||||
|
||||
"update-check-failed-notification": "Controllo automatico degli aggiornamenti di Syncplay {} fallito. Vuoi visitare https://syncplay.pl/ per verificare manualmente la presenza di aggiornamenti?", # Syncplay version
|
||||
"syncplay-uptodate-notification": "Syncplay è aggiornato",
|
||||
"syncplay-updateavailable-notification": "Una nuova versione di Syncplay è disponibile. Vuoi visitare la pagina delle release?",
|
||||
"update-check-failed-notification" : "Controllo automatico degli aggiornamenti di Syncplay {} fallito. Vuoi visitare https://syncplay.pl/ per verificare manualmente la presenza di aggiornamenti?", #Syncplay version
|
||||
"syncplay-uptodate-notification" : "Syncplay è aggiornato",
|
||||
"syncplay-updateavailable-notification" : "Una nuova versione di Syncplay è disponibile. Vuoi visitare la pagina delle release?",
|
||||
|
||||
"mplayer-file-required-notification": "Utilizzare Syncplay con mplayer di selezionare il file all'avvio",
|
||||
"mplayer-file-required-notification/example": "Esempio di utilizzo: syncplay [opzioni] [url|percorso/]nomefile",
|
||||
"mplayer2-required": "Syncplay non è compatibile con MPlayer 1.x, per favore utilizza mplayer2 or mpv",
|
||||
"mplayer-file-required-notification" : "Utilizzare Syncplay con mplayer di selezionare il file all'avvio",
|
||||
"mplayer-file-required-notification/example" : "Esempio di utilizzo: syncplay [opzioni] [url|percorso/]nomefile",
|
||||
"mplayer2-required" : "Syncplay non è compatibile con MPlayer 1.x, per favore utilizza mplayer2 or mpv",
|
||||
|
||||
"unrecognized-command-notification": "Comando non riconosciuto",
|
||||
"commandlist-notification": "Comandi disponibili:",
|
||||
"commandlist-notification/room": "\tr [nome] - cambia stanza",
|
||||
"commandlist-notification/list": "\tl - mostra la lista di utenti",
|
||||
"commandlist-notification/undo": "\tu - annulla l'ultima ricerca",
|
||||
"commandlist-notification/pause": "\tp - attiva o disattiva la pausa",
|
||||
"commandlist-notification/seek": "\t[s][+-]tempo - salta all'istante di tempo dato, se + o - non è specificato si considera il tempo assoluto in secondi o min:sec",
|
||||
"commandlist-notification/help": "\th - mostra questo help",
|
||||
"commandlist-notification/toggle": "\tt - attiva o disattiva la funzionalità \"pronto\"",
|
||||
"commandlist-notification/create": "\tc [nome] - crea una stanza gestita usando il nome della stanza attuale",
|
||||
"commandlist-notification/auth": "\ta [password] - autentica come gestore della stanza, utilizzando la password del gestore",
|
||||
"commandlist-notification/chat": "\tch [message] - invia un messaggio nella chat della stanza",
|
||||
"syncplay-version-notification": "Versione di Syncplay: {}", # syncplay.version
|
||||
"more-info-notification": "Maggiori informazioni a: {}", # projectURL
|
||||
"unrecognized-command-notification" : "Comando non riconosciuto",
|
||||
"commandlist-notification" : "Comandi disponibili:",
|
||||
"commandlist-notification/room" : "\tr [nome] - cambia stanza",
|
||||
"commandlist-notification/list" : "\tl - mostra la lista di utenti",
|
||||
"commandlist-notification/undo" : "\tu - annulla l'ultima ricerca",
|
||||
"commandlist-notification/pause" : "\tp - attiva o disattiva la pausa",
|
||||
"commandlist-notification/seek" : "\t[s][+-]tempo - salta all'istante di tempo dato, se + o - non è specificato si considera il tempo assoluto in secondi o min:sec",
|
||||
"commandlist-notification/help" : "\th - mostra questo help",
|
||||
"commandlist-notification/toggle" : "\tt - attiva o disattiva la funzionalità \"pronto\"",
|
||||
"commandlist-notification/create" : "\tc [nome] - crea una stanza gestita usando il nome della stanza attuale",
|
||||
"commandlist-notification/auth" : "\ta [password] - autentica come gestore della stanza, utilizzando la password del gestore",
|
||||
"commandlist-notification/chat" : "\tch [message] - invia un messaggio nella chat della stanza",
|
||||
"syncplay-version-notification" : "Versione di Syncplay: {}", # syncplay.version
|
||||
"more-info-notification" : "Maggiori informazioni a: {}", # projectURL
|
||||
|
||||
"gui-data-cleared-notification": "Syncplay ha ripristinato i dati dell'interfaccia relativi ai percorsi e allo stato delle finestre.",
|
||||
"language-changed-msgbox-label": "La lingua sarà cambiata quando avvierai Syncplay.",
|
||||
"promptforupdate-label": "Ti piacerebbe che, di tanto in tanto, Syncplay controllasse automaticamente la presenza di aggiornamenti?",
|
||||
"gui-data-cleared-notification" : "Syncplay ha ripristinato i dati dell'interfaccia relativi ai percorsi e allo stato delle finestre.",
|
||||
"language-changed-msgbox-label" : "La lingua sarà cambiata quando avvierai Syncplay.",
|
||||
"promptforupdate-label" : "Ti piacerebbe che, di tanto in tanto, Syncplay controllasse automaticamente la presenza di aggiornamenti?",
|
||||
|
||||
"vlc-interface-version-mismatch": "Stai eseguendo la versione {} del modulo di interfaccia per VLC di Syncplay, ma Syncplay è progettato per essere utilizzato con la versione {} o superiore. Per favore, fai riferimento alla User Guide di Syncplay presso https://syncplay.pl/guide/ per istruzioni su come installare syncplay.lua.", # VLC interface version, VLC interface min version
|
||||
"vlc-interface-oldversion-warning": "Attenzione: Syncplay ha rilevato una vecchia versione del modulo di interfaccia per VLC di Syncplay installata nella cartella di VLC. Per favore, fai riferimento alla User Guide di Syncplay presso https://syncplay.pl/guide/ per istruzioni su come installare syncplay.lua.",
|
||||
@ -100,158 +100,158 @@ it = {
|
||||
"mpv-unresponsive-error": "mpv non ha risposto per {} secondi, quindi sembra non funzionare correttamente. Per favore, riavvia Syncplay.", # Seconds to respond
|
||||
|
||||
# Client prompts
|
||||
"enter-to-exit-prompt": "Premi Invio per uscire\n",
|
||||
"enter-to-exit-prompt" : "Premi Invio per uscire\n",
|
||||
|
||||
# Client errors
|
||||
"missing-arguments-error": "Alcuni argomenti obbligatori non sono stati trovati. Fai riferimento a --help",
|
||||
"server-timeout-error": "Connessione col server scaduta",
|
||||
"mpc-slave-error": "Non è possibile avviare MPC in modalità slave!",
|
||||
"mpc-version-insufficient-error": "La tua versione di MPC è troppo vecchia, per favore usa `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error": "La tua versione di MPC è troppo vecchia, per favore usa `mpc-be` >= `{}`",
|
||||
"mpv-version-error": "Syncplay non è compatibile con questa versione di mpv. Per favore usa un'altra versione di mpv (es. Git HEAD).",
|
||||
"player-file-open-error": "Il player non è riuscito ad aprire il file",
|
||||
"player-path-error": "Il path del player non è configurato correttamente. I player supportati sono: mpv, VLC, MPC-HC, MPC-BE e mplayer2",
|
||||
"hostname-empty-error": "Il campo hostname non può essere vuoto",
|
||||
"empty-error": "Il campo {} non può esssere vuoto", # Configuration
|
||||
"missing-arguments-error" : "Alcuni argomenti obbligatori non sono stati trovati. Fai riferimento a --help",
|
||||
"server-timeout-error" : "Connessione col server scaduta",
|
||||
"mpc-slave-error" : "Non è possibile avviare MPC in modalità slave!",
|
||||
"mpc-version-insufficient-error" : "La tua versione di MPC è troppo vecchia, per favore usa `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error" : "La tua versione di MPC è troppo vecchia, per favore usa `mpc-be` >= `{}`",
|
||||
"mpv-version-error" : "Syncplay non è compatibile con questa versione di mpv. Per favore usa un'altra versione di mpv (es. Git HEAD).",
|
||||
"player-file-open-error" : "Il player non è riuscito ad aprire il file",
|
||||
"player-path-error" : "Il path del player non è configurato correttamente. I player supportati sono: mpv, VLC, MPC-HC, MPC-BE e mplayer2",
|
||||
"hostname-empty-error" : "Il campo hostname non può essere vuoto",
|
||||
"empty-error" : "Il campo {} non può esssere vuoto", # Configuration
|
||||
"media-player-error": "Errore media player: \"{}\"", # Error line
|
||||
"unable-import-gui-error": "Non è possibile importare le librerie di interfaccia grafica. Hai bisogno di PySide per poter utilizzare l'interfaccia grafica.",
|
||||
|
||||
"arguments-missing-error": "Alcuni argomenti obbligatori non sono stati trovati. Fai riferimento a --help",
|
||||
"arguments-missing-error" : "Alcuni argomenti obbligatori non sono stati trovati. Fai riferimento a --help",
|
||||
|
||||
"unable-to-start-client-error": "Impossibile avviare il client",
|
||||
"unable-to-start-client-error" : "Impossibile avviare il client",
|
||||
|
||||
"player-path-config-error": "Il percorso del player non è configurato correttamente. I player supportati sono: mpv, VLC, MPC-HC, MPC-BE e mplayer2.",
|
||||
"no-file-path-config-error": "Deve essere selezionato un file prima di avviare il player",
|
||||
"no-file-path-config-error" :"Deve essere selezionato un file prima di avviare il player",
|
||||
"no-hostname-config-error": "Il campo hostname non può essere vuoto",
|
||||
"invalid-port-config-error": "La porta deve essere valida",
|
||||
"empty-value-config-error": "Il campo {} non può essere vuoto", # Config option
|
||||
"invalid-port-config-error" : "La porta deve essere valida",
|
||||
"empty-value-config-error" : "Il campo {} non può essere vuoto", # Config option
|
||||
|
||||
"not-json-error": "Non è una stringa con codifica JSON\n",
|
||||
"hello-arguments-error": "Not enough Hello arguments\n", # DO NOT TRANSLATE
|
||||
"version-mismatch-error": "La versione del client è diversa da quella del server\n",
|
||||
"not-json-error" : "Non è una stringa con codifica JSON\n",
|
||||
"hello-arguments-error" : "Not enough Hello arguments\n", # DO NOT TRANSLATE
|
||||
"version-mismatch-error" : "La versione del client è diversa da quella del server\n",
|
||||
"vlc-failed-connection": "Impossibile collegarsi a VLC. Se non hai installato syncplay.lua e stai usando l'ultima versione di VLC, fai riferimento a https://syncplay.pl/LUA/ per istruzioni.",
|
||||
"vlc-failed-noscript": "VLC ha segnalato che lo script di interfaccia syncplay.lua non è stato installato. Per favore, fai riferimento a https://syncplay.pl/LUA/ per istruzioni.",
|
||||
"vlc-failed-versioncheck": "Questa versione di VLC non è supportata da Syncplay.",
|
||||
|
||||
"feature-sharedPlaylists": "playlist condivise", # used for not-supported-by-server-error
|
||||
"feature-chat": "chat", # used for not-supported-by-server-error
|
||||
"feature-readiness": "pronto", # used for not-supported-by-server-error
|
||||
"feature-managedRooms": "stanze gestite", # used for not-supported-by-server-error
|
||||
"feature-sharedPlaylists" : "playlist condivise", # used for not-supported-by-server-error
|
||||
"feature-chat" : "chat", # used for not-supported-by-server-error
|
||||
"feature-readiness" : "pronto", # used for not-supported-by-server-error
|
||||
"feature-managedRooms" : "stanze gestite", # used for not-supported-by-server-error
|
||||
|
||||
"not-supported-by-server-error": "La feature {} non è supportata da questo server..", # feature
|
||||
"shared-playlists-not-supported-by-server-error": "Le playlist condivise potrebbero non essere supportata dal server. È necessario un server con Syncplay {}+ per assicurarsi che funzionino correttamente, tuttavia il server sta utilizzando Syncplay {}.", # minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error": "Le playlist condivise sono state disabilitate nella configurazione del server. Per utilizzarle, dovrai collegarti a un altro server.",
|
||||
"not-supported-by-server-error" : "La feature {} non è supportata da questo server..", #feature
|
||||
"shared-playlists-not-supported-by-server-error" : "Le playlist condivise potrebbero non essere supportata dal server. È necessario un server con Syncplay {}+ per assicurarsi che funzionino correttamente, tuttavia il server sta utilizzando Syncplay {}.", #minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error" : "Le playlist condivise sono state disabilitate nella configurazione del server. Per utilizzarle, dovrai collegarti a un altro server.",
|
||||
|
||||
"invalid-seek-value": "Valore di ricerca non valido",
|
||||
"invalid-offset-value": "Valore di offset non valido",
|
||||
"invalid-seek-value" : "Valore di ricerca non valido",
|
||||
"invalid-offset-value" : "Valore di offset non valido",
|
||||
|
||||
"switch-file-not-found-error": "Impossibile selezionare il file '{0}'. Syncplay osserva solo le cartelle multimediali specificate.", # File not found
|
||||
"folder-search-timeout-error": "La ricerca nelle cartelle multimediali è stata interrotta perché l'analisi di '{}' sta impiegando troppo tempo. Ciò accade se si aggiunge nella lista di ricerca una cartella con troppe sottocartelle. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali nella barra dei menù e rimuovi questa cartella, o sostituiscila con una sottocartella appropriata. Se la cartella è idonea, è possibile riabilitarla selezionando File->Imposta cartelle multimediali e premendo 'OK'.", # Folder
|
||||
"folder-search-first-file-timeout-error": "La ricerca dei media in '{}' è stata interrotta perché l'accesso alla cartella sta impiegando troppo tempo. Ciò accade se questa si trova in un disco di rete oppure se hai impostato il blocco della rotazione del disco rigido dopo un certo periodo di inattività. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali, quindi rimuovi la cartella oppure risolvi il problema (es. cambiando le impostazioni di risparmio energetico).", # Folder
|
||||
"added-file-not-in-media-directory-error": "Hai selezionato un file in '{}', che non è impostata come cartella multimediale. Puoi aggiungerla come cartella multimediale selezionando File->Imposta cartelle multimediali nella barra dei menù.", # Folder
|
||||
"no-media-directories-error": "Nessuna cartella multimediale è stata configurata. Per permettere il corretto funzionamento delle playlist condivise e la selezione automatica dei file, naviga in File->Imposta cartelle multimediali e specifica dove Syncplay deve ricercare i file multimediali.",
|
||||
"cannot-find-directory-error": "Impossibile trovare la cartella multimediale '{}'. Per aggiornare la lista delle cartelle multimediali seleziona File->Imposta cartelle multimediali dalla barra dei menù e specifica dove Syncplay deve ricercare i file multimediali.",
|
||||
"switch-file-not-found-error" : "Impossibile selezionare il file '{0}'. Syncplay osserva solo le cartelle multimediali specificate.", # File not found
|
||||
"folder-search-timeout-error" : "La ricerca nelle cartelle multimediali è stata interrotta perché l'analisi di '{}' sta impiegando troppo tempo. Ciò accade se si aggiunge nella lista di ricerca una cartella con troppe sottocartelle. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali nella barra dei menù e rimuovi questa cartella, o sostituiscila con una sottocartella appropriata. Se la cartella è idonea, è possibile riabilitarla selezionando File->Imposta cartelle multimediali e premendo 'OK'.", #Folder
|
||||
"folder-search-first-file-timeout-error" : "La ricerca dei media in '{}' è stata interrotta perché l'accesso alla cartella sta impiegando troppo tempo. Ciò accade se questa si trova in un disco di rete oppure se hai impostato il blocco della rotazione del disco rigido dopo un certo periodo di inattività. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali, quindi rimuovi la cartella oppure risolvi il problema (es. cambiando le impostazioni di risparmio energetico).", #Folder
|
||||
"added-file-not-in-media-directory-error" : "Hai selezionato un file in '{}', che non è impostata come cartella multimediale. Puoi aggiungerla come cartella multimediale selezionando File->Imposta cartelle multimediali nella barra dei menù.", #Folder
|
||||
"no-media-directories-error" : "Nessuna cartella multimediale è stata configurata. Per permettere il corretto funzionamento delle playlist condivise e la selezione automatica dei file, naviga in File->Imposta cartelle multimediali e specifica dove Syncplay deve ricercare i file multimediali.",
|
||||
"cannot-find-directory-error" : "Impossibile trovare la cartella multimediale '{}'. Per aggiornare la lista delle cartelle multimediali seleziona File->Imposta cartelle multimediali dalla barra dei menù e specifica dove Syncplay deve ricercare i file multimediali.",
|
||||
|
||||
"failed-to-load-server-list-error": "Impossibile caricare la lista dei server pubblici. Per favore, visita https://www.syncplay.pl/ con il tuo browser.",
|
||||
"failed-to-load-server-list-error" : "Impossibile caricare la lista dei server pubblici. Per favore, visita https://www.syncplay.pl/ con il tuo browser.",
|
||||
|
||||
# Client arguments
|
||||
"argument-description": 'Programma per sincronizzare la riproduzione di media player multipli attraverso la rete.',
|
||||
"argument-epilog": 'Se non è specificata alcuna opzione saranno utilizzati i valori _config',
|
||||
"nogui-argument": 'non mostrare l\'interfaccia grafica',
|
||||
"host-argument": 'indirizzo del server',
|
||||
"name-argument": 'username desiderato',
|
||||
"debug-argument": 'modalità debug',
|
||||
"force-gui-prompt-argument": 'mostra la finestra di configurazione',
|
||||
"no-store-argument": 'non salvare i valori in .syncplay',
|
||||
"room-argument": 'stanza di default',
|
||||
"password-argument": 'password del server',
|
||||
"player-path-argument": 'percorso dell\'eseguibile del tuo player',
|
||||
"file-argument": 'file da riprodurre',
|
||||
"args-argument": 'opzioni del player, se hai bisogno di utilizzare opzioni che iniziano con - anteponi un singolo \'--\'',
|
||||
"clear-gui-data-argument": 'ripristina il percorso e i dati impostati tramite interfaccia grafica e salvati come QSettings',
|
||||
"language-argument": 'lingua per i messaggi di Syncplay (de/en/ru/it)',
|
||||
"argument-description" : 'Programma per sincronizzare la riproduzione di media player multipli attraverso la rete.',
|
||||
"argument-epilog" : 'Se non è specificata alcuna opzione saranno utilizzati i valori _config',
|
||||
"nogui-argument" : 'non mostrare l\'interfaccia grafica',
|
||||
"host-argument" : 'indirizzo del server',
|
||||
"name-argument" : 'username desiderato',
|
||||
"debug-argument" : 'modalità debug',
|
||||
"force-gui-prompt-argument" : 'mostra la finestra di configurazione',
|
||||
"no-store-argument" : 'non salvare i valori in .syncplay',
|
||||
"room-argument" : 'stanza di default',
|
||||
"password-argument" : 'password del server',
|
||||
"player-path-argument" : 'percorso dell\'eseguibile del tuo player',
|
||||
"file-argument" : 'file da riprodurre',
|
||||
"args-argument" : 'opzioni del player, se hai bisogno di utilizzare opzioni che iniziano con - anteponi un singolo \'--\'',
|
||||
"clear-gui-data-argument" : 'ripristina il percorso e i dati impostati tramite interfaccia grafica e salvati come QSettings',
|
||||
"language-argument" : 'lingua per i messaggi di Syncplay (de/en/ru/it)',
|
||||
|
||||
"version-argument": 'mostra la tua versione',
|
||||
"version-message": "Stai usando la versione di Syncplay {} ({})",
|
||||
"version-argument" : 'mostra la tua versione',
|
||||
"version-message" : "Stai usando la versione di Syncplay {} ({})",
|
||||
|
||||
# Client labels
|
||||
"config-window-title": "Configurazione di Syncplay",
|
||||
"config-window-title" : "Configurazione di Syncplay",
|
||||
|
||||
"connection-group-title": "Impostazioni di connessione",
|
||||
"host-label": "Indirizzo del server: ",
|
||||
"name-label": "Username (opzionale):",
|
||||
"password-label": "Password del server (se necessaria):",
|
||||
"room-label": "Stanza di default: ",
|
||||
"connection-group-title" : "Impostazioni di connessione",
|
||||
"host-label" : "Indirizzo del server: ",
|
||||
"name-label" : "Username (opzionale):",
|
||||
"password-label" : "Password del server (se necessaria):",
|
||||
"room-label" : "Stanza di default: ",
|
||||
|
||||
"media-setting-title": "Impostazioni del media player",
|
||||
"executable-path-label": "Percorso del media player:",
|
||||
"media-path-label": "Percorso del video (opzionale):",
|
||||
"player-arguments-label": "Opzioni del player (se necessarie):",
|
||||
"browse-label": "Sfoglia",
|
||||
"update-server-list-label": "Aggiorna lista",
|
||||
"media-setting-title" : "Impostazioni del media player",
|
||||
"executable-path-label" : "Percorso del media player:",
|
||||
"media-path-label" : "Percorso del video (opzionale):",
|
||||
"player-arguments-label" : "Opzioni del player (se necessarie):",
|
||||
"browse-label" : "Sfoglia",
|
||||
"update-server-list-label" : "Aggiorna lista",
|
||||
|
||||
"more-title": "Mostra altre impostazioni",
|
||||
"never-rewind-value": "Mai",
|
||||
"seconds-suffix": " sec",
|
||||
"privacy-sendraw-option": "Invio semplice",
|
||||
"privacy-sendhashed-option": "Invio cifrato",
|
||||
"privacy-dontsend-option": "Non inviare",
|
||||
"filename-privacy-label": "Nome del file:",
|
||||
"filesize-privacy-label": "Dimensione del file:",
|
||||
"checkforupdatesautomatically-label": "Controlla automaticamente gli aggiornamenti di Syncplay",
|
||||
"slowondesync-label": "Rallenta in caso di sfasamento minimo (non supportato su MPC-HC/BE)",
|
||||
"rewindondesync-label": "Riavvolgi in caso di grande sfasamento (consigliato)",
|
||||
"fastforwardondesync-label": "Avanzamento rapido in caso di ritardo (consigliato)",
|
||||
"dontslowdownwithme-label": "Non rallentare o riavvolgere gli altri utenti (sperimentale)",
|
||||
"pausing-title": "Pausa",
|
||||
"pauseonleave-label": "Metti in pausa quando gli altri utenti lasciano la stanza (es. disconnessione)",
|
||||
"readiness-title": "Stato iniziale di 'pronto'",
|
||||
"readyatstart-label": "Imposta sempre il mio stato come \"pronto\" a guardare",
|
||||
"forceguiprompt-label": "Non mostrare la finestra di configurazione di Syncplay a ogni avvio", # (Inverted)
|
||||
"showosd-label": "Abilita i messaggi OSD",
|
||||
"more-title" : "Mostra altre impostazioni",
|
||||
"never-rewind-value" : "Mai",
|
||||
"seconds-suffix" : " sec",
|
||||
"privacy-sendraw-option" : "Invio semplice",
|
||||
"privacy-sendhashed-option" : "Invio cifrato",
|
||||
"privacy-dontsend-option" : "Non inviare",
|
||||
"filename-privacy-label" : "Nome del file:",
|
||||
"filesize-privacy-label" : "Dimensione del file:",
|
||||
"checkforupdatesautomatically-label" : "Controlla automaticamente gli aggiornamenti di Syncplay",
|
||||
"slowondesync-label" : "Rallenta in caso di sfasamento minimo (non supportato su MPC-HC/BE)",
|
||||
"rewindondesync-label" : "Riavvolgi in caso di grande sfasamento (consigliato)",
|
||||
"fastforwardondesync-label" : "Avanzamento rapido in caso di ritardo (consigliato)",
|
||||
"dontslowdownwithme-label" : "Non rallentare o riavvolgere gli altri utenti (sperimentale)",
|
||||
"pausing-title" : "Pausa",
|
||||
"pauseonleave-label" : "Metti in pausa quando gli altri utenti lasciano la stanza (es. disconnessione)",
|
||||
"readiness-title" : "Stato iniziale di 'pronto'",
|
||||
"readyatstart-label" : "Imposta sempre il mio stato come \"pronto\" a guardare",
|
||||
"forceguiprompt-label" : "Non mostrare la finestra di configurazione di Syncplay a ogni avvio", # (Inverted)
|
||||
"showosd-label" : "Abilita i messaggi OSD",
|
||||
|
||||
"showosdwarnings-label": "Mostra gli avvisi (es. file differenti, utenti non pronti)",
|
||||
"showsameroomosd-label": "Mostra gli eventi della tua stanza",
|
||||
"shownoncontrollerosd-label": "Mostra gli eventi dei non gestori nelle stanze gestite",
|
||||
"showdifferentroomosd-label": "Mostra gli eventi di altre stanze",
|
||||
"showslowdownosd-label": "Mostra le notifiche di rallentamento / riavvolgimento",
|
||||
"language-label": "Lingua:",
|
||||
"automatic-language": "Predefinita ({})", # Default language
|
||||
"showdurationnotification-label": "Avvisa in caso di mancata corrispondenza della durata del file",
|
||||
"basics-label": "Generali",
|
||||
"readiness-label": "Play/Pausa",
|
||||
"misc-label": "Varie",
|
||||
"core-behaviour-title": "Comportamento principale della stanza",
|
||||
"syncplay-internals-title": "Funzionamento di Syncplay",
|
||||
"syncplay-mediasearchdirectories-title": "Cartelle contenenti i file multimediali",
|
||||
"syncplay-mediasearchdirectories-label": "Cartelle contenenti i file multimediali (un solo percorso per riga)",
|
||||
"sync-label": "Sincronia", # don't have better options as the label won't fit in the panel.
|
||||
"sync-otherslagging-title": "Se gli altri partecipanti non sono sincronizzati...",
|
||||
"sync-youlaggging-title": "Se tu sei non sei sincronizzato...",
|
||||
"messages-label": "Messaggi",
|
||||
"messages-osd-title": "Impostazioni On-Screen Display",
|
||||
"messages-other-title": "Altre impostazioni dello schermo",
|
||||
"chat-label": "Chat",
|
||||
"privacy-label": "Privacy", # Currently unused, but will be brought back if more space is needed in Misc tab
|
||||
"privacy-title": "Impostazioni privacy",
|
||||
"unpause-title": "Premendo play, imposta il tuo stato su \"pronto\" e:",
|
||||
"unpause-ifalreadyready-option": "Riprendi la riproduzione se eri già pronto",
|
||||
"unpause-ifothersready-option": "Riprendi la riproduzione se eri già pronto o se gli altri partecipanti sono pronti (default)",
|
||||
"unpause-ifminusersready-option": "Riprendi la riproduzione se eri già pronto o se un numero minimo di partecipanti è pronto",
|
||||
"unpause-always": "Riprendi sempre la riproduzione",
|
||||
"showosdwarnings-label" : "Mostra gli avvisi (es. file differenti, utenti non pronti)",
|
||||
"showsameroomosd-label" : "Mostra gli eventi della tua stanza",
|
||||
"shownoncontrollerosd-label" : "Mostra gli eventi dei non gestori nelle stanze gestite",
|
||||
"showdifferentroomosd-label" : "Mostra gli eventi di altre stanze",
|
||||
"showslowdownosd-label" : "Mostra le notifiche di rallentamento / riavvolgimento",
|
||||
"language-label" : "Lingua:",
|
||||
"automatic-language" : "Predefinita ({})", # Default language
|
||||
"showdurationnotification-label" : "Avvisa in caso di mancata corrispondenza della durata del file",
|
||||
"basics-label" : "Generali",
|
||||
"readiness-label" : "Play/Pausa",
|
||||
"misc-label" : "Varie",
|
||||
"core-behaviour-title" : "Comportamento principale della stanza",
|
||||
"syncplay-internals-title" : "Funzionamento di Syncplay",
|
||||
"syncplay-mediasearchdirectories-title" : "Cartelle contenenti i file multimediali",
|
||||
"syncplay-mediasearchdirectories-label" : "Cartelle contenenti i file multimediali (un solo percorso per riga)",
|
||||
"sync-label" : "Sincronia", # don't have better options as the label won't fit in the panel.
|
||||
"sync-otherslagging-title" : "Se gli altri partecipanti non sono sincronizzati...",
|
||||
"sync-youlaggging-title" : "Se tu sei non sei sincronizzato...",
|
||||
"messages-label" : "Messaggi",
|
||||
"messages-osd-title" : "Impostazioni On-Screen Display",
|
||||
"messages-other-title" : "Altre impostazioni dello schermo",
|
||||
"chat-label" : "Chat",
|
||||
"privacy-label" : "Privacy", # Currently unused, but will be brought back if more space is needed in Misc tab
|
||||
"privacy-title" : "Impostazioni privacy",
|
||||
"unpause-title" : "Premendo play, imposta il tuo stato su \"pronto\" e:",
|
||||
"unpause-ifalreadyready-option" : "Riprendi la riproduzione se eri già pronto",
|
||||
"unpause-ifothersready-option" : "Riprendi la riproduzione se eri già pronto o se gli altri partecipanti sono pronti (default)",
|
||||
"unpause-ifminusersready-option" : "Riprendi la riproduzione se eri già pronto o se un numero minimo di partecipanti è pronto",
|
||||
"unpause-always" : "Riprendi sempre la riproduzione",
|
||||
"syncplay-trusteddomains-title": "Domini fidati (per streaming e i contenuti in rete)",
|
||||
|
||||
"chat-title": "Inserimento messaggi di chat",
|
||||
"chatinputenabled-label": "Abilita la chat su mpv",
|
||||
"chatdirectinput-label": "Abilita la chat istantanea (evita di dover premere Invio per chattare)",
|
||||
"chatinputfont-label": "Font dell'input della chat",
|
||||
"chatfont-label": "Imposta font",
|
||||
"chatcolour-label": "Imposta colore",
|
||||
"chatinputposition-label": "Posizione dell'area di inserimento testo in mpv",
|
||||
"chat-top-option": "In alto",
|
||||
"chat-middle-option": "Al centro",
|
||||
"chat-bottom-option": "In basso",
|
||||
"chatoutputheader-label": "Output messaggi di chat",
|
||||
"chat-title" : "Inserimento messaggi di chat",
|
||||
"chatinputenabled-label" : "Abilita la chat su mpv",
|
||||
"chatdirectinput-label" : "Abilita la chat istantanea (evita di dover premere Invio per chattare)",
|
||||
"chatinputfont-label" : "Font dell'input della chat",
|
||||
"chatfont-label" : "Imposta font",
|
||||
"chatcolour-label" : "Imposta colore",
|
||||
"chatinputposition-label" : "Posizione dell'area di inserimento testo in mpv",
|
||||
"chat-top-option" : "In alto",
|
||||
"chat-middle-option" : "Al centro",
|
||||
"chat-bottom-option" : "In basso",
|
||||
"chatoutputheader-label" : "Output messaggi di chat",
|
||||
"chatoutputfont-label": "Font dell'output della chat",
|
||||
"chatoutputenabled-label": "Abilita l'output della chat nel media player (al momento solo mpv è supportato)",
|
||||
"chatoutputposition-label": "Modalità di output",
|
||||
@ -263,136 +263,136 @@ it = {
|
||||
"alphakey-mode-warning-first-line": "Puoi utilizzare temporaneamente i vecchi comandi di mpv con i tasti a-z.",
|
||||
"alphakey-mode-warning-second-line": "Premi [TAB] per ritornare alla modalità chat di Syncplay.",
|
||||
|
||||
"help-label": "Aiuto",
|
||||
"reset-label": "Elimina configurazione",
|
||||
"run-label": "Avvia Syncplay",
|
||||
"storeandrun-label": "Salva la configurazione e avvia Syncplay",
|
||||
"help-label" : "Aiuto",
|
||||
"reset-label" : "Elimina configurazione",
|
||||
"run-label" : "Avvia Syncplay",
|
||||
"storeandrun-label" : "Salva la configurazione e avvia Syncplay",
|
||||
|
||||
"contact-label": "Sentiti libero di inviare un'e-mail a <a href=\"mailto:dev@syncplay.pl\"><nobr>dev@syncplay.pl</nobr></a>, chattare tramite il <a href=\"https://webchat.freenode.net/?channels=#syncplay\"><nobr>canale IRC #Syncplay</nobr></a> su irc.freenode.net, <a href=\"https://github.com/Uriziel/syncplay/issues\"><nobr>segnalare un problema</nobr></a> su GitHub, <a href=\"https://www.facebook.com/SyncplaySoftware\"><nobr>lasciare un like sulla nostra pagina Facebook</nobr></a>, <a href=\"https://twitter.com/Syncplay/\"><nobr>seguirci su Twitter</nobr></a>, o visitare <a href=\"https://syncplay.pl/\"><nobr>https://syncplay.pl/</nobr></a>. NOTA: i messaggi di chat non sono cifrati, quindi non usare Syncplay per inviare dati sensibili.",
|
||||
"contact-label" : "Sentiti libero di inviare un'e-mail a <a href=\"mailto:dev@syncplay.pl\"><nobr>dev@syncplay.pl</nobr></a>, chattare tramite il <a href=\"https://webchat.freenode.net/?channels=#syncplay\"><nobr>canale IRC #Syncplay</nobr></a> su irc.freenode.net, <a href=\"https://github.com/Uriziel/syncplay/issues\"><nobr>segnalare un problema</nobr></a> su GitHub, <a href=\"https://www.facebook.com/SyncplaySoftware\"><nobr>lasciare un like sulla nostra pagina Facebook</nobr></a>, <a href=\"https://twitter.com/Syncplay/\"><nobr>seguirci su Twitter</nobr></a>, o visitare <a href=\"https://syncplay.pl/\"><nobr>https://syncplay.pl/</nobr></a>. NOTA: i messaggi di chat non sono cifrati, quindi non usare Syncplay per inviare dati sensibili.",
|
||||
|
||||
"joinroom-label": "Entra nella stanza",
|
||||
"joinroom-menu-label": "Entra nella stanza {}",
|
||||
"seektime-menu-label": "Vai a...",
|
||||
"undoseek-menu-label": "Annulla vai a...",
|
||||
"play-menu-label": "Play",
|
||||
"pause-menu-label": "Pausa",
|
||||
"playbackbuttons-menu-label": "Mostra i controlli della riproduzione",
|
||||
"autoplay-menu-label": "Mostra il tasto di riproduzione automatica",
|
||||
"autoplay-guipushbuttonlabel": "Riproduci quando tutti sono pronti",
|
||||
"autoplay-minimum-label": "Minimo utenti pronti:",
|
||||
"joinroom-label" : "Entra nella stanza",
|
||||
"joinroom-menu-label" : "Entra nella stanza {}",
|
||||
"seektime-menu-label" : "Vai a...",
|
||||
"undoseek-menu-label" : "Annulla vai a...",
|
||||
"play-menu-label" : "Play",
|
||||
"pause-menu-label" : "Pausa",
|
||||
"playbackbuttons-menu-label" : "Mostra i controlli della riproduzione",
|
||||
"autoplay-menu-label" : "Mostra il tasto di riproduzione automatica",
|
||||
"autoplay-guipushbuttonlabel" : "Riproduci quando tutti sono pronti",
|
||||
"autoplay-minimum-label" : "Minimo utenti pronti:",
|
||||
|
||||
"sendmessage-label": "Invia",
|
||||
"sendmessage-label" : "Invia",
|
||||
|
||||
"ready-guipushbuttonlabel": "Sono pronto a guardare!",
|
||||
"ready-guipushbuttonlabel" : "Sono pronto a guardare!",
|
||||
|
||||
"roomuser-heading-label": "Stanza / Utente",
|
||||
"size-heading-label": "Dimensione",
|
||||
"duration-heading-label": "Durata",
|
||||
"filename-heading-label": "Nome del file",
|
||||
"notifications-heading-label": "Notifiche",
|
||||
"userlist-heading-label": "Lista degli utenti nella stanza",
|
||||
"roomuser-heading-label" : "Stanza / Utente",
|
||||
"size-heading-label" : "Dimensione",
|
||||
"duration-heading-label" : "Durata",
|
||||
"filename-heading-label" : "Nome del file",
|
||||
"notifications-heading-label" : "Notifiche",
|
||||
"userlist-heading-label" : "Lista degli utenti nella stanza",
|
||||
|
||||
"browseformedia-label": "Seleziona i file multimediali",
|
||||
"browseformedia-label" : "Seleziona i file multimediali",
|
||||
|
||||
"file-menu-label": "&File", # & precedes shortcut key
|
||||
"openmedia-menu-label": "&Apri file multimediali",
|
||||
"openstreamurl-menu-label": "Apri indirizzo di &rete",
|
||||
"setmediadirectories-menu-label": "Imposta &cartelle multimediali",
|
||||
"exit-menu-label": "&Esci",
|
||||
"advanced-menu-label": "&Avanzate",
|
||||
"window-menu-label": "&Finestra",
|
||||
"setoffset-menu-label": "Imposta &offset",
|
||||
"createcontrolledroom-menu-label": "&Crea stanza gestita",
|
||||
"identifyascontroller-menu-label": "&Identificati come operatore della stanza",
|
||||
"settrusteddomains-menu-label": "Imposta &domini fidati",
|
||||
"addtrusteddomain-menu-label": "Aggiungi {} come dominio fidato", # Domain
|
||||
"file-menu-label" : "&File", # & precedes shortcut key
|
||||
"openmedia-menu-label" : "&Apri file multimediali",
|
||||
"openstreamurl-menu-label" : "Apri indirizzo di &rete",
|
||||
"setmediadirectories-menu-label" : "Imposta &cartelle multimediali",
|
||||
"exit-menu-label" : "&Esci",
|
||||
"advanced-menu-label" : "&Avanzate",
|
||||
"window-menu-label" : "&Finestra",
|
||||
"setoffset-menu-label" : "Imposta &offset",
|
||||
"createcontrolledroom-menu-label" : "&Crea stanza gestita",
|
||||
"identifyascontroller-menu-label" : "&Identificati come operatore della stanza",
|
||||
"settrusteddomains-menu-label" : "Imposta &domini fidati",
|
||||
"addtrusteddomain-menu-label" : "Aggiungi {} come dominio fidato", # Domain
|
||||
|
||||
"playback-menu-label": "&Riproduzione",
|
||||
"playback-menu-label" : "&Riproduzione",
|
||||
|
||||
"help-menu-label": "&Aiuto",
|
||||
"userguide-menu-label": "Apri guida &utente",
|
||||
"update-menu-label": "Controlla la presenza di &aggiornamenti",
|
||||
"help-menu-label" : "&Aiuto",
|
||||
"userguide-menu-label" : "Apri guida &utente",
|
||||
"update-menu-label" : "Controlla la presenza di &aggiornamenti",
|
||||
|
||||
# About dialog
|
||||
#About dialog
|
||||
"about-menu-label": "&Informazioni su Syncplay",
|
||||
"about-dialog-title": "Informazioni su Syncplay",
|
||||
"about-dialog-release": "Versione {} release {}",
|
||||
"about-dialog-license-text": "Rilasciato sotto Apache License, Version 2.0",
|
||||
"about-dialog-license-text" : "Rilasciato sotto Apache License, Version 2.0",
|
||||
"about-dialog-license-button": "Licenza",
|
||||
"about-dialog-dependencies": "Dipendenze",
|
||||
|
||||
"setoffset-msgbox-label": "Imposta offset",
|
||||
"offsetinfo-msgbox-label": "Offset (vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
"setoffset-msgbox-label" : "Imposta offset",
|
||||
"offsetinfo-msgbox-label" : "Offset (vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
|
||||
"promptforstreamurl-msgbox-label": "Apri URL",
|
||||
"promptforstreamurlinfo-msgbox-label": "Indirizzo di rete",
|
||||
"promptforstreamurl-msgbox-label" : "Apri URL",
|
||||
"promptforstreamurlinfo-msgbox-label" : "Indirizzo di rete",
|
||||
|
||||
"addfolder-label": "Aggiungi cartella",
|
||||
"addfolder-label" : "Aggiungi cartella",
|
||||
|
||||
"adduris-msgbox-label": "Aggiungi gli indirizzi alla playlist (uno per riga)",
|
||||
"editplaylist-msgbox-label": "Imposta playlist (una per riga)",
|
||||
"trusteddomains-msgbox-label": "Domini a cui è lecito passare automaticamente (uno per riga)",
|
||||
"adduris-msgbox-label" : "Aggiungi gli indirizzi alla playlist (uno per riga)",
|
||||
"editplaylist-msgbox-label" : "Imposta playlist (una per riga)",
|
||||
"trusteddomains-msgbox-label" : "Domini a cui è lecito passare automaticamente (uno per riga)",
|
||||
|
||||
"createcontrolledroom-msgbox-label": "Crea stanza gestita",
|
||||
"controlledroominfo-msgbox-label": "Inserisci il nome della stanza gestita\r\n(vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
"createcontrolledroom-msgbox-label" : "Crea stanza gestita",
|
||||
"controlledroominfo-msgbox-label" : "Inserisci il nome della stanza gestita\r\n(vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
|
||||
"identifyascontroller-msgbox-label": "Identificati come operatore della stanza",
|
||||
"identifyinfo-msgbox-label": "Inserisci la password dell'operatore per questa stanza\r\n(vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
"identifyascontroller-msgbox-label" : "Identificati come operatore della stanza",
|
||||
"identifyinfo-msgbox-label" : "Inserisci la password dell'operatore per questa stanza\r\n(vedi https://syncplay.pl/guide/ per istruzioni):",
|
||||
|
||||
"public-server-msgbox-label": "Seleziona il server pubblico per questa sessione",
|
||||
"public-server-msgbox-label" : "Seleziona il server pubblico per questa sessione",
|
||||
|
||||
"megabyte-suffix": " MB",
|
||||
"megabyte-suffix" : " MB",
|
||||
|
||||
# Tooltips
|
||||
|
||||
"host-tooltip": "Hostname o indirizzo IP a cui collegarsi e, se necessario, includere la porta (es. syncplay.pl:8999). La sincronizzazione avviene solo con gli utenti collegati allo stesso server/porta.",
|
||||
"name-tooltip": "Il nome utente con cui sarai riconosciuto. Nessuna registrazione necessaria, cosi potrai sempre cambiarlo. Se lasciato vuoto, viene scelto un nome casuale.",
|
||||
"password-tooltip": "La password è necessaria solo in caso di connessione a server privati.",
|
||||
"room-tooltip": "La stanza in cui entrare dopo la connessione. Può assumere qualsiasi nome, ma ricorda che sarai sincronizzato solo con gli utenti nella stessa stanza.",
|
||||
"host-tooltip" : "Hostname o indirizzo IP a cui collegarsi e, se necessario, includere la porta (es. syncplay.pl:8999). La sincronizzazione avviene solo con gli utenti collegati allo stesso server/porta.",
|
||||
"name-tooltip" : "Il nome utente con cui sarai riconosciuto. Nessuna registrazione necessaria, cosi potrai sempre cambiarlo. Se lasciato vuoto, viene scelto un nome casuale.",
|
||||
"password-tooltip" : "La password è necessaria solo in caso di connessione a server privati.",
|
||||
"room-tooltip" : "La stanza in cui entrare dopo la connessione. Può assumere qualsiasi nome, ma ricorda che sarai sincronizzato solo con gli utenti nella stessa stanza.",
|
||||
|
||||
"executable-path-tooltip": "Percorso del media player desiderato (scegliere tra mpv, VLC, MPC-HC/BE or mplayer2).",
|
||||
"media-path-tooltip": "Percorso del video o stream da aprire. Necessario per mplayer2.",
|
||||
"player-arguments-tooltip": "Argomenti da linea di comando aggiuntivi da passare al media player scelto.",
|
||||
"mediasearcdirectories-arguments-tooltip": "Cartelle dove Syncplay cercherà i file multimediali, es. quando usi la funzione click to switch. Syncplay cercherà anche nelle sottocartelle.",
|
||||
"executable-path-tooltip" : "Percorso del media player desiderato (scegliere tra mpv, VLC, MPC-HC/BE or mplayer2).",
|
||||
"media-path-tooltip" : "Percorso del video o stream da aprire. Necessario per mplayer2.",
|
||||
"player-arguments-tooltip" : "Argomenti da linea di comando aggiuntivi da passare al media player scelto.",
|
||||
"mediasearcdirectories-arguments-tooltip" : "Cartelle dove Syncplay cercherà i file multimediali, es. quando usi la funzione click to switch. Syncplay cercherà anche nelle sottocartelle.",
|
||||
|
||||
"more-tooltip": "Mostra le impostazioni usate meno frequentemente.",
|
||||
"filename-privacy-tooltip": "Modalità di invio al server del nome del file attualmente in riproduzione.",
|
||||
"filesize-privacy-tooltip": "Modalità di invio al server della dimensione del file attualmente in riproduzione.",
|
||||
"privacy-sendraw-tooltip": "Invia questa informazione in chiaro. Questa è l'impostazione predefinita per la maggior parte delle funzionalità.",
|
||||
"privacy-sendhashed-tooltip": "Invia una versione cifrata dell'informazione, rendendola meno visibile agli altri client.",
|
||||
"privacy-dontsend-tooltip": "Non inviare questa informazione al server. Questo garantisce massima privacy.",
|
||||
"checkforupdatesautomatically-tooltip": "Controlla regolarmente la presenza di nuove versioni di Syncplay.",
|
||||
"slowondesync-tooltip": "Riduce temporaneamente la velocità di riproduzione quando c'è bisogno di sincronizzarti con gli altri utenti. Non supportato su MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip": "Gli altri utenti non vengono rallentati se non sei sincronizzato. Utile per i gestori della stanza.",
|
||||
"pauseonleave-tooltip": "Mette in pausa la riproduzione se vieni disconnesso o se qualcuno lascia la stanza.",
|
||||
"readyatstart-tooltip": "Imposta il tuo stato su \"pronto\" all'avvio (in caso contrario, sarai su \"non pronto\" finché non cambierai il tuo stato)",
|
||||
"forceguiprompt-tooltip": "La finestra di configurazione non viene mostrata quando apri Syncplay.",
|
||||
"nostore-tooltip": "Avvia Syncplay con la configurazione scelta, ma non salva le impostazioni.",
|
||||
"rewindondesync-tooltip": "Torna indietro quando necessario per ristabilire la sincronizzazione. Disabilitare quest'opzione può causare gravi problemi di sincronizzazione!",
|
||||
"fastforwardondesync-tooltip": "Avanza rapidamente quando non sei sincronizzato col gestore della stanza (usa una posizione fittizia se 'Non rallentare o riavvolgere gli altri utenti' è abilitato).",
|
||||
"showosd-tooltip": "Invia i messaggi di Syncplay al media player tramite OSD.",
|
||||
"showosdwarnings-tooltip": "Mostra gli avvisi in caso di riproduzione di un file differente, se sei l'unico utente nella stanza, se ci sono utenti non pronti, ecc.",
|
||||
"showsameroomosd-tooltip": "Mostra le notifiche OSD per gli eventi relativi alla stanza in cui si trova l'utente.",
|
||||
"shownoncontrollerosd-tooltip": "Mostra le notifiche OSD per gli eventi relativi ai non operatori presenti nelle stanze gestite.",
|
||||
"showdifferentroomosd-tooltip": "Mostra le notifiche OSD per gli eventi relativi alle stanze in cui l'utente non si trova.",
|
||||
"showslowdownosd-tooltip": "Mostra le notifiche di rallentamento / riavvolgimento in caso di differenza temporale.",
|
||||
"showdurationnotification-tooltip": "Utile quando manca un segmento di un file con più parti. Può causare dei falsi positivi.",
|
||||
"language-tooltip": "Lingua da utilizzare in Syncplay.",
|
||||
"unpause-always-tooltip": "Se riprendi la riproduzione, il tuo stato cambia in \"pronto\" e la riproduzione viene avviata, piuttosto che impostarti solo su pronto.",
|
||||
"unpause-ifalreadyready-tooltip": "Se riprendi la riproduzione quando non sei \"pronto\", verrai impostato su pronto - ripeti il comando ancora una volta per avviare la riproduzione.",
|
||||
"unpause-ifothersready-tooltip": "Se riprendi la riproduzione quando non sei \"pronto\" la riproduzione verrà avviata solo se gli altri sono pronti.",
|
||||
"unpause-ifminusersready-tooltip": "Se riprendi la riproduzione quando non sei \"pronto\", la riproduzione verrà avviata solo se un numero minimo di utenti è \"pronto\".",
|
||||
"trusteddomains-arguments-tooltip": "Domini verso cui è possibile collegarsi automaticamente quando le playlist condivise sono abilitate.",
|
||||
"more-tooltip" : "Mostra le impostazioni usate meno frequentemente.",
|
||||
"filename-privacy-tooltip" : "Modalità di invio al server del nome del file attualmente in riproduzione.",
|
||||
"filesize-privacy-tooltip" : "Modalità di invio al server della dimensione del file attualmente in riproduzione.",
|
||||
"privacy-sendraw-tooltip" : "Invia questa informazione in chiaro. Questa è l'impostazione predefinita per la maggior parte delle funzionalità.",
|
||||
"privacy-sendhashed-tooltip" : "Invia una versione cifrata dell'informazione, rendendola meno visibile agli altri client.",
|
||||
"privacy-dontsend-tooltip" : "Non inviare questa informazione al server. Questo garantisce massima privacy.",
|
||||
"checkforupdatesautomatically-tooltip" : "Controlla regolarmente la presenza di nuove versioni di Syncplay.",
|
||||
"slowondesync-tooltip" : "Riduce temporaneamente la velocità di riproduzione quando c'è bisogno di sincronizzarti con gli altri utenti. Non supportato su MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip" : "Gli altri utenti non vengono rallentati se non sei sincronizzato. Utile per i gestori della stanza.",
|
||||
"pauseonleave-tooltip" : "Mette in pausa la riproduzione se vieni disconnesso o se qualcuno lascia la stanza.",
|
||||
"readyatstart-tooltip" : "Imposta il tuo stato su \"pronto\" all'avvio (in caso contrario, sarai su \"non pronto\" finché non cambierai il tuo stato)",
|
||||
"forceguiprompt-tooltip" : "La finestra di configurazione non viene mostrata quando apri Syncplay.",
|
||||
"nostore-tooltip" : "Avvia Syncplay con la configurazione scelta, ma non salva le impostazioni.",
|
||||
"rewindondesync-tooltip" : "Torna indietro quando necessario per ristabilire la sincronizzazione. Disabilitare quest'opzione può causare gravi problemi di sincronizzazione!",
|
||||
"fastforwardondesync-tooltip" : "Avanza rapidamente quando non sei sincronizzato col gestore della stanza (usa una posizione fittizia se 'Non rallentare o riavvolgere gli altri utenti' è abilitato).",
|
||||
"showosd-tooltip" : "Invia i messaggi di Syncplay al media player tramite OSD.",
|
||||
"showosdwarnings-tooltip" : "Mostra gli avvisi in caso di riproduzione di un file differente, se sei l'unico utente nella stanza, se ci sono utenti non pronti, ecc.",
|
||||
"showsameroomosd-tooltip" : "Mostra le notifiche OSD per gli eventi relativi alla stanza in cui si trova l'utente.",
|
||||
"shownoncontrollerosd-tooltip" : "Mostra le notifiche OSD per gli eventi relativi ai non operatori presenti nelle stanze gestite.",
|
||||
"showdifferentroomosd-tooltip" : "Mostra le notifiche OSD per gli eventi relativi alle stanze in cui l'utente non si trova.",
|
||||
"showslowdownosd-tooltip" : "Mostra le notifiche di rallentamento / riavvolgimento in caso di differenza temporale.",
|
||||
"showdurationnotification-tooltip" : "Utile quando manca un segmento di un file con più parti. Può causare dei falsi positivi.",
|
||||
"language-tooltip" : "Lingua da utilizzare in Syncplay.",
|
||||
"unpause-always-tooltip" : "Se riprendi la riproduzione, il tuo stato cambia in \"pronto\" e la riproduzione viene avviata, piuttosto che impostarti solo su pronto.",
|
||||
"unpause-ifalreadyready-tooltip" : "Se riprendi la riproduzione quando non sei \"pronto\", verrai impostato su pronto - ripeti il comando ancora una volta per avviare la riproduzione.",
|
||||
"unpause-ifothersready-tooltip" : "Se riprendi la riproduzione quando non sei \"pronto\" la riproduzione verrà avviata solo se gli altri sono pronti.",
|
||||
"unpause-ifminusersready-tooltip" : "Se riprendi la riproduzione quando non sei \"pronto\", la riproduzione verrà avviata solo se un numero minimo di utenti è \"pronto\".",
|
||||
"trusteddomains-arguments-tooltip" : "Domini verso cui è possibile collegarsi automaticamente quando le playlist condivise sono abilitate.",
|
||||
|
||||
"chatinputenabled-tooltip": "Abilita l'input della chat in mpv (premi Invio per chattare, per inviare ed Esc per cancellare)",
|
||||
"chatdirectinput-tooltip": "Evita di dover premere Invio per aprire l'input della chat in mpv. Premi TAB in mpv per disabilitare temporaneamente questa funzione.",
|
||||
"font-label-tooltip": "Font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"set-input-font-tooltip": "Font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"set-input-colour-tooltip": "Colore del font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"chatinputposition-tooltip": "Posizione dell'input della chat in mpv quando premi Invio.",
|
||||
"chatinputposition-top-tooltip": "Posiziona l'input della chat in cima alla finestra di mpv.",
|
||||
"chatinputposition-middle-tooltip": "Posizione l'input della chat al centro della finestra di mpv.",
|
||||
"chatinputposition-bottom-tooltip": "Posiziona l'input della chat in basso alla finestra di mpv.",
|
||||
"chatinputenabled-tooltip" : "Abilita l'input della chat in mpv (premi Invio per chattare, per inviare ed Esc per cancellare)",
|
||||
"chatdirectinput-tooltip" : "Evita di dover premere Invio per aprire l'input della chat in mpv. Premi TAB in mpv per disabilitare temporaneamente questa funzione.",
|
||||
"font-label-tooltip" : "Font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"set-input-font-tooltip" : "Font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"set-input-colour-tooltip" : "Colore del font usato nell'input della chat in mpv. Non influenza cosa vedono gli altri, vale solo per te.",
|
||||
"chatinputposition-tooltip" : "Posizione dell'input della chat in mpv quando premi Invio.",
|
||||
"chatinputposition-top-tooltip" : "Posiziona l'input della chat in cima alla finestra di mpv.",
|
||||
"chatinputposition-middle-tooltip" : "Posizione l'input della chat al centro della finestra di mpv.",
|
||||
"chatinputposition-bottom-tooltip" : "Posiziona l'input della chat in basso alla finestra di mpv.",
|
||||
"chatoutputenabled-tooltip": "Mostra i messaggi di chat nell'OSD (se supportato dal media player).",
|
||||
"font-output-label-tooltip": "Font dell'output della chat.",
|
||||
"set-output-font-tooltip": "Font usato per mostrare i messaggi di chat.",
|
||||
@ -400,80 +400,80 @@ it = {
|
||||
"chatoutputmode-chatroom-tooltip": "Mostra i nuovi messaggi di chat al di sotto di quelli precedenti.",
|
||||
"chatoutputmode-scrolling-tooltip": "Scorri il testo della chat da destra a sinistra.",
|
||||
|
||||
"help-tooltip": "Apri la guida utente su syncplay.pl.",
|
||||
"reset-tooltip": "Ripristina le impostazioni iniziali di Syncplay.",
|
||||
"update-server-list-tooltip": "Scarica la lista dei server pubblici da syncplay.pl.",
|
||||
"help-tooltip" : "Apri la guida utente su syncplay.pl.",
|
||||
"reset-tooltip" : "Ripristina le impostazioni iniziali di Syncplay.",
|
||||
"update-server-list-tooltip" : "Scarica la lista dei server pubblici da syncplay.pl.",
|
||||
|
||||
"joinroom-tooltip": "Lascia la stanza attuale e entra in quella specificata.",
|
||||
"seektime-msgbox-label": "Salta all'istante di tempo specificato (in secondi / min:sec). Usa +/- per una ricerca relativa.",
|
||||
"ready-tooltip": "Indica quando sei pronto a guardare.",
|
||||
"autoplay-tooltip": "Avvia la riproduzione automatica quando il numero minimo di utenti è pronto.",
|
||||
"switch-to-file-tooltip": "Doppio click per passare a {}", # Filename
|
||||
"sendmessage-tooltip": "Invia il messaggio alla stanza",
|
||||
"joinroom-tooltip" : "Lascia la stanza attuale e entra in quella specificata.",
|
||||
"seektime-msgbox-label" : "Salta all'istante di tempo specificato (in secondi / min:sec). Usa +/- per una ricerca relativa.",
|
||||
"ready-tooltip" : "Indica quando sei pronto a guardare.",
|
||||
"autoplay-tooltip" : "Avvia la riproduzione automatica quando il numero minimo di utenti è pronto.",
|
||||
"switch-to-file-tooltip" : "Doppio click per passare a {}", # Filename
|
||||
"sendmessage-tooltip" : "Invia il messaggio alla stanza",
|
||||
|
||||
# In-userlist notes (GUI)
|
||||
"differentsize-note": "Dimensione file diversa!",
|
||||
"differentsizeandduration-note": "Durata e dimensione file diversi!",
|
||||
"differentduration-note": "Durata diversa!",
|
||||
"nofile-note": "(Nessun file in riproduzione)",
|
||||
"differentsize-note" : "Dimensione file diversa!",
|
||||
"differentsizeandduration-note" : "Durata e dimensione file diversi!",
|
||||
"differentduration-note" : "Durata diversa!",
|
||||
"nofile-note" : "(Nessun file in riproduzione)",
|
||||
|
||||
# Server messages to client
|
||||
"new-syncplay-available-motd-message": "<NOTICE> Stai usando Syncplay {} ma una nuova versione è disponibile presso https://syncplay.pl </NOTICE>", # ClientVersion
|
||||
"new-syncplay-available-motd-message" : "<NOTICE> Stai usando Syncplay {} ma una nuova versione è disponibile presso https://syncplay.pl </NOTICE>", # ClientVersion
|
||||
|
||||
# Server notifications
|
||||
"welcome-server-notification": "Benvenuto nel server Syncplay, ver. {0}", # version
|
||||
"client-connected-room-server-notification": "{0}({2}) connesso alla stanza '{1}'", # username, host, room
|
||||
"client-left-server-notification": "{0} ha lasciato il server", # name
|
||||
"no-salt-notification": "NOTA BENE: In futuro, per consentire il corretto funzionamento delle password generate da questo server (per le stanze gestite), aggiungi da linea di comando il seguente argomento prima di avviare il server Syncplay: --salt {}", # Salt
|
||||
"welcome-server-notification" : "Benvenuto nel server Syncplay, ver. {0}", # version
|
||||
"client-connected-room-server-notification" : "{0}({2}) connesso alla stanza '{1}'", # username, host, room
|
||||
"client-left-server-notification" : "{0} ha lasciato il server", # name
|
||||
"no-salt-notification" : "NOTA BENE: In futuro, per consentire il corretto funzionamento delle password generate da questo server (per le stanze gestite), aggiungi da linea di comando il seguente argomento prima di avviare il server Syncplay: --salt {}", #Salt
|
||||
|
||||
|
||||
# Server arguments
|
||||
"server-argument-description": 'Programma per sincronizzare la riproduzione di media player multipli attraverso la rete. Modulo server.',
|
||||
"server-argument-epilog": 'Se non è specificata alcuna opzione saranno utilizzati i valori _config',
|
||||
"server-port-argument": 'Porta TCP del server',
|
||||
"server-password-argument": 'password del server',
|
||||
"server-isolate-room-argument": 'Mantiene le stanze isolate',
|
||||
"server-salt-argument": "usare stringhe casuali per generare le password delle stanze gestite",
|
||||
"server-disable-ready-argument": "disabilita la funzionalità \"pronto\"",
|
||||
"server-argument-description" : 'Programma per sincronizzare la riproduzione di media player multipli attraverso la rete. Modulo server.',
|
||||
"server-argument-epilog" : 'Se non è specificata alcuna opzione saranno utilizzati i valori _config',
|
||||
"server-port-argument" : 'Porta TCP del server',
|
||||
"server-password-argument" : 'password del server',
|
||||
"server-isolate-room-argument" : 'Mantiene le stanze isolate',
|
||||
"server-salt-argument" : "usare stringhe casuali per generare le password delle stanze gestite",
|
||||
"server-disable-ready-argument" : "disabilita la funzionalità \"pronto\"",
|
||||
"server-motd-argument": "percorso del file da cui verrà letto il messaggio del giorno",
|
||||
"server-chat-argument": "abilita o disabilita la chat",
|
||||
"server-chat-maxchars-argument": "Numero massimo di caratteri in un messaggio di chat (default è {})", # Default number of characters
|
||||
"server-chat-argument" : "abilita o disabilita la chat",
|
||||
"server-chat-maxchars-argument" : "Numero massimo di caratteri in un messaggio di chat (default è {})", # Default number of characters
|
||||
"server-maxusernamelength-argument": "Maximum number of charactrs in a username (default is {})", # TODO: Translate
|
||||
"server-messed-up-motd-unescaped-placeholders": "Il messaggio del giorno ha dei caratteri non 'escaped'. Tutti i simboli $ devono essere doppi ($$).",
|
||||
"server-messed-up-motd-too-long": "Il messaggio del giorno è troppo lungo - numero massimo di caratteri è {}, {} trovati.",
|
||||
|
||||
# Server errors
|
||||
"unknown-command-server-error": "Comando non riconosciuto {}", # message
|
||||
"not-json-server-error": "Non è una stringa in codifica JSON {}", # message
|
||||
"not-known-server-error": "Devi essere autenticato dal server prima di poter inviare questo comando",
|
||||
"client-drop-server-error": "Il client è caduto: {} -- {}", # host, error
|
||||
"password-required-server-error": "È richiesta una password",
|
||||
"wrong-password-server-error": "La password inserita è errata",
|
||||
"hello-server-error": "Not enough Hello arguments", # DO NOT TRANSLATE
|
||||
"unknown-command-server-error" : "Comando non riconosciuto {}", # message
|
||||
"not-json-server-error" : "Non è una stringa in codifica JSON {}", # message
|
||||
"not-known-server-error" : "Devi essere autenticato dal server prima di poter inviare questo comando",
|
||||
"client-drop-server-error" : "Il client è caduto: {} -- {}", # host, error
|
||||
"password-required-server-error" : "È richiesta una password",
|
||||
"wrong-password-server-error" : "La password inserita è errata",
|
||||
"hello-server-error" : "Not enough Hello arguments", #DO NOT TRANSLATE
|
||||
|
||||
# Playlists
|
||||
"playlist-selection-changed-notification": "{} ha cambiato il file selezionato nella playlist", # Username
|
||||
"playlist-contents-changed-notification": "{} ha aggiornato la playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error": "Impossibile trovare il file {} nelle cartelle multimediali per permettere il cambio di file tramite la playlist!", # Filename
|
||||
"cannot-add-duplicate-error": "Impossibile aggiungere una seconda voce per '{}' alla playlist. Non è possibile avere file duplicati.", # Filename
|
||||
"cannot-add-unsafe-path-error": "Impossibile caricare automaticamente {} perché non è presente nei domini fidati. Puoi passare all'inserimento manuale facendo doppio click sull'indirizzo nella playlist, oppure aggiungerlo ai domini fidati tramite File->Avanzate->Imposta domini fidati. Cliccando col tasto destro del mouse su un indirizzo puoi impostare il suo dominio come fidato tramite il menù contestuale.", # Filename
|
||||
"sharedplaylistenabled-label": "Abilita le playlist condivise",
|
||||
"removefromplaylist-menu-label": "Rimuovi dalla playlist",
|
||||
"shuffleremainingplaylist-menu-label": "Mescola i file non ancora riprodotti",
|
||||
"shuffleentireplaylist-menu-label": "Mescola l'intera playlist",
|
||||
"undoplaylist-menu-label": "Annulla l'ultima modifica alla playlist",
|
||||
"addfilestoplaylist-menu-label": "Aggiungi un file alla fine della playlist",
|
||||
"addurlstoplaylist-menu-label": "Aggiungi un indirizzo alla fine della playlist",
|
||||
"playlist-selection-changed-notification" : "{} ha cambiato il file selezionato nella playlist", # Username
|
||||
"playlist-contents-changed-notification" : "{} ha aggiornato la playlist", # Username
|
||||
"cannot-find-file-for-playlist-switch-error" : "Impossibile trovare il file {} nelle cartelle multimediali per permettere il cambio di file tramite la playlist!", # Filename
|
||||
"cannot-add-duplicate-error" : "Impossibile aggiungere una seconda voce per '{}' alla playlist. Non è possibile avere file duplicati.", #Filename
|
||||
"cannot-add-unsafe-path-error" : "Impossibile caricare automaticamente {} perché non è presente nei domini fidati. Puoi passare all'inserimento manuale facendo doppio click sull'indirizzo nella playlist, oppure aggiungerlo ai domini fidati tramite File->Avanzate->Imposta domini fidati. Cliccando col tasto destro del mouse su un indirizzo puoi impostare il suo dominio come fidato tramite il menù contestuale.", # Filename
|
||||
"sharedplaylistenabled-label" : "Abilita le playlist condivise",
|
||||
"removefromplaylist-menu-label" : "Rimuovi dalla playlist",
|
||||
"shuffleremainingplaylist-menu-label" : "Mescola i file non ancora riprodotti",
|
||||
"shuffleentireplaylist-menu-label" : "Mescola l'intera playlist",
|
||||
"undoplaylist-menu-label" : "Annulla l'ultima modifica alla playlist",
|
||||
"addfilestoplaylist-menu-label" : "Aggiungi un file alla fine della playlist",
|
||||
"addurlstoplaylist-menu-label" : "Aggiungi un indirizzo alla fine della playlist",
|
||||
"editplaylist-menu-label": "Modifica la playlist",
|
||||
|
||||
"open-containing-folder": "Apri la cartella contenente questo file",
|
||||
"addusersfiletoplaylist-menu-label": "Aggiungi il file {} alla playlist", # item owner indicator # TODO needs testing
|
||||
"addusersstreamstoplaylist-menu-label": "Aggiungi l'indirizzo {} alla playlist", # item owner indicator # TODO needs testing
|
||||
"openusersstream-menu-label": "Apri l'indirizzo di {}", # [username]'s
|
||||
"openusersfile-menu-label": "Apri il file di {}", # [username]'s
|
||||
"item-is-yours-indicator": "tuo", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist # TODO needs testing
|
||||
"item-is-others-indicator": "di {}", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist # TODO needs testing
|
||||
"addusersfiletoplaylist-menu-label" : "Aggiungi il file {} alla playlist", # item owner indicator # TODO needs testing
|
||||
"addusersstreamstoplaylist-menu-label" : "Aggiungi l'indirizzo {} alla playlist", # item owner indicator # TODO needs testing
|
||||
"openusersstream-menu-label" : "Apri l'indirizzo di {}", # [username]'s
|
||||
"openusersfile-menu-label" : "Apri il file di {}", # [username]'s
|
||||
"item-is-yours-indicator" : "tuo", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist # TODO needs testing
|
||||
"item-is-others-indicator" : "di {}", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist # TODO needs testing
|
||||
|
||||
"playlist-instruction-item-message": "Trascina qui i file per aggiungerli alla playlist condivisa.",
|
||||
"sharedplaylistenabled-tooltip": "Gli operatori della stanza possono aggiungere i file a una playlist sincronizzata per garantire che tutti i partecipanti stiano guardando la stessa cosa. Configura le cartelle multimediali alla voce 'Miscellanea'.",
|
||||
"playlist-instruction-item-message" : "Trascina qui i file per aggiungerli alla playlist condivisa.",
|
||||
"sharedplaylistenabled-tooltip" : "Gli operatori della stanza possono aggiungere i file a una playlist sincronizzata per garantire che tutti i partecipanti stiano guardando la stessa cosa. Configura le cartelle multimediali alla voce 'Miscellanea'.",
|
||||
}
|
||||
|
||||
@ -3,137 +3,137 @@
|
||||
"""Russian dictionary"""
|
||||
|
||||
ru = {
|
||||
"LANGUAGE": "Русский", # (Russian)
|
||||
"LANGUAGE" : "Русский", # (Russian)
|
||||
|
||||
# Client notifications
|
||||
"config-cleared-notification": "Настройки сброшены. Изменения вступят в силу при сохранении корректной конфигурации.",
|
||||
"config-cleared-notification" : "Настройки сброшены. Изменения вступят в силу при сохранении корректной конфигурации.",
|
||||
|
||||
"relative-config-notification": "Загружены файлы относительной конфигурации: {}",
|
||||
"relative-config-notification" : "Загружены файлы относительной конфигурации: {}",
|
||||
|
||||
"connection-attempt-notification": "Подключение к {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification": "Соединение с сервером потеряно, переподключение",
|
||||
"disconnection-notification": "Отключились от сервера",
|
||||
"connection-failed-notification": "Не удалось подключиться к серверу",
|
||||
"connected-successful-notification": "Соединение с сервером установлено",
|
||||
"retrying-notification": "%s, следующая попытка через %d секунд(ы)...", # Seconds
|
||||
"connection-attempt-notification" : "Подключение к {}:{}", # Port, IP
|
||||
"reconnection-attempt-notification" : "Соединение с сервером потеряно, переподключение",
|
||||
"disconnection-notification" : "Отключились от сервера",
|
||||
"connection-failed-notification" : "Не удалось подключиться к серверу",
|
||||
"connected-successful-notification" : "Соединение с сервером установлено",
|
||||
"retrying-notification" : "%s, следующая попытка через %d секунд(ы)...", # Seconds
|
||||
|
||||
"rewind-notification": "Перемотано из-за разницы во времени с {}", # User
|
||||
"fastforward-notification": "Ускорено из-за разницы во времени с {}", # User
|
||||
"slowdown-notification": "Воспроизведение замедлено из-за разницы во времени с {}", # User
|
||||
"revert-notification": "Возвращаемся к нормальной скорости воспроизведения",
|
||||
"rewind-notification" : "Перемотано из-за разницы во времени с {}", # User
|
||||
"fastforward-notification" : "Ускорено из-за разницы во времени с {}", # User
|
||||
"slowdown-notification" : "Воспроизведение замедлено из-за разницы во времени с {}", # User
|
||||
"revert-notification" : "Возвращаемся к нормальной скорости воспроизведения",
|
||||
|
||||
"pause-notification": "{} приостановил воспроизведение", # User
|
||||
"unpause-notification": "{} возобновил воспроизведение", # User
|
||||
"seek-notification": "{} перемотал с {} на {}", # User, from time, to time
|
||||
"pause-notification" : "{} приостановил воспроизведение", # User
|
||||
"unpause-notification" : "{} возобновил воспроизведение", # User
|
||||
"seek-notification" : "{} перемотал с {} на {}", # User, from time, to time
|
||||
|
||||
"current-offset-notification": "Текущее смещение: {} секунд(ы)", # Offset
|
||||
"current-offset-notification" : "Текущее смещение: {} секунд(ы)", # Offset
|
||||
|
||||
"media-directory-list-updated-notification": "Папки воспроизведения обновлены.",
|
||||
"media-directory-list-updated-notification" : "Папки воспроизведения обновлены.",
|
||||
|
||||
"room-join-notification": "{} зашел в комнату: '{}'", # User
|
||||
"left-notification": "{} покинул комнату", # User
|
||||
"left-paused-notification": "{} покинул комнату, {} приостановил воспроизведение", # User who left, User who paused
|
||||
"playing-notification": "{} включил '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum": " в комнате: '{}'", # Room
|
||||
"room-join-notification" : "{} зашел в комнату: '{}'", # User
|
||||
"left-notification" : "{} покинул комнату", # User
|
||||
"left-paused-notification" : "{} покинул комнату, {} приостановил воспроизведение", # User who left, User who paused
|
||||
"playing-notification" : "{} включил '{}' ({})", # User, file, duration
|
||||
"playing-notification/room-addendum" : " в комнате: '{}'", # Room
|
||||
|
||||
"not-all-ready": "Не готовы: {}", # Usernames
|
||||
"all-users-ready": "Все зрители готовы ({} чел.)", # Number of ready users
|
||||
"ready-to-unpause-notification": "Вы помечены как готовый - нажмите еще раз, чтобы продолжить воспроизведение",
|
||||
"set-as-ready-notification": "Вы помечены как готовый",
|
||||
"set-as-not-ready-notification": "Вы помечены как неготовый",
|
||||
"autoplaying-notification": "Автовоспроизведение через {}...", # Number of seconds until playback will start
|
||||
"not-all-ready" : "Не готовы: {}", # Usernames
|
||||
"all-users-ready" : "Все зрители готовы ({} чел.)", #Number of ready users
|
||||
"ready-to-unpause-notification" : "Вы помечены как готовый - нажмите еще раз, чтобы продолжить воспроизведение",
|
||||
"set-as-ready-notification" : "Вы помечены как готовый",
|
||||
"set-as-not-ready-notification" : "Вы помечены как неготовый",
|
||||
"autoplaying-notification" : "Автовоспроизведение через {}...", # Number of seconds until playback will start
|
||||
|
||||
"identifying-as-controller-notification": "Идентификация как оператора комнаты с паролем '{}'...",
|
||||
"failed-to-identify-as-controller-notification": "{} не прошел идентификацию в качестве оператора комнаты.",
|
||||
"authenticated-as-controller-notification": "{} вошел как оператор комнаты.",
|
||||
"created-controlled-room-notification": "Создана управляемая комната '{}' с паролем '{}'. Сохраните эти данные!", # RoomName, operatorPassword
|
||||
"identifying-as-controller-notification" : "Идентификация как оператора комнаты с паролем '{}'...",
|
||||
"failed-to-identify-as-controller-notification" : "{} не прошел идентификацию в качестве оператора комнаты.",
|
||||
"authenticated-as-controller-notification" : "{} вошел как оператор комнаты.",
|
||||
"created-controlled-room-notification" : "Создана управляемая комната '{}' с паролем '{}'. Сохраните эти данные!", # RoomName, operatorPassword
|
||||
|
||||
"file-different-notification": "Вероятно, файл, который Вы смотрите, отличается от того, который смотрит {}.", # User
|
||||
"file-differences-notification": "Ваш файл отличается: {}", # Differences
|
||||
"room-file-differences": "Несовпадения файла: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename": "имя",
|
||||
"file-difference-filesize": "размер",
|
||||
"file-difference-duration": "длительность",
|
||||
"alone-in-the-room": "В комнате кроме Вас никого нет.",
|
||||
"file-different-notification" : "Вероятно, файл, который Вы смотрите, отличается от того, который смотрит {}.", # User
|
||||
"file-differences-notification" : "Ваш файл отличается: {}", # Differences
|
||||
"room-file-differences" : "Несовпадения файла: {}", # File differences (filename, size, and/or duration)
|
||||
"file-difference-filename" : "имя",
|
||||
"file-difference-filesize" : "размер",
|
||||
"file-difference-duration" : "длительность",
|
||||
"alone-in-the-room" : "В комнате кроме Вас никого нет.",
|
||||
|
||||
"different-filesize-notification": " (размер Вашего файла не совпадает с размером их файла!)",
|
||||
"userlist-playing-notification": "{} смотрит:", # Username
|
||||
"file-played-by-notification": "Файл: {} просматривают:", # File
|
||||
"no-file-played-notification": "{} не смотрит ничего", # Username
|
||||
"notplaying-notification": "Люди, которые не смотрят ничего:",
|
||||
"userlist-room-notification": "В комнате '{}':", # Room
|
||||
"userlist-file-notification": "Файл",
|
||||
"controller-userlist-userflag": "Оператор",
|
||||
"ready-userlist-userflag": "Готов",
|
||||
"different-filesize-notification" : " (размер Вашего файла не совпадает с размером их файла!)",
|
||||
"userlist-playing-notification" : "{} смотрит:", #Username
|
||||
"file-played-by-notification" : "Файл: {} просматривают:", # File
|
||||
"no-file-played-notification" : "{} не смотрит ничего", # Username
|
||||
"notplaying-notification" : "Люди, которые не смотрят ничего:",
|
||||
"userlist-room-notification" : "В комнате '{}':", # Room
|
||||
"userlist-file-notification" : "Файл",
|
||||
"controller-userlist-userflag" : "Оператор",
|
||||
"ready-userlist-userflag" : "Готов",
|
||||
|
||||
"update-check-failed-notification": "Невозможно автоматически проверить, что версия Syncplay {} все еще актуальна. Хотите зайти на https://syncplay.pl/ и вручную проверить наличие обновлений?",
|
||||
"syncplay-uptodate-notification": "У вас последняя версия Syncplay",
|
||||
"syncplay-updateavailable-notification": "Доступна новая версия Syncplay. Хотите открыть страницу релиза?",
|
||||
"update-check-failed-notification" : "Невозможно автоматически проверить, что версия Syncplay {} все еще актуальна. Хотите зайти на https://syncplay.pl/ и вручную проверить наличие обновлений?",
|
||||
"syncplay-uptodate-notification" : "У вас последняя версия Syncplay",
|
||||
"syncplay-updateavailable-notification" : "Доступна новая версия Syncplay. Хотите открыть страницу релиза?",
|
||||
|
||||
"mplayer-file-required-notification": "Для использования Syncplay с mplayer необходимо передать файл в качестве параметра",
|
||||
"mplayer-file-required-notification/example": "Пример использования: syncplay [options] [url|path/]filename",
|
||||
"mplayer2-required": "Syncplay не совместим с MPlayer 1.x, пожалуйста, используйте mplayer2 или mpv",
|
||||
"mplayer-file-required-notification" : "Для использования Syncplay с mplayer необходимо передать файл в качестве параметра",
|
||||
"mplayer-file-required-notification/example" : "Пример использования: syncplay [options] [url|path/]filename",
|
||||
"mplayer2-required" : "Syncplay не совместим с MPlayer 1.x, пожалуйста, используйте mplayer2 или mpv",
|
||||
|
||||
"unrecognized-command-notification": "Неизвестная команда.",
|
||||
"commandlist-notification": "Доступные команды:",
|
||||
"commandlist-notification/room": "\tr [name] - сменить комнату",
|
||||
"commandlist-notification/list": "\tl - показать список пользователей",
|
||||
"commandlist-notification/undo": "\tu - отменить последнюю перемотку",
|
||||
"commandlist-notification/pause": "\tp - вкл./выкл. паузу",
|
||||
"commandlist-notification/seek": "\t[s][+-]time - перемотать к заданному моменту времени, если не указан + или -, то время считается абсолютным (от начала файла) в секундах или мин:сек",
|
||||
"commandlist-notification/help": "\th - помощь",
|
||||
"commandlist-notification/toggle": "\tt - переключить статус готов/не готов к просмотру",
|
||||
"commandlist-notification/create": "\tc [name] - создать управляемую комнату с таким же именем, как у текущей",
|
||||
"commandlist-notification/auth": "\ta [password] - авторизоваться как оператор комнаты с помощью пароля",
|
||||
"commandlist-notification/chat": "\tch [message] - send a chat message in a room", # TODO: Translate
|
||||
"syncplay-version-notification": "Версия Syncplay: {}", # syncplay.version
|
||||
"more-info-notification": "Больше информации на {}", # projectURL
|
||||
"unrecognized-command-notification" : "Неизвестная команда.",
|
||||
"commandlist-notification" : "Доступные команды:",
|
||||
"commandlist-notification/room" : "\tr [name] - сменить комнату",
|
||||
"commandlist-notification/list" : "\tl - показать список пользователей",
|
||||
"commandlist-notification/undo" : "\tu - отменить последнюю перемотку",
|
||||
"commandlist-notification/pause" : "\tp - вкл./выкл. паузу",
|
||||
"commandlist-notification/seek" : "\t[s][+-]time - перемотать к заданному моменту времени, если не указан + или -, то время считается абсолютным (от начала файла) в секундах или мин:сек",
|
||||
"commandlist-notification/help" : "\th - помощь",
|
||||
"commandlist-notification/toggle" : "\tt - переключить статус готов/не готов к просмотру",
|
||||
"commandlist-notification/create" : "\tc [name] - создать управляемую комнату с таким же именем, как у текущей",
|
||||
"commandlist-notification/auth" : "\ta [password] - авторизоваться как оператор комнаты с помощью пароля",
|
||||
"commandlist-notification/chat" : "\tch [message] - send a chat message in a room", # TODO: Translate
|
||||
"syncplay-version-notification" : "Версия Syncplay: {}", # syncplay.version
|
||||
"more-info-notification" : "Больше информации на {}", # projectURL
|
||||
|
||||
"gui-data-cleared-notification": "Syncplay очистил путь и информацию о состоянии окна, использованного GUI.",
|
||||
"language-changed-msgbox-label": "Язык переключится при следующем запуске Syncplay.",
|
||||
"promptforupdate-label": "Вы не против, если Syncplay будет автоматически изредка проверять наличие обновлений?",
|
||||
"gui-data-cleared-notification" : "Syncplay очистил путь и информацию о состоянии окна, использованного GUI.",
|
||||
"language-changed-msgbox-label" : "Язык переключится при следующем запуске Syncplay.",
|
||||
"promptforupdate-label" : "Вы не против, если Syncplay будет автоматически изредка проверять наличие обновлений?",
|
||||
|
||||
"vlc-version-mismatch": "Syncplay не поддерживает данную версию VLC. Syncplay поддерживает VLC {}+, но не VLC 3. Используйте другой проигрыватель.", # VLC min version
|
||||
"vlc-interface-version-mismatch": "Вы используете модуль интерфейса Syncplay устаревшей версии {} для VLC. К сожалению, Syncplay способен работать с версией {} и выше. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.", # VLC interface version, VLC interface min version
|
||||
"vlc-interface-oldversion-warning": "Внимание: Syncplay обнаружил, что старая версия модуля интерфейса Syncplay для VLC уже установлена в директорию VLC. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.",
|
||||
"vlc-interface-not-installed": "Внимание: Модуль интерфейса Syncplay для VLC не обнаружен в директории VLC. По существу, если Вы используете VLC 2.0, то VLC будет использовать модуль syncplay.lua из директории Syncplay, но в таком случае другие пользовательские скрипты и расширения интерфейса не будут работать. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.",
|
||||
"vlc-interface-version-mismatch" : "Вы используете модуль интерфейса Syncplay устаревшей версии {} для VLC. К сожалению, Syncplay способен работать с версией {} и выше. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.", # VLC interface version, VLC interface min version
|
||||
"vlc-interface-oldversion-warning" : "Внимание: Syncplay обнаружил, что старая версия модуля интерфейса Syncplay для VLC уже установлена в директорию VLC. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.",
|
||||
"vlc-interface-not-installed" : "Внимание: Модуль интерфейса Syncplay для VLC не обнаружен в директории VLC. По существу, если Вы используете VLC 2.0, то VLC будет использовать модуль syncplay.lua из директории Syncplay, но в таком случае другие пользовательские скрипты и расширения интерфейса не будут работать. Пожалуйста, обратитесь к Руководству Пользователя Syncplay (https://syncplay.pl/guide/) за инструкциями о том, как установить syncplay.lua.",
|
||||
"media-player-latency-warning": "Внимание: У Вашего проигрывателя слишком большой отклик ({} секунд). Если Вы замечаете проблемы с синхронизацией, то закройте ресурсоемкие приложения. Если это не помогло - попробуйте другой проигрыватель.", # Seconds to respond
|
||||
"mpv-unresponsive-error": "mpv не отвечает {} секунд, по-видимому, произошел сбой. Пожалуйста, перезапустите Syncplay.", # Seconds to respond
|
||||
|
||||
# Client prompts
|
||||
"enter-to-exit-prompt": "Для выхода нажмите Enter\n",
|
||||
"enter-to-exit-prompt" : "Для выхода нажмите Enter\n",
|
||||
|
||||
# Client errors
|
||||
"missing-arguments-error": "Некоторые необходимые аргументы отсутствуют, обратитесь к --help",
|
||||
"server-timeout-error": "Подключение к серверу превысило лимит времени",
|
||||
"mpc-slave-error": "Невозможно запустить MPC в slave режиме!",
|
||||
"mpc-version-insufficient-error": "Версия MPC слишком старая, пожалуйста, используйте `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error": "Версия MPC слишком старая, пожалуйста, используйте `mpc-be` >= `{}`",
|
||||
"mpv-version-error": "Syncplay не совместим с данной версией mpv. Пожалуйста, используйте другую версию mpv (лучше свежайшую).",
|
||||
"player-file-open-error": "Проигрыватель не может открыть файл.",
|
||||
"player-path-error": "Путь к проигрывателю задан неверно. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", # TODO: Translate last sentence
|
||||
"hostname-empty-error": "Имя пользователя не может быть пустым.",
|
||||
"empty-error": "{} не может быть пустым.", # Configuration
|
||||
"media-player-error": "Ошибка проигрывателя: \"{}\"", # Error line
|
||||
"unable-import-gui-error": "Невозможно импортировать библиотеки GUI (графического интерфейса). Необходимо установить PySide, иначе графический интерфейс не будет работать.",
|
||||
"missing-arguments-error" : "Некоторые необходимые аргументы отсутствуют, обратитесь к --help",
|
||||
"server-timeout-error" : "Подключение к серверу превысило лимит времени",
|
||||
"mpc-slave-error" : "Невозможно запустить MPC в slave режиме!",
|
||||
"mpc-version-insufficient-error" : "Версия MPC слишком старая, пожалуйста, используйте `mpc-hc` >= `{}`",
|
||||
"mpc-be-version-insufficient-error" : "Версия MPC слишком старая, пожалуйста, используйте `mpc-be` >= `{}`",
|
||||
"mpv-version-error" : "Syncplay не совместим с данной версией mpv. Пожалуйста, используйте другую версию mpv (лучше свежайшую).",
|
||||
"player-file-open-error" : "Проигрыватель не может открыть файл.",
|
||||
"player-path-error" : "Путь к проигрывателю задан неверно. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", # TODO: Translate last sentence
|
||||
"hostname-empty-error" : "Имя пользователя не может быть пустым.",
|
||||
"empty-error" : "{} не может быть пустым.", # Configuration
|
||||
"media-player-error" : "Ошибка проигрывателя: \"{}\"", # Error line
|
||||
"unable-import-gui-error" : "Невозможно импортировать библиотеки GUI (графического интерфейса). Необходимо установить PySide, иначе графический интерфейс не будет работать.",
|
||||
|
||||
"arguments-missing-error": "Некоторые необходимые аргументы отсутствуют, обратитесь к --help",
|
||||
"arguments-missing-error" : "Некоторые необходимые аргументы отсутствуют, обратитесь к --help",
|
||||
|
||||
"unable-to-start-client-error": "Невозможно запустить клиент",
|
||||
"unable-to-start-client-error" : "Невозможно запустить клиент",
|
||||
|
||||
"player-path-config-error": "Путь к проигрывателю установлен неверно. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", # To do: Translate end
|
||||
"no-file-path-config-error": "Файл должен быть указан до включения проигрывателя",
|
||||
"no-file-path-config-error" : "Файл должен быть указан до включения проигрывателя",
|
||||
"no-hostname-config-error": "Имя сервера не может быть пустым",
|
||||
"invalid-port-config-error": "Неверный номер порта",
|
||||
"empty-value-config-error": "Поле '{}' не может быть пустым", # Config option
|
||||
"invalid-port-config-error" : "Неверный номер порта",
|
||||
"empty-value-config-error" : "Поле '{}' не может быть пустым", # Config option
|
||||
|
||||
"not-json-error": "Не является закодированной json-строкой\n",
|
||||
"hello-arguments-error": "Не хватает аргументов Hello\n",
|
||||
"version-mismatch-error": "Конфликт версий между клиентом и сервером\n",
|
||||
"vlc-failed-connection": "Ошибка подключения к VLC. Если у Вас не установлен syncplay.lua, то обратитесь к https://syncplay.pl/LUA/ за инструкциями.",
|
||||
"vlc-failed-noscript": "VLC сообщает, что скрипт интерфейса syncplay.lua не установлен. Пожалуйста, обратитесь к https://syncplay.pl/LUA/ за инструкциями.",
|
||||
"vlc-failed-versioncheck": "Данная версия VLC не поддерживается Syncplay. Пожалуйста, используйте VLC версии 2 или выше.",
|
||||
"vlc-failed-other": "Во время загрузки скрипта интерфейса syncplay.lua в VLC произошла следующая ошибка: {}", # Syncplay Error
|
||||
"not-json-error" : "Не является закодированной json-строкой\n",
|
||||
"hello-arguments-error" : "Не хватает аргументов Hello\n",
|
||||
"version-mismatch-error" : "Конфликт версий между клиентом и сервером\n",
|
||||
"vlc-failed-connection" : "Ошибка подключения к VLC. Если у Вас не установлен syncplay.lua, то обратитесь к https://syncplay.pl/LUA/ за инструкциями.",
|
||||
"vlc-failed-noscript" : "VLC сообщает, что скрипт интерфейса syncplay.lua не установлен. Пожалуйста, обратитесь к https://syncplay.pl/LUA/ за инструкциями.",
|
||||
"vlc-failed-versioncheck" : "Данная версия VLC не поддерживается Syncplay. Пожалуйста, используйте VLC версии 2 или выше.",
|
||||
"vlc-failed-other" : "Во время загрузки скрипта интерфейса syncplay.lua в VLC произошла следующая ошибка: {}", # Syncplay Error
|
||||
|
||||
"feature-sharedPlaylists": "shared playlists", # used for not-supported-by-server-error # TODO: Translate
|
||||
"feature-chat": "chat", # used for not-supported-by-server-error # TODO: Translate
|
||||
@ -141,113 +141,113 @@ ru = {
|
||||
"feature-managedRooms": "managed rooms", # used for not-supported-by-server-error # TODO: Translate
|
||||
|
||||
"not-supported-by-server-error": "The {} feature is not supported by this server..", # feature # TODO: Translate
|
||||
# OLD TRANSLATION: "not-supported-by-server-error": u"Эта возможность не поддерживается сервером. Требуется сервер Syncplay {}+, вы подключены к серверу Syncplay {}.", # minVersion, serverVersion
|
||||
"shared-playlists-not-supported-by-server-error": "Общие списки воспроизведения могут не поддерживаться сервером. Для корректной работы требуется сервер Syncplay {}+, вы подключены к серверу Syncplay {}.", # minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error": "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.", # TODO: Translate
|
||||
#OLD TRANSLATION: "not-supported-by-server-error" : u"Эта возможность не поддерживается сервером. Требуется сервер Syncplay {}+, вы подключены к серверу Syncplay {}.", #minVersion, serverVersion
|
||||
"shared-playlists-not-supported-by-server-error" : "Общие списки воспроизведения могут не поддерживаться сервером. Для корректной работы требуется сервер Syncplay {}+, вы подключены к серверу Syncplay {}.", #minVersion, serverVersion
|
||||
"shared-playlists-disabled-by-server-error" : "The shared playlist feature has been disabled in the server configuration. To use this feature you will need to connect to a different server.", # TODO: Translate
|
||||
|
||||
"invalid-seek-value": "Некорректное значение для перемотки",
|
||||
"invalid-offset-value": "Некорректное смещение",
|
||||
"invalid-seek-value" : "Некорректное значение для перемотки",
|
||||
"invalid-offset-value" : "Некорректное смещение",
|
||||
|
||||
"switch-file-not-found-error": "Невозможно найти файл '{0}'. Проверьте папки воспроизведения.", # File not found
|
||||
"folder-search-timeout-error": "Поиск файла был прерван в папке '{}'. Это может происходить из-за большого количества подпапок. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку из списка, или замените её на нужную подпапку. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", # Folder # TODO: Translate last sentence
|
||||
"folder-search-first-file-timeout-error": "Поиск файла в '{}' был прерван, так как невозможно открыть каталог. Это может происходить, если это сетевой диск или диск перешел в режим экономии энергии. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку, или решите проблему через изменение параметров энергосбережения.", # Folder
|
||||
"added-file-not-in-media-directory-error": "Вы загрузили файл из '{}', который не числится в папках воспроизведения. Вы можете добавить его через выпадающее меню Файл->Папки воспроизведения.", # Folder
|
||||
"no-media-directories-error": "Вы не указали папки воспроизведения. Для корректной работы зайдите через выпадающее меню в Файл->Папки воспроизведения и укажите нужные каталоги.",
|
||||
"cannot-find-directory-error": "Не удалось найти папку воспроизведения '{}'. Для обновления списка папок, через выпадающее меню, перейдите в Файл->Папки воспроизведения и укажите нужные каталоги.",
|
||||
"switch-file-not-found-error" : "Невозможно найти файл '{0}'. Проверьте папки воспроизведения.", # File not found
|
||||
"folder-search-timeout-error" : "Поиск файла был прерван в папке '{}'. Это может происходить из-за большого количества подпапок. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку из списка, или замените её на нужную подпапку. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", #Folder # TODO: Translate last sentence
|
||||
"folder-search-first-file-timeout-error" : "Поиск файла в '{}' был прерван, так как невозможно открыть каталог. Это может происходить, если это сетевой диск или диск перешел в режим экономии энергии. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку, или решите проблему через изменение параметров энергосбережения.", #Folder
|
||||
"added-file-not-in-media-directory-error" : "Вы загрузили файл из '{}', который не числится в папках воспроизведения. Вы можете добавить его через выпадающее меню Файл->Папки воспроизведения.", #Folder
|
||||
"no-media-directories-error" : "Вы не указали папки воспроизведения. Для корректной работы зайдите через выпадающее меню в Файл->Папки воспроизведения и укажите нужные каталоги.",
|
||||
"cannot-find-directory-error" : "Не удалось найти папку воспроизведения '{}'. Для обновления списка папок, через выпадающее меню, перейдите в Файл->Папки воспроизведения и укажите нужные каталоги.",
|
||||
|
||||
"failed-to-load-server-list-error": "Не удалось загрузить список публичных серверов. Откройте https://www.syncplay.pl/ через браузер.",
|
||||
"failed-to-load-server-list-error" : "Не удалось загрузить список публичных серверов. Откройте https://www.syncplay.pl/ через браузер.",
|
||||
|
||||
# Client arguments
|
||||
"argument-description": 'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет.',
|
||||
"argument-epilog": 'Если параметр не будет передан, то будет использоваться значение, указанное в _config.',
|
||||
"nogui-argument": 'не использовать GUI',
|
||||
"host-argument": 'адрес сервера',
|
||||
"name-argument": 'желательное имя пользователя',
|
||||
"debug-argument": 'режим отладки',
|
||||
"force-gui-prompt-argument": 'показать окно настройки',
|
||||
"no-store-argument": 'не сохранять данные в .syncplay',
|
||||
"room-argument": 'начальная комната',
|
||||
"password-argument": 'пароль для доступа к серверу',
|
||||
"player-path-argument": 'путь к исполняемому файлу Вашего проигрывателя',
|
||||
"file-argument": 'воспроизводимый файл',
|
||||
"args-argument": 'параметры проигрывателя; если нужно передать параметры, начинающиеся с - , то сначала пишите \'--\'',
|
||||
"clear-gui-data-argument": 'сбрасывает путь и данные о состоянии окна GUI, хранимые как QSettings',
|
||||
"language-argument": 'язык сообщений Syncplay (de/en/ru)',
|
||||
"argument-description" : 'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет.',
|
||||
"argument-epilog" : 'Если параметр не будет передан, то будет использоваться значение, указанное в _config.',
|
||||
"nogui-argument" : 'не использовать GUI',
|
||||
"host-argument" : 'адрес сервера',
|
||||
"name-argument" : 'желательное имя пользователя',
|
||||
"debug-argument" : 'режим отладки',
|
||||
"force-gui-prompt-argument" : 'показать окно настройки',
|
||||
"no-store-argument" : 'не сохранять данные в .syncplay',
|
||||
"room-argument" : 'начальная комната',
|
||||
"password-argument" : 'пароль для доступа к серверу',
|
||||
"player-path-argument" : 'путь к исполняемому файлу Вашего проигрывателя',
|
||||
"file-argument" : 'воспроизводимый файл',
|
||||
"args-argument" : 'параметры проигрывателя; если нужно передать параметры, начинающиеся с - , то сначала пишите \'--\'',
|
||||
"clear-gui-data-argument" : 'сбрасывает путь и данные о состоянии окна GUI, хранимые как QSettings',
|
||||
"language-argument" : 'язык сообщений Syncplay (de/en/ru)',
|
||||
|
||||
"version-argument": 'выводит номер версии',
|
||||
"version-message": "Вы используете Syncplay версии {} ({})",
|
||||
"version-argument" : 'выводит номер версии',
|
||||
"version-message" : "Вы используете Syncplay версии {} ({})",
|
||||
|
||||
# Client labels
|
||||
"config-window-title": "Настройка Syncplay",
|
||||
"config-window-title" : "Настройка Syncplay",
|
||||
|
||||
"connection-group-title": "Подключение",
|
||||
"host-label": "Адрес сервера: ",
|
||||
"name-label": "Имя пользователя (не обязательно):",
|
||||
"password-label": "Пароль сервера (если требуется):",
|
||||
"room-label": "Комната:",
|
||||
"connection-group-title" : "Подключение",
|
||||
"host-label" : "Адрес сервера: ",
|
||||
"name-label" : "Имя пользователя (не обязательно):",
|
||||
"password-label" : "Пароль сервера (если требуется):",
|
||||
"room-label" : "Комната:",
|
||||
|
||||
"media-setting-title": "Воспроизведение",
|
||||
"executable-path-label": "Путь к проигрывателю:",
|
||||
"media-path-label": "Путь к видеофайлу:", # Todo: Translate to 'Path to video (optional)'
|
||||
"player-arguments-label": "Аргументы запуска проигрывателя:",
|
||||
"browse-label": "Выбрать",
|
||||
"update-server-list-label": "Обновить список",
|
||||
"media-setting-title" : "Воспроизведение",
|
||||
"executable-path-label" : "Путь к проигрывателю:",
|
||||
"media-path-label" : "Путь к видеофайлу:", # Todo: Translate to 'Path to video (optional)'
|
||||
"player-arguments-label" : "Аргументы запуска проигрывателя:",
|
||||
"browse-label" : "Выбрать",
|
||||
"update-server-list-label" : "Обновить список",
|
||||
|
||||
"more-title": "Больше настроек",
|
||||
"never-rewind-value": "Никогда",
|
||||
"seconds-suffix": " секунд(ы)",
|
||||
"privacy-sendraw-option": "отпр. как есть",
|
||||
"privacy-sendhashed-option": "отпр. хэш",
|
||||
"privacy-dontsend-option": "не отпр.",
|
||||
"filename-privacy-label": "Имя файла:",
|
||||
"filesize-privacy-label": "Размер файла:",
|
||||
"checkforupdatesautomatically-label": "Проверять обновления автоматически",
|
||||
"slowondesync-label": "Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC/BE)",
|
||||
"rewindondesync-label": "Перемотка при больших рассинхронизациях (настоятельно рекомендуется)",
|
||||
"dontslowdownwithme-label": "Никогда не замедлять и не перематывать видео другим (функция тестируется)",
|
||||
"pausing-title": "Приостановка",
|
||||
"pauseonleave-label": "Приостанавливать, когда кто-то уходит (например, отключился)",
|
||||
"readiness-title": "Готовность",
|
||||
"readyatstart-label": "Выставить статус 'Я готов' по умолчанию",
|
||||
"fastforwardondesync-label": "Ускорять видео при отставании (рекомендуется)",
|
||||
"forceguiprompt-label": "Не показывать больше этот диалог", # (Inverted)
|
||||
"showosd-label": "Включить экранные сообщения (поверх видео)",
|
||||
"more-title" : "Больше настроек",
|
||||
"never-rewind-value" : "Никогда",
|
||||
"seconds-suffix" : " секунд(ы)",
|
||||
"privacy-sendraw-option" : "отпр. как есть",
|
||||
"privacy-sendhashed-option" : "отпр. хэш",
|
||||
"privacy-dontsend-option" : "не отпр.",
|
||||
"filename-privacy-label" : "Имя файла:",
|
||||
"filesize-privacy-label" : "Размер файла:",
|
||||
"checkforupdatesautomatically-label" : "Проверять обновления автоматически",
|
||||
"slowondesync-label" : "Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC/BE)",
|
||||
"rewindondesync-label" : "Перемотка при больших рассинхронизациях (настоятельно рекомендуется)",
|
||||
"dontslowdownwithme-label" : "Никогда не замедлять и не перематывать видео другим (функция тестируется)",
|
||||
"pausing-title" : "Приостановка",
|
||||
"pauseonleave-label" : "Приостанавливать, когда кто-то уходит (например, отключился)",
|
||||
"readiness-title" : "Готовность",
|
||||
"readyatstart-label" : "Выставить статус 'Я готов' по умолчанию",
|
||||
"fastforwardondesync-label" : "Ускорять видео при отставании (рекомендуется)",
|
||||
"forceguiprompt-label" : "Не показывать больше этот диалог", # (Inverted)
|
||||
"showosd-label" : "Включить экранные сообщения (поверх видео)",
|
||||
|
||||
"showosdwarnings-label": "Показывать предупреждения (напр., когда файлы не совпадают)",
|
||||
"showsameroomosd-label": "Показывать события Вашей комнаты",
|
||||
"shownoncontrollerosd-label": "Включить события, связанные с не-операторами в управляемой комнате.",
|
||||
"showdifferentroomosd-label": "Показывать события других комнат",
|
||||
"showslowdownosd-label": "Показывать уведомления о замедлении/перемотке",
|
||||
"language-label": "Язык:",
|
||||
"automatic-language": "По умолчанию ({})", # Automatic language
|
||||
"showdurationnotification-label": "Предупреждать о несовпадении продолжительности видео",
|
||||
"basics-label": "Основное",
|
||||
"readiness-label": "Поведение",
|
||||
"misc-label": "Прочее",
|
||||
"core-behaviour-title": "Информация о файлах",
|
||||
"syncplay-internals-title": "Системные настройки",
|
||||
"syncplay-mediasearchdirectories-title": "Папки воспроизведения", # needs to be checked
|
||||
"syncplay-mediasearchdirectories-label": "Папки воспроизведения (один путь на строку)",
|
||||
"sync-label": "Синхронизация",
|
||||
"sync-otherslagging-title": "Опережение",
|
||||
"sync-youlaggging-title": "Отставание",
|
||||
"messages-label": "Сообщения",
|
||||
"messages-osd-title": "Настройки OSD",
|
||||
"messages-other-title": "Другие настройки отображения",
|
||||
"chat-label": "Chat", # TODO: Translate
|
||||
"privacy-label": "Приватность",
|
||||
"privacy-title": "Настройки приватности",
|
||||
"unpause-title": "Если вы стартуете, то:",
|
||||
"unpause-ifalreadyready-option": "Снять паузу, если уже готов",
|
||||
"unpause-ifothersready-option": "Снять паузу, если Вы и остальные в комнате готовы (по-умолчанию)",
|
||||
"unpause-ifminusersready-option": "Снять паузу, если все в комнате готовы и присутствует минимум зрителей",
|
||||
"unpause-always": "Всегда снимать паузу",
|
||||
"showosdwarnings-label" : "Показывать предупреждения (напр., когда файлы не совпадают)",
|
||||
"showsameroomosd-label" : "Показывать события Вашей комнаты",
|
||||
"shownoncontrollerosd-label" : "Включить события, связанные с не-операторами в управляемой комнате.",
|
||||
"showdifferentroomosd-label" : "Показывать события других комнат",
|
||||
"showslowdownosd-label" : "Показывать уведомления о замедлении/перемотке",
|
||||
"language-label" : "Язык:",
|
||||
"automatic-language" : "По умолчанию ({})", # Automatic language
|
||||
"showdurationnotification-label" : "Предупреждать о несовпадении продолжительности видео",
|
||||
"basics-label" : "Основное",
|
||||
"readiness-label" : "Поведение",
|
||||
"misc-label" : "Прочее",
|
||||
"core-behaviour-title" : "Информация о файлах",
|
||||
"syncplay-internals-title" : "Системные настройки",
|
||||
"syncplay-mediasearchdirectories-title" : "Папки воспроизведения", #needs to be checked
|
||||
"syncplay-mediasearchdirectories-label" : "Папки воспроизведения (один путь на строку)",
|
||||
"sync-label" : "Синхронизация",
|
||||
"sync-otherslagging-title" : "Опережение",
|
||||
"sync-youlaggging-title" : "Отставание",
|
||||
"messages-label" : "Сообщения",
|
||||
"messages-osd-title" : "Настройки OSD",
|
||||
"messages-other-title" : "Другие настройки отображения",
|
||||
"chat-label" : "Chat", # TODO: Translate
|
||||
"privacy-label" : "Приватность",
|
||||
"privacy-title" : "Настройки приватности",
|
||||
"unpause-title" : "Если вы стартуете, то:",
|
||||
"unpause-ifalreadyready-option" : "Снять паузу, если уже готов",
|
||||
"unpause-ifothersready-option" : "Снять паузу, если Вы и остальные в комнате готовы (по-умолчанию)",
|
||||
"unpause-ifminusersready-option" : "Снять паузу, если все в комнате готовы и присутствует минимум зрителей",
|
||||
"unpause-always" : "Всегда снимать паузу",
|
||||
"syncplay-trusteddomains-title": "Доверенные сайты (стрим-сервисы, видеохостинги, файлы в сети)",
|
||||
"addtrusteddomain-menu-label": "Добавить {} как доверенный сайт", # Domain
|
||||
"addtrusteddomain-menu-label" : "Добавить {} как доверенный сайт", # Domain
|
||||
|
||||
"chat-title": "Chat message input", # TODO: Translate
|
||||
"chatinputenabled-label": "Enable chat input via mpv (using enter key)", # TODO: Translate
|
||||
"chatdirectinput-label": "Allow instant chat input (bypass having to press enter key to chat)", # TODO: Translate
|
||||
"chatdirectinput-label" : "Allow instant chat input (bypass having to press enter key to chat)", # TODO: Translate
|
||||
"chatinputfont-label": "Chat input font", # TODO: Translate
|
||||
"chatfont-label": "Set font", # TODO: Translate
|
||||
"chatcolour-label": "Set colour", # TODO: Translate
|
||||
@ -255,7 +255,7 @@ ru = {
|
||||
"chat-top-option": "Top", # TODO: Translate
|
||||
"chat-middle-option": "Middle", # TODO: Translate
|
||||
"chat-bottom-option": "Bottom", # TODO: Translate
|
||||
"chatoutputheader-label": "Chat message output", # TODO: Traslate
|
||||
"chatoutputheader-label" : "Chat message output", # TODO: Traslate
|
||||
"chatoutputfont-label": "Chat output font", # TODO: Translate
|
||||
"chatoutputenabled-label": "Enable chat output in media player (mpv only for now)", # TODO: Translate
|
||||
"chatoutputposition-label": "Output mode", # TODO: Translate
|
||||
@ -267,128 +267,128 @@ ru = {
|
||||
"alphakey-mode-warning-first-line": "You can temporarily use old mpv bindings with a-z keys.", # TODO: Translate
|
||||
"alphakey-mode-warning-second-line": "Press [TAB] to return to Syncplay chat mode.", # TODO: Translate
|
||||
|
||||
"help-label": "Помощь",
|
||||
"reset-label": "Сброс настроек",
|
||||
"run-label": "Запустить",
|
||||
"storeandrun-label": "Сохранить и запустить",
|
||||
"help-label" : "Помощь",
|
||||
"reset-label" : "Сброс настроек",
|
||||
"run-label" : "Запустить",
|
||||
"storeandrun-label" : "Сохранить и запустить",
|
||||
|
||||
"contact-label": "Есть идея, нашли ошибку или хотите оставить отзыв? Пишите на <a href=\"mailto:dev@syncplay.pl\">dev@syncplay.pl</a>, в <a href=\"https://webchat.freenode.net/?channels=#syncplay\">IRC канал #Syncplay</a> на irc.freenode.net или <a href=\"https://github.com/Uriziel/syncplay/issues\">задавайте вопросы через GitHub</a>. Кроме того, заходите на <a href=\"https://syncplay.pl/\">www.syncplay.pl</a> за инорфмацией, помощью и обновлениями! NOTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.", # TODO: Translate last sentence
|
||||
"contact-label" : "Есть идея, нашли ошибку или хотите оставить отзыв? Пишите на <a href=\"mailto:dev@syncplay.pl\">dev@syncplay.pl</a>, в <a href=\"https://webchat.freenode.net/?channels=#syncplay\">IRC канал #Syncplay</a> на irc.freenode.net или <a href=\"https://github.com/Uriziel/syncplay/issues\">задавайте вопросы через GitHub</a>. Кроме того, заходите на <a href=\"https://syncplay.pl/\">www.syncplay.pl</a> за инорфмацией, помощью и обновлениями! NOTE: Chat messages are not encrypted so do not use Syncplay to send sensitive information.", # TODO: Translate last sentence
|
||||
|
||||
"joinroom-label": "Зайти в комнату",
|
||||
"joinroom-menu-label": "Зайти в комнату {}",
|
||||
"seektime-menu-label": "Пере&мотать",
|
||||
"undoseek-menu-label": "&Отменить перемотку",
|
||||
"play-menu-label": "&Старт",
|
||||
"pause-menu-label": "&Пауза",
|
||||
"playbackbuttons-menu-label": "&Показывать кнопки управления",
|
||||
"autoplay-menu-label": "Показывать кнопку &автовоспроизведения",
|
||||
"autoplay-guipushbuttonlabel": "Стартовать, когда все будут готовы",
|
||||
"autoplay-minimum-label": "Минимум зрителей:",
|
||||
"sendmessage-label": "Send", # TODO: Translate
|
||||
"joinroom-label" : "Зайти в комнату",
|
||||
"joinroom-menu-label" : "Зайти в комнату {}",
|
||||
"seektime-menu-label" : "Пере&мотать",
|
||||
"undoseek-menu-label" : "&Отменить перемотку",
|
||||
"play-menu-label" : "&Старт",
|
||||
"pause-menu-label" : "&Пауза",
|
||||
"playbackbuttons-menu-label" : "&Показывать кнопки управления",
|
||||
"autoplay-menu-label" : "Показывать кнопку &автовоспроизведения",
|
||||
"autoplay-guipushbuttonlabel" : "Стартовать, когда все будут готовы",
|
||||
"autoplay-minimum-label" : "Минимум зрителей:",
|
||||
"sendmessage-label" : "Send", # TODO: Translate
|
||||
|
||||
"ready-guipushbuttonlabel": "Я готов",
|
||||
"ready-guipushbuttonlabel" : "Я готов",
|
||||
|
||||
"roomuser-heading-label": "Комната / Зритель",
|
||||
"roomuser-heading-label" : "Комната / Зритель",
|
||||
|
||||
"size-heading-label": "Размер",
|
||||
"duration-heading-label": "Время",
|
||||
"filename-heading-label": "Имя файла",
|
||||
"notifications-heading-label": "Уведомления",
|
||||
"userlist-heading-label": "Кто что смотрит",
|
||||
"size-heading-label" : "Размер",
|
||||
"duration-heading-label" : "Время",
|
||||
"filename-heading-label" : "Имя файла",
|
||||
"notifications-heading-label" : "Уведомления",
|
||||
"userlist-heading-label" : "Кто что смотрит",
|
||||
|
||||
"browseformedia-label": "Выбрать файл",
|
||||
"browseformedia-label" : "Выбрать файл",
|
||||
|
||||
"file-menu-label": "&Файл", # & precedes shortcut key
|
||||
"openmedia-menu-label": "&Открыть файл",
|
||||
"openstreamurl-menu-label": "Открыть &ссылку",
|
||||
"setmediadirectories-menu-label": "&Папки воспроизведения",
|
||||
"exit-menu-label": "&Выход",
|
||||
"advanced-menu-label": "&Дополнительно",
|
||||
"window-menu-label": "&Вид",
|
||||
"setoffset-menu-label": "&Установить смещение",
|
||||
"createcontrolledroom-menu-label": "Создать управляемую &комнату",
|
||||
"identifyascontroller-menu-label": "&Войти как оператор комнаты",
|
||||
"settrusteddomains-menu-label": "Доверенные &сайты",
|
||||
"file-menu-label" : "&Файл", # & precedes shortcut key
|
||||
"openmedia-menu-label" : "&Открыть файл",
|
||||
"openstreamurl-menu-label" : "Открыть &ссылку",
|
||||
"setmediadirectories-menu-label" : "&Папки воспроизведения",
|
||||
"exit-menu-label" : "&Выход",
|
||||
"advanced-menu-label" : "&Дополнительно",
|
||||
"window-menu-label" : "&Вид",
|
||||
"setoffset-menu-label" : "&Установить смещение",
|
||||
"createcontrolledroom-menu-label" : "Создать управляемую &комнату",
|
||||
"identifyascontroller-menu-label" : "&Войти как оператор комнаты",
|
||||
"settrusteddomains-menu-label" : "Доверенные &сайты",
|
||||
|
||||
"playback-menu-label": "&Управление",
|
||||
"playback-menu-label" : "&Управление",
|
||||
|
||||
"help-menu-label": "&Помощь",
|
||||
"userguide-menu-label": "&Руководство пользователя",
|
||||
"update-menu-label": "Проверить &обновления",
|
||||
"help-menu-label" : "&Помощь",
|
||||
"userguide-menu-label" : "&Руководство пользователя",
|
||||
"update-menu-label" : "Проверить &обновления",
|
||||
|
||||
# About dialog - TODO: Translate
|
||||
#About dialog - TODO: Translate
|
||||
"about-menu-label": "&About Syncplay",
|
||||
"about-dialog-title": "About Syncplay",
|
||||
"about-dialog-release": "Version {} release {}",
|
||||
"about-dialog-license-text": "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-text" : "Licensed under the Apache License, Version 2.0",
|
||||
"about-dialog-license-button": "License",
|
||||
"about-dialog-dependencies": "Dependencies",
|
||||
|
||||
"setoffset-msgbox-label": "Установить смещение",
|
||||
"offsetinfo-msgbox-label": "Смещение (см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
"setoffset-msgbox-label" : "Установить смещение",
|
||||
"offsetinfo-msgbox-label" : "Смещение (см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
|
||||
"promptforstreamurl-msgbox-label": "Открыть ссылку",
|
||||
"promptforstreamurlinfo-msgbox-label": "Ссылка:",
|
||||
"promptforstreamurl-msgbox-label" : "Открыть ссылку",
|
||||
"promptforstreamurlinfo-msgbox-label" : "Ссылка:",
|
||||
|
||||
"addfolder-label": "Добавить папку",
|
||||
"addfolder-label" : "Добавить папку",
|
||||
|
||||
"adduris-msgbox-label": "Список ссылок (одна на строку)",
|
||||
"editplaylist-msgbox-label": "Список воспроизведения (один на строку)",
|
||||
"trusteddomains-msgbox-label": "Список доверенных сайтов для автоматического воспроизведения (один на строку)",
|
||||
"adduris-msgbox-label" : "Список ссылок (одна на строку)",
|
||||
"editplaylist-msgbox-label" : "Список воспроизведения (один на строку)",
|
||||
"trusteddomains-msgbox-label" : "Список доверенных сайтов для автоматического воспроизведения (один на строку)",
|
||||
|
||||
"createcontrolledroom-msgbox-label": "Создать управляемую комнату",
|
||||
"controlledroominfo-msgbox-label": "Введите имя управляемой комнаты\r\n(см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
"createcontrolledroom-msgbox-label" : "Создать управляемую комнату",
|
||||
"controlledroominfo-msgbox-label" : "Введите имя управляемой комнаты\r\n(см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
|
||||
"identifyascontroller-msgbox-label": "Войти как оператор комнаты",
|
||||
"identifyinfo-msgbox-label": "Введите пароль оператора комнаты\r\n(см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
"identifyascontroller-msgbox-label" : "Войти как оператор комнаты",
|
||||
"identifyinfo-msgbox-label" : "Введите пароль оператора комнаты\r\n(см. инструкцию на странице www.syncplay.pl/guide):",
|
||||
|
||||
"public-server-msgbox-label": "Выбите публичный сервер для данной сессии",
|
||||
"public-server-msgbox-label" : "Выбите публичный сервер для данной сессии",
|
||||
|
||||
"megabyte-suffix": " МБ", # Technically it is a mebibyte
|
||||
"megabyte-suffix" : " МБ", # Technically it is a mebibyte
|
||||
|
||||
# Tooltips
|
||||
|
||||
"host-tooltip": "Имя или IP-адрес, к которому будет произведено подключение, может содержать номер порта (напр., syncplay.pl:8999). Синхронизация возможна только в рамках одного сервера/порта.",
|
||||
"name-tooltip": "Имя, под которым Вы будете известны. Регистриция не требуется, так что имя пользователя можно легко сменить в любой момент. Будет сгенерировано случайным образом, если не указать.",
|
||||
"password-tooltip": "Пароли нужны для подключения к приватным серверам.",
|
||||
"room-tooltip": "Комната, в которую Вы попадете сразу после подключения. Синхронизация возможна только между людьми в одной и той же комнате.",
|
||||
"host-tooltip" : "Имя или IP-адрес, к которому будет произведено подключение, может содержать номер порта (напр., syncplay.pl:8999). Синхронизация возможна только в рамках одного сервера/порта.",
|
||||
"name-tooltip" : "Имя, под которым Вы будете известны. Регистриция не требуется, так что имя пользователя можно легко сменить в любой момент. Будет сгенерировано случайным образом, если не указать.",
|
||||
"password-tooltip" : "Пароли нужны для подключения к приватным серверам.",
|
||||
"room-tooltip" : "Комната, в которую Вы попадете сразу после подключения. Синхронизация возможна только между людьми в одной и той же комнате.",
|
||||
|
||||
"executable-path-tooltip": "Расположение Вашего видеопроигрывателя (MPC-HC, MPC-BE, VLC, mplayer2 или mpv).",
|
||||
"media-path-tooltip": "Расположение видеофайла или потока для просмотра. Обязательно для mplayer2.", # TODO: Confirm translation
|
||||
"player-arguments-tooltip": "Передавать дополнительные аргументы командной строки этому проигрывателю.",
|
||||
"mediasearcdirectories-arguments-tooltip": "Папки, где Syncplay будет искать медиа файлы, включая подпапки.",
|
||||
"executable-path-tooltip" : "Расположение Вашего видеопроигрывателя (MPC-HC, MPC-BE, VLC, mplayer2 или mpv).",
|
||||
"media-path-tooltip" : "Расположение видеофайла или потока для просмотра. Обязательно для mplayer2.", # TODO: Confirm translation
|
||||
"player-arguments-tooltip" : "Передавать дополнительные аргументы командной строки этому проигрывателю.",
|
||||
"mediasearcdirectories-arguments-tooltip" : "Папки, где Syncplay будет искать медиа файлы, включая подпапки.",
|
||||
|
||||
"more-tooltip": "Показать дополнительные настройки.",
|
||||
"filename-privacy-tooltip": "Режим приватности для передачи имени воспроизводимого файла на сервер.",
|
||||
"filesize-privacy-tooltip": "Режим приватности для передачи размера воспроизводимого файла на сервер.",
|
||||
"privacy-sendraw-tooltip": "Отправляет эту информацию без шифрования. Рекомендуемая опция с наибольшей функциональностью.",
|
||||
"privacy-sendhashed-tooltip": "Отправляет хэш-сумму этой информации, делая ее невидимой для других пользователей.",
|
||||
"privacy-dontsend-tooltip": "Не отправлять эту информацию на сервер. Предоставляет наибольшую приватность.",
|
||||
"checkforupdatesautomatically-tooltip": "Syncplay будет регулярно заходить на сайт и проверять наличие новых версий.",
|
||||
"slowondesync-tooltip": "Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip": "Ваши лаги не будут влиять на других зрителей.",
|
||||
"pauseonleave-tooltip": "Приостановить воспроизведение, если Вы покинули комнату или кто-то из зрителей отключился от сервера.",
|
||||
"readyatstart-tooltip": "Отметить Вас готовым к просмотру сразу же (по умолчанию Вы отмечены не готовым)",
|
||||
"forceguiprompt-tooltip": "Окно настройки не будет отображаться при открытии файла в Syncplay.", # (Inverted)
|
||||
"nostore-tooltip": "Запустить Syncplay с данной конфигурацией, но не сохранять изменения навсегда.",
|
||||
"rewindondesync-tooltip": "Перематывать назад, когда это необходимо для синхронизации. Отключение этой опции может привести к большим рассинхронизациям!",
|
||||
"fastforwardondesync-tooltip": "Перематывать вперед при рассинхронизации с оператором комнаты (или если включена опция 'Никогда не замедлять и не перематывать видео другим').",
|
||||
"showosd-tooltip": "Отправлять сообщения Syncplay в видеопроигрыватель и отображать их поверх видео (OSD - On Screen Display).",
|
||||
"showosdwarnings-tooltip": "Показывать OSC-предупреждения, если проигрываются разные файлы или если Вы в комнате больше никого нет.",
|
||||
"showsameroomosd-tooltip": "Показывать OSD-уведомления о событиях, относящихся к комнате, в которой Вы находитесь.",
|
||||
"shownoncontrollerosd-tooltip": "Показывать OSD-уведомления о событиях, относящихся к не-операторам в управляемой комнате.",
|
||||
"showdifferentroomosd-tooltip": "Показывать OSD-уведомления о событиях, относящихся к любым другим комнатам.",
|
||||
"showslowdownosd-tooltip": "Показывать уведомления о замедлении или перемотке в целях синхронизации.",
|
||||
"showdurationnotification-tooltip": "Полезно, когда сегмент составного файла отсутствует. Возможны ложные срабатывания.",
|
||||
"language-tooltip": "Язык, используемый Syncplay.",
|
||||
"unpause-always-tooltip": "Когда вы стартуете, статус изменится на готов и начнется воспроизведение, а не просто смена статуса.",
|
||||
"unpause-ifalreadyready-tooltip": "Когда вы стартуете не готовым, это меняет статус на готов - нажмите старт еще раз для начала воспроизведения.",
|
||||
"unpause-ifothersready-tooltip": "Когда вы стартуете не готовым, воспроизведение начнется, если остальные готовы.",
|
||||
"unpause-ifminusersready-tooltip": "Когда вы стартуете не готовым, воспроизведение начнется, если остальные готовы и присутствует достаточное число зрителей.",
|
||||
"trusteddomains-arguments-tooltip": "Сайты, которые разрешены для автоматического воспроизведения из общего списка воспроизведения.",
|
||||
"more-tooltip" : "Показать дополнительные настройки.",
|
||||
"filename-privacy-tooltip" : "Режим приватности для передачи имени воспроизводимого файла на сервер.",
|
||||
"filesize-privacy-tooltip" : "Режим приватности для передачи размера воспроизводимого файла на сервер.",
|
||||
"privacy-sendraw-tooltip" : "Отправляет эту информацию без шифрования. Рекомендуемая опция с наибольшей функциональностью.",
|
||||
"privacy-sendhashed-tooltip" : "Отправляет хэш-сумму этой информации, делая ее невидимой для других пользователей.",
|
||||
"privacy-dontsend-tooltip" : "Не отправлять эту информацию на сервер. Предоставляет наибольшую приватность.",
|
||||
"checkforupdatesautomatically-tooltip" : "Syncplay будет регулярно заходить на сайт и проверять наличие новых версий.",
|
||||
"slowondesync-tooltip" : "Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC/BE.",
|
||||
"dontslowdownwithme-tooltip" : "Ваши лаги не будут влиять на других зрителей.",
|
||||
"pauseonleave-tooltip" : "Приостановить воспроизведение, если Вы покинули комнату или кто-то из зрителей отключился от сервера.",
|
||||
"readyatstart-tooltip" : "Отметить Вас готовым к просмотру сразу же (по умолчанию Вы отмечены не готовым)",
|
||||
"forceguiprompt-tooltip" : "Окно настройки не будет отображаться при открытии файла в Syncplay.", # (Inverted)
|
||||
"nostore-tooltip" : "Запустить Syncplay с данной конфигурацией, но не сохранять изменения навсегда.",
|
||||
"rewindondesync-tooltip" : "Перематывать назад, когда это необходимо для синхронизации. Отключение этой опции может привести к большим рассинхронизациям!",
|
||||
"fastforwardondesync-tooltip" : "Перематывать вперед при рассинхронизации с оператором комнаты (или если включена опция 'Никогда не замедлять и не перематывать видео другим').",
|
||||
"showosd-tooltip" : "Отправлять сообщения Syncplay в видеопроигрыватель и отображать их поверх видео (OSD - On Screen Display).",
|
||||
"showosdwarnings-tooltip" : "Показывать OSC-предупреждения, если проигрываются разные файлы или если Вы в комнате больше никого нет.",
|
||||
"showsameroomosd-tooltip" : "Показывать OSD-уведомления о событиях, относящихся к комнате, в которой Вы находитесь.",
|
||||
"shownoncontrollerosd-tooltip" : "Показывать OSD-уведомления о событиях, относящихся к не-операторам в управляемой комнате.",
|
||||
"showdifferentroomosd-tooltip" : "Показывать OSD-уведомления о событиях, относящихся к любым другим комнатам.",
|
||||
"showslowdownosd-tooltip" : "Показывать уведомления о замедлении или перемотке в целях синхронизации.",
|
||||
"showdurationnotification-tooltip" : "Полезно, когда сегмент составного файла отсутствует. Возможны ложные срабатывания.",
|
||||
"language-tooltip" : "Язык, используемый Syncplay.",
|
||||
"unpause-always-tooltip" : "Когда вы стартуете, статус изменится на готов и начнется воспроизведение, а не просто смена статуса.",
|
||||
"unpause-ifalreadyready-tooltip" : "Когда вы стартуете не готовым, это меняет статус на готов - нажмите старт еще раз для начала воспроизведения.",
|
||||
"unpause-ifothersready-tooltip" : "Когда вы стартуете не готовым, воспроизведение начнется, если остальные готовы.",
|
||||
"unpause-ifminusersready-tooltip" : "Когда вы стартуете не готовым, воспроизведение начнется, если остальные готовы и присутствует достаточное число зрителей.",
|
||||
"trusteddomains-arguments-tooltip" : "Сайты, которые разрешены для автоматического воспроизведения из общего списка воспроизведения.",
|
||||
|
||||
"chatinputenabled-tooltip": "Enable chat input in mpv (press enter to chat, enter to send, escape to cancel)",# TODO: Translate
|
||||
"chatdirectinput-tooltip": "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.", # TODO: Translate
|
||||
"chatdirectinput-tooltip" : "Skip having to press 'enter' to go into chat input mode in mpv. Press TAB in mpv to temporarily disable this feature.", # TODO: Translate
|
||||
"font-label-tooltip": "Font used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",# TODO: Translate
|
||||
"set-input-font-tooltip": "Font family used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",# TODO: Translate
|
||||
"set-input-colour-tooltip": "Font colour used for when entering chat messages in mpv. Client-side only, so doesn't affect what other see.",# TODO: Translate
|
||||
@ -403,78 +403,78 @@ ru = {
|
||||
"chatoutputmode-chatroom-tooltip": "Display new lines of chat directly below previous line.", # TODO: Translate
|
||||
"chatoutputmode-scrolling-tooltip": "Scroll chat text from right to left.", # TODO: Translate
|
||||
|
||||
"help-tooltip": "Открыть Руководство Пользователя на Syncplay.pl.",
|
||||
"reset-tooltip": "Сбрасывает все настройки Syncplay в начальное состояние.",
|
||||
"update-server-list-tooltip": "Обновить список публичных серверов от syncplay.pl.",
|
||||
"help-tooltip" : "Открыть Руководство Пользователя на Syncplay.pl.",
|
||||
"reset-tooltip" : "Сбрасывает все настройки Syncplay в начальное состояние.",
|
||||
"update-server-list-tooltip" : "Обновить список публичных серверов от syncplay.pl.",
|
||||
|
||||
"joinroom-tooltip": "Покинуть комнату и зайти в другую, указанную комнату.",
|
||||
"seektime-msgbox-label": "Перемотать к определенному моменту времени (указывать в секундах или мин:сек). Используйте +/-, чтобы перемотать вперед/назад относительно настоящего момента.",
|
||||
"ready-tooltip": "Показывает, готовы ли Вы к просмотру или нет.",
|
||||
"autoplay-tooltip": "Автоматическое воспроизведение, когда все пользователи с индикаторами готовности будут готовы и присутствует достаточное число зрителей.",
|
||||
"switch-to-file-tooltip": "Кликните два раза для воспроизведения {}", # Filename
|
||||
"sendmessage-tooltip": "Send message to room", # TODO: Translate
|
||||
"joinroom-tooltip" : "Покинуть комнату и зайти в другую, указанную комнату.",
|
||||
"seektime-msgbox-label" : "Перемотать к определенному моменту времени (указывать в секундах или мин:сек). Используйте +/-, чтобы перемотать вперед/назад относительно настоящего момента.",
|
||||
"ready-tooltip" : "Показывает, готовы ли Вы к просмотру или нет.",
|
||||
"autoplay-tooltip" : "Автоматическое воспроизведение, когда все пользователи с индикаторами готовности будут готовы и присутствует достаточное число зрителей.",
|
||||
"switch-to-file-tooltip" : "Кликните два раза для воспроизведения {}", # Filename
|
||||
"sendmessage-tooltip" : "Send message to room", # TODO: Translate
|
||||
|
||||
# In-userlist notes (GUI)
|
||||
"differentsize-note": "Размер файла не совпадает!",
|
||||
"differentsizeandduration-note": "Размер и продолжительность файла не совпадают!",
|
||||
"differentduration-note": "Продолжительность файла не совпадает!",
|
||||
"nofile-note": "(ничего)",
|
||||
"differentsize-note" : "Размер файла не совпадает!",
|
||||
"differentsizeandduration-note" : "Размер и продолжительность файла не совпадают!",
|
||||
"differentduration-note" : "Продолжительность файла не совпадает!",
|
||||
"nofile-note" : "(ничего)",
|
||||
|
||||
# Server messages to client
|
||||
"new-syncplay-available-motd-message": "<NOTICE> Вы используете Syncplay версии {}. Доступна более новая версия на https://syncplay.pl/ . </NOTICE>", # ClientVersion
|
||||
"new-syncplay-available-motd-message" : "<NOTICE> Вы используете Syncplay версии {}. Доступна более новая версия на https://syncplay.pl/ . </NOTICE>", # ClientVersion
|
||||
|
||||
# Server notifications
|
||||
"welcome-server-notification": "Добро пожаловать на сервер Syncplay версии {0}", # version
|
||||
"client-connected-room-server-notification": "{0}({2}) подключился к комнате '{1}'", # username, host, room
|
||||
"client-left-server-notification": "{0} покинул сервер", # name
|
||||
"no-salt-notification": "ВНИМАНИЕ: Чтобы сгенерированные сервером пароли операторов комнат работали после перезагрузки сервера, необходимо указать следующий аргумент командной строки при запуске сервера Syncplay: --salt {}", # Salt
|
||||
"welcome-server-notification" : "Добро пожаловать на сервер Syncplay версии {0}", # version
|
||||
"client-connected-room-server-notification" : "{0}({2}) подключился к комнате '{1}'", # username, host, room
|
||||
"client-left-server-notification" : "{0} покинул сервер", # name
|
||||
"no-salt-notification" : "ВНИМАНИЕ: Чтобы сгенерированные сервером пароли операторов комнат работали после перезагрузки сервера, необходимо указать следующий аргумент командной строки при запуске сервера Syncplay: --salt {}", #Salt
|
||||
|
||||
# Server arguments
|
||||
"server-argument-description": 'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет. Серверная часть',
|
||||
"server-argument-epilog": 'Если параметр не будет передан, то будет использоваться значение, указанное в _config.',
|
||||
"server-port-argument": 'номер TCP порта сервера',
|
||||
"server-password-argument": 'пароль к серверу',
|
||||
"server-isolate-room-argument": 'должны ли комнаты быть изолированными?',
|
||||
"server-salt-argument": "генерировать пароли к управляемым комнатам на основании указанной строки (соли)",
|
||||
"server-disable-ready-argument": "отключить статусы готов/не готов",
|
||||
"server-motd-argument": "путь к файлу, из которого будет извлекаться MOTD-сообщение",
|
||||
"server-chat-argument": "Should chat be disabled?", # TODO: Translate
|
||||
"server-argument-description" : 'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет. Серверная часть',
|
||||
"server-argument-epilog" : 'Если параметр не будет передан, то будет использоваться значение, указанное в _config.',
|
||||
"server-port-argument" : 'номер TCP порта сервера',
|
||||
"server-password-argument" : 'пароль к серверу',
|
||||
"server-isolate-room-argument" : 'должны ли комнаты быть изолированными?',
|
||||
"server-salt-argument" : "генерировать пароли к управляемым комнатам на основании указанной строки (соли)",
|
||||
"server-disable-ready-argument" : "отключить статусы готов/не готов",
|
||||
"server-motd-argument" : "путь к файлу, из которого будет извлекаться MOTD-сообщение",
|
||||
"server-chat-argument" : "Should chat be disabled?", # TODO: Translate
|
||||
"server-chat-maxchars-argument": "Maximum number of characters in a chat message (default is {})", # TODO: Translate
|
||||
"server-maxusernamelength-argument": "Maximum number of charactrs in a username (default is {})", # TODO: Translate
|
||||
"server-messed-up-motd-unescaped-placeholders": "MOTD-сообщение содержит неэкранированные спец.символы. Все знаки $ должны быть продублированы ($$).",
|
||||
"server-messed-up-motd-too-long": "MOTD-сообщение слишком длинное: максимальная длина - {} символ(ов), текущая длина - {} символ(ов).",
|
||||
"server-messed-up-motd-unescaped-placeholders" : "MOTD-сообщение содержит неэкранированные спец.символы. Все знаки $ должны быть продублированы ($$).",
|
||||
"server-messed-up-motd-too-long" : "MOTD-сообщение слишком длинное: максимальная длина - {} символ(ов), текущая длина - {} символ(ов).",
|
||||
|
||||
# Server errors
|
||||
"unknown-command-server-error": "Неизвестная команда: {}", # message
|
||||
"not-json-server-error": "Не является закодированной json-строкой: {}", # message
|
||||
"not-known-server-error": "Данную команду могут выполнять только авторизованные пользователи.",
|
||||
"client-drop-server-error": "Клиент отключен с ошибкой: {} -- {}", # host, error
|
||||
"password-required-server-error": "Необходимо указать пароль.",
|
||||
"wrong-password-server-error": "Указан неверный пароль.",
|
||||
"hello-server-error": "Не хватает аргументов Hello.",
|
||||
"unknown-command-server-error" : "Неизвестная команда: {}", # message
|
||||
"not-json-server-error" : "Не является закодированной json-строкой: {}", # message
|
||||
"not-known-server-error" : "Данную команду могут выполнять только авторизованные пользователи.",
|
||||
"client-drop-server-error" : "Клиент отключен с ошибкой: {} -- {}", # host, error
|
||||
"password-required-server-error" : "Необходимо указать пароль.",
|
||||
"wrong-password-server-error" : "Указан неверный пароль.",
|
||||
"hello-server-error" : "Не хватает аргументов Hello.",
|
||||
|
||||
"playlist-selection-changed-notification": "{} изменил выбор в списке воспроизведения", # Username
|
||||
"playlist-contents-changed-notification": "{} обновил список воспроизведения", # Username
|
||||
"cannot-find-file-for-playlist-switch-error": "Не удалось найти файл {} в папках воспроизведения!", # Filename
|
||||
"cannot-add-duplicate-error": "'{}' уже есть в списке воспроизведения.", # Filename
|
||||
"cannot-add-unsafe-path-error": "Не удалось автоматически переключиться на {}, потому что ссылка не соответствует доверенным сайтам. Её можно включить вручную, дважны кливнув по ссылке в списке воспроизведения. Добавить доверенный сайт можно в выпадающем меню 'Дополнительно' или просто кликнув по ссылке правой кнопкой мыши.", # Filename
|
||||
"sharedplaylistenabled-label": "Включить общий список воспроизведения",
|
||||
"removefromplaylist-menu-label": "Удалить",
|
||||
"shufflepremaininglaylist-menuu-label": "Shuffle remaining playlist", # Was: Перемешать список # TODO: Translate
|
||||
"shuffleentireplaylist-menu-label": "Shuffle entire playlist", # TODO: Translate
|
||||
"undoplaylist-menu-label": "Отменить последнее действие",
|
||||
"addfilestoplaylist-menu-label": "Добавить файлы в очередь",
|
||||
"addurlstoplaylist-menu-label": "Добавить ссылку в очередь",
|
||||
"playlist-selection-changed-notification" : "{} изменил выбор в списке воспроизведения", # Username
|
||||
"playlist-contents-changed-notification" : "{} обновил список воспроизведения", # Username
|
||||
"cannot-find-file-for-playlist-switch-error" : "Не удалось найти файл {} в папках воспроизведения!", # Filename
|
||||
"cannot-add-duplicate-error" : "'{}' уже есть в списке воспроизведения.", #Filename
|
||||
"cannot-add-unsafe-path-error" : "Не удалось автоматически переключиться на {}, потому что ссылка не соответствует доверенным сайтам. Её можно включить вручную, дважны кливнув по ссылке в списке воспроизведения. Добавить доверенный сайт можно в выпадающем меню 'Дополнительно' или просто кликнув по ссылке правой кнопкой мыши.", # Filename
|
||||
"sharedplaylistenabled-label" : "Включить общий список воспроизведения",
|
||||
"removefromplaylist-menu-label" : "Удалить",
|
||||
"shufflepremaininglaylist-menuu-label" : "Shuffle remaining playlist", # Was: Перемешать список # TODO: Translate
|
||||
"shuffleentireplaylist-menu-label" : "Shuffle entire playlist", # TODO: Translate
|
||||
"undoplaylist-menu-label" : "Отменить последнее действие",
|
||||
"addfilestoplaylist-menu-label" : "Добавить файлы в очередь",
|
||||
"addurlstoplaylist-menu-label" : "Добавить ссылку в очередь",
|
||||
"editplaylist-menu-label": "Редактировать список",
|
||||
|
||||
"open-containing-folder": "Open folder containing this file", # TODO: Traslate
|
||||
"addusersfiletoplaylist-menu-label": "Добавить файл {} в список воспроизведения", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label": "Добавить поток {} в список воспроизведения", # item owner indicator
|
||||
"openusersstream-menu-label": "Открыть поток от {}", # [username]'s
|
||||
"openusersfile-menu-label": "Открыть файл от {}", # [username]'s
|
||||
"item-is-yours-indicator": "от вас", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator": "{}", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"addusersfiletoplaylist-menu-label" : "Добавить файл {} в список воспроизведения", # item owner indicator
|
||||
"addusersstreamstoplaylist-menu-label" : "Добавить поток {} в список воспроизведения", # item owner indicator
|
||||
"openusersstream-menu-label" : "Открыть поток от {}", # [username]'s
|
||||
"openusersfile-menu-label" : "Открыть файл от {}", # [username]'s
|
||||
"item-is-yours-indicator" : "от вас", # Goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
"item-is-others-indicator" : "{}", # username - goes with addusersfiletoplaylist/addusersstreamstoplaylist
|
||||
|
||||
"playlist-instruction-item-message": "Перетащите сюда файлы, чтобы добавить их в общий список.",
|
||||
"sharedplaylistenabled-tooltip": "Оператор комнаты может добавлять файлы в список общего воспроизведения для удобного совместного просмотра. Папки воспроизведения настраиваются во вкладке 'Файл'.",
|
||||
"playlist-instruction-item-message" : "Перетащите сюда файлы, чтобы добавить их в общий список.",
|
||||
"sharedplaylistenabled-tooltip" : "Оператор комнаты может добавлять файлы в список общего воспроизведения для удобного совместного просмотра. Папки воспроизведения настраиваются во вкладке 'Файл'.",
|
||||
}
|
||||
|
||||
@ -12,6 +12,5 @@ except ImportError:
|
||||
from syncplay.players.basePlayer import DummyPlayer
|
||||
MpcBePlayer = DummyPlayer
|
||||
|
||||
|
||||
def getAvailablePlayers():
|
||||
return [MPCHCAPIPlayer, MplayerPlayer, MpvPlayer, VlcPlayer, MpcBePlayer]
|
||||
|
||||
@ -1,6 +1,4 @@
|
||||
from syncplay import constants
|
||||
|
||||
|
||||
class BasePlayer(object):
|
||||
|
||||
'''
|
||||
@ -14,9 +12,7 @@ class BasePlayer(object):
|
||||
'''
|
||||
Display given message on player's OSD or similar means
|
||||
'''
|
||||
def displayMessage(
|
||||
self, message, duration=(constants.OSD_DURATION*1000), secondaryOSD=False, mood=constants.MESSAGE_NEUTRAL
|
||||
):
|
||||
def displayMessage(self, message, duration = (constants.OSD_DURATION*1000), secondaryOSD=False, mood=constants.MESSAGE_NEUTRAL):
|
||||
raise NotImplementedError()
|
||||
|
||||
'''
|
||||
@ -62,6 +58,7 @@ class BasePlayer(object):
|
||||
def openFile(self, filePath, resetPosition=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
'''
|
||||
@return: list of strings
|
||||
'''
|
||||
@ -110,7 +107,6 @@ class BasePlayer(object):
|
||||
def getPlayerPathErrors(playerPath, filePath):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class DummyPlayer(BasePlayer):
|
||||
|
||||
@staticmethod
|
||||
|
||||
@ -1,18 +1,15 @@
|
||||
|
||||
import os.path
|
||||
import re
|
||||
#coding:utf8
|
||||
import time
|
||||
import threading
|
||||
import _thread
|
||||
from functools import wraps
|
||||
|
||||
import win32con, win32api, win32gui, ctypes, ctypes.wintypes #@UnresolvedImport @UnusedImport
|
||||
|
||||
from functools import wraps
|
||||
from syncplay.players.basePlayer import BasePlayer
|
||||
import re
|
||||
from syncplay.utils import retry
|
||||
from syncplay import constants
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.players.basePlayer import BasePlayer
|
||||
from syncplay.utils import retry
|
||||
|
||||
import os.path
|
||||
|
||||
class MpcHcApi:
|
||||
def __init__(self):
|
||||
@ -52,7 +49,7 @@ class MpcHcApi:
|
||||
self.__listener.SendCommand(self.CMD_OPENFILE, filePath)
|
||||
|
||||
def isPaused(self):
|
||||
return self.playState != self.__MPC_PLAYSTATE.PS_PLAY and self.playState is not None
|
||||
return self.playState != self.__MPC_PLAYSTATE.PS_PLAY and self.playState != None
|
||||
|
||||
def askForVersion(self):
|
||||
self.__listener.SendCommand(self.CMD_GETVERSION)
|
||||
@ -106,11 +103,7 @@ class MpcHcApi:
|
||||
|
||||
elif cmd == self.CMD_STATE:
|
||||
self.loadState = int(value)
|
||||
fileNotReady = (
|
||||
self.loadState == self.__MPC_LOADSTATE.MLS_CLOSING or
|
||||
self.loadState == self.__MPC_LOADSTATE.MLS_LOADING or
|
||||
self.loadState == self.__MPC_LOADSTATE.MLS_CLOSED
|
||||
)
|
||||
fileNotReady = self.loadState == self.__MPC_LOADSTATE.MLS_CLOSING or self.loadState == self.__MPC_LOADSTATE.MLS_LOADING or self.loadState == self.__MPC_LOADSTATE.MLS_CLOSED
|
||||
if fileNotReady:
|
||||
self.playState = None
|
||||
self.__locks.fileReady.clear()
|
||||
@ -144,7 +137,7 @@ class MpcHcApi:
|
||||
_thread.start_new_thread(self.callbacks.onGetCurrentPosition, (self.lastFilePosition,))
|
||||
|
||||
elif cmd == self.CMD_NOTIFYSEEK:
|
||||
if self.lastFilePosition != float(value): # Notify seek is sometimes sent twice
|
||||
if self.lastFilePosition != float(value): #Notify seek is sometimes sent twice
|
||||
self.lastFilePosition = float(value)
|
||||
if self.callbacks.onSeek:
|
||||
_thread.start_new_thread(self.callbacks.onSeek, (self.lastFilePosition,))
|
||||
@ -263,7 +256,7 @@ class MpcHcApi:
|
||||
wc.lpszClassName = 'MPCApiListener'
|
||||
hinst = wc.hInstance = win32api.GetModuleHandle(None)
|
||||
classAtom = win32gui.RegisterClass(wc)
|
||||
self.hwnd = win32gui.CreateWindow(
|
||||
self.hwnd = win32gui.CreateWindow (
|
||||
classAtom,
|
||||
"ListenerGUI",
|
||||
0,
|
||||
@ -279,13 +272,14 @@ class MpcHcApi:
|
||||
self.locks.listenerStart.set()
|
||||
win32gui.PumpMessages()
|
||||
|
||||
|
||||
def OnCopyData(self, hwnd, msg, wparam, lparam):
|
||||
pCDS = ctypes.cast(lparam, self.__PCOPYDATASTRUCT)
|
||||
# print "API:\tin>\t 0x%X\t" % int(pCDS.contents.dwData), ctypes.wstring_at(pCDS.contents.lpData)
|
||||
#print "API:\tin>\t 0x%X\t" % int(pCDS.contents.dwData), ctypes.wstring_at(pCDS.contents.lpData)
|
||||
self.__mpcApi.handleCommand(pCDS.contents.dwData, ctypes.wstring_at(pCDS.contents.lpData))
|
||||
|
||||
def SendCommand(self, cmd, message=''):
|
||||
# print "API:\t<out\t 0x%X\t" % int(cmd), message
|
||||
#print "API:\t<out\t 0x%X\t" % int(cmd), message
|
||||
if not win32gui.IsWindow(self.mpcHandle):
|
||||
if self.__mpcApi.callbacks.onMpcClosed:
|
||||
self.__mpcApi.callbacks.onMpcClosed(None)
|
||||
@ -310,7 +304,6 @@ class MpcHcApi:
|
||||
('lpData', ctypes.c_void_p)
|
||||
]
|
||||
|
||||
|
||||
class MPCHCAPIPlayer(BasePlayer):
|
||||
speedSupported = False
|
||||
alertOSDSupported = False
|
||||
@ -407,10 +400,7 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
def openFile(self, filePath, resetPosition=False):
|
||||
self._mpcApi.openFile(filePath)
|
||||
|
||||
def displayMessage(
|
||||
self, message,
|
||||
duration=(constants.OSD_DURATION*1000), OSDType=constants.OSD_NOTIFICATION, mood=constants.MESSAGE_NEUTRAL
|
||||
):
|
||||
def displayMessage(self, message, duration = (constants.OSD_DURATION*1000), OSDType=constants.OSD_NOTIFICATION, mood=constants.MESSAGE_NEUTRAL):
|
||||
self._mpcApi.sendOsd(message, constants.MPC_OSD_POSITION, duration)
|
||||
|
||||
@retry(MpcHcApi.PlayerNotReadyException, constants.MPC_MAX_RETRIES, constants.MPC_RETRY_WAIT_TIME, 1)
|
||||
@ -422,7 +412,6 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
self._mpcApi.pause()
|
||||
else:
|
||||
self._mpcApi.unpause()
|
||||
|
||||
def setFeatures(self, featureList):
|
||||
pass
|
||||
|
||||
@ -493,10 +482,7 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
|
||||
@staticmethod
|
||||
def getIconPath(path):
|
||||
if (
|
||||
MPCHCAPIPlayer.getExpandedPath(path).lower().endswith('mpc-hc64.exe'.lower()) or
|
||||
MPCHCAPIPlayer.getExpandedPath(path).lower().endswith('mpc-hc64_nvo.exe'.lower())
|
||||
):
|
||||
if MPCHCAPIPlayer.getExpandedPath(path).lower().endswith('mpc-hc64.exe'.lower()) or MPCHCAPIPlayer.getExpandedPath(path).lower().endswith('mpc-hc64_nvo.exe'.lower()):
|
||||
return constants.MPC64_ICONPATH
|
||||
else:
|
||||
return constants.MPC_ICONPATH
|
||||
@ -510,11 +496,7 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
@staticmethod
|
||||
def getExpandedPath(path):
|
||||
if os.path.isfile(path):
|
||||
if (
|
||||
path.lower().endswith('mpc-hc.exe'.lower()) or path.lower().endswith('mpc-hcportable.exe'.lower()) or
|
||||
path.lower().endswith('mpc-hc64.exe'.lower()) or path.lower().endswith('mpc-hc64_nvo.exe'.lower()) or
|
||||
path.lower().endswith('mpc-hc_nvo.exe'.lower())
|
||||
):
|
||||
if path.lower().endswith('mpc-hc.exe'.lower()) or path.lower().endswith('mpc-hcportable.exe'.lower()) or path.lower().endswith('mpc-hc64.exe'.lower()) or path.lower().endswith('mpc-hc64_nvo.exe'.lower()) or path.lower().endswith('mpc-hc_nvo.exe'.lower()):
|
||||
return path
|
||||
if os.path.isfile(path + "mpc-hc.exe"):
|
||||
path += "mpc-hc.exe"
|
||||
@ -546,3 +528,4 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
if os.path.isfile(path + "\\mpc-hc64_nvo.exe"):
|
||||
path += "\\mpc-hc64_nvo.exe"
|
||||
return path
|
||||
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
|
||||
import os.path
|
||||
|
||||
from syncplay import constants
|
||||
import os.path
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.players.mpc import MPCHCAPIPlayer
|
||||
|
||||
|
||||
class MpcBePlayer(MPCHCAPIPlayer):
|
||||
@staticmethod
|
||||
def run(client, playerPath, filePath, args):
|
||||
@ -33,11 +30,7 @@ class MpcBePlayer(MPCHCAPIPlayer):
|
||||
@staticmethod
|
||||
def getExpandedPath(path):
|
||||
if os.path.isfile(path):
|
||||
if (
|
||||
path.lower().endswith('mpc-be.exe'.lower()) or
|
||||
path.lower().endswith('mpc-be64.exe'.lower()) or
|
||||
path.lower().endswith('mpc-beportable.exe'.lower())
|
||||
):
|
||||
if path.lower().endswith('mpc-be.exe'.lower()) or path.lower().endswith('mpc-be64.exe'.lower() or path.lower().endswith('mpc-beportable.exe'.lower())):
|
||||
return path
|
||||
if os.path.isfile(path + "mpc-be.exe"):
|
||||
path += "mpc-be.exe"
|
||||
|
||||
@ -1,18 +1,14 @@
|
||||
# coding:utf8
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import re
|
||||
import threading
|
||||
import time
|
||||
|
||||
|
||||
from syncplay import constants, utils
|
||||
from syncplay.players.basePlayer import BasePlayer
|
||||
from syncplay import constants, utils
|
||||
from syncplay.messages import getMessage
|
||||
import os, sys
|
||||
from syncplay.utils import isWindows
|
||||
|
||||
|
||||
class MplayerPlayer(BasePlayer):
|
||||
speedSupported = True
|
||||
customOpenDialog = False
|
||||
@ -94,20 +90,15 @@ class MplayerPlayer(BasePlayer):
|
||||
def _getProperty(self, property_):
|
||||
self._listener.sendLine("get_property {}".format(property_))
|
||||
|
||||
def displayMessage(
|
||||
self, message,
|
||||
duration=(constants.OSD_DURATION * 1000), OSDType=constants.OSD_NOTIFICATION, mood=constants.MESSAGE_NEUTRAL
|
||||
):
|
||||
def displayMessage(self, message, duration=(constants.OSD_DURATION * 1000), OSDType=constants.OSD_NOTIFICATION, mood=constants.MESSAGE_NEUTRAL):
|
||||
messageString = self._sanitizeText(message.replace("\\n", "<NEWLINE>")).replace("<NEWLINE>", "\\n")
|
||||
self._listener.sendLine('{} "{!s}" {} {}'.format(
|
||||
self.OSD_QUERY, messageString, duration, constants.MPLAYER_OSD_LEVEL))
|
||||
self._listener.sendLine('{} "{!s}" {} {}'.format(self.OSD_QUERY, messageString, duration, constants.MPLAYER_OSD_LEVEL))
|
||||
|
||||
def displayChatMessage(self, username, message):
|
||||
messageString = "<{}> {}".format(username, message)
|
||||
messageString = self._sanitizeText(messageString.replace("\\n", "<NEWLINE>")).replace("<NEWLINE>", "\\n")
|
||||
duration = int(constants.OSD_DURATION * 1000)
|
||||
self._listener.sendLine('{} "{!s}" {} {}'.format(
|
||||
self.OSD_QUERY, messageString, duration, constants.MPLAYER_OSD_LEVEL))
|
||||
self._listener.sendLine('{} "{!s}" {} {}'.format(self.OSD_QUERY, messageString, duration, constants.MPLAYER_OSD_LEVEL))
|
||||
|
||||
def setSpeed(self, value):
|
||||
self._setProperty('speed', "{:.2f}".format(value))
|
||||
@ -127,7 +118,7 @@ class MplayerPlayer(BasePlayer):
|
||||
pass
|
||||
|
||||
def setPosition(self, value):
|
||||
self._position = max(value, 0)
|
||||
self._position = max(value,0)
|
||||
self._setProperty(self.POSITION_QUERY, "{}".format(value))
|
||||
time.sleep(0.03)
|
||||
|
||||
@ -160,7 +151,7 @@ class MplayerPlayer(BasePlayer):
|
||||
text = text.replace("\\", "\\\\")
|
||||
text = text.replace("{", "\\\\{")
|
||||
text = text.replace("}", "\\\\}")
|
||||
text = text.replace("<SYNCPLAY_QUOTE>", "\\\"")
|
||||
text = text.replace("<SYNCPLAY_QUOTE>","\\\"")
|
||||
return text
|
||||
|
||||
def _quoteArg(self, arg):
|
||||
@ -178,7 +169,7 @@ class MplayerPlayer(BasePlayer):
|
||||
pass
|
||||
|
||||
def _storePosition(self, value):
|
||||
self._position = max(value, 0)
|
||||
self._position = max(value,0)
|
||||
|
||||
def _storePauseState(self, value):
|
||||
self._paused = value
|
||||
@ -188,15 +179,9 @@ class MplayerPlayer(BasePlayer):
|
||||
self._client.ui.showDebugMessage("player << {}".format(line))
|
||||
line = line.replace("[cplayer] ", "") # -v workaround
|
||||
line = line.replace("[term-msg] ", "") # -v workaround
|
||||
line = line.replace(" cplayer: ", "") # --msg-module workaround
|
||||
line = line.replace(" cplayer: ","") # --msg-module workaround
|
||||
line = line.replace(" term-msg: ", "")
|
||||
if (
|
||||
"Failed to get value of property" in line or
|
||||
"=(unavailable)" in line or
|
||||
line == "ANS_filename=" or
|
||||
line == "ANS_length=" or
|
||||
line == "ANS_path="
|
||||
):
|
||||
if "Failed to get value of property" in line or "=(unavailable)" in line or line == "ANS_filename=" or line == "ANS_length=" or line == "ANS_path=":
|
||||
if "filename" in line:
|
||||
self._getFilename()
|
||||
elif "length" in line:
|
||||
@ -209,7 +194,7 @@ class MplayerPlayer(BasePlayer):
|
||||
self._handleUnknownLine(line)
|
||||
return
|
||||
|
||||
name, value = [m for m in match.groups() if m]
|
||||
name, value =[m for m in match.groups() if m]
|
||||
name = name.lower()
|
||||
|
||||
if name == self.POSITION_QUERY:
|
||||
@ -265,7 +250,7 @@ class MplayerPlayer(BasePlayer):
|
||||
|
||||
@staticmethod
|
||||
def isValidPlayerPath(path):
|
||||
if "mplayer" in path and MplayerPlayer.getExpandedPath(path) and "mplayerc.exe" not in path: # "mplayerc.exe" is Media Player Classic (not Home Cinema):
|
||||
if "mplayer" in path and MplayerPlayer.getExpandedPath(path) and not "mplayerc.exe" in path: # "mplayerc.exe" is Media Player Classic (not Home Cinema):
|
||||
return True
|
||||
return False
|
||||
|
||||
@ -316,7 +301,7 @@ class MplayerPlayer(BasePlayer):
|
||||
if not self.__playerController._client._config["chatOutputEnabled"]:
|
||||
self.__playerController.alertOSDSupported = False
|
||||
self.__playerController.chatOSDSupported = False
|
||||
if self.__playerController.getPlayerPathErrors(playerPath, filePath):
|
||||
if self.__playerController.getPlayerPathErrors(playerPath,filePath):
|
||||
raise ValueError()
|
||||
if filePath and '://' not in filePath:
|
||||
if not os.path.isfile(filePath) and 'PWD' in os.environ:
|
||||
@ -339,15 +324,12 @@ class MplayerPlayer(BasePlayer):
|
||||
if 'TERM' in env:
|
||||
del env['TERM']
|
||||
if filePath:
|
||||
self.__process = subprocess.Popen(
|
||||
call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
cwd=self.__getCwd(filePath, env), env=env, bufsize=0)
|
||||
self.__process = subprocess.Popen(call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.__getCwd(filePath, env), env=env, bufsize=0)
|
||||
else:
|
||||
self.__process = subprocess.Popen(
|
||||
call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
env=env, bufsize=0)
|
||||
self.__process = subprocess.Popen(call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, env=env, bufsize=0)
|
||||
threading.Thread.__init__(self, name="MPlayer Listener")
|
||||
|
||||
|
||||
def __getCwd(self, filePath, env):
|
||||
if not filePath:
|
||||
return None
|
||||
@ -383,8 +365,8 @@ class MplayerPlayer(BasePlayer):
|
||||
if command and command[:1] == "/":
|
||||
message = message[1:]
|
||||
else:
|
||||
self.__playerController.reactor.callFromThread(
|
||||
self.__playerController._client.ui.executeCommand, command)
|
||||
self.__playerController.reactor.callFromThread(self.__playerController._client.ui.executeCommand,
|
||||
command)
|
||||
return
|
||||
self.__playerController.reactor.callFromThread(self.__playerController._client.sendChat, message)
|
||||
|
||||
@ -396,11 +378,11 @@ class MplayerPlayer(BasePlayer):
|
||||
oldState = self.readyToSend
|
||||
self.readyToSend = newReadyState
|
||||
self.lastNotReadyTime = time.time() if newReadyState == False else None
|
||||
if self.readyToSend:
|
||||
if self.readyToSend == True:
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Ready to send: True")
|
||||
else:
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Ready to send: False")
|
||||
if self.readyToSend and oldState == False:
|
||||
if self.readyToSend == True and oldState == False:
|
||||
self.processSendQueue()
|
||||
|
||||
def checkForReadinessOverride(self):
|
||||
@ -409,7 +391,7 @@ class MplayerPlayer(BasePlayer):
|
||||
|
||||
def sendLine(self, line, notReadyAfterThis=None):
|
||||
self.checkForReadinessOverride()
|
||||
if not self.readyToSend and "print_text ANS_pause" in line:
|
||||
if self.readyToSend == False and "print_text ANS_pause" in line:
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Not ready to get status update, so skipping")
|
||||
return
|
||||
try:
|
||||
@ -419,13 +401,11 @@ class MplayerPlayer(BasePlayer):
|
||||
if line.startswith(command):
|
||||
for itemID, deletionCandidate in enumerate(self.sendQueue):
|
||||
if deletionCandidate.startswith(command):
|
||||
self.__playerController._client.ui.showDebugMessage(
|
||||
"<mpv> Remove duplicate (supersede): {}".format(self.sendQueue[itemID]))
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Remove duplicate (supersede): {}".format(self.sendQueue[itemID]))
|
||||
try:
|
||||
self.sendQueue.remove(self.sendQueue[itemID])
|
||||
except UnicodeWarning:
|
||||
self.__playerController._client.ui.showDebugMessage(
|
||||
"<mpv> Unicode mismatch occured when trying to remove duplicate")
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Unicode mismatch occured when trying to remove duplicate")
|
||||
# TODO: Prevent this from being triggered
|
||||
pass
|
||||
break
|
||||
@ -435,8 +415,7 @@ class MplayerPlayer(BasePlayer):
|
||||
if line == command:
|
||||
for itemID, deletionCandidate in enumerate(self.sendQueue):
|
||||
if deletionCandidate == command:
|
||||
self.__playerController._client.ui.showDebugMessage(
|
||||
"<mpv> Remove duplicate (delete both): {}".format(self.sendQueue[itemID]))
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Remove duplicate (delete both): {}".format(self.sendQueue[itemID]))
|
||||
self.__playerController._client.ui.showDebugMessage(self.sendQueue[itemID])
|
||||
return
|
||||
except:
|
||||
@ -449,9 +428,7 @@ class MplayerPlayer(BasePlayer):
|
||||
def processSendQueue(self):
|
||||
while self.sendQueue and self.readyToSend:
|
||||
if self.lastSendTime and time.time() - self.lastSendTime < constants.MPV_SENDMESSAGE_COOLDOWN_TIME:
|
||||
self.__playerController._client.ui.showDebugMessage(
|
||||
"<mpv> Throttling message send, so sleeping for {}".format(
|
||||
constants.MPV_SENDMESSAGE_COOLDOWN_TIME))
|
||||
self.__playerController._client.ui.showDebugMessage("<mpv> Throttling message send, so sleeping for {}".format(constants.MPV_SENDMESSAGE_COOLDOWN_TIME))
|
||||
time.sleep(constants.MPV_SENDMESSAGE_COOLDOWN_TIME)
|
||||
try:
|
||||
lineToSend = self.sendQueue.pop()
|
||||
@ -463,8 +440,8 @@ class MplayerPlayer(BasePlayer):
|
||||
|
||||
def actuallySendLine(self, line):
|
||||
try:
|
||||
# if not isinstance(line, str):
|
||||
# line = line.decode('utf8')
|
||||
#if not isinstance(line, str):
|
||||
#line = line.decode('utf8')
|
||||
line = line + "\n"
|
||||
self.__playerController._client.ui.showDebugMessage("player >> {}".format(line))
|
||||
line = line.encode('utf-8')
|
||||
|
||||
@ -1,18 +1,14 @@
|
||||
# coding:utf8
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import subprocess
|
||||
|
||||
from syncplay import constants
|
||||
from syncplay.players.mplayer import MplayerPlayer
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay import constants
|
||||
from syncplay.utils import isURL, findResourcePath
|
||||
|
||||
import os, sys, time
|
||||
|
||||
class MpvPlayer(MplayerPlayer):
|
||||
RE_VERSION = re.compile(r'.*mpv (\d+)\.(\d+)\.\d+.*')
|
||||
RE_VERSION = re.compile('.*mpv (\d+)\.(\d+)\.\d+.*')
|
||||
osdMessageSeparator = "\\n"
|
||||
osdMessageSeparator = "; " # TODO: Make conditional
|
||||
|
||||
@ -25,9 +21,7 @@ class MpvPlayer(MplayerPlayer):
|
||||
constants.MPV_NEW_VERSION = ver is None or int(ver.group(1)) > 0 or int(ver.group(2)) >= 6
|
||||
constants.MPV_OSC_VISIBILITY_CHANGE_VERSION = False if ver is None else int(ver.group(1)) > 0 or int(ver.group(2)) >= 28
|
||||
if not constants.MPV_OSC_VISIBILITY_CHANGE_VERSION:
|
||||
client.ui.showDebugMessage(
|
||||
"This version of mpv is not known to be compatible with changing the OSC visibility. "
|
||||
"Please use mpv >=0.28.0.")
|
||||
client.ui.showDebugMessage("This version of mpv is not known to be compatible with changing the OSC visibility. Please use mpv >=0.28.0.")
|
||||
if constants.MPV_NEW_VERSION:
|
||||
return NewMpvPlayer(client, MpvPlayer.getExpandedPath(playerPath), filePath, args)
|
||||
else:
|
||||
@ -83,7 +77,6 @@ class MpvPlayer(MplayerPlayer):
|
||||
def getPlayerPathErrors(playerPath, filePath):
|
||||
return None
|
||||
|
||||
|
||||
class OldMpvPlayer(MpvPlayer):
|
||||
POSITION_QUERY = 'time-pos'
|
||||
OSD_QUERY = 'show_text'
|
||||
@ -118,7 +111,6 @@ class OldMpvPlayer(MpvPlayer):
|
||||
self.setPaused(self._client.getGlobalPaused())
|
||||
self.setPosition(self._client.getGlobalPosition())
|
||||
|
||||
|
||||
class NewMpvPlayer(OldMpvPlayer):
|
||||
lastResetTime = None
|
||||
lastMPVPositionUpdate = None
|
||||
@ -128,18 +120,17 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
def displayMessage(self, message, duration=(constants.OSD_DURATION * 1000), OSDType=constants.OSD_NOTIFICATION,
|
||||
mood=constants.MESSAGE_NEUTRAL):
|
||||
if not self._client._config["chatOutputEnabled"]:
|
||||
super(self.__class__, self).displayMessage(message=message, duration=duration, OSDType=OSDType, mood=mood)
|
||||
super(self.__class__, self).displayMessage(message=message,duration=duration,OSDType=OSDType,mood=mood)
|
||||
return
|
||||
messageString = self._sanitizeText(message.replace("\\n", "<NEWLINE>")).replace(
|
||||
"\\\\", constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER).replace("<NEWLINE>", "\\n")
|
||||
messageString = self._sanitizeText(message.replace("\\n", "<NEWLINE>")).replace("\\\\",constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER).replace("<NEWLINE>", "\\n")
|
||||
self._listener.sendLine('script-message-to syncplayintf {}-osd-{} "{}"'.format(OSDType, mood, messageString))
|
||||
|
||||
def displayChatMessage(self, username, message):
|
||||
if not self._client._config["chatOutputEnabled"]:
|
||||
super(self.__class__, self).displayChatMessage(username, message)
|
||||
super(self.__class__, self).displayChatMessage(username,message)
|
||||
return
|
||||
username = self._sanitizeText(username.replace("\\", sconstants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER))
|
||||
message = self._sanitizeText(message.replace("\\", constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER))
|
||||
username = self._sanitizeText(username.replace("\\",constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER))
|
||||
message = self._sanitizeText(message.replace("\\",constants.MPV_INPUT_BACKSLASH_SUBSTITUTE_CHARACTER))
|
||||
messageString = "<{}> {}".format(username, message)
|
||||
self._listener.sendLine('script-message-to syncplayintf chat "{}"'.format(messageString))
|
||||
|
||||
@ -164,34 +155,25 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
self._listener.sendLine("print_text ""ANS_{}=${{{}}}""".format(property_, propertyID))
|
||||
|
||||
def getCalculatedPosition(self):
|
||||
if not self.fileLoaded:
|
||||
self._client.ui.showDebugMessage(
|
||||
"File not loaded so using GlobalPosition for getCalculatedPosition({})".format(
|
||||
self._client.getGlobalPosition()))
|
||||
if self.fileLoaded == False:
|
||||
self._client.ui.showDebugMessage("File not loaded so using GlobalPosition for getCalculatedPosition({})".format(self._client.getGlobalPosition()))
|
||||
return self._client.getGlobalPosition()
|
||||
|
||||
if self.lastMPVPositionUpdate is None:
|
||||
self._client.ui.showDebugMessage(
|
||||
"MPV not updated position so using GlobalPosition for getCalculatedPosition ({})".format(
|
||||
self._client.getGlobalPosition()))
|
||||
self._client.ui.showDebugMessage("MPV not updated position so using GlobalPosition for getCalculatedPosition ({})".format(self._client.getGlobalPosition()))
|
||||
return self._client.getGlobalPosition()
|
||||
|
||||
if self._recentlyReset():
|
||||
self._client.ui.showDebugMessage(
|
||||
"Recently reset so using self.position for getCalculatedPosition ({})".format(
|
||||
self._position))
|
||||
self._client.ui.showDebugMessage("Recently reset so using self.position for getCalculatedPosition ({})".format(self._position))
|
||||
return self._position
|
||||
|
||||
diff = time.time() - self.lastMPVPositionUpdate
|
||||
|
||||
if diff > constants.MPV_UNRESPONSIVE_THRESHOLD:
|
||||
self.reactor.callFromThread(
|
||||
self._client.ui.showErrorMessage, getMessage("mpv-unresponsive-error").format(int(diff)), True)
|
||||
self.reactor.callFromThread(self._client.ui.showErrorMessage, getMessage("mpv-unresponsive-error").format(int(diff)), True)
|
||||
self.drop()
|
||||
if diff > constants.PLAYER_ASK_DELAY and not self._paused:
|
||||
self._client.ui.showDebugMessage(
|
||||
"mpv did not response in time, so assuming position is {} ({}+{})".format(
|
||||
self._position + diff, self._position, diff))
|
||||
self._client.ui.showDebugMessage("mpv did not response in time, so assuming position is {} ({}+{})".format(self._position + diff, self._position, diff))
|
||||
return self._position + diff
|
||||
else:
|
||||
return self._position
|
||||
@ -202,10 +184,9 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
self._client.ui.showDebugMessage("Recently reset, so storing position as 0")
|
||||
self._position = 0
|
||||
elif self._fileIsLoaded() or (value < constants.MPV_NEWFILE_IGNORE_TIME and self._fileIsLoaded(ignoreDelay=True)):
|
||||
self._position = max(value, 0)
|
||||
self._position = max(value,0)
|
||||
else:
|
||||
self._client.ui.showDebugMessage(
|
||||
"No file loaded so storing position as GlobalPosition ({})".format(self._client.getGlobalPosition()))
|
||||
self._client.ui.showDebugMessage("No file loaded so storing position as GlobalPosition ({})".format(self._client.getGlobalPosition()))
|
||||
self._position = self._client.getGlobalPosition()
|
||||
|
||||
def _storePauseState(self, value):
|
||||
@ -224,8 +205,7 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
self._getPausedAndPosition()
|
||||
self._positionAsk.wait(constants.MPV_LOCK_WAIT_TIME)
|
||||
self._pausedAsk.wait(constants.MPV_LOCK_WAIT_TIME)
|
||||
self._client.updatePlayerStatus(
|
||||
self._paused if self.fileLoaded else self._client.getGlobalPaused(), self.getCalculatedPosition())
|
||||
self._client.updatePlayerStatus(self._paused if self.fileLoaded else self._client.getGlobalPaused(), self.getCalculatedPosition())
|
||||
|
||||
def _getPausedAndPosition(self):
|
||||
self._listener.sendLine("print_text ANS_pause=${pause}\r\nprint_text ANS_time-pos=${=time-pos}")
|
||||
@ -249,8 +229,7 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
|
||||
def setPosition(self, value):
|
||||
if value < constants.DO_NOT_RESET_POSITION_THRESHOLD and self._recentlyReset():
|
||||
self._client.ui.showDebugMessage(
|
||||
"Did not seek as recently reset and {} below 'do not reset position' threshold".format(value))
|
||||
self._client.ui.showDebugMessage("Did not seek as recently reset and {} below 'do not reset position' threshold".format(value))
|
||||
return
|
||||
super(self.__class__, self).setPosition(value)
|
||||
self.lastMPVPositionUpdate = time.time()
|
||||
@ -266,7 +245,7 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
self._client.ui.showDebugMessage("Want to set paused to {}".format(self._client.getGlobalPaused()))
|
||||
else:
|
||||
self._client.ui.showDebugMessage("Don't want to set paused to {}".format(self._client.getGlobalPaused()))
|
||||
if not resetPosition:
|
||||
if resetPosition == False:
|
||||
self.setPosition(self._client.getGlobalPosition())
|
||||
else:
|
||||
self._storePosition(0)
|
||||
@ -306,14 +285,7 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
self._listener.setReadyToSend(True)
|
||||
|
||||
def _setOSDPosition(self):
|
||||
if (
|
||||
self._client._config['chatMoveOSD'] and (
|
||||
self._client._config['chatOutputEnabled'] or (
|
||||
self._client._config['chatInputEnabled'] and
|
||||
self._client._config['chatInputPosition'] == constants.INPUT_POSITION_TOP
|
||||
)
|
||||
)
|
||||
):
|
||||
if self._client._config['chatMoveOSD'] and (self._client._config['chatOutputEnabled'] or (self._client._config['chatInputEnabled'] and self._client._config['chatInputPosition'] == constants.INPUT_POSITION_TOP)):
|
||||
self._setProperty("osd-align-y", "bottom")
|
||||
self._setProperty("osd-margin-y", int(self._client._config['chatOSDMargin']))
|
||||
|
||||
@ -337,9 +309,9 @@ class NewMpvPlayer(OldMpvPlayer):
|
||||
def _fileIsLoaded(self, ignoreDelay=False):
|
||||
if ignoreDelay:
|
||||
self._client.ui.showDebugMessage("Ignoring _fileIsLoaded MPV_NEWFILE delay")
|
||||
return bool(self.fileLoaded)
|
||||
return True if self.fileLoaded else False
|
||||
|
||||
return (
|
||||
self.fileLoaded and self.lastLoadedTime is not None and
|
||||
time.time() > (self.lastLoadedTime + constants.MPV_NEWFILE_IGNORE_TIME)
|
||||
)
|
||||
if self.fileLoaded == True and self.lastLoadedTime != None and time.time() > (self.lastLoadedTime + constants.MPV_NEWFILE_IGNORE_TIME):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import syncplay.players
|
||||
|
||||
|
||||
class PlayerFactory(object):
|
||||
def __init__(self):
|
||||
self._players = syncplay.players.getAvailablePlayers()
|
||||
|
||||
@ -1,24 +1,18 @@
|
||||
|
||||
import asynchat
|
||||
import asyncore
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
import socket
|
||||
import subprocess
|
||||
import sys
|
||||
import re
|
||||
import threading
|
||||
import time
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
from syncplay import constants, utils
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.players.basePlayer import BasePlayer
|
||||
from syncplay import constants, utils
|
||||
import os
|
||||
import sys
|
||||
import random
|
||||
import socket
|
||||
import asynchat, asyncore
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import time
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.utils import isBSD, isLinux, isWindows, isMacOS
|
||||
|
||||
|
||||
class VlcPlayer(BasePlayer):
|
||||
speedSupported = True
|
||||
customOpenDialog = False
|
||||
@ -53,8 +47,7 @@ class VlcPlayer(BasePlayer):
|
||||
if self.radixChar == "" or self.radixChar == "1" or self.radixChar == "5":
|
||||
raise ValueError
|
||||
except:
|
||||
self._client.ui.showErrorMessage(
|
||||
"Failed to determine locale. As a fallback Syncplay is using the following radix character: \".\".")
|
||||
self._client.ui.showErrorMessage("Failed to determine locale. As a fallback Syncplay is using the following radix character: \".\".")
|
||||
self.radixChar = "."
|
||||
|
||||
self._durationAsk = threading.Event()
|
||||
@ -117,8 +110,7 @@ class VlcPlayer(BasePlayer):
|
||||
return self._client.getGlobalPosition()
|
||||
diff = time.time() - self._lastVLCPositionUpdate
|
||||
if diff > constants.PLAYER_ASK_DELAY and not self._paused:
|
||||
self._client.ui.showDebugMessage("VLC did not response in time, so assuming position is {} ({}+{})".format(
|
||||
self._position + diff, self._position, diff))
|
||||
self._client.ui.showDebugMessage("VLC did not response in time, so assuming position is {} ({}+{})".format(self._position + diff, self._position, diff))
|
||||
if diff > constants.VLC_LATENCY_ERROR_THRESHOLD:
|
||||
if not self.shownVLCLatencyError or constants.DEBUG_MODE:
|
||||
self._client.ui.showErrorMessage(getMessage("media-player-latency-warning").format(int(diff)))
|
||||
@ -127,10 +119,7 @@ class VlcPlayer(BasePlayer):
|
||||
else:
|
||||
return self._position
|
||||
|
||||
def displayMessage(
|
||||
self, message,
|
||||
duration=constants.OSD_DURATION * 1000, OSDType=constants.OSD_DURATION, mood=constants.MESSAGE_NEUTRAL
|
||||
):
|
||||
def displayMessage(self, message, duration=constants.OSD_DURATION * 1000, OSDType=constants.OSD_DURATION, mood=constants.MESSAGE_NEUTRAL):
|
||||
duration /= 1000
|
||||
if OSDType != constants.OSD_ALERT:
|
||||
self._listener.sendLine('display-osd: {}, {}, {}'.format('top-right', duration, message))
|
||||
@ -223,25 +212,21 @@ class VlcPlayer(BasePlayer):
|
||||
self._duration = float(value.replace(",", "."))
|
||||
self._durationAsk.set()
|
||||
elif name == "playstate":
|
||||
self._paused = bool(value != 'playing') if (value != "no-input" and not self._filechanged) else self._client.getGlobalPaused()
|
||||
self._paused = bool(value != 'playing') if(value != "no-input" and self._filechanged == False) else self._client.getGlobalPaused()
|
||||
diff = time.time() - self._lastVLCPositionUpdate if self._lastVLCPositionUpdate else 0
|
||||
if (
|
||||
self._paused == False and
|
||||
self._position == self._previousPreviousPosition and
|
||||
self._previousPosition == self._position and
|
||||
self._duration > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH and
|
||||
(self._duration - self._position) < constants.VLC_EOF_DURATION_THRESHOLD and
|
||||
diff > constants.VLC_LATENCY_ERROR_THRESHOLD
|
||||
):
|
||||
if self._paused == False \
|
||||
and self._position == self._previousPreviousPosition \
|
||||
and self._previousPosition == self._position \
|
||||
and self._duration > constants.PLAYLIST_LOAD_NEXT_FILE_MINIMUM_LENGTH \
|
||||
and (self._duration - self._position) < constants.VLC_EOF_DURATION_THRESHOLD \
|
||||
and diff > constants.VLC_LATENCY_ERROR_THRESHOLD:
|
||||
self._client.ui.showDebugMessage("Treating 'playing' response as 'paused' due to VLC EOF bug")
|
||||
self.setPaused(True)
|
||||
self._pausedAsk.set()
|
||||
elif name == "position":
|
||||
newPosition = float(value.replace(",", ".")) if (value != "no-input" and not self._filechanged) else self._client.getGlobalPosition()
|
||||
if newPosition == self._previousPosition and newPosition != self._duration and self._paused is False:
|
||||
self._client.ui.showDebugMessage(
|
||||
"Not considering position {} duplicate as new time because of VLC time precision bug".format(
|
||||
newPosition))
|
||||
newPosition = float(value.replace(",", ".")) if (value != "no-input" and self._filechanged == False) else self._client.getGlobalPosition()
|
||||
if newPosition == self._previousPosition and newPosition != self._duration and not self._paused:
|
||||
self._client.ui.showDebugMessage("Not considering position {} duplicate as new time because of VLC time precision bug".format(newPosition))
|
||||
self._previousPreviousPosition = self._previousPosition
|
||||
self._previousPosition = self._position
|
||||
self._positionAsk.set()
|
||||
@ -341,7 +326,6 @@ class VlcPlayer(BasePlayer):
|
||||
call.append(filePath)
|
||||
else:
|
||||
call.append(self.__playerController.getMRL(filePath))
|
||||
|
||||
def _usevlcintf(vlcIntfPath, vlcIntfUserPath):
|
||||
vlcSyncplayInterfacePath = vlcIntfPath + "syncplay.lua"
|
||||
if not os.path.isfile(vlcSyncplayInterfacePath):
|
||||
@ -363,8 +347,7 @@ class VlcPlayer(BasePlayer):
|
||||
playerController.vlcIntfUserPath = os.path.join(os.getenv('HOME', '.'), ".local/share/vlc/lua/intf/")
|
||||
elif isMacOS():
|
||||
playerController.vlcIntfPath = "/Applications/VLC.app/Contents/MacOS/share/lua/intf/"
|
||||
playerController.vlcIntfUserPath = os.path.join(
|
||||
os.getenv('HOME', '.'), "Library/Application Support/org.videolan.vlc/lua/intf/")
|
||||
playerController.vlcIntfUserPath = os.path.join(os.getenv('HOME', '.'), "Library/Application Support/org.videolan.vlc/lua/intf/")
|
||||
elif isBSD():
|
||||
# *BSD ports/pkgs install to /usr/local by default.
|
||||
# This should also work for all the other BSDs, such as OpenBSD or DragonFly.
|
||||
@ -375,17 +358,14 @@ class VlcPlayer(BasePlayer):
|
||||
playerController.vlcIntfUserPath = os.path.join(os.getenv('APPDATA', '.'), "VLC\\lua\\intf\\")
|
||||
playerController.vlcModulePath = playerController.vlcIntfPath + "modules/?.luac"
|
||||
if _usevlcintf(playerController.vlcIntfPath, playerController.vlcIntfUserPath):
|
||||
playerController.SLAVE_ARGS.append(
|
||||
'--lua-config=syncplay={{port=\"{}\"}}'.format(str(playerController.vlcport)))
|
||||
playerController.SLAVE_ARGS.append('--lua-config=syncplay={{port=\"{}\"}}'.format(str(playerController.vlcport)))
|
||||
else:
|
||||
if isLinux():
|
||||
playerController.vlcDataPath = "/usr/lib/syncplay/resources"
|
||||
else:
|
||||
playerController.vlcDataPath = utils.findWorkingDir() + "\\resources"
|
||||
playerController.SLAVE_ARGS.append('--data-path={}'.format(playerController.vlcDataPath))
|
||||
playerController.SLAVE_ARGS.append(
|
||||
'--lua-config=syncplay={{modulepath=\"{}\",port=\"{}\"}}'.format(
|
||||
playerController.vlcModulePath, str(playerController.vlcport)))
|
||||
playerController.SLAVE_ARGS.append('--lua-config=syncplay={{modulepath=\"{}\",port=\"{}\"}}'.format(playerController.vlcModulePath, str(playerController.vlcport)))
|
||||
|
||||
call.extend(playerController.SLAVE_ARGS)
|
||||
if args:
|
||||
@ -396,15 +376,11 @@ class VlcPlayer(BasePlayer):
|
||||
self._vlcVersion = None
|
||||
|
||||
if self.oldIntfVersion:
|
||||
self.__playerController.drop(
|
||||
getMessage("vlc-interface-version-mismatch").format(
|
||||
self.oldIntfVersion, constants.VLC_INTERFACE_MIN_VERSION))
|
||||
self.__playerController.drop(getMessage("vlc-interface-version-mismatch").format(self.oldIntfVersion,constants.VLC_INTERFACE_MIN_VERSION))
|
||||
|
||||
else:
|
||||
if isWindows() and getattr(sys, 'frozen', '') and getattr(sys, '_MEIPASS', '') is not None: # Needed for pyinstaller --onefile bundle
|
||||
self.__process = subprocess.Popen(
|
||||
call, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
shell=False, creationflags=0x08000000)
|
||||
if isWindows() and getattr(sys, 'frozen', '') and getattr(sys, '_MEIPASS', '') is not None: #Needed for pyinstaller --onefile bundle
|
||||
self.__process = subprocess.Popen(call, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=False, creationflags=0x08000000)
|
||||
else:
|
||||
self.__process = subprocess.Popen(call, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
self.timeVLCLaunched = time.time()
|
||||
@ -429,7 +405,7 @@ class VlcPlayer(BasePlayer):
|
||||
if not isMacOS():
|
||||
self.__process.stderr = None
|
||||
else:
|
||||
vlcoutputthread = threading.Thread(target=self.handle_vlcoutput, args=())
|
||||
vlcoutputthread = threading.Thread(target = self.handle_vlcoutput, args=())
|
||||
vlcoutputthread.setDaemon(True)
|
||||
vlcoutputthread.start()
|
||||
threading.Thread.__init__(self, name="VLC Listener")
|
||||
@ -440,7 +416,10 @@ class VlcPlayer(BasePlayer):
|
||||
self._sendingData = threading.Lock()
|
||||
|
||||
def _shouldListenForSTDOUT(self):
|
||||
return not isWindows()
|
||||
if isWindows():
|
||||
return False # Due to VLC3 not using STDOUT/STDERR
|
||||
else:
|
||||
return True
|
||||
|
||||
def initiate_send(self):
|
||||
with self._sendingData:
|
||||
@ -483,6 +462,7 @@ class VlcPlayer(BasePlayer):
|
||||
break
|
||||
out.close()
|
||||
|
||||
|
||||
def found_terminator(self):
|
||||
self.vlcHasResponded = True
|
||||
self.__playerController.lineReceived(b"".join(self._ibuffer))
|
||||
|
||||
@ -1,16 +1,13 @@
|
||||
# coding:utf8
|
||||
import json
|
||||
import time
|
||||
from functools import wraps
|
||||
|
||||
from twisted.protocols.basic import LineReceiver
|
||||
|
||||
import json
|
||||
import syncplay
|
||||
from syncplay.constants import PING_MOVING_AVERAGE_WEIGHT, CONTROLLED_ROOMS_MIN_VERSION, USER_READY_MIN_VERSION, SHARED_PLAYLIST_MIN_VERSION, CHAT_MIN_VERSION
|
||||
from functools import wraps
|
||||
import time
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.constants import PING_MOVING_AVERAGE_WEIGHT, CONTROLLED_ROOMS_MIN_VERSION, USER_READY_MIN_VERSION, SHARED_PLAYLIST_MIN_VERSION, CHAT_MIN_VERSION
|
||||
from syncplay.utils import meetsMinVersion
|
||||
|
||||
|
||||
class JSONCommandProtocol(LineReceiver):
|
||||
def handleMessages(self, messages):
|
||||
for message in messages.items():
|
||||
@ -105,11 +102,9 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
hello = {}
|
||||
hello["username"] = self._client.getUsername()
|
||||
password = self._client.getPassword()
|
||||
if password:
|
||||
hello["password"] = password
|
||||
if password: hello["password"] = password
|
||||
room = self._client.getRoom()
|
||||
if room:
|
||||
hello["room"] = {"name": room}
|
||||
if room: hello["room"] = {"name" :room}
|
||||
hello["version"] = "1.2.255" # Used so newer clients work on 1.2.X server
|
||||
hello["realversion"] = syncplay.version
|
||||
hello["features"] = self._client.getFeatures()
|
||||
@ -154,7 +149,7 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
elif command == "playlistChange":
|
||||
self._client.playlist.changePlaylist(values['files'], values['user'])
|
||||
elif command == "features":
|
||||
self._client.setUserFeatures(values["username"], values['features'])
|
||||
self._client.setUserFeatures(values["username"],values['features'])
|
||||
|
||||
def sendFeaturesUpdate(self, features):
|
||||
self.sendSet({"features": features})
|
||||
@ -165,15 +160,14 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
def sendRoomSetting(self, roomName, password=None):
|
||||
setting = {}
|
||||
setting["name"] = roomName
|
||||
if password:
|
||||
setting["password"] = password
|
||||
if password: setting["password"] = password
|
||||
self.sendSet({"room": setting})
|
||||
|
||||
def sendFileSetting(self, file_):
|
||||
self.sendSet({"file": file_})
|
||||
self.sendList()
|
||||
|
||||
def sendChatMessage(self, chatMessage):
|
||||
def sendChatMessage(self,chatMessage):
|
||||
self.sendMessage({"Chat": chatMessage})
|
||||
|
||||
def handleList(self, userList):
|
||||
@ -237,8 +231,7 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
state["playstate"] = {}
|
||||
state["playstate"]["position"] = position
|
||||
state["playstate"]["paused"] = paused
|
||||
if doSeek:
|
||||
state["playstate"]["doSeek"] = doSeek
|
||||
if doSeek: state["playstate"]["doSeek"] = doSeek
|
||||
state["ping"] = {}
|
||||
if latencyCalculation:
|
||||
state["ping"]["latencyCalculation"] = latencyCalculation
|
||||
@ -262,8 +255,7 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
"password": password
|
||||
}
|
||||
})
|
||||
|
||||
def handleChat(self, message):
|
||||
def handleChat(self,message):
|
||||
username = message['username']
|
||||
userMessage = message['message']
|
||||
self._client.ui.showChatMessage(username, userMessage)
|
||||
@ -290,13 +282,13 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
def handleError(self, error):
|
||||
self.dropWithError(error["message"])
|
||||
|
||||
def sendError(self, message):
|
||||
self.sendMessage({"Error": {"message": message}})
|
||||
|
||||
|
||||
class SyncServerProtocol(JSONCommandProtocol):
|
||||
def __init__(self, factory):
|
||||
self._factory = factory
|
||||
@ -399,9 +391,9 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
self.sendHello(version)
|
||||
|
||||
@requireLogged
|
||||
def handleChat(self, chatMessage):
|
||||
def handleChat(self,chatMessage):
|
||||
if not self._factory.disableChat:
|
||||
self._factory.sendChat(self._watcher, chatMessage)
|
||||
self._factory.sendChat(self._watcher,chatMessage)
|
||||
|
||||
def setFeatures(self, features):
|
||||
self._features = features
|
||||
@ -418,8 +410,7 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
hello["username"] = username
|
||||
userIp = self.transport.getPeer().host
|
||||
room = self._watcher.getRoom()
|
||||
if room:
|
||||
hello["room"] = {"name": room.getName()}
|
||||
if room: hello["room"] = {"name": room.getName()}
|
||||
hello["version"] = clientVersion # Used so 1.2.X client works on newer server
|
||||
hello["realversion"] = syncplay.version
|
||||
hello["motd"] = self._factory.getMotd(userIp, username, room, clientVersion)
|
||||
@ -447,7 +438,7 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
elif command == "playlistIndex":
|
||||
self._factory.setPlaylistIndex(self._watcher, set_[1]['index'])
|
||||
elif command == "features":
|
||||
# TODO: Check
|
||||
#TODO: Check
|
||||
self._watcher.setFeatures(set_[1])
|
||||
|
||||
def sendSet(self, setting):
|
||||
@ -470,6 +461,7 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
def sendSetReady(self, username, isReady, manuallyInitiated=True):
|
||||
self.sendSet({
|
||||
"ready": {
|
||||
@ -564,6 +556,7 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
if self.serverIgnoringOnTheFly == 0 or forced:
|
||||
self.sendMessage({"State": state})
|
||||
|
||||
|
||||
def _extractStatePlaystateArguments(self, state):
|
||||
position = state["playstate"]["position"] if "position" in state["playstate"] else 0
|
||||
paused = state["playstate"]["paused"] if "paused" in state["playstate"] else None
|
||||
@ -597,7 +590,6 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
def sendError(self, message):
|
||||
self.sendMessage({"Error": {"message": message}})
|
||||
|
||||
|
||||
class PingService(object):
|
||||
|
||||
def __init__(self):
|
||||
|
||||
@ -1,26 +1,20 @@
|
||||
|
||||
import argparse
|
||||
import codecs
|
||||
import hashlib
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
from string import Template
|
||||
|
||||
from twisted.internet import task, reactor
|
||||
from twisted.internet.protocol import Factory
|
||||
|
||||
import syncplay
|
||||
from syncplay.protocols import SyncServerProtocol
|
||||
import time
|
||||
from syncplay import constants
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.protocols import SyncServerProtocol
|
||||
import codecs
|
||||
import os
|
||||
from string import Template
|
||||
import argparse
|
||||
from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion, playlistIsValid, truncateText
|
||||
|
||||
|
||||
class SyncFactory(Factory):
|
||||
def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None,
|
||||
disableReady=False, disableChat=False, maxChatMessageLength=constants.MAX_CHAT_MESSAGE_LENGTH,
|
||||
maxUsernameLength=constants.MAX_USERNAME_LENGTH):
|
||||
def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False,disableChat=False, maxChatMessageLength=constants.MAX_CHAT_MESSAGE_LENGTH, maxUsernameLength=constants.MAX_USERNAME_LENGTH):
|
||||
self.isolateRooms = isolateRooms
|
||||
print(getMessage("welcome-server-notification").format(syncplay.version))
|
||||
if password:
|
||||
@ -159,9 +153,9 @@ class SyncFactory(Factory):
|
||||
except ValueError:
|
||||
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
|
||||
|
||||
def sendChat(self, watcher, message):
|
||||
def sendChat(self,watcher,message):
|
||||
message = truncateText(message, constants.MAX_CHAT_MESSAGE_LENGTH)
|
||||
messageDict = {"message": message, "username": watcher.getName()}
|
||||
messageDict={"message":message,"username" : watcher.getName()}
|
||||
self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict))
|
||||
|
||||
def setReady(self, watcher, isReady, manuallyInitiated=True):
|
||||
@ -185,7 +179,6 @@ class SyncFactory(Factory):
|
||||
else:
|
||||
watcher.setPlaylistIndex(room.getName(), room.getPlaylistIndex())
|
||||
|
||||
|
||||
class RoomManager(object):
|
||||
def __init__(self):
|
||||
self._rooms = {}
|
||||
@ -236,7 +229,7 @@ class RoomManager(object):
|
||||
del self._rooms[room.getName()]
|
||||
|
||||
def findFreeUsername(self, username):
|
||||
username = truncateText(username, constants.MAX_USERNAME_LENGTH)
|
||||
username = truncateText(username,constants.MAX_USERNAME_LENGTH)
|
||||
allnames = []
|
||||
for room in self._rooms.values():
|
||||
for watcher in room.getWatchers():
|
||||
@ -348,7 +341,6 @@ class Room(object):
|
||||
def getPlaylistIndex(self):
|
||||
return self._playlistIndex
|
||||
|
||||
|
||||
class ControlledRoom(Room):
|
||||
def __init__(self, name):
|
||||
Room.__init__(self, name)
|
||||
@ -397,7 +389,6 @@ class ControlledRoom(Room):
|
||||
def getControllers(self):
|
||||
return self._controllers
|
||||
|
||||
|
||||
class Watcher(object):
|
||||
def __init__(self, server, connector, name):
|
||||
self._ready = None
|
||||
@ -414,7 +405,7 @@ class Watcher(object):
|
||||
|
||||
def setFile(self, file_):
|
||||
if file_ and "name" in file_:
|
||||
file_["name"] = truncateText(file_["name"], constants.MAX_FILENAME_LENGTH)
|
||||
file_["name"] = truncateText(file_["name"],constants.MAX_FILENAME_LENGTH)
|
||||
self._file = file_
|
||||
self._server.sendFileUpdate(self)
|
||||
|
||||
@ -471,9 +462,9 @@ class Watcher(object):
|
||||
def sendControlledRoomAuthStatus(self, success, username, room):
|
||||
self._connector.sendControlledRoomAuthStatus(success, username, room)
|
||||
|
||||
def sendChatMessage(self, message):
|
||||
def sendChatMessage(self,message):
|
||||
if self._connector.meetsMinVersion(constants.CHAT_MIN_VERSION):
|
||||
self._connector.sendMessage({"Chat": message})
|
||||
self._connector.sendMessage({"Chat" : message})
|
||||
|
||||
def sendSetReady(self, username, isReady, manuallyInitiated=True):
|
||||
self._connector.sendSetReady(username, isReady, manuallyInitiated)
|
||||
@ -540,7 +531,6 @@ class Watcher(object):
|
||||
return RoomPasswordProvider.isControlledRoom(self._room.getName()) \
|
||||
and self._room.canControl(self)
|
||||
|
||||
|
||||
class ConfigurationGetter(object):
|
||||
def getConfiguration(self):
|
||||
self._prepareArgParser()
|
||||
@ -550,8 +540,7 @@ class ConfigurationGetter(object):
|
||||
return args
|
||||
|
||||
def _prepareArgParser(self):
|
||||
self._argparser = argparse.ArgumentParser(
|
||||
description=getMessage("server-argument-description"),
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("server-argument-description"),
|
||||
epilog=getMessage("server-argument-epilog"))
|
||||
self._argparser.add_argument('--port', metavar='port', type=str, nargs='?', help=getMessage("server-port-argument"))
|
||||
self._argparser.add_argument('--password', metavar='password', type=str, nargs='?', help=getMessage("server-password-argument"))
|
||||
@ -560,5 +549,5 @@ class ConfigurationGetter(object):
|
||||
self._argparser.add_argument('--disable-chat', action='store_true', help=getMessage("server-chat-argument"))
|
||||
self._argparser.add_argument('--salt', metavar='salt', type=str, nargs='?', help=getMessage("server-salt-argument"))
|
||||
self._argparser.add_argument('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument"))
|
||||
self._argparser.add_argument('--max-chat-message-length', metavar='maxChatMessageLength', type=int, nargs='?', help=getMessage("server-chat-maxchars-argument").format(constants.MAX_CHAT_MESSAGE_LENGTH))
|
||||
self._argparser.add_argument('--max-username-length', metavar='maxUsernameLength', type=int, nargs='?', help=getMessage("server-maxusernamelength-argument").format(constants.MAX_USERNAME_LENGTH))
|
||||
self._argparser.add_argument('--max-chat-message-length', metavar='maxChatMessageLength',type=int, nargs='?',help=getMessage("server-chat-maxchars-argument").format(constants.MAX_CHAT_MESSAGE_LENGTH))
|
||||
self._argparser.add_argument('--max-username-length', metavar='maxUsernameLength', type=int, nargs='?',help=getMessage("server-maxusernamelength-argument").format(constants.MAX_USERNAME_LENGTH))
|
||||
|
||||
@ -1,23 +1,19 @@
|
||||
|
||||
from configparser import SafeConfigParser, DEFAULTSECT
|
||||
import argparse
|
||||
import ast
|
||||
import codecs
|
||||
import re
|
||||
import os
|
||||
import sys
|
||||
from configparser import SafeConfigParser, DEFAULTSECT
|
||||
|
||||
import ast
|
||||
from syncplay import constants, utils, version, milestone
|
||||
from syncplay.messages import getMessage, setLanguage, isValidLanguage
|
||||
from syncplay.players.playerFactory import PlayerFactory
|
||||
from syncplay.utils import isMacOS
|
||||
|
||||
import codecs
|
||||
import re
|
||||
|
||||
class InvalidConfigValue(Exception):
|
||||
def __init__(self, message):
|
||||
Exception.__init__(self, message)
|
||||
|
||||
|
||||
class ConfigurationGetter(object):
|
||||
def __init__(self):
|
||||
self._config = {
|
||||
@ -35,7 +31,7 @@ class ConfigurationGetter(object):
|
||||
"mediaSearchDirectories": None,
|
||||
"sharedPlaylistEnabled": True,
|
||||
"loopAtEndOfPlaylist": False,
|
||||
"loopSingleFiles": False,
|
||||
"loopSingleFiles" : False,
|
||||
"onlySwitchToTrustedDomains": True,
|
||||
"trustedDomains": constants.DEFAULT_TRUSTED_DOMAINS,
|
||||
"file": None,
|
||||
@ -53,26 +49,26 @@ class ConfigurationGetter(object):
|
||||
"pauseOnLeave": False,
|
||||
"readyAtStart": False,
|
||||
"unpauseAction": constants.UNPAUSE_IFOTHERSREADY_MODE,
|
||||
"autoplayInitialState": None,
|
||||
"autoplayMinUsers": -1,
|
||||
"autoplayInitialState" : None,
|
||||
"autoplayMinUsers" : -1,
|
||||
"autoplayRequireSameFilenames": True,
|
||||
"clearGUIData": False,
|
||||
"language": "",
|
||||
"checkForUpdatesAutomatically": None,
|
||||
"lastCheckedForUpdates": "",
|
||||
"resetConfig": False,
|
||||
"showOSD": True,
|
||||
"showOSDWarnings": True,
|
||||
"showSlowdownOSD": True,
|
||||
"showDifferentRoomOSD": False,
|
||||
"showSameRoomOSD": True,
|
||||
"showNonControllerOSD": False,
|
||||
"showContactInfo": True,
|
||||
"showDurationNotification": True,
|
||||
"chatInputEnabled": True,
|
||||
"chatInputFontFamily": 'sans-serif',
|
||||
"chatInputRelativeFontSize": constants.DEFAULT_CHAT_FONT_SIZE,
|
||||
"chatInputFontWeight": constants.DEFAULT_CHAT_FONT_WEIGHT,
|
||||
"language" : "",
|
||||
"checkForUpdatesAutomatically" : None,
|
||||
"lastCheckedForUpdates" : "",
|
||||
"resetConfig" : False,
|
||||
"showOSD" : True,
|
||||
"showOSDWarnings" : True,
|
||||
"showSlowdownOSD" : True,
|
||||
"showDifferentRoomOSD" : False,
|
||||
"showSameRoomOSD" : True,
|
||||
"showNonControllerOSD" : False,
|
||||
"showContactInfo" : True,
|
||||
"showDurationNotification" : True,
|
||||
"chatInputEnabled" : True,
|
||||
"chatInputFontFamily" : 'sans-serif',
|
||||
"chatInputRelativeFontSize" : constants.DEFAULT_CHAT_FONT_SIZE,
|
||||
"chatInputFontWeight" : constants.DEFAULT_CHAT_FONT_WEIGHT,
|
||||
"chatInputFontUnderline": False,
|
||||
"chatInputFontColor": constants.DEFAULT_CHAT_INPUT_FONT_COLOR,
|
||||
"chatInputPosition": constants.INPUT_POSITION_TOP,
|
||||
@ -92,7 +88,7 @@ class ConfigurationGetter(object):
|
||||
"notificationTimeout": 3,
|
||||
"alertTimeout": 5,
|
||||
"chatTimeout": 7,
|
||||
"publicServers": []
|
||||
"publicServers" : []
|
||||
}
|
||||
|
||||
self._defaultConfig = self._config.copy()
|
||||
@ -179,8 +175,7 @@ class ConfigurationGetter(object):
|
||||
|
||||
self._iniStructure = {
|
||||
"server_data": ["host", "port", "password"],
|
||||
"client_settings": [
|
||||
"name", "room", "playerPath",
|
||||
"client_settings": ["name", "room", "playerPath",
|
||||
"perPlayerArguments", "slowdownThreshold",
|
||||
"rewindThreshold", "fastforwardThreshold",
|
||||
"slowOnDesync", "rewindOnDesync",
|
||||
@ -191,15 +186,14 @@ class ConfigurationGetter(object):
|
||||
"autoplayInitialState", "mediaSearchDirectories",
|
||||
"sharedPlaylistEnabled", "loopAtEndOfPlaylist",
|
||||
"loopSingleFiles",
|
||||
"onlySwitchToTrustedDomains", "trustedDomains", "publicServers"],
|
||||
"gui": [
|
||||
"showOSD", "showOSDWarnings", "showSlowdownOSD",
|
||||
"onlySwitchToTrustedDomains", "trustedDomains","publicServers"],
|
||||
"gui": ["showOSD", "showOSDWarnings", "showSlowdownOSD",
|
||||
"showDifferentRoomOSD", "showSameRoomOSD",
|
||||
"showNonControllerOSD", "showDurationNotification",
|
||||
"chatInputEnabled", "chatInputFontUnderline",
|
||||
"chatInputEnabled","chatInputFontUnderline",
|
||||
"chatInputFontFamily", "chatInputRelativeFontSize",
|
||||
"chatInputFontWeight", "chatInputFontColor",
|
||||
"chatInputPosition", "chatDirectInput",
|
||||
"chatInputPosition","chatDirectInput",
|
||||
"chatOutputFontFamily", "chatOutputRelativeFontSize",
|
||||
"chatOutputFontWeight", "chatOutputFontUnderline",
|
||||
"chatOutputMode", "chatMaxLines",
|
||||
@ -207,9 +201,8 @@ class ConfigurationGetter(object):
|
||||
"chatBottomMargin", "chatDirectInput",
|
||||
"chatMoveOSD", "chatOSDMargin",
|
||||
"notificationTimeout", "alertTimeout",
|
||||
"chatTimeout", "chatOutputEnabled"],
|
||||
"general": [
|
||||
"language", "checkForUpdatesAutomatically",
|
||||
"chatTimeout","chatOutputEnabled"],
|
||||
"general": ["language", "checkForUpdatesAutomatically",
|
||||
"lastCheckedForUpdates"]
|
||||
}
|
||||
|
||||
@ -222,7 +215,7 @@ class ConfigurationGetter(object):
|
||||
self._config = self._defaultConfig
|
||||
self._config['language'] = language
|
||||
self._config['checkForUpdatesAutomatically'] = checkForUpdatesAutomatically
|
||||
raise InvalidConfigValue("*" + getMessage("config-cleared-notification"))
|
||||
raise InvalidConfigValue("*"+getMessage("config-cleared-notification"))
|
||||
|
||||
if not isValidLanguage(self._config['language']):
|
||||
self._config['language'] = ""
|
||||
@ -231,7 +224,7 @@ class ConfigurationGetter(object):
|
||||
try:
|
||||
if varToTest == "" or varToTest is None:
|
||||
return False
|
||||
if not str(varToTest).isdigit():
|
||||
if str(varToTest).isdigit() == False:
|
||||
return False
|
||||
varToTest = int(varToTest)
|
||||
if varToTest > 65535 or varToTest < 1:
|
||||
@ -239,7 +232,6 @@ class ConfigurationGetter(object):
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
for key in self._boolean:
|
||||
if self._config[key] == "True":
|
||||
self._config[key] = True
|
||||
@ -277,14 +269,13 @@ class ConfigurationGetter(object):
|
||||
self._config["playerClass"] = player
|
||||
else:
|
||||
raise InvalidConfigValue(getMessage("player-path-config-error"))
|
||||
playerPathErrors = player.getPlayerPathErrors(
|
||||
self._config["playerPath"], self._config['file'] if self._config['file'] else None)
|
||||
playerPathErrors = player.getPlayerPathErrors(self._config["playerPath"], self._config['file'] if self._config['file'] else None)
|
||||
if playerPathErrors:
|
||||
raise InvalidConfigValue(playerPathErrors)
|
||||
elif key == "host":
|
||||
self._config["host"], self._config["port"] = self._splitPortAndHost(self._config["host"])
|
||||
hostNotValid = (self._config["host"] == "" or self._config["host"] is None)
|
||||
portNotValid = (not _isPortValid(self._config["port"]))
|
||||
portNotValid = (_isPortValid(self._config["port"]) == False)
|
||||
if hostNotValid:
|
||||
raise InvalidConfigValue(getMessage("no-hostname-config-error"))
|
||||
elif portNotValid:
|
||||
@ -334,12 +325,12 @@ class ConfigurationGetter(object):
|
||||
if configFile:
|
||||
return configFile
|
||||
for name in constants.CONFIG_NAMES:
|
||||
configFile = self._expandConfigPath(name, xdg=False)
|
||||
configFile = self._expandConfigPath(name, xdg = False)
|
||||
if os.path.isfile(configFile):
|
||||
return configFile
|
||||
return self._expandConfigPath()
|
||||
|
||||
def _expandConfigPath(self, name=None, xdg=True):
|
||||
def _expandConfigPath(self, name = None, xdg = True):
|
||||
if os.name != 'nt':
|
||||
if xdg:
|
||||
prefix = self._getXdgConfigHome()
|
||||
@ -417,6 +408,7 @@ class ConfigurationGetter(object):
|
||||
if changed:
|
||||
parser.write(codecs.open(iniPath, "wb", "utf_8_sig"))
|
||||
|
||||
|
||||
def _forceGuiPrompt(self):
|
||||
from syncplay.ui.GuiConfiguration import GuiConfiguration
|
||||
try:
|
||||
@ -460,8 +452,7 @@ class ConfigurationGetter(object):
|
||||
#
|
||||
if self._config['language']:
|
||||
setLanguage(self._config['language'])
|
||||
self._argparser = argparse.ArgumentParser(
|
||||
description=getMessage("argument-description"),
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("argument-description"),
|
||||
epilog=getMessage("argument-epilog"))
|
||||
self._argparser.add_argument('--no-gui', action='store_true', help=getMessage("nogui-argument"))
|
||||
self._argparser.add_argument('-a', '--host', metavar='hostname', type=str, help=getMessage("host-argument"))
|
||||
@ -523,7 +514,6 @@ class ConfigurationGetter(object):
|
||||
self._saveConfig(path)
|
||||
self._config = backup
|
||||
|
||||
|
||||
class SafeConfigParserUnicode(SafeConfigParser):
|
||||
def write(self, fp):
|
||||
"""Write an .ini-format representation of the configuration state."""
|
||||
|
||||
@ -1,24 +1,19 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
from datetime import datetime
|
||||
|
||||
from syncplay import constants
|
||||
from syncplay import utils
|
||||
from syncplay.messages import getMessage, getLanguages, setLanguage, getInitialLanguage
|
||||
from syncplay.players.playerFactory import PlayerFactory
|
||||
from syncplay.utils import isBSD, isLinux, isMacOS, isWindows
|
||||
from syncplay.utils import resourcespath, posixresourcespath
|
||||
|
||||
from syncplay.vendor.Qt import QtCore, QtWidgets, QtGui, __binding__, IsPySide, IsPySide2
|
||||
from syncplay.vendor.Qt.QtCore import Qt, QSettings, QCoreApplication, QSize, QPoint, QUrl, QLine, QEventLoop, Signal
|
||||
from syncplay.vendor.Qt.QtWidgets import QApplication, QLineEdit, QLabel, QCheckBox, QButtonGroup, QRadioButton, QDoubleSpinBox, QPlainTextEdit
|
||||
from syncplay.vendor.Qt.QtGui import QCursor, QIcon, QImage, QDesktopServices
|
||||
if IsPySide2:
|
||||
from PySide2.QtCore import QStandardPaths
|
||||
|
||||
|
||||
from syncplay.players.playerFactory import PlayerFactory
|
||||
from datetime import datetime
|
||||
from syncplay import utils
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
from syncplay.messages import getMessage, getLanguages, setLanguage, getInitialLanguage
|
||||
from syncplay import constants
|
||||
from syncplay.utils import isBSD, isLinux, isMacOS, isWindows
|
||||
from syncplay.utils import resourcespath, posixresourcespath
|
||||
class GuiConfiguration:
|
||||
def __init__(self, config, error=None, defaultConfig=None):
|
||||
self.defaultConfig = defaultConfig
|
||||
@ -87,10 +82,8 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
def automaticUpdatePromptCheck(self):
|
||||
if self.automaticupdatesCheckbox.checkState() == Qt.PartiallyChecked:
|
||||
reply = QtWidgets.QMessageBox.question(
|
||||
self, "Syncplay",
|
||||
getMessage("promptforupdate-label"),
|
||||
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
|
||||
reply = QtWidgets.QMessageBox.question(self, "Syncplay",
|
||||
getMessage("promptforupdate-label"), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
|
||||
if reply == QtWidgets.QMessageBox.Yes:
|
||||
self.automaticupdatesCheckbox.setChecked(True)
|
||||
else:
|
||||
@ -98,7 +91,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
def moreToggled(self):
|
||||
self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
||||
if self.moreToggling is False:
|
||||
if self.moreToggling == False:
|
||||
self.moreToggling = True
|
||||
|
||||
if self.showmoreCheckbox.isChecked():
|
||||
@ -130,7 +123,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.mediabrowseButton.show()
|
||||
self.saveMoreState(False)
|
||||
self.stackedLayout.setCurrentIndex(0)
|
||||
newHeight = self.connectionSettingsGroup.minimumSizeHint().height() + self.mediaplayerSettingsGroup.minimumSizeHint().height() + self.bottomButtonFrame.minimumSizeHint().height() + 3
|
||||
newHeight = self.connectionSettingsGroup.minimumSizeHint().height()+self.mediaplayerSettingsGroup.minimumSizeHint().height()+self.bottomButtonFrame.minimumSizeHint().height()+3
|
||||
if self.error:
|
||||
newHeight += self.errorLabel.height()+3
|
||||
self.stackedFrame.setFixedHeight(newHeight)
|
||||
@ -161,7 +154,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
settings.endGroup()
|
||||
foundpath = ""
|
||||
|
||||
if playerpath is not None and playerpath != "":
|
||||
if playerpath != None and playerpath != "":
|
||||
if utils.isURL(playerpath):
|
||||
foundpath = playerpath
|
||||
self.executablepathCombobox.addItem(foundpath)
|
||||
@ -169,7 +162,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
else:
|
||||
if not os.path.isfile(playerpath):
|
||||
expandedpath = PlayerFactory().getExpandedPlayerPathByPath(playerpath)
|
||||
if expandedpath is not None and os.path.isfile(expandedpath):
|
||||
if expandedpath != None and os.path.isfile(expandedpath):
|
||||
playerpath = expandedpath
|
||||
|
||||
if os.path.isfile(playerpath):
|
||||
@ -233,7 +226,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
if currentplayerpath:
|
||||
NewPlayerArgs = self.playerargsTextbox.text().split(" ") if self.playerargsTextbox.text() else ""
|
||||
self.perPlayerArgs[self.executablepathCombobox.currentText()] = NewPlayerArgs
|
||||
self.perPlayerArgs[self.executablepathCombobox.currentText()]=NewPlayerArgs
|
||||
|
||||
def languageChanged(self):
|
||||
setLanguage(str(self.languageCombobox.itemData(self.languageCombobox.currentIndex())))
|
||||
@ -259,8 +252,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
elif isBSD():
|
||||
defaultdirectory = "/usr/local/bin"
|
||||
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(
|
||||
self,
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self,
|
||||
"Browse for media player executable",
|
||||
defaultdirectory,
|
||||
browserfilter, "", options)
|
||||
@ -395,8 +387,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
else:
|
||||
defaultdirectory = ""
|
||||
browserfilter = "All files (*)"
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(
|
||||
self, "Browse for media files", defaultdirectory,
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self, "Browse for media files", defaultdirectory,
|
||||
browserfilter, "", options)
|
||||
if fileName:
|
||||
self.mediapathTextbox.setText(os.path.normpath(fileName))
|
||||
@ -421,7 +412,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.processWidget(self, lambda w: self.saveValues(w))
|
||||
if self.hostCombobox.currentText():
|
||||
self.config['host'] = self.hostCombobox.currentText() if ":" in self.hostCombobox.currentText() else self.hostCombobox.currentText() + ":" + str(constants.DEFAULT_PORT)
|
||||
self.config['host'] = self.config['host'].replace(" ", "").replace("\t", "").replace("\n", "").replace("\r", "")
|
||||
self.config['host'] = self.config['host'].replace(" ","").replace("\t", "").replace("\n","").replace("\r","")
|
||||
else:
|
||||
self.config['host'] = None
|
||||
self.config['playerPath'] = str(self.safenormcaseandpath(self.executablepathCombobox.currentText()))
|
||||
@ -551,10 +542,10 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
config = self.config
|
||||
playerpaths = self.playerpaths
|
||||
error = self.error
|
||||
if self.datacleared:
|
||||
if self.datacleared == True:
|
||||
error = constants.ERROR_MESSAGE_MARKER + "{}".format(getMessage("gui-data-cleared-notification"))
|
||||
self.error = error
|
||||
if config['host'] is None:
|
||||
if config['host'] == None:
|
||||
host = ""
|
||||
elif ":" in config['host']:
|
||||
host = config['host']
|
||||
@ -575,7 +566,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
serverAddressPort = publicServer[1]
|
||||
self.hostCombobox.addItem(serverAddressPort)
|
||||
self.hostCombobox.setItemData(i, serverTitle, Qt.ToolTipRole)
|
||||
if serverAddressPort not in self.publicServerAddresses:
|
||||
if not serverAddressPort in self.publicServerAddresses:
|
||||
self.publicServerAddresses.append(serverAddressPort)
|
||||
i += 1
|
||||
self.hostCombobox.setEditable(True)
|
||||
@ -658,8 +649,8 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.mediaplayerSettingsLayout.addWidget(self.executablepathCombobox, 0, 2)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.executablebrowseButton, 0, 3)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediapathLabel, 1, 0)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediapathTextbox, 1, 2)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediabrowseButton, 1, 3)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediapathTextbox , 1, 2)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediabrowseButton , 1, 3)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.playerargsLabel, 2, 0, 1, 2)
|
||||
self.mediaplayerSettingsLayout.addWidget(self.playerargsTextbox, 2, 2, 1, 2)
|
||||
self.mediaplayerSettingsGroup.setLayout(self.mediaplayerSettingsLayout)
|
||||
@ -845,7 +836,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.desyncFrame.setMidLineWidth(0)
|
||||
|
||||
self.desyncSettingsLayout.addWidget(self.slowdownCheckbox, 0, 0, 1, 2, Qt.AlignLeft)
|
||||
self.desyncSettingsLayout.addWidget(self.rewindCheckbox, 1, 0, 1, 2, Qt.AlignLeft)
|
||||
self.desyncSettingsLayout.addWidget(self.rewindCheckbox, 1, 0,1,2, Qt.AlignLeft)
|
||||
|
||||
self.desyncSettingsLayout.setAlignment(Qt.AlignLeft)
|
||||
self.desyncSettingsGroup.setLayout(self.desyncSettingsLayout)
|
||||
@ -863,7 +854,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.othersyncSettingsLayout.addWidget(self.dontslowwithmeCheckbox, 2, 0, 1, 2, Qt.AlignLeft)
|
||||
|
||||
self.othersyncSettingsLayout.setAlignment(Qt.AlignLeft)
|
||||
self.othersyncSettingsLayout.addWidget(self.fastforwardCheckbox, 3, 0, 1, 2, Qt.AlignLeft)
|
||||
self.othersyncSettingsLayout.addWidget(self.fastforwardCheckbox, 3, 0,1,2, Qt.AlignLeft)
|
||||
|
||||
|
||||
## Trusted domains
|
||||
@ -900,13 +891,13 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.chatInputGroup.setLayout(self.chatInputLayout)
|
||||
self.chatInputEnabledCheckbox = QCheckBox(getMessage("chatinputenabled-label"))
|
||||
self.chatInputEnabledCheckbox.setObjectName("chatInputEnabled")
|
||||
self.chatInputLayout.addWidget(self.chatInputEnabledCheckbox, 1, 0, 1, 1, Qt.AlignLeft)
|
||||
self.chatInputLayout.addWidget(self.chatInputEnabledCheckbox, 1, 0, 1,1, Qt.AlignLeft)
|
||||
|
||||
self.chatDirectInputCheckbox = QCheckBox(getMessage("chatdirectinput-label"))
|
||||
self.chatDirectInputCheckbox.setObjectName("chatDirectInput")
|
||||
self.chatDirectInputCheckbox.setStyleSheet(
|
||||
constants.STYLE_SUBCHECKBOX.format(self.posixresourcespath + "chevrons_right.png"))
|
||||
self.chatInputLayout.addWidget(self.chatDirectInputCheckbox, 2, 0, 1, 1, Qt.AlignLeft)
|
||||
self.chatInputLayout.addWidget(self.chatDirectInputCheckbox, 2, 0, 1,1, Qt.AlignLeft)
|
||||
|
||||
self.inputFontLayout = QtWidgets.QHBoxLayout()
|
||||
self.inputFontLayout.setContentsMargins(0, 0, 0, 0)
|
||||
@ -968,7 +959,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.chatOutputGroup.setLayout(self.chatOutputLayout)
|
||||
self.chatOutputEnabledCheckbox = QCheckBox(getMessage("chatoutputenabled-label"))
|
||||
self.chatOutputEnabledCheckbox.setObjectName("chatOutputEnabled")
|
||||
self.chatOutputLayout.addWidget(self.chatOutputEnabledCheckbox, 1, 0, 1, 1, Qt.AlignLeft)
|
||||
self.chatOutputLayout.addWidget(self.chatOutputEnabledCheckbox, 1, 0, 1,1, Qt.AlignLeft)
|
||||
|
||||
self.outputFontLayout = QtWidgets.QHBoxLayout()
|
||||
self.outputFontLayout.setContentsMargins(0, 0, 0, 0)
|
||||
@ -1011,7 +1002,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.chatOutputLayout.addWidget(self.chatOutputModeFrame)
|
||||
|
||||
self.subitems['chatOutputEnabled'] = [self.chatOutputModeLabel.objectName(), self.chatOutputChatroomOption.objectName(),
|
||||
self.chatOutputScrollingOption.objectName(), self.chatOutputFontButton.objectName(),
|
||||
self.chatOutputScrollingOption.objectName(),self.chatOutputFontButton.objectName(),
|
||||
self.chatOutputFontLabel.objectName()]
|
||||
# chatFrame
|
||||
self.chatFrame.setLayout(self.chatLayout)
|
||||
@ -1019,7 +1010,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
def fontDialog(self, configName):
|
||||
font = QtGui.QFont()
|
||||
font.setFamily(self.config[configName + "FontFamily"])
|
||||
font.setFamily(self.config[configName+ "FontFamily"])
|
||||
font.setPointSize(self.config[configName + "RelativeFontSize"])
|
||||
font.setWeight(self.config[configName + "FontWeight"])
|
||||
font.setUnderline(self.config[configName + "FontUnderline"])
|
||||
@ -1032,7 +1023,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
def colourDialog(self, configName):
|
||||
oldColour = QtGui.QColor()
|
||||
oldColour.setNamedColor(self.config[configName + "FontColor"])
|
||||
oldColour.setNamedColor(self.config[configName+ "FontColor"])
|
||||
colour = QtWidgets.QColorDialog.getColor(oldColour, self)
|
||||
if colour.isValid():
|
||||
self.config[configName + "FontColor"] = colour.name()
|
||||
@ -1137,7 +1128,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.helpButton.setMaximumSize(self.helpButton.sizeHint())
|
||||
self.helpButton.released.connect(self.openHelp)
|
||||
|
||||
self.resetButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + 'cog_delete.png'), getMessage("reset-label"))
|
||||
self.resetButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + 'cog_delete.png'),getMessage("reset-label"))
|
||||
self.resetButton.setMaximumSize(self.resetButton.sizeHint())
|
||||
self.resetButton.setObjectName("reset")
|
||||
self.resetButton.released.connect(self.resetSettings)
|
||||
@ -1154,11 +1145,11 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.bottomButtonLayout.addWidget(self.runButton)
|
||||
self.bottomButtonLayout.addWidget(self.storeAndRunButton)
|
||||
self.bottomButtonFrame.setLayout(self.bottomButtonLayout)
|
||||
self.bottomButtonLayout.setContentsMargins(5, 0, 5, 0)
|
||||
self.bottomButtonLayout.setContentsMargins(5,0,5,0)
|
||||
self.mainLayout.addWidget(self.bottomButtonFrame, 1, 0, 1, 2)
|
||||
|
||||
self.bottomCheckboxFrame = QtWidgets.QFrame()
|
||||
self.bottomCheckboxFrame.setContentsMargins(0, 0, 0, 0)
|
||||
self.bottomCheckboxFrame.setContentsMargins(0,0,0,0)
|
||||
self.bottomCheckboxLayout = QtWidgets.QGridLayout()
|
||||
self.alwaysshowCheckbox = QCheckBox(getMessage("forceguiprompt-label"))
|
||||
|
||||
@ -1175,12 +1166,12 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.tabListLayout = QtWidgets.QHBoxLayout()
|
||||
self.tabListFrame = QtWidgets.QFrame()
|
||||
self.tabListWidget = QtWidgets.QListWidget()
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "house.png"), getMessage("basics-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "control_pause_blue.png"), getMessage("readiness-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "film_link.png"), getMessage("sync-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "house.png"),getMessage("basics-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "control_pause_blue.png"),getMessage("readiness-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "film_link.png"),getMessage("sync-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "user_comment.png"), getMessage("chat-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "error.png"), getMessage("messages-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "cog.png"), getMessage("misc-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "error.png"),getMessage("messages-label")))
|
||||
self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(resourcespath + "cog.png"),getMessage("misc-label")))
|
||||
self.tabListLayout.addWidget(self.tabListWidget)
|
||||
self.tabListFrame.setLayout(self.tabListLayout)
|
||||
self.tabListFrame.setFixedWidth(self.tabListFrame.minimumSizeHint().width() + constants.TAB_PADDING)
|
||||
@ -1233,7 +1224,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
def populateEmptyServerList(self):
|
||||
if self.publicServers is None:
|
||||
if self.config["checkForUpdatesAutomatically"]:
|
||||
if self.config["checkForUpdatesAutomatically"] == True:
|
||||
self.updateServerList()
|
||||
else:
|
||||
currentServer = self.hostCombobox.currentText()
|
||||
@ -1273,7 +1264,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self._playerProbeThread.done.connect(self._updateExecutableIcon)
|
||||
self._playerProbeThread.start()
|
||||
|
||||
if self.config['clearGUIData']:
|
||||
if self.config['clearGUIData'] == True:
|
||||
self.config['clearGUIData'] = False
|
||||
self.clearGUIData()
|
||||
|
||||
@ -1284,7 +1275,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
resourcespath = utils.findWorkingDir() + "\\resources\\"
|
||||
else:
|
||||
resourcespath = utils.findWorkingDir() + "/resources/"
|
||||
self.posixresourcespath = utils.findWorkingDir().replace("\\", "/") + "/resources/"
|
||||
self.posixresourcespath = utils.findWorkingDir().replace("\\","/") + "/resources/"
|
||||
self.resourcespath = resourcespath
|
||||
|
||||
super(ConfigDialog, self).__init__()
|
||||
@ -1299,7 +1290,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
|
||||
self.mainLayout = QtWidgets.QGridLayout()
|
||||
self.mainLayout.setSpacing(0)
|
||||
self.mainLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.mainLayout.setContentsMargins(0,0,0,0)
|
||||
|
||||
self.storedPassword = self.config['password']
|
||||
self.addBasicTab()
|
||||
@ -1314,7 +1305,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.addBottomLayout()
|
||||
self.updatePasswordVisibilty()
|
||||
|
||||
if self.getMoreState() is False:
|
||||
if self.getMoreState() == False:
|
||||
self.tabListFrame.hide()
|
||||
self.resetButton.hide()
|
||||
self.playerargsTextbox.hide()
|
||||
@ -1330,7 +1321,7 @@ class ConfigDialog(QtWidgets.QDialog):
|
||||
self.mediabrowseButton.show()
|
||||
newHeight = self.connectionSettingsGroup.minimumSizeHint().height()+self.mediaplayerSettingsGroup.minimumSizeHint().height()+self.bottomButtonFrame.minimumSizeHint().height()+3
|
||||
if self.error:
|
||||
newHeight += self.errorLabel.height() + 3
|
||||
newHeight +=self.errorLabel.height()+3
|
||||
self.stackedFrame.setFixedHeight(newHeight)
|
||||
else:
|
||||
self.showmoreCheckbox.setChecked(True)
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import os
|
||||
|
||||
if "QT_PREFERRED_BINDING" not in os.environ:
|
||||
os.environ["QT_PREFERRED_BINDING"] = os.pathsep.join(
|
||||
["PySide2", "PySide", "PyQt5", "PyQt4"]
|
||||
@ -11,9 +10,8 @@ except ImportError:
|
||||
pass
|
||||
from syncplay.ui.consoleUI import ConsoleUI
|
||||
|
||||
|
||||
def getUi(graphical=True):
|
||||
if graphical:
|
||||
if graphical: #TODO: Add graphical ui
|
||||
ui = GraphicalUI()
|
||||
else:
|
||||
ui = ConsoleUI()
|
||||
|
||||
@ -1,16 +1,14 @@
|
||||
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
|
||||
import syncplay
|
||||
from syncplay import constants
|
||||
import re
|
||||
from syncplay import utils
|
||||
from syncplay import constants
|
||||
from syncplay.messages import getMessage
|
||||
import sys
|
||||
from syncplay.utils import formatTime
|
||||
|
||||
|
||||
class ConsoleUI(threading.Thread):
|
||||
def __init__(self):
|
||||
self.promptMode = threading.Event()
|
||||
@ -73,7 +71,7 @@ class ConsoleUI(threading.Thread):
|
||||
if user.file:
|
||||
message = getMessage("userlist-playing-notification").format(username)
|
||||
self.showMessage(message, True)
|
||||
message = " {}: '{}' ({})".format(getMessage("userlist-file-notification"), user.file['name'], formatTime(user.file['duration']))
|
||||
message = " {}: '{}' ({})".format(getMessage("userlist-file-notification"),user.file['name'], formatTime(user.file['duration']))
|
||||
if currentUser.file:
|
||||
if user.file['name'] == currentUser.file['name'] and user.file['size'] != currentUser.file['size']:
|
||||
message += getMessage("different-filesize-notification")
|
||||
@ -105,7 +103,7 @@ class ConsoleUI(threading.Thread):
|
||||
def showDebugMessage(self, message):
|
||||
print(message)
|
||||
|
||||
def showErrorMessage(self, message, criticalerror=False):
|
||||
def showErrorMessage(self, message, criticalerror = False):
|
||||
print("ERROR:\t" + message)
|
||||
|
||||
def _extractSign(self, m):
|
||||
@ -153,13 +151,13 @@ class ConsoleUI(threading.Thread):
|
||||
elif command.group('command') in constants.COMMANDS_LIST:
|
||||
self.getUserlist()
|
||||
elif command.group('command') in constants.COMMANDS_CHAT:
|
||||
message = command.group('parameter')
|
||||
message= command.group('parameter')
|
||||
self._syncplayClient.sendChat(message)
|
||||
elif command.group('command') in constants.COMMANDS_PAUSE:
|
||||
self._syncplayClient.setPaused(not self._syncplayClient.getPlayerPaused())
|
||||
elif command.group('command') in constants.COMMANDS_ROOM:
|
||||
room = command.group('parameter')
|
||||
if room is None:
|
||||
if room == None:
|
||||
if self._syncplayClient.userlist.currentUser.file:
|
||||
room = self._syncplayClient.userlist.currentUser.file["name"]
|
||||
else:
|
||||
@ -169,7 +167,7 @@ class ConsoleUI(threading.Thread):
|
||||
self._syncplayClient.sendRoom()
|
||||
elif command.group('command') in constants.COMMANDS_CREATE:
|
||||
roombasename = command.group('parameter')
|
||||
if roombasename is None:
|
||||
if roombasename == None:
|
||||
roombasename = self._syncplayClient.getRoom()
|
||||
roombasename = utils.stripRoomName(roombasename)
|
||||
self._syncplayClient.createControlledRoom(roombasename)
|
||||
|
||||
@ -1,34 +1,28 @@
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from datetime import datetime
|
||||
from functools import wraps
|
||||
from platform import python_version
|
||||
|
||||
from twisted.internet import task
|
||||
|
||||
from syncplay import utils, constants, version, revision, release_number
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.ui.consoleUI import ConsoleUI
|
||||
from syncplay.utils import resourcespath
|
||||
from syncplay.utils import isLinux, isWindows, isMacOS
|
||||
from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize, isURL
|
||||
from syncplay.vendor import Qt
|
||||
from syncplay.vendor.Qt import QtWidgets, QtGui, __binding__, __binding_version__, __qt_version__, IsPySide, IsPySide2
|
||||
from syncplay.vendor.Qt.QtCore import Qt, QSettings, QSize, QPoint, QUrl, QLine, QDateTime
|
||||
from platform import python_version
|
||||
if IsPySide2:
|
||||
from PySide2.QtCore import QStandardPaths
|
||||
from syncplay import utils, constants, version, revision, release_number
|
||||
from syncplay.messages import getMessage
|
||||
from syncplay.utils import resourcespath
|
||||
import sys
|
||||
import time
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
from datetime import datetime
|
||||
from syncplay.utils import isLinux, isWindows, isMacOS
|
||||
import re
|
||||
import os
|
||||
from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize, isURL
|
||||
from functools import wraps
|
||||
from twisted.internet import task
|
||||
from syncplay.ui.consoleUI import ConsoleUI
|
||||
if isMacOS() and IsPySide:
|
||||
from Foundation import NSURL
|
||||
from Cocoa import NSString, NSUTF8StringEncoding
|
||||
lastCheckedForUpdates = None
|
||||
|
||||
|
||||
class ConsoleInGUI(ConsoleUI):
|
||||
def showMessage(self, message, noTimestamp=False):
|
||||
self._syncplayClient.ui.showMessage(message, True)
|
||||
@ -45,7 +39,6 @@ class ConsoleInGUI(ConsoleUI):
|
||||
def getUserlist(self):
|
||||
self._syncplayClient.showUserList(self)
|
||||
|
||||
|
||||
class UserlistItemDelegate(QtWidgets.QStyledItemDelegate):
|
||||
def __init__(self):
|
||||
QtWidgets.QStyledItemDelegate.__init__(self)
|
||||
@ -69,19 +62,19 @@ class UserlistItemDelegate(QtWidgets.QStyledItemDelegate):
|
||||
userReady = currentQAbstractItemModel.data(itemQModelIndex, Qt.UserRole + constants.USERITEM_READY_ROLE)
|
||||
|
||||
if roomController and not controlIconQPixmap.isNull():
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
optionQStyleOptionViewItem.rect.x()+6,
|
||||
midY-8,
|
||||
controlIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
|
||||
|
||||
if userReady and not tickIconQPixmap.isNull():
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
(optionQStyleOptionViewItem.rect.x()-10),
|
||||
midY - 8,
|
||||
tickIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
|
||||
|
||||
elif userReady == False and not crossIconQPixmap.isNull():
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
(optionQStyleOptionViewItem.rect.x()-10),
|
||||
midY - 8,
|
||||
crossIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
|
||||
@ -94,7 +87,7 @@ class UserlistItemDelegate(QtWidgets.QStyledItemDelegate):
|
||||
fileSwitchRole = currentQAbstractItemModel.data(itemQModelIndex, Qt.UserRole + constants.FILEITEM_SWITCH_ROLE)
|
||||
if fileSwitchRole == constants.FILEITEM_SWITCH_FILE_SWITCH:
|
||||
fileSwitchIconQPixmap = QtGui.QPixmap(resourcespath + "film_go.png")
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
(optionQStyleOptionViewItem.rect.x()),
|
||||
midY - 8,
|
||||
fileSwitchIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
|
||||
@ -102,14 +95,13 @@ class UserlistItemDelegate(QtWidgets.QStyledItemDelegate):
|
||||
|
||||
elif fileSwitchRole == constants.FILEITEM_SWITCH_STREAM_SWITCH:
|
||||
streamSwitchIconQPixmap = QtGui.QPixmap(resourcespath + "world_go.png")
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
(optionQStyleOptionViewItem.rect.x()),
|
||||
midY - 8,
|
||||
streamSwitchIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
|
||||
optionQStyleOptionViewItem.rect.setX(optionQStyleOptionViewItem.rect.x()+16)
|
||||
QtWidgets.QStyledItemDelegate.paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex)
|
||||
|
||||
|
||||
class AboutDialog(QtWidgets.QDialog):
|
||||
def __init__(self, parent=None):
|
||||
super(AboutDialog, self).__init__(parent)
|
||||
@ -125,13 +117,9 @@ class AboutDialog(QtWidgets.QDialog):
|
||||
linkLabel = QtWidgets.QLabel("<center><a href=\"https://syncplay.pl\">syncplay.pl</a></center>")
|
||||
linkLabel.setOpenExternalLinks(True)
|
||||
versionExtString = version + revision
|
||||
versionLabel = QtWidgets.QLabel(
|
||||
"<p><center>" + getMessage("about-dialog-release").format(versionExtString, release_number) +
|
||||
"<br />Python " + python_version() + " - " + __binding__ + " " + __binding_version__ +
|
||||
" - Qt " + __qt_version__ + "</center></p>")
|
||||
licenseLabel = QtWidgets.QLabel(
|
||||
"<center><p>Copyright © 2012–2018 Syncplay</p><p>" +
|
||||
getMessage("about-dialog-license-text") + "</p></center>")
|
||||
versionLabel = QtWidgets.QLabel("<p><center>" + getMessage("about-dialog-release").format(versionExtString, release_number) + "<br />Python " + python_version() + " - " + __binding__ + " " + __binding_version__ + " - Qt " + __qt_version__ + "</center></p>")
|
||||
#versionLabel = QtWidgets.QLabel("<p><center>Version 1.5.4 release 62<br />Python 3.4.5 - PySide 1.2.4 - Qt 4.8.7</center></p>")
|
||||
licenseLabel = QtWidgets.QLabel("<center><p>Copyright © 2012–2018 Syncplay</p><p>" + getMessage("about-dialog-license-text") + "</p></center>")
|
||||
aboutIconPixmap = QtGui.QPixmap(resourcespath + "syncplay.png")
|
||||
aboutIconLabel = QtWidgets.QLabel()
|
||||
aboutIconLabel.setPixmap(aboutIconPixmap.scaled(65, 65, Qt.KeepAspectRatio))
|
||||
@ -166,7 +154,6 @@ class AboutDialog(QtWidgets.QDialog):
|
||||
else:
|
||||
QtGui.QDesktopServices.openUrl(QUrl("file://" + resourcespath + "third-party-notices.rtf"))
|
||||
|
||||
|
||||
class MainWindow(QtWidgets.QMainWindow):
|
||||
insertPosition = None
|
||||
playlistState = []
|
||||
@ -188,7 +175,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
if currentlyPlayingFile:
|
||||
currentlyplayingIconQPixmap = QtGui.QPixmap(resourcespath + "bullet_right_grey.png")
|
||||
midY = int((optionQStyleOptionViewItem.rect.y() + optionQStyleOptionViewItem.rect.bottomLeft().y()) / 2)
|
||||
itemQPainter.drawPixmap(
|
||||
itemQPainter.drawPixmap (
|
||||
(optionQStyleOptionViewItem.rect.x()+4),
|
||||
midY-8,
|
||||
currentlyplayingIconQPixmap.scaled(6, 16, Qt.KeepAspectRatio))
|
||||
@ -360,6 +347,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
else:
|
||||
super(MainWindow.PlaylistWidget, self).dropEvent(event)
|
||||
|
||||
|
||||
|
||||
class topSplitter(QtWidgets.QSplitter):
|
||||
def createHandle(self):
|
||||
return self.topSplitterHandle(self.orientation(), self)
|
||||
@ -448,7 +437,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
if filename:
|
||||
if filename == getMessage("nofile-note"):
|
||||
return constants.FILEITEM_SWITCH_NO_SWITCH
|
||||
if self._syncplayClient.userlist.currentUser.file and utils.sameFilename(filename, self._syncplayClient.userlist.currentUser.file['name']):
|
||||
if self._syncplayClient.userlist.currentUser.file and utils.sameFilename(filename,self._syncplayClient.userlist.currentUser.file['name']):
|
||||
return constants.FILEITEM_SWITCH_NO_SWITCH
|
||||
if isURL(filename):
|
||||
return constants.FILEITEM_SWITCH_STREAM_SWITCH
|
||||
@ -481,16 +470,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
def showUserList(self, currentUser, rooms):
|
||||
self._usertreebuffer = QtGui.QStandardItemModel()
|
||||
self._usertreebuffer.setHorizontalHeaderLabels(
|
||||
(
|
||||
getMessage("roomuser-heading-label"), getMessage("size-heading-label"),
|
||||
getMessage("duration-heading-label"), getMessage("filename-heading-label")
|
||||
))
|
||||
(getMessage("roomuser-heading-label"), getMessage("size-heading-label"), getMessage("duration-heading-label"), getMessage("filename-heading-label") ))
|
||||
usertreeRoot = self._usertreebuffer.invisibleRootItem()
|
||||
if (
|
||||
self._syncplayClient.userlist.currentUser.file and
|
||||
self._syncplayClient.userlist.currentUser.file and
|
||||
os.path.isfile(self._syncplayClient.userlist.currentUser.file["path"])
|
||||
):
|
||||
if self._syncplayClient.userlist.currentUser.file and self._syncplayClient.userlist.currentUser.file and os.path.isfile(self._syncplayClient.userlist.currentUser.file["path"]):
|
||||
self._syncplayClient.fileSwitch.setCurrentDirectory(os.path.dirname(self._syncplayClient.userlist.currentUser.file["path"]))
|
||||
|
||||
for room in rooms:
|
||||
@ -549,7 +531,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
filenameitem.setFont(underlinefont)
|
||||
if not sameSize:
|
||||
if formatSize(user.file['size']) == formatSize(currentUser.file['size']):
|
||||
filesizeitem = QtGui.QStandardItem(formatSize(user.file['size'], precise=True))
|
||||
filesizeitem = QtGui.QStandardItem(formatSize(user.file['size'],precise=True))
|
||||
filesizeitem.setFont(underlinefont)
|
||||
filesizeitem.setForeground(QtGui.QBrush(QtGui.QColor(constants.STYLE_DIFFERENTITEM_COLOR)))
|
||||
if not sameDuration:
|
||||
@ -608,29 +590,30 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
pathFound = self._syncplayClient.fileSwitch.findFilepath(firstFile) if not isURL(firstFile) else None
|
||||
if self._syncplayClient.userlist.currentUser.file is None or firstFile != self._syncplayClient.userlist.currentUser.file["name"]:
|
||||
if isURL(firstFile):
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "world_go.png"), getMessage("openstreamurl-menu-label"), lambda: self.openFile(firstFile, resetPosition=True))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "world_go.png"), getMessage("openstreamurl-menu-label"), lambda: self.openFile(firstFile,resetPosition=True))
|
||||
elif pathFound:
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_go.png"), getMessage("openmedia-menu-label"), lambda: self.openFile(pathFound, resetPosition=True))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_go.png"), getMessage("openmedia-menu-label"), lambda: self.openFile(pathFound,resetPosition=True))
|
||||
if pathFound:
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "folder_film.png"),
|
||||
getMessage('open-containing-folder'),
|
||||
lambda: utils.open_system_file_browser(pathFound))
|
||||
if self._syncplayClient.isUntrustedTrustableURI(firstFile):
|
||||
domain = utils.getDomainFromURL(firstFile)
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "shield_add.png"), getMessage("addtrusteddomain-menu-label").format(domain), lambda: self.addTrustedDomain(domain))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "shield_add.png"),getMessage("addtrusteddomain-menu-label").format(domain), lambda: self.addTrustedDomain(domain))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "delete.png"), getMessage("removefromplaylist-menu-label"), lambda: self.deleteSelectedPlaylistItems())
|
||||
menu.addSeparator()
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "arrow_switch.png"), getMessage("shuffleremainingplaylist-menu-label"), lambda: self.shuffleRemainingPlaylist())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "arrow_switch.png"), getMessage("shuffleentireplaylist-menu-label"), lambda: self.shuffleEntirePlaylist())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "arrow_undo.png"), getMessage("undoplaylist-menu-label"), lambda: self.undoPlaylistChange())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_edit.png"), getMessage("editplaylist-menu-label"), lambda: self.openEditPlaylistDialog())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_add.png"), getMessage("addfilestoplaylist-menu-label"), lambda: self.OpenAddFilesToPlaylistDialog())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_add.png"),getMessage("addfilestoplaylist-menu-label"), lambda: self.OpenAddFilesToPlaylistDialog())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "world_add.png"), getMessage("addurlstoplaylist-menu-label"), lambda: self.OpenAddURIsToPlaylistDialog())
|
||||
menu.addSeparator()
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_folder_edit.png"), getMessage("setmediadirectories-menu-label"), lambda: self.openSetMediaDirectoriesDialog())
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "shield_edit.png"), getMessage("settrusteddomains-menu-label"), lambda: self.openSetTrustedDomainsDialog())
|
||||
menu.exec_(self.playlist.viewport().mapToGlobal(position))
|
||||
|
||||
|
||||
def openRoomMenu(self, position):
|
||||
# TODO: Deselect items after right click
|
||||
indexes = self.listTreeView.selectedIndexes()
|
||||
@ -657,7 +640,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
elif username and filename and filename != getMessage("nofile-note"):
|
||||
if self.config['sharedPlaylistEnabled'] and not self.isItemInPlaylist(filename):
|
||||
if isURL(filename):
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "world_add.png"), getMessage("addusersstreamstoplaylist-menu-label").format(shortUsername), lambda: self.addStreamToPlaylist(filename))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "world_add.png"),getMessage("addusersstreamstoplaylist-menu-label").format(shortUsername), lambda: self.addStreamToPlaylist(filename))
|
||||
else:
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_add.png"), getMessage("addusersfiletoplaylist-menu-label").format(shortUsername), lambda: self.addStreamToPlaylist(filename))
|
||||
|
||||
@ -670,7 +653,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "film_go.png"), getMessage("openusersfile-menu-label").format(shortUsername), lambda: self.openFile(pathFound))
|
||||
if self._syncplayClient.isUntrustedTrustableURI(filename):
|
||||
domain = utils.getDomainFromURL(filename)
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "shield_add.png"), getMessage("addtrusteddomain-menu-label").format(domain), lambda: self.addTrustedDomain(domain))
|
||||
menu.addAction(QtGui.QPixmap(resourcespath + "shield_add.png"),getMessage("addtrusteddomain-menu-label").format(domain), lambda: self.addTrustedDomain(domain))
|
||||
|
||||
if not isURL(filename) and filename != getMessage("nofile-note"):
|
||||
path = self._syncplayClient.fileSwitch.findFilepath(filename)
|
||||
@ -699,7 +682,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
self.listTreeView.header().setResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
|
||||
NarrowTabsWidth = self.listTreeView.header().sectionSize(0)+self.listTreeView.header().sectionSize(1)+self.listTreeView.header().sectionSize(2)
|
||||
if self.listTreeView.header().width() < (NarrowTabsWidth+self.listTreeView.header().sectionSize(3)):
|
||||
self.listTreeView.header().resizeSection(3, self.listTreeView.header().width()-NarrowTabsWidth)
|
||||
self.listTreeView.header().resizeSection(3,self.listTreeView.header().width()-NarrowTabsWidth)
|
||||
else:
|
||||
if IsPySide2:
|
||||
self.listTreeView.header().setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)
|
||||
@ -711,7 +694,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
def updateReadyState(self, newState):
|
||||
oldState = self.readyPushButton.isChecked()
|
||||
if newState != oldState and newState is not None:
|
||||
if newState != oldState and newState != None:
|
||||
self.readyPushButton.blockSignals(True)
|
||||
self.readyPushButton.setChecked(newState)
|
||||
self.readyPushButton.blockSignals(False)
|
||||
@ -785,7 +768,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
@needsClient
|
||||
def joinRoom(self, room=None):
|
||||
if room is None:
|
||||
if room == None:
|
||||
room = self.roomInput.text()
|
||||
if room == "":
|
||||
if self._syncplayClient.userlist.currentUser.file:
|
||||
@ -798,13 +781,14 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
self._syncplayClient.sendRoom()
|
||||
|
||||
def seekPositionDialog(self):
|
||||
seekTime, ok = QtWidgets.QInputDialog.getText(
|
||||
self, getMessage("seektime-menu-label"),
|
||||
seekTime, ok = QtWidgets.QInputDialog.getText(self, getMessage("seektime-menu-label"),
|
||||
getMessage("seektime-msgbox-label"), QtWidgets.QLineEdit.Normal,
|
||||
"0:00")
|
||||
if ok and seekTime != '':
|
||||
self.seekPosition(seekTime)
|
||||
|
||||
|
||||
|
||||
def seekFromButton(self):
|
||||
self.seekPosition(self.seekInput.text())
|
||||
|
||||
@ -887,7 +871,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
@needsClient
|
||||
def browseMediapath(self):
|
||||
if self._syncplayClient._player.customOpenDialog:
|
||||
if self._syncplayClient._player.customOpenDialog == True:
|
||||
self._syncplayClient._player.openCustomOpenDialog()
|
||||
return
|
||||
|
||||
@ -903,8 +887,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
else:
|
||||
defaultdirectory = self.getInitialMediaDirectory()
|
||||
browserfilter = "All files (*)"
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(
|
||||
self, getMessage("browseformedia-label"), defaultdirectory,
|
||||
fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self, getMessage("browseformedia-label"), defaultdirectory,
|
||||
browserfilter, "", options)
|
||||
if fileName:
|
||||
if isWindows():
|
||||
@ -916,7 +899,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
@needsClient
|
||||
def OpenAddFilesToPlaylistDialog(self):
|
||||
if self._syncplayClient._player.customOpenDialog:
|
||||
if self._syncplayClient._player.customOpenDialog == True:
|
||||
self._syncplayClient._player.openCustomOpenDialog()
|
||||
return
|
||||
|
||||
@ -932,8 +915,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
else:
|
||||
defaultdirectory = self.getInitialMediaDirectory()
|
||||
browserfilter = "All files (*)"
|
||||
fileNames, filtr = QtWidgets.QFileDialog.getOpenFileNames(
|
||||
self, getMessage("browseformedia-label"), defaultdirectory,
|
||||
fileNames, filtr = QtWidgets.QFileDialog.getOpenFileNames(self, getMessage("browseformedia-label"), defaultdirectory,
|
||||
browserfilter, "", options)
|
||||
self.updatingPlaylist = True
|
||||
if fileNames:
|
||||
@ -959,7 +941,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
URIsLayout.addWidget(URIsTextbox, 1, 0, 1, 1)
|
||||
URIsButtonBox = QtWidgets.QDialogButtonBox()
|
||||
URIsButtonBox.setOrientation(Qt.Horizontal)
|
||||
URIsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
|
||||
URIsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
|
||||
URIsButtonBox.accepted.connect(URIsDialog.accept)
|
||||
URIsButtonBox.rejected.connect(URIsDialog.reject)
|
||||
URIsLayout.addWidget(URIsButtonBox, 2, 0, 1, 1)
|
||||
@ -995,7 +977,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
editPlaylistLayout.addWidget(editPlaylistTextbox, 1, 0, 1, 1)
|
||||
editPlaylistButtonBox = QtWidgets.QDialogButtonBox()
|
||||
editPlaylistButtonBox.setOrientation(Qt.Horizontal)
|
||||
editPlaylistButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
|
||||
editPlaylistButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
|
||||
editPlaylistButtonBox.accepted.connect(editPlaylistDialog.accept)
|
||||
editPlaylistButtonBox.rejected.connect(editPlaylistDialog.reject)
|
||||
editPlaylistLayout.addWidget(editPlaylistButtonBox, 2, 0, 1, 1)
|
||||
@ -1025,7 +1007,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
MediaDirectoriesLayout.addWidget(MediaDirectoriesTextbox, 1, 0, 1, 1)
|
||||
MediaDirectoriesButtonBox = QtWidgets.QDialogButtonBox()
|
||||
MediaDirectoriesButtonBox.setOrientation(Qt.Horizontal)
|
||||
MediaDirectoriesButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
|
||||
MediaDirectoriesButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
|
||||
MediaDirectoriesButtonBox.accepted.connect(MediaDirectoriesDialog.accept)
|
||||
MediaDirectoriesButtonBox.rejected.connect(MediaDirectoriesDialog.reject)
|
||||
MediaDirectoriesLayout.addWidget(MediaDirectoriesButtonBox, 2, 0, 1, 1)
|
||||
@ -1053,7 +1035,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
TrustedDomainsLayout.addWidget(TrustedDomainsTextbox, 1, 0, 1, 1)
|
||||
TrustedDomainsButtonBox = QtWidgets.QDialogButtonBox()
|
||||
TrustedDomainsButtonBox.setOrientation(Qt.Horizontal)
|
||||
TrustedDomainsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
|
||||
TrustedDomainsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
|
||||
TrustedDomainsButtonBox.accepted.connect(TrustedDomainsDialog.accept)
|
||||
TrustedDomainsButtonBox.rejected.connect(TrustedDomainsDialog.reject)
|
||||
TrustedDomainsLayout.addWidget(TrustedDomainsButtonBox, 2, 0, 1, 1)
|
||||
@ -1064,7 +1046,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
if result == QtWidgets.QDialog.Accepted:
|
||||
newTrustedDomains = utils.convertMultilineStringToList(TrustedDomainsTextbox.toPlainText())
|
||||
self._syncplayClient.setTrustedDomains(newTrustedDomains)
|
||||
|
||||
@needsClient
|
||||
def addTrustedDomain(self, newDomain):
|
||||
trustedDomains = self.config["trustedDomains"][:]
|
||||
@ -1078,8 +1059,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
|
||||
else:
|
||||
options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.ShowDirsOnly)
|
||||
folderName = str(QtWidgets.QFileDialog.getExistingDirectory(
|
||||
self, None, self.getInitialMediaDirectory(includeUserSpecifiedDirectories=False), options))
|
||||
folderName = str(QtWidgets.QFileDialog.getExistingDirectory(self,None,self.getInitialMediaDirectory(includeUserSpecifiedDirectories=False),options))
|
||||
|
||||
if folderName:
|
||||
existingMediaDirs = MediaDirectoriesTextbox.toPlainText()
|
||||
@ -1093,16 +1073,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
@needsClient
|
||||
def promptForStreamURL(self):
|
||||
streamURL, ok = QtWidgets.QInputDialog.getText(
|
||||
self, getMessage("promptforstreamurl-msgbox-label"),
|
||||
getMessage("promptforstreamurlinfo-msgbox-label"), QtWidgets.QLineEdit.Normal, "")
|
||||
streamURL, ok = QtWidgets.QInputDialog.getText(self, getMessage("promptforstreamurl-msgbox-label"),
|
||||
getMessage("promptforstreamurlinfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
|
||||
"")
|
||||
if ok and streamURL != '':
|
||||
self._syncplayClient._player.openFile(streamURL)
|
||||
|
||||
@needsClient
|
||||
def createControlledRoom(self):
|
||||
controlroom, ok = QtWidgets.QInputDialog.getText(
|
||||
self, getMessage("createcontrolledroom-msgbox-label"),
|
||||
controlroom, ok = QtWidgets.QInputDialog.getText(self, getMessage("createcontrolledroom-msgbox-label"),
|
||||
getMessage("controlledroominfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
|
||||
utils.stripRoomName(self._syncplayClient.getRoom()))
|
||||
if ok and controlroom != '':
|
||||
@ -1127,9 +1106,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
@needsClient
|
||||
def setOffset(self):
|
||||
newoffset, ok = QtWidgets.QInputDialog.getText(
|
||||
self, getMessage("setoffset-msgbox-label"),
|
||||
getMessage("offsetinfo-msgbox-label"), QtWidgets.QLineEdit.Normal, "")
|
||||
newoffset, ok = QtWidgets.QInputDialog.getText(self, getMessage("setoffset-msgbox-label"),
|
||||
getMessage("offsetinfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
|
||||
"")
|
||||
if ok and newoffset != '':
|
||||
o = re.match(constants.UI_OFFSET_REGEX, "o " + newoffset)
|
||||
if o:
|
||||
@ -1208,16 +1187,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
window.chatInput = QtWidgets.QLineEdit()
|
||||
window.chatInput.setMaxLength(constants.MAX_CHAT_MESSAGE_LENGTH)
|
||||
window.chatInput.returnPressed.connect(self.sendChatMessage)
|
||||
window.chatButton = QtWidgets.QPushButton(
|
||||
QtGui.QPixmap(resourcespath + 'email_go.png'),
|
||||
window.chatButton = QtWidgets.QPushButton(QtGui.QPixmap(resourcespath + 'email_go.png'),
|
||||
getMessage("sendmessage-label"))
|
||||
window.chatButton.pressed.connect(self.sendChatMessage)
|
||||
window.chatLayout = QtWidgets.QHBoxLayout()
|
||||
window.chatFrame = QtWidgets.QFrame()
|
||||
window.chatFrame.setLayout(self.chatLayout)
|
||||
window.chatFrame.setContentsMargins(0, 0, 0, 0)
|
||||
window.chatFrame.setContentsMargins(0,0,0,0)
|
||||
window.chatFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
||||
window.chatLayout.setContentsMargins(0, 0, 0, 0)
|
||||
window.chatLayout.setContentsMargins(0,0,0,0)
|
||||
self.chatButton.setToolTip(getMessage("sendmessage-tooltip"))
|
||||
window.chatLayout.addWidget(window.chatInput)
|
||||
window.chatLayout.addWidget(window.chatButton)
|
||||
@ -1264,16 +1242,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
window.roomInput = QtWidgets.QLineEdit()
|
||||
window.roomInput.setMaxLength(constants.MAX_ROOM_NAME_LENGTH)
|
||||
window.roomInput.returnPressed.connect(self.joinRoom)
|
||||
window.roomButton = QtWidgets.QPushButton(
|
||||
QtGui.QPixmap(resourcespath + 'door_in.png'),
|
||||
window.roomButton = QtWidgets.QPushButton(QtGui.QPixmap(resourcespath + 'door_in.png'),
|
||||
getMessage("joinroom-label"))
|
||||
window.roomButton.pressed.connect(self.joinRoom)
|
||||
window.roomLayout = QtWidgets.QHBoxLayout()
|
||||
window.roomFrame = QtWidgets.QFrame()
|
||||
window.roomFrame.setLayout(self.roomLayout)
|
||||
window.roomFrame.setContentsMargins(0, 0, 0, 0)
|
||||
window.roomFrame.setContentsMargins(0,0,0,0)
|
||||
window.roomFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
||||
window.roomLayout.setContentsMargins(0, 0, 0, 0)
|
||||
window.roomLayout.setContentsMargins(0,0,0,0)
|
||||
self.roomButton.setToolTip(getMessage("joinroom-tooltip"))
|
||||
window.roomLayout.addWidget(window.roomInput)
|
||||
window.roomLayout.addWidget(window.roomButton)
|
||||
@ -1284,8 +1261,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
window.topSplit.addWidget(window.outputFrame)
|
||||
window.topSplit.addWidget(window.listFrame)
|
||||
window.topSplit.setStretchFactor(0, 4)
|
||||
window.topSplit.setStretchFactor(1, 5)
|
||||
window.topSplit.setStretchFactor(0,4)
|
||||
window.topSplit.setStretchFactor(1,5)
|
||||
window.mainLayout.addWidget(window.topSplit)
|
||||
window.topSplit.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
|
||||
|
||||
@ -1293,7 +1270,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
window.bottomLayout = QtWidgets.QHBoxLayout()
|
||||
window.bottomFrame = QtWidgets.QFrame()
|
||||
window.bottomFrame.setLayout(window.bottomLayout)
|
||||
window.bottomLayout.setContentsMargins(0, 0, 0, 0)
|
||||
window.bottomLayout.setContentsMargins(0,0,0,0)
|
||||
|
||||
self.addPlaybackLayout(window)
|
||||
|
||||
@ -1345,7 +1322,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
window.autoplayLayout = QtWidgets.QHBoxLayout()
|
||||
window.autoplayFrame = QtWidgets.QFrame()
|
||||
window.autoplayFrame.setVisible(False)
|
||||
window.autoplayLayout.setContentsMargins(0, 0, 0, 0)
|
||||
window.autoplayLayout.setContentsMargins(0,0,0,0)
|
||||
window.autoplayFrame.setLayout(window.autoplayLayout)
|
||||
window.autoplayPushButton = QtWidgets.QPushButton()
|
||||
autoPlayFont = QtGui.QFont()
|
||||
@ -1380,10 +1357,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
def addPlaybackLayout(self, window):
|
||||
window.playbackFrame = QtWidgets.QFrame()
|
||||
window.playbackFrame.setVisible(False)
|
||||
window.playbackFrame.setContentsMargins(0, 0, 0, 0)
|
||||
window.playbackFrame.setContentsMargins(0,0,0,0)
|
||||
window.playbackLayout = QtWidgets.QHBoxLayout()
|
||||
window.playbackLayout.setAlignment(Qt.AlignLeft)
|
||||
window.playbackLayout.setContentsMargins(0, 0, 0, 0)
|
||||
window.playbackLayout.setContentsMargins(0,0,0,0)
|
||||
window.playbackFrame.setLayout(window.playbackLayout)
|
||||
window.seekInput = QtWidgets.QLineEdit()
|
||||
window.seekInput.returnPressed.connect(self.seekFromButton)
|
||||
@ -1428,6 +1405,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
getMessage("setmediadirectories-menu-label"))
|
||||
window.openAction.triggered.connect(self.openSetMediaDirectoriesDialog)
|
||||
|
||||
|
||||
window.exitAction = window.fileMenu.addAction(QtGui.QPixmap(resourcespath + 'cross.png'),
|
||||
getMessage("exit-menu-label"))
|
||||
window.exitAction.triggered.connect(self.exitSyncplay)
|
||||
@ -1436,21 +1414,13 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
# Playback menu
|
||||
|
||||
window.playbackMenu = QtWidgets.QMenu(getMessage("playback-menu-label"), self)
|
||||
window.playAction = window.playbackMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'control_play_blue.png'),
|
||||
getMessage("play-menu-label"))
|
||||
window.playAction = window.playbackMenu.addAction(QtGui.QPixmap(resourcespath + 'control_play_blue.png'), getMessage("play-menu-label"))
|
||||
window.playAction.triggered.connect(self.play)
|
||||
window.pauseAction = window.playbackMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'control_pause_blue.png'),
|
||||
getMessage("pause-menu-label"))
|
||||
window.pauseAction = window.playbackMenu.addAction(QtGui.QPixmap(resourcespath + 'control_pause_blue.png'), getMessage("pause-menu-label"))
|
||||
window.pauseAction.triggered.connect(self.pause)
|
||||
window.seekAction = window.playbackMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'clock_go.png'),
|
||||
getMessage("seektime-menu-label"))
|
||||
window.seekAction = window.playbackMenu.addAction(QtGui.QPixmap(resourcespath + 'clock_go.png'), getMessage("seektime-menu-label"))
|
||||
window.seekAction.triggered.connect(self.seekPositionDialog)
|
||||
window.unseekAction = window.playbackMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'arrow_undo.png'),
|
||||
getMessage("undoseek-menu-label"))
|
||||
window.unseekAction = window.playbackMenu.addAction(QtGui.QPixmap(resourcespath + 'arrow_undo.png'), getMessage("undoseek-menu-label"))
|
||||
window.unseekAction.triggered.connect(self.undoSeek)
|
||||
|
||||
window.menuBar.addMenu(window.playbackMenu)
|
||||
@ -1458,12 +1428,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
# Advanced menu
|
||||
|
||||
window.advancedMenu = QtWidgets.QMenu(getMessage("advanced-menu-label"), self)
|
||||
window.setoffsetAction = window.advancedMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'timeline_marker.png'),
|
||||
window.setoffsetAction = window.advancedMenu.addAction(QtGui.QPixmap(resourcespath + 'timeline_marker.png'),
|
||||
getMessage("setoffset-menu-label"))
|
||||
window.setoffsetAction.triggered.connect(self.setOffset)
|
||||
window.setTrustedDomainsAction = window.advancedMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'shield_edit.png'),
|
||||
window.setTrustedDomainsAction = window.advancedMenu.addAction(QtGui.QPixmap(resourcespath + 'shield_edit.png'),
|
||||
getMessage("settrusteddomains-menu-label"))
|
||||
window.setTrustedDomainsAction.triggered.connect(self.openSetTrustedDomainsDialog)
|
||||
window.createcontrolledroomAction = window.advancedMenu.addAction(
|
||||
@ -1488,23 +1456,21 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
window.autoplayAction.triggered.connect(self.updateAutoplayVisibility)
|
||||
window.menuBar.addMenu(window.windowMenu)
|
||||
|
||||
|
||||
# Help menu
|
||||
|
||||
window.helpMenu = QtWidgets.QMenu(getMessage("help-menu-label"), self)
|
||||
|
||||
window.userguideAction = window.helpMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'help.png'),
|
||||
window.userguideAction = window.helpMenu.addAction(QtGui.QPixmap(resourcespath + 'help.png'),
|
||||
getMessage("userguide-menu-label"))
|
||||
window.userguideAction.triggered.connect(self.openUserGuide)
|
||||
window.updateAction = window.helpMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'application_get.png'),
|
||||
window.updateAction = window.helpMenu.addAction(QtGui.QPixmap(resourcespath + 'application_get.png'),
|
||||
getMessage("update-menu-label"))
|
||||
window.updateAction.triggered.connect(self.userCheckForUpdates)
|
||||
|
||||
if not isMacOS():
|
||||
window.helpMenu.addSeparator()
|
||||
window.about = window.helpMenu.addAction(
|
||||
QtGui.QPixmap(resourcespath + 'syncplay.png'),
|
||||
window.about = window.helpMenu.addAction(QtGui.QPixmap(resourcespath + 'syncplay.png'),
|
||||
getMessage("about-menu-label"))
|
||||
else:
|
||||
window.about = window.helpMenu.addAction("&About")
|
||||
@ -1562,7 +1528,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
def updateAutoPlayState(self, newState):
|
||||
oldState = self.autoplayPushButton.isChecked()
|
||||
if newState != oldState and newState is not None:
|
||||
if newState != oldState and newState != None:
|
||||
self.autoplayPushButton.blockSignals(True)
|
||||
self.autoplayPushButton.setChecked(newState)
|
||||
self.autoplayPushButton.blockSignals(False)
|
||||
@ -1598,7 +1564,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
if self.config['lastCheckedForUpdates']:
|
||||
configLastChecked = datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f")
|
||||
if self.lastCheckedForUpdates is None or configLastChecked > self.lastCheckedForUpdates.toPython():
|
||||
self.lastCheckedForUpdates = QDateTime.fromString(self.config["lastCheckedForUpdates"], 'yyyy-MM-dd HH-mm-ss')
|
||||
self.lastCheckedForUpdates = QDateTime.fromString(self.config["lastCheckedForUpdates"],'yyyy-MM-dd HH-mm-ss')
|
||||
if self.lastCheckedForUpdates is None:
|
||||
self.checkForUpdates()
|
||||
else:
|
||||
@ -1625,11 +1591,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
else:
|
||||
import syncplay
|
||||
updateMessage = getMessage("update-check-failed-notification").format(syncplay.version)
|
||||
if userInitiated:
|
||||
if userInitiated == True:
|
||||
updateURL = constants.SYNCPLAY_DOWNLOAD_URL
|
||||
if updateURL is not None:
|
||||
reply = QtWidgets.QMessageBox.question(
|
||||
self, "Syncplay",
|
||||
reply = QtWidgets.QMessageBox.question(self, "Syncplay",
|
||||
updateMessage, QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
|
||||
if reply == QtWidgets.QMessageBox.Yes:
|
||||
self.QtGui.QDesktopServices.openUrl(QUrl(updateURL))
|
||||
@ -1659,7 +1624,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
dropfilepath = os.path.abspath(NSURL.URLWithString_(pathString).filePathURL().path())
|
||||
else:
|
||||
dropfilepath = os.path.abspath(str(url.toLocalFile()))
|
||||
if not rewindFile:
|
||||
if rewindFile == False:
|
||||
self._syncplayClient._player.openFile(dropfilepath)
|
||||
else:
|
||||
self._syncplayClient.setPosition(0)
|
||||
@ -1687,7 +1652,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
def setPlaylistIndexFilename(self, filename):
|
||||
self.playlist.setPlaylistIndexFilename(filename)
|
||||
|
||||
def addFileToPlaylist(self, filePath, index=-1):
|
||||
def addFileToPlaylist(self, filePath, index = -1):
|
||||
if os.path.isfile(filePath):
|
||||
self.removePlaylistNote()
|
||||
filename = os.path.basename(filePath)
|
||||
|
||||
@ -1,44 +1,35 @@
|
||||
|
||||
import ast
|
||||
import datetime
|
||||
import hashlib
|
||||
import itertools
|
||||
import random
|
||||
import os
|
||||
import platform
|
||||
import re
|
||||
import string
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
import unicodedata
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
import re
|
||||
import datetime
|
||||
from syncplay import constants
|
||||
from syncplay.messages import getMessage
|
||||
import sys
|
||||
import os
|
||||
import itertools
|
||||
import hashlib
|
||||
import random
|
||||
import string
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import ast
|
||||
import unicodedata
|
||||
import platform
|
||||
import subprocess
|
||||
import traceback
|
||||
|
||||
folderSearchEnabled = True
|
||||
|
||||
|
||||
def isWindows():
|
||||
return sys.platform.startswith(constants.OS_WINDOWS)
|
||||
|
||||
|
||||
def isLinux():
|
||||
return sys.platform.startswith(constants.OS_LINUX)
|
||||
|
||||
|
||||
def isMacOS():
|
||||
return sys.platform.startswith(constants.OS_MACOS)
|
||||
|
||||
|
||||
def isBSD():
|
||||
return constants.OS_BSD in sys.platform or sys.platform.startswith(constants.OS_DRAGONFLY)
|
||||
|
||||
|
||||
def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
|
||||
"""Retry calling the decorated function using an exponential backoff.
|
||||
|
||||
@ -64,7 +55,7 @@ def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
|
||||
try_one_last_time = True
|
||||
while mtries > 1:
|
||||
try:
|
||||
# try_one_last_time = False
|
||||
#try_one_last_time = False
|
||||
return f(*args, **kwargs)
|
||||
break
|
||||
except ExceptionToCheck as e:
|
||||
@ -80,7 +71,6 @@ def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
|
||||
return f_retry # true decorator
|
||||
return deco_retry
|
||||
|
||||
|
||||
def parseTime(timeStr):
|
||||
regex = re.compile(constants.PARSE_TIME_REGEX)
|
||||
parts = regex.match(timeStr)
|
||||
@ -96,7 +86,6 @@ def parseTime(timeStr):
|
||||
time_params[name] = int(param)
|
||||
return datetime.timedelta(**time_params).total_seconds()
|
||||
|
||||
|
||||
def formatTime(timeInSeconds, weeksAsTitles=True):
|
||||
if timeInSeconds < 0:
|
||||
timeInSeconds = -timeInSeconds
|
||||
@ -126,8 +115,7 @@ def formatTime(timeInSeconds, weeksAsTitles=True):
|
||||
formattedTime = "{0:} (Title {1:.0f})".format(formattedTime, title)
|
||||
return formattedTime
|
||||
|
||||
|
||||
def formatSize(num_of_bytes, precise=False):
|
||||
def formatSize (bytes, precise=False):
|
||||
if bytes == 0: # E.g. when file size privacy is enabled
|
||||
return "???"
|
||||
try:
|
||||
@ -140,45 +128,39 @@ def formatSize(num_of_bytes, precise=False):
|
||||
except: # E.g. when filesize is hashed
|
||||
return "???"
|
||||
|
||||
|
||||
def isASCII(s):
|
||||
return all(ord(c) < 128 for c in s)
|
||||
|
||||
|
||||
def findResourcePath(resourceName):
|
||||
if resourceName == "syncplay.lua":
|
||||
resourcePath = os.path.join(findWorkingDir(), "lua", "intf", "resources", resourceName)
|
||||
resourcePath = os.path.join(findWorkingDir(), "lua", "intf" , "resources", resourceName)
|
||||
else:
|
||||
resourcePath = os.path.join(findWorkingDir(), "resources", resourceName)
|
||||
resourcePath = os.path.join(findWorkingDir(),"resources", resourceName)
|
||||
return resourcePath
|
||||
|
||||
|
||||
def findWorkingDir():
|
||||
frozen = getattr(sys, 'frozen', '')
|
||||
if not frozen:
|
||||
path = os.path.dirname(os.path.dirname(__file__))
|
||||
elif frozen in ('dll', 'console_exe', 'windows_exe', 'macosx_app'):
|
||||
path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
||||
elif frozen: # needed for PyInstaller
|
||||
elif frozen: #needed for PyInstaller
|
||||
if getattr(sys, '_MEIPASS', '') is not None:
|
||||
path = getattr(sys, '_MEIPASS', '') # --onefile
|
||||
path = getattr(sys, '_MEIPASS', '') #--onefile
|
||||
else:
|
||||
path = os.path.dirname(sys.executable) # --onedir
|
||||
path = os.path.dirname(sys.executable) #--onedir
|
||||
else:
|
||||
path = ""
|
||||
return path
|
||||
|
||||
|
||||
def getResourcesPath():
|
||||
if isWindows():
|
||||
return findWorkingDir() + "\\resources\\"
|
||||
else:
|
||||
return findWorkingDir() + "/resources/"
|
||||
|
||||
|
||||
resourcespath = getResourcesPath()
|
||||
posixresourcespath = findWorkingDir().replace("\\", "/") + "/resources/"
|
||||
|
||||
posixresourcespath = findWorkingDir().replace("\\","/") + "/resources/"
|
||||
|
||||
def getDefaultMonospaceFont():
|
||||
if platform.system() == "Windows":
|
||||
@ -188,18 +170,15 @@ def getDefaultMonospaceFont():
|
||||
else:
|
||||
return constants.FALLBACK_MONOSPACE_FONT
|
||||
|
||||
|
||||
def limitedPowerset(s, minLength):
|
||||
return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s), minLength, -1))
|
||||
|
||||
|
||||
def blackholeStdoutForFrozenWindow():
|
||||
if getattr(sys, 'frozen', '') == "windows_exe":
|
||||
class Stderr(object):
|
||||
softspace = 0
|
||||
_file = None
|
||||
_error = None
|
||||
|
||||
def write(self, text, fname='.syncplay.log'):
|
||||
if self._file is None and self._error is None:
|
||||
if os.name != 'nt':
|
||||
@ -207,31 +186,25 @@ def blackholeStdoutForFrozenWindow():
|
||||
else:
|
||||
path = os.path.join(os.getenv('APPDATA', '.'), fname)
|
||||
self._file = open(path, 'a')
|
||||
# TODO: Handle errors.
|
||||
#TODO: Handle errors.
|
||||
if self._file is not None:
|
||||
self._file.write(text)
|
||||
self._file.flush()
|
||||
|
||||
def flush(self):
|
||||
if self._file is not None:
|
||||
self._file.flush()
|
||||
|
||||
sys.stderr = Stderr()
|
||||
del Stderr
|
||||
|
||||
class Blackhole(object):
|
||||
softspace = 0
|
||||
|
||||
def write(self, text):
|
||||
pass
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
sys.stdout = Blackhole()
|
||||
del Blackhole
|
||||
|
||||
|
||||
def truncateText(unicodeText, maxLength):
|
||||
try:
|
||||
unicodeText = unicodeText.decode('utf-8')
|
||||
@ -243,7 +216,6 @@ def truncateText(unicodeText, maxLength):
|
||||
pass
|
||||
return ""
|
||||
|
||||
|
||||
def splitText(unicodeText, maxLength):
|
||||
try:
|
||||
unicodeText = unicodeText.decode('utf-8')
|
||||
@ -259,7 +231,6 @@ def splitText(unicodeText, maxLength):
|
||||
|
||||
# Relate to file hashing / difference checking:
|
||||
|
||||
|
||||
def stripfilename(filename, stripURL):
|
||||
if filename:
|
||||
try:
|
||||
@ -276,7 +247,6 @@ def stripfilename(filename, stripURL):
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
def stripRoomName(RoomName):
|
||||
if RoomName:
|
||||
try:
|
||||
@ -286,8 +256,7 @@ def stripRoomName(RoomName):
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
def hashFilename(filename, stripURL=False):
|
||||
def hashFilename(filename, stripURL = False):
|
||||
if isURL(filename):
|
||||
stripURL = True
|
||||
strippedFilename = stripfilename(filename, stripURL)
|
||||
@ -298,11 +267,9 @@ def hashFilename(filename, stripURL=False):
|
||||
filenameHash = hashlib.sha256(strippedFilename).hexdigest()[:12]
|
||||
return filenameHash
|
||||
|
||||
|
||||
def hashFilesize(size):
|
||||
return hashlib.sha256(str(size).encode('utf-8')).hexdigest()[:12]
|
||||
|
||||
|
||||
def sameHashed(string1raw, string1hashed, string2raw, string2hashed):
|
||||
try:
|
||||
if string1raw.lower() == string2raw.lower():
|
||||
@ -318,8 +285,7 @@ def sameHashed(string1raw, string1hashed, string2raw, string2hashed):
|
||||
elif string1hashed == string2hashed:
|
||||
return True
|
||||
|
||||
|
||||
def sameFilename(filename1, filename2):
|
||||
def sameFilename (filename1, filename2):
|
||||
try:
|
||||
filename1 = filename1
|
||||
except UnicodeDecodeError:
|
||||
@ -336,8 +302,7 @@ def sameFilename(filename1, filename2):
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def sameFilesize(filesize1, filesize2):
|
||||
def sameFilesize (filesize1, filesize2):
|
||||
if filesize1 == 0 or filesize2 == 0:
|
||||
return True
|
||||
elif sameHashed(filesize1, hashFilesize(filesize1), filesize2, hashFilesize(filesize2)):
|
||||
@ -345,8 +310,7 @@ def sameFilesize(filesize1, filesize2):
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def sameFileduration(duration1, duration2):
|
||||
def sameFileduration (duration1, duration2):
|
||||
if not constants.SHOW_DURATION_NOTIFICATION:
|
||||
return True
|
||||
elif abs(round(duration1) - round(duration2)) < constants.DIFFERENT_DURATION_THRESHOLD:
|
||||
@ -354,13 +318,11 @@ def sameFileduration(duration1, duration2):
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def meetsMinVersion(version, minVersion):
|
||||
def versiontotuple(ver):
|
||||
return tuple(map(int, ver.split(".")))
|
||||
return versiontotuple(version) >= versiontotuple(minVersion)
|
||||
|
||||
|
||||
def isURL(path):
|
||||
if path is None:
|
||||
return False
|
||||
@ -369,26 +331,21 @@ def isURL(path):
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def getPlayerArgumentsByPathAsArray(arguments, path):
|
||||
if arguments and not isinstance(arguments, str) and path in arguments:
|
||||
return arguments[path]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def getPlayerArgumentsByPathAsText(arguments, path):
|
||||
argsToReturn = getPlayerArgumentsByPathAsArray(arguments, path)
|
||||
return " ".join(argsToReturn) if argsToReturn else ""
|
||||
|
||||
|
||||
def getListAsMultilineString(pathArray):
|
||||
return "\n".join(pathArray) if pathArray else ""
|
||||
|
||||
|
||||
def convertMultilineStringToList(multilineString):
|
||||
return str.split(multilineString, "\n") if multilineString else ""
|
||||
|
||||
return str.split(multilineString,"\n") if multilineString else ""
|
||||
|
||||
def playlistIsValid(files):
|
||||
if len(files) > constants.PLAYLIST_MAX_ITEMS:
|
||||
@ -397,7 +354,6 @@ def playlistIsValid(files):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def getDomainFromURL(URL):
|
||||
try:
|
||||
URL = URL.split("//")[-1].split("/")[0]
|
||||
@ -407,7 +363,6 @@ def getDomainFromURL(URL):
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def open_system_file_browser(path):
|
||||
if isURL(path):
|
||||
return
|
||||
@ -419,7 +374,6 @@ def open_system_file_browser(path):
|
||||
else:
|
||||
subprocess.Popen(["xdg-open", path])
|
||||
|
||||
|
||||
def getListOfPublicServers():
|
||||
try:
|
||||
import urllib.request, urllib.parse, urllib.error, syncplay, sys
|
||||
@ -432,7 +386,7 @@ def getListOfPublicServers():
|
||||
f = urllib.request.urlopen(constants.SYNCPLAY_PUBLIC_SERVER_LIST_URL.format(params))
|
||||
response = f.read()
|
||||
response = response.decode('utf-8')
|
||||
response = response.replace("<p>", "").replace("</p>", "").replace("<br />", "").replace("“", "'").replace("”", "'").replace(":’", "'").replace("’", "'").replace("′", "'").replace("\n", "").replace("\r", "") # Fix Wordpress
|
||||
response = response.replace("<p>","").replace("</p>","").replace("<br />","").replace("“","'").replace("”","'").replace(":’","'").replace("’","'").replace("′","'").replace("\n","").replace("\r","") # Fix Wordpress
|
||||
response = ast.literal_eval(response)
|
||||
|
||||
if response:
|
||||
@ -440,13 +394,12 @@ def getListOfPublicServers():
|
||||
else:
|
||||
raise IOError
|
||||
except:
|
||||
if constants.DEBUG_MODE:
|
||||
if constants.DEBUG_MODE == True:
|
||||
traceback.print_exc()
|
||||
raise
|
||||
else:
|
||||
raise IOError(getMessage("failed-to-load-server-list-error"))
|
||||
|
||||
|
||||
class RoomPasswordProvider(object):
|
||||
CONTROLLED_ROOM_REGEX = re.compile("^\+(.*):(\w{12})$")
|
||||
PASSWORD_REGEX = re.compile("[A-Z]{2}-\d{3}-\d{3}")
|
||||
@ -480,7 +433,6 @@ class RoomPasswordProvider(object):
|
||||
provisionalHash = hashlib.sha256(roomName + salt).hexdigest()
|
||||
return hashlib.sha1(provisionalHash + salt + password).hexdigest()[:12].upper()
|
||||
|
||||
|
||||
class RandomStringGenerator(object):
|
||||
@staticmethod
|
||||
def generate_room_password():
|
||||
@ -506,6 +458,6 @@ class RandomStringGenerator(object):
|
||||
def _get_random_numbers(quantity):
|
||||
return ''.join(random.choice(string.digits) for _ in range(quantity))
|
||||
|
||||
|
||||
class NotControlledRoom(Exception):
|
||||
pass
|
||||
|
||||
|
||||
@ -17,3 +17,4 @@ from syncplay.utils import blackholeStdoutForFrozenWindow
|
||||
if __name__ == '__main__':
|
||||
blackholeStdoutForFrozenWindow()
|
||||
SyncplayClientManager().run()
|
||||
|
||||
|
||||
@ -19,14 +19,5 @@ from syncplay.server import SyncFactory, ConfigurationGetter
|
||||
if __name__ == '__main__':
|
||||
argsGetter = ConfigurationGetter()
|
||||
args = argsGetter.getConfiguration()
|
||||
reactor.listenTCP(
|
||||
int(args.port),
|
||||
SyncFactory(
|
||||
args.password,
|
||||
args.motd_file,
|
||||
args.isolate_rooms,
|
||||
args.salt,
|
||||
args.disable_ready,
|
||||
args.disable_chat,
|
||||
args.max_chat_message_length))
|
||||
reactor.listenTCP(int(args.port), SyncFactory(args.password, args.motd_file, args.isolate_rooms, args.salt, args.disable_ready,args.disable_chat, args.max_chat_message_length))
|
||||
reactor.run()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user