1
0
Fork 0

Merging upstream version 2.1.2~dev0+20231127.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-17 07:42:44 +01:00
parent e8cfe7bc1f
commit 11f26e4026
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
439 changed files with 3622 additions and 2691 deletions

View file

@ -84,12 +84,13 @@ jobs:
run: |
pyinstaller --clean delugewin.spec --distpath freeze
- name: Fix OpenSSL for libtorrent x64
if: ${{ matrix.arch == 'x64' }}
working-directory: packaging/win/freeze/Deluge
- name: Verify Deluge exes
working-directory: packaging/win/freeze/Deluge/
run: |
cp libssl-1_1.dll libssl-1_1-x64.dll
cp libcrypto-1_1.dll libcrypto-1_1-x64.dll
deluge-debug.exe -v
deluged-debug.exe -v
deluge-web-debug.exe -v
deluge-console -v
- name: Make Deluge Installer
working-directory: ./packaging/win

View file

@ -37,7 +37,7 @@ jobs:
- name: Install dependencies
run: |
pip install --upgrade pip wheel setuptools
pip install -r requirements.txt -r requirements-tests.txt
pip install -r requirements-ci.txt
pip install -e .
- name: Install security dependencies
@ -92,7 +92,7 @@ jobs:
- name: Install dependencies
run: |
pip install --upgrade pip wheel setuptools
pip install -r requirements.txt -r requirements-tests.txt
pip install -r requirements-ci.txt
pip install -e .
- name: Test with pytest

View file

@ -423,25 +423,31 @@ def translate_size_units():
def fsize(fsize_b, precision=1, shortform=False):
"""Formats the bytes value into a string with KiB, MiB or GiB units.
"""Formats the bytes value into a string with KiB, MiB, GiB or TiB units.
Args:
fsize_b (int): The filesize in bytes.
precision (int): The filesize float precision.
precision (int): The output float precision, 1 by default.
shortform (bool): The output short|long form, False (long form) by default.
Returns:
str: A formatted string in KiB, MiB or GiB units.
str: A formatted string in KiB, MiB, GiB or TiB units.
Examples:
>>> fsize(112245)
'109.6 KiB'
>>> fsize(112245, precision=0)
'110 KiB'
>>> fsize(112245, shortform=True)
'109.6 K'
Note:
This function has been refactored for performance with the
fsize units being translated outside the function.
Notice that short forms K|M|G|T are synonymous here with
KiB|MiB|GiB|TiB. They are powers of 1024, not 1000.
"""
if fsize_b >= 1024**4:
@ -477,7 +483,7 @@ def fpcnt(dec, precision=2):
Args:
dec (float): The ratio in the range [0.0, 1.0].
precision (int): The percentage float precision.
precision (int): The output float precision, 2 by default.
Returns:
str: A formatted string representing a percentage.
@ -501,6 +507,8 @@ def fspeed(bps, precision=1, shortform=False):
Args:
bps (int): The speed in bytes per second.
precision (int): The output float precision, 1 by default.
shortform (bool): The output short|long form, False (long form) by default.
Returns:
str: A formatted string representing transfer speed.
@ -509,6 +517,10 @@ def fspeed(bps, precision=1, shortform=False):
>>> fspeed(43134)
'42.1 KiB/s'
Note:
Notice that short forms K|M|G|T are synonymous here with
KiB|MiB|GiB|TiB. They are powers of 1024, not 1000.
"""
if bps < 1024**2:
@ -545,7 +557,7 @@ def fpeer(num_peers, total_peers):
total_peers (int): The total number of peers.
Returns:
str: A formatted string 'num_peers (total_peers)' or total_peers < 0, just 'num_peers'.
str: A formatted string 'num_peers (total_peers)' or if total_peers < 0, just 'num_peers'.
Examples:
>>> fpeer(10, 20)
@ -594,16 +606,16 @@ def ftime(secs):
time_str = f'{secs // 604800}w {secs // 86400 % 7}d'
else:
time_str = f'{secs // 31449600}y {secs // 604800 % 52}w'
return time_str
def fdate(seconds, date_only=False, precision_secs=False):
"""Formats a date time string in the locale's date representation based on the systems timezone.
"""Formats a date time string in the locale's date representation based on the system's timezone.
Args:
seconds (float): Time in seconds since the Epoch.
precision_secs (bool): Include seconds in time format.
date_only (bool): Whether to include only the date, False by default.
precision_secs (bool): Include seconds in time format, False by default.
Returns:
str: A string in the locale's datetime representation or "" if seconds < 0
@ -628,10 +640,14 @@ def tokenize(text):
Returns:
list: A list of strings and/or numbers.
This function is used to implement robust tokenization of user input
It automatically coerces integer and floating point numbers, ignores
whitespace and knows how to separate numbers from strings even without
whitespace.
Note:
This function is used to implement robust tokenization of user input
It automatically coerces integer and floating point numbers, ignores
whitespace and knows how to separate numbers from strings even without
whitespace.
Possible optimization: move the 2 regexes outside of function.
"""
tokenized_input = []
for token in re.split(r'(\d+(?:\.\d+)?)', text):
@ -652,12 +668,16 @@ def tokenize(text):
{'prefix': 'GiB', 'divider': 1024**3},
{'prefix': 'TiB', 'divider': 1024**4},
{'prefix': 'PiB', 'divider': 1024**5},
{'prefix': 'k', 'divider': 1000**1},
{'prefix': 'm', 'divider': 1000**2},
{'prefix': 'g', 'divider': 1000**3},
{'prefix': 't', 'divider': 1000**4},
{'prefix': 'p', 'divider': 1000**5},
{'prefix': 'KB', 'divider': 1000**1},
{'prefix': 'MB', 'divider': 1000**2},
{'prefix': 'GB', 'divider': 1000**3},
{'prefix': 'TB', 'divider': 1000**4},
{'prefix': 'PB', 'divider': 1000**5},
{'prefix': 'm', 'divider': 1000**2},
]
@ -841,7 +861,7 @@ def create_magnet_uri(infohash, name=None, trackers=None):
Args:
infohash (str): The info-hash of the torrent.
name (str, optional): The name of the torrent.
trackers (list or dict, optional): A list of trackers or dict or {tracker: tier} pairs.
trackers (list or dict, optional): A list of trackers or a dict or some {tracker: tier} pairs.
Returns:
str: A magnet URI string.

View file

@ -64,9 +64,9 @@ class Component:
paused by instructing the :class:`ComponentRegistry` to pause
this Component.
**pause()** - This method is called when the component is being paused.
**pause()** - This method is called when the component is being paused.
**resume()** - This method is called when the component resumes from a Paused
**resume()** - This method is called when the component resumes from a Paused
state.
**shutdown()** - This method is called when the client is exiting. If the
@ -85,7 +85,7 @@ class Component:
**Stopped** - The Component has either been stopped or has yet to be started.
**Stopping** - The Component has had it's stop method called, but it hasn't
**Stopping** - The Component has had its stop method called, but it hasn't
fully stopped yet.
**Paused** - The Component has had its update timer stopped, but will

View file

@ -12,7 +12,7 @@
import pytest_twisted
from twisted.internet import reactor
from twisted.internet.defer import Deferred, maybeDeferred
from twisted.internet.error import CannotListenError
from twisted.internet.error import CannotListenError, ProcessTerminated
from twisted.python.failure import Failure
import deluge.component as _component
@ -42,11 +42,13 @@ def mock_callback():
The returned Mock instance will have a `deferred` attribute which will complete when the callback has been called.
"""
def reset():
def reset(timeout=0.5, *args, **kwargs):
if mock.called:
original_reset_mock()
deferred = Deferred()
deferred.addTimeout(0.5, reactor)
original_reset_mock(*args, **kwargs)
if mock.deferred:
mock.deferred.cancel()
deferred = Deferred(canceller=lambda x: deferred.callback(None))
deferred.addTimeout(timeout, reactor)
mock.side_effect = lambda *args, **kw: deferred.callback((args, kw))
mock.deferred = deferred
@ -118,7 +120,10 @@ async def daemon(request, config_dir, tmp_path):
raise exception_error
daemon.listen_port = listen_port
yield daemon
await daemon.kill()
try:
await daemon.kill()
except ProcessTerminated:
pass
@pytest.fixture(autouse=True)

View file

@ -16,11 +16,11 @@
"""
import contextlib
import logging
import threading
from collections import defaultdict
from types import SimpleNamespace
from typing import Any, Callable
from twisted.internet import reactor
from twisted.internet import reactor, threads
import deluge.component as component
from deluge._libtorrent import lt
@ -34,7 +34,7 @@ class AlertManager(component.Component):
def __init__(self):
log.debug('AlertManager init...')
component.Component.__init__(self, 'AlertManager', interval=0.3)
component.Component.__init__(self, 'AlertManager')
self.session = component.get('Core').session
# Increase the alert queue size so that alerts don't get lost.
@ -56,18 +56,73 @@ def __init__(self):
# handlers is a dictionary of lists {"alert_type": [handler1,h2,..]}
self.handlers = defaultdict(list)
self.handlers_retry_timeout = 0.3
self.handlers_retry_count = 6
self.delayed_calls = []
self._event = threading.Event()
def update(self):
self.delayed_calls = [dc for dc in self.delayed_calls if dc.active()]
self.handle_alerts()
pass
def start(self):
thread = threading.Thread(
target=self.wait_for_alert_in_thread, name='alert-poller', daemon=True
)
thread.start()
self._event.set()
def stop(self):
self.cancel_delayed_calls()
def pause(self):
self._event.clear()
def resume(self):
self._event.set()
def wait_for_alert_in_thread(self):
while self._component_state not in ('Stopping', 'Stopped'):
if self.session.wait_for_alert(1000) is None:
continue
if self._event.wait():
threads.blockingCallFromThread(reactor, self.maybe_handle_alerts)
def cancel_delayed_calls(self):
"""Cancel all delayed handlers."""
for delayed_call in self.delayed_calls:
if delayed_call.active():
delayed_call.cancel()
self.delayed_calls = []
def check_delayed_calls(self, retries: int = 0) -> bool:
"""Returns True if any handler calls are delayed (upto retry limit)."""
self.delayed_calls = [dc for dc in self.delayed_calls if dc.active()]
if not self.delayed_calls:
return False
if retries > self.handlers_retry_count:
log.warning(
'Alert handlers timeout reached, cancelling: %s', self.delayed_calls
)
self.cancel_delayed_calls()
return False
return True
def maybe_handle_alerts(self, retries: int = 0) -> None:
if self._component_state != 'Started':
return
if self.check_delayed_calls(retries):
log.debug('Waiting for delayed alerts: %s', self.delayed_calls)
retries += 1
reactor.callLater(
self.handlers_retry_timeout, self.maybe_handle_alerts, retries
)
return
self.handle_alerts()
def register_handler(self, alert_type: str, handler: Callable[[Any], None]) -> None:
"""
Registers a function that will be called when 'alert_type' is pop'd
@ -128,21 +183,7 @@ def handle_alerts(self):
if log.isEnabledFor(logging.DEBUG):
log.debug('Handling alert: %s', alert_type)
alert_copy = self.create_alert_copy(alert)
self.delayed_calls.append(reactor.callLater(0, handler, alert_copy))
@staticmethod
def create_alert_copy(alert):
"""Create a Python copy of libtorrent alert
Avoid segfault if an alert is handled after next pop_alert call"""
return SimpleNamespace(
**{
attr: getattr(alert, attr)
for attr in dir(alert)
if not attr.startswith('__')
}
)
self.delayed_calls.append(reactor.callLater(0, handler, alert))
def set_alert_queue_size(self, queue_size):
"""Sets the maximum size of the libtorrent alert queue"""

View file

@ -12,17 +12,16 @@
import os
import shutil
import tempfile
import threading
from base64 import b64decode, b64encode
from typing import Any, Dict, List, Optional, Tuple, Union
from urllib.request import URLError, urlopen
from twisted.internet import defer, reactor, task
from twisted.internet import defer, reactor, task, threads
from twisted.web.client import Agent, readBody
import deluge.common
import deluge.component as component
from deluge import path_chooser_common
from deluge import metafile, path_chooser_common
from deluge._libtorrent import LT_VERSION, lt
from deluge.configmanager import ConfigManager, get_config_dir
from deluge.core.alertmanager import AlertManager
@ -992,30 +991,33 @@ def create_torrent(
path,
tracker,
piece_length,
comment,
target,
webseeds,
private,
created_by,
trackers,
add_to_session,
comment=None,
target=None,
webseeds=None,
private=False,
created_by=None,
trackers=None,
add_to_session=False,
torrent_format=metafile.TorrentFormat.V1,
):
if isinstance(torrent_format, str):
torrent_format = metafile.TorrentFormat(torrent_format)
log.debug('creating torrent..')
threading.Thread(
target=self._create_torrent_thread,
args=(
path,
tracker,
piece_length,
comment,
target,
webseeds,
private,
created_by,
trackers,
add_to_session,
),
).start()
return threads.deferToThread(
self._create_torrent_thread,
path,
tracker,
piece_length,
comment=comment,
target=target,
webseeds=webseeds,
private=private,
created_by=created_by,
trackers=trackers,
add_to_session=add_to_session,
torrent_format=torrent_format,
)
def _create_torrent_thread(
self,
@ -1029,27 +1031,41 @@ def _create_torrent_thread(
created_by,
trackers,
add_to_session,
torrent_format,
):
from deluge import metafile
metafile.make_meta_file(
filecontent = metafile.make_meta_file_content(
path,
tracker,
piece_length,
comment=comment,
target=target,
webseeds=webseeds,
private=private,
created_by=created_by,
trackers=trackers,
torrent_format=torrent_format,
)
write_file = False
if target or not add_to_session:
write_file = True
if not target:
target = metafile.default_meta_file_path(path)
filename = os.path.split(target)[-1]
if write_file:
with open(target, 'wb') as _file:
_file.write(filecontent)
filedump = b64encode(filecontent)
log.debug('torrent created!')
if add_to_session:
options = {}
options['download_location'] = os.path.split(path)[0]
with open(target, 'rb') as _file:
filedump = b64encode(_file.read())
self.add_torrent_file(os.path.split(target)[1], filedump, options)
self.add_torrent_file(filename, filedump, options)
return filename, filedump
@export
def upload_plugin(self, filename: str, filedump: Union[str, bytes]) -> None:

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-12-30 00:59+0000\n"
"PO-Revision-Date: 2022-12-21 00:21+0000\n"
"Last-Translator: Pere Orga <Unknown>\n"
"Language-Team: Catalan <ca@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -1210,7 +1210,7 @@ msgstr "Namíbia"
#: deluge/ui/countries.py:162
msgid "Nauru"
msgstr "Nauru"
msgstr "nauruà"
#: deluge/ui/countries.py:163
msgid "Nepal"
@ -1482,7 +1482,7 @@ msgstr "Togo"
#: deluge/ui/countries.py:230
msgid "Tokelau"
msgstr "Tokelau"
msgstr "tokelauès"
#: deluge/ui/countries.py:231
msgid "Tonga"
@ -1800,7 +1800,7 @@ msgstr ""
"Aquest programa és programari lliure (\"free software\" en anglès); podeu "
"redistribuir-lo i/o modificar-lo sota els termes de la llicència GNU Public "
"License tal com està publicada per la Free Software Foundation; ja sigui la "
"versió 3 de la llicència, o (a la vostra decisió) qualsevol altre versió "
"versió 3 de la llicència, o (a la vostra decisió) qualsevol altra versió "
"posterior.\n"
"Aquest programari es distribueix amb l'esperança de que serà útil, però "
"SENSE CAP GARANTIA; fins i tot sense la garantia implícita de "
@ -1841,7 +1841,7 @@ msgstr "Afegeix els torrents (%d)"
#: deluge/ui/gtk3/addtorrentdialog.py:238
msgid "Duplicate torrent(s)"
msgstr "Torrent(s) duplicat(s)."
msgstr "Torrent(s) duplicat(s)"
#: deluge/ui/gtk3/addtorrentdialog.py:240
#, python-format
@ -1870,11 +1870,11 @@ msgstr "Seleccioneu un fitxer .torrent"
#: deluge/ui/gtk3/addtorrentdialog.py:777
msgid "Invalid URL"
msgstr "URL invàlida"
msgstr "L'URL no és vàlid"
#: deluge/ui/gtk3/addtorrentdialog.py:778
msgid "is not a valid URL."
msgstr "no és una URL vàlida."
msgstr "no és un URL vàlid."
#: deluge/ui/gtk3/addtorrentdialog.py:784
msgid "Downloading..."
@ -1975,7 +1975,7 @@ msgstr "_Afegeix"
#: deluge/ui/gtk3/dialogs.py:289
msgid "Authentication Level:"
msgstr "Nivel d'autenticació"
msgstr "Nivel d'autenticació:"
#: deluge/ui/gtk3/dialogs.py:423
msgid "Password Protected"
@ -2296,7 +2296,7 @@ msgstr "Error en afegir l'amfitrió"
#: deluge/ui/gtk3/connectionmanager.py:464
msgid "Error Updating Host"
msgstr "Ha fallat l'actualització del l'amfitrió"
msgstr "Ha fallat l'actualització de l'amfitrió"
#: deluge/ui/gtk3/preferences.py:131
#: deluge/ui/console/cmdline/commands/connect.py:33
@ -2535,8 +2535,8 @@ msgid ""
"Add one or more torrent files, torrent URLs or magnet URIs to a currently "
"running Deluge GTK instance"
msgstr ""
"Afegeix un o més fitxers torrent, URLs de fitxers torrent URIs magnet a una "
"instància en execució del Deluge GTK."
"Afegeix un o més fitxers torrent, URLs de fitxers torrent o URIs magnet a "
"una instància GTK en execució del Deluge"
#: deluge/ui/gtk3/glade/create_torrent_dialog.progress.ui.h:1
msgid "Creating Torrent"
@ -3064,7 +3064,7 @@ msgstr "Diàleg «Afegeix torrents»"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
msgid "Connection Attempts per Second:"
msgstr "Intents de connexió per segon"
msgstr "Intents de connexió per segon:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
msgid "Half-Open Connections:"
@ -3137,7 +3137,7 @@ msgid ""
"to avoid exceeding the limits with the total traffic"
msgstr ""
"Si es marca, la sobrecàrrega TCP/IP estimada no es tindrà en compte en els "
"límits de relació, per tal d'evitar excedir els límits amb el trànsit total."
"límits de relació, per tal d'evitar excedir els límits amb el trànsit total"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
msgid "Global Bandwidth Limits"
@ -3442,7 +3442,7 @@ msgstr "Clients del servidor intermediari"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:144
msgid "Proxy peer and web seed connections."
msgstr "Connexions de clients del servidor intermediari i de llavors web"
msgstr "Connexions de clients del servidor intermediari i de llavors web."
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:145
#: deluge/ui/console/modes/preferences/preference_panes.py:665
@ -3726,7 +3726,7 @@ msgstr "_Troba'n més..."
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
msgid "Remove the selected torrent(s)?"
msgstr "Voleu suprimit els torrents seleccionats?"
msgstr "Voleu suprimir els torrents seleccionats?"
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
msgid "Include downloaded files"
@ -3961,7 +3961,7 @@ msgstr "Nova versió"
#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:3
msgid "_Goto Website"
msgstr "_Vés al lloc web"
msgstr "_Ves al lloc web"
#: deluge/ui/gtk3/glade/main_window.new_release.ui.h:4
msgid "New Release Available!"
@ -4405,7 +4405,7 @@ msgstr "Conti_nua"
#: deluge/ui/gtk3/glade/torrent_menu.ui.h:4
#: deluge/ui/gtk3/glade/filtertree_menu.ui.h:4
msgid "Resume selected torrents."
msgstr "Continua amb els torrents seleccionats"
msgstr "Reprèn els torrents seleccionats."
#: deluge/ui/gtk3/glade/torrent_menu.ui.h:5
msgid "Opt_ions"
@ -4561,11 +4561,11 @@ msgid ""
"of the features provided."
msgstr ""
"El Deluge conté les funcions comunes dels clients BitTorrent, com ara el "
"xifratge del protocol, DHT, descobriment de clients locals (LSD), "
"intercanvi de clients (PEX), UPnP, NAT-PMP, suport per servidors "
"intermediaris, llavors web i límits de velocitat globals i per torrent. El "
"Deluge es basa en la biblioteca libtorrent, i per tant incorpora la llista "
"completa de les funcions que proporciona."
"xifratge del protocol, DHT, descobriment de clients locals (LSD), intercanvi "
"de clients (PEX), UPnP, NAT-PMP, suport per servidors intermediaris, llavors "
"web i límits de velocitat globals i per torrent. El Deluge es basa en la "
"biblioteca libtorrent, i, per tant, incorpora la llista completa de les "
"funcions que proporciona."
#: deluge/ui/data/share/metainfo/deluge.metainfo.xml.in.h:4
msgid ""
@ -4701,7 +4701,8 @@ msgstr ""
#: deluge/ui/console/cmdline/commands/pause.py:29
msgid "One or more torrent ids. Use \"*\" to pause all torrents"
msgstr ""
"Un o més identificadors de torrent. Useu \"*\" per pausar tots els torrents"
"Un o més identificadors de torrent. Useu \"*\" per posar en pausa tots els "
"torrents"
#: deluge/ui/console/cmdline/commands/add.py:38
msgid "Download folder for torrent"
@ -4745,7 +4746,7 @@ msgid ""
"scripts that want to do their own parsing)"
msgstr ""
"Valors en brut de les velocitats de pujada i baixada (sense el sufix KiB/s) "
"(útil per a scripts que vulguin fer el seu propi anàlisi)"
"(útil per a scripts que vulguin analitzar-ho)"
#: deluge/ui/console/cmdline/commands/status.py:46
msgid "Do not show torrent status (Improves command speed)"
@ -4792,7 +4793,7 @@ msgstr "Mostra més informació detallada com ara els fitxers i clients."
#: deluge/ui/console/cmdline/commands/info.py:116
#, python-format
msgid "Show torrents with state STATE: %s."
msgstr "Mostra els torrents amb l'estat: %s"
msgstr "Mostra els torrents amb l'estat: %s."
#: deluge/ui/console/cmdline/commands/info.py:132
msgid "Same as --sort but items are in reverse order."
@ -4802,7 +4803,7 @@ msgstr "El mateix que --sort però els elements estan amb ordre invers."
msgid "One or more torrent ids. If none is given, list all"
msgstr ""
"Un o més identificadors de torrent. Si no se'n proporciona cap, mostra'ls "
"tots."
"tots"
#: deluge/ui/console/modes/connectionmanager.py:44
msgid "Select Host"
@ -5116,7 +5117,7 @@ msgstr "L'adreça IP \"%s\" està mal formada"
#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
msgid "Emule IP list (GZip)"
msgstr "Llistat de les IP d'Emule (GZip)"
msgstr "Llistat d'IPs de l'eMule (GZip)"
#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:22
msgid "SafePeer Text (Zipped)"
@ -5281,7 +5282,7 @@ msgstr "Camí"
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
msgid "Watch folder does not exist."
msgstr "La carpeta vigilada no existeix"
msgstr "La carpeta vigilada no existeix."
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
@ -5740,7 +5741,7 @@ msgstr ""
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:1
msgid "Tray icon blinks enabled"
msgstr "El parpadeig de les icones de la safata del sistema està activat"
msgstr "El parpelleig de les icones de la safata del sistema està activat"
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:2
msgid "Popups enabled"
@ -5826,7 +5827,7 @@ msgstr "Torrents actius:"
#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:328
msgid "Active Downloading:"
msgstr "Nombre màxim de connexions actives"
msgstr "Nombre de connexions actives:"
#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:337
msgid "Active Seeding:"
@ -6056,7 +6057,7 @@ msgstr "S'ha perdut la connexió amb el servidor web."
#: deluge/ui/web/js/deluge-all/UI.js:160
msgid "Lost connection to webserver"
msgstr "Connexió al servidor web perduda."
msgstr "S'ha perdut la connexió al servidor"
#: deluge/ui/web/js/deluge-all/Menus.js:72
msgid "D/L Speed Limit"
@ -6353,7 +6354,7 @@ msgstr "Temps estimat:"
#: deluge/ui/web/render/tab_status.html:26
msgid "Date Added:"
msgstr "Data d'addició"
msgstr "Data d'addició:"
#~ msgid "<b>Language</b>"
#~ msgstr "<b>Idioma</b>"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2020-02-13 08:19+0000\n"
"Last-Translator: Dan Cooper <Unknown>\n"
"PO-Revision-Date: 2023-11-06 17:15+0000\n"
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -1580,7 +1580,7 @@ msgstr "Simbabwe"
#: deluge/ui/ui_entry.py:51
msgid "UI Options"
msgstr ""
msgstr "UI-Optionen"
#: deluge/ui/ui_entry.py:57
msgid "Set the default UI to be run, when no UI is specified"
@ -2013,7 +2013,7 @@ msgstr "<b>IP</b> <small>%s</small>"
#: deluge/ui/console/widgets/statusbars.py:121
#: deluge/ui/web/js/deluge-all/Statusbar.js:358
msgid "n/a"
msgstr ""
msgstr "n/v"
#: deluge/ui/gtk3/statusbar.py:220
msgid "<b><small>Port Issue</small></b>"
@ -2174,7 +2174,7 @@ msgstr ""
#: deluge/ui/gtk3/gtkui.py:350
msgid "Change User Interface Mode"
msgstr ""
msgstr "Benutzeroberflächenmodus ändern"
#: deluge/ui/gtk3/connectionmanager.py:52
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:56
@ -2819,7 +2819,7 @@ msgstr "Mit einem Deluge-Daemon verbinden (deluged)"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
msgid "Application Mode"
msgstr ""
msgstr "Anwendungsmodus"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
@ -3208,7 +3208,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:108
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:38
msgid "Incoming Address"
msgstr ""
msgstr "Eingangsadresse"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:109
msgid "Random"
@ -3229,7 +3229,7 @@ msgstr "Aktiven Port testen"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:113
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:58
msgid "Incoming Port"
msgstr ""
msgstr "Eingangsport"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:114
msgid ""
@ -3706,7 +3706,7 @@ msgstr "Pfadeintrag anzeigen"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
msgid "Show file chooser"
msgstr ""
msgstr "Dateiauswahl anzeigen"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:7
msgid "Show folder name"
@ -3762,7 +3762,7 @@ msgstr "Strg+D"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:22
msgid "Toggle hidden files"
msgstr ""
msgstr "Versteckte Dateien umschalten"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:23
msgid "Default path"
@ -3770,7 +3770,7 @@ msgstr "Standardpfad"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:24
msgid "Shortcuts"
msgstr ""
msgstr "Tastenkombinationen"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:25
msgid "Select a Directory"
@ -3813,7 +3813,7 @@ msgstr "Hinzufügen"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:32
msgid "Add the current entry value to the list"
msgstr ""
msgstr "Den aktuellen Eintragswert zur Liste hinzufügen"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:33
#: deluge/ui/web/js/deluge-all/EditTrackersWindow.js:98
@ -3864,7 +3864,7 @@ msgstr "Datei-Quersumme hinzufügen"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
msgid "From Infohash"
msgstr ""
msgstr "Von Infohash"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
msgid "Infohash:"
@ -4018,7 +4018,7 @@ msgstr "Gesamtgröße:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:21
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:27
msgid "Total Files:"
msgstr ""
msgstr "Dateien insgesamt:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:22
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:24
@ -4067,7 +4067,7 @@ msgstr "Aktueller Tracker:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:47
msgid "Total Trackers:"
msgstr ""
msgstr "Tracker insgesamt:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
#: deluge/ui/web/render/tab_status.html:6
@ -4827,7 +4827,7 @@ msgstr "Festplattenspeicher vorbelegen"
#: deluge/ui/console/modes/preferences/preference_panes.py:304
msgid "Incomming Ports"
msgstr ""
msgstr "Eingangsports"
#: deluge/ui/console/modes/preferences/preference_panes.py:313
#: deluge/ui/console/modes/preferences/preference_panes.py:337
@ -4846,7 +4846,7 @@ msgstr "Benutze Zufallsports"
#: deluge/ui/console/modes/preferences/preference_panes.py:352
msgid "Incoming Interface"
msgstr ""
msgstr "Eingangsschnittstelle"
#: deluge/ui/console/modes/preferences/preference_panes.py:355
msgid "IP address of the interface to listen on (leave empty for default):"
@ -4935,7 +4935,7 @@ msgstr "Tauschverhältnis"
#: deluge/ui/console/modes/preferences/preference_panes.py:601
msgid "Time Ratio"
msgstr ""
msgstr "Zeitverhältnis"
#: deluge/ui/console/modes/preferences/preference_panes.py:609
msgid "Time (m)"
@ -4971,7 +4971,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:712
msgid "Blocks Written"
msgstr ""
msgstr "Geschriebene Blöcke"
#: deluge/ui/console/modes/preferences/preference_panes.py:716
msgid "Writes"
@ -4983,7 +4983,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:725
msgid "Blocks Read"
msgstr ""
msgstr "Gelesene Blöcke"
#: deluge/ui/console/modes/preferences/preference_panes.py:729
msgid "Blocks Read hit"
@ -5400,7 +5400,7 @@ msgstr "Uploadfarbe:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
msgid "<b>Connections Graph</b>"
msgstr ""
msgstr "<b>Verbindungsgraph</b>"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:4
msgid "<b>Bandwidth Graph</b>"
@ -5408,7 +5408,7 @@ msgstr "<b>Bandbreitengraph</b>"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
msgid "DHT nodes:"
msgstr ""
msgstr "DHT-Knoten:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
msgid "Cached DHT nodes:"
@ -5424,7 +5424,7 @@ msgstr "<b>Seeds / Peers</b>"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
msgid "<b>Graph Colors</b>"
msgstr ""
msgstr "<b>Graphfarben</b>"
#: deluge/plugins/WebUi/deluge_webui/gtkui.py:35
#: deluge/plugins/WebUi/deluge_webui/gtkui.py:47
@ -5997,7 +5997,7 @@ msgstr "Erzwinge erneute Überprüfung"
#: deluge/ui/web/js/deluge-all/Menus.js:359
msgid "Expand All"
msgstr ""
msgstr "Alles ausklappen"
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
msgid "Details"
@ -6119,7 +6119,7 @@ msgstr "Zufälligen Port verwenden"
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:241
msgid "Type Of Service"
msgstr ""
msgstr "Diensttyp"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:53
msgid "Show filters with zero torrents"
@ -6151,7 +6151,7 @@ msgstr "Server"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
msgid "Session Timeout:"
msgstr ""
msgstr "Zeitüberschreitung der Sitzung:"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
msgid "Enable SSL (paths relative to Deluge config folder)"
@ -6221,7 +6221,7 @@ msgstr "Datei"
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
msgid "Infohash"
msgstr ""
msgstr "Infohash"
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:260
msgid "Uploading your torrent..."

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2020-04-26 10:56+0000\n"
"PO-Revision-Date: 2022-06-10 17:48+0000\n"
"Last-Translator: Jiri Grönroos <Unknown>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -120,11 +120,11 @@ msgstr ""
#: deluge/argparserbase.py:200
msgid "Output to specified logfile instead of stdout"
msgstr ""
msgstr "Ohjaa tuloste määritettyyn lokitiedostoon stdoutin sijaan"
#: deluge/argparserbase.py:206
msgid "Set the log level (none, error, warning, info, debug)"
msgstr ""
msgstr "Aseta lokituksen taso (none, error, warning, info, debug)"
#: deluge/argparserbase.py:215
#, python-format
@ -166,7 +166,7 @@ msgstr ""
#: deluge/core/daemon_entry.py:25
msgid "Daemon Options"
msgstr ""
msgstr "Taustaprosessin valinnat"
#: deluge/core/daemon_entry.py:31
msgid "IP address to listen for UI connections"
@ -325,7 +325,7 @@ msgstr "Yhteyksiä enintään"
#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
msgid "Max Upload Slots"
msgstr ""
msgstr "Jakopaikkoja enintään"
#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
@ -336,7 +336,7 @@ msgstr "Vertaiset"
#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
msgid "Seeds"
msgstr ""
msgstr "Jakajat"
#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
@ -346,7 +346,7 @@ msgstr "Saat."
#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
msgid "Seeds:Peers"
msgstr ""
msgstr "Jakajia:vertaisia"
#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
#: deluge/ui/gtk3/torrentview.py:387
@ -371,15 +371,15 @@ msgstr "Latauskansio"
#: deluge/ui/common.py:75
msgid "Seeding Time"
msgstr ""
msgstr "Jakoaika"
#: deluge/ui/common.py:76
msgid "Active Time"
msgstr ""
msgstr "Aktiivisuusaika"
#: deluge/ui/common.py:78
msgid "Last Activity"
msgstr ""
msgstr "Viimeisin toiminta"
#: deluge/ui/common.py:81
msgid "Finished Time"
@ -404,7 +404,7 @@ msgstr "Aikaa jäljellä"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
msgid "Shared"
msgstr ""
msgstr "Jaettu"
#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
@ -415,7 +415,7 @@ msgstr "Suosi ensimmäistä/viimeistä"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
msgid "Sequential Download"
msgstr ""
msgstr "Peräkkäinen lataus"
#: deluge/ui/common.py:97 deluge/ui/common.py:98
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
@ -427,15 +427,15 @@ msgstr "Automaattisesti hallittu"
#: deluge/ui/common.py:99
msgid "Stop At Ratio"
msgstr ""
msgstr "Pysäytä suhteessa"
#: deluge/ui/common.py:100
msgid "Stop Ratio"
msgstr ""
msgstr "Pysäytyssuhde"
#: deluge/ui/common.py:101
msgid "Remove At Ratio"
msgstr ""
msgstr "Poista suhteessa"
#: deluge/ui/common.py:102 deluge/ui/common.py:108
msgid "Move On Completed"
@ -443,7 +443,7 @@ msgstr ""
#: deluge/ui/common.py:104
msgid "Move Completed Path"
msgstr ""
msgstr "Siirrä valmistuneet -polku"
#: deluge/ui/common.py:112
msgid "Move On Completed Path"
@ -1614,7 +1614,7 @@ msgstr ""
#: deluge/ui/web/json_api.py:868
msgid "Daemon does not exist"
msgstr ""
msgstr "Taustaprosessia ei ole olemassa"
#: deluge/ui/web/json_api.py:875
msgid "Daemon not running"
@ -1969,15 +1969,15 @@ msgstr "Ei yhdistetty"
#: deluge/ui/gtk3/statusbar.py:175
msgid "Connections (Limit)"
msgstr ""
msgstr "Yhteydet (raja)"
#: deluge/ui/gtk3/statusbar.py:182
msgid "Download Speed (Limit)"
msgstr ""
msgstr "Latausnopeus (raja)"
#: deluge/ui/gtk3/statusbar.py:189
msgid "Upload Speed (Limit)"
msgstr ""
msgstr "Lähetysnopeus (raja)"
#: deluge/ui/gtk3/statusbar.py:196
msgid "Protocol Traffic (Down:Up)"
@ -2450,11 +2450,11 @@ msgstr ""
#: deluge/ui/gtk3/menubar.py:466
msgid "Set the maximum upload slots"
msgstr ""
msgstr "Aseta lähetyspaikkojen enimmäismäärä"
#: deluge/ui/gtk3/menubar.py:471
msgid "Stop Seed At Ratio"
msgstr ""
msgstr "Lopeta jakaminen suhteessa"
#: deluge/ui/gtk3/menubar.py:606
msgid "Ownership Change Error"
@ -2494,7 +2494,7 @@ msgstr "Torrentit jonossa"
#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:4
msgid "Add Queued Torrents"
msgstr ""
msgstr "Lisää jonotetut torrentit"
#: deluge/ui/gtk3/glade/queuedtorrents.ui.h:5
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:7
@ -2775,7 +2775,7 @@ msgstr "Socks5"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:10
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:36
msgid "Socks5 Auth"
msgstr ""
msgstr "Socks5-todennus"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:11
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:37
@ -2785,7 +2785,7 @@ msgstr "HTTP"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:12
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:38
msgid "HTTP Auth"
msgstr ""
msgstr "HTTP-todennus"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:13
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:39
@ -2802,11 +2802,11 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:21
msgid "Connect to a Deluge daemon (deluged)"
msgstr ""
msgstr "Yhdistä Deluge-taustaprosessiin (deluged)"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:22
msgid "Application Mode"
msgstr ""
msgstr "Sovellustila"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:23
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:46
@ -2841,11 +2841,11 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:31
msgid "Waiting:"
msgstr ""
msgstr "Odottaa:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:32
msgid "Missing:"
msgstr ""
msgstr "Puuttuu:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:33
msgid "_Revert"
@ -2853,7 +2853,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:34
msgid "Revert color to default"
msgstr ""
msgstr "Palauta väri oletukseksi"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:35
msgid "Piece Colors"
@ -2889,7 +2889,7 @@ msgstr "Suojaa ilmoitusalueelle pienennetty Deluge salasanalla"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:44
msgid "System Tray"
msgstr ""
msgstr "Ilmoitusalue"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:45
msgid "Notify about new releases"
@ -2939,7 +2939,7 @@ msgstr "Lataa kansioon:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:54
msgid "Download Folders"
msgstr ""
msgstr "Latauskansiot"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:55
#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:93
@ -2975,15 +2975,15 @@ msgstr "Lisää torrentit keskeytettyinä"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:65
#: deluge/ui/web/js/deluge-all/preferences/DownloadsPage.js:120
msgid "Pre-allocate disk space"
msgstr ""
msgstr "Ennakkovaraa levytila"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:66
msgid "Pre-allocate the disk space for the torrent files"
msgstr ""
msgstr "Ennakkovaraa levytila torrent-tiedostoille"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:67
msgid "Add Torrent Options"
msgstr ""
msgstr "Lisää torrent -valinnat"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:68
msgid "Always show"
@ -2995,15 +2995,15 @@ msgstr "Tuo valintaikkuna eteen"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:70
msgid "Add Torrents Dialog"
msgstr ""
msgstr "Lisää torrentti -ikkuna"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:71
msgid "Connection Attempts per Second:"
msgstr ""
msgstr "Yhteysyrityksiä per sekunti:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:72
msgid "Half-Open Connections:"
msgstr ""
msgstr "Puoliksi avoimet yhteydet:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:73
msgid "The maximum number of connections allowed. Set -1 for unlimited."
@ -3028,7 +3028,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:32
#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:5
msgid "Upload Slots:"
msgstr ""
msgstr "Lähetyspaikkoja:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:77
msgid "The maximum download speed for all torrents. Set -1 for unlimited."
@ -3073,7 +3073,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:85
msgid "Global Bandwidth Limits"
msgstr ""
msgstr "Yleiset kaistanleveyden rajoitukset"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:86
msgid "The maximum upload slots per torrent. Set -1 for unlimited."
@ -3095,19 +3095,19 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:90
msgid "Per-Torrent Bandwidth Limits"
msgstr ""
msgstr "Torrent-kohtaiset kaistanleveyden rajoitukset"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:91
#: deluge/ui/console/modes/preferences/preference_panes.py:556
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:42
msgid "Queue to top"
msgstr ""
msgstr "Jonota ylimmäksi"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:92
#: deluge/ui/console/modes/preferences/preference_panes.py:554
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:30
msgid "New Torrents"
msgstr ""
msgstr "Uudet torrentit"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:93
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:85
@ -3117,7 +3117,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:94
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:59
msgid "Total:"
msgstr ""
msgstr "Yhteensä:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:95
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:102
@ -3143,7 +3143,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:558
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:50
msgid "Active Torrents"
msgstr ""
msgstr "Aktiiviset torrentit"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:100
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:7
@ -3161,7 +3161,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
msgid "Time (m):"
msgstr ""
msgstr "Aika (min):"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:103
#: deluge/ui/console/modes/preferences/preference_panes.py:590
@ -3177,7 +3177,7 @@ msgstr "Keskeytä torrent"
#: deluge/ui/console/modes/preferences/preference_panes.py:627
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
msgid "Share Ratio Reached"
msgstr ""
msgstr "Jakosuhde saavutettu"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
msgid ""
@ -3223,7 +3223,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:359
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:101
msgid "Outgoing Interface"
msgstr ""
msgstr "Lähtevä sovitin"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:118
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
@ -3240,7 +3240,7 @@ msgstr "Päättyen:"
#: deluge/ui/console/modes/preferences/preference_panes.py:328
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:120
msgid "Outgoing Ports"
msgstr ""
msgstr "Lähtevät portit"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:121
#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:59
@ -3318,7 +3318,7 @@ msgstr "Vertaisen TOS-tavu:"
#: deluge/ui/console/modes/preferences/preference_panes.py:372
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:181
msgid "Network Extras"
msgstr ""
msgstr "Verkon lisäasetukset"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:137
#: deluge/ui/gtk3/glade/connection_manager.addhost.ui.h:4
@ -3368,7 +3368,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:147
msgid "Force Proxy Use"
msgstr ""
msgstr "Pakota välityspalvelimen käyttö"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:148
#: deluge/ui/console/modes/preferences/preference_panes.py:671
@ -3386,7 +3386,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:669
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:120
msgid "Force Proxy"
msgstr ""
msgstr "Pakota välityspalvelin"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:151
msgid "Cache Size (16 KiB blocks):"
@ -3449,7 +3449,7 @@ msgstr "Osumasuhde kirjoitetulle välimuistille:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:161
#: deluge/ui/console/modes/preferences/preference_panes.py:709
msgid "Write"
msgstr ""
msgstr "Kirjoitettu"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:162
msgid ""
@ -3491,7 +3491,7 @@ msgstr "Luettu:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:170
#: deluge/ui/console/modes/preferences/preference_panes.py:723
msgid "Read"
msgstr ""
msgstr "Luettu"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:171
msgid ""
@ -3554,11 +3554,11 @@ msgstr "GeoIP-tietokanta"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:183
msgid "Associate with Deluge"
msgstr ""
msgstr "Liitä Delugeen"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:184
msgid "Magnet Links"
msgstr ""
msgstr "Magneettilinkit"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:185
#: deluge/ui/web/js/deluge-all/preferences/DaemonPage.js:37
@ -3629,11 +3629,11 @@ msgstr "_Asenna"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:202
msgid "_Find More..."
msgstr ""
msgstr "_Löydä enemmän..."
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:4
msgid "Remove the selected torrent(s)?"
msgstr ""
msgstr "Poistetaanko valitut torrentit?"
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:5
msgid "Include downloaded files"
@ -3641,7 +3641,7 @@ msgstr "Sisällytä ladatut tiedostot"
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
msgid "(This is permanent!)"
msgstr ""
msgstr "(Tätä ei voi perua!)"
#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
msgid "Add Peer"
@ -3691,7 +3691,7 @@ msgstr "Näytä piilotetut tiedostot"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:11
msgid "Set new key"
msgstr ""
msgstr "Aseta uusi avain"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:12
msgid "Press this key to set new key accelerators to trigger auto-complete"
@ -3829,7 +3829,7 @@ msgstr "Lisää Infohash"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
msgid "From Infohash"
msgstr ""
msgstr "Infohashista"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
msgid "Infohash:"
@ -3892,13 +3892,13 @@ msgstr "Älä näytä tätä ilmoitusta tulevaisuudessa"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:26
#: deluge/ui/web/render/tab_status.html:9
msgid "Down Speed:"
msgstr ""
msgstr "Latausnopeus:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:2
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
#: deluge/ui/web/render/tab_status.html:10
msgid "Up Speed:"
msgstr ""
msgstr "Lähetysnopeus:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
#: deluge/ui/web/render/tab_status.html:2
@ -3913,7 +3913,7 @@ msgstr "Lähetetty:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
#: deluge/ui/web/render/tab_status.html:16
msgid "Seeds:"
msgstr ""
msgstr "Jakajia:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:6
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:10
@ -3924,7 +3924,7 @@ msgstr "Vertaiset:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:8
#: deluge/ui/web/render/tab_status.html:18
msgid "Availability:"
msgstr ""
msgstr "Saatavuus:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:9
#: deluge/ui/web/render/tab_status.html:25
@ -3933,7 +3933,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
msgid "ETA Time:"
msgstr ""
msgstr "Arvioitu valmistumisaika:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
#: deluge/ui/web/render/tab_status.html:13
@ -3943,7 +3943,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
#: deluge/ui/web/render/tab_status.html:23
msgid "Active Time:"
msgstr ""
msgstr "Aktiivisuusaika:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
#: deluge/ui/web/render/tab_status.html:20
@ -3953,7 +3953,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
#: deluge/ui/web/render/tab_status.html:24
msgid "Seeding Time:"
msgstr ""
msgstr "Jakoaika:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:16
#: deluge/ui/web/render/tab_status.html:12
@ -4024,7 +4024,7 @@ msgstr "Poista, kun jakosuhde on"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
msgid "Bandwidth Limits"
msgstr ""
msgstr "Kaistanleveyden rajoitukset"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:46
msgid "Current Tracker:"
@ -4037,7 +4037,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:48
#: deluge/ui/web/render/tab_status.html:6
msgid "Tracker Status:"
msgstr ""
msgstr "Seurantapalvelimen tila:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:49
#: deluge/ui/web/render/tab_status.html:5
@ -4095,16 +4095,16 @@ msgstr "Suosi ensimmäisiä / viimeisiä osia"
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:46
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:152
msgid "Skip File Hash Check"
msgstr ""
msgstr "Ohita tiedoston tiivisteen tarkistus"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:23
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:170
msgid "Preallocate Disk Space"
msgstr ""
msgstr "Ennakkovaraa levytila"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:24
msgid "Preallocate the disk space for the torrent files"
msgstr ""
msgstr "Ennakkovaraa levytila torrent-tiedostoille"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:25
msgid "Maximum torrent download speed"
@ -4116,7 +4116,7 @@ msgstr ""
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:29
msgid "Maximum torrent connections"
msgstr ""
msgstr "Torrent-yhteyksien enimmäismäärä"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:31
msgid "Maximum torrent upload slots"
@ -4391,7 +4391,7 @@ msgstr "Lisää verkko-osoite"
#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:4
msgid "From URL"
msgstr ""
msgstr "Verkko-osoitteesta"
#: deluge/ui/gtk3/glade/add_torrent_dialog.url.ui.h:5
#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:1
@ -4400,7 +4400,7 @@ msgstr "Osoite:"
#: deluge/ui/gtk3/glade/connection_manager.ui.h:9
msgid "Deluge Daemons"
msgstr ""
msgstr "Deluge-taustaprosessit"
#: deluge/ui/gtk3/glade/connection_manager.ui.h:10
msgid "Auto-connect to selected Daemon"
@ -4612,7 +4612,7 @@ msgstr "Ottaa liitännäisen käyttöön"
#: deluge/ui/console/cmdline/commands/plugin.py:43
msgid "Disables a plugin"
msgstr ""
msgstr "Poistaa liitännäisen käytöstä"
#: deluge/ui/console/cmdline/commands/plugin.py:51
msgid "Reload list of available plugins"
@ -4620,7 +4620,7 @@ msgstr ""
#: deluge/ui/console/cmdline/commands/plugin.py:54
msgid "Install a plugin from an .egg file"
msgstr ""
msgstr "Asenna liitännäinen .egg-tiedostosta"
#: deluge/ui/console/cmdline/commands/status.py:36
msgid ""
@ -4656,7 +4656,7 @@ msgstr ""
#: deluge/ui/console/cmdline/commands/help.py:29
msgid "One or more commands"
msgstr ""
msgstr "Yksi tai useampi komento"
#: deluge/ui/console/cmdline/commands/config.py:79
msgid "Usage: config [--set <key> <value>] [<key> [<key>...] ]"
@ -4764,7 +4764,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:254
msgid "Move completed to"
msgstr ""
msgstr "Siirrä valmistuneet sijaintiin"
#: deluge/ui/console/modes/preferences/preference_panes.py:269
msgid "Copy of .torrent files to"
@ -4776,7 +4776,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:293
msgid "Pre-Allocate disk space"
msgstr ""
msgstr "Ennakkovaraa levytila"
#: deluge/ui/console/modes/preferences/preference_panes.py:304
msgid "Incomming Ports"
@ -4822,7 +4822,7 @@ msgstr "Ulos"
#: deluge/ui/console/modes/preferences/preference_panes.py:413
#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
msgid "Global Bandwidth Usage"
msgstr ""
msgstr "Yleinen kaistankäyttö"
#: deluge/ui/console/modes/preferences/preference_panes.py:416
#: deluge/ui/console/modes/preferences/preference_panes.py:469
@ -4860,7 +4860,7 @@ msgstr "Nopeusraja IP:n yläpuolella"
#: deluge/ui/console/modes/preferences/preference_panes.py:466
#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
msgid "Per Torrent Bandwidth Usage"
msgstr ""
msgstr "Torrent-kohtainen kaistankäyttö"
#: deluge/ui/console/modes/preferences/preference_panes.py:513
msgid "Yes, please send anonymous statistics."
@ -4868,7 +4868,7 @@ msgstr "Kyllä, lähetä anonyymeja tilastoja."
#: deluge/ui/console/modes/preferences/preference_panes.py:531
msgid "Daemon Port"
msgstr ""
msgstr "Taustaprosessin portti"
#: deluge/ui/console/modes/preferences/preference_panes.py:538
msgid "Allow remote connections"
@ -4884,11 +4884,11 @@ msgstr "Jakosuhde"
#: deluge/ui/console/modes/preferences/preference_panes.py:601
msgid "Time Ratio"
msgstr ""
msgstr "Aikasuhde"
#: deluge/ui/console/modes/preferences/preference_panes.py:609
msgid "Time (m)"
msgstr ""
msgstr "Aika (min)"
#: deluge/ui/console/modes/preferences/preference_panes.py:633
msgid "Remove torrent (Unchecked pauses torrent)"
@ -4912,11 +4912,11 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:697
msgid "Cache Size (16 KiB blocks)"
msgstr ""
msgstr "Välimuistin koko (16 KiB:in lohkoissa)"
#: deluge/ui/console/modes/preferences/preference_panes.py:704
msgid "Cache Expiry (seconds)"
msgstr ""
msgstr "Välimuistin vanheneminen (sekuntia)"
#: deluge/ui/console/modes/preferences/preference_panes.py:712
msgid "Blocks Written"
@ -4981,7 +4981,7 @@ msgstr ""
#: deluge/plugins/Blocklist/deluge_blocklist/common.py:118
#, python-format
msgid "The IP address \"%s\" is badly formed"
msgstr ""
msgstr "IP-osoite \"%s\" on väärin muodostettu"
#: deluge/plugins/Blocklist/deluge_blocklist/webui.py:21
msgid "Emule IP list (GZip)"
@ -5253,7 +5253,7 @@ msgstr "Pää"
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:31
msgid "The user selected here will be the owner of the torrent."
msgstr ""
msgstr "Tässä valittu käyttäjä tulee olemaan torrentin omistaja."
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:32
msgid "<b>Owner</b>"
@ -5306,7 +5306,7 @@ msgstr "<b>Tarkkaile hakemistoja:</b>"
#: deluge/plugins/Stats/deluge_stats/gtkui.py:60
msgid "minutes"
msgstr ""
msgstr "minuuttia"
#: deluge/plugins/Stats/deluge_stats/gtkui.py:62
msgid "1 minute"
@ -5322,7 +5322,7 @@ msgstr "sekuntia"
#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:1
msgid "Stats"
msgstr ""
msgstr "Tilastot"
#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:2
msgid "Resolution"
@ -5330,15 +5330,15 @@ msgstr ""
#: deluge/plugins/Stats/deluge_stats/data/tabs.ui.h:5
msgid "Seeds/Peers"
msgstr ""
msgstr "Jakajat/vertaiset"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:1
msgid "Download color:"
msgstr ""
msgstr "Latausväri:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:2
msgid "Upload color:"
msgstr ""
msgstr "Lähetysväri:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:3
msgid "<b>Connections Graph</b>"
@ -5350,11 +5350,11 @@ msgstr "<b>Kaistanleveyden kuvaaja</b>"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:5
msgid "DHT nodes:"
msgstr ""
msgstr "DHT-solmut:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:6
msgid "Cached DHT nodes:"
msgstr ""
msgstr "Välimuistissa olevat DHT-solmut:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:7
msgid "DHT torrents:"
@ -5362,7 +5362,7 @@ msgstr "DHT-torrentit:"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:9
msgid "<b>Seeds / Peers</b>"
msgstr ""
msgstr "<b>Jakajat / vertaiset</b>"
#: deluge/plugins/Stats/deluge_stats/data/config.ui.h:11
msgid "<b>Graph Colors</b>"
@ -5462,7 +5462,7 @@ msgstr "Käytä jonoasetuksia:"
#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:17
msgid "Apply folder settings:"
msgstr ""
msgstr "Toteuta kansioasetukset:"
#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:19
msgid "<i>(1 line per tracker)</i>"
@ -5664,7 +5664,7 @@ msgstr "Ajastin"
#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:289
msgid "<b>Schedule</b>"
msgstr ""
msgstr "<b>Aikataulu</b>"
#: deluge/plugins/Scheduler/deluge_scheduler/gtkui.py:301
msgid "Download Limit:"
@ -5867,7 +5867,7 @@ msgstr "Yhdistä"
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:197
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:379
msgid "Stop Daemon"
msgstr ""
msgstr "Pysäytä taustaprosessi"
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:185
msgid "Disconnect"
@ -5875,7 +5875,7 @@ msgstr "Katkaise yhteys"
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:204
msgid "Start Daemon"
msgstr ""
msgstr "Käynnistä taustaprosessi"
#: deluge/ui/web/js/deluge-all/ConnectionManager.js:322
msgid "Change Default Password"
@ -5953,7 +5953,7 @@ msgstr "Tila:"
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
msgid "Move Completed:"
msgstr ""
msgstr "Siirrä valmistuneet:"
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:272
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:116
@ -6040,11 +6040,11 @@ msgstr "Lähetyspaikkojen enimmäismäärä:"
#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:43
msgid "Cache Size (16 KiB Blocks):"
msgstr ""
msgstr "Välimuistin koko (16 KiB:in lohkoissa):"
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:132
msgid "Force Use of Proxy"
msgstr ""
msgstr "Pakota välityspalvelimen käyttö"
#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:116
msgid "Find More"
@ -6088,7 +6088,7 @@ msgstr "Palvelin"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:140
msgid "Session Timeout:"
msgstr ""
msgstr "Istunnon aikakatkaisu:"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:165
msgid "Enable SSL (paths relative to Deluge config folder)"
@ -6173,15 +6173,15 @@ msgstr "Torrent ei ole kelvollinen"
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:50
msgid "Move Completed Folder"
msgstr ""
msgstr "Siirrä valmistuneet -kansio"
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:85
msgid "Max Down Speed"
msgstr ""
msgstr "Latausnopeus enintään"
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:93
msgid "Max Up Speed"
msgstr ""
msgstr "Lähetysnopeus enintään"
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:125
msgid "Add In Paused State"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
"X-Poedit-Language: Galician\n"
#: deluge/common.py:411

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-06-06 10:57+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2023-02-17 20:51+0000\n"
"Last-Translator: Hemish <Unknown>\n"
"Language-Team: Hindi <hi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -198,7 +198,7 @@ msgstr "सभी"
#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
#: deluge/ui/web/js/deluge-all/UI.js:19
msgid "Active"
msgstr ""
msgstr "सक्रिय"
#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
msgid "Allocating"
@ -223,11 +223,11 @@ msgstr "सीड किया जा रहा है"
#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
msgid "Paused"
msgstr "ठहराया हुआ"
msgstr "ठहरा हुआ"
#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
msgid "Queued"
msgstr "क़तार-बद्ध"
msgstr "पंक्तिबद्ध"
#: deluge/ui/common.py:45 deluge/ui/common.py:122
#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:131
@ -288,7 +288,7 @@ msgstr "अपलोडेड"
#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
msgid "Remaining"
msgstr ""
msgstr "बाकी"
#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
@ -393,7 +393,7 @@ msgstr ""
#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
msgid "Completed"
msgstr ""
msgstr "पूर्ण"
#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
@ -404,7 +404,7 @@ msgstr "इ टी ए (E T A)"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
msgid "Shared"
msgstr ""
msgstr "साझा किए गए"
#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
@ -455,7 +455,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
msgid "Owner"
msgstr ""
msgstr "मालिक"
#: deluge/ui/common.py:116
msgid "Pieces"
@ -539,7 +539,7 @@ msgstr "प्रॉक्सी"
#: deluge/ui/console/modes/preferences/preferences.py:97
#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:18
msgid "Cache"
msgstr ""
msgstr "कैश"
#: deluge/ui/common.py:136 deluge/ui/gtk3/glade/preferences_dialog.ui.h:190
#: deluge/ui/console/modes/preferences/preference_panes.py:499
@ -567,22 +567,22 @@ msgstr "प्लग-इन्स"
#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
#: deluge/ui/web/js/deluge-all/Menus.js:365
msgid "Skip"
msgstr ""
msgstr "अभी नहीं"
#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
#: deluge/ui/web/js/deluge-all/Menus.js:371
msgid "Low"
msgstr ""
msgstr "कम"
#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
#: deluge/ui/web/js/deluge-all/Menus.js:377
msgid "Normal"
msgstr ""
msgstr "सामान्य"
#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
#: deluge/ui/web/js/deluge-all/Menus.js:383
msgid "High"
msgstr ""
msgstr "उच्च"
#: deluge/ui/client.py:681
msgid ""
@ -592,7 +592,7 @@ msgstr ""
#: deluge/ui/countries.py:10
msgid "Afghanistan"
msgstr ""
msgstr "अफ़ग़ानिस्तान"
#: deluge/ui/countries.py:11
msgid "Aland Islands"
@ -644,15 +644,15 @@ msgstr ""
#: deluge/ui/countries.py:23
msgid "Australia"
msgstr ""
msgstr "ऑस्ट्रेलिया"
#: deluge/ui/countries.py:24
msgid "Austria"
msgstr ""
msgstr "ऑस्ट्रिया"
#: deluge/ui/countries.py:25
msgid "Azerbaijan"
msgstr ""
msgstr "अज़रबैजान"
#: deluge/ui/countries.py:26
msgid "Bahamas"
@ -664,7 +664,7 @@ msgstr ""
#: deluge/ui/countries.py:28
msgid "Bangladesh"
msgstr ""
msgstr "बांग्लादेश"
#: deluge/ui/countries.py:29
msgid "Barbados"
@ -672,11 +672,11 @@ msgstr ""
#: deluge/ui/countries.py:30
msgid "Belarus"
msgstr ""
msgstr "बेलारूस"
#: deluge/ui/countries.py:31
msgid "Belgium"
msgstr ""
msgstr "बेल्जियम"
#: deluge/ui/countries.py:32
msgid "Belize"
@ -1887,7 +1887,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:65
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:74
msgid "Username:"
msgstr "उपयोगक्ता का नाम:"
msgstr "उपयोगक्ता का नाम:"
#: deluge/ui/gtk3/dialogs.py:217 deluge/ui/gtk3/dialogs.py:310
#: deluge/ui/gtk3/dialogs.py:437
@ -2264,7 +2264,7 @@ msgstr "स्तर"
#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:67
#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:71
msgid "Enabled"
msgstr "सक्रिय किया"
msgstr "सक्रिय"
#: deluge/ui/gtk3/preferences.py:162
#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:87
@ -3223,7 +3223,7 @@ msgstr ""
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:11
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:155
msgid "From:"
msgstr "द्वारा:"
msgstr "प्रेषक:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:119
#: deluge/ui/web/js/deluge-all/preferences/NetworkPage.js:165
@ -3403,7 +3403,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/preferences/EncryptionPage.js:29
#: deluge/ui/web/js/deluge-all/preferences/CachePage.js:30
msgid "Settings"
msgstr ""
msgstr "सेटिंग्स"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:155
msgid ""
@ -5023,7 +5023,7 @@ msgstr "चालु होने पर ब्लॉकलिस्ट आय
#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:6
#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:4
msgid "<b>Settings</b>"
msgstr "<b>सेटिंग</b>"
msgstr "<b>सेटिंग्स</b>"
#: deluge/plugins/Blocklist/deluge_blocklist/data/blocklist_pref.ui.h:7
msgid "Download the blocklist file if necessary and import the file."
@ -5126,7 +5126,7 @@ msgstr ""
#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:507
msgid "Path"
msgstr ""
msgstr "पाथ"
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:125
msgid "Watch folder does not exist."
@ -5135,7 +5135,7 @@ msgstr ""
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:128
#: deluge/plugins/AutoAdd/deluge_autoadd/core.py:443
msgid "Path does not exist."
msgstr ""
msgstr "पाथ मौजूद नहीं है"
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:1
msgid "Watch Folder Properties"
@ -5372,7 +5372,7 @@ msgstr ""
#: deluge/plugins/WebUi/deluge_webui/data/config.ui.h:3
msgid "Listening port:"
msgstr ""
msgstr "सुनने का पोर्ट:"
#: deluge/plugins/Label/deluge_label/core.py:184
msgid "Invalid label, valid characters:[a-z0-9_-]"
@ -5495,7 +5495,7 @@ msgstr ""
#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:194
msgid "pygame is not installed"
msgstr ""
msgstr "pygame स्थापित नहीं है"
#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:206
#, python-format
@ -5573,7 +5573,7 @@ msgstr ""
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:3
msgid "Sound enabled"
msgstr ""
msgstr "ध्वनि सक्षम हैं"
#: deluge/plugins/Notifications/deluge_notifications/data/config.ui.h:4
msgid "<b>UI Notifications</b>"
@ -5724,7 +5724,7 @@ msgstr "स्थानान्तर"
#: deluge/ui/web/js/deluge-all/MoveStorage.js:54
msgid "Browse"
msgstr ""
msgstr "ब्राउज़ करें"
#: deluge/ui/web/js/deluge-all/EditConnectionWindow.js:17
msgid "Edit Connection"
@ -5757,7 +5757,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/Deluge.js:158
msgid "Mixed"
msgstr ""
msgstr "मिश्रित"
#: deluge/ui/web/js/deluge-all/Statusbar.js:87
msgid "Set Maximum Connections"
@ -5906,7 +5906,7 @@ msgstr "बलपूर्वक पुनः जांच"
#: deluge/ui/web/js/deluge-all/Menus.js:359
msgid "Expand All"
msgstr ""
msgstr "सभी फैलाएँ"
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:13
msgid "Details"
@ -5914,11 +5914,11 @@ msgstr "विवरण"
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:28
msgid "Comment:"
msgstr ""
msgstr "टिप्पणीः"
#: deluge/ui/web/js/deluge-all/details/DetailsTab.js:29
msgid "Status:"
msgstr ""
msgstr "स्थिति:"
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:242
msgid "Move Completed:"
@ -5935,7 +5935,7 @@ msgstr "निजी"
#: deluge/ui/web/js/deluge-all/details/StatusTab.js:39
msgid "Loading"
msgstr ""
msgstr "लोड हो रहा है"
#: deluge/ui/web/js/deluge-all/details/StatusTab.js:118
msgid "True"
@ -5962,7 +5962,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:33
#: deluge/ui/web/js/deluge-all/preferences/PluginsPage.js:109
msgid "Install"
msgstr ""
msgstr "स्थापित करें"
#: deluge/ui/web/js/deluge-all/preferences/InstallPluginWindow.js:45
msgid "Select an egg"
@ -6041,11 +6041,11 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:110
msgid "Old:"
msgstr ""
msgstr "पुराना:"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:114
msgid "New:"
msgstr ""
msgstr "नया:"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:118
msgid "Confirm:"
@ -6081,11 +6081,11 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:210
msgid "Refresh"
msgstr ""
msgstr "ताज़ा करें"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:244
msgid "Invalid Password"
msgstr ""
msgstr "अवैध पासवर्ड"
#: deluge/ui/web/js/deluge-all/preferences/InterfacePage.js:245
msgid "Your passwords don't match!"
@ -6114,7 +6114,7 @@ msgstr "यूआरएल"
#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:45
msgid "Cookies"
msgstr ""
msgstr "कुकी"
#: deluge/ui/web/js/deluge-all/add/UrlWindow.js:99
msgid "Failed to download torrent"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
"Language: hr\n"
#: deluge/common.py:411

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-06-06 10:57+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2022-08-03 16:14+0000\n"
"Last-Translator: Coool <Unknown>\n"
"Language-Team: Latvian <lv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -125,6 +125,8 @@ msgstr ""
#: deluge/argparserbase.py:206
msgid "Set the log level (none, error, warning, info, debug)"
msgstr ""
"Iestatīt žurnāla līmeni (nežurnalēt, kļūda, brīdinājums, informācija, "
"atkļūdošana)"
#: deluge/argparserbase.py:215
#, python-format

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

6164
deluge/i18n/mo.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,18 +8,18 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-06-06 10:57+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2021-12-23 05:43+0000\n"
"Last-Translator: Sam van Kampen <sam@tehsvk.net>\n"
"Language-Team: Dutch <nl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
msgstr ""
msgstr "B"
#: deluge/common.py:412
msgid "KiB"
@ -35,7 +35,7 @@ msgstr "GiB"
#: deluge/common.py:415
msgid "TiB"
msgstr ""
msgstr "TiB"
#: deluge/common.py:416
msgid "K"
@ -80,7 +80,7 @@ msgstr "KiB/s"
#: deluge/common.py:521
msgid "M/s"
msgstr ""
msgstr "M/s"
#: deluge/common.py:521
msgid "MiB/s"
@ -88,7 +88,7 @@ msgstr "MiB/s"
#: deluge/common.py:527
msgid "G/s"
msgstr ""
msgstr "G/s"
#: deluge/common.py:527
msgid "GiB/s"
@ -96,11 +96,11 @@ msgstr "GiB/s"
#: deluge/common.py:533
msgid "T/s"
msgstr ""
msgstr "T/s"
#: deluge/common.py:533
msgid "TiB/s"
msgstr ""
msgstr "TiB/s"
#: deluge/argparserbase.py:172
msgid "Common Options"
@ -108,11 +108,11 @@ msgstr ""
#: deluge/argparserbase.py:175
msgid "Print this help message"
msgstr ""
msgstr "Dit Help-bericht afdrukken"
#: deluge/argparserbase.py:182
msgid "Print version information"
msgstr ""
msgstr "Versie-informatie afdrukken"
#: deluge/argparserbase.py:194
msgid "Set the config directory path"
@ -278,12 +278,12 @@ msgstr "Grootte"
#: deluge/ui/common.py:55 deluge/ui/gtk3/torrentview.py:289
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:244
msgid "Downloaded"
msgstr "Gedownloaded"
msgstr "Binnengehaald"
#: deluge/ui/common.py:56 deluge/ui/gtk3/torrentview.py:296
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:252
msgid "Uploaded"
msgstr "Geupload"
msgstr "Geüpload"
#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
@ -3901,17 +3901,17 @@ msgstr ""
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:28
#: deluge/ui/web/render/tab_status.html:10
msgid "Up Speed:"
msgstr ""
msgstr "Uploadsnelheid:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:3
#: deluge/ui/web/render/tab_status.html:2
msgid "Downloaded:"
msgstr ""
msgstr "Binnengehaald:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:4
#: deluge/ui/web/render/tab_status.html:3
msgid "Uploaded:"
msgstr ""
msgstr "Geüpload:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:5
#: deluge/ui/web/render/tab_status.html:16

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,18 +8,18 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-06-06 10:57+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2023-11-06 18:51+0000\n"
"Last-Translator: Cas <Unknown>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
msgstr ""
msgstr "B"
#: deluge/common.py:412
msgid "KiB"
@ -35,7 +35,7 @@ msgstr "GiB"
#: deluge/common.py:415
msgid "TiB"
msgstr ""
msgstr "TiB"
#: deluge/common.py:416
msgid "K"
@ -51,7 +51,7 @@ msgstr "G"
#: deluge/common.py:419
msgid "T"
msgstr ""
msgstr "T"
#: deluge/common.py:515 deluge/ui/gtk3/statusbar.py:442
#: deluge/ui/gtk3/statusbar.py:455 deluge/ui/gtk3/statusbar.py:464
@ -62,7 +62,7 @@ msgstr ""
#: deluge/ui/gtk3/systemtray.py:274 deluge/ui/gtk3/systemtray.py:442
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:40
msgid "K/s"
msgstr ""
msgstr "K/s"
#: deluge/common.py:515 deluge/ui/gtk3/menubar.py:449
#: deluge/ui/gtk3/menubar.py:455
@ -80,7 +80,7 @@ msgstr "KiB/s"
#: deluge/common.py:521
msgid "M/s"
msgstr ""
msgstr "M/s"
#: deluge/common.py:521
msgid "MiB/s"
@ -88,7 +88,7 @@ msgstr "MiB/s"
#: deluge/common.py:527
msgid "G/s"
msgstr ""
msgstr "G/s"
#: deluge/common.py:527
msgid "GiB/s"
@ -96,11 +96,11 @@ msgstr "GiB/s"
#: deluge/common.py:533
msgid "T/s"
msgstr ""
msgstr "T/s"
#: deluge/common.py:533
msgid "TiB/s"
msgstr ""
msgstr "TiB/s"
#: deluge/argparserbase.py:172
msgid "Common Options"
@ -198,36 +198,36 @@ msgstr "Wszystkie"
#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:534
#: deluge/ui/web/js/deluge-all/UI.js:19
msgid "Active"
msgstr "Aktywny"
msgstr "Aktywne"
#: deluge/ui/common.py:39 deluge/ui/web/js/deluge-all/UI.js:20
msgid "Allocating"
msgstr ""
msgstr "Alokowane"
#: deluge/ui/common.py:40 deluge/ui/web/js/deluge-all/UI.js:21
#: deluge/ui/web/js/deluge-all/UI.js:25
msgid "Checking"
msgstr "Sprawdzanie"
msgstr "Sprawdzane"
#: deluge/ui/common.py:41
#: deluge/ui/console/modes/preferences/preference_panes.py:568
#: deluge/ui/web/js/deluge-all/UI.js:22
msgid "Downloading"
msgstr "Pobieranie"
msgstr "Pobierane"
#: deluge/ui/common.py:42
#: deluge/ui/console/modes/preferences/preference_panes.py:575
#: deluge/ui/web/js/deluge-all/UI.js:23
msgid "Seeding"
msgstr "Wysyłanie"
msgstr "Wysyłane"
#: deluge/ui/common.py:43 deluge/ui/web/js/deluge-all/UI.js:24
msgid "Paused"
msgstr "Pauza"
msgstr "Wstrzymane"
#: deluge/ui/common.py:44 deluge/ui/web/js/deluge-all/UI.js:26
msgid "Queued"
msgstr "W kolejce"
msgstr "Zakolejkowane"
#: deluge/ui/common.py:45 deluge/ui/common.py:122
#: deluge/ui/gtk3/statusbar.py:396 deluge/ui/gtk3/filtertreeview.py:131
@ -243,7 +243,7 @@ msgstr "W kolejce"
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:291
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:316
msgid "Error"
msgstr "Błąd"
msgstr "Błędne"
#: deluge/ui/common.py:50 deluge/ui/gtk3/listview.py:793
#: deluge/ui/gtk3/torrentview.py:180 deluge/ui/gtk3/torrentview.py:276
@ -288,26 +288,26 @@ msgstr "Wysłano"
#: deluge/ui/common.py:57 deluge/ui/gtk3/torrentview.py:303
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:260
msgid "Remaining"
msgstr ""
msgstr "Pozostało"
#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
msgid "Ratio"
msgstr "Ratio"
msgstr "Ułamek"
#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
#: deluge/ui/gtk3/peers_tab.py:133
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:144
#: deluge/ui/web/js/deluge-all/details/PeersTab.js:87
msgid "Down Speed"
msgstr "Szybk. pobierania"
msgstr "Szybkość pobierania"
#: deluge/ui/common.py:60 deluge/ui/gtk3/torrentview.py:346
#: deluge/ui/gtk3/peers_tab.py:146
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:151
#: deluge/ui/web/js/deluge-all/details/PeersTab.js:94
msgid "Up Speed"
msgstr "Szybk. wysyłania"
msgstr "Szybkość wysyłania"
#: deluge/ui/common.py:61 deluge/ui/gtk3/torrentview.py:352
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:268
@ -321,11 +321,11 @@ msgstr "Limit Wysyłania"
#: deluge/ui/common.py:63 deluge/ui/web/js/deluge-all/add/OptionsTab.js:101
msgid "Max Connections"
msgstr ""
msgstr "Maksymalnie Połączeń"
#: deluge/ui/common.py:64 deluge/ui/web/js/deluge-all/add/OptionsTab.js:109
msgid "Max Upload Slots"
msgstr ""
msgstr "Maksymalnie Slotów Wysyłania"
#: deluge/ui/common.py:65 deluge/ui/gtk3/torrentview.py:325
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:136
@ -336,17 +336,17 @@ msgstr "Uczestnicy"
#: deluge/ui/common.py:66 deluge/ui/gtk3/torrentview.py:317
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:128
msgid "Seeds"
msgstr ""
msgstr "Posiadacze"
#: deluge/ui/common.py:67 deluge/ui/gtk3/torrentview.py:380
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:173
msgid "Avail"
msgstr "Dost."
msgstr "Dostępność"
#: deluge/ui/common.py:68 deluge/ui/gtk3/torrentview.py:333
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:284
msgid "Seeds:Peers"
msgstr ""
msgstr "Posiadaczy:Uczestników"
#: deluge/ui/common.py:69 deluge/ui/gtk3/listview.py:203
#: deluge/ui/gtk3/torrentview.py:387
@ -367,33 +367,33 @@ msgstr "Tracker"
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:213
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:31
msgid "Download Folder"
msgstr ""
msgstr "Folder pobrania"
#: deluge/ui/common.py:75
msgid "Seeding Time"
msgstr ""
msgstr "Razem wysyłano czasu"
#: deluge/ui/common.py:76
msgid "Active Time"
msgstr ""
msgstr "Razem aktywności czasu"
#: deluge/ui/common.py:78
msgid "Last Activity"
msgstr ""
msgstr "Ostatnia aktywność"
#: deluge/ui/common.py:81
msgid "Finished Time"
msgstr ""
msgstr "Zakończono o"
#: deluge/ui/common.py:83 deluge/ui/gtk3/torrentview.py:401
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:189
msgid "Complete Seen"
msgstr ""
msgstr "Ostatnio widziano cały o"
#: deluge/ui/common.py:86 deluge/ui/gtk3/torrentview.py:394
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:197
msgid "Completed"
msgstr ""
msgstr "Zakończono o"
#: deluge/ui/common.py:87 deluge/ui/gtk3/torrentview.py:366
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:158
@ -404,7 +404,7 @@ msgstr "Pozostało"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:30
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:236
msgid "Shared"
msgstr ""
msgstr "Współdzielony"
#: deluge/ui/common.py:90 deluge/ui/gtk3/glade/main_window.tabs.ui.h:31
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:287
@ -415,7 +415,7 @@ msgstr "Kolejkuj Pierwszy/Ostatni"
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:14
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:143
msgid "Sequential Download"
msgstr ""
msgstr "Sekwencyjne pobieranie"
#: deluge/ui/common.py:97 deluge/ui/common.py:98
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:35
@ -427,19 +427,19 @@ msgstr "Automatycznie zarządzany"
#: deluge/ui/common.py:99
msgid "Stop At Ratio"
msgstr ""
msgstr "Zatrzymaj na ułamku"
#: deluge/ui/common.py:100
msgid "Stop Ratio"
msgstr ""
msgstr "Ułamek do zatrzymania"
#: deluge/ui/common.py:101
msgid "Remove At Ratio"
msgstr ""
msgstr "Usuń na ułamku"
#: deluge/ui/common.py:102 deluge/ui/common.py:108
msgid "Move On Completed"
msgstr ""
msgstr "Przenieś po zakończeniu"
#: deluge/ui/common.py:104
msgid "Move Completed Path"
@ -455,7 +455,7 @@ msgstr ""
#: deluge/ui/web/js/deluge-all/FilterPanel.js:32
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:221
msgid "Owner"
msgstr ""
msgstr "Właściciel"
#: deluge/ui/common.py:116
msgid "Pieces"
@ -463,13 +463,13 @@ msgstr "Fragmentów"
#: deluge/ui/common.py:117
msgid "Seed Rank"
msgstr ""
msgstr "Cyklów seedowania"
#: deluge/ui/common.py:118 deluge/ui/gtk3/glade/main_window.tabs.ui.h:33
#: deluge/ui/gtk3/glade/add_torrent_dialog.ui.h:22
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:294
msgid "Super Seeding"
msgstr ""
msgstr "Początkowe seedowanie"
#: deluge/ui/common.py:123 deluge/ui/web/js/deluge-all/details/StatusTab.js:122
msgid "Warning"
@ -506,7 +506,7 @@ msgstr "Pobierane"
#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:21
#: deluge/ui/web/js/deluge-all/add/OptionsTab.js:73
msgid "Bandwidth"
msgstr "Łącze"
msgstr "Przepustowość"
#: deluge/ui/common.py:132
#: deluge/ui/console/modes/preferences/preference_panes.py:550
@ -532,7 +532,7 @@ msgstr "Sieć"
#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:21
#: deluge/ui/web/js/deluge-all/preferences/ProxyPage.js:35
msgid "Proxy"
msgstr "Proxy"
msgstr "Pośrednik sieciowy"
#: deluge/ui/common.py:135
#: deluge/ui/console/modes/preferences/preference_panes.py:685
@ -567,22 +567,22 @@ msgstr "Wtyczki"
#: deluge/ui/common.py:150 deluge/ui/web/js/deluge-all/Deluge.js:154
#: deluge/ui/web/js/deluge-all/Menus.js:365
msgid "Skip"
msgstr ""
msgstr "Nie pobieraj"
#: deluge/ui/common.py:151 deluge/ui/web/js/deluge-all/Deluge.js:155
#: deluge/ui/web/js/deluge-all/Menus.js:371
msgid "Low"
msgstr ""
msgstr "Niski priorytet"
#: deluge/ui/common.py:152 deluge/ui/web/js/deluge-all/Deluge.js:156
#: deluge/ui/web/js/deluge-all/Menus.js:377
msgid "Normal"
msgstr ""
msgstr "Średni priorytet"
#: deluge/ui/common.py:153 deluge/ui/web/js/deluge-all/Deluge.js:157
#: deluge/ui/web/js/deluge-all/Menus.js:383
msgid "High"
msgstr ""
msgstr "Wysoki priorytet"
#: deluge/ui/client.py:681
msgid ""

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
"Language: sv\n"
#: deluge/common.py:411

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2021-07-07 20:36+0000\n"
"PO-Revision-Date: 2021-12-23 09:01+0000\n"
"Last-Translator: ma$terok <Unknown>\n"
"Language-Team: Ukrainian <uk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"
@ -301,7 +301,7 @@ msgstr "Залишилося"
#: deluge/ui/common.py:58 deluge/ui/gtk3/torrentview.py:373
#: deluge/ui/web/js/deluge-all/TorrentGrid.js:165
msgid "Ratio"
msgstr "Відношення"
msgstr "Рейтинг"
#: deluge/ui/common.py:59 deluge/ui/gtk3/torrentview.py:340
#: deluge/ui/gtk3/peers_tab.py:133
@ -1797,28 +1797,28 @@ msgid ""
"delete this exception statement from all source files in the program, then "
"also delete it here."
msgstr ""
"Ця проґрама є вільним проґрамним забезпеченням, Ви можете розповсюджувати та "
"/ або модифікувати його на умовах GNU General Public License, опублікованій "
"Free Software Foundation, версії 3, або (за вашим вибором) будь-якої "
"пізнішої версії.\n"
"Ця програма є безкоштовним програмним забезпеченням; ви можете поширювати "
"його та/або змінювати відповідно до умов Загальної публічної ліцензії GNU, "
"опублікованої Фондом вільного програмного забезпечення; або версії 3 "
"Ліцензії, або (на ваш вибір) будь якої пізнішої версії.\n"
"\n"
"Ця проґрама поширюється зі сподіванням, що вона буде корисною, але БЕЗ БУДЬ-"
"ЯКИХ ЗАПОРУК, навіть без запорук КОМЕРЦІЙНОЇ ЦІННОСТІ чи ПРИДАТНОСТІ ДЛЯ "
"КОНКРЕТНИХ ЦІЛЕЙ. Див громадської ліцензії GNU General ліцензії для більш "
"докладної інформації.\n"
"Ця програма розповсюджується в надії, що вона буде корисною, але БЕЗ БУДЬ "
"ЯКИХ ГАРАНТІЙ; навіть без прихованої гарантії КОМЕРЦІЙНОЇ ВИГОДИ чи "
"ПРИДАТНОСТІ ДЛЯ КОНКРЕТНИХ ЦІЛЕЙ. Докладніше дивися у Загальнодоступній "
"ліцензії GNU.\n"
"\n"
"Ви повинні були отримати копію Public License GNU General разом з цією "
"проґрамою, якщо ні, див <http://www.gnu.org/licenses>.\n"
"Ви повинні були отримати копію Загальної публічної ліцензії GNU разом із "
"цією програмою; якщо ні, дивися <http://www.gnu.org/licenses>.\n"
"\n"
"Крім того, в якості особливого винятку, власників авторських прав дати "
"дозвіл, щоб зв'язати код частини цієї проґрами з бібліотекою OpenSSL. Ви "
"повинні коритися GNU General Public License у всіх відношеннях для всіх код, "
"що використовується, крім OpenSSL.\n"
"Крім того, як особливий виняток, власники авторських прав дають дозвіл "
"пов'язувати код частин цієї програми з бібліотекою OpenSSL. Ви повинні "
"дотримуватись Загальної загальнодоступної ліцензії GNU у всіх відношеннях до "
"всього коду, що використовується, крім OpenSSL.\n"
"\n"
"Якщо ви зміните файл (и) з виключенням цього, ви можете розширити це виняток "
"для вашої версії файлу (ів), але ви не зобов'язані це робити. Якщо ви не "
"хочете зробити це, вилучіть це виняток заява від вашої версії. Якщо ви "
"вилучите це виняток заява всі вихідні файли в проґраму, то і вилучати її тут."
"Якщо ви змінюєте файл (и) з цим винятком, ви можете поширити цей виняток на "
"свою версію файлу (ів), але ви не зобов’язані це робити. Якщо ви не хочете "
"цього робити, видаліть цей виняток із своєї версії. Якщо ви видалите цей "
"виняток із усіх вихідних файлів програми, також видаліть його тут."
#: deluge/ui/gtk3/aboutdialog.py:829
#: deluge/ui/web/js/deluge-all/AboutWindow.js:65
@ -3223,12 +3223,12 @@ msgstr "Активні торенти"
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:187
#: deluge/ui/web/render/tab_status.html:4
msgid "Share Ratio:"
msgstr "Співвідношення:"
msgstr "Рейтинг:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:101
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:142
msgid "Time Ratio:"
msgstr ""
msgstr "Співвідношення часу:"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:102
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:157
@ -3239,7 +3239,7 @@ msgstr "Час(хв)"
#: deluge/ui/console/modes/preferences/preference_panes.py:590
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:118
msgid "Seeding Rotation"
msgstr ""
msgstr "Ротація завершених"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:104
msgid "Pause Torrent"
@ -3249,7 +3249,7 @@ msgstr "Призупинити торент"
#: deluge/ui/console/modes/preferences/preference_panes.py:627
#: deluge/ui/web/js/deluge-all/preferences/QueuePage.js:173
msgid "Share Ratio Reached"
msgstr ""
msgstr "Співвідношення досягнуто"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:107
msgid ""
@ -3456,7 +3456,7 @@ msgstr "Примусово використовувати проксі"
#: deluge/ui/console/modes/preferences/preference_panes.py:671
#: deluge/ui/web/js/deluge-all/preferences/ProxyField.js:141
msgid "Hide Client Identity"
msgstr ""
msgstr "Приховати дані клієнта"
#: deluge/ui/gtk3/glade/preferences_dialog.ui.h:149
msgid ""
@ -3728,7 +3728,7 @@ msgstr "Додати завантажені файли"
#: deluge/ui/gtk3/glade/remove_torrent_dialog.ui.h:6
msgid "(This is permanent!)"
msgstr "(Це постійно!)"
msgstr "Назавжди"
#: deluge/ui/gtk3/glade/connect_peer_dialog.ui.h:1
msgid "Add Peer"
@ -3754,7 +3754,7 @@ msgstr "<b>Загальні</b>"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:5
msgid "Show path entry"
msgstr ""
msgstr "Вказати шлях"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:6
msgid "Show file chooser"
@ -3766,7 +3766,7 @@ msgstr "Показати ім'я теки"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:8
msgid "Path Chooser Type"
msgstr ""
msgstr "Тип вибору шляху"
#: deluge/ui/gtk3/glade/path_combo_chooser.ui.h:9
msgid "Enable autocomplete"
@ -3917,7 +3917,7 @@ msgstr "Додати хеш даних"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:4
msgid "From Infohash"
msgstr ""
msgstr "З хешу"
#: deluge/ui/gtk3/glade/add_torrent_dialog.infohash.ui.h:5
msgid "Infohash:"
@ -4021,12 +4021,12 @@ msgstr "Рейтинг роздачі:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:10
msgid "ETA Time:"
msgstr ""
msgstr "Строк завантаження:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:11
#: deluge/ui/web/render/tab_status.html:13
msgid "Last Transfer:"
msgstr ""
msgstr "Остання передача:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:12
#: deluge/ui/web/render/tab_status.html:23
@ -4036,7 +4036,7 @@ msgstr "Час активности:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:13
#: deluge/ui/web/render/tab_status.html:20
msgid "Complete Seen:"
msgstr ""
msgstr "Завершені:"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:14
#: deluge/ui/web/render/tab_status.html:24
@ -4108,7 +4108,7 @@ msgstr "Зупинити роздачу при коефіцієнті:"
#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:13
#: deluge/ui/web/js/deluge-all/details/OptionsTab.js:233
msgid "Remove at ratio"
msgstr "Вилучити при коефіцієнті"
msgstr "Вилучити при рейтингу"
#: deluge/ui/gtk3/glade/main_window.tabs.ui.h:44
msgid "Bandwidth Limits"
@ -4450,7 +4450,7 @@ msgstr "Межа _слотів роздачі"
#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:5
msgid "Stop seed at _ratio"
msgstr ""
msgstr "Зупинити при спів_відношенні"
#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:6
msgid "_Auto Managed"
@ -4458,7 +4458,7 @@ msgstr "Автоматичне керування"
#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:7
msgid "_Super Seeding"
msgstr ""
msgstr "_Супер-сід"
#: deluge/ui/gtk3/glade/torrent_menu.options.ui.h:8
msgid "_Change Ownership"
@ -4657,7 +4657,7 @@ msgstr "Встановлюване значення"
#: deluge/ui/console/cmdline/commands/manage.py:53
#: deluge/ui/console/cmdline/commands/config.py:98
msgid "one or more keys separated by space"
msgstr ""
msgstr "один або кілька ключів, розділених пробілами"
#: deluge/ui/console/cmdline/commands/rm.py:33
msgid "Also removes the torrent data"
@ -4681,15 +4681,19 @@ msgstr ""
#: deluge/ui/console/cmdline/commands/resume.py:22
msgid "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
msgstr ""
msgstr "Використання: відновити [ * | <torrent-id> [<torrent-id> ...] ]"
#: deluge/ui/console/cmdline/commands/resume.py:29
msgid "One or more torrent ids. Use \"*\" to resume all torrents"
msgstr ""
"Один або кілька ідентифікаторів торрентів. Для відновлення всіх торрентів "
"використовуйте \"*\""
#: deluge/ui/console/cmdline/commands/pause.py:29
msgid "One or more torrent ids. Use \"*\" to pause all torrents"
msgstr ""
"Один або кілька ідентифікаторів торрентів. Використовуйте \"*\" для "
"призупинення всіх торрентів"
#: deluge/ui/console/cmdline/commands/add.py:38
msgid "Download folder for torrent"
@ -4760,7 +4764,7 @@ msgstr "Шлях для переміщення торентів"
#: deluge/ui/console/cmdline/commands/debug.py:26
msgid "The new state"
msgstr ""
msgstr "Новий стан"
#: deluge/ui/console/cmdline/commands/help.py:29
msgid "One or more commands"
@ -4861,10 +4865,12 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:216
msgid "Third tab lists all remaining torrents in command line mode"
msgstr ""
"На третій вкладці перераховані всі торренти, що залишилися, у режимі "
"командного рядка"
#: deluge/ui/console/modes/preferences/preference_panes.py:221
msgid "Torrents per tab press"
msgstr ""
msgstr "Торренти за натисненням вкладки"
#: deluge/ui/console/modes/preferences/preference_panes.py:234
#: deluge/plugins/Label/deluge_label/data/label_options.ui.h:18
@ -4939,7 +4945,7 @@ msgstr "Вихідні"
#: deluge/ui/console/modes/preferences/preference_panes.py:413
#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:38
msgid "Global Bandwidth Usage"
msgstr ""
msgstr "Глобальне використання пропускної здатності"
#: deluge/ui/console/modes/preferences/preference_panes.py:416
#: deluge/ui/console/modes/preferences/preference_panes.py:469
@ -4977,7 +4983,7 @@ msgstr "Обмежувати швидкість із урахуванням ви
#: deluge/ui/console/modes/preferences/preference_panes.py:466
#: deluge/ui/web/js/deluge-all/preferences/BandwidthPage.js:148
msgid "Per Torrent Bandwidth Usage"
msgstr ""
msgstr "Налаштування швидкості торенту"
#: deluge/ui/console/modes/preferences/preference_panes.py:513
msgid "Yes, please send anonymous statistics."
@ -4997,11 +5003,11 @@ msgstr "Загалом"
#: deluge/ui/console/modes/preferences/preference_panes.py:593
msgid "Share Ratio"
msgstr "Коефіцієнт обміну"
msgstr "Рейтинг"
#: deluge/ui/console/modes/preferences/preference_panes.py:601
msgid "Time Ratio"
msgstr ""
msgstr "Співвідношення часу"
#: deluge/ui/console/modes/preferences/preference_panes.py:609
msgid "Time (m)"
@ -5009,7 +5015,7 @@ msgstr "Час (хв)"
#: deluge/ui/console/modes/preferences/preference_panes.py:633
msgid "Remove torrent (Unchecked pauses torrent)"
msgstr ""
msgstr "Видалити торент (Не позначені призупиняют торент)"
#: deluge/ui/console/modes/preferences/preference_panes.py:646
msgid "Proxy Settings"
@ -5037,7 +5043,7 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:712
msgid "Blocks Written"
msgstr ""
msgstr "Записано блоків"
#: deluge/ui/console/modes/preferences/preference_panes.py:716
msgid "Writes"
@ -5049,11 +5055,11 @@ msgstr ""
#: deluge/ui/console/modes/preferences/preference_panes.py:725
msgid "Blocks Read"
msgstr ""
msgstr "Зчитано блоків"
#: deluge/ui/console/modes/preferences/preference_panes.py:729
msgid "Blocks Read hit"
msgstr ""
msgstr "Зчитано блоків з кешу"
#: deluge/ui/console/modes/preferences/preference_panes.py:732
msgid "Reads"
@ -5245,6 +5251,8 @@ msgid ""
"\"Watch Folder\" directory and \"Copy of .torrent files to\" directory "
"cannot be the same!"
msgstr ""
"\"Тека для стеження\" і тека \"Копіювати .torrent файли до\" не можуть бути "
"однаковими!"
#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:462
#: deluge/plugins/AutoAdd/deluge_autoadd/gtkui.py:466
@ -5334,6 +5342,9 @@ msgid ""
"the .torrent will copied to the chosen directory\n"
"and deleted from the watch folder."
msgstr ""
"Після додавання торрента,\n"
".torrent буде скопійовано до вибраної теки\n"
"і видалено з теки для стеження."
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:20
msgid ""
@ -5361,7 +5372,7 @@ msgstr "<b>Тека для завантаження</b>"
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:26
msgid "Set move completed folder"
msgstr ""
msgstr "Вкажіть теку для переміщення завершених"
#: deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui.h:27
msgid "<b>Move Completed</b>"
@ -5628,7 +5639,7 @@ msgstr "Спливні вікна вимкнено"
#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:177
msgid "libnotify is not installed"
msgstr ""
msgstr "libnotify не встановлено"
#: deluge/plugins/Notifications/deluge_notifications/gtkui.py:185
msgid "Failed to popup notification"
@ -6291,7 +6302,7 @@ msgstr "Файл"
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:149
msgid "Infohash"
msgstr ""
msgstr "Хеш-сума"
#: deluge/ui/web/js/deluge-all/add/AddWindow.js:260
msgid "Uploading your torrent..."

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: deluge\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2019-11-12 14:55+0000\n"
"PO-Revision-Date: 2019-12-06 05:38+0000\n"
"PO-Revision-Date: 2022-12-28 05:35+0000\n"
"Last-Translator: 玉堂白鹤 <yjwork@qq.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
"Language: zh_CN\n"
#: deluge/common.py:411
@ -132,18 +132,18 @@ msgstr "设置日志级别(无、错误、警告、信息、调试)"
msgid ""
"Enable logfile rotation, with optional maximum logfile size, default: "
"%(const)s (Logfile rotation count is 5)"
msgstr ""
msgstr "启用日志文件循环,使用可选的最大日志文件大小,默认值:%(const)s (日志文件循环计数为 5"
#: deluge/argparserbase.py:223
msgid "Quieten logging output (Same as `--loglevel none`)"
msgstr ""
msgstr "静态日志记录输出(与“--loglevel none”相同"
#: deluge/argparserbase.py:231
#, python-format
msgid ""
"Profile %(prog)s with cProfile. Outputs to stdout unless a filename is "
"specified"
msgstr ""
msgstr "使用 cProfile 的配置文件 %(prog)s 。除非指定了文件名,否则输出到标准输出"
#: deluge/argparserbase.py:351
msgid "Process Control Options"
@ -151,7 +151,7 @@ msgstr "进程控制选项"
#: deluge/argparserbase.py:357
msgid "Pidfile to store the process id"
msgstr ""
msgstr "用于存储进程 id 的 Pidfile"
#: deluge/argparserbase.py:365
msgid "Do not daemonize (fork) this process"
@ -2421,7 +2421,7 @@ msgstr " 种子已加入队列"
#: deluge/ui/gtk3/torrentview.py:421
msgid "Torrent is shared between other Deluge users or not."
msgstr ""
msgstr "Torrent 是否在其他 Deluge 用户之间共享。"
#: deluge/ui/gtk3/removetorrentdialog.py:67
msgid "Remove the selected torrents?"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
#: deluge/common.py:411
msgid "B"

View file

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-09-10 18:01+0000\n"
"X-Generator: Launchpad (build aca2013fd8cd2fea408d75f89f9bc012fbab307d)\n"
"X-Launchpad-Export-Date: 2023-11-06 19:12+0000\n"
"X-Generator: Launchpad (build f1e537f62ee3967c2b3f24dd10eacf1696334fe6)\n"
"Language: zh_TW\n"
#: deluge/common.py:411

View file

@ -10,10 +10,13 @@
# See LICENSE for more details.
#
import copy
import logging
import os.path
import time
from enum import Enum
from hashlib import sha1 as sha
from hashlib import sha256
import deluge.component as component
from deluge.bencode import bencode
@ -41,6 +44,35 @@ def dummy(*v):
pass
class TorrentFormat(str, Enum):
V1 = 'v1'
V2 = 'v2'
HYBRID = 'hybrid'
@classmethod
def _missing_(cls, value):
if not value:
return None
value = value.lower()
for member in cls:
if member.value == value:
return member
def to_lt_flag(self):
if self.value == 'v1':
return 64
if self.value == 'v2':
return 32
return 0
def includes_v1(self):
return self == self.__class__.V1 or self == self.__class__.HYBRID
def includes_v2(self):
return self == self.__class__.V2 or self == self.__class__.HYBRID
class RemoteFileProgress:
def __init__(self, session_id):
self.session_id = session_id
@ -51,7 +83,7 @@ def __call__(self, piece_count, num_pieces):
)
def make_meta_file(
def make_meta_file_content(
path,
url,
piece_length,
@ -60,24 +92,16 @@ def make_meta_file(
comment=None,
safe=None,
content_type=None,
target=None,
webseeds=None,
name=None,
private=False,
created_by=None,
trackers=None,
torrent_format=TorrentFormat.V1,
):
data = {'creation date': int(gmtime())}
if url:
data['announce'] = url.strip()
a, b = os.path.split(path)
if not target:
if b == '':
f = a + '.torrent'
else:
f = os.path.join(a, b + '.torrent')
else:
f = target
if progress is None:
progress = dummy
@ -89,10 +113,20 @@ def make_meta_file(
if session_id:
progress = RemoteFileProgress(session_id)
info = makeinfo(path, piece_length, progress, name, content_type, private)
info, piece_layers = makeinfo(
path,
piece_length,
progress,
name,
content_type,
private,
torrent_format,
)
# check_info(info)
data['info'] = info
if piece_layers is not None:
data['piece layers'] = piece_layers
if title:
data['title'] = title.encode('utf8')
if comment:
@ -121,8 +155,55 @@ def make_meta_file(
data['announce-list'] = trackers
data['encoding'] = 'UTF-8'
with open(f, 'wb') as file_:
file_.write(bencode(utf8_encode_structure(data)))
return bencode(utf8_encode_structure(data))
def default_meta_file_path(content_path):
a, b = os.path.split(content_path)
if b == '':
f = a + '.torrent'
else:
f = os.path.join(a, b + '.torrent')
return f
def make_meta_file(
path,
url,
piece_length,
progress=None,
title=None,
comment=None,
safe=None,
content_type=None,
target=None,
webseeds=None,
name=None,
private=False,
created_by=None,
trackers=None,
):
if not target:
target = default_meta_file_path(path)
file_content = make_meta_file_content(
path,
url,
piece_length,
progress=progress,
title=title,
comment=comment,
safe=safe,
content_type=content_type,
webseeds=webseeds,
name=name,
private=private,
created_by=created_by,
trackers=trackers,
)
with open(target, 'wb') as file_:
file_.write(file_content)
def calcsize(path):
@ -132,101 +213,237 @@ def calcsize(path):
return total
def makeinfo(path, piece_length, progress, name=None, content_type=None, private=False):
# HEREDAVE. If path is directory, how do we assign content type?
path = os.path.abspath(path)
piece_count = 0
if os.path.isdir(path):
subs = sorted(subfiles(path))
pieces = []
sh = sha()
done = 0
fs = []
totalsize = 0.0
totalhashed = 0
for p, f in subs:
totalsize += os.path.getsize(f)
if totalsize >= piece_length:
import math
def _next_pow2(num):
import math
num_pieces = math.ceil(totalsize / piece_length)
else:
num_pieces = 1
if not num:
return 1
return 2 ** math.ceil(math.log2(num))
for p, f in subs:
pos = 0
size = os.path.getsize(f)
p2 = [n.encode('utf8') for n in p]
if content_type:
fs.append(
{'length': size, 'path': p2, 'content_type': content_type}
) # HEREDAVE. bad for batch!
def _sha256_merkle_root(leafs, nb_leafs, padding, in_place=True) -> bytes:
"""
Build the root of the merkle hash tree from the (possibly incomplete) leafs layer.
If len(leafs) < nb_leafs, it will be padded with the padding repeated as many times
as needed to have nb_leafs in total.
"""
if not in_place:
leafs = copy.copy(leafs)
while nb_leafs > 1:
nb_leafs = nb_leafs // 2
for i in range(nb_leafs):
node1 = leafs[2 * i] if 2 * i < len(leafs) else padding
node2 = leafs[2 * i + 1] if 2 * i + 1 < len(leafs) else padding
h = sha256(node1)
h.update(node2)
if i < len(leafs):
leafs[i] = h.digest()
else:
fs.append({'length': size, 'path': p2})
with open(f, 'rb') as file_:
while pos < size:
a = min(size - pos, piece_length - done)
sh.update(file_.read(a))
done += a
pos += a
totalhashed += a
leafs.append(h.digest())
return leafs[0] if leafs else padding
if done == piece_length:
pieces.append(sh.digest())
piece_count += 1
done = 0
sh = sha()
progress(piece_count, num_pieces)
if done > 0:
pieces.append(sh.digest())
piece_count += 1
progress(piece_count, num_pieces)
def _sha256_buffer_blocks(buffer, block_len):
import math
nb_blocks = math.ceil(len(buffer) / block_len)
blocks = [
sha256(buffer[i * block_len : (i + 1) * block_len]).digest()
for i in range(nb_blocks)
]
return blocks
def makeinfo_lt(
path, piece_length, name=None, private=False, torrent_format=TorrentFormat.V1
):
"""
Make info using via the libtorrent library.
"""
from deluge._libtorrent import lt
if not name:
name = os.path.split(path)[1]
fs = lt.file_storage()
if os.path.isfile(path):
lt.add_files(fs, path)
else:
for p, f in subfiles(path):
fs.add_file(os.path.join(name, *p), os.path.getsize(f))
torrent = lt.create_torrent(
fs, piece_size=piece_length, flags=torrent_format.to_lt_flag()
)
lt.set_piece_hashes(torrent, os.path.dirname(path))
torrent.set_priv(private)
t = torrent.generate()
info = t[b'info']
pieces_layers = t.get(b'piece layers', None)
return info, pieces_layers
def makeinfo(
path,
piece_length,
progress,
name=None,
content_type=None,
private=False,
torrent_format=TorrentFormat.V1,
):
# HEREDAVE. If path is directory, how do we assign content type?
v2_block_len = 2**14 # 16 KiB
v2_blocks_per_piece = 1
v2_block_padding = b''
v2_piece_padding = b''
if torrent_format.includes_v2():
if _next_pow2(piece_length) != piece_length or piece_length < v2_block_len:
raise ValueError(
'Bittorrent v2 piece size must be a power of 2; and bigger than 16 KiB'
)
v2_blocks_per_piece = piece_length // v2_block_len
v2_block_padding = bytes(32) # 32 = size of sha256 in bytes
v2_piece_padding = _sha256_merkle_root(
[], nb_leafs=v2_blocks_per_piece, padding=v2_block_padding
)
path = os.path.abspath(path)
files = []
pieces = []
file_tree = {}
piece_layers = {}
if os.path.isdir(path):
if not name:
name = os.path.split(path)[1]
return {
'pieces': b''.join(pieces),
'piece length': piece_length,
'files': fs,
'name': name.encode('utf8'),
'private': private,
}
subs = subfiles(path)
if torrent_format.includes_v2():
subs = sorted(subs)
length = None
totalsize = 0.0
for p, f in subs:
totalsize += os.path.getsize(f)
else:
size = os.path.getsize(path)
if size >= piece_length:
num_pieces = size // piece_length
else:
num_pieces = 1
name = os.path.split(path)[1]
subs = [([name], path)]
length = os.path.getsize(path)
totalsize = length
is_multi_file = len(subs) > 1
sh = sha()
done = 0
totalhashed = 0
pieces = []
p = 0
with open(path, 'rb') as _file:
while p < size:
x = _file.read(min(piece_length, size - p))
pieces.append(sha(x).digest())
piece_count += 1
p += piece_length
if p > size:
p = size
progress(piece_count, num_pieces)
name = os.path.split(path)[1].encode('utf8')
if content_type is not None:
return {
'pieces': b''.join(pieces),
'piece length': piece_length,
'length': size,
'name': name,
'content_type': content_type,
'private': private,
next_progress_event = piece_length
for p, f in subs:
file_pieces_v2 = []
pos = 0
size = os.path.getsize(f)
p2 = [n.encode('utf8') for n in p]
if content_type:
files.append(
{b'length': size, b'path': p2, b'content_type': content_type}
) # HEREDAVE. bad for batch!
else:
files.append({b'length': size, b'path': p2})
with open(f, 'rb') as file_:
while pos < size:
to_read = min(size - pos, piece_length)
buffer = memoryview(file_.read(to_read))
pos += to_read
if torrent_format.includes_v1():
a = piece_length - done
for sub_buffer in (buffer[:a], buffer[a:]):
if sub_buffer:
sh.update(sub_buffer)
done += len(sub_buffer)
if done == piece_length:
pieces.append(sh.digest())
done = 0
sh = sha()
if torrent_format.includes_v2():
block_hashes = _sha256_buffer_blocks(buffer, v2_block_len)
num_leafs = v2_blocks_per_piece
if size <= piece_length:
# The special case when the file is smaller than a piece: only pad till the next power of 2
num_leafs = _next_pow2(len(block_hashes))
root = _sha256_merkle_root(
block_hashes, num_leafs, v2_block_padding, in_place=True
)
file_pieces_v2.append(root)
totalhashed += to_read
if totalhashed >= next_progress_event:
next_progress_event = totalhashed + piece_length
progress(totalhashed, totalsize)
if torrent_format == TorrentFormat.HYBRID and is_multi_file and done > 0:
# Add padding file to force piece-alignment
padding = piece_length - done
sh.update(bytes(padding))
files.append(
{
b'length': padding,
b'attr': b'p',
b'path': [b'.pad', str(padding).encode()],
}
)
pieces.append(sh.digest())
done = 0
sh = sha()
if torrent_format.includes_v2():
# add file to the `file tree` and, if needed, to the `piece layers` structures
pieces_root = _sha256_merkle_root(
file_pieces_v2,
_next_pow2(len(file_pieces_v2)),
v2_piece_padding,
in_place=False,
)
dst_directory = file_tree
for directory in p2[:-1]:
dst_directory = dst_directory.setdefault(directory, {})
dst_directory[p2[-1]] = {
b'': {
b'length': size,
b'pieces root': pieces_root,
}
}
return {
'pieces': b''.join(pieces),
'piece length': piece_length,
'length': size,
'name': name,
'private': private,
}
if len(file_pieces_v2) > 1:
piece_layers[pieces_root] = b''.join(file_pieces_v2)
if done > 0:
pieces.append(sh.digest())
progress(totalsize, totalsize)
info = {
b'piece length': piece_length,
b'name': name.encode('utf8'),
}
if private:
info[b'private'] = 1
if content_type:
info[b'content_type'] = content_type
if torrent_format.includes_v1():
info[b'pieces'] = b''.join(pieces)
if is_multi_file:
info[b'files'] = files
else:
info[b'length'] = length
if torrent_format.includes_v2():
info.update(
{
b'meta version': 2,
b'file tree': file_tree,
}
)
return info, piece_layers if torrent_format.includes_v2() else None
def subfiles(d):

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

View file

@ -9,10 +9,13 @@
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
import logging
import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository.Gdk import RGBA

View file

@ -58,7 +58,7 @@ def test_session_totals(self):
@pytest.mark.gtkui
@defer.inlineCallbacks
def test_write(self):
def test_write(self, tmp_path):
"""
writing to a file-like object; need this for webui.
@ -102,5 +102,5 @@ def write(self, data):
file_like = FakeFile()
surface.write_to_png(file_like)
data = b''.join(file_like.data)
with open('file_like.png', 'wb') as _file:
with open(tmp_path / 'file_like.png', 'wb') as _file:
_file.write(data)

View file

@ -1,71 +0,0 @@
#!/bin/bash
# A script to convert the Deluge svg icons to png.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
data_dir="$DIR/../ui/data"
zopfli_iter="--iterations=100"
zopflipng_bin="zopflipng --filters=01234mepb --lossy_8bit --lossy_transparent -y"
# Create deluge png icon pack for all sizes.
for size in 16 22 24 32 36 48 64 72 96 128 192 256 512; do
mkdir -p $data_dir/icons/hicolor/${size}x${size}/apps
in_svg=$data_dir/pixmaps/deluge.svg
out_png=$data_dir/icons/hicolor/${size}x${size}/apps/deluge.png
rsvg-convert -w ${size} -h ${size} -o $out_png $in_svg
if [ "$size" -gt 128 ]; then
zopfli_iter=""
fi
echo $zopflipng_bin $zopfli_iter
eval $zopflipng_bin $zopfli_iter $out_png $out_png
done
# Create deluge-panel png for systray.
for size in 16 22 24; do
in_png=$data_dir/icons/hicolor/${size}x${size}/apps/deluge.png
out_png=$data_dir/icons/hicolor/${size}x${size}/apps/deluge-panel.png
cp $in_png $out_png
done
# Create deluge.ico icon from pngs.
for size in 16 32 48 64 128 256; do
ico_infiles+="$data_dir/icons/hicolor/${size}x${size}/apps/deluge.png "
done
convert $ico_infiles $data_dir/pixmaps/deluge.ico
# Copy of deluge.svg to icon theme pack.
mkdir -p $data_dir/icons/hicolor/scalable/apps/
cp $data_dir/pixmaps/deluge.svg $data_dir/icons/hicolor/scalable/apps/deluge.svg
# Create 48px deluge.png.
cp $data_dir/icons/hicolor/48x48/apps/deluge.png $data_dir/pixmaps/deluge.png
# Create 16px png from deluge and status svgs.
for file in $data_dir/pixmaps/*.svg; do
out_png=${file%.*}16.png
rsvg-convert -w 16 -h 16 -o $out_png $file
eval $zopflipng_bin $out_png $out_png
done
# Copy 16px deluge and status pngs to webui icons folder.
for icon in $data_dir/pixmaps/*16.png; do
iconname=$(basename $icon)
cp $icon $data_dir/../web/icons/${iconname::-6}.png
done
rm $data_dir/../web/icons/tracker*.png
for size in 32 192 512; do
in_png=$data_dir/icons/hicolor/${size}x${size}/apps/deluge.png
out_png=$data_dir/../web/icons/deluge-${size}.png
cp $in_png $out_png
# Create apple and android touch icons with background colour.
apple_icon=$data_dir/../web/icons/deluge-apple-180.png
rsvg-convert -w 180 -h 180 -b '#599EEE' -o $apple_icon $data_dir/pixmaps/deluge.svg
eval $zopflipng_bin $apple_icon $apple_icon
# Create favicon.ico icon from pngs.
for size in 16 32 48; do
web_ico_infiles+="$data_dir/icons/hicolor/${size}x${size}/apps/deluge.png "
done
convert $web_ico_infiles $data_dir/../web/icons/favicon.ico

201
deluge/scripts/create_icons.py Executable file
View file

@ -0,0 +1,201 @@
#!/usr/bin/python3
#
# Create Deluge PNG icons from SVG
#
# Required image tools:
# * rsvg-convert
# * convert (ImageMagik)
# * oxipng
# * pngquant
#
import shutil
import subprocess
from dataclasses import dataclass, field
from pathlib import Path
@dataclass
class IconPack:
name: str
dir: Path
icon_sizes: list[int]
panel_sizes: list[int]
ico_sizes: list[int]
pixmaps_dir: Path = field(init=False)
theme_dir: Path = field(init=False)
theme_svg: Path = field(init=False)
theme_pngs: dict[int, Path] = field(init=False)
logo_svg: Path = field(init=False)
logo_ico: Path = field(init=False)
logo_png: Path = field(init=False)
def __post_init__(self):
self.pixmaps_dir = self.dir / 'pixmaps'
self.logo_svg = self.pixmaps_dir / f'{self.name}.svg'
self.logo_ico = self.pixmaps_dir / f'{self.name}.ico'
self.logo_png = self.pixmaps_dir / f'{self.name}.png'
self.theme_dir = self.dir / 'icons' / 'hicolor'
self.theme_svg = self.theme_dir / 'scalable' / 'apps' / f'{self.name}.svg'
self.theme_pngs = self.create_theme_pngs_paths(
self.name, self.icon_sizes, self.theme_dir
)
@staticmethod
def create_theme_pngs_paths(name, icon_sizes, out_dir):
return {
size: out_dir / f'{size}x{size}' / 'apps' / f'{name}.png'
for size in icon_sizes
}
@dataclass
class WebIconPack:
name: str
dir: Path
icon_sizes: list[int]
favicon_sizes: list[int]
icons_dir: Path = field(init=False)
touch: Path = field(init=False)
favicon: Path = field(init=False)
def __post_init__(self):
self.icons_dir = self.dir / 'icons'
self.touch = self.icons_dir / f'{self.name}-apple-180.png'
self.favicon = self.icons_dir / 'favicon.ico'
def convert_svg_to_png(svg_file, png_file, size, background_color=None):
rsvg_options = [
'-w',
str(size),
'-h',
str(size),
'-o',
png_file,
]
rsvg_options + ['-b', {background_color}] if background_color else []
subprocess.run(['rsvg-convert'] + rsvg_options + [svg_file], check=True)
def compress_png(png_file):
subprocess.run(
['pngquant', '--quality=70-95', '--ext', '.png', '--force', png_file],
check=True,
)
subprocess.run(['oxipng', png_file], check=True)
def create_panel_icons(icon_pack, sizes):
for size in sizes:
app_png = icon_pack[size]
panel_png = app_png.with_name(f'{app_png.stem}-panel.png')
shutil.copyfile(app_png, panel_png)
def create_hicolor_icons(svg_icon, icon_pack):
"""Convert SVG icon to hicolor PNG icons."""
for size, png_file in icon_pack.items():
png_file.parent.mkdir(parents=True, exist_ok=True)
convert_svg_to_png(svg_icon, png_file, size)
compress_png(png_file)
def create_ico_icon(icon_pack, sizes, ico_file):
infiles = [icon_pack[size] for size in sizes]
ico_file.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(['convert', *infiles, ico_file], check=True)
def create_hicolor_svg(src_svg, dest_svg):
dest_svg.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(src_svg, dest_svg)
def create_mini_icons(pixmaps_dir):
pixmap_svgs = pixmaps_dir.glob('*.svg')
for svg_file in pixmap_svgs:
png_file = pixmaps_dir / f'{svg_file.stem}16.png'
convert_svg_to_png(svg_file, png_file, 16)
compress_png(png_file)
def create_logo(deluge_png, pixmap_png):
pixmap_png.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(deluge_png, pixmap_png)
def create_web_status_icons(src_dir: Path, dest_dir: Path):
"""Web UI status icons from 16px icons."""
pngs_16px = src_dir.glob('*16.png')
dest_dir.mkdir(parents=True, exist_ok=True)
for path in pngs_16px:
if path.stem.startswith('tracker'):
continue
new_name = path.stem.replace('16', '') + '.png'
shutil.copyfile(path, dest_dir / new_name)
def create_touch_icon(svg_file, png_file, size):
"""Web icons with background color for Apple or Android"""
png_file.parent.mkdir(parents=True, exist_ok=True)
convert_svg_to_png(svg_file, png_file, size, background_color='#599EEE')
compress_png(png_file)
def create_web_icons(app_pngs, sizes, dest_dir):
dest_dir.mkdir(parents=True, exist_ok=True)
for size in sizes:
app_png = app_pngs[size]
web_png = dest_dir / f'{app_png.stem}-{size}.png'
shutil.copyfile(app_png, web_png)
def main():
data_dir = Path.cwd() / 'deluge' / 'ui' / 'data'
if not data_dir.is_dir():
exit(f'No path to UI data dir: {data_dir}')
# Create Deluge UI icons
icon_pack_sizes = [16, 22, 24, 32, 36, 48, 64, 72, 96, 128, 192, 256, 512]
panel_icon_sizes = [16, 22, 24]
ico_icon_sizes = [16, 32, 48, 64, 128, 256]
ui_icons = IconPack(
name='deluge',
dir=data_dir,
icon_sizes=icon_pack_sizes,
panel_sizes=panel_icon_sizes,
ico_sizes=ico_icon_sizes,
)
# Theme icons for GTK
create_hicolor_icons(ui_icons.logo_svg, ui_icons.theme_pngs)
create_hicolor_svg(ui_icons.logo_svg, ui_icons.theme_svg)
create_mini_icons(ui_icons.pixmaps_dir)
# Panel icon for systray
create_panel_icons(ui_icons.theme_pngs, ui_icons.panel_sizes)
# Deluge logos
create_ico_icon(ui_icons.theme_pngs, ui_icons.ico_sizes, ui_icons.logo_ico)
create_logo(ui_icons.theme_pngs[48], ui_icons.logo_png)
# Web UI Icons
web_icon_sizes = [32, 192, 512]
favicon_sizes = [16, 32, 48]
web_icons = WebIconPack(
name='deluge',
dir=data_dir / '..' / 'web',
icon_sizes=web_icon_sizes,
favicon_sizes=favicon_sizes,
)
create_web_icons(ui_icons.theme_pngs, web_icons.icon_sizes, web_icons.icons_dir)
create_web_status_icons(ui_icons.pixmaps_dir, web_icons.icons_dir)
create_touch_icon(ui_icons.logo_svg, web_icons.touch, 180)
create_ico_icon(ui_icons.theme_pngs, web_icons.favicon_sizes, web_icons.favicon)
if __name__ == '__main__':
main()

View file

@ -3,21 +3,61 @@
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
from dataclasses import dataclass
import pytest
import deluge.component as component
from deluge.conftest import BaseTestCase
from deluge.core.core import Core
class TestAlertManager(BaseTestCase):
def set_up(self):
class LtSessionMock:
def __init__(self):
self.alerts = []
def push_alerts(self, alerts):
self.alerts = alerts
def wait_for_alert(self, timeout):
return self.alerts[0] if len(self.alerts) > 0 else None
def pop_alerts(self):
alerts = self.alerts
self.alerts = []
return alerts
@dataclass
class LtAlertMock:
type: int
name: str
message: str
def message(self):
return self.message
def what(self):
return self.name
@pytest.fixture
def mock_alert1():
return LtAlertMock(type=1, name='mock_alert1', message='Alert 1')
@pytest.fixture
def mock_alert2():
return LtAlertMock(type=2, name='mock_alert2', message='Alert 2')
class TestAlertManager:
@pytest.fixture(autouse=True)
def set_up(self, component):
self.core = Core()
self.core.config.config['lsd'] = False
self.am = component.get('AlertManager')
return component.start(['AlertManager'])
self.am.session = LtSessionMock()
def tear_down(self):
return component.shutdown()
component.start(['AlertManager'])
def test_register_handler(self):
def handler(alert):
@ -28,6 +68,29 @@ def handler(alert):
assert self.am.handlers['dummy1'] == [handler]
assert self.am.handlers['dummy2'] == [handler]
async def test_pop_alert(self, mock_callback, mock_alert1, mock_alert2):
self.am.register_handler('mock_alert1', mock_callback)
self.am.session.push_alerts([mock_alert1, mock_alert2])
await mock_callback.deferred
mock_callback.assert_called_once_with(mock_alert1)
async def test_pause_not_pop_alert(
self, component, mock_alert1, mock_alert2, mock_callback
):
await component.pause(['AlertManager'])
self.am.register_handler('mock_alert1', mock_callback)
self.am.session.push_alerts([mock_alert1, mock_alert2])
await mock_callback.deferred
mock_callback.assert_not_called()
assert not self.am._event.is_set()
assert len(self.am.session.alerts) == 2
def test_deregister_handler(self):
def handler(alert):
...

View file

@ -8,7 +8,7 @@
from twisted.internet import defer
from deluge import error
from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth
from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth, get_version
from deluge.core.authmanager import AUTH_LEVEL_ADMIN
from deluge.ui.client import Client, DaemonSSLProxy, client
@ -170,3 +170,23 @@ def on_failure(failure):
d.addCallbacks(self.fail, on_failure)
return d
@pytest_twisted.inlineCallbacks
def test_daemon_version(self):
username, password = get_localhost_auth()
yield client.connect(
'localhost', self.listen_port, username=username, password=password
)
assert client.daemon_version == get_version()
@pytest_twisted.inlineCallbacks
def test_daemon_version_check_min(self):
username, password = get_localhost_auth()
yield client.connect(
'localhost', self.listen_port, username=username, password=password
)
assert client.daemon_version_check_min(get_version())
assert not client.daemon_version_check_min(f'{get_version()}1')
assert client.daemon_version_check_min('0.1.0')

View file

@ -3,7 +3,7 @@
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
import base64
import os
from base64 import b64encode
from hashlib import sha1 as sha
@ -483,3 +483,29 @@ def test__create_peer_id(self):
assert self.core._create_peer_id('2.0.1rc1') == '-DE201r-'
assert self.core._create_peer_id('2.11.0b2') == '-DE2B0b-'
assert self.core._create_peer_id('2.4.12b2.dev3') == '-DE24CD-'
@pytest.mark.parametrize(
'path',
[
common.get_test_data_file('deluge.png'),
os.path.dirname(common.get_test_data_file('deluge.png')),
],
)
@pytest.mark.parametrize('piece_length', [2**14, 2**16])
@pytest_twisted.inlineCallbacks
def test_create_torrent(self, path, tmp_path, piece_length):
target = tmp_path / 'test.torrent'
filename, filedump = yield self.core.create_torrent(
path=path,
tracker=None,
piece_length=piece_length,
target=target,
add_to_session=False,
)
filecontent = base64.b64decode(filedump)
with open(target, 'rb') as f:
assert f.read() == filecontent
lt.torrent_info(filecontent)

View file

@ -7,7 +7,13 @@
import os
import tempfile
import pytest
from deluge import metafile
from deluge._libtorrent import LT_VERSION
from deluge.common import VersionSplit
from . import common
def check_torrent(filename):
@ -55,3 +61,52 @@ def test_save_singlefile(self):
metafile.make_meta_file(tmp_data, '', 32768, target=tmp_torrent)
check_torrent(tmp_torrent)
@pytest.mark.parametrize(
'path',
[
common.get_test_data_file('deluge.png'),
common.get_test_data_file('unicode_filenames.torrent'),
os.path.dirname(common.get_test_data_file('deluge.png')),
],
)
@pytest.mark.parametrize(
'torrent_format',
[
metafile.TorrentFormat.V1,
metafile.TorrentFormat.V2,
metafile.TorrentFormat.HYBRID,
],
)
@pytest.mark.parametrize('piece_length', [2**14, 2**15, 2**16])
@pytest.mark.parametrize('private', [True, False])
def test_create_info(self, path, torrent_format, piece_length, private):
our_info, our_piece_layers = metafile.makeinfo(
path,
piece_length,
metafile.dummy,
private=private,
torrent_format=torrent_format,
)
lt_info, lt_piece_layers = metafile.makeinfo_lt(
path,
piece_length,
private=private,
torrent_format=torrent_format,
)
if (
torrent_format == metafile.TorrentFormat.HYBRID
and os.path.isdir(path)
and VersionSplit(LT_VERSION) <= VersionSplit('2.0.7.0')
):
# Libtorrent didn't correctly follow the standard until version 2.0.7 included
# https://github.com/arvidn/libtorrent/commit/74d82a0cd7c2e9e3c4294901d7eb65e247050df4
# If last file is a padding, ignore that file and the last piece.
if our_info[b'files'][-1][b'path'][0] == b'.pad':
our_info[b'files'] = our_info[b'files'][:-1]
our_info[b'pieces'] = our_info[b'pieces'][:-32]
lt_info[b'pieces'] = lt_info[b'pieces'][:-32]
assert our_info == lt_info
assert our_piece_layers == lt_piece_layers

View file

@ -15,7 +15,7 @@
from twisted.internet.protocol import ClientFactory
from deluge import error
from deluge.common import get_localhost_auth, get_version
from deluge.common import VersionSplit, get_localhost_auth, get_version
from deluge.decorators import deprecated
from deluge.transfer import DelugeTransferProtocol
@ -227,6 +227,7 @@ def clientConnectionLost(self, connector, reason): # NOQA: N802
self.daemon.host = None
self.daemon.port = None
self.daemon.username = None
self.daemon.daemon_version = None
self.daemon.connected = False
if (
@ -260,6 +261,7 @@ def __init__(self, event_handlers=None):
self.host = None
self.port = None
self.username = None
self.daemon_version = None
self.authentication_level = 0
self.connected = False
@ -389,7 +391,7 @@ def __on_connect(self, result):
log.debug('__on_connect called')
def on_info(daemon_info):
self.daemon_info = daemon_info
self.daemon_version = daemon_info
log.debug('Got info from daemon: %s', daemon_info)
self.daemon_info_deferred.callback(daemon_info)
@ -741,6 +743,26 @@ def connection_info(self):
return None
@property
def daemon_version(self) -> str:
"""Get the connected daemon version
Returns:
The daemon version
"""
return self._daemon_proxy.daemon_version if self.connected() else ''
def daemon_version_check_min(self, min_version=get_version()) -> bool:
"""Check connected daemon against a minimum version.
Returns:
If connected daemon meets minimum version requirement.
"""
if not (self.daemon_version and min_version):
return False
return VersionSplit(self.daemon_version) >= VersionSplit(min_version)
def register_event_handler(self, event, handler):
"""
Registers a handler that will be called when an event is received from the daemon.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

After

Width:  |  Height:  |  Size: 418 B

Before After
Before After

Some files were not shown because too many files have changed in this diff Show more