Merge branch 'master' into remove_commented_code

This commit is contained in:
Abby 2019-12-09 20:33:40 +00:00 committed by GitHub
commit f7fdcd0cd8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 904 additions and 739 deletions

View file

@ -9,7 +9,7 @@ import xbmc
import xbmcaddon import xbmcaddon
import xbmcvfs import xbmcvfs
from helper import _, window, settings, addon_id, dialog from helper import translate, window, settings, addon_id, dialog
from helper.utils import create_id from helper.utils import create_id
################################################################################################## ##################################################################################################
@ -114,7 +114,7 @@ def reset_device_id():
window('jellyfin_deviceId', clear=True) window('jellyfin_deviceId', clear=True)
get_device_id(True) get_device_id(True)
dialog("ok", heading="{jellyfin}", line1=_(33033)) dialog("ok", heading="{jellyfin}", line1=translate(33033))
xbmc.executebuiltin('RestartApp') xbmc.executebuiltin('RestartApp')

View file

@ -12,7 +12,7 @@ import xbmc
import xbmcvfs import xbmcvfs
import jellyfin_db import jellyfin_db
from helper import _, settings, window, dialog from helper import translate, settings, window, dialog
from objects import obj from objects import obj
################################################################################################# #################################################################################################
@ -215,7 +215,7 @@ def reset():
from views import Views from views import Views
views = Views() views = Views()
if not dialog("yesno", heading="{jellyfin}", line1=_(33074)): if not dialog("yesno", heading="{jellyfin}", line1=translate(33074)):
return return
window('jellyfin_should_stop.bool', True) window('jellyfin_should_stop.bool', True)
@ -227,7 +227,7 @@ def reset():
count -= 1 count -= 1
if not count: if not count:
dialog("ok", heading="{jellyfin}", line1=_(33085)) dialog("ok", heading="{jellyfin}", line1=translate(33085))
return return
@ -239,12 +239,12 @@ def reset():
views.delete_playlists() views.delete_playlists()
views.delete_nodes() views.delete_nodes()
if dialog("yesno", heading="{jellyfin}", line1=_(33086)): if dialog("yesno", heading="{jellyfin}", line1=translate(33086)):
reset_artwork() reset_artwork()
addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8') addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
if dialog("yesno", heading="{jellyfin}", line1=_(33087)): if dialog("yesno", heading="{jellyfin}", line1=translate(33087)):
xbmcvfs.delete(os.path.join(addon_data, "settings.xml")) xbmcvfs.delete(os.path.join(addon_data, "settings.xml"))
xbmcvfs.delete(os.path.join(addon_data, "data.json")) xbmcvfs.delete(os.path.join(addon_data, "data.json"))
@ -257,7 +257,7 @@ def reset():
settings('MinimumSetup', "") settings('MinimumSetup', "")
settings('MusicRescan.bool', False) settings('MusicRescan.bool', False)
settings('SyncInstallRunDone.bool', False) settings('SyncInstallRunDone.bool', False)
dialog("ok", heading="{jellyfin}", line1=_(33088)) dialog("ok", heading="{jellyfin}", line1=translate(33088))
xbmc.executebuiltin('RestartApp') xbmc.executebuiltin('RestartApp')
@ -272,7 +272,7 @@ def reset_kodi():
if name != 'version': if name != 'version':
videodb.cursor.execute("DELETE FROM " + name) videodb.cursor.execute("DELETE FROM " + name)
if settings('enableMusic.bool') or dialog("yesno", heading="{jellyfin}", line1=_(33162)): if settings('enableMusic.bool') or dialog("yesno", heading="{jellyfin}", line1=translate(33162)):
with Database('music') as musicdb: with Database('music') as musicdb:
musicdb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'") musicdb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'")

View file

@ -8,7 +8,7 @@ import os
import xbmcgui import xbmcgui
import xbmcaddon import xbmcaddon
from helper import _, addon_id from helper import translate, addon_id
################################################################################################## ##################################################################################################
@ -78,7 +78,7 @@ class LoginManual(xbmcgui.WindowXMLDialog):
if not user: if not user:
# Display error # Display error
self._error(ERROR['Empty'], _('empty_user')) self._error(ERROR['Empty'], translate('empty_user'))
LOG.error("Username cannot be null") LOG.error("Username cannot be null")
elif self._login(user, password): elif self._login(user, password):
@ -121,7 +121,7 @@ class LoginManual(xbmcgui.WindowXMLDialog):
result = self.connect_manager.login(server, username, password) result = self.connect_manager.login(server, username, password)
if not result: if not result:
self._error(ERROR['Invalid'], _('invalid_auth')) self._error(ERROR['Invalid'], translate('invalid_auth'))
return False return False
else: else:
self._user = result self._user = result

View file

@ -7,7 +7,7 @@ import logging
import xbmc import xbmc
import xbmcgui import xbmcgui
from helper import _ from helper import translate
from jellyfin.connection_manager import CONNECTION_STATE from jellyfin.connection_manager import CONNECTION_STATE
################################################################################################## ##################################################################################################
@ -110,7 +110,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
def _connect_server(self, server_id): def _connect_server(self, server_id):
server = self.connect_manager.get_server_info(server_id) server = self.connect_manager.get_server_info(server_id)
self.message.setLabel("%s %s..." % (_(30610), server['Name'])) self.message.setLabel("%s %s..." % (translate(30610), server['Name']))
self.message_box.setVisibleCondition('true') self.message_box.setVisibleCondition('true')
self.busy.setVisibleCondition('true') self.busy.setVisibleCondition('true')
@ -120,7 +120,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
if result['State'] == CONNECTION_STATE['Unavailable']: if result['State'] == CONNECTION_STATE['Unavailable']:
self.busy.setVisibleCondition('false') self.busy.setVisibleCondition('false')
self.message.setLabel(_(30609)) self.message.setLabel(translate(30609))
return False return False
else: else:
xbmc.sleep(1000) xbmc.sleep(1000)

View file

@ -9,7 +9,7 @@ import re
import xbmcgui import xbmcgui
import xbmcaddon import xbmcaddon
from helper import _, addon_id from helper import translate, addon_id
from jellyfin.connection_manager import CONNECTION_STATE from jellyfin.connection_manager import CONNECTION_STATE
################################################################################################## ##################################################################################################
@ -77,7 +77,7 @@ class ServerManual(xbmcgui.WindowXMLDialog):
if not server: if not server:
# Display error # Display error
self._error(ERROR['Empty'], _('empty_server')) self._error(ERROR['Empty'], translate('empty_server'))
LOG.error("Server cannot be null") LOG.error("Server cannot be null")
elif self._connect_to_server(server): elif self._connect_to_server(server):
@ -116,11 +116,11 @@ class ServerManual(xbmcgui.WindowXMLDialog):
if _IPV6_RE.match(server): if _IPV6_RE.match(server):
server = "[%s]" % (server) server = "[%s]" % (server)
self._message("%s %s..." % (_(30610), server)) self._message("%s %s..." % (translate(30610), server))
result = self.connect_manager.connect_to_address(server) result = self.connect_manager.connect_to_address(server)
if result['State'] == CONNECTION_STATE['Unavailable']: if result['State'] == CONNECTION_STATE['Unavailable']:
self._message(_(30609)) self._message(translate(30609))
return False return False
else: else:
self._server = result['Servers'][0] self._server = result['Servers'][0]

View file

@ -11,7 +11,7 @@ import xbmcaddon
import database import database
from dialogs import context from dialogs import context
from helper import _, settings, dialog from helper import translate, settings, dialog
from downloader import TheVoid from downloader import TheVoid
################################################################################################# #################################################################################################
@ -19,12 +19,12 @@ from downloader import TheVoid
LOG = logging.getLogger("JELLYFIN." + __name__) LOG = logging.getLogger("JELLYFIN." + __name__)
XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i") XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i")
OPTIONS = { OPTIONS = {
'Refresh': _(30410), 'Refresh': translate(30410),
'Delete': _(30409), 'Delete': translate(30409),
'Addon': _(30408), 'Addon': translate(30408),
'AddFav': _(30405), 'AddFav': translate(30405),
'RemoveFav': _(30406), 'RemoveFav': translate(30406),
'Transcode': _(30412) 'Transcode': translate(30412)
} }
################################################################################################# #################################################################################################
@ -163,7 +163,7 @@ class Context(object):
if not settings('skipContextMenu.bool'): if not settings('skipContextMenu.bool'):
if not dialog("yesno", heading="{jellyfin}", line1=_(33015)): if not dialog("yesno", heading="{jellyfin}", line1=translate(33015)):
delete = False delete = False
if delete: if delete:

View file

@ -19,7 +19,7 @@ import client
from database import reset, get_sync, Database, jellyfin_db, get_credentials from database import reset, get_sync, Database, jellyfin_db, get_credentials
from objects import Objects, Actions from objects import Objects, Actions
from downloader import TheVoid from downloader import TheVoid
from helper import _, event, settings, window, dialog, api, JSONRPC from helper import translate, event, settings, window, dialog, api, JSONRPC
################################################################################################# #################################################################################################
@ -146,14 +146,14 @@ def listing():
context = [] context = []
if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music', 'mixed') and view_id not in whitelist: if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music', 'mixed') and view_id not in whitelist:
label = "%s %s" % (label.decode('utf-8'), _(33166)) label = "%s %s" % (label.decode('utf-8'), translate(33166))
context.append((_(33123), "RunPlugin(plugin://plugin.video.jellyfin/?mode=synclib&id=%s)" % view_id)) context.append((translate(33123), "RunPlugin(plugin://plugin.video.jellyfin/?mode=synclib&id=%s)" % view_id))
if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music') and view_id in whitelist: if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music') and view_id in whitelist:
context.append((_(33136), "RunPlugin(plugin://plugin.video.jellyfin/?mode=updatelib&id=%s)" % view_id)) context.append((translate(33136), "RunPlugin(plugin://plugin.video.jellyfin/?mode=updatelib&id=%s)" % view_id))
context.append((_(33132), "RunPlugin(plugin://plugin.video.jellyfin/?mode=repairlib&id=%s)" % view_id)) context.append((translate(33132), "RunPlugin(plugin://plugin.video.jellyfin/?mode=repairlib&id=%s)" % view_id))
context.append((_(33133), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removelib&id=%s)" % view_id)) context.append((translate(33133), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removelib&id=%s)" % view_id))
LOG.debug("--[ listing/%s/%s ] %s", node, label, path) LOG.debug("--[ listing/%s/%s ] %s", node, label, path)
@ -171,22 +171,22 @@ def listing():
context = [] context = []
if server.get('ManualAddress'): if server.get('ManualAddress'):
context.append((_(33141), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removeserver&server=%s)" % server['Id'])) context.append((translate(33141), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removeserver&server=%s)" % server['Id']))
if 'AccessToken' not in server: if 'AccessToken' not in server:
directory("%s (%s)" % (server['Name'], _(30539)), "plugin://plugin.video.jellyfin/?mode=login&server=%s" % server['Id'], False, context=context) directory("%s (%s)" % (server['Name'], translate(30539)), "plugin://plugin.video.jellyfin/?mode=login&server=%s" % server['Id'], False, context=context)
else: else:
directory(server['Name'], "plugin://plugin.video.jellyfin/?mode=browse&server=%s" % server['Id'], context=context) directory(server['Name'], "plugin://plugin.video.jellyfin/?mode=browse&server=%s" % server['Id'], context=context)
directory(_(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True) directory(translate(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True)
directory(_(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False) directory(translate(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False)
directory(_(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False) directory(translate(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False)
directory(_(5), "plugin://plugin.video.jellyfin/?mode=settings", False) directory(translate(5), "plugin://plugin.video.jellyfin/?mode=settings", False)
directory(_(33058), "plugin://plugin.video.jellyfin/?mode=reset", False) directory(translate(33058), "plugin://plugin.video.jellyfin/?mode=reset", False)
directory(_(33192), "plugin://plugin.video.jellyfin/?mode=restartservice", False) directory(translate(33192), "plugin://plugin.video.jellyfin/?mode=restartservice", False)
if settings('backupPath'): if settings('backupPath'):
directory(_(33092), "plugin://plugin.video.jellyfin/?mode=backup", False) directory(translate(33092), "plugin://plugin.video.jellyfin/?mode=backup", False)
xbmcplugin.setContent(int(sys.argv[1]), 'files') xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1])) xbmcplugin.endOfDirectory(int(sys.argv[1]))
@ -220,12 +220,12 @@ def dir_listitem(label, path, artwork=None, fanart=None):
def manage_libraries(): def manage_libraries():
directory(_(33098), "plugin://plugin.video.jellyfin/?mode=refreshboxsets", False) directory(translate(33098), "plugin://plugin.video.jellyfin/?mode=refreshboxsets", False)
directory(_(33154), "plugin://plugin.video.jellyfin/?mode=addlibs", False) directory(translate(33154), "plugin://plugin.video.jellyfin/?mode=addlibs", False)
directory(_(33139), "plugin://plugin.video.jellyfin/?mode=updatelibs", False) directory(translate(33139), "plugin://plugin.video.jellyfin/?mode=updatelibs", False)
directory(_(33140), "plugin://plugin.video.jellyfin/?mode=repairlibs", False) directory(translate(33140), "plugin://plugin.video.jellyfin/?mode=repairlibs", False)
directory(_(33184), "plugin://plugin.video.jellyfin/?mode=removelibs", False) directory(translate(33184), "plugin://plugin.video.jellyfin/?mode=removelibs", False)
directory(_(33060), "plugin://plugin.video.jellyfin/?mode=thememedia", False) directory(translate(33060), "plugin://plugin.video.jellyfin/?mode=thememedia", False)
xbmcplugin.setContent(int(sys.argv[1]), 'files') xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1])) xbmcplugin.endOfDirectory(int(sys.argv[1]))
@ -345,9 +345,9 @@ def browse(media, view_id=None, folder=None, server_id=None):
context.append(("Play", "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id))) context.append(("Play", "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id)))
if item['UserData']['Played']: if item['UserData']['Played']:
context.append((_(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id))) context.append((translate(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
else: else:
context.append((_(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id))) context.append((translate(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
li.addContextMenuItems(context) li.addContextMenuItems(context)
list_li.append((path, li, True)) list_li.append((path, li, True))
@ -373,12 +373,12 @@ def browse(media, view_id=None, folder=None, server_id=None):
} }
path = "%s?%s" % ("plugin://plugin.video.jellyfin/", urllib.urlencode(params)) path = "%s?%s" % ("plugin://plugin.video.jellyfin/", urllib.urlencode(params))
li.setProperty('path', path) li.setProperty('path', path)
context = [(_(13412), "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id))] context = [(translate(13412), "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id))]
if item['UserData']['Played']: if item['UserData']['Played']:
context.append((_(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id))) context.append((translate(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
else: else:
context.append((_(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id))) context.append((translate(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
li.addContextMenuItems(context) li.addContextMenuItems(context)
@ -740,14 +740,14 @@ def add_user():
users = TheVoid('GetUsers', {'IsDisabled': False, 'IsHidden': False}).get() users = TheVoid('GetUsers', {'IsDisabled': False, 'IsHidden': False}).get()
current = session[0]['AdditionalUsers'] current = session[0]['AdditionalUsers']
result = dialog("select", _(33061), [_(33062), _(33063)] if current else [_(33062)]) result = dialog("select", translate(33061), [translate(33062), translate(33063)] if current else [translate(33062)])
if result < 0: if result < 0:
return return
if not result: # Add user if not result: # Add user
eligible = [x for x in users if x['Id'] not in [current_user['UserId'] for current_user in current]] eligible = [x for x in users if x['Id'] not in [current_user['UserId'] for current_user in current]]
resp = dialog("select", _(33064), [x['Name'] for x in eligible]) resp = dialog("select", translate(33064), [x['Name'] for x in eligible])
if resp < 0: if resp < 0:
return return
@ -755,7 +755,7 @@ def add_user():
user = eligible[resp] user = eligible[resp]
event('AddUser', {'Id': user['Id'], 'Add': True}) event('AddUser', {'Id': user['Id'], 'Add': True})
else: # Remove user else: # Remove user
resp = dialog("select", _(33064), [x['UserName'] for x in current]) resp = dialog("select", translate(33064), [x['UserName'] for x in current])
if resp < 0: if resp < 0:
return return
@ -786,7 +786,7 @@ def get_themes():
tvtunes.setSetting('custom_path', library) tvtunes.setSetting('custom_path', library)
LOG.info("TV Tunes custom path is enabled and set.") LOG.info("TV Tunes custom path is enabled and set.")
else: else:
dialog("ok", heading="{jellyfin}", line1=_(33152)) dialog("ok", heading="{jellyfin}", line1=translate(33152))
return return
@ -834,7 +834,7 @@ def get_themes():
tvtunes_nfo(nfo_file, paths) tvtunes_nfo(nfo_file, paths)
dialog("notification", heading="{jellyfin}", message=_(33153), icon="{jellyfin}", time=1000, sound=False) dialog("notification", heading="{jellyfin}", message=translate(33153), icon="{jellyfin}", time=1000, sound=False)
def delete_item(): def delete_item():
@ -854,7 +854,7 @@ def backup():
path = settings('backupPath') path = settings('backupPath')
folder_name = "Kodi%s.%s" % (xbmc.getInfoLabel('System.BuildVersion')[:2], xbmc.getInfoLabel('System.Date(dd-mm-yy)')) folder_name = "Kodi%s.%s" % (xbmc.getInfoLabel('System.BuildVersion')[:2], xbmc.getInfoLabel('System.Date(dd-mm-yy)'))
folder_name = dialog("input", heading=_(33089), defaultt=folder_name) folder_name = dialog("input", heading=translate(33089), defaultt=folder_name)
if not folder_name: if not folder_name:
return return
@ -862,7 +862,7 @@ def backup():
backup = os.path.join(path, folder_name) backup = os.path.join(path, folder_name)
if xbmcvfs.exists(backup + '/'): if xbmcvfs.exists(backup + '/'):
if not dialog("yesno", heading="{jellyfin}", line1=_(33090)): if not dialog("yesno", heading="{jellyfin}", line1=translate(33090)):
return backup() return backup()
@ -875,7 +875,7 @@ def backup():
if not xbmcvfs.mkdirs(path) or not xbmcvfs.mkdirs(destination_databases): if not xbmcvfs.mkdirs(path) or not xbmcvfs.mkdirs(destination_databases):
LOG.info("Unable to create all directories") LOG.info("Unable to create all directories")
dialog("notification", heading="{jellyfin}", icon="{jellyfin}", message=_(33165), sound=False) dialog("notification", heading="{jellyfin}", icon="{jellyfin}", message=translate(33165), sound=False)
return return
@ -900,4 +900,4 @@ def backup():
LOG.info("copied %s", filename) LOG.info("copied %s", filename)
LOG.info("backup completed") LOG.info("backup completed")
dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33091), backup)) dialog("ok", heading="{jellyfin}", line1="%s %s" % (translate(33091), backup))

View file

@ -19,7 +19,7 @@ import library
import setup import setup
import monitor import monitor
from views import Views, verify_kodi_defaults from views import Views, verify_kodi_defaults
from helper import _, window, settings, event, dialog from helper import translate, window, settings, event, dialog
from jellyfin import Jellyfin from jellyfin import Jellyfin
################################################################################################# #################################################################################################
@ -116,7 +116,7 @@ class Service(xbmc.Monitor):
if window('jellyfin.restart.bool'): if window('jellyfin.restart.bool'):
window('jellyfin.restart', clear=True) window('jellyfin.restart', clear=True)
dialog("notification", heading="{jellyfin}", message=_(33193), icon="{jellyfin}", time=1000, sound=False) dialog("notification", heading="{jellyfin}", message=translate(33193), icon="{jellyfin}", time=1000, sound=False)
raise Exception('RestartService') raise Exception('RestartService')
@ -183,7 +183,7 @@ class Service(xbmc.Monitor):
users = [user for user in (settings('additionalUsers') or "").decode('utf-8').split(',') if user] users = [user for user in (settings('additionalUsers') or "").decode('utf-8').split(',') if user]
users.insert(0, settings('username').decode('utf-8')) users.insert(0, settings('username').decode('utf-8'))
dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33000), ", ".join(users)), dialog("notification", heading="{jellyfin}", message="%s %s" % (translate(33000), ", ".join(users)),
icon="{jellyfin}", time=1500, sound=False) icon="{jellyfin}", time=1500, sound=False)
if self.library_thread is None: if self.library_thread is None:
@ -196,7 +196,7 @@ class Service(xbmc.Monitor):
if self.warn or data.get('ServerId'): if self.warn or data.get('ServerId'):
self.warn = data.get('ServerId') is not None self.warn = data.get('ServerId') is not None
dialog("notification", heading="{jellyfin}", message=_(33146) if data.get('ServerId') is None else _(33149), icon=xbmcgui.NOTIFICATION_ERROR) dialog("notification", heading="{jellyfin}", message=translate(33146) if data.get('ServerId') is None else translate(33149), icon=xbmcgui.NOTIFICATION_ERROR)
if data.get('ServerId') is None: if data.get('ServerId') is None:
self.stop_default() self.stop_default()
@ -207,7 +207,7 @@ class Service(xbmc.Monitor):
self.start_default() self.start_default()
elif method == 'Unauthorized': elif method == 'Unauthorized':
dialog("notification", heading="{jellyfin}", message=_(33147) if data['ServerId'] is None else _(33148), icon=xbmcgui.NOTIFICATION_ERROR) dialog("notification", heading="{jellyfin}", message=translate(33147) if data['ServerId'] is None else translate(33148), icon=xbmcgui.NOTIFICATION_ERROR)
if data.get('ServerId') is None and self.settings['auth_check']: if data.get('ServerId') is None and self.settings['auth_check']:
@ -224,7 +224,7 @@ class Service(xbmc.Monitor):
return return
if settings('restartMsg.bool'): if settings('restartMsg.bool'):
dialog("notification", heading="{jellyfin}", message=_(33006), icon="{jellyfin}") dialog("notification", heading="{jellyfin}", message=translate(33006), icon="{jellyfin}")
self.stop_default() self.stop_default()
@ -249,7 +249,7 @@ class Service(xbmc.Monitor):
elif method == 'UpdateServer': elif method == 'UpdateServer':
dialog("ok", heading="{jellyfin}", line1=_(33151)) dialog("ok", heading="{jellyfin}", line1=translate(33151))
self.connect.setup_manual_server() self.connect.setup_manual_server()
elif method == 'UserDataChanged' and self.library_thread: elif method == 'UserDataChanged' and self.library_thread:
@ -383,13 +383,13 @@ class Service(xbmc.Monitor):
if not self.settings.get('mode_warn'): if not self.settings.get('mode_warn'):
self.settings['mode_warn'] = True self.settings['mode_warn'] = True
dialog("yesno", heading="{jellyfin}", line1=_(33118)) dialog("yesno", heading="{jellyfin}", line1=translate(33118))
if settings('kodiCompanion.bool') != self.settings['kodi_companion']: if settings('kodiCompanion.bool') != self.settings['kodi_companion']:
self.settings['kodi_companion'] = settings('kodiCompanion.bool') self.settings['kodi_companion'] = settings('kodiCompanion.bool')
if not self.settings['kodi_companion']: if not self.settings['kodi_companion']:
dialog("ok", heading="{jellyfin}", line1=_(33138)) dialog("ok", heading="{jellyfin}", line1=translate(33138))
def reload_objects(self): def reload_objects(self):

View file

@ -10,7 +10,7 @@ import xbmc
import downloader as server import downloader as server
import helper.xmls as xmls import helper.xmls as xmls
from database import Database, get_sync, save_sync, jellyfin_db from database import Database, get_sync, save_sync, jellyfin_db
from helper import _, settings, window, progress, dialog, LibraryException from helper import translate, settings, window, progress, dialog, LibraryException
from helper.utils import get_screensaver, set_screensaver from helper.utils import get_screensaver, set_screensaver
################################################################################################## ##################################################################################################
@ -40,7 +40,7 @@ class FullSync(object):
self.__dict__ = self._shared_state self.__dict__ = self._shared_state
if self.running: if self.running:
dialog("ok", heading="{jellyfin}", line1=_(33197)) dialog("ok", heading="{jellyfin}", line1=translate(33197))
raise Exception("Sync is already running.") raise Exception("Sync is already running.")
@ -111,10 +111,10 @@ class FullSync(object):
''' '''
if self.sync['Libraries']: if self.sync['Libraries']:
if not dialog("yesno", heading="{jellyfin}", line1=_(33102)): if not dialog("yesno", heading="{jellyfin}", line1=translate(33102)):
if not dialog("yesno", heading="{jellyfin}", line1=_(33173)): if not dialog("yesno", heading="{jellyfin}", line1=translate(33173)):
dialog("ok", heading="{jellyfin}", line1=_(33122)) dialog("ok", heading="{jellyfin}", line1=translate(33122))
raise LibraryException("ProgressStopped") raise LibraryException("ProgressStopped")
else: else:
@ -142,8 +142,8 @@ class FullSync(object):
''' '''
choices = [x['Name'] for x in libraries] choices = [x['Name'] for x in libraries]
choices.insert(0, _(33121)) choices.insert(0, translate(33121))
selection = dialog("multi", _(33120), choices) selection = dialog("multi", translate(33120), choices)
if selection is None: if selection is None:
raise LibraryException('LibrarySelection') raise LibraryException('LibrarySelection')
@ -193,7 +193,7 @@ class FullSync(object):
save_sync(self.sync) save_sync(self.sync)
xbmc.executebuiltin('UpdateLibrary(video)') xbmc.executebuiltin('UpdateLibrary(video)')
dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33025), str(elapsed).split('.')[0]), dialog("notification", heading="{jellyfin}", message="%s %s" % (translate(33025), str(elapsed).split('.')[0]),
icon="{jellyfin}", sound=False) icon="{jellyfin}", sound=False)
LOG.info("Full sync completed in: %s", str(elapsed).split('.')[0]) LOG.info("Full sync completed in: %s", str(elapsed).split('.')[0])
@ -241,7 +241,7 @@ class FullSync(object):
if 'Failed to validate path' not in error: if 'Failed to validate path' not in error:
dialog("ok", heading="{jellyfin}", line1=_(33119)) dialog("ok", heading="{jellyfin}", line1=translate(33119))
LOG.error("full sync exited unexpectedly") LOG.error("full sync exited unexpectedly")
save_sync(self.sync) save_sync(self.sync)
@ -268,7 +268,7 @@ class FullSync(object):
for index, movie in enumerate(items['Items']): for index, movie in enumerate(items['Items']):
dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100), dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100),
heading="%s: %s" % (_('addon_name'), library['Name']), heading="%s: %s" % (translate('addon_name'), library['Name']),
message=movie['Name']) message=movie['Name'])
obj.movie(movie, library=library) obj.movie(movie, library=library)
@ -309,7 +309,7 @@ class FullSync(object):
percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100) percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100)
message = show['Name'] message = show['Name']
dialog.update(percent, heading="%s: %s" % (_('addon_name'), library['Name']), message=message) dialog.update(percent, heading="%s: %s" % (translate('addon_name'), library['Name']), message=message)
if obj.tvshow(show, library=library) is not False: if obj.tvshow(show, library=library) is not False:
@ -358,7 +358,7 @@ class FullSync(object):
for index, mvideo in enumerate(items['Items']): for index, mvideo in enumerate(items['Items']):
dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100), dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100),
heading="%s: %s" % (_('addon_name'), library['Name']), heading="%s: %s" % (translate('addon_name'), library['Name']),
message=mvideo['Name']) message=mvideo['Name'])
obj.musicvideo(mvideo, library=library) obj.musicvideo(mvideo, library=library)
@ -399,7 +399,7 @@ class FullSync(object):
percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100) percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100)
message = artist['Name'] message = artist['Name']
dialog.update(percent, heading="%s: %s" % (_('addon_name'), library['Name']), message=message) dialog.update(percent, heading="%s: %s" % (translate('addon_name'), library['Name']), message=message)
obj.artist(artist, library=library) obj.artist(artist, library=library)
for albums in server.get_albums_by_artist(artist['Id']): for albums in server.get_albums_by_artist(artist['Id']):
@ -439,7 +439,7 @@ class FullSync(object):
if x[0] not in current and x[1] == 'MusicArtist': if x[0] not in current and x[1] == 'MusicArtist':
obj.remove(x[0]) obj.remove(x[0])
@progress(_(33018)) @progress(translate(33018))
def boxsets(self, library_id=None, dialog=None): def boxsets(self, library_id=None, dialog=None):
''' Process all boxsets. ''' Process all boxsets.
@ -459,7 +459,7 @@ class FullSync(object):
for index, boxset in enumerate(items['Items']): for index, boxset in enumerate(items['Items']):
dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100), dialog.update(int((float(start_index + index) / float(items['TotalRecordCount'])) * 100),
heading="%s: %s" % (_('addon_name'), _('boxsets')), heading="%s: %s" % (translate('addon_name'), translate('boxsets')),
message=boxset['Name']) message=boxset['Name'])
obj.boxset(boxset) obj.boxset(boxset)
@ -478,7 +478,7 @@ class FullSync(object):
self.boxsets(None) self.boxsets(None)
@progress(_(33144)) @progress(translate(33144))
def remove_library(self, library_id, dialog): def remove_library(self, library_id, dialog):
''' Remove library by their id from the Kodi database. ''' Remove library by their id from the Kodi database.
@ -512,7 +512,7 @@ class FullSync(object):
for item in movies: for item in movies:
obj(item[0]) obj(item[0])
dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (_('addon_name'), library[0])) dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0]))
count += 1 count += 1
obj = TVShows(self.server, jellyfindb, kodidb, direct_path).remove obj = TVShows(self.server, jellyfindb, kodidb, direct_path).remove
@ -520,7 +520,7 @@ class FullSync(object):
for item in tvshows: for item in tvshows:
obj(item[0]) obj(item[0])
dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (_('addon_name'), library[0])) dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0]))
count += 1 count += 1
else: else:
# from mcarlton: I'm not sure what triggers this. # from mcarlton: I'm not sure what triggers this.
@ -535,7 +535,7 @@ class FullSync(object):
for item in items: for item in items:
obj(item[0]) obj(item[0])
dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (_('addon_name'), library[0])) dialog.update(int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0]))
count += 1 count += 1
self.sync = get_sync() self.sync = get_sync()

View file

@ -1,4 +1,4 @@
from translate import _ from translate import translate
from exceptions import LibraryException from exceptions import LibraryException
from utils import addon_id from utils import addon_id

View file

@ -15,7 +15,7 @@ import client
import requests import requests
from downloader import TheVoid from downloader import TheVoid
from . import _, settings, window, dialog from . import translate, settings, window, dialog
################################################################################################# #################################################################################################
@ -111,7 +111,7 @@ class PlayUtils(object):
for source in sources: for source in sources:
selection.append(source.get('Name', "na")) selection.append(source.get('Name', "na"))
resp = dialog("select", _(33130), selection) resp = dialog("select", translate(33130), selection)
if resp > -1: if resp > -1:
source = sources[resp] source = sources[resp]
@ -581,7 +581,7 @@ class PlayUtils(object):
if len(audio_streams) > 1: if len(audio_streams) > 1:
selection = list(audio_streams.keys()) selection = list(audio_streams.keys())
resp = dialog("select", _(33013), selection) resp = dialog("select", translate(33013), selection)
audio_selected = audio_streams[selection[resp]] if resp else source['DefaultAudioStreamIndex'] audio_selected = audio_streams[selection[resp]] if resp else source['DefaultAudioStreamIndex']
else: # Only one choice else: # Only one choice
audio_selected = audio_streams[next(iter(audio_streams))] audio_selected = audio_streams[next(iter(audio_streams))]
@ -608,7 +608,7 @@ class PlayUtils(object):
elif skip_dialog in (0, 2) and len(subs_streams): elif skip_dialog in (0, 2) and len(subs_streams):
selection = list(['No subtitles']) + list(subs_streams.keys()) selection = list(['No subtitles']) + list(subs_streams.keys())
resp = dialog("select", _(33014), selection) resp = dialog("select", translate(33014), selection)
if resp: if resp:
index = subs_streams[selection[resp]] if resp > -1 else source.get('DefaultSubtitleStreamIndex') index = subs_streams[selection[resp]] if resp > -1 else source.get('DefaultSubtitleStreamIndex')

View file

@ -14,7 +14,7 @@ LOG = logging.getLogger('JELLYFIN.' + __name__)
################################################################################################## ##################################################################################################
def _(string): def translate(string):
''' Get add-on string. Returns in unicode. ''' Get add-on string. Returns in unicode.
''' '''

View file

@ -19,7 +19,7 @@ import xbmcaddon
import xbmcgui import xbmcgui
import xbmcvfs import xbmcvfs
from translate import _ from translate import translate
################################################################################################# #################################################################################################
@ -154,7 +154,7 @@ def dialog(dialog_type, *args, **kwargs):
"special://home/addons/plugin.video.jellyfin/resources/icon.png" "special://home/addons/plugin.video.jellyfin/resources/icon.png"
) )
if "heading" in kwargs: if "heading" in kwargs:
kwargs['heading'] = kwargs['heading'].replace("{jellyfin}", _('addon_name')) kwargs['heading'] = kwargs['heading'].replace("{jellyfin}", translate('addon_name'))
types = { types = {
'yesno': d.yesno, 'yesno': d.yesno,
@ -250,7 +250,7 @@ def validate(path):
if not xbmcvfs.exists(path): if not xbmcvfs.exists(path):
LOG.info("Could not find %s", path) LOG.info("Could not find %s", path)
if dialog("yesno", heading="{jellyfin}", line1="%s %s. %s" % (_(33047), path, _(33048))): if dialog("yesno", heading="{jellyfin}", line1="%s %s. %s" % (translate(33047), path, translate(33048))):
return False return False

View file

@ -8,7 +8,7 @@ import xbmcgui
from .utils import should_stop from .utils import should_stop
from .exceptions import LibraryException from .exceptions import LibraryException
from .translate import _ from .translate import translate
################################################################################################# #################################################################################################
@ -28,10 +28,10 @@ def progress(message=None):
if item and type(item) == dict: if item and type(item) == dict:
dialog.create(_('addon_name'), "%s %s" % (_('gathering'), item['Name'])) dialog.create(translate('addon_name'), "%s %s" % (translate('gathering'), item['Name']))
LOG.info("Processing %s: %s", item['Name'], item['Id']) LOG.info("Processing %s: %s", item['Name'], item['Id'])
else: else:
dialog.create(_('addon_name'), message) dialog.create(translate('addon_name'), message)
LOG.info("Processing %s", message) LOG.info("Processing %s", message)
if item: if item:

View file

@ -8,7 +8,7 @@ import xml.etree.ElementTree as etree
import xbmc import xbmc
from . import _, indent, write_xml, dialog, settings from . import translate, indent, write_xml, dialog, settings
################################################################################################# #################################################################################################
@ -127,7 +127,7 @@ def advanced_settings():
indent(xml) indent(xml)
write_xml(etree.tostring(xml, 'UTF-8'), path) write_xml(etree.tostring(xml, 'UTF-8'), path)
dialog("ok", heading="{jellyfin}", line1=_(33097)) dialog("ok", heading="{jellyfin}", line1=translate(33097))
xbmc.executebuiltin('RestartApp') xbmc.executebuiltin('RestartApp')
return True return True

View file

@ -15,7 +15,7 @@ from database import Database, jellyfin_db, get_sync, save_sync
from full_sync import FullSync from full_sync import FullSync
from views import Views from views import Views
from downloader import GetItemWorker from downloader import GetItemWorker
from helper import _, api, stop, settings, window, dialog, event, LibraryException from helper import translate, api, stop, settings, window, dialog, event, LibraryException
from helper.utils import split_list, set_screensaver, get_screensaver from helper.utils import split_list, set_screensaver, get_screensaver
from jellyfin import Jellyfin from jellyfin import Jellyfin
@ -155,12 +155,12 @@ class Library(threading.Thread):
if self.progress_updates is None: if self.progress_updates is None:
self.progress_updates = xbmcgui.DialogProgressBG() self.progress_updates = xbmcgui.DialogProgressBG()
self.progress_updates.create(_('addon_name'), _(33178)) self.progress_updates.create(translate('addon_name'), translate(33178))
self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message="%s: %s" % (_(33178), queue_size)) self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message="%s: %s" % (translate(33178), queue_size))
elif queue_size: elif queue_size:
self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message="%s: %s" % (_(33178), queue_size)) self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message="%s: %s" % (translate(33178), queue_size))
else: else:
self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message=_(33178)) self.progress_updates.update(int((float(self.total_updates - queue_size) / float(self.total_updates)) * 100), message=translate(33178))
if not settings('dbSyncScreensaver.bool') and self.screensaver is None: if not settings('dbSyncScreensaver.bool') and self.screensaver is None:
@ -346,7 +346,7 @@ class Library(threading.Thread):
if self.server.jellyfin.check_companion_installed(): if self.server.jellyfin.check_companion_installed():
if not self.fast_sync(): if not self.fast_sync():
dialog("ok", heading="{jellyfin}", line1=_(33128)) dialog("ok", heading="{jellyfin}", line1=translate(33128))
raise Exception("Failed to retrieve latest updates") raise Exception("Failed to retrieve latest updates")
@ -361,7 +361,7 @@ class Library(threading.Thread):
if error.status in 'SyncLibraryLater': if error.status in 'SyncLibraryLater':
dialog("ok", heading="{jellyfin}", line1=_(33129)) dialog("ok", heading="{jellyfin}", line1=translate(33129))
settings('SyncInstallRunDone.bool', True) settings('SyncInstallRunDone.bool', True)
sync = get_sync() sync = get_sync()
sync['Libraries'] = [] sync['Libraries'] = []
@ -371,7 +371,7 @@ class Library(threading.Thread):
elif error.status == 'CompanionMissing': elif error.status == 'CompanionMissing':
dialog("ok", heading="{jellyfin}", line1=_(33099)) dialog("ok", heading="{jellyfin}", line1=translate(33099))
settings('kodiCompanion.bool', False) settings('kodiCompanion.bool', False)
return True return True
@ -408,7 +408,7 @@ class Library(threading.Thread):
''' Inverse yes no, in case the dialog is forced closed by Kodi. ''' Inverse yes no, in case the dialog is forced closed by Kodi.
''' '''
if dialog("yesno", heading="{jellyfin}", line1=_(33172).replace('{number}', str(total)), nolabel=_(107), yeslabel=_(106)): if dialog("yesno", heading="{jellyfin}", line1=translate(33172).replace('{number}', str(total)), nolabel=translate(107), yeslabel=translate(106)):
LOG.warning("Large updates skipped.") LOG.warning("Large updates skipped.")
return True return True
@ -486,7 +486,7 @@ class Library(threading.Thread):
libraries.append({'Id': library, 'Name': name}) libraries.append({'Id': library, 'Name': name})
choices = [x['Name'] for x in libraries] choices = [x['Name'] for x in libraries]
choices.insert(0, _(33121)) choices.insert(0, translate(33121))
titles = { titles = {
"RepairLibrarySelection": 33199, "RepairLibrarySelection": 33199,
@ -496,7 +496,7 @@ class Library(threading.Thread):
} }
title = titles.get(mode, "Failed to get title {}".format(mode)) title = titles.get(mode, "Failed to get title {}".format(mode))
selection = dialog("multi", _(title), choices) selection = dialog("multi", translate(title), choices)
if selection is None: if selection is None:
return return
@ -814,7 +814,7 @@ class NotifyWorker(threading.Thread):
time = self.music_time if item[0] == 'Audio' else self.video_time time = self.music_time if item[0] == 'Audio' else self.video_time
if time and (not self.player.isPlayingVideo() or xbmc.getCondVisibility('VideoPlayer.Content(livetv)')): if time and (not self.player.isPlayingVideo() or xbmc.getCondVisibility('VideoPlayer.Content(livetv)')):
dialog("notification", heading="%s %s" % (_(33049), item[0]), message=item[1], dialog("notification", heading="%s %s" % (translate(33049), item[0]), message=item[1],
icon="{jellyfin}", time=time, sound=False) icon="{jellyfin}", time=time, sound=False)
self.queue.task_done() self.queue.task_done()

View file

@ -14,7 +14,7 @@ import downloader
import player import player
from client import get_device_id from client import get_device_id
from objects import PlaylistWorker, on_play, on_update, special_listener from objects import PlaylistWorker, on_play, on_update, special_listener
from helper import _, settings, window, dialog, api, JSONRPC from helper import translate, settings, window, dialog, api, JSONRPC
from jellyfin import Jellyfin from jellyfin import Jellyfin
from webservice import WebService from webservice import WebService
@ -114,7 +114,7 @@ class Monitor(xbmc.Monitor):
except Exception as error: except Exception as error:
LOG.exception(error) LOG.exception(error)
dialog("ok", heading="{jellyfin}", line1=_(33142)) dialog("ok", heading="{jellyfin}", line1=translate(33142))
return return

View file

@ -15,7 +15,7 @@ import xbmcaddon
import database import database
from downloader import TheVoid from downloader import TheVoid
from obj import Objects from obj import Objects
from helper import _, playutils, api, window, settings, dialog from helper import translate, playutils, api, window, settings, dialog
from dialogs import resume from dialogs import resume
################################################################################################# #################################################################################################
@ -122,7 +122,7 @@ class Actions(object):
if settings('askCinema') == "true": if settings('askCinema') == "true":
resp = dialog("yesno", heading="{jellyfin}", line1=_(33016)) resp = dialog("yesno", heading="{jellyfin}", line1=translate(33016))
if not resp: if not resp:
enabled = False enabled = False

View file

@ -216,4 +216,4 @@ class GetArtworkWorker(threading.Thread):
self.queue.task_done() self.queue.task_done()
if xbmc.Monitor().abortRequested(): if xbmc.Monitor().abortRequested():
break break

View file

@ -9,7 +9,7 @@ import xbmc
import xbmcvfs import xbmcvfs
from objects.obj import Objects from objects.obj import Objects
from helper import _, api, window, settings, dialog, event, silent_catch, JSONRPC from helper import translate, api, window, settings, dialog, event, silent_catch, JSONRPC
from jellyfin import Jellyfin from jellyfin import Jellyfin
################################################################################################# #################################################################################################
@ -436,7 +436,7 @@ class Player(xbmc.Player):
if delete: if delete:
LOG.info("Offer delete option") LOG.info("Offer delete option")
if dialog("yesno", heading=_(30091), line1=_(33015), autoclose=120000): if dialog("yesno", heading=translate(30091), line1=translate(33015), autoclose=120000):
item['Server'].jellyfin.delete_item(item['Id']) item['Server'].jellyfin.delete_item(item['Id'])
window('jellyfin.external_check', clear=True) window('jellyfin.external_check', clear=True)

View file

@ -4,7 +4,7 @@
import logging import logging
from helper import _, settings, dialog, JSONRPC from helper import translate, settings, dialog, JSONRPC
################################################################################################# #################################################################################################
@ -40,7 +40,7 @@ class Setup(object):
if not self.get_web_server(): if not self.get_web_server():
settings('enableTextureCache.bool', False) settings('enableTextureCache.bool', False)
dialog("ok", heading="{jellyfin}", line1=_(33103)) dialog("ok", heading="{jellyfin}", line1=translate(33103))
return return
@ -84,22 +84,22 @@ class Setup(object):
''' Setup playback mode. If native mode selected, check network credentials. ''' Setup playback mode. If native mode selected, check network credentials.
''' '''
value = dialog("yesno", value = dialog("yesno",
heading=_('playback_mode'), heading=translate('playback_mode'),
line1=_(33035), line1=translate(33035),
nolabel=_('addon_mode'), nolabel=translate('addon_mode'),
yeslabel=_('native_mode')) yeslabel=translate('native_mode'))
settings('useDirectPaths', value="1" if value else "0") settings('useDirectPaths', value="1" if value else "0")
if value: if value:
dialog("ok", heading="{jellyfin}", line1=_(33145)) dialog("ok", heading="{jellyfin}", line1=translate(33145))
def _is_artwork_caching(self): def _is_artwork_caching(self):
value = dialog("yesno", heading="{jellyfin}", line1=_(33117)) value = dialog("yesno", heading="{jellyfin}", line1=translate(33117))
settings('enableTextureCache.bool', value) settings('enableTextureCache.bool', value)
def _is_music(self): def _is_music(self):
value = dialog("yesno", heading="{jellyfin}", line1=_(33039)) value = dialog("yesno", heading="{jellyfin}", line1=translate(33039))
settings('enableMusic.bool', value=value) settings('enableMusic.bool', value=value)

View file

@ -12,7 +12,7 @@ import xbmc
import xbmcvfs import xbmcvfs
from database import Database, jellyfin_db, get_sync, save_sync from database import Database, jellyfin_db, get_sync, save_sync
from helper import _, api, indent, write_xml, window, event from helper import translate, api, indent, write_xml, window, event
from jellyfin import Jellyfin from jellyfin import Jellyfin
################################################################################################# #################################################################################################
@ -21,83 +21,83 @@ LOG = logging.getLogger("JELLYFIN." + __name__)
NODES = { NODES = {
'tvshows': [ 'tvshows': [
('all', None), ('all', None),
('recent', _(30170)), ('recent', translate(30170)),
('recentepisodes', _(30175)), ('recentepisodes', translate(30175)),
('inprogress', _(30171)), ('inprogress', translate(30171)),
('inprogressepisodes', _(30178)), ('inprogressepisodes', translate(30178)),
('nextepisodes', _(30179)), ('nextepisodes', translate(30179)),
('genres', 135), ('genres', 135),
('random', _(30229)), ('random', translate(30229)),
('recommended', _(30230)) ('recommended', translate(30230))
], ],
'movies': [ 'movies': [
('all', None), ('all', None),
('recent', _(30174)), ('recent', translate(30174)),
('inprogress', _(30177)), ('inprogress', translate(30177)),
('unwatched', _(30189)), ('unwatched', translate(30189)),
('sets', 20434), ('sets', 20434),
('genres', 135), ('genres', 135),
('random', _(30229)), ('random', translate(30229)),
('recommended', _(30230)) ('recommended', translate(30230))
], ],
'musicvideos': [ 'musicvideos': [
('all', None), ('all', None),
('recent', _(30256)), ('recent', translate(30256)),
('inprogress', _(30257)), ('inprogress', translate(30257)),
('unwatched', _(30258)) ('unwatched', translate(30258))
] ]
} }
DYNNODES = { DYNNODES = {
'tvshows': [ 'tvshows': [
('all', None), ('all', None),
('RecentlyAdded', _(30170)), ('RecentlyAdded', translate(30170)),
('recentepisodes', _(30175)), ('recentepisodes', translate(30175)),
('InProgress', _(30171)), ('InProgress', translate(30171)),
('inprogressepisodes', _(30178)), ('inprogressepisodes', translate(30178)),
('nextepisodes', _(30179)), ('nextepisodes', translate(30179)),
('Genres', _(135)), ('Genres', translate(135)),
('Random', _(30229)), ('Random', translate(30229)),
('recommended', _(30230)) ('recommended', translate(30230))
], ],
'movies': [ 'movies': [
('all', None), ('all', None),
('RecentlyAdded', _(30174)), ('RecentlyAdded', translate(30174)),
('InProgress', _(30177)), ('InProgress', translate(30177)),
('Boxsets', _(20434)), ('Boxsets', translate(20434)),
('Favorite', _(33168)), ('Favorite', translate(33168)),
('FirstLetter', _(33171)), ('FirstLetter', translate(33171)),
('Genres', _(135)), ('Genres', translate(135)),
('Random', _(30229)), ('Random', translate(30229)),
# ('Recommended', _(30230)) # ('Recommended', translate(30230))
], ],
'musicvideos': [ 'musicvideos': [
('all', None), ('all', None),
('RecentlyAdded', _(30256)), ('RecentlyAdded', translate(30256)),
('InProgress', _(30257)), ('InProgress', translate(30257)),
('Unwatched', _(30258)) ('Unwatched', translate(30258))
], ],
'homevideos': [ 'homevideos': [
('all', None), ('all', None),
('RecentlyAdded', _(33167)), ('RecentlyAdded', translate(33167)),
('InProgress', _(33169)), ('InProgress', translate(33169)),
('Favorite', _(33168)) ('Favorite', translate(33168))
], ],
'books': [ 'books': [
('all', None), ('all', None),
('RecentlyAdded', _(33167)), ('RecentlyAdded', translate(33167)),
('InProgress', _(33169)), ('InProgress', translate(33169)),
('Favorite', _(33168)) ('Favorite', translate(33168))
], ],
'audiobooks': [ 'audiobooks': [
('all', None), ('all', None),
('RecentlyAdded', _(33167)), ('RecentlyAdded', translate(33167)),
('InProgress', _(33169)), ('InProgress', translate(33169)),
('Favorite', _(33168)) ('Favorite', translate(33168))
], ],
'music': [ 'music': [
('all', None), ('all', None),
('RecentlyAdded', _(33167)), ('RecentlyAdded', translate(33167)),
('Favorite', _(33168)) ('Favorite', translate(33168))
] ]
} }
@ -256,9 +256,9 @@ class Views(object):
index += 1 index += 1
for single in [{'Name': _('fav_movies'), 'Tag': "Favorite movies", 'Media': "movies"}, for single in [{'Name': translate('fav_movies'), 'Tag': "Favorite movies", 'Media': "movies"},
{'Name': _('fav_tvshows'), 'Tag': "Favorite tvshows", 'Media': "tvshows"}, {'Name': translate('fav_tvshows'), 'Tag': "Favorite tvshows", 'Media': "tvshows"},
{'Name': _('fav_episodes'), 'Tag': "Favorite episodes", 'Media': "episodes"}]: {'Name': translate('fav_episodes'), 'Tag': "Favorite episodes", 'Media': "episodes"}]:
self.add_single_node(node_path, index, "favorites", single) self.add_single_node(node_path, index, "favorites", single)
index += 1 index += 1
@ -380,7 +380,7 @@ class Views(object):
etree.SubElement(xml, 'label') etree.SubElement(xml, 'label')
label = xml.find('label') label = xml.find('label')
label.text = view['Name'] if not mixed else "%s (%s)" % (view['Name'], _(view['Media'])) label.text = view['Name'] if not mixed else "%s (%s)" % (view['Name'], translate(view['Media']))
indent(xml) indent(xml)
write_xml(etree.tostring(xml, 'UTF-8'), file) write_xml(etree.tostring(xml, 'UTF-8'), file)
@ -712,7 +712,7 @@ class Views(object):
temp_view = dict(view) temp_view = dict(view)
temp_view['Media'] = media temp_view['Media'] = media
temp_view['Name'] = "%s (%s)" % (view['Name'], _(media)) temp_view['Name'] = "%s (%s)" % (view['Name'], translate(media))
self.window_node(index, temp_view, *node) self.window_node(index, temp_view, *node)
self.window_wnode(windex, temp_view, *node) self.window_wnode(windex, temp_view, *node)
else: # Add one to compensate for the duplicate. else: # Add one to compensate for the duplicate.
@ -740,9 +740,9 @@ class Views(object):
index += 1 index += 1
for single in [{'Name': _('fav_movies'), 'Tag': "Favorite movies", 'Media': "movies"}, for single in [{'Name': translate('fav_movies'), 'Tag': "Favorite movies", 'Media': "movies"},
{'Name': _('fav_tvshows'), 'Tag': "Favorite tvshows", 'Media': "tvshows"}, {'Name': translate('fav_tvshows'), 'Tag': "Favorite tvshows", 'Media': "tvshows"},
{'Name': _('fav_episodes'), 'Tag': "Favorite episodes", 'Media': "episodes"}]: {'Name': translate('fav_episodes'), 'Tag': "Favorite episodes", 'Media': "episodes"}]:
self.window_single_node(index, "favorites", single) self.window_single_node(index, "favorites", single)
index += 1 index += 1
@ -772,7 +772,7 @@ class Views(object):
else: else:
window_path = "ActivateWindow(Videos,%s,return)" % path window_path = "ActivateWindow(Videos,%s,return)" % path
node_label = _(node_label) if type(node_label) == int else node_label node_label = translate(node_label) if type(node_label) == int else node_label
node_label = node_label or view['Name'] node_label = node_label or view['Name']
if node in ('all', 'music'): if node in ('all', 'music'):
@ -824,7 +824,7 @@ class Views(object):
else: else:
window_path = "ActivateWindow(Videos,%s,return)" % path window_path = "ActivateWindow(Videos,%s,return)" % path
node_label = _(node_label) if type(node_label) == int else node_label node_label = translate(node_label) if type(node_label) == int else node_label
node_label = node_label or view['Name'] node_label = node_label or view['Name']
if node == 'all': if node == 'all':

View file

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jellyfin for Kodi\n" "Project-Id-Version: Jellyfin for Kodi\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-11 11:15+0000\n" "PO-Revision-Date: 2019-11-26 03:15+0000\n"
"Last-Translator: Madokami <fabianweller7@gmail.com>\n" "Last-Translator: Leo Verto <leotheverto+jellyfinweblate@gmail.com>\n"
"Language-Team: German <https://translate.jellyfin.org/projects/jellyfin/" "Language-Team: German <https://translate.jellyfin.org/projects/jellyfin/"
"jellyfin-kodi/de/>\n" "jellyfin-kodi/de/>\n"
"Language: de_de\n" "Language: de_de\n"
@ -36,11 +36,11 @@ msgstr "Servername"
msgctxt "#30002" msgctxt "#30002"
msgid "Force HTTP playback" msgid "Force HTTP playback"
msgstr "HTTP Wiedergabe erzwingen" msgstr "HTTP-Wiedergabe erzwingen"
msgctxt "#30003" msgctxt "#30003"
msgid "Login method" msgid "Login method"
msgstr "Login Methode" msgstr "Login-Methode"
msgctxt "#30004" msgctxt "#30004"
msgid "Log level" msgid "Log level"
@ -531,8 +531,8 @@ msgctxt "#33088"
msgid "" msgid ""
"Database reset has completed, Kodi will now restart to apply the changes." "Database reset has completed, Kodi will now restart to apply the changes."
msgstr "" msgstr ""
"Die Datenbank wurde erfolgreich zurückgesetzt. Kodi startet nun neu, um die " "Die Datenbank wurde zurückgesetzt. Kodi startet nun neu, um die Änderungen "
"Änderungen anzuwenden" "anzuwenden."
msgctxt "#33089" msgctxt "#33089"
msgid "Enter folder name for backup" msgid "Enter folder name for backup"
@ -598,7 +598,7 @@ msgstr ""
msgctxt "#33104" msgctxt "#33104"
msgid "Find more info in the github wiki/Create-and-restore-from-backup." msgid "Find more info in the github wiki/Create-and-restore-from-backup."
msgstr "" msgstr ""
"Mehr Infos befinden sich im Github Wiki > Create-and-restore-from-backup" "Mehr Infos befinden sich im Github Wiki > Create-and-restore-from-backup."
msgctxt "#33105" msgctxt "#33105"
msgid "Enable the context menu" msgid "Enable the context menu"
@ -619,7 +619,7 @@ msgctxt "#33108"
msgid "Notifications are delayed during video playback (except live tv)." msgid "Notifications are delayed during video playback (except live tv)."
msgstr "" msgstr ""
"Benachrichtigungen während der Videowiedergabe zurückhalten (außer bei Live-" "Benachrichtigungen während der Videowiedergabe zurückhalten (außer bei Live-"
"TV)" "TV)."
msgctxt "#33109" msgctxt "#33109"
msgid "Plugin" msgid "Plugin"
@ -627,7 +627,7 @@ msgstr "Plugin"
msgctxt "#33110" msgctxt "#33110"
msgid "Restart Kodi to take effect." msgid "Restart Kodi to take effect."
msgstr "Kodi neustarten, um Änderungen anzuwenden" msgstr "Kodi neustarten, um Änderungen anzuwenden."
msgctxt "#33111" msgctxt "#33111"
msgid "Reset the local database to apply the playback mode change." msgid "Reset the local database to apply the playback mode change."
@ -832,7 +832,7 @@ msgstr ""
msgctxt "#33152" msgctxt "#33152"
msgid "Unable to locate TV Tunes in Kodi." msgid "Unable to locate TV Tunes in Kodi."
msgstr "TV Tunes Addon nicht gefunden" msgstr "TV Tunes Addon nicht gefunden."
msgctxt "#33153" msgctxt "#33153"
msgid "Your Jellyfin theme media has been synced to Kodi" msgid "Your Jellyfin theme media has been synced to Kodi"
@ -870,7 +870,9 @@ msgstr "Audio/Untertitel Auswahl aktivieren"
msgctxt "#33160" msgctxt "#33160"
msgid "To avoid errors, please update Jellyfin for Kodi to version: " msgid "To avoid errors, please update Jellyfin for Kodi to version: "
msgstr "Um Fehler zu vermeiden update bitte 'Jellyfin for Kodi' zur Version:" msgstr ""
"Um Fehler zu vermeiden, bitte 'Jellyfin for Kodi' auf folgende Version "
"updaten:"
msgctxt "#33162" msgctxt "#33162"
msgid "Reset the music library?" msgid "Reset the music library?"
@ -917,9 +919,9 @@ msgid ""
"launching the Jellyfin add-on > update libraries. Proceed anyway?" "launching the Jellyfin add-on > update libraries. Proceed anyway?"
msgstr "" msgstr ""
"Es stehen {number} Updates an. Es kann eine Weile dauern ehe neue Inhalte " "Es stehen {number} Updates an. Es kann eine Weile dauern ehe neue Inhalte "
"angezeigt werden. Es könnte schneller gehen die Datenbank über 'Jellyfin Addon >" "angezeigt werden. Es könnte schneller gehen, die Datenbank über 'Jellyfin "
" Datenbank aktualisieren' auf den neuesten Stand zu bringen. Trotzdem " "Addon > Datenbank aktualisieren' auf den neuesten Stand zu bringen. Trotzdem "
"fortfahren? " "fortfahren?"
msgctxt "#33173" msgctxt "#33173"
msgid "Forget about the previous sync? This is not recommended." msgid "Forget about the previous sync? This is not recommended."
@ -1000,7 +1002,7 @@ msgstr ""
msgctxt "#33190" msgctxt "#33190"
msgid "Enable Kodi database discovery" msgid "Enable Kodi database discovery"
msgstr "'Kodi Database discovery' aktivieren?" msgstr "'Kodi Datenbankerkennung' aktivieren?"
msgctxt "#33191" msgctxt "#33191"
msgid "Restart Jellyfin for Kodi to apply this change?" msgid "Restart Jellyfin for Kodi to apply this change?"

File diff suppressed because it is too large Load diff

View file

@ -9,14 +9,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jellyfin for Kodi\n" "Project-Id-Version: Jellyfin for Kodi\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2018-09-07 20:10+0000\n" "PO-Revision-Date: 2019-11-27 18:15+0000\n"
"Last-Translator: Jean Fontaine <balayop@yahoo.fr>, 2018\n" "Last-Translator: Thomas Schwery <thomas@inf3.ch>\n"
"Language-Team: French (https://www.transifex.com/emby-for-kodi/teams/91090/fr/)\n" "Language-Team: French <https://translate.jellyfin.org/projects/jellyfin/"
"jellyfin-kodi/fr/>\n"
"Language: fr_fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: fr\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Weblate 3.8\n"
msgctxt "#29999" msgctxt "#29999"
msgid "Jellyfin for Kodi" msgid "Jellyfin for Kodi"
@ -433,7 +435,7 @@ msgstr "Rassemblage des sagas"
msgctxt "#33021" msgctxt "#33021"
msgid "Gathering:" msgid "Gathering:"
msgstr "Rassemblage:" msgstr "Rassemblage :"
msgctxt "#33025" msgctxt "#33025"
msgid "Completed in:" msgid "Completed in:"
@ -961,19 +963,19 @@ msgstr "Forcer le transcodage"
msgctxt "#33180" msgctxt "#33180"
msgid "Restart Jellyfin for Kodi" msgid "Restart Jellyfin for Kodi"
msgstr "" msgstr "Redémarrer Jellyfin pour Kodi"
msgctxt "#33181" msgctxt "#33181"
msgid "Restarting to apply the patch" msgid "Restarting to apply the patch"
msgstr "" msgstr "Redémarrer pour appliquer le patch"
msgctxt "#33182" msgctxt "#33182"
msgid "Play with cinema mode" msgid "Play with cinema mode"
msgstr "" msgstr "Jouer en mode cinéma"
msgctxt "#33183" msgctxt "#33183"
msgid "Enable the option to play with cinema mode" msgid "Enable the option to play with cinema mode"
msgstr "" msgstr "Activer cette option pour utiliser le mode cinéma"
msgctxt "#33184" msgctxt "#33184"
msgid "Remove libraries" msgid "Remove libraries"
@ -982,6 +984,8 @@ msgstr ""
msgctxt "#33185" msgctxt "#33185"
msgid "Enable sync during playback (may cause some lag)" msgid "Enable sync during playback (may cause some lag)"
msgstr "" msgstr ""
"Activer la synchronisation durant la lecture (cela peut causer des "
"ralentissements)"
msgctxt "#33186" msgctxt "#33186"
msgid "" msgid ""
@ -992,11 +996,12 @@ msgstr ""
msgctxt "#33191" msgctxt "#33191"
msgid "Restart Jellyfin for Kodi to apply this change?" msgid "Restart Jellyfin for Kodi to apply this change?"
msgstr "" msgstr ""
"Voulez-vous redémarrer Jellyfin pour Kodi pour appliquer ce changement ?"
msgctxt "#33192" msgctxt "#33192"
msgid "Restart Jellyfin for Kodi" msgid "Restart Jellyfin for Kodi"
msgstr "" msgstr "Redémarrer Jellyfin pour Kodi"
msgctxt "#33193" msgctxt "#33193"
msgid "Restarting..." msgid "Restarting..."
msgstr "" msgstr "Redémarrage..."

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jellyfin for Kodi\n" "Project-Id-Version: Jellyfin for Kodi\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-09-25 02:13+0000\n" "PO-Revision-Date: 2019-12-07 17:15+0000\n"
"Last-Translator: Mário Victor Ribeiro Silva <mariovictorrs@gmail.com>\n" "Last-Translator: tanto faz <xipeb30977@topmail2.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.jellyfin.org/projects/" "Language-Team: Portuguese (Brazil) <https://translate.jellyfin.org/projects/"
"jellyfin/jellyfin-kodi/pt_BR/>\n" "jellyfin/jellyfin-kodi/pt_BR/>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
@ -120,7 +120,7 @@ msgstr "Episódios Favoritos"
#, fuzzy #, fuzzy
msgctxt "#30185" msgctxt "#30185"
msgid "Boxsets" msgid "Boxsets"
msgstr "Boxsets" msgstr "Coleções"
msgctxt "#30189" msgctxt "#30189"
msgid "Unwatched Movies" msgid "Unwatched Movies"
@ -146,17 +146,19 @@ msgctxt "#30249"
msgid "Enable welcome message" msgid "Enable welcome message"
msgstr "Ativar mensagem de Boas Vindas" msgstr "Ativar mensagem de Boas Vindas"
#, fuzzy
msgctxt "#30251" msgctxt "#30251"
msgid "Recently added Home Videos" msgid "Recently added Home Videos"
msgstr "" msgstr "Vídeos caseiros adicionados recentemente"
msgctxt "#30252" msgctxt "#30252"
msgid "Recently added Photos" msgid "Recently added Photos"
msgstr "Fotos adicionadas recentemente" msgstr "Fotos adicionadas recentemente"
#, fuzzy
msgctxt "#30253" msgctxt "#30253"
msgid "Favourite Home Videos" msgid "Favourite Home Videos"
msgstr "" msgstr "Vídeos caseiros favoritos"
msgctxt "#30254" msgctxt "#30254"
msgid "Favourite Photos" msgid "Favourite Photos"
@ -166,17 +168,20 @@ msgctxt "#30255"
msgid "Favourite Albums" msgid "Favourite Albums"
msgstr "Albuns Favoritos" msgstr "Albuns Favoritos"
#, fuzzy
msgctxt "#30256" msgctxt "#30256"
msgid "Recently added Music videos" msgid "Recently added Music videos"
msgstr "" msgstr "Clipes adicionados recentemente"
#, fuzzy
msgctxt "#30257" msgctxt "#30257"
msgid "In progress Music videos" msgid "In progress Music videos"
msgstr "" msgstr "Clipes em reprodução"
#, fuzzy
msgctxt "#30258" msgctxt "#30258"
msgid "Unwatched Music videos" msgid "Unwatched Music videos"
msgstr "" msgstr "Clipes não assistidos"
msgctxt "#30302" msgctxt "#30302"
msgid "Movies" msgid "Movies"
@ -240,7 +245,7 @@ msgstr "Ativar biblioteca de música"
msgctxt "#30511" msgctxt "#30511"
msgid "Playback mode" msgid "Playback mode"
msgstr "Modo de Reprodução" msgstr "Modo de reprodução"
msgctxt "#30512" msgctxt "#30512"
msgid "Enable artwork caching" msgid "Enable artwork caching"
@ -264,7 +269,7 @@ msgstr "Ativar modo de cinema"
msgctxt "#30519" msgctxt "#30519"
msgid "Ask to play trailers" msgid "Ask to play trailers"
msgstr "Peguntar para reproduzir trailers" msgstr "Perguntar ao reproduzir trailers"
msgctxt "#30520" msgctxt "#30520"
msgid "Skip the delete confirmation (use at your own risk)" msgid "Skip the delete confirmation (use at your own risk)"
@ -278,9 +283,10 @@ msgctxt "#30522"
msgid "Transcode H265/HEVC" msgid "Transcode H265/HEVC"
msgstr "Transcodificar H265/HEVC" msgstr "Transcodificar H265/HEVC"
#, fuzzy
msgctxt "#30527" msgctxt "#30527"
msgid "Ignore specials in next episodes" msgid "Ignore specials in next episodes"
msgstr "" msgstr "Ignorar especiais nos próximos episódios"
msgctxt "#30528" msgctxt "#30528"
msgid "Permanent users" msgid "Permanent users"
@ -299,13 +305,15 @@ msgctxt "#30531"
msgid "Enable new content" msgid "Enable new content"
msgstr "Ativar novo conteúdo" msgstr "Ativar novo conteúdo"
#, fuzzy
msgctxt "#30532" msgctxt "#30532"
msgid "Duration of the video library pop up" msgid "Duration of the video library pop up"
msgstr "" msgstr "Pop up da duração da biblioteca de vídeos"
#, fuzzy
msgctxt "#30533" msgctxt "#30533"
msgid "Duration of the music library pop up" msgid "Duration of the music library pop up"
msgstr "" msgstr "Pop up da duração da biblioteca de músicas"
msgctxt "#30534" msgctxt "#30534"
msgid "Notifications (in seconds)" msgid "Notifications (in seconds)"
@ -315,153 +323,167 @@ msgctxt "#30535"
msgid "Generate a new device Id" msgid "Generate a new device Id"
msgstr "Gerar novo ID de dispositivo" msgstr "Gerar novo ID de dispositivo"
#, fuzzy
msgctxt "#30536" msgctxt "#30536"
msgid "Allow the screensaver during syncs" msgid "Allow the screensaver during syncs"
msgstr "" msgstr "Permitir protetor de tela durante a sincronização"
#, fuzzy
msgctxt "#30537" msgctxt "#30537"
msgid "Transcode Hi10P" msgid "Transcode Hi10P"
msgstr "" msgstr "Transcode Hi10P"
msgctxt "#30539" msgctxt "#30539"
msgid "Login" msgid "Login"
msgstr "" msgstr "Login"
msgctxt "#30540" msgctxt "#30540"
msgid "Manual login" msgid "Manual login"
msgstr "" msgstr "Login manual"
msgctxt "#30543" msgctxt "#30543"
msgid "Username or email" msgid "Username or email"
msgstr "" msgstr "Usuário ou email"
msgctxt "#30545" msgctxt "#30545"
msgid "Enable server offline" msgid "Enable server offline"
msgstr "" msgstr "Ativar servidor offline"
msgctxt "#30547" msgctxt "#30547"
msgid "Display message" msgid "Display message"
msgstr "" msgstr "Mostrar mensagem"
msgctxt "#30602" msgctxt "#30602"
msgid "Password" msgid "Password"
msgstr "" msgstr "Senha"
msgctxt "#30605" msgctxt "#30605"
msgid "Sign in" msgid "Sign in"
msgstr "" msgstr "Conectar"
msgctxt "#30606" msgctxt "#30606"
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Cancelar"
msgctxt "#30607" msgctxt "#30607"
msgid "Select main server" msgid "Select main server"
msgstr "" msgstr "Selecionar servidor principal"
msgctxt "#30608" msgctxt "#30608"
msgid "Username or password cannot be empty" msgid "Username or password cannot be empty"
msgstr "" msgstr "Usuário ou senha não podem estar vazios"
#, fuzzy
msgctxt "#30609" msgctxt "#30609"
msgid "Unable to connect to the selected server" msgid "Unable to connect to the selected server"
msgstr "" msgstr "Impossível conectar ao servidor selecionado"
msgctxt "#30610" msgctxt "#30610"
msgid "Connect to" msgid "Connect to"
msgstr "" msgstr "Conectar a"
msgctxt "#30611" msgctxt "#30611"
msgid "Manually add server" msgid "Manually add server"
msgstr "" msgstr "Adicionar servidor manualmente"
msgctxt "#30612" msgctxt "#30612"
msgid "Please sign in" msgid "Please sign in"
msgstr "" msgstr "Por favor, conecte-se"
#, fuzzy
msgctxt "#30613" msgctxt "#30613"
msgid "Change Jellyfin Connect user" msgid "Change Jellyfin Connect user"
msgstr "" msgstr "Mudar usuário do Jellyfin Connect"
msgctxt "#30614" msgctxt "#30614"
msgid "Connect to server" msgid "Connect to server"
msgstr "" msgstr "Conectar ao servidor"
#, fuzzy
msgctxt "#30615" msgctxt "#30615"
msgid "Host" msgid "Host"
msgstr "" msgstr "Servidor"
msgctxt "#30616" msgctxt "#30616"
msgid "Connect" msgid "Connect"
msgstr "" msgstr "Conectar"
msgctxt "#30617" msgctxt "#30617"
msgid "Server or port cannot be empty" msgid "Server or port cannot be empty"
msgstr "" msgstr "Servidor ou porta não podem estar vazios"
msgctxt "#33000" msgctxt "#33000"
msgid "Welcome" msgid "Welcome"
msgstr "" msgstr "Bem-vindo"
msgctxt "#33006" msgctxt "#33006"
msgid "Server is restarting" msgid "Server is restarting"
msgstr "" msgstr "O servidor está reiniciando"
msgctxt "#33009" msgctxt "#33009"
msgid "Invalid username or password" msgid "Invalid username or password"
msgstr "" msgstr "Usuário ou senha inválido"
msgctxt "#33013" msgctxt "#33013"
msgid "Choose the audio stream" msgid "Choose the audio stream"
msgstr "" msgstr "Selecionar o stream de áudio"
msgctxt "#33014" msgctxt "#33014"
msgid "Choose the subtitles stream" msgid "Choose the subtitles stream"
msgstr "" msgstr "Selecionar o stream de legendas"
msgctxt "#33015" msgctxt "#33015"
msgid "Delete file from Jellyfin?" msgid "Delete file from Jellyfin?"
msgstr "" msgstr "Apagar arquivo do Jellyfin?"
msgctxt "#33016" msgctxt "#33016"
msgid "Play trailers?" msgid "Play trailers?"
msgstr "" msgstr "Reproduzir trailers?"
#, fuzzy
msgctxt "#33018" msgctxt "#33018"
msgid "Gathering boxsets" msgid "Gathering boxsets"
msgstr "" msgstr "Encontrando coleções"
#, fuzzy
msgctxt "#33021" msgctxt "#33021"
msgid "Gathering:" msgid "Gathering:"
msgstr "" msgstr "Encontrando:"
msgctxt "#33025" msgctxt "#33025"
msgid "Completed in:" msgid "Completed in:"
msgstr "" msgstr "Completado em:"
msgctxt "#33033" msgctxt "#33033"
msgid "A new device Id has been generated. Kodi will now restart." msgid "A new device Id has been generated. Kodi will now restart."
msgstr "" msgstr "Uma nova ID de dispositivo foi gerada. Kodi agora reiniciará."
#, fuzzy
msgctxt "#33035" msgctxt "#33035"
msgid "Caution! If you choose Native mode, certain Jellyfin features will be missing, such as: Jellyfin cinema mode, direct stream/transcode options and parental access schedule." msgid "Caution! If you choose Native mode, certain Jellyfin features will be missing, such as: Jellyfin cinema mode, direct stream/transcode options and parental access schedule."
msgstr "" msgstr ""
"Atenção! Se você selecionar o modo Nativo, certos recursos do Jellyfin serão "
"perdidos como: o modo cinema do Jellyfin, opções de stream direto/transcode "
"e agendamento de acesso parental."
#, fuzzy
msgctxt "#33036" msgctxt "#33036"
msgid "Add-on (default)" msgid "Add-on (default)"
msgstr "" msgstr "Add-on (padrão)"
#, fuzzy
msgctxt "#33037" msgctxt "#33037"
msgid "Native (direct paths)" msgid "Native (direct paths)"
msgstr "" msgstr "Nativo (caminhos diretos)"
#, fuzzy
msgctxt "#33039" msgctxt "#33039"
msgid "Enable music library?" msgid "Enable music library?"
msgstr "" msgstr "Ativar biblioteca de músicas?"
msgctxt "#33047" msgctxt "#33047"
msgid "Kodi can't locate file:" msgid "Kodi can't locate file:"
msgstr "" msgstr "Kodi não conseguiu localizar o arquivo:"
msgctxt "#33048" msgctxt "#33048"
msgid "You may need to verify your network credentials in the add-on settings or use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard > library). Stop syncing?" msgid "You may need to verify your network credentials in the add-on settings or use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard > library). Stop syncing?"
@ -469,39 +491,42 @@ msgstr ""
msgctxt "#33049" msgctxt "#33049"
msgid "New" msgid "New"
msgstr "" msgstr "Novo"
msgctxt "#33054" msgctxt "#33054"
msgid "Add user to session" msgid "Add user to session"
msgstr "" msgstr "Adicionar usuário a sessão"
#, fuzzy
msgctxt "#33058" msgctxt "#33058"
msgid "Perform local database reset" msgid "Perform local database reset"
msgstr "" msgstr "Redefinir o banco de dados local"
#, fuzzy
msgctxt "#33060" msgctxt "#33060"
msgid "Sync theme media" msgid "Sync theme media"
msgstr "" msgstr "Sincronizar mídias do tema"
msgctxt "#33061" msgctxt "#33061"
msgid "Add/Remove user from the session" msgid "Add/Remove user from the session"
msgstr "" msgstr "Adicionar/remover usuário da sessão"
msgctxt "#33062" msgctxt "#33062"
msgid "Add user" msgid "Add user"
msgstr "" msgstr "Adicionar usuário"
msgctxt "#33063" msgctxt "#33063"
msgid "Remove user" msgid "Remove user"
msgstr "" msgstr "Remover usuário"
msgctxt "#33064" msgctxt "#33064"
msgid "Remove user from the session" msgid "Remove user from the session"
msgstr "" msgstr "Remover usuário da sessão"
#, fuzzy
msgctxt "#33074" msgctxt "#33074"
msgid "Are you sure you want to reset your local Kodi database?" msgid "Are you sure you want to reset your local Kodi database?"
msgstr "" msgstr "Deseja mesmo redefinir seu banco de dados local do Kodi?"
msgctxt "#33086" msgctxt "#33086"
msgid "Remove all cached artwork?" msgid "Remove all cached artwork?"
@ -541,7 +566,7 @@ msgstr ""
msgctxt "#33098" msgctxt "#33098"
msgid "Refresh boxsets" msgid "Refresh boxsets"
msgstr "" msgstr "Atualizar coleções"
msgctxt "#33099" msgctxt "#33099"
msgid "Install the server plugin Kodi companion to automatically apply Jellyfin library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion." msgid "Install the server plugin Kodi companion to automatically apply Jellyfin library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion."
@ -662,7 +687,7 @@ msgstr "Selecione uma fonte"
msgctxt "#33131" msgctxt "#33131"
msgid "Refreshing boxsets" msgid "Refreshing boxsets"
msgstr "" msgstr "Atualizando coleções"
msgctxt "#33132" msgctxt "#33132"
msgid "Repair library" msgid "Repair library"

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Jellyfin for Kodi\n" "Project-Id-Version: Jellyfin for Kodi\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-10-25 11:14+0000\n" "PO-Revision-Date: 2019-12-06 09:15+0000\n"
"Last-Translator: nextlooper42 <nextlooper42@protonmail.com>\n" "Last-Translator: Pavel Sochor <pavel.sochor@outlook.com>\n"
"Language-Team: Slovak <https://translate.jellyfin.org/projects/jellyfin/" "Language-Team: Slovak <https://translate.jellyfin.org/projects/jellyfin/"
"jellyfin-kodi/sk/>\n" "jellyfin-kodi/sk/>\n"
"Language: sk\n" "Language: sk\n"
@ -83,7 +83,7 @@ msgstr "Nedávno pridané seriály"
msgctxt "#30171" msgctxt "#30171"
msgid "In Progress TV Shows" msgid "In Progress TV Shows"
msgstr "" msgstr "Rozosledované seriály"
msgctxt "#30174" msgctxt "#30174"
msgid "Recently Added Movies" msgid "Recently Added Movies"
@ -95,15 +95,15 @@ msgstr "Nedávno pridané epizódy"
msgctxt "#30177" msgctxt "#30177"
msgid "In Progress Movies" msgid "In Progress Movies"
msgstr "" msgstr "Rozosledované filmy"
msgctxt "#30178" msgctxt "#30178"
msgid "In Progress Episodes" msgid "In Progress Episodes"
msgstr "" msgstr "Rozosledované epizódy"
msgctxt "#30179" msgctxt "#30179"
msgid "Next Episodes" msgid "Next Episodes"
msgstr "" msgstr "Ďaľšie epizódy"
msgctxt "#30180" msgctxt "#30180"
msgid "Favorite Movies" msgid "Favorite Movies"
@ -123,7 +123,7 @@ msgstr "Boxsety"
msgctxt "#30189" msgctxt "#30189"
msgid "Unwatched Movies" msgid "Unwatched Movies"
msgstr "" msgstr "Nepozreté Filmy"
msgctxt "#30229" msgctxt "#30229"
msgid "Random Items" msgid "Random Items"
@ -171,11 +171,11 @@ msgstr "Nedávno pridané hudobné videá"
msgctxt "#30257" msgctxt "#30257"
msgid "In progress Music videos" msgid "In progress Music videos"
msgstr "" msgstr "Rozosledované Hudobné Videá"
msgctxt "#30258" msgctxt "#30258"
msgid "Unwatched Music videos" msgid "Unwatched Music videos"
msgstr "" msgstr "Nepozreté Hudobné Videá"
msgctxt "#30302" msgctxt "#30302"
msgid "Movies" msgid "Movies"
@ -231,7 +231,7 @@ msgstr "Synchronizácia"
msgctxt "#30507" msgctxt "#30507"
msgid "Enable notification if update count is greater than" msgid "Enable notification if update count is greater than"
msgstr "" msgstr "Povoliť notifikáciu ak je počet aktualizácií väčší než"
msgctxt "#30509" msgctxt "#30509"
msgid "Enable music library" msgid "Enable music library"
@ -247,7 +247,7 @@ msgstr "Povoliť cachovanie artworkov"
msgctxt "#30515" msgctxt "#30515"
msgid "Paging - max items requested (default: 15)" msgid "Paging - max items requested (default: 15)"
msgstr "" msgstr "Stránkovanie - maximálny počet vyžiadaných položiek (defaultne: 15)"
msgctxt "#30516" msgctxt "#30516"
msgid "Playback" msgid "Playback"
@ -255,7 +255,7 @@ msgstr "Prehrávanie"
msgctxt "#30517" msgctxt "#30517"
msgid "Network credentials" msgid "Network credentials"
msgstr "" msgstr "Prístupové údaje k sieti"
msgctxt "#30518" msgctxt "#30518"
msgid "Enable cinema mode" msgid "Enable cinema mode"
@ -263,15 +263,15 @@ msgstr "Povoliť kino režim"
msgctxt "#30519" msgctxt "#30519"
msgid "Ask to play trailers" msgid "Ask to play trailers"
msgstr "" msgstr "Opýtať sa na prehratie traileru"
msgctxt "#30520" msgctxt "#30520"
msgid "Skip the delete confirmation (use at your own risk)" msgid "Skip the delete confirmation (use at your own risk)"
msgstr "" msgstr "Preskočiť potvrdenie zmazania (použitie na vlastné riziko)"
msgctxt "#30521" msgctxt "#30521"
msgid "Jump back on resume (in seconds)" msgid "Jump back on resume (in seconds)"
msgstr "" msgstr "Skočiť späť na pokračovanie (v sekundách)"
msgctxt "#30522" msgctxt "#30522"
msgid "Transcode H265/HEVC" msgid "Transcode H265/HEVC"
@ -279,11 +279,11 @@ msgstr "Transkódovať H265/HEVC"
msgctxt "#30527" msgctxt "#30527"
msgid "Ignore specials in next episodes" msgid "Ignore specials in next episodes"
msgstr "" msgstr "Preskočiť špeciality v ďaľších epizódach"
msgctxt "#30528" msgctxt "#30528"
msgid "Permanent users" msgid "Permanent users"
msgstr "" msgstr "Permanentný používatelia"
msgctxt "#30529" msgctxt "#30529"
msgid "Startup delay (in seconds)" msgid "Startup delay (in seconds)"
@ -299,11 +299,11 @@ msgstr "Povoliť nový obsah"
msgctxt "#30532" msgctxt "#30532"
msgid "Duration of the video library pop up" msgid "Duration of the video library pop up"
msgstr "" msgstr "Dĺžka zobrazenia pop upu knižnice videa"
msgctxt "#30533" msgctxt "#30533"
msgid "Duration of the music library pop up" msgid "Duration of the music library pop up"
msgstr "" msgstr "Dĺžka zobrazenia pop upu knižnice hudby"
msgctxt "#30534" msgctxt "#30534"
msgid "Notifications (in seconds)" msgid "Notifications (in seconds)"
@ -363,7 +363,7 @@ msgstr "Používateľské meno alebo heslo nemôže byť prázdne"
msgctxt "#30609" msgctxt "#30609"
msgid "Unable to connect to the selected server" msgid "Unable to connect to the selected server"
msgstr "" msgstr "Nemožné pripojenie na vybraný server"
msgctxt "#30610" msgctxt "#30610"
msgid "Connect to" msgid "Connect to"
@ -387,7 +387,7 @@ msgstr "Pripojiť k serveru"
msgctxt "#30615" msgctxt "#30615"
msgid "Host" msgid "Host"
msgstr "" msgstr "Server(Host)"
msgctxt "#30616" msgctxt "#30616"
msgid "Connect" msgid "Connect"
@ -411,11 +411,11 @@ msgstr "Neplatné používateľské meno alebo heslo"
msgctxt "#33013" msgctxt "#33013"
msgid "Choose the audio stream" msgid "Choose the audio stream"
msgstr "" msgstr "Vyber zvukový stream"
msgctxt "#33014" msgctxt "#33014"
msgid "Choose the subtitles stream" msgid "Choose the subtitles stream"
msgstr "" msgstr "Vyber stream tituliek"
msgctxt "#33015" msgctxt "#33015"
msgid "Delete file from Jellyfin?" msgid "Delete file from Jellyfin?"
@ -423,19 +423,20 @@ msgstr "Vymazať súbor z Jellyfinu?"
msgctxt "#33016" msgctxt "#33016"
msgid "Play trailers?" msgid "Play trailers?"
msgstr "" msgstr "Prehrávať trailery?"
#, fuzzy
msgctxt "#33018" msgctxt "#33018"
msgid "Gathering boxsets" msgid "Gathering boxsets"
msgstr "" msgstr "Zhromažďovacie skrinky"
msgctxt "#33021" msgctxt "#33021"
msgid "Gathering:" msgid "Gathering:"
msgstr "" msgstr "Zhromažďovanie:"
msgctxt "#33025" msgctxt "#33025"
msgid "Completed in:" msgid "Completed in:"
msgstr "" msgstr "Dokončené v:"
msgctxt "#33033" msgctxt "#33033"
msgid "A new device Id has been generated. Kodi will now restart." msgid "A new device Id has been generated. Kodi will now restart."
@ -444,6 +445,9 @@ msgstr "Nové ID zariadenia bolo vygenerované. Kodi sa teraz sám reštartuje."
msgctxt "#33035" msgctxt "#33035"
msgid "Caution! If you choose Native mode, certain Jellyfin features will be missing, such as: Jellyfin cinema mode, direct stream/transcode options and parental access schedule." msgid "Caution! If you choose Native mode, certain Jellyfin features will be missing, such as: Jellyfin cinema mode, direct stream/transcode options and parental access schedule."
msgstr "" msgstr ""
"Pozor! Ak vyberiete natívny režim, niektoré funkcie Jellyfinu budú chýbať, "
"ako napríklad: Režim kina Jellyfin, možnosti priameho streamu / prekódovania "
"a plán rodičovského prístupu."
msgctxt "#33036" msgctxt "#33036"
msgid "Add-on (default)" msgid "Add-on (default)"
@ -464,6 +468,9 @@ msgstr "Kodi nemôže nájsť súbor:"
msgctxt "#33048" msgctxt "#33048"
msgid "You may need to verify your network credentials in the add-on settings or use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard > library). Stop syncing?" msgid "You may need to verify your network credentials in the add-on settings or use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard > library). Stop syncing?"
msgstr "" msgstr ""
"Možno budete musieť overiť svoje sieťové poverenia v nastaveniach doplnku "
"alebo použiť náhradu cesty pre Jellyfin, aby ste cestu naformátovali správne "
"(informačný panel Jellyfin> knižnica). Zastaviť synchronizáciu?"
msgctxt "#33049" msgctxt "#33049"
msgid "New" msgid "New"
@ -471,7 +478,7 @@ msgstr "Nový"
msgctxt "#33054" msgctxt "#33054"
msgid "Add user to session" msgid "Add user to session"
msgstr "" msgstr "Pridať používateľa do relácie"
msgctxt "#33058" msgctxt "#33058"
msgid "Perform local database reset" msgid "Perform local database reset"
@ -479,11 +486,11 @@ msgstr "Vykonať lokálny reštart databázy"
msgctxt "#33060" msgctxt "#33060"
msgid "Sync theme media" msgid "Sync theme media"
msgstr "" msgstr "Synchronizovať médiá témy"
msgctxt "#33061" msgctxt "#33061"
msgid "Add/Remove user from the session" msgid "Add/Remove user from the session"
msgstr "" msgstr "Pridať/Odstrániť používateľa z relácie"
msgctxt "#33062" msgctxt "#33062"
msgid "Add user" msgid "Add user"
@ -495,7 +502,7 @@ msgstr "Odstrániť používateľa"
msgctxt "#33064" msgctxt "#33064"
msgid "Remove user from the session" msgid "Remove user from the session"
msgstr "" msgstr "Odstrániť používateľa z relácie"
msgctxt "#33074" msgctxt "#33074"
msgid "Are you sure you want to reset your local Kodi database?" msgid "Are you sure you want to reset your local Kodi database?"
@ -503,7 +510,7 @@ msgstr "Si si istý, že chceš resetovať svoju lokálnu Kodi databázu?"
msgctxt "#33086" msgctxt "#33086"
msgid "Remove all cached artwork?" msgid "Remove all cached artwork?"
msgstr "" msgstr "Odstrániť všetky obrázky z medzipamäti?"
msgctxt "#33087" msgctxt "#33087"
msgid "Reset all Jellyfin add-on settings?" msgid "Reset all Jellyfin add-on settings?"
@ -512,10 +519,12 @@ msgstr "Resetovať všetky nastavenia Jellyfin doplnku?"
msgctxt "#33088" msgctxt "#33088"
msgid "Database reset has completed, Kodi will now restart to apply the changes." msgid "Database reset has completed, Kodi will now restart to apply the changes."
msgstr "" msgstr ""
"Obnovenie databázy je dokončené, Kodi sa teraz reštartuje, aby sa zmeny "
"prejavili."
msgctxt "#33089" msgctxt "#33089"
msgid "Enter folder name for backup" msgid "Enter folder name for backup"
msgstr "" msgstr "Zadaj názov priečinka na zálohovanie"
msgctxt "#33090" msgctxt "#33090"
msgid "Replace existing backup?" msgid "Replace existing backup?"
@ -544,37 +553,49 @@ msgctxt "#33098"
msgid "Refresh boxsets" msgid "Refresh boxsets"
msgstr "Obnoviť boxsety" msgstr "Obnoviť boxsety"
#, fuzzy
msgctxt "#33099" msgctxt "#33099"
msgid "Install the server plugin Kodi companion to automatically apply Jellyfin library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion." msgid "Install the server plugin Kodi companion to automatically apply Jellyfin library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion."
msgstr "" msgstr ""
"Nainštalujte doplnok servera Kodi, na automatické použitie aktualizácie "
"Jellyfinovej knižnice pri štarte. Toto nastavenie nájdete v nastaveniach "
"doplnku> možnosti synchronizácie> Enable Kodi Companion."
msgctxt "#33101" msgctxt "#33101"
msgid "Since you are using native playback mode with music enabled, do you want to import music rating from files?" msgid "Since you are using native playback mode with music enabled, do you want to import music rating from files?"
msgstr "" msgstr ""
"Keďže používate režim natívneho prehrávania s povolenou hudbou, chcete "
"importovať hodnotenie hudby zo súborov?"
msgctxt "#33102" msgctxt "#33102"
msgid "Resume the previous sync?" msgid "Resume the previous sync?"
msgstr "" msgstr "Pokračovať v predchádzajúcej synchronizácii?"
msgctxt "#33103" msgctxt "#33103"
msgid "Enable the webserver service in the Kodi settings to allow artwork caching." msgid "Enable the webserver service in the Kodi settings to allow artwork caching."
msgstr "" msgstr ""
"Povoľte službu webového servera v nastaveniach Kodi, aby ste povolili "
"ukladanie obrázkov do vyrovnávacej pamäte."
msgctxt "#33104" msgctxt "#33104"
msgid "Find more info in the github wiki/Create-and-restore-from-backup." msgid "Find more info in the github wiki/Create-and-restore-from-backup."
msgstr "" msgstr ""
"Viac informácií nájdete na stránke github wiki / Create-and-restore-from-"
"backup."
msgctxt "#33105" msgctxt "#33105"
msgid "Enable the context menu" msgid "Enable the context menu"
msgstr "" msgstr "Povoliť kontextové menu"
msgctxt "#33106" msgctxt "#33106"
msgid "Enable the option to transcode" msgid "Enable the option to transcode"
msgstr "" msgstr "Povoliť možnosť transkódovať"
msgctxt "#33107" msgctxt "#33107"
msgid "Users added to the session (no space between users). (eg username,username2)" msgid "Users added to the session (no space between users). (eg username,username2)"
msgstr "" msgstr ""
"Používatelia pridaní do relácie (medzi používateľmi nie je medzera). (napr. "
"užívateľskémeno1,užívateľskémeno2)"
msgctxt "#33108" msgctxt "#33108"
msgid "Notifications are delayed during video playback (except live tv)." msgid "Notifications are delayed during video playback (except live tv)."